[# tag: ewok file manager page #] [! use File::Basename; use Data::Dumper; use Ewok::Config qw(:all); use Ewok::Authz qw(:common); use Ewok::Meta qw(getMeta setMeta); use Ewok::Util qw(ewokdir webfsdir dirCheck); use OF::Breadcrumbs qw(breadcrumbs); !] [- Execute({ inputfile => 'util.epl', import => 1 }); $debug = 0; $req = shift; $javascript = !exists $req->{pref}->{javascript} || $req->{pref}->{javascript}; $icons = $req->{pref}->{fm_icons}; $icons = 1 if ! defined $icons; if (exists $fdat{long}) { $long = $fdat{long}; if ($long != $req->{pref}->{fm_long_listing}) { # Save fm_long_listing in user preferences $req->{pref}->{fm_long_listing} = $long; setMeta($req->{pref}, $req->{user}, { type => 'user' }); } } else { $long = $req->{pref}->{fm_long_listing}; } @errors = (); # Support 'clip' and 'trash' pseudo-directories if ($web_dir =~ m!^/?(clip|trash)/?$!) { $clipboard = 1; $mode = 'view'; $trash = 1 if $1 eq 'trash'; $web_dir = $fdat{p} || '/'; $web_dir = "/$web_dir" if substr($web_dir,0,1) ne '/'; $wd = substr($web_dir, 0, -1); $wd = '/' if $wd eq ''; $web_url = $web_dir; $fs_dir = $EWOK_CLIPBOARD; $fs_dir .= '/' if (substr($fs_dir,-1) ne '/'); # Deny access if $fs_dir is not a directory if (! -d $fs_dir) { push @errors, "Error: directory '$wd' not found."; } } # Map web directories to their fs counterparts else { $clipboard = 0; ($web_dir, $fs_dir, $wd) = webfsdir($req, $fdat{p}, { errors => \@errors, } ); # Dereference $fs_dir if a (relative) link if (-l $fs_dir) { my $target = readlink($fs_dir); if ($target !~ m!\s*/!) { $target =~ s:^\s*(.*?)/?\s*$:$1/:; $fs_dir .= $target; $web_dir .= $target; $fs_dir =~ s:[^/]+/\.\./::g; # Remove foo/../ sequences $web_dir =~ s:[^/]+/\.\./::g; # Remove foo/../ sequences $wd = substr($web_dir,0,-1) if $web_dir ne '/'; } } if (! @errors) { # Get privileges on $fs_dir $authz = authzGetUserHash($req, $fs_dir); $viewPriv = defined $authz->{$VIEW_PRIV}; $editPriv = defined $authz->{$EDIT_PRIV}; $publPriv = defined $authz->{$PUBL_PRIV}; $authzPriv = defined $authz->{$AUTHZ_PRIV}; $tmplPriv = defined $authz->{$TMPL_PRIV}; $adminPriv = defined $authz->{$ADMIN_PRIV}; for my $p (($ADMIN_PRIV, $AUTHZ_PRIV, $PUBL_PRIV, $EDIT_PRIV, $VIEW_PRIV)) { if (defined $authz->{$p}) { $priv = $p; last; } } $priv .= " $TMPL_PRIV" if $tmplPriv && ! $adminPriv; # Load directory metadata and setup %disallow hash $dirmeta = getMeta($fs_dir, { type => 'dir' }); if ($dirmeta->{fm_disallow}) { %disallow = map { lc($_) => 1 } split /[, ] */, $dirmeta->{fm_disallow}; } # Deny access if the user doesn't have view privilege if (! $viewPriv || $disallow{view}) { push @errors, "Error: you do not have view privilege on directory '$wd'."; } # Deny access to ewok directories and metadata directories for non-admins elsif (! $adminPriv && ($fs_dir =~ m!^$EWOK_HOME/! || $fs_dir =~ m|/\.meta\b|)) { push @errors, "Error: you do not have privileges for directory '$wd'."; } else { # Check directory metadata for custom viewers and editors # if ($dirmeta->{viewers}) { # for my $item (split /\s*,\s*/, $dirmeta->{viewers}) { # my ($patt, $viewer) = split /\s*=>\s*/, $item; # $viewers{$patt} = $viewer; # } # } # if ($dirmeta->{editors}) { # for my $item (split /\s*,\s*/, $dirmeta->{editors}) { # my ($patt, $editor) = split /\s*=>\s*/, $item; # $editors{$patt} = $editor; # } # } # Setup web_url if this is a publishing target directory $web_url = Ewok::File::targetRewrite($req, $web_dir); # Set ewok fm 'mode' $mode = ewokdir($fs_dir); # Only allow view mode on metadata directories $mode = 'view' if $mode eq 'stage' && $fs_dir =~ m|/\.meta/?$|; # Use view mode if $mode set and no other privileges $mode = 'view' if $mode && ! $editPriv; $mode ||= 'none'; } } } if (! @errors) { # Deny access if $mode is still 'none' (unless this is the document root) if ($mode eq 'none') { if ($web_dir eq '/' && (@EWOK_TOP_DIRS_ADD || $adminPriv)) { $mode = 'view'; $add_only = 1; } else { push @errors, "Error: directory '$wd' is not an ewok directory."; } } } $req_rec->content_type("text/html"); $escmode = 3; -] ewok file manager: [+ $wd +] [$ if ($mode eq 'stage' && $editPriv && $javascript) $] [$ else $] [$ endif $] [$ if ($debug) $]
web_dir: [+ $web_dir +]
fs_dir: [+ $fs_dir +]
wd: [+ $wd +]
priv: [+ $priv +]
disallow: [+ join ',', keys %disallow +]
authz: [+ Dumper($authz) +]
[$ endif $] [$ if (@errors) $] [- errors(\@errors) -] [$ else $]
[- $pubHash = &Ewok::File::getPublishHash($fs_dir) if $EWOK_PUBLISH; -] [$ if ($mode eq 'stage' && ($editPriv || $authzPriv)) $]
[$ if ($editPriv) $] [$ endif $] [$ if ($authzPriv) $] [$ endif $] [# if ($adminPriv) $] [$ endif #] [$ if ($editPriv && ! $disallow{upload}) $] [$ endif $] [$ if ($editPriv) $]          Directory    Link    File   [$ endif $]
[$ endif $] [$ if ($mode ne 'view') $]
[$ endif $][- # Clipboard pseudo-directory if ($clipboard) { $d = []; chdir($EWOK_CLIPBOARD); my $label = ($trash) ? 'Trash-' : ''; $label .= $req->{user} . '-'; $f = [ <$label*> ]; map { $_ =~ s/^$label// } @$f; } # Real directories else { ($d, $f) = &Ewok::File::readdir($fs_dir, { web_dir => $web_dir, admin => $adminPriv, add_only => $add_only, }); # Weed out ewok objects according to authz level @$f = grep { ! $EWOK_ADMIN_OBJECTS{$_} } @$f if ! $adminPriv; @$f = grep ! m/$EWOK_TEMPLATE_RE/, @$f if ! $tmplPriv; @$f = grep { $_ ne $EWOK_AUTHZ_OBJECT } @$f if ! $authzPriv; # At the top-level only, dirCheck directories individually if ($web_dir eq '/') { $d = [ grep { dirCheck($req, "$web_dir$_/", { debug => $debug }) } @$d ]; } # Setup view and edit hashes if using non-standard viewers or editors %view = (); %view_suffix = (); %edit = (); # Setup special viewers for admins if ($adminPriv) { for (keys %EWOK_RESTRICTED_OBJECTS) { next if $_ eq $EWOK_AUTOINDEX_OBJECT; $view{$_} = 'view.html?p='; } $view_suffix{'meta'} = 'view.html?p='; } # if (keys %viewers || keys %editors) { # for my $file (@$f) { # for my $patt (keys %viewers) { # if ($file =~ m/$patt/) { # $view{$file} = $viewers{$patt}; # } # } # for my $patt (keys %editors) { # if ($file =~ m/$patt/) { # $edit{$file} = $editors{$patt}; # } # } # } # } } -] [$ if ($mode ne 'view') $][$ endif $] [$ if ($icons) $][$ endif $] [$ if ($long) $][$ endif $] [$ if ($mode eq 'stage') $] [$ if ($long) $][$ endif $] [$ endif $] [$ if ($web_dir ne '/') $][- ($updir = $web_dir) =~ s|/[^/]+/?$||; -] [$ if ($mode ne 'view') $][$ endif $] [$ if ($icons) $][$ endif $] [$ if ($mode eq 'stage') $][$ foreach (1 .. 2 + $long * 3) $][$ endforeach $][$ endif $] [$ endif $] [# Symlink handling #] [- sub get_link_targets { $elt = shift; $type = shift; $target = readlink("$fs_dir$elt"); # Fail for absolute links return ('', '') if $target =~ m:^\s*/:; $web_target = "$web_dir$target"; # Compress /foo/.. sequences while ($web_target =~ s|[^\./]+/+\.\./||g) { 1 }; if (substr($target,0,1) eq '/') { $fs_target = $target; } else { $fs_target = $fs_dir . $target; } # Compress /foo/.. sequences while ($fs_target =~ s|[^\./]+/+\.\./||g) { 1 }; $fs_target = dirname($fs_target) . '/'; return ($fs_target, $web_target); } -] [$ sub showlink $] [- ($fs_target, $web_target) = get_link_targets(@_); -] [$ if (ewokdir($fs_target)) $][$ if ($icons) $]link->[$ else $]link->[$ endif $][+ $target +] [$ if (dirname($web_target) ne $wd) $]  (fm)[$ endif $] [$ elsif (! $icons) $]link[$ endif $][# ewokdir($fs_target) #] [$ endsub $] [$ foreach $elt (@$d) $] [- if (-l "$fs_dir$elt") { ($fs_target, $web_target) = get_link_targets($elt, 'dir') } else { $fs_target = undef; $web_target = "$web_dir$elt"; } -] [# Ignore directory links pointing to non-ewok directories #] [$ if (! defined $fs_target || ewokdir($fs_target)) $] [$ if ($mode ne 'view' && $editPriv) $] [$ endif $] [$ if ($icons) $][$ endif $] [$ if ($long) $][$ endif $] [$ if ($mode eq 'stage') $] [$ if ($long) $][$ endif $][$ endif $] [$ endif $] [$ endforeach $] [$ if (@$f) $][$ foreach $elt (@$f) $][- $link = -l "$fs_dir/$elt" -] [$ if ($mode ne 'view' && $editPriv) $][$ endif $] [$ if ($icons) $][$ endif $] [$ if ($long) $][$ endif $] [$ if (! $clipboard) $] [$ if ($mode eq 'stage') $] [$ if ($long) $][$ endif $][# $long #] [$ elsif ($editPriv) $] [$ if ($elt =~ m/$EWOK_EDIT_RE/i || ($tmplPriv && $elt =~ m/$EWOK_TEMPLATE_RE/i) || ($adminPriv && $elt !~ m/(\.meta|\.htaccess)$/ && $elt ne $EWOK_AUTHZ_OBJECT)) $][- $e = $edit{$elt} || '/ewok/edit.html'; -]edit [$ endif $] [$ if ($long) $][$ endif $][# $long #][$ endif $][# ! $link && $editPriv #] [$ endif $][# $mode eq 'stage' #] [$ endforeach $][$ endif $]
[[[+ $long ? 'short' : 'long' +] listing]  NAME  SIZE  VIEW  EDIT   META  DOWNLOAD   LINK TO 
  <UP>   
[dir] [+ local $escmode = 0; $elt; +]    view    [$ if (-l "$fs_dir/$elt") $]meta[$ elsif ($editPriv && $elt ne '.meta') $]meta[$ else $] [$ endif $]    [$ if (-l "$fs_dir/$elt") $][- showlink $elt, 'dir' -][$ endif $]  
[file] [+ $elt +]   [+ -s "$fs_dir/$elt" if ! $link +]  [- # Check for explicit viewer $v = ''; if (keys %view) { if ($view{$elt}) { $v = $view{$elt}; } else { ($suffix) = ($elt =~ m/\.(\w+)\s*$/); $v = $view_suffix{$suffix}; } } -]view[$ endif $]  [$ if ($link) $]  [$ if ($elt ne $EWOK_AUTOINDEX_OBJECT && $editPriv && $elt !~ m/$EWOK_NONMETA_RE/i) $]meta [$ endif $]   [$ if ($elt ne $EWOK_AUTOINDEX_OBJECT) $][- showlink $elt -]  [$ endif $]  [$ if ($editPriv && $elt !~ m/$EWOK_NONMETA_RE/i) $]meta [$ endif $] [$ if ($editPriv && $elt =~ m/$EWOK_WRAP_RE/i) $]download [$ endif $]  
[# File buttons #] [$ if ($mode ne 'view') $]

[$ if $editPriv && (@$f || @$d) $] [$ if (! $clipboard) $] Scope:   Selected[$ if ($javascript) $] ( [$ if (@$d && @$f) $] [$ endif $])  [$ endif $]      Entire directory     Entire tree    [$ endif $][$ endif $]
[$ if $editPriv && (@$f || @$d) && ! $clipboard $] [# #] [$ endif $][$ if ($mode eq 'stage' && $editPriv) $] [$ endif $][$ if ($mode eq 'stage' && $editPriv && &Ewok::File::pastecheck($req->{user})) $] [$ endif $][$ if $mode eq 'stage' && $publPriv && ref $pubHash eq 'HASH' $] [$ endif $][# if $mode eq 'stage' && $publPriv $] [$ endif #]

[$ endif $] [$ endif $] [$ if ($mode ne 'view' && $editPriv && $javascript) $] [$ endif $]