diff --git a/filemin/config.cgi b/filemin/config.cgi index a082b0490..dd2f612f5 100755 --- a/filemin/config.cgi +++ b/filemin/config.cgi @@ -32,6 +32,7 @@ print &ui_table_row($text{'config_columns_to_display'}, &ui_checkbox('columns', 'size', $text{'size'}, $config{'columns'} =~ /size/). &ui_checkbox('columns', 'owner_user', $text{'ownership'}, $config{'columns'} =~ /owner_user/). &ui_checkbox('columns', 'permissions', $text{'permissions'}, $config{'columns'} =~ /permissions/). + (get_acls_status() ? &ui_checkbox('columns', 'acls', $text{'acls'}, $config{'columns'} =~ /acls/) : undef). (get_attr_status() ? &ui_checkbox('columns', 'attributes', $text{'attributes'}, $config{'columns'} =~ /attributes/) : undef). (get_selinux_status() ? &ui_checkbox('columns', 'selinux', $text{'selinux'}, $config{'columns'} =~ /selinux/) : undef). &ui_checkbox('columns', 'last_mod_time', $text{'last_mod_time'}, $config{'columns'} =~ /last_mod_time/) diff --git a/filemin/filemin-lib.pl b/filemin/filemin-lib.pl index d0316e925..8f73fe976 100644 --- a/filemin/filemin-lib.pl +++ b/filemin/filemin-lib.pl @@ -14,14 +14,22 @@ sub get_attr_status { return has_command('lsattr'); } +sub get_acls_status { + return has_command('getfacl'); +} + +sub get_list_acls_command { + return has_command('getfacl') . " -p "; +} + sub get_attr_command { return 'lsattr -d '; } sub get_selinux_status { - # return 1; return is_selinux_enabled(); } + sub get_selinux_command_type { my $out = backquote_command("ls --help 2>&1 ' . $text{'size'} . '') if($userconfig{'columns'} =~ /size/); push @ui_columns, ('' . $text{'ownership'} . '') if($userconfig{'columns'} =~ /owner_user/); push @ui_columns, ('' . $text{'permissions'} . '') if($userconfig{'columns'} =~ /permissions/); + push @ui_columns, ('' . $text{'acls'} . '') if(get_acls_status() && $userconfig{'columns'} =~ /acls/); push @ui_columns, ('' . $text{'attributes'} . '') if(get_attr_status() && $userconfig{'columns'} =~ /attributes/); push @ui_columns, ('' . $text{'selinux'} . '') if(get_selinux_status() && $userconfig{'columns'} =~ /selinux/); push @ui_columns, ('' . $text{'last_mod_time'} . '') if($userconfig{'columns'} =~ /last_mod_time/); @@ -301,8 +310,9 @@ sub print_interface { if ($count > scalar(@list)) { last; } my $class = $count & 1 ? "odd" : "even"; my $link = $list[$count - 1][0]; - my $selinux; + my $acls; my $attributes; + my $selinux; $link =~ s/\Q$cwd\E\///; $link =~ s/^\///g; $vlink = html_escape($link); @@ -328,6 +338,10 @@ sub print_interface { $attributes = $list[$count - 1][18]; } + if(get_acls_status() && $userconfig{'columns'} =~ /acls/) { + $acls = $list[$count - 1][19]; + } + $mod_time = POSIX::strftime('%Y/%m/%d - %T', localtime($list[$count - 1][10])); $actions = "$rename_icon"; @@ -381,6 +395,7 @@ sub print_interface { push @row_data, $size if($userconfig{'columns'} =~ /size/); push @row_data, $user.':'.$group if($userconfig{'columns'} =~ /owner_user/); push @row_data, $permissions if($userconfig{'columns'} =~ /permissions/); + push @row_data, $acls if(get_acls_status() && $userconfig{'columns'} =~ /acls/); push @row_data, $attributes if(get_attr_status() && $userconfig{'columns'} =~ /attributes/); push @row_data, $selinux if(get_selinux_status() && $userconfig{'columns'} =~ /selinux/); push @row_data, $mod_time if($userconfig{'columns'} =~ /last_mod_time/); diff --git a/filemin/index.cgi b/filemin/index.cgi index 7973e89df..854ce4ea2 100755 --- a/filemin/index.cgi +++ b/filemin/index.cgi @@ -12,9 +12,10 @@ unless (opendir ( DIR, $cwd )) { } else { &ui_print_header(undef, $module_info{'name'}, "", undef, 0 , 0, 0, "$text{'module_config'}"); + my %acls; + my %attributes; my $setype = get_selinux_command_type(); my %secontext; - my %attributes; # Push file names with full paths to array, filtering out "." and ".." @list = map { &simplify_path("$cwd/$_") } grep { $_ ne '.' && $_ ne '..' } readdir(DIR); @@ -34,13 +35,27 @@ unless (opendir ( DIR, $cwd )) { @list = keys %hash; } + # List ACLs + if ($userconfig{'columns'} =~ /acls/ && get_acls_status()) { + my $command = get_list_acls_command() . " " . join(' ', map {quotemeta("$_")} @list); + my $output = `$command`; + my @aclsArr; + foreach my $aclsStr (split(/\n\n/, $output)) { + $aclsStr =~ /#\s+file:\s*(.*)/; + my ($file) = ($aclsStr =~ /#\s+file:\s*(.*)/); + my @aclsA = ($aclsStr =~ /^(?!#)([\w:-]+)/gm); + push(@aclsArr, [$file, \@aclsA]); + } + %acls = map {$_->[0] => ('' . join("
", @{$_->[1]}) . '
')} @aclsArr; + } + # List attributes if ( $userconfig{'columns'} =~ /attributes/ && get_attr_status() ) { my $command = get_attr_command() . join( ' ', map { quotemeta("$_") } @list ); my $output = `$command`; my @attributesArr = map { [ split( /\s+/, $_, 2 ) ] } split( /\n/, $output ); - %attributes = map { $_->[1] => ('' . $_->[0] . '') } @attributesArr; + %attributes = map { $_->[1] => ('' . $_->[0] . '') } @attributesArr; } # List security context @@ -51,11 +66,11 @@ unless (opendir ( DIR, $cwd )) { my $delimiter = ( $setype ? '\n' : ',' ); my @searray = map { [ split( /\s+/, $_, 2 ) ] } split( /$delimiter/, $output ); - %secontext = map { $_->[1] => ($_->[0] eq "?" ? undef : ('' . $_->[0] . '') ) } @searray; + %secontext = map { $_->[1] => ($_->[0] eq "?" ? undef : ('' . $_->[0] . '') ) } @searray; } # Get info about directory entries - @info = map { [ $_, lstat($_), &clean_mimetype($_), -d, -l $_, $secontext{$_}, $attributes{$_} ] } @list; + @info = map { [ $_, lstat($_), &clean_mimetype($_), -d, -l $_, $secontext{$_}, $attributes{$_}, $acls{$_} ] } @list; # Filter out folders @folders = map {$_} grep {$_->[15] == 1 } @info; diff --git a/filemin/lang/en b/filemin/lang/en index 352ae7bb2..eb45841f9 100644 --- a/filemin/lang/en +++ b/filemin/lang/en @@ -25,7 +25,7 @@ size=Size owner_user=Owner user owner_group=Owner group permissions=Mode -selinux=Security context +selinux=Security Context attributes=Attributes last_mod_time=Modified rename=Rename @@ -162,3 +162,4 @@ info_total3=Total: $1 file and $2 directories info_total4=Total: $1 files and $2 directories ownership=Owner +acls=Access Control List \ No newline at end of file diff --git a/filemin/unauthenticated/css/style.css b/filemin/unauthenticated/css/style.css index 3b3097dde..6f5cd9cea 100644 --- a/filemin/unauthenticated/css/style.css +++ b/filemin/unauthenticated/css/style.css @@ -152,8 +152,9 @@ a.pages { margin-bottom: 10px; } -span[data-attributes="s"], -span[data-attributes="x"] { +span[data-acls], +span[data-attributes], +span[data-secontext] { font-family: monospace; - font-size: 10px; + font-size: 11px; }