📄 proxy_ftp.c
字号:
memcpy(title_msg,download_msg,strlen(download_msg)); } sprintf(buf+strlen(buf)," <tr>\n"); sprintf(buf+strlen(buf)," <td nowrap><input type=\"checkbox\" name=\"mid\" value=\"%s\" onclick=\"checkItem(this, 'midAll')\"></td>\n",name); if(type==0) { sprintf(buf+strlen(buf)," <td><A href=\"%s/\" title=\"%s\"><img src=\"%s\" width=\"16\" height=\"16\" border=\"0\" align=\"absmiddle\"> \%s</A></td>\n",ap_escape_uri(p, name),title_msg,img_path,name); sprintf(buf+strlen(buf)," <td><A href=\"javascript:renamefile('hidetype','mid',%d)\"><image src=\"%s\" width=\"16\" height=\"16\" border=\"0\" align=\"absmiddle\" title=\"%s\"></A></td>\n",file_index,"/sslVpnImages/ftp/props.gif",rename_msg); } else { sprintf(buf+strlen(buf)," <td><A href=\"%s\" title=\"%s\"><img src=\"%s\" width=\"16\" height=\"16\" border=\"0\" align=\"absmiddle\"> \%s</A></td>\n",ap_escape_uri(p, name),title_msg,img_path,name); sprintf(buf+strlen(buf),"<td><A href=\"%s\"><img src=\"%s\" width=\"16\" height=\"16\" border=\"0\" align=\"absmiddle\" title=\"%s\"></A>\n",ap_escape_uri(p, name),"/sslVpnImages/ftp/download.gif",title_msg); sprintf(buf+strlen(buf)," <A href=\"javascript:renamefile('hidetype','mid',%d)\"><image src=\"%s\" width=\"16\" height=\"16\" border=\"0\" align=\"absmiddle\" title=\"%s\"></A></td>\n",file_index,"/sslVpnImages/ftp/props.gif",rename_msg); } sprintf(buf+strlen(buf)," <td>%s 字节</td>\n",size); if(type==0) sprintf(buf+strlen(buf)," <td><input name=\"hidetype\" type=\"hidden\" value=0>目录文件</td>\n"); else sprintf(buf+strlen(buf)," <td><input name=\"hidetype\" type=\"hidden\" value=1>文件</td>\n"); sprintf(buf+strlen(buf)," <td>%s</td>\n",purview); sprintf(buf+strlen(buf)," <td>%s</td>\n",time); sprintf(buf+strlen(buf)," </tr>\n"); return;}void ap_proxy_create_ftp_folder_table_tail(char *tail,int file_num,int folder_num){ if(!tail) return; sprintf(tail+strlen(tail)," <tr>\n"); sprintf(tail+strlen(tail)," <td nowrap><input type=\"checkbox\" name=\"midAll\" value=\"\" onclick=\"checkAll(this,'mid')\"></td>\n"); sprintf(tail+strlen(tail)," <td><LABEL for=\"chkAll\"><font color=\"Maroon\">全选/不选</font></LABEL></td>\n"); sprintf(tail+strlen(tail)," <td colspan=\"5\" align=\"right\">共%d个文件夹,%d个文件</td>\n",folder_num,file_num); sprintf(tail+strlen(tail)," </tr>\n"); sprintf(tail+strlen(tail)," </table>\n"); sprintf(tail+strlen(tail)," <table width=\"100%\" align=\"center\" border=0 cellpadding=2 cellspacing=0>\n"); sprintf(tail+strlen(tail)," <tr>\n"); sprintf(tail+strlen(tail)," <td width=\"20\"></td>\n"); sprintf(tail+strlen(tail)," <td width=\"108\" valign=\"top\">\n"); sprintf(tail+strlen(tail)," <form name=\"buildform\" enctype=\"multipart/form-data\" action=\".\" method=\"POST\" onsubmit=\"return makefolder()\">\n"); sprintf(tail+strlen(tail)," <input name=\"foldername\" value=\"\" type=\"hidden\">\n"); sprintf(tail+strlen(tail)," <input name=\"submit\" type=\"submit\" value=\"新建文件夹\">\n"); sprintf(tail+strlen(tail)," </form>\n"); sprintf(tail+strlen(tail)," </td>\n"); sprintf(tail+strlen(tail)," <td width=\"205\" valign=\"top\">\n"); sprintf(tail+strlen(tail)," <form name=\"deleteform\" enctype=\"multipart/form-data\" action=\".\" method=\"POST\" onsubmit=\"return deletefile('hidetype','mid')\">\n"); sprintf(tail+strlen(tail)," <input name=\"deletename\" value=\"\" type=\"hidden\">\n"); sprintf(tail+strlen(tail)," <input name=\"submit\" type=\"submit\" value=\"删除所选文件\">\n"); sprintf(tail+strlen(tail)," </form>\n"); sprintf(tail+strlen(tail)," </td>\n"); sprintf(tail+strlen(tail)," <td width=\"400\" valign=\"top\">\n"); sprintf(tail+strlen(tail)," <form name=\"uploadform\" enctype=\"multipart/form-data\" action=\".\" method=\"POST\" onsubmit=\"return uploadfile()\">\n"); sprintf(tail+strlen(tail)," <img src=\"/sslVpnImages/ftp/upload.gif\" width=\"16\" height=\"16\" border=\"0\" align=\"absmiddle\">上传文件:\n"); sprintf(tail+strlen(tail)," <input name=\"uploadfilename\" value=\"\" type=\"file\">\n"); sprintf(tail+strlen(tail)," <input name=\"submit\" type=\"submit\" value=\"上传\">\n"); sprintf(tail+strlen(tail)," </form>\n"); sprintf(tail+strlen(tail)," </td>\n"); /*刷新按钮*/ sprintf(tail+strlen(tail)," <td valign=\"top\">\n"); sprintf(tail+strlen(tail)," <img src=\"/sslVpnImages/ftp/refresh.gif\" width=\"16\" height=\"16\" border=\"0\" align=\"absmiddle\">"); sprintf(tail+strlen(tail),"<input name=\"refresh\" type=\"button\" onclick=\"refresh()\" value=\"刷新列表\">\n"); sprintf(tail+strlen(tail)," </td>\n"); sprintf(tail+strlen(tail)," <td>\n"); sprintf(tail+strlen(tail)," <form name=\"renameform\" enctype=\"multipart/form-data\" action=\".\" method=\"POST\" onsubmit=\"return false\">\n"); sprintf(tail+strlen(tail)," <input name=\"oldname\" value=\"\" type=\"hidden\">\n"); sprintf(tail+strlen(tail)," <input name=\"newname\" value=\"\" type=\"hidden\">\n"); sprintf(tail+strlen(tail)," <input name=\"uploadstate\" value=0 type=\"hidden\">\n"); sprintf(tail+strlen(tail)," </form>\n"); sprintf(tail+strlen(tail)," </td>\n"); sprintf(tail+strlen(tail)," </tr>\n"); sprintf(tail+strlen(tail)," <tr>\n"); sprintf(tail+strlen(tail)," <td width=\"20\"></td>\n"); sprintf(tail+strlen(tail)," <td colspan=\"4\">\n"); sprintf(tail+strlen(tail)," <div id=\"blockDiv\" style=\"visibility:hidden;\">\n"); sprintf(tail+strlen(tail)," <table width=\"100%\">\n"); sprintf(tail+strlen(tail)," <tr>\n"); sprintf(tail+strlen(tail)," <td style=\"font-size:9pt\" align=\"left\" width=\"465\" valign=\"top\">文件正在上传处理中.请耐心等待...\n"); sprintf(tail+strlen(tail)," <marquee style=\"border:1px solid #000000\" direction=\"right\" width=\"250\" scrollamount=\"5\" scrolldelay=\"10\" bgcolor=\"white\">\n"); sprintf(tail+strlen(tail)," <table cellspacing=\"1\" cellpadding=\"0\">\n"); sprintf(tail+strlen(tail)," <tr height=8>\n"); sprintf(tail+strlen(tail)," <td bgcolor=#009933 width=8></td>\n"); sprintf(tail+strlen(tail)," <td></td>\n"); sprintf(tail+strlen(tail)," <td bgcolor=#009933 width=8></td>\n"); sprintf(tail+strlen(tail)," <td></td>\n"); sprintf(tail+strlen(tail)," <td bgcolor=#009933 width=8></td>\n"); sprintf(tail+strlen(tail)," <td></td>\n"); sprintf(tail+strlen(tail)," <td bgcolor=#009933 width=8></td>\n"); sprintf(tail+strlen(tail)," <td></td>\n"); sprintf(tail+strlen(tail)," </tr>\n"); sprintf(tail+strlen(tail)," </table>\n"); sprintf(tail+strlen(tail)," </marquee>\n"); sprintf(tail+strlen(tail)," </td>\n"); sprintf(tail+strlen(tail)," <td valign=\"top\">\n"); sprintf(tail+strlen(tail)," <input value=\"取消上传\" type=\"button\" onclick=\"location.href='.'\">\n"); sprintf(tail+strlen(tail)," </td>\n"); sprintf(tail+strlen(tail)," </tr>\n"); sprintf(tail+strlen(tail)," </table>\n"); sprintf(tail+strlen(tail)," </div>\n"); sprintf(tail+strlen(tail)," </td>\n"); sprintf(tail+strlen(tail)," </tr>\n"); sprintf(tail+strlen(tail)," </table>\n"); return;}int ap_proxy_build_ftp_epsv_data_sock(request_rec *r,proxy_server_conf *conf,apr_sockaddr_t *connect_addr,conn_rec *ftp_ctrl,apr_socket_t *ctrl_sock,apr_bucket_brigade * bb,apr_socket_t **data_sock){ int rc; apr_status_t rv; char *ftpmessage = NULL; apr_socket_t *sock = NULL; apr_sockaddr_t *data_addr; char *data_ip; apr_port_t data_port; apr_brigade_cleanup(bb); rc = proxy_ftp_command("EPSV" CRLF,r, ftp_ctrl, bb, &ftpmessage); if (rc == -1 || rc == 421) { return ap_proxyerror(r, HTTP_BAD_GATEWAY,"Error reading from remote server"); } if (rc != 229 && rc != 500 && rc != 501 && rc != 502) { return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); } else if (rc == 229) { char *pstr; char *tok_cntx; pstr = ftpmessage; pstr = apr_strtok(pstr, " ", &tok_cntx); /* separate result code */ if (pstr != NULL) { if (*(pstr + strlen(pstr) + 1) == '=') { pstr += strlen(pstr) + 2; } else { pstr = apr_strtok(NULL, "(", &tok_cntx); /* separate address & * port params */ if (pstr != NULL) pstr = apr_strtok(NULL, ")", &tok_cntx); } } if (pstr) { apr_sockaddr_t *epsv_addr; data_port = atoi(pstr + 3); ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy: FTP: EPSV contacting remote host on port %d", data_port); if ((rv = apr_socket_create(&sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FTP: error creating EPSV socket"); return HTTP_INTERNAL_SERVER_ERROR; }#if !defined (TPF) && !defined(BEOS) if (conf->recv_buffer_size > 0 && (rv = apr_socket_opt_set(sock, APR_SO_RCVBUF, conf->recv_buffer_size))) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FTP: apr_socket_opt_set(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); }#endif /* make the connection */ apr_socket_addr_get(&data_addr, APR_REMOTE, ctrl_sock); apr_sockaddr_ip_get(&data_ip, data_addr); apr_sockaddr_info_get(&epsv_addr, data_ip, connect_addr->family, data_port, 0, r->pool); rv = apr_connect(sock, epsv_addr); if (rv != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, "proxy: FTP: EPSV attempt to connect to %pI failed - Firewall/NAT?", epsv_addr); apr_socket_close(sock); return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool, "EPSV attempt to connect to %pI failed - firewall/NAT?", epsv_addr)); } else { *data_sock=sock; } } } return APR_SUCCESS;}int ap_proxy_build_ftp_pasv_data_sock(request_rec *r,proxy_server_conf *conf,apr_sockaddr_t *connect_addr,conn_rec *ftp_ctrl,apr_bucket_brigade * bb,apr_socket_t **data_sock){ int rc; apr_status_t rv; char *ftpmessage = NULL; apr_socket_t *sock = NULL; apr_pool_t *p = r->pool; rc = proxy_ftp_command("PASV" CRLF,r, ftp_ctrl, bb, &ftpmessage); if (rc == -1 || rc == 421) { return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote server"); } if (rc != 227 && rc != 502) { return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); } else if (rc == 227) { unsigned int h0, h1, h2, h3, p0, p1; char *pstr; char *tok_cntx; pstr = ftpmessage; pstr = apr_strtok(pstr, " ", &tok_cntx); /* separate result code */ if (pstr != NULL) { if (*(pstr + strlen(pstr) + 1) == '=') { pstr += strlen(pstr) + 2; } else { pstr = apr_strtok(NULL, "(", &tok_cntx); /* separate address & * port params */ if (pstr != NULL) pstr = apr_strtok(NULL, ")", &tok_cntx); } }/* FIXME: Only supports IPV4 - fix in RFC2428 */ if (pstr != NULL && (sscanf(pstr, "%d,%d,%d,%d,%d,%d", &h3, &h2, &h1, &h0, &p1, &p0) == 6)) { apr_sockaddr_t *pasv_addr; apr_port_t pasvport = (p1 << 8) + p0; ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy: FTP: PASV contacting host %d.%d.%d.%d:%d", h3, h2, h1, h0, pasvport); if ((rv = apr_socket_create(&sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: error creating PASV socket"); return HTTP_INTERNAL_SERVER_ERROR; }#if !defined (TPF) && !defined(BEOS) if (conf->recv_buffer_size > 0 && (rv = apr_socket_opt_set(sock, APR_SO_RCVBUF, conf->recv_buffer_size))) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FTP: apr_socket_opt_set(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); }#endif /* make the connection */ apr_sockaddr_info_get(&pasv_addr, apr_psprintf(p, "%d.%d.%d.%d", h3, h2, h1, h0), connect_addr->family, pasvport, 0, p); rv = apr_connect(sock, pasv_addr); if (rv != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, "proxy: FTP: PASV attempt to connect to %pI failed - Firewall/NAT?", pasv_addr); apr_socket_close(sock); return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool, "PASV attempt to connect to %pI failed - firewall/NAT?", pasv_addr)); } else { *data_sock=sock; } } } return APR_SUCCESS;}int ap_proxy_build_ftp_port_listen_sock(request_rec *r,apr_sockaddr_t *connect_addr,conn_rec *ftp_ctrl,apr_socket_t *ctrl_sock,apr_bucket_brigade * bb,apr_socket_t **listen_sock){ int rc; apr_status_t rv; char *ftpmessage = NULL; int one = 1; apr_pool_t *p = r->pool; char buffer[MAX_STRING_LEN]; apr_sockaddr_t *local_addr; apr_socket_t *local_sock; char *local_ip; apr_port_t local_port; unsigned int h0, h1, h2, h3, p0, p1; if ((rv = apr_socket_create(&local_sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FTP: error creating local socket"); return HTTP_INTERNAL_SERVER_ERROR; } apr_socket_addr_get(&local_addr, APR_LOCAL, ctrl_sock); apr_sockaddr_port_get(&local_port, local_addr); apr_sockaddr_ip_get(&local_ip, local_addr); if ((rv = apr_socket_opt_set(local_sock, APR_SO_REUSEADDR, one)) != APR_SUCCESS) {#ifndef _OSD_POSIX /* BS2000 has this option "always on" */ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FTP: error setting reuseaddr option"); apr_socket_close(local_sock); return HTTP_INTERNAL_SERVER_ERROR;#endif /* _OSD_POSIX */ } apr_sockaddr_info_get(&local_addr, local_ip, APR_UNSPEC, local_port, 0, r->pool); if ((rv = apr_bind(local_sock, local_addr)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FTP: error binding to ftp data socket %pI", local_addr); apr_socket_close(local_sock); return HTTP_INTERNAL_SERVER_ERROR; } /* only need a short queue */ if ((rv = apr_listen(local_sock, 2)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FTP: error listening to ftp data socket %pI", local_addr); apr_socket_close(local_sock); return HTTP_INTERNAL_SERVER_ERROR; }/* FIXME: Sent PORT here */ if (local_ip && (sscanf(local_ip, "%d.%d.%d.%d", &h3, &h2, &h1, &h0) == 4)) { p1 = (local_port >> 8); p0 = (local_port & 0xFF); apr_brigade_cleanup(bb); rc = proxy_ftp_command(apr_psprintf(p, "PORT %d,%d,%d,%d,%d,%d" CRLF, h3, h2, h1, h0, p1, p0), r, ftp_ctrl, bb, &ftpmessage); /* possible results: 200, 421, 500, 501, 502, 530 */ /* 200 Command okay. */ /* 421 Service not available, closing control connection. */ /* 500 Syntax error, command unrecognized. */ /* 501 Syntax error in parameters or arguments. */ /* 502 Command not implemented. */ /* 530 Not logged in. */ if (rc == -1 || rc == 421) { apr_socket_close(local_sock); return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote server"); } if (rc != 200) { apr_socket_close(local_sock); return ap_proxyerror(r, HTTP_BAD_GATEWAY, buffer); } *listen_sock=local_sock; } else {/* IPV6 FIXME: * The EPRT command replaces PORT where both IPV4 and IPV6 is supported. The first * number (1,2) indicates the protocol type. Examples: * EPRT |1|132.235.1.2|6275| * EPRT |2|1080::8:800:200C:417A|5282| */ apr_socket_close(local_sock); return ap_proxyerror(r, HTTP_NOT_IMPLEMENTED, "Connect to IPV6 ftp server using EPRT not supported. Enable EPSV."); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -