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();'>\"+
              \"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"+
              \"<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>&nbsp;<B><FONT COLOR=#bcbcbc SIZE=+2>|</FONT>&nbsp;</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>&nbsp;</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 )