Apache2-FileManager
view release on metacpan or search on metacpan
FileManager.pm view on Meta::CPAN
ar[i].checked = ck_stat;
}
}
function display_help () {
var w=window.open('', 'help',
'resizable=yes,scrollbars=yes,width=650,height=650');
var d = w.document.open();
d.write(
\"<HTML> <UL><B><U><FONT SIZE=+1>Help</FONT></U></B><BR><BR>\"+
\"<LI><A NAME=upload><B>How do I upload files?</B></A><BR>\"+
\"Click on the upload menu item. After the <I>Upload Files</I>\"+
\"window opens, click the <I>Browse</I> button. \"+
\"This will pop open another window showing files on your computer. \"+
\"Select a file you want to upload. You can not upload directories. \"+
\"If you want to upload a directory, archive it first into a \"+
\"<I>zip</I> file or a tarball. You will then be able to extract \"+
\"it on the server. You can upload up to 10 files at a time. \"+
\"After selecting the files you want to upload, click the \"+
\"<I>upload</I> button to transfer the files from your machine to \"+
\"the server.<BR><BR>\"+
\"<LI><A NAME=move><B>How do I copy or move files?</B></A><BR>\"+
\"First click the check boxes next to the file names that you would \"+
\"like to copy or paste. Next click the <I>copy</I> or <I>paste</I> \"+
\"button. Then go to the directory you would like them pasted in. \"+
\"Finally, click <I>paste</I>.<BR><BR>\"+
\"<LI><A NAME=move><B>Why does the file manager seem broken in \"+
\"certain directories or when copying or pasting certain files?\"+
\"</B></A><BR>\"+
\"This occurs when the file manager does not have permission to \"+
\"access these files. To fix the problem, contact your system \"+
\"administrator and ask them to grant the webserver \"+
\"READ, WRITE, and EXECUTE access to your files.<BR><BR>\"+
\"</UL><CENTER>\"+
\"<FORM><INPUT TYPE=BUTTON VALUE='close' onclick='window.close();'>\"+
\"</FORM></CENTER></HTML>\");
d.close();
w.focus();
}
function getexpirydate(nodays){
var UTCstring;
Today = new Date();
nomilli=Date.parse(Today);
Today.setTime(nomilli+nodays*24*60*60*1000);
UTCstring = Today.toUTCString();
return UTCstring;
}
function getcookie(cookiename) {
var cookiestring=''+document.cookie;
var index1=cookiestring.indexOf(cookiename);
if (index1==-1 || cookiename=='') return '';
var index2=cookiestring.indexOf(';',index1);
if (index2==-1) index2=cookiestring.length;
escsubstring = cookiestring.substring(index1+cookiename.length+1, index2)
return unescape(escsubstring);
}
function setcookie(name,value,duration){
cookiestring=name+'='+escape(value)+';EXPIRES='+getexpirydate(duration);
document.cookie=cookiestring;
if (!getcookie(name)) {
return false;
} else{
return true;
}
}
function print_upload () {
var w = window.open('','FileManagerUpload',
'scrollbars=yes,resizable=yes,width=500,height=440');
var d = w.document.open();
d.write(\"<HTML><BODY><CENTER><H1>Upload Files</H1>\"+
\"<FORM NAME=UploadForm ACTION='".r->uri."' \"+
\" METHOD=POST onsubmit='window.opener.focus();' \"+
\" ENCTYPE=multipart/form-data>\"+
\" <INPUT TYPE=HIDDEN NAME=FILEMANAGER_curr_dir \"+
\" VALUE='".r->param('FILEMANAGER_curr_dir')."'>\");
for (var i=1; i <= 10; i++) {
d.write(\"<INPUT TYPE=FILE SIZE=40 NAME=FILEMANAGER_file\"+i+\"><BR>\");
}
d.write(\"<INPUT TYPE=BUTTON VALUE='cancel' onclick='window.close();'>\"+
\" \"+
\"<INPUT TYPE=SUBMIT NAME=FILEMANAGER_cmd\"+
\" VALUE=upload></CENTER></BODY></HTML>\");
d.close();
w.focus();
}
// make input check box form elements into an array ALL the time
function get_ckbox_array() {
var ar;
sel_files = window.document.FileManager.FILEMANAGER_sel_files;
// no files
if (sel_files == null) {
ar = new Array();
}
// 1 file (no length)
else if (sel_files.length == null) {
ar = [ sel_files ];
}
// more than one file
else {
ar = sel_files;
}
return ar;
}
// make array of check box objects that are selected
function get_sel_ckbox_array() {
var sel_ar = new Array();
var ar = window.get_ckbox_array();
for (var i=0; i < ar.length; i++) {
if (ar[i].checked == true) {
sel_ar.push(ar[i]);
}
}
return sel_ar;
}
// get the number checked
function get_num_checked() {
var sel_ar = get_sel_ckbox_array();
return sel_ar.length;
}
//function to edit file
function edit_file () {
var sel_ar = get_sel_ckbox_array();
//make sure there is 1 and only 1 selected file
if (sel_ar.length != 1) {
window.alert('Please select ONE file to edit by clicking on a '+
'check box with the mouse.');
}
else {
var f= window.document.FileManager;
var cd = escape(f.FILEMANAGER_curr_dir.value);
var editfile = escape(sel_ar[0].value);
var w = window.open('".r->uri."?FILEMANAGER_cmd=editfile".
"&FILEMANAGER_curr_dir='+cd+'".
"&FILEMANAGER_editfile='+editfile,
'FileManagerEditFile',
'scrollbars,resizable');
sel_ar[0].checked = false;
w.focus();
}
}
// make cookie for checked filenames
function save_names (type) {
var cb = get_sel_ckbox_array();
var ac = '';
for (var i=0; i < cb.length; i++) {
ac = ac + cb[i].value + '|';
cb[i].checked = false;
}
if (ac == '') {
window.alert('Please select file(s) by clicking on the '+
'check boxes with the mouse.');
} else {
ac = ac + type;
window.setcookie(cookie_name,ac,1);
}
}
//test if browser cookies are enabled
if (! window.document.cookie ) {
window.setcookie(cookie_name,'test',1);
if (! window.document.cookie) {
document.write('<H1><FONT COLOR=#990000>'+
'please enable cookies</FONT></H1>');
}
window.setcookie(cookie_name,'',-1);
}
$$o{JS}
--></SCRIPT> "; #end return literal
}
sub html_style_sheet {
return "
<STYLE TYPE='text/css'>
<!--
BODY {
background-color: white;
font-family: serif;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
padding-top: 0;
padding-bottom: 0;
padding-right: 1;
padding-left: 1;
border-top: 0;
border-bottom: 0;
border-right: 0;
border-left: 0;
FileManager.pm view on Meta::CPAN
#Delete
"<A HREF=# onclick=\"
var f=window.document.FileManager;
if (get_num_checked() == 0) {
window.alert('Please select a file to delete by clicking'+
' on a check box with the mouse.');
} else {
var msg = '\\n Are you sure?\\n' +
'\\n' + 'Click OK to delete selected ' +
'files & directories\\n' +
' ***including*** files in those directories';
if (window.confirm(msg)) {
f.FILEMANAGER_cmd.value='delete'; f.submit();
}
}
return false; \"
><FONT COLOR=WHITE><B>delete</B></FONT></A>",
#Rename
"<A HREF=# onclick=\"
var f=window.document.FileManager;
if (get_num_checked() != 1) {
window.alert('Please select ONE file to rename by clicking on a '+
'check box with the mouse.');
} else {
var rv=window.prompt('enter new name','');
if ((rv != null) && (rv != '')) {
f.FILEMANAGER_cmd.value='rename';
f.FILEMANAGER_arg.value=rv;
f.submit();
}
}
return false;\"
><FONT COLOR=WHITE><B>rename</B></FONT></A>",
#Extract
"<A HREF=# onclick=\"
var f=window.document.FileManager;
if (get_num_checked() == 0) {
window.alert('Please select a file to extract by clicking on a '+
'check box with the mouse.');
} else {
f.FILEMANAGER_cmd.value='extract';
f.submit();
}
return false;\"
><FONT COLOR=WHITE><B>extract</B></FONT></A>",
#New File
"<A HREF=# onclick=\"
var f=window.document.FileManager;
var rv = window.prompt('new file name','');
var cd = f.FILEMANAGER_curr_dir.value;
if (cd != '') {
rv = cd+'/'+rv;
}
if ((rv != null) && (rv != '')) {
var w = window.open('".r->uri."?FILEMANAGER_cmd=editfile".
"&FILEMANAGER_curr_dir='+escape(cd)+'".
"&FILEMANAGER_editfile='+escape(rv),
'FileManagerEditFile',
'scrollbars,resizable');
w.focus();
} else if (rv == '') {
window.alert('can not create blank file names');
}
return false; \">
<FONT COLOR=WHITE><B>new file</B></FONT></A>",
#New Directory
"<A HREF=# onclick=\"
var f=window.document.FileManager;
var rv=window.prompt('new directory name','');
if ((rv != null) && (rv != '')) {
f.FILEMANAGER_arg.value=rv;
f.FILEMANAGER_cmd.value='mkdir';
f.submit();
} else if (rv == '') {
window.alert('can not create blank directory names');
}
return false;\"
><FONT COLOR=WHITE><B>new directory</B></FONT></A>",
#Upload
"<A HREF=# onclick=\"
window.print_upload();
return false;\"
><FONT COLOR=WHITE><B>upload<B></FONT></A>"
);
#Rsync
my $rsync = "";
if ($$o{'RSYNC_TO'}) {
push @cmds,
"<TD><A HREF=# onclick=\"
if (window.confirm('Are you sure you want to synchronize with ".
"the production server?')) {
var w=window.open('','RSYNC',
'scrollbars=yes,resizables=yes,width=400,height=500');
w.focus();
var d=w.document.open();
d.write('<HTML><BODY><BR><BR><BR>".
"<CENTER>Please wait synchronizing production server.".
"<BR>This could take several minutes.".
"</CENTER></BODY></HTML>');
d.close();
w.location.replace('".r->uri."?FILEMANAGER_cmd=rsync',
'RSYNC',
'scrollbars=yes,resizables=yes,width=400,height=500');
} return false;\"
><FONT COLOR=WHITE><B>synchronize</B></FONT></A>";
}
return "
<!-- Actions Tool bar -->
<TABLE CELLPADDING=0 CELLSPACING=0
BORDER=0>
<TR ALIGN=CENTER>
<TD ALIGN=CENTER>"
.join("</TD><TD> <B><FONT COLOR=#bcbcbc SIZE=+2>|</FONT> </B>"
."</TD><TD>",
@cmds)
."</TD></TR></TABLE>";
}
sub html_file_list {
my $o = shift;
my $up_a_href = shift || "";
my $bgcolor = "efefef";
#get the list in this directory
my $curr_dir = "";
$curr_dir = r->param('FILEMANAGER_curr_dir')."/"
if (r->param('FILEMANAGER_curr_dir') ne "");
#if there is a value for the ".." directory, then add a row for that link
#at the *top* of the list
my $acum = "";
if ($up_a_href ne "") {
$acum = "
<TR BGCOLOR=#$bgcolor>
<TD> </TD>
<TD>$up_a_href</TD>
<TD ALIGN=CENTER>--</TD>
<TD ALIGN=CENTER>--</TD>
</TR>";
$bgcolor = "ffffff";
}
my $ct_rows = 0;
foreach my $file (sort <*>) {
my ($link,$last_modified,$size,$type);
$ct_rows++;
#if directory?
if (-d $file) {
$last_modified = "--";
$size = "<TD ALIGN=CENTER>--</TD>";
$type = "/"; # "/" designates "directory"
$link = "<A HREF=#
onclick=\"
var f=window.document.FileManager;
f.FILEMANAGER_curr_dir.value='"
.Apache2::Util::escape_path($curr_dir.$file, r->pool)."';
f.submit();
return false;\">
<FONT COLOR=#006699>$file$type</FONT></A>";
}
#must be a file
elsif (-f $file) {
#get file size
my $stat = stat($file);
$size = $stat->size;
if ($size > 1024000) {
$size = sprintf("%0.2f",$size/1024000) . " <I>M</I>";
} elsif ($stat->size > 1024) {
$size = sprintf("%0.2f",$size/1024). " <I>K</I>";
} else {
$size = sprintf("%.2f",$size). " <I>b</I>";
}
$size =~ s/\.0{1,2}//;
$size = "<TD NOWRAP ALIGN=RIGHT>$size</TD>";
#get last modified
$last_modified = $o->formated_date($stat->mtime);
#get file type
if (-S $file) {
$type = "="; # "=" designates "socket"
}
elsif (-l $file) {
$type = "@"; # "@" designates "link"
}
elsif (-x $file) {
$type = "*"; # "*" designates "executable"
}
my $true_doc_root = r->document_root;
my $fake_doc_root = $$o{DR};
$fake_doc_root =~ s/^$true_doc_root//;
$fake_doc_root =~ s/^\///; $fake_doc_root =~ s/\/$//;
my $href = $curr_dir;
$href = $fake_doc_root."/".$href if $fake_doc_root;
$link = "
<A HREF=\"/$href"."$file?nossi=1\"
TARGET=_blank><FONT COLOR=BLACK>"
.Apache2::Util::escape_path($file.$type, r->pool).
"</FONT>
</A>";
}
$acum .= "
<TR BGCOLOR=#$bgcolor>
<TD><INPUT TYPE=CHECKBOX NAME=FILEMANAGER_sel_files
VALUE='$curr_dir"."$file'></TD>
<TD>$link</TD>
<TD ALIGN=CENTER NOWRAP>$last_modified</TD>
$size
</TR>";
#alternate bgcolor so it is easier to read
$bgcolor = ( ($bgcolor eq "ffffff") ? "efefef" : "ffffff" );
}
#print a message if there were no files in this directory
if ($ct_rows == 0) {
$acum .= "
<TR ALIGN=CENTER><TD COLSPAN=3>
<TABLE BORDER=1 WIDTH=100% BGCOLOR=WHITE>
<TR>
<TD ALIGN=CENTER><BR><I>no files found</I><BR><BR></TD>
</TR>
</TABLE>
</TD>
</TR>";
}
return "
<!-- Files list -->
<TABLE CELLPADDING=3 CELLSPACING=0 WIDTH=100% BORDER=0>
<!-- Headers -->
<TR BGCOLOR=#606060>
<TD WIDTH=1% ALIGN=CENTER>
<A HREF=# onclick=\"
window.select_all();
return false;\"
><FONT COLOR=WHITE>+</FONT> </A>
</TD>
<TD WIDTH=80%>
<FONT COLOR=WHITE><B>filename</B></FONT>
</TD>
<TD WIDTH=15% ALIGN=CENTER NOWRAP>
<FONT COLOR=WHITE><B>last modified</B></FONT>
</TD>
<TD WIDTH=4% ALIGN=CENTER>
<FONT COLOR=WHITE><B>size</B></FONT>
</TD>
</TR>
<! -- Files -->
$acum
</TD></TR></TABLE>";
}
sub html_top {
return "
<TABLE WIDTH=100% CELLPADDING=0 CELLSPAING=0>
<TR>
<TD>
<FONT SIZE=+2 COLOR=#3a3a3a>
<B>".r->hostname." - file manager</B></FONT>
</TD>
<TD ALIGN=RIGHT VALIGN=TOP>
<A HREF=# onclick=\"
window.display_help();
return false;\"
><FONT COLOR=#3a3a3a>help</FONT></A>
</TD>
</TR>
</TABLE>
";
}
sub html_bottom {
return "
<TABLE WIDTH=100% CELLPADDING=0 CELLSPAING=0><TR>
<TD ALIGN=RIGHT VALIGN=TOP>
<A HREF=http://www.cpan.org/modules/by-module/Apache/PMC
TARGET=CPAN
><FONT SIZE=-1 COLOR=BLACK>Apache2-FileManager-$VERSION</FONT></A>
</TD>
</TR>
</TABLE>";
}
##############################################################################
# -------------- Utility Methods ------------------------------------------- #
##############################################################################
sub execute_cmds {
my $o = shift;
my $cmd = r->param('FILEMANAGER_cmd');
my $arg = r->param('FILEMANAGER_arg');
my $method = "cmd_$cmd";
if ($o->can($method)) {
$o->$method($arg);
}
}
sub get_selected_files {
my @sel_files = r->param('FILEMANAGER_sel_files');
return \@sel_files;
}
sub filename_esc {
#escape spaces in filename
my $o = shift;
my $f = shift;
$f =~ s/\ /\\\ /g;
return $f;
}
sub formated_date {
my $o = shift;
my $date = shift || time;
return strftime "%D %l:%M %P", localtime($date);
}
sub get_clip_board {
my $o = shift;
#get copy and cut file arrays
my $buffer_type = "";
my $buffer_filenames = [];
if (defined(r->headers_in->{'Cookie'})) {
my $cookie_name = uc(r->hostname());
$cookie_name =~ s/[^A-Z]//g;
$cookie_name .= "_FM";
my %cookies = CGI::Cookie->parse(r->headers_in->{'Cookie'});
if (exists $cookies{$cookie_name}) {
my $data = $cookies{$cookie_name}->value;
my @ar = split /\|/, $data;
#is there something in buffer
if ($#ar > 0) {
$buffer_type = pop @ar;
$buffer_filenames = \@ar;
}
}
}
return ($buffer_type, $buffer_filenames);
}
###############################################################################
# -- Commands (called via form input from method execute_cmds or manually) -- #
###############################################################################
sub cmd_savefiledata {
my $o = shift;
my $base = r->param('FILEMANAGER_editfile');
$base =~ /([^\/]+)$/;
my $filename = $1;
remove $filename;
my $fh = IO::File->new("> ".$filename);
print $fh scalar(r->param('FILEMANAGER_filedata'));
$$o{MESSAGE} = "file saved";
$$o{view} = "pre_editfile";
return undef;
( run in 1.175 second using v1.01-cache-2.11-cpan-39bf76dae61 )