1 # Copyright 2002-2007 Interchange Development Group and others
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version. See the LICENSE file for details.
8 # $Id: file_navigator.coretag,v 1.17 2007-12-21 03:32:43 mheins Exp $
10 UserTag file-navigator Order mask
11 UserTag file-navigator addAttr
12 UserTag file-navigator Version $Revision: 1.17 $
13 UserTag file-navigator Routine <<EOR
14 use vars qw/$CGI $Session $Tag $Scratch/;
18 import Fcntl qw/:mode/;
21 *S_ISUID = sub {return 2048};
22 *S_ISGID = sub {return 1024};
23 *S_ISVTX = sub {return 512};
26 my ($dir_mask, $opt) = @_;
29 #::logDebug("file-nav dir_mask: $dir_mask opt: " . ::uneval($opt));
32 my $base_admin = ( $::Variable->{UI_BASE} || 'admin');
33 my $base_url = $Vend::Cfg->{VendURL}
35 . ($opt->{base_url} || $base_admin);
36 my $view_href = $opt->{view_href} || "$base_admin/do_view";
37 my $view_form = $opt->{view_form} || 'mv_arg=~FN~';
39 my $action = $CGI::values{action} || '';
42 my $edit_page = $opt->{edit_page} || "content_editor";
43 my $edit_form = $opt->{edit_form} || "ui_name=~FN~&ui_type=page";
49 if ($opt->{initial_dir}) {
50 $Vend::Session->{ui_cwd} = $opt->{initial_dir};
51 $idir_re = qr{^$opt->{initial_dir}/};
54 if($action eq 'chdir') {
55 my $newdir = $CGI::values{dir} || '.';
56 unless( Vend::File::allowed_file($newdir) ) {
57 $Scratch->{ui_error} = ::errmsg('Security violation');
58 return interpolate_html("[bounce page='$base_admin/error']");
61 $Scratch->{ui_error} = ::errmsg("%s not a directory", $newdir);
62 return interpolate_html("[bounce page='$base_admin/error']");
64 $Vend::Session->{ui_cwd} = $newdir || '.';
67 my $curdir = $Vend::Session->{ui_cwd} || '.';
72 if($action eq 'find') {
74 my $string = $CGI::values{find};
76 push @errors, ::errmsg("Refuse to find a blank or whitespace.");
79 elsif( $string =~ /\(\s*\?\s*\{/) {
80 $Scratch->{ui_error} = ::errmsg('Security violation');
81 return interpolate_html("[bounce page='$base_admin/error']");
85 if($string =~ /\*/ and $string !~ /\.\*/) {
93 push @errors, ::errmsg("%s is not a good search.", $regex);
101 local($SIG{__WARN__}) = sub { push @errors, $_ };
104 if($CGI::values{find_action} =~ /\bfilename\b/) {
106 push @files, $File::Find::name
111 if($curdir eq '.' and ! $CGI::values{find_session}) {
112 %exclude = (qw! ./session 1 session 1 tmp 1 ./tmp 1!);
116 if( -d $_ and $exclude{$File::Find::dir}) {
117 $File::Find::prune = 1;
124 errmsg("%s: refuse to find in megabyte-sized files",
129 open(TMPFINDNAV, "< $_")
132 errmsg("%s: permission denied", $File::Find::name)
136 my $str = <TMPFINDNAV>;
138 and push (@files, $File::Find::name);
142 File::Find::find($wanted, $curdir);
147 push @messages, errmsg("Found %s files.", scalar @files);
152 push @errors, errmsg("No files found.");
160 elsif($curdir eq '.') {
161 if($dir_mask eq '*') {
162 @files = grep $_ ne 'CVS', glob('*');
165 @files = split /\s+/, $dir_mask;
169 @files = grep $_ !~ m{/CVS$}, glob("$curdir/*");
172 my $this_page = $Global::Variable->{MV_PAGE};
173 my $this = Vend::Interpolate::tag_area($this_page);
176 my $up_img = qq{<img src="up.gif" align=center border=0 height=22 width=20 title="upload ~FN~">};
177 my $dn_img = qq{<img src="down.gif" align=center border=0 height=22 width=20 title="download ~FN~">};
178 my $vw_img = qq{<img src="index.gif" align=center border=0 height=22 width=20 title="view ~FN~">};
179 my $ed_img = qq{<img src="layout.gif" align=center border=0 height=22 width=20 title="edit ~FN~">};
180 my $dir_img = qq{<img src="folder.gif" align=center border=0 height=22 width=20 title="change directory to ~FN~">};
181 my $del_img = qq{<img src="delete.gif" align=center border=0 height=20 width=20 title="DELETE ~FN~">};
182 my $sp_img = qq{<img src="bg.gif" align=center border=0 height=20 width=20>};
185 $opt->{details} = $CGI->{details} unless defined $opt->{details};
186 if(defined $opt->{details}) {
187 $do_perms = $opt->{details};
189 elsif (defined $CGI->{details}) {
190 $do_perms = $Session->{ui_file_details} = $CGI->{details};
193 $do_perms = $Session->{ui_file_details};
197 $Tag->if_mm('advanced', 'delete_files')
199 $del_string = qq{<A onClick="return confirm('Are you sure you want to delete the file ~FN~?')" HREF="$Vend::Cfg->{VendURL}/$this_page?~ID~&mv_click=file_maintenance&ui_delete_file=~FN~&mv_action=back">$del_img</A>};
203 <A HREF="$Vend::Cfg->{VendURL}/ui_download/~FN~?~ID~">$dn_img</A>$del_string<A HREF="$base_url/upload_file?~ID~&mv_arg=~FN~&ui_return_to=$this_page">$up_img</A><A HREF="$base_url/do_view?~ID~&mv_arg=~FN~">$vw_img</A> %s <A HREF="$Vend::Cfg->{VendURL}/$view_href?~ID~&$view_form">%s</A><BR>
207 <A HREF="$base_url/upload_file?~ID~&mv_arg=~FN~&ui_return_to=$this_page">$up_img</A> %s <A HREF="$base_url/upload_file?~ID~&mv_arg=~FN~&ui_return_to=$this_page">%s</A><BR>
211 if(! $do_perms and $opt->{edit_only}) {
213 <A HREF="$base_url/$edit_page?~ID~&$edit_form&ui_return_to=$this_page">$ed_img</A> %s <A HREF="$base_url/$edit_page?~ID~&$edit_form&ui_return_to=$this_page">%s</A><BR>
218 <A HREF="$Vend::Cfg->{VendURL}/ui_download/~FN~?~ID~">$dn_img</A>$del_string<A HREF="$base_url/upload_file?~ID~&mv_arg=~FN~&ui_return_to=$this_page">$up_img</A><A HREF="$base_url/$edit_page?~ID~&$edit_form&ui_return_to=$this_page">$ed_img</A> %s <A HREF="$base_url/$edit_page?~ID~&$edit_form&ui_return_to=$this_page">%s</A><BR>
223 <A HREF="$Vend::Cfg->{VendURL}/$this_page?~ID~&action=chdir&dir=~FN~">$dir_img</A> %s <A HREF="$Vend::Cfg->{VendURL}/$this_page?~ID~&action=chdir&dir=~FN~">%s</A><BR>
226 $dtmpl = "$sp_img$sp_img$sp_img$dtmpl" if $do_perms;
256 my $time = POSIX::strftime("%d-%b-%Y %H:%M:%S", localtime($det[9]));
257 my $permstring = sprintf('%04o', $det[2]);
258 #push @messages, "$_ perms=$permstring\n";
259 $permstring = substr($permstring, -3, 3);
261 my (@ugo) = split //, $permstring;
262 @ugo = map { $_ = $perm[$_] } @ugo;
263 if (-l _) { $top = 'l' }
264 elsif (-d _) { $top = 'd' }
265 elsif (-f _) { $top = '-' }
267 $ugo[0] =~ s/.$/s/ if $det[2] & S_ISUID();
268 $ugo[1] =~ s/.$/s/ if $det[2] & S_ISGID();
269 $ugo[2] =~ s/.$/t/ if $det[2] & S_ISVTX();
270 my $user = getpwuid($det[4]);
271 my $grp = getgrgid($det[5]);
272 $grp = substr($grp, 0, 8) if length($grp) > 8;
273 $user = substr($grp, 0, 8) if length($user) > 8;
274 my $perm = join "", $top, @ugo;
275 my $ret = sprintf(" <TT><SMALL>%s %-8s %-8s %s</SMALL></TT>", $perm, $user, $grp, $time);
276 $ret =~ s/ / /g;
286 $fe =~ s!([^-\w./:,])!sprintf('%%%02x', ord($1) )!eg;
288 $perms = perm_line($_) if($do_perms);
291 push @dir, [$fe, $fn, $dtmpl, $perms];
293 elsif ($opt->{edit_all} || ($opt->{edit_only} && /\.html?$/) ) {
294 my $rn = $curdir . "/$fn";
295 $rn =~ s{$idir_re}{} if $idir_re;
296 push @plain, [$fe, $fn, $ftmpl_ed, $perms, $rn];
299 push @plain, [$fe, $fn, $ftmpl, $perms];
303 $opt->{top_of_tree} ||= '.';
305 if($nd ne $opt->{top_of_tree} and ! $opt->{no_up}) {
307 or $nd = $opt->{top_of_tree};
308 my $msg = '<large><b>..</b></large> ['
309 . errmsg ($opt->{parent_directory_message} || 'parent directory')
311 unshift @dir, [ $nd, $msg, $dtmpl ];
314 my $pc = \$Vend::Session->{pageCount};
315 unshift @dir, [ "$curdir/", errmsg('(new file)'), $utmpl ]
316 unless $opt->{no_new_file};
318 @dir = () if $opt->{no_dirs};
321 $out .= "<span class=cerror>$_</span><br>";
324 $out .= "<span class=cmessage>$_</span><br>";
326 my $template = $opt->{template} || '';
329 $_->[2] = sprintf($_->[2], $_->[3], $_->[1]);
330 $_->[2] =~ s/~FN~/$_->[0]/g;
331 $_->[2] =~ s/~RN~/$_->[4]/g;
332 $_->[2] =~ s/~ID~/mv_session_id=$Session->{id}&mv_pc=$$pc/g;