[# tag: ewok file manager page #] [! do { use File::Basename; use Data::Dumper; use Ewok::Config; use Ewok::Authz qw(:common); use Ewok::Meta qw(getMeta setMeta); use Ewok::Util qw(:dir :error); use Ewok::Publish qw(targetRewrite getSiteHash publish); } !] [- do { 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 = (); $mode = 'none'; $Config = get_config(); # Check initialisation error("Error: ewok not initialised correctly. You may be running using Embperl instead of EmbperlObject, or ewok may be finding EmbperlObject components (base.epl etc.) other than its own.", $errors) if ! $req->{ewok_init}; # 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 = $Config->{EWOK_CLIPBOARD}; $fs_dir .= '/' if (substr($fs_dir,-1) ne '/'); # Deny access if $fs_dir is not a directory if (! -d $fs_dir) { warning("Error: directory '$wd' not found.", \@errors); } } # Map web directories to their fs counterparts else { $clipboard = 0; ($web_dir, $fs_dir, $wd) = webfsdir($req, $fdat{p}, { errors => \@errors, } ); $web_url = $web_dir; if (! @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 '/'; $web_url = $web_dir; } } # 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 to ewok directories and metadata directories for non-admins if (! $adminPriv && ($fs_dir =~ m!^$EWOK_HOME/htdocs/! || $fs_dir =~ m|/\.meta\b|)) { warning("Error: only ewok administrators have access to directory '$wd'.", \@errors); } # Deny access if the user doesn't have view privilege elsif ($disallow{view} || ! $viewPriv) { warning("Error: you do not have view privilege on directory '$wd'.", \@errors) unless $web_dir eq '/'; } 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 = targetRewrite($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; } } } if (! @errors) { # Deny access if $mode is still 'none' (unless this is the document root) if ($mode eq 'none') { if ($web_dir eq '/') { $mode = 'view'; $add_only = 1; } else { warning("Error: directory '$wd' is not an ewok directory.", \@errors); } } } $req_rec->content_type("text/html"); $escmode = 3; } -] ewok file manager: [+ $wd +] [$ if ($mode eq 'stage' && $editPriv && $javascript) $] [$ else $] [$ endif $] [- $site = getSiteHash($fs_dir) -] [$ if ($debug) $]
web_dir: [+ $web_dir +]
web_url: [+ $web_url +]
fs_dir: [+ $fs_dir +]
wd: [+ $wd +]
priv: [+ $priv +]
mode: [+ $mode +]
disallow: [+ join ',', keys %disallow +]
EWOK_TOP_DIRS_RESTRICT: [+ Dumper $Config->{EWOK_TOP_DIRS_RESTRICT} +]
EWOK_TOP_DIRS_BLOCK: [+ Dumper $Config->{EWOK_TOP_DIRS_BLOCK} +]
Config: [+ Dumper $Config +]
[# authz: [+ Dumper($authz) +]
site: [+ Dumper($site) +] #]
[$ endif $] [$ if (@errors) $] [- errors(\@errors) -] [$ else $]
[$ if ($mode eq 'stage' && ($editPriv || $authzPriv)) $]
[$ if ($editPriv) $] [$ endif $] [$ if ($authzPriv) $] [$ endif $] [$ if ($editPriv && ! $disallow{upload}) $] [$ endif $] [$ if ($editPriv) $]          Directory    Link    File   [$ endif $]
[$ endif $] [$ if ($mode ne 'view') $]
[$ endif $][- do { # Clipboard pseudo-directory if ($clipboard) { $d = []; chdir($Config->{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 { ! $Config->{EWOK_ADMIN_OBJECTS}->{$_} } @$f if ! $adminPriv; @$f = grep ! m/$Config->{EWOK_TEMPLATE_RE}/, @$f if ! $tmplPriv; @$f = grep { $_ ne $Config->{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 && ref $Config->{EWOK_RESTRICTED_OBJECTS} eq 'HASH') { for (keys %{$Config->{EWOK_RESTRICTED_OBJECTS}}) { $view{$_} = 'view.html?p='; } } $view_suffix{'meta'} = 'view.html?p=' if $adminPriv; # 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 #] [- do { 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) $] [- do { 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/$Config->{EWOK_EDIT_RE}/i || ($tmplPriv && $elt =~ m/$Config->{EWOK_TEMPLATE_RE}/i) || ($adminPriv && $elt !~ m/(\.meta|\.htaccess)$/ && $elt ne $Config->{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] [+ do { 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 +]   [+ $link ? '' : -s "$fs_dir/$elt" +]  [- do { # 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 ($editPriv && $elt !~ m/$Config->{EWOK_NONMETA_RE}/i) $]meta [$ endif $]   [- showlink $elt -]    [$ if ($editPriv && $elt !~ m/$Config->{EWOK_NONMETA_RE}/i) $]meta [$ endif $] [$ if ($editPriv && $elt =~ m/$Config->{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 $site eq 'HASH' && ref $site->{publish} eq 'HASH' && keys %{$site->{publish}}) $] [$ endif $][# if ($mode eq 'stage' && $publPriv) $] [$ endif #]

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