/usr/share/usermin/filemin
NameSizeModeActions
images/-0755rm
lang/-0755rm
unauthenticated/-0755rm
acl_security.pl25710644editdlrm
bookmark.cgi3260755editdlrm
CHANGELOG94400644editdlrm
chattr.cgi10070755editdlrm
chcon.cgi9790755editdlrm
chmod.cgi24750755editdlrm
chown.cgi9830755editdlrm
compress.cgi11870755editdlrm
config200644editdlrm
config.cgi25810755editdlrm
config.info2600644editdlrm
config.info.ar970644editdlrm
config.info.ca520644editdlrm
config.info.de610644editdlrm
config.info.fr600644editdlrm
config.info.it1990644editdlrm
config.info.uk2600644editdlrm
copy.cgi3620755editdlrm
create_file.cgi5590755editdlrm
create_folder.cgi5500755editdlrm
cut.cgi3610755editdlrm
defaultacl3750644editdlrm
defaultuconf1800644editdlrm
delete.cgi4630755editdlrm
download.cgi7990755editdlrm
edit_file.cgi18110755editdlrm
extract.cgi15300755editdlrm
filemin-lib.pl263570644editdlrm
http_download.cgi13710755editdlrm
index.cgi35220755editdlrm
module.info1370644editdlrm
module.info.ar1160644editdlrm
module.info.ar.auto320644editdlrm
module.info.bg00644editdlrm
module.info.bg.auto1640644editdlrm
module.info.ca890644editdlrm
module.info.ca.auto240644editdlrm
module.info.cs00644editdlrm
module.info.cs.auto1150644editdlrm
module.info.da00644editdlrm
module.info.da.auto1010644editdlrm
module.info.de880644editdlrm
module.info.de.auto210644editdlrm
module.info.el00644editdlrm
module.info.el.auto2090644editdlrm
module.info.es00644editdlrm
module.info.es.auto1400644editdlrm
module.info.eu00644editdlrm
module.info.eu.auto1310644editdlrm
module.info.fa00644editdlrm
module.info.fa.auto1370644editdlrm
module.info.fi00644editdlrm
module.info.fi.auto1100644editdlrm
module.info.fr00644editdlrm
module.info.fr.auto1360644editdlrm
module.info.hr00644editdlrm
module.info.hr.auto1180644editdlrm
module.info.hu00644editdlrm
module.info.hu.auto1090644editdlrm
module.info.it1040644editdlrm
module.info.ja00644editdlrm
module.info.ja.auto1370644editdlrm
module.info.ko00644editdlrm
module.info.ko.auto1180644editdlrm
module.info.ms00644editdlrm
module.info.ms.auto1130644editdlrm
module.info.nl00644editdlrm
module.info.nl.auto1080644editdlrm
module.info.no220644editdlrm
module.info.no.auto750644editdlrm
module.info.pl960644editdlrm
module.info.pl.auto1150644editdlrm
module.info.pt00644editdlrm
module.info.pt.auto1330644editdlrm
module.info.pt_BR00644editdlrm
module.info.pt_BR.auto1420644editdlrm
module.info.ru00644editdlrm
module.info.ru.auto1940644editdlrm
module.info.sk00644editdlrm
module.info.sk.auto1260644editdlrm
module.info.sv00644editdlrm
module.info.sv.auto990644editdlrm
module.info.tr00644editdlrm
module.info.tr.auto1210644editdlrm
module.info.uk3670644editdlrm
module.info.uk.auto1880644editdlrm
module.info.zh00644editdlrm
module.info.zh.auto1010644editdlrm
module.info.zh_TW00644editdlrm
module.info.zh_TW.auto1100644editdlrm
paste.cgi14080755editdlrm
prefs.info100644editdlrm
rename.cgi5450755editdlrm
safeacl500644editdlrm
save_config.cgi9750755editdlrm
save_file.cgi8040755editdlrm
search.cgi5720755editdlrm
setfacl.cgi16890755editdlrm
upload.cgi53560755editdlrm
Edit: /usr/share/usermin/filemin/upload.cgi (5356B)
#!/usr/bin/perl require './filemin-lib.pl'; use Cwd 'abs_path'; &ReadParse(\%in, "GET"); get_paths(); my @errors; my @uploaded_files; my $uploaded_dir; $line = ""; # Use Webmin's callback function to track progress $cbfunc = \&read_parse_mime_callback; # Get multipart form boundary $ENV{'CONTENT_TYPE'} =~ /boundary=(.*)$/ || &error($text{'readparse_enc'}); $boundary = $1; # Initialize progress tracker &$cbfunc(0, $ENV{'CONTENT_LENGTH'}, undef, $in{'id'}); #Read the data MAINLOOP: while(index($line,"$boundary--") == -1) { # Reset vars on each loop $file = undef; $rest = undef; $prevline = undef; $header = undef; $line = ; $got += length($line); if ($upload_max && $got > $upload_max) { &error(&text('error_upload_emax', &nice_size($upload_max))); } &$cbfunc($got, $ENV{'CONTENT_LENGTH'}, undef, $in{'id'}); if ($line =~ /(\S+):\s*form-data(.*)$/) { $rest = $2; # We found form data definition, let`s check it } else { next; } # Check if current form data part is file while ($rest =~ /([a-zA-Z]*)=\"([^\"]*)\"(.*)/) { if ($1 eq 'filename') { $file = $2; } $rest = $3; } if (defined($file)) { my @st = stat($cwd); # If we have a dir, parse it and create a sub-tree first if ($file =~ /\//) { my ($dir) = $file =~ /^(.*)\/[^\/]+$/; if ($dir) { my @dirs = split('/', $dir); $dir = '/'; # If overwriting is not allowed check for dupes if (!$in{'overwrite_existing'}) { if ($dirs[0] && -e "$cwd/$dirs[0]") { # As only one directory upload at a time allowed # check if parent exists and if it does add # predictable suffix, like `dir(1)` or `dir(2)` if (!$uploaded_dir) { my $__ = 1; for (;;) { my $new_dir_name = "$dirs[0](" . $__++ . ")"; if (!-e "$cwd/$new_dir_name") { $uploaded_dir = $new_dir_name; last; } } } } else { $uploaded_dir = $dirs[0]; } $file =~ s/^(\Q$dirs[0]\E)/$uploaded_dir/; $dirs[0] = $uploaded_dir; } foreach my $updir (@dirs) { $dir .= "$updir/"; if (!-e "$cwd$dir") { mkdir("$cwd$dir"); &set_ownership_permissions($st[4], $st[5], undef, "$cwd$dir"); } } } } # In case of a regular file check for dupes if (!$in{'overwrite_existing'}) { if ($file && -e "$cwd/$file") { # If file exists add predictable suffix, like `file(1)` or `file(2)` my ($file_name, $file_extension) = $file =~ /(?|(.*)\.((?|tar|wbm|wbt)\..*)|(.*)\.([a-zA-Z]+\.(?|gpg|pgp))|(.*)\.(?=(.*))|(.*)())/; $file_extension = ".$file_extension" if ($file_extension); my $__ = 1; for (;;) { my $new_file_name = "$file_name(" . $__++ . ")"; if (!-e "$cwd/$new_file_name$file_extension") { $file = "$new_file_name$file_extension"; last; } } } } # OK, we have a file, let`s save it my $full = "$cwd/$file"; my $newfile = !-e $full; if (!open(OUTFILE, ">$full")) { push @errors, "$text{'error_opening_file_for_writing'} $path/$file - $!"; next; } else { binmode(OUTFILE); if ($newfile) { # Copy ownership from parent dir &set_ownership_permissions($st[4], $st[5], undef, $full); } # Skip "content-type" as we work in binmode anyway and # skip empty line ; ; # Read all lines until next boundary or form data end while(1) { $line = ; if (!defined($line)) { push @errors, "Unexpected end of input"; last MAINLOOP; } # Inform progress tracker about our actions $got += length($line); &$cbfunc($got, $ENV{'CONTENT_LENGTH'}, $file, $in{'id'}); # Some brainf###ing to deal with last CRLF if (index($line,"$boundary") != -1 || index($line,"$boundary--") != -1) { chop($prevline); chop($prevline); if (!print OUTFILE $prevline) { push @errors, "text{'error_writing_file'} $path/$file"; last MAINLOOP; } last; } else { if (!print OUTFILE $prevline) { push @errors, "text{'error_writing_file'} $path/$file"; last MAINLOOP; } $prevline = $line; } } # File saved, let`s go further close(OUTFILE); # Store which file were uploaded my $fpath = $cwd; my $ffile = $file; my @subdirs = split('/', $ffile); if (@subdirs > 1) { $ffile = pop(@subdirs); $fpath .= ("/" . join('/', @subdirs)); } push(@uploaded_files, {'path' => $fpath, 'file' => $ffile}); } } else { # Just skip everything until next boundary or form end while (index($line, "$boundary") == -1 || index($line, "$boundary--") == -1) { $line = ; } } } # Extract and delete uploaded files if ($in{'extract_uploaded'}) { my @eerrors = &extract_files(\@uploaded_files, 1); @errors = (@eerrors, @errors) if (@eerrors); } # Everything finished, inform progress tracker &$cbfunc(-1, $ENV{'CONTENT_LENGTH'}, undef, $in{'id'}); if (scalar(@errors) > 0) { print_errors(@errors); } else { &redirect("index.cgi?path=".&urlize($path)); }