📄 proxy_ftp.c
字号:
if(!end||end<=start) return HTTP_NOT_IMPLEMENTED; len=end-2-start; if(len>255||len<=0) return HTTP_NOT_IMPLEMENTED; memcpy(oldname,start,len); start=end; /*find next CRLFCRLF*/ while(*start) { if(*start==13&&*(start+1)==10&&*(start+2)==13&&*(start+3)==10) break; start++; } start+=4; end=strstr(start,boundary); if(!end||end<=start) return HTTP_NOT_IMPLEMENTED; len=end-2-start; if(len>32||len<=0) return HTTP_NOT_IMPLEMENTED; memcpy(newname,start,len); return APR_SUCCESS;}int ap_proxy_get_ftp_upload_file_name(char *data,char *boundary,char *upload_file_name){ char *start=NULL; char *end=NULL; char *temp=NULL; int len=0; if(data==NULL||boundary==NULL||upload_file_name==NULL) return HTTP_INTERNAL_SERVER_ERROR; temp=data; temp=strstr(data,"filename=\""); if(!temp) return HTTP_NOT_IMPLEMENTED; temp+=strlen("filename=\""); end=temp; while(*end) { if(*end=='\"'&&*(end+1)==13&&*(end+2)==10) break; end++; } if(*end!='\"') return HTTP_NOT_IMPLEMENTED; start=end; while(*start&&start>temp&&*start!='\\') start--; start++; len=end-start; if(len<=0||len>255) return HTTP_NOT_IMPLEMENTED; memcpy(upload_file_name,start,len); return APR_SUCCESS;}int ap_proxy_get_ftp_upload_file_len(char *data, request_rec *r, int boundary_len,int *file_len,int *head_info_len){ const char *p=NULL; char *q=NULL; int content_len=0; int head_len=0; int len=0; int tail_len=0; p=apr_table_get(r->headers_in, "Content-Length"); if(!p) return HTTP_NOT_IMPLEMENTED; content_len=atoi(p); q=data; while(*q) { if(*q==13&&*(q+1)==10&&*(q+2)==13&&*(q+3)==10) break; q++; head_len++; } head_len+=4; tail_len=boundary_len+2; tail_len+=45; tail_len+=4; tail_len+=6; tail_len+=(boundary_len+4); tail_len+=2; len=content_len-head_len-tail_len; if(len<0) return HTTP_NOT_IMPLEMENTED; *file_len=len; *head_info_len=head_len; return APR_SUCCESS;}int ap_proxy_ftp_build_folder_handler(char *data,request_rec *r,char *boundary,conn_rec *ftp_ctrl,apr_bucket_brigade *bb){ int rc=0; char folder_name[33]; char *ftpmessage=NULL; memset(folder_name,0,sizeof(folder_name)); rc=ap_proxy_get_ftp_build_folder_request_info(data,boundary,folder_name); if(rc!=APR_SUCCESS) return rc; rc = proxy_ftp_command(apr_pstrcat(r->pool, "MKD ", folder_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc!=257) return HTTP_NOT_IMPLEMENTED; return APR_SUCCESS;}int ap_proxy_ftp_rename_file_handler(char *data,request_rec *r,char *boundary,conn_rec *ftp_ctrl,apr_bucket_brigade *bb){ int rc=0; char old_name[256]; char new_name[33]; char *ftpmessage=NULL; memset(old_name,0,sizeof(old_name)); memset(new_name,0,sizeof(new_name)); rc=ap_proxy_get_ftp_rename_request_info(data,boundary,old_name,new_name); if(rc!=APR_SUCCESS) return rc; rc = proxy_ftp_command(apr_pstrcat(r->pool, "RNFR ", old_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc!=350) return HTTP_NOT_IMPLEMENTED; rc = proxy_ftp_command(apr_pstrcat(r->pool, "RNTO ", new_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc!=250) return HTTP_NOT_IMPLEMENTED; return APR_SUCCESS;}int ap_proxy_ftp_delete_file_handler(request_rec *r,conn_rec *ftp_ctrl,apr_bucket_brigade *bb,char *file_name){ int rc=0; char *ftpmessage=NULL; rc = proxy_ftp_command(apr_pstrcat(r->pool, "DELE ", file_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc!=250) return HTTP_NOT_IMPLEMENTED; return APR_SUCCESS;}int ap_proxy_ftp_delete_folder_handler(request_rec *r,proxy_server_conf *conf,conn_rec *ftp_ctrl_conn,apr_sockaddr_t *ftp_ctrl_addr,apr_socket_t *ftp_ctrl_sock,apr_bucket_brigade * bb,char *folder_absolute_path,char *folder_name){ int rc; apr_status_t rv; apr_pool_t *p = r->pool; conn_rec *c = r->connection; char *ftpmessage = NULL; apr_socket_t *local_sock =NULL; apr_socket_t *data_sock = NULL; conn_rec *data_conn = NULL; apr_bucket *bucket; int eos_flag=FALSE; char file_list_buf[8192]; int file_list_buf_left_len=8192; int file_num=0; char *startbuf=NULL; char tempbuf[256]; int file_type=0; int file_name_len=0; char next_name[256]; char next_path[2000]; if(!r||!ftp_ctrl_conn||!ftp_ctrl_addr||!conf||!bb||!folder_absolute_path||!folder_name) return HTTP_INTERNAL_SERVER_ERROR; rc = proxy_ftp_command(apr_pstrcat(p, "CWD ",folder_name,CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc!=250) return HTTP_NOT_IMPLEMENTED; rc=ap_proxy_build_ftp_sock(r, conf, ftp_ctrl_addr, ftp_ctrl_conn, ftp_ctrl_sock, bb, &data_sock, &local_sock); apr_brigade_cleanup(bb); if(rc!=APR_SUCCESS) return rc; ftp_set_TYPE('A', r, ftp_ctrl_conn, bb, NULL); apr_brigade_cleanup(bb); rc = proxy_ftp_command("LIST -lg" CRLF,r, ftp_ctrl_conn, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc != 125 && rc != 150 && rc != 226 && rc != 250) { if(data_sock) { apr_socket_close(data_sock); data_sock=NULL; } else if(local_sock) { apr_socket_close(local_sock); local_sock=NULL; } return HTTP_NOT_IMPLEMENTED; } if(!data_sock&&local_sock) { rc=ap_proxy_build_ftp_port_data_sock(r, local_sock,&data_sock); if(rc!=APR_SUCCESS) { apr_socket_close(local_sock); local_sock=NULL; return rc; } apr_socket_close(local_sock); local_sock=NULL; } if(data_sock==NULL) return HTTP_INTERNAL_SERVER_ERROR; rc=ap_proxy_build_ftp_data_connection(r,data_sock,&data_conn); if(rc!=APR_SUCCESS) { apr_socket_close(data_sock); data_sock=NULL; return rc; } memset(file_list_buf,0,sizeof(file_list_buf)); memset(tempbuf,0,sizeof(tempbuf)); while (ap_get_brigade(data_conn->input_filters, bb, AP_MODE_READBYTES, APR_BLOCK_READ, conf->io_buffer_size) == APR_SUCCESS) { while(1) { int found=0; while (!found && !APR_BRIGADE_EMPTY(bb)) { char *pos, *response; apr_size_t len, max; apr_bucket *e; e = APR_BRIGADE_FIRST(bb); if (APR_BUCKET_IS_EOS(e)) { eos_flag = TRUE; break; } if (APR_SUCCESS != (rv = apr_bucket_read(e, (const char **)&response, &len, APR_BLOCK_READ))) return rv; pos = memchr(response, APR_ASCII_LF, len); if (pos != NULL) { if ((response + len) != (pos + 1)) { len = pos - response + 1; apr_bucket_split(e, pos - response + 1); } found = 1; } max = sizeof(tempbuf) - strlen(tempbuf) - 1; if (len > max) len = max; /* len+1 to leave space for the trailing nil char */ apr_cpystrn(tempbuf+strlen(tempbuf), response, len+1); APR_BUCKET_REMOVE(e); apr_bucket_destroy(e); } if(!found) break; if(eos_flag==TRUE) break; startbuf=file_list_buf+sizeof(file_list_buf)-file_list_buf_left_len; rc=ap_proxy_decode_directory_list_oneline_to_tlv(tempbuf,startbuf,&file_list_buf_left_len,&file_num); if(rc!=APR_SUCCESS) return rc; memset(tempbuf,0,sizeof(tempbuf)); } apr_brigade_cleanup(bb); if(eos_flag==TRUE) break; } proxy_ftp_command(NULL, r, ftp_ctrl_conn, bb, &ftpmessage); apr_brigade_cleanup(bb); startbuf=file_list_buf; while(file_num>0&&*startbuf) { file_type=0; file_name_len=0; memset(next_name,0,sizeof(next_name)); memset(next_path,0,sizeof(next_path)); file_type=(int)(*startbuf-'0'); startbuf++; file_name_len=(int)*startbuf; startbuf++; if(file_name_len>255) return HTTP_NOT_IMPLEMENTED; memcpy(next_name,startbuf,file_name_len); startbuf+=file_name_len; if(strlen(folder_absolute_path)+file_name_len>1998) return HTTP_NOT_IMPLEMENTED; sprintf(next_path,"%s/%s",folder_absolute_path,next_name); if(file_type==0) { rv=ap_proxy_ftp_delete_folder_handler(r, conf,ftp_ctrl_conn, ftp_ctrl_addr, ftp_ctrl_sock,bb, next_path, next_name); apr_brigade_cleanup(bb); if(rv!=APR_SUCCESS) return HTTP_NOT_IMPLEMENTED; } else { rc = proxy_ftp_command(apr_pstrcat(r->pool, "DELE ", next_name, CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc!=250) return HTTP_NOT_IMPLEMENTED; } file_num--; } rc = proxy_ftp_command(apr_pstrcat(p, "CDUP ",folder_name,CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage); apr_brigade_cleanup(bb); if(rc!=250) return HTTP_NOT_IMPLEMENTED; apr_brigade_cleanup(bb); rc=proxy_ftp_command(apr_pstrcat(r->pool, "RMD ", folder_absolute_path, CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage); if(rc!=250) return -1; return APR_SUCCESS;}int ap_proxy_ftp_delete_file_or_folder_handler(char *data,request_rec *r,char *boundary,proxy_server_conf * conf,conn_rec *ftp_ctrl_conn,apr_sockaddr_t * ftp_ctrl_addr,apr_socket_t * ftp_ctrl_sock,apr_bucket_brigade *bb){ const char *pwd=NULL; char delete_info[HUGE_STRING_LEN]; char file_name[256]; int file_name_len=0; int file_type=0; int rc; char *start=NULL; char *p=NULL; char folder_path[2000]; pwd = apr_table_get(r->notes, "Directory-PWD"); if(pwd==NULL) return HTTP_NOT_IMPLEMENTED; memset(delete_info,0,sizeof(delete_info)); rc=ap_proxy_get_ftp_delete_request_info(data,boundary,delete_info); if(rc!=APR_SUCCESS) return rc; start=delete_in
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -