#!/usr/bin/perl # RedFox! Productions: DirList # All coding done by one Ranna Fox use strict; use CGI qw( :standard ); my $file = param('d') || "prefix/"; if ($file =~ /^\//) { print "<b>Ahem...you may not list files with absolute paths. Especi +ally not <em>that</em> absolute path</b>\n"; $r->print_end; exit; } elsif ($file =~ /\.\./) { print "<b>'Scuse me, I won't list directories with .. in their path. + Better fix that.</b>\n"; $r->print_end; exit; } elsif (not $file =~ /^prefix\//) { print "<b>See, the way things work is that if you're gonna list a di +rectory, you gotta put a 'prefix/' before it, which means it has to b +e in my directory.<b>\n"; $r->print_end; exit; } my $filen; ($filen = $file) =~ s{^prefix/}{/path/to/home/dir/}; if (not -d $filen) { print "<b>That...uh...doesn't appear to exist... o.O</b>\n"; $r->print_end; exit; } &parse_dir($filen, $file); sub parse_dir { my $dir = $_[0]; my $req = $_[1]; opendir(PARSEDIR, "$dir") || die "Couldn't open directory $dir: $!\n +"; my $currdir; $dir =~ s/(.*)\/$/$1/; ($currdir = $dir) =~ s{.*/([^/]*)$}{$1}; print "<li><b>$currdir/</b>\n<ul>\n"; foreach my $file (sort(readdir(PARSEDIR))) { my $fullname = $dir . "/" . $file; next if ($file =~ /^\..*/ || ! -r $fullname); if (-d $fullname) { $req = $req . "/" . $file; &parse_dir($fullname, $req); } else { my $dirn; ($dirn = $dir) =~ s{/path/home/to/dir}{}; ($filen = $file) =~ s/ /\%20/g; print "<li>[<a href=$dirn/$filen>Bare link</a>]"; if (-T $fullname) { # showtext.php is basically an fpassthru() enclosed in <pre> t +ags. print "[<a href=/showtext.php?file=prefix$dirn/$filen>Online</ +a>]"; } else { print "[<a href=$dirn/$filen>Download</a>]"; } print " - $file</li>\n"; } } closedir(PARSEDIR); print "</ul>\n"; }
In reply to Recursive CGI Dirlist by Ranna
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |