CFtpd.cpp
上传用户:shengde
上传日期:2007-02-26
资源大小:117k
文件大小:6k
源码类别:

Ftp服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "CFtpd.h"
  3. //#include "Iphlpapi.h"
  4. #define CRLF "rn"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. SOCKADDR_IN lpsockftpd; 
  11. UINT thAcceptCmd( LPVOID pParam )
  12. {
  13. CFtpd* pFtpd = (CFtpd*)pParam;
  14. CFtpdPi* ftpdbindsock = pFtpd->ftpdbindsock;
  15. try
  16. {
  17. pFtpd->absCrit.Lock();
  18. char tmp[32] = "";
  19. wsprintf(tmp,"%d.%d.%d.%d",lpsockftpd.sin_addr.S_un.S_un_b.s_b1,lpsockftpd.sin_addr.S_un.S_un_b.s_b2,lpsockftpd.sin_addr.S_un.S_un_b.s_b3,lpsockftpd.sin_addr.S_un.S_un_b.s_b4);
  20. ftpdbindsock->b_auto_choose_ip = pFtpd->b_auto_choose_ip;
  21. ftpdbindsock->b_switch_pasv_ip = pFtpd->b_switch_pasv_ip;
  22. ftpdbindsock->b_ipchk_pasv = pFtpd->b_ipchk_pasv;
  23. ftpdbindsock->m_specify_data_port = pFtpd->m_specify_data_port;
  24. ftpdbindsock->m_port_from = pFtpd->m_port_from;
  25. ftpdbindsock->m_port_from_preset = pFtpd->m_port_from;
  26. ftpdbindsock->m_port_to = pFtpd->m_port_to;
  27. ftpdbindsock->bUSER=FALSE;
  28. ftpdbindsock->bPASS=FALSE;
  29. ftpdbindsock->bconnected = TRUE;
  30. ftpdbindsock->decided = FALSE;
  31. strcpy(ftpdbindsock->userfile,pFtpd->userfile);
  32. strcpy(ftpdbindsock->ipfile,pFtpd->ipfile);
  33. strcpy(ftpdbindsock->vRealRoot,pFtpd->m_root_dir);
  34. strcpy(ftpdbindsock->client_ip,tmp);
  35. ftpdbindsock->pFtpd = (LPVOID)pFtpd;
  36. pFtpd->AddClient(ftpdbindsock);
  37. pFtpd->absCrit.Unlock();
  38. bool allow = FALSE;
  39. if(!FileExists(pFtpd->ipfile) || pFtpd->b_ipchk == FALSE)
  40. allow = TRUE;
  41. else
  42. {
  43. POSITION pos;
  44. CStringList CSLIpList;
  45. FileToCsl(pFtpd->ipfile,&CSLIpList);
  46. CString CSIP = tmp;
  47. CString Citem;
  48. for( pos = CSLIpList.GetHeadPosition(); pos != NULL; )   
  49. {
  50. Citem = CSLIpList.GetNext(pos);
  51. if(CSIP.Find((LPCSTR)Citem)!=-1)
  52. allow = TRUE;
  53. if(allow == TRUE)
  54. break;
  55. }
  56. }
  57. if(allow==TRUE)
  58. {
  59. int i = 0;
  60. unsigned long IP=-1;
  61. for (i=0; IP!=0;i++) 
  62. {
  63. IP=pFtpd->GetLocalNumericIP(i);
  64. if (IP !=0) 
  65. {
  66. wsprintf(tmp,"%d.%d.%d.%d",(IP&0xFF),((IP>>8 ) & 0xFF),((IP>>16) & 0xFF),((IP>>24) & 0xFF));
  67. ftpdbindsock->ipList.AddTail(tmp);
  68. }
  69. }
  70. wsprintf(pFtpd->buf,"220 %s FtpD for %s%s",(LPCSTR)pFtpd->m_servername,"free",CRLF);
  71. ftpdbindsock->Send(pFtpd->buf,strlen(pFtpd->buf),0);
  72. }else
  73. {
  74. wsprintf(pFtpd->buf,"no one is allowed to login from your ip addressnr");
  75. ftpdbindsock->Send(pFtpd->buf,sizeof(pFtpd->buf),0);
  76. wsprintf(pFtpd->buf,"unsuccessful login attemp from %s (ip not allowed)",tmp);
  77. ftpdbindsock->Close();
  78. }
  79. }
  80. catch(...)
  81. {
  82. pFtpd->absCrit.Unlock();
  83. }
  84. return 1;
  85. }
  86. CFtpd::CFtpd()
  87. {
  88. AfxSocketInit(NULL);
  89. b_speed_limit_in = false;
  90. b_speed_limit_out = false;
  91. b_ipchk = false;
  92. b_ipchk_pasv = false;
  93. b_switch_pasv_ip = false;
  94. b_auto_choose_ip = true;
  95. // m_kbs = 150;
  96. m_specify_data_port = false;
  97. m_port_from = 32000;
  98. m_port_to = 65536;
  99. m_servername = "Ftp Station(tm)";
  100. sl = sizeof(SOCKADDR_IN);
  101. GetCurrentDirectory(256,m_root_dir);
  102. }
  103. CFtpd::~CFtpd()
  104. {
  105. CFtpdPi* Fitem;
  106. for(pos = ClientList.GetHeadPosition(); pos != NULL; )    
  107. {
  108. Fitem = ClientList.GetNext( pos );
  109. delete Fitem;
  110. }
  111. Close();
  112. }
  113. // Do not edit the following lines, which are needed by ClassWizard.
  114. #if 0
  115. BEGIN_MESSAGE_MAP(CFtpd, CSocket)
  116. //{{AFX_MSG_MAP(CFtpd)
  117. //}}AFX_MSG_MAP
  118. END_MESSAGE_MAP()
  119. #endif // 0
  120. void CFtpd::OnAccept(int nErrorCode) 
  121. {
  122. try
  123. {
  124. pos = NULL;
  125. allow = FALSE;
  126. ftpdbindsock = new CFtpdPi();
  127. Accept(*ftpdbindsock,(SOCKADDR*)&lpsockftpd,&sl);
  128. AfxBeginThread(&thAcceptCmd,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
  129. }
  130. catch (...)
  131. {
  132. }
  133. CSocket::OnAccept(nErrorCode);
  134. }
  135. void CFtpd::OnClose(int nErrorCode) 
  136. {
  137. CSocket::OnClose(nErrorCode);
  138. }
  139. DWORD CFtpd::GetLocalNumericIP(int Index)
  140. {
  141. if (0==gethostname (HostName,100))
  142. {
  143. if (!(lpHostEnt = gethostbyname(HostName))) 
  144. {
  145. return(-1);
  146. } else 
  147. {
  148. lpDW=((DWORD*)(*lpHostEnt).h_addr_list);
  149. lpDW+=Index;
  150. lpDW2=(DWORD *) *lpDW;
  151. if (lpDW2==0) 
  152. return 0;
  153. else 
  154. return (*lpDW2);
  155. }
  156. } else 
  157. return (-1);
  158. }
  159. void CFtpd::AddClient(CFtpdPi *pBind)
  160. {
  161. try
  162. {
  163. ClientList.AddTail(pBind);
  164. return;
  165. }
  166. catch(...)
  167. {
  168. return;
  169. }
  170. }
  171. void CFtpd::RemoveClient(CFtpdPi *pBind)
  172. {
  173. try
  174. {
  175. POSITION pos = NULL;
  176. if( ( pos = ClientList.Find(pBind, NULL ) )!= NULL )    
  177. ClientList.RemoveAt(pos);
  178. if(pBind != NULL)
  179. delete pBind;
  180. return;
  181. }
  182. catch(...)
  183. {
  184. return;
  185. }
  186. }
  187. bool FileExists(char *fname)
  188. {
  189. WIN32_FIND_DATA MyFoundFile;
  190. HANDLE Hfound=FindFirstFile(fname,&MyFoundFile);
  191. if(Hfound == INVALID_HANDLE_VALUE)
  192. {
  193. FindClose(Hfound);
  194. return false;
  195. }else
  196. {
  197. if(MyFoundFile.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
  198. {
  199. FindClose(Hfound);
  200. return false;
  201. }else
  202. FindClose(Hfound);
  203. return true;
  204. }
  205. }
  206. void FileToCsl(char* finame,CStringList* CSL)
  207. {
  208. if(FileExists(finame))
  209. {
  210. char buf[512] = "";
  211. CStdioFile ifs((LPCTSTR) finame , CFile::modeRead);
  212. if(ifs.ReadString(buf,512) != NULL)
  213. {
  214. do
  215. {
  216. int l = strlen(buf) - 1;
  217. if(l >= 0)
  218. {
  219. if(*(buf+l) == 'n')
  220. *(buf+l) = NULL;
  221. }
  222. CString newitm = buf;
  223. if(newitm=="");
  224. else
  225. {
  226. POSITION pos1,pos2;
  227. if( ( pos1 = CSL->Find(newitm, NULL ) )!= NULL );    
  228. else if( ( pos1 = CSL->GetHeadPosition() ) != NULL )    
  229. pos2 = CSL->InsertAfter( pos1, newitm );  
  230. else
  231. CSL->AddHead(newitm);
  232. }
  233. }while(ifs.ReadString(buf,512) != NULL);
  234. }
  235. ifs.Close();
  236. }
  237. }
  238. bool GetItemFromCString(int index,CString* CSTARGET,CString* CSITEM,char sep)
  239. {
  240. int length = CSTARGET->GetLength();
  241. int poz[256];
  242. int ind = 0;
  243. for(int i=0 ; i<length ; i++)
  244. {
  245. if(*((LPCSTR)*CSTARGET+i) == sep || ( (i==length-1)&&(ind==0) ))
  246. {
  247. if((i==length-1)&&(ind==0))
  248. poz[ind] = i+1;
  249. else
  250. poz[ind] = i;
  251. ind ++;
  252. }
  253. }
  254. if(index == 0)
  255. {
  256. *CSITEM = CSTARGET->Mid(0,poz[0]);
  257. return TRUE;
  258. }else if(index > 0 && index <ind)
  259. {
  260. *CSITEM = CSTARGET->Mid(poz[index-1]+1,poz[index]-poz[index-1]-1);
  261. return TRUE;
  262. }else if(index == ind)
  263. {
  264. *CSITEM = CSTARGET->Mid(poz[index-1]+1,length-poz[index-1]-1);
  265. return TRUE;
  266. }
  267. return FALSE;
  268. }