📄 proxy_ftp.c
字号:
/* Copyright 1999-2005 The Apache Software Foundation or its licensors, as * applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* FTP routines for Apache proxy */#include "mod_proxy.h"#if APR_HAVE_TIME_H#include <time.h>#endif#define AUTODETECT_PWD/* Automatic timestamping (Last-Modified header) based on MDTM is used if: * 1) the FTP server supports the MDTM command and * 2) HAVE_TIMEGM (preferred) or HAVE_GMTOFF is available at compile time */#define USE_MDTMmodule AP_MODULE_DECLARE_DATA proxy_ftp_module;int ap_proxy_ftp_canon(request_rec *r, char *url);int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, char *url, const char *proxyhost, apr_port_t proxyport);apr_status_t ap_proxy_send_dir_filter(ap_filter_t * f, apr_bucket_brigade *bb);static intproxy_ftp_command(const char *cmd, request_rec *r, conn_rec *ftp_ctrl, apr_bucket_brigade *bb, char **pmessage);static int ftp_set_TYPE(char xfer_type, request_rec *r, conn_rec *ftp_ctrl, apr_bucket_brigade *bb, char **pmessage);/*huanglin-20060303-add-begin*/#define FTP_MAKE_FOLDER 1#define FTP_DELETE_FILE 2#define FTP_RENAME_FILE 3#define FTP_UPLOAD_FILE 4/*huanglin-20060303-add-end*//*huanglin-20060301-add-begin*/void ap_proxy_create_ftp_html_style(char *style){ if(style==NULL) return; sprintf(style+strlen(style)," <STYLE type=text/css>\n"); sprintf(style+strlen(style)," A:link { COLOR: #666633; TEXT-DECORATION: none}\n"); sprintf(style+strlen(style)," A:visited { COLOR: #666633; TEXT-DECORATION: none}\n"); sprintf(style+strlen(style)," A:active { COLOR: #666633; TEXT-DECORATION: none}\n"); sprintf(style+strlen(style)," A:hover { COLOR: #0000b7; TEXT-DECORATION: none}\n"); sprintf(style+strlen(style)," TD { FONT-SIZE: 10pt; COLOR: black}\n"); sprintf(style+strlen(style)," TH { FONT-SIZE: 12pt; COLOR: white}\n"); sprintf(style+strlen(style)," FONT { FONT-SIZE: 9pt}\n"); sprintf(style+strlen(style)," .chinese_text13 { FONT-SIZE: 9pt; FILTER: Blur(Add=0, Direction=0, Strength=0); FONT-FAMILY: Verdana,宋体}\n"); sprintf(style+strlen(style)," </STYLE>\n"); return;}void ap_proxy_create_ftp_html_script(char *script){ if(script==NULL) return; /*start*/ sprintf(script+strlen(script)," <script language=\"javascript\">\n"); /*show guage object*/ sprintf(script+strlen(script)," function showGuageObject()\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var ns = (document.layers)? true:false;\n"); sprintf(script+strlen(script)," var ie = (document.all)? true:false;\n"); sprintf(script+strlen(script)," if(ns)\n"); sprintf(script+strlen(script)," document.blockDiv.visibility = \"show\";\n"); sprintf(script+strlen(script)," else if(ie)\n"); sprintf(script+strlen(script)," blockDiv.style.visibility = \"visible\";\n"); sprintf(script+strlen(script)," }\n"); /*checkItem*/ sprintf(script+strlen(script)," function checkItem(e,allName)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var all = document.getElementsByName(allName)[0];\n"); sprintf(script+strlen(script)," if(!e.checked)\n"); sprintf(script+strlen(script)," all.checked = false;\n"); sprintf(script+strlen(script)," else\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var aa = document.getElementsByName(e.name);\n"); sprintf(script+strlen(script)," for (var i=0; i<aa.length; i++)\n"); sprintf(script+strlen(script)," if(!aa[i].checked)\n"); sprintf(script+strlen(script)," return;\n"); sprintf(script+strlen(script)," all.checked = true;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," }\n"); /*checkAll*/ sprintf(script+strlen(script)," function checkAll(e,itemName)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var aa = document.getElementsByName(itemName);\n"); sprintf(script+strlen(script)," for (var i=0; i<aa.length; i++)\n"); sprintf(script+strlen(script)," aa[i].checked = e.checked;\n"); sprintf(script+strlen(script)," }\n"); /*getStrlen*/ sprintf(script+strlen(script)," function getStrlen(str)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var length=0;\n"); sprintf(script+strlen(script)," for(var i=0;i<str.length;i++)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," if(str.charCodeAt(i)>255)\n"); sprintf(script+strlen(script)," length+=2;\n"); sprintf(script+strlen(script)," else\n"); sprintf(script+strlen(script)," length++;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," return length;\n"); sprintf(script+strlen(script)," }\n"); /*check user input file name*/ sprintf(script+strlen(script)," function inputNameCheck(name)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var compare=\":*?\\\"<>|/\\\\\";\n"); sprintf(script+strlen(script)," if(!name)\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," for(var i=0;i<name.length;i++)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," if(compare.indexOf(name.charAt(i))!=-1)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"输入的名称不合法,不能包含下列字符:*?\\\"<>|/\\\\\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if((name.length==1&&name==\".\")||(name.length==2&&name==\"..\"))\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"输入的名称不合法,不能命名为.或..\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," return true;\n"); sprintf(script+strlen(script)," }\n"); /*makefolder*/ sprintf(script+strlen(script)," function makefolder()\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var name;\n"); sprintf(script+strlen(script)," var len;\n"); sprintf(script+strlen(script)," if(renameform.uploadstate.value==1)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"正在处理上传文件,请等待...\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," name=prompt(\"请输入要建立的文件夹名\",\"新建文件夹\");\n"); sprintf(script+strlen(script)," if(name)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," len=getStrlen(name);\n"); sprintf(script+strlen(script)," if(len<=0)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"请输入要建立的文件夹名!\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(len>32)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"文件夹名长度越界,最大长度为32个字符!\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(inputNameCheck(name)==false)\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," buildform.foldername.value=name;\n"); sprintf(script+strlen(script)," return true;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," else\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); /*renamefile*/ sprintf(script+strlen(script)," function renamefile(hiddenName,itemName,index)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var name;\n"); sprintf(script+strlen(script)," var len;\n"); sprintf(script+strlen(script)," var type;\n"); sprintf(script+strlen(script)," var aa = document.getElementsByName(itemName)[index];\n"); sprintf(script+strlen(script)," var bb = document.getElementsByName(hiddenName)[index];\n"); sprintf(script+strlen(script)," if(renameform.uploadstate.value==1)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"正在处理上传文件,请等待...\");\n"); sprintf(script+strlen(script)," return;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(bb.value==0)\n"); sprintf(script+strlen(script)," type=\"文件夹名\";\n"); sprintf(script+strlen(script)," else\n"); sprintf(script+strlen(script)," type=\"文件名\";\n"); sprintf(script+strlen(script)," name=prompt(\"请输入重命名后的\"+type,\"新\"+type);\n"); sprintf(script+strlen(script)," if(name)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," len=getStrlen(name);\n"); sprintf(script+strlen(script)," if(len<=0)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"请输入要重命名的\"+tyep+\"!\");\n"); sprintf(script+strlen(script)," return;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(len>32)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(type+\"长度越界,最大长度为32个字符!\");\n"); sprintf(script+strlen(script)," return;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(inputNameCheck(name)==false)\n"); sprintf(script+strlen(script)," return;\n"); sprintf(script+strlen(script)," renameform.oldname.value=aa.value;\n"); sprintf(script+strlen(script)," renameform.newname.value=name;\n"); sprintf(script+strlen(script)," renameform.submit();\n"); sprintf(script+strlen(script)," return;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," else\n"); sprintf(script+strlen(script)," return;\n"); sprintf(script+strlen(script)," }\n"); /*deletefile*/ sprintf(script+strlen(script)," function deletefile(hiddenName,itemName)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var value;\n"); sprintf(script+strlen(script)," var num=0;\n"); sprintf(script+strlen(script)," var len=0;\n"); sprintf(script+strlen(script)," var aa = document.getElementsByName(itemName);\n"); sprintf(script+strlen(script)," var bb = document.getElementsByName(hiddenName);\n"); sprintf(script+strlen(script)," if(renameform.uploadstate.value==1)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"正在处理上传文件,请等待...\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," for (var i=0; i<aa.length; i++)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," if(aa[i].checked==true)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," num++;\n"); sprintf(script+strlen(script)," len=getStrlen(aa[i].value);\n"); sprintf(script+strlen(script)," if(len<=0||len>255)\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," if(num==1)\n"); sprintf(script+strlen(script)," value=bb[i].value+aa[i].value+\"\\r\\n\";\n"); sprintf(script+strlen(script)," else\n"); sprintf(script+strlen(script)," value+=bb[i].value+aa[i].value+\"\\r\\n\";\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(num<=0)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"请选择你要删除的文件!\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(confirm(\"确定删除所选内容吗?\")!=true)\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," deleteform.deletename.value=value;\n"); sprintf(script+strlen(script)," return true;\n"); sprintf(script+strlen(script)," }\n"); /*uploadfile*/ sprintf(script+strlen(script)," function uploadfile()\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," var len=getStrlen(uploadform.uploadfilename.value);\n"); sprintf(script+strlen(script)," if(renameform.uploadstate.value==1)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"正在处理上传文件,请等待...\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," if(len<=0)\n"); sprintf(script+strlen(script)," {\n"); sprintf(script+strlen(script)," alert(\"请选择要上传的文件!\");\n"); sprintf(script+strlen(script)," return false;\n"); sprintf(script+strlen(script)," }\n"); sprintf(script+strlen(script)," renameform.uploadstate.value=1;\n"); sprintf(script+strlen(script)," showGuageObject();\n"); sprintf(script+strlen(script)," return true;\n"); sprintf(script+strlen(script)," }\n"); /*end*/ sprintf(script+strlen(script)," </script>\n"); return;}void ap_proxy_create_ftp_folder_table_head(char *head){ if(head==NULL) return; sprintf(head+strlen(head)," <table width=\"100%\" align=\"center\" border=\"1\" cellpadding=\"2\" cellspacing=\"0\" bordercolor=#EFEFEF>\n"); sprintf(head+strlen(head)," <COL width=\"20\">\n"); sprintf(head+strlen(head)," <COL align=\"left\" width=\"35%\">\n"); sprintf(head+strlen(head)," <COL align=\"right\">\n"); sprintf(head+strlen(head)," <COL align=\"right\">\n"); sprintf(head+strlen(head)," <COL align=\"right\">\n"); sprintf(head+strlen(head)," <COL align=\"center\">\n"); sprintf(head+strlen(head)," <COL align=\"center\">\n"); sprintf(head+strlen(head)," <tr bgcolor=#009933>\n"); sprintf(head+strlen(head)," <th></th><th> 名称</th><th align=\"center\">操作</th><th align=\"center\">大小</th><th align=\"center\">类型</th><th>权限</th><th>修改时间</th>\n"); sprintf(head+strlen(head)," </tr>\n"); return;}/*type kind0--folder1--text2--exe3--pdf4--doc5--ppt6--execl7--media8--image9--zip10--unknown*/void ap_proxy_create_ftp_folder_table_body(request_rec *r,char *name,int type,char *size,char *time,char *purview,int file_index,char *buf){ apr_pool_t *p=NULL; char *download_msg="下载该文件"; char *folder_msg="进入该目录"; char *txt_msg="下载或打开该文件"; char *rename_msg="重命名该文件"; char img_path[50]; char title_msg[50]; if(!r||!name||!size||!time||!purview||!buf) return; p = r->pool; memset(img_path,0,sizeof(img_path)); memset(title_msg,0,sizeof(title_msg)); switch(type) { case 0: memcpy(img_path,"/sslVpnImages/ftp/folder.gif",strlen("/sslVpnImages/ftp/folder.gif")); memcpy(title_msg,folder_msg,strlen(folder_msg)); break; case 1: memcpy(img_path,"/sslVpnImages/ftp/text.gif",strlen("/sslVpnImages/ftp/text.gif")); memcpy(title_msg,txt_msg,strlen(txt_msg)); break; case 2: memcpy(img_path,"/sslVpnImages/ftp/exe.gif",strlen("/sslVpnImages/ftp/exe.gif")); memcpy(title_msg,download_msg,strlen(download_msg)); break; case 3: memcpy(img_path,"/sslVpnImages/ftp/pdf.gif",strlen("/sslVpnImages/ftp/pdf.gif")); memcpy(title_msg,txt_msg,strlen(txt_msg)); break; case 4: memcpy(img_path,"/sslVpnImages/ftp/msword.gif",strlen("/sslVpnImages/ftp/msword.gif")); memcpy(title_msg,txt_msg,strlen(txt_msg)); break; case 5: memcpy(img_path,"/sslVpnImages/ftp/msppt.gif",strlen("/sslVpnImages/ftp/msppt.gif")); memcpy(title_msg,download_msg,strlen(download_msg)); break; case 6: memcpy(img_path,"/sslVpnImages/ftp/msexcel.gif",strlen("/sslVpnImages/ftp/msexcel.gif")); memcpy(title_msg,download_msg,strlen(download_msg)); break; case 7: memcpy(img_path,"/sslVpnImages/ftp/media.gif",strlen("/sslVpnImages/ftp/media.gif")); memcpy(title_msg,download_msg,strlen(download_msg)); break; case 8: memcpy(img_path,"/sslVpnImages/ftp/image.gif",strlen("/sslVpnImages/ftp/image.gif")); memcpy(title_msg,download_msg,strlen(download_msg)); break; case 9: memcpy(img_path,"/sslVpnImages/ftp/zip.gif",strlen("/sslVpnImages/ftp/zip.gif")); memcpy(title_msg,download_msg,strlen(download_msg)); break; default: memcpy(img_path,"/sslVpnImages/ftp/unknown.gif",strlen("/sslVpnImages/ftp/unknown.gif"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -