Merge remote-tracking branch 'origin/topic/timw/1041-compress-path'

* origin/topic/timw/1041-compress-path:
  GH-1041: Move compress_path to a bif that uses normalize_path
This commit is contained in:
Jon Siwek 2020-07-06 20:40:44 -07:00
commit 09483619ef
7 changed files with 28 additions and 41 deletions

View file

@ -1,4 +1,8 @@
3.2.0-dev.862 | 2020-07-06 20:40:44 -0700
* GH-1041: Move compress_path to a bif that uses normalize_path (Tim Wojtulewicz, Corelight)
3.2.0-dev.859 | 2020-07-06 14:55:00 +0000
* Add backtrace() and print_backtrace() BIF functions. (Jon Siwek,

View file

@ -1 +1 @@
3.2.0-dev.859
3.2.0-dev.862

2
doc

@ -1 +1 @@
Subproject commit 0eb33dbac55bf5351a72dc8c204ed059fc1bd1e2
Subproject commit d2380ce1047b4f097e1f2602bfc007d9610236bf

View file

@ -21,45 +21,6 @@ function extract_path(input: string): string
return parts[1];
}
## Compresses a given path by removing '..'s and the parent directory it
## references and also removing dual '/'s and extraneous '/./'s.
##
## dir: a path string, either relative or absolute.
##
## Returns: a compressed version of the input path.
function compress_path(dir: string): string
{
const cdup_sep = /((\/)*([^\/]|\\\/)+)?((\/)+\.\.(\/)*)/;
local parts = split_string_n(dir, cdup_sep, T, 1);
if ( |parts| > 1 )
{
# reaching a point with two parent dir references back-to-back means
# we don't know about anything higher in the tree to pop off
if ( parts[1] == "../.." )
return join_string_vec(parts, "");
if ( sub_bytes(parts[1], 0, 1) == "/" )
parts[1] = "/";
else
parts[1] = "";
dir = join_string_vec(parts, "");
return compress_path(dir);
}
const multislash_sep = /(\/\.?){2,}/;
parts = split_string_all(dir, multislash_sep);
for ( i in parts )
if ( i % 2 == 1 )
parts[i] = "/";
dir = join_string_vec(parts, "");
# remove trailing slashes from path
if ( |dir| > 1 && sub_bytes(dir, |dir|, 1) == "/" )
dir = sub_bytes(dir, 0, |dir| - 1);
return dir;
}
## Constructs a path to a file given a directory and a file name.
##
## dir: the directory in which the file lives.

View file

@ -5157,3 +5157,14 @@ function to_json%(val: any, only_loggable: bool &default=F, field_escape_pattern
%{
return val->ToJSON(only_loggable, field_escape_pattern);
%}
## Compresses a given path by removing '..'s and the parent directory it
## references and also removing dual '/'s and extraneous '/./'s.
##
## dir: a path string, either relative or absolute.
##
## Returns: a compressed version of the input path.
function compress_path%(dir: string%): string
%{
return zeek::make_intrusive<zeek::StringVal>(normalize_path(dir->ToStdString()));
%}

View file

@ -0,0 +1,2 @@
../foo
../foo

View file

@ -0,0 +1,9 @@
#
# @TEST-EXEC: zeek -b %INPUT >out
# @TEST-EXEC: btest-diff out
event zeek_init()
{
print compress_path("./../foo");
print compress_path("././../foo");
}