PageRenderTime 58ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/xbmc/lib/libFileZilla/source/New Folder/AsyncGssSocketLayer.cpp

https://github.com/migueld/plex
C++ | 1193 lines | 1021 code | 143 blank | 29 comment | 295 complexity | 03ac227e6b86660bd283fd4b440f52f8 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, AGPL-1.0
  1. // GSSAsyncSocksifiedSocket.cpp: implementation of the CAsyncGssSocketLayer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. // Part of this code is copyright 2001 Massachusetts Institute of Technology
  5. #include "stdafx.h"
  6. #include "resource.h"
  7. #include "AsyncGssSocketLayer.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. #define BUFSIZE (1024*8)
  15. CAsyncGssSocketLayer::CAsyncGssSocketLayer()
  16. {
  17. m_hGSS_API = NULL;
  18. m_transfer = FALSE;
  19. m_bInitialized=FALSE;
  20. m_bUseGSS=FALSE;
  21. m_nGssNetworkError=0;
  22. m_gotAuth=0;
  23. m_nShutDown = 0;
  24. pFzGss_ProcessCommand = NULL;
  25. pFzGss_InitGSS = NULL;
  26. pFzGss_KillGSS = NULL;
  27. pFzGss_DecryptMessage = NULL;
  28. pFzGss_EncryptMessage = NULL;
  29. pFzGss_EncryptData = NULL;
  30. pFzGss_DecryptData = NULL;
  31. m_pSendBuffer = NULL;
  32. m_nSendBufferLen = 0;
  33. m_nSendBufferSize = 0;
  34. m_pReceiveBuffer = NULL;
  35. m_nReceiveBufferLen = 0;
  36. m_nReceiveBufferSize = 0;
  37. m_pDecryptedReceiveBuffer = NULL;
  38. m_nDecryptedReceiveBufferLen = 0;
  39. m_nDecryptedReceiveBufferSize = 0;
  40. m_nAwaitingReply = 0;
  41. }
  42. CAsyncGssSocketLayer::~CAsyncGssSocketLayer()
  43. {
  44. delete [] m_pSendBuffer;
  45. delete [] m_pReceiveBuffer;
  46. delete [] m_pDecryptedReceiveBuffer;
  47. KillGSSData();
  48. }
  49. int CAsyncGssSocketLayer::Send(const void* lpBuf, int nBufLen, int nFlags)
  50. {
  51. if (m_gotAuth == GSSAPI_AUTHENTICATION_SUCCEEDED && m_bUseGSS)
  52. {
  53. if (m_nAwaitingReply == 3)
  54. {
  55. m_nAwaitingReply = 0;
  56. int res = SendNext(lpBuf, nBufLen, nFlags);
  57. if (res == nBufLen)
  58. m_nAwaitingReply = 0;
  59. return res;
  60. }
  61. if (m_nShutDown)
  62. {
  63. SetLastError(WSAESHUTDOWN);
  64. return SOCKET_ERROR;
  65. }
  66. if (!nBufLen)
  67. return 0;
  68. if (m_nSendBufferLen > BUFSIZE)
  69. {
  70. SetLastError(WSAEWOULDBLOCK);
  71. return SOCKET_ERROR;
  72. }
  73. char sendme[4096];
  74. char *encBuffer = m_tmpBuffer;
  75. int encBufferLen = 0;
  76. if ((nBufLen*1.5) > (1024*32))
  77. encBuffer = new char[(int)(nBufLen * 1.5)];
  78. memcpy(encBuffer, (char*)lpBuf, nBufLen);
  79. if (m_transfer)
  80. {
  81. if (nBufLen>4000)
  82. nBufLen=4000;
  83. encBuffer[nBufLen] = '\0';
  84. encBufferLen = pFzGss_EncryptData(m_pData, encBuffer, nBufLen, sendme);
  85. if (!encBufferLen)
  86. {
  87. if (encBuffer != m_tmpBuffer)
  88. delete [] encBuffer;
  89. return 0;
  90. }
  91. }
  92. else
  93. {
  94. encBuffer[nBufLen]='\0';
  95. int len = pFzGss_EncryptMessage(m_pData, encBuffer, sendme);
  96. if (!len)
  97. {
  98. if (encBuffer != m_tmpBuffer)
  99. delete [] encBuffer;
  100. return 0;
  101. }
  102. char *str = new char[strlen(encBuffer) + 30];
  103. sprintf(str, "Encrypted command: %s", encBuffer);
  104. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_INFO, (int)str);
  105. delete [] str;
  106. strcat(encBuffer, "\r\n");
  107. encBufferLen = strlen(encBuffer);
  108. }
  109. if (m_nSendBufferLen)
  110. {
  111. ASSERT(m_nSendBufferLen <= m_nSendBufferSize);
  112. ASSERT(m_pSendBuffer);
  113. int numsent = SendNext(m_pSendBuffer, m_nSendBufferLen, 0);
  114. if (!numsent)
  115. {
  116. if (encBuffer != m_tmpBuffer)
  117. delete [] encBuffer;
  118. return 0;
  119. }
  120. else if (numsent == SOCKET_ERROR && GetLastError()!=WSAEWOULDBLOCK)
  121. {
  122. if (encBuffer != m_tmpBuffer)
  123. delete [] encBuffer;
  124. return SOCKET_ERROR;
  125. }
  126. else if (numsent != m_nSendBufferLen)
  127. {
  128. if (numsent == SOCKET_ERROR)
  129. numsent = 0;
  130. if (!m_pSendBuffer)
  131. {
  132. m_pSendBuffer = new char[encBufferLen * 2];
  133. m_nSendBufferSize = encBufferLen * 2;
  134. }
  135. else if (m_nSendBufferSize < (m_nSendBufferLen + encBufferLen))
  136. {
  137. char *tmp = m_pSendBuffer;
  138. m_pSendBuffer = new char[m_nSendBufferSize + encBufferLen + 4096];
  139. m_nSendBufferSize = m_nSendBufferSize + encBufferLen + 4096;
  140. memcpy(m_pSendBuffer, tmp+numsent, m_nSendBufferLen-numsent);
  141. delete [] tmp;
  142. }
  143. else
  144. memmove(m_pSendBuffer, m_pSendBuffer + numsent, m_nSendBufferLen - numsent);
  145. memcpy(m_pSendBuffer + m_nSendBufferLen - numsent, encBuffer, encBufferLen);
  146. m_nSendBufferLen += encBufferLen-numsent;
  147. if (encBuffer != m_tmpBuffer)
  148. delete [] encBuffer;
  149. return nBufLen;
  150. }
  151. else
  152. m_nSendBufferLen = 0;
  153. }
  154. int numsent = SendNext(encBuffer, encBufferLen, 0);
  155. if (!numsent)
  156. {
  157. if (encBuffer != m_tmpBuffer)
  158. delete [] encBuffer;
  159. return 0;
  160. }
  161. if (numsent == SOCKET_ERROR)
  162. {
  163. if (GetLastError() != WSAEWOULDBLOCK)
  164. {
  165. if (encBuffer != m_tmpBuffer)
  166. delete [] encBuffer;
  167. return SOCKET_ERROR;
  168. }
  169. else
  170. {
  171. if (m_nSendBufferSize < encBufferLen)
  172. {
  173. delete [] m_pSendBuffer;
  174. m_pSendBuffer = new char[encBufferLen * 2];
  175. m_nSendBufferSize = encBufferLen * 2;
  176. }
  177. memcpy(m_pSendBuffer, encBuffer, encBufferLen);
  178. m_nSendBufferLen = encBufferLen;
  179. }
  180. }
  181. else if (numsent != encBufferLen)
  182. {
  183. if (m_nSendBufferSize < encBufferLen)
  184. {
  185. delete [] m_pSendBuffer;
  186. m_pSendBuffer = new char[encBufferLen * 2];
  187. m_nSendBufferSize = encBufferLen * 2;
  188. }
  189. memcpy(m_pSendBuffer, encBuffer+numsent, encBufferLen-numsent);
  190. m_nSendBufferLen = encBufferLen-numsent;
  191. }
  192. if (encBuffer != m_tmpBuffer)
  193. delete [] encBuffer;
  194. return nBufLen;
  195. }
  196. else
  197. return SendNext(lpBuf, nBufLen, nFlags);
  198. }
  199. /*
  200. This method calls its super method to receive data.
  201. If authentication succeeded at some point, then it tries to decrypt the data.
  202. After decryption, it adds \r\n to the end of the buffer.
  203. This method currently does not handle the MSG_PEEK flag, it also ignores nBufLen.
  204. */
  205. int CAsyncGssSocketLayer::Receive(void *lpBuf, int nBufLen, int nFlags)
  206. {
  207. if (m_gotAuth == GSSAPI_AUTHENTICATION_SUCCEEDED && m_bUseGSS)
  208. {
  209. if (m_nShutDown)
  210. {
  211. SetLastError(WSAESHUTDOWN);
  212. return SOCKET_ERROR;
  213. }
  214. if (!nBufLen)
  215. return 0;
  216. BOOL bTriggerRead = TRUE;
  217. if (!m_nDecryptedReceiveBufferLen)
  218. {
  219. bTriggerRead = FALSE;
  220. OnReceive(0);
  221. }
  222. if (m_nDecryptedReceiveBufferLen)
  223. {
  224. ASSERT(m_pDecryptedReceiveBuffer && m_nDecryptedReceiveBufferLen<=m_nDecryptedReceiveBufferSize);
  225. if (m_nDecryptedReceiveBufferLen > nBufLen)
  226. {
  227. memcpy(lpBuf, m_pDecryptedReceiveBuffer, nBufLen);
  228. memmove(m_pDecryptedReceiveBuffer, m_pDecryptedReceiveBuffer + nBufLen, m_nDecryptedReceiveBufferLen-nBufLen);
  229. m_nDecryptedReceiveBufferLen -= nBufLen;
  230. ASSERT(nBufLen>0);
  231. if (bTriggerRead)
  232. TriggerEvent(FD_READ, 0);
  233. return nBufLen;
  234. }
  235. else if (m_nDecryptedReceiveBufferLen == nBufLen)
  236. {
  237. memcpy(lpBuf, m_pDecryptedReceiveBuffer, nBufLen);
  238. m_nDecryptedReceiveBufferLen = 0;
  239. if (m_nGssNetworkError == -1)
  240. {
  241. //Trigger OnClose()
  242. TriggerEvent(FD_CLOSE, 0, TRUE);
  243. }
  244. else if (bTriggerRead)
  245. TriggerEvent(FD_READ, 0);
  246. return nBufLen;
  247. }
  248. else
  249. {
  250. memcpy(lpBuf, m_pDecryptedReceiveBuffer, m_nDecryptedReceiveBufferLen);
  251. int res = m_nDecryptedReceiveBufferLen;
  252. m_nDecryptedReceiveBufferLen = 0;
  253. if (m_nGssNetworkError == -1)
  254. {
  255. //Trigger OnClose()
  256. TriggerEvent(FD_CLOSE, 0, TRUE);
  257. }
  258. else if (bTriggerRead)
  259. TriggerEvent(FD_READ, 0);
  260. return res;
  261. }
  262. }
  263. else
  264. {
  265. if (m_nGssNetworkError==-1)
  266. return 0;
  267. else if (m_nGssNetworkError)
  268. {
  269. WSASetLastError(m_nGssNetworkError);
  270. return SOCKET_ERROR;
  271. }
  272. else
  273. {
  274. WSASetLastError(WSAEWOULDBLOCK);
  275. return SOCKET_ERROR;
  276. }
  277. }
  278. }
  279. else
  280. return ReceiveNext(lpBuf, nBufLen, nFlags);
  281. }
  282. void CAsyncGssSocketLayer::OnReceive(int nErrorCode)
  283. {
  284. if (!m_bUseGSS || m_gotAuth != GSSAPI_AUTHENTICATION_SUCCEEDED)
  285. {
  286. TriggerEvent(FD_READ, nErrorCode, TRUE);
  287. return;
  288. }
  289. //Don't decrypt additional data if buffer for decrypted data is not empty
  290. if (m_nDecryptedReceiveBufferLen && (GetLayerState()==attached || GetLayerState()==connected))
  291. {
  292. TriggerEvent(FD_READ, nErrorCode, TRUE);
  293. return;
  294. }
  295. char sendme[4096];
  296. //TRACE(m_transfer?"GSS OnReceive: called, transfer mode\n":"GSS OnReceive: called\n");
  297. int count = 10;
  298. while(count--)
  299. {
  300. if (m_transfer)
  301. {
  302. if (m_nReceiveBufferLen < 4)
  303. {
  304. if (!m_pReceiveBuffer)
  305. {
  306. ASSERT(!m_nReceiveBufferLen);
  307. ASSERT(!m_nReceiveBufferSize);
  308. m_pReceiveBuffer = new char[4096];
  309. m_nReceiveBufferSize = 4096;
  310. m_nReceiveBufferLen = 0;
  311. }
  312. int numread = ReceiveNext(m_pReceiveBuffer+m_nReceiveBufferLen, 4 - m_nReceiveBufferLen);
  313. if (!numread)
  314. {
  315. m_nGssNetworkError = -1;
  316. if (!m_nDecryptedReceiveBufferLen)
  317. TriggerEvent(FD_CLOSE, 0, TRUE);
  318. return;
  319. }
  320. else if (numread == SOCKET_ERROR)
  321. {
  322. if (GetLastError() != WSAEWOULDBLOCK)
  323. {
  324. TriggerEvent(FD_CLOSE, 0, TRUE);
  325. m_nGssNetworkError = GetLastError();
  326. }
  327. else
  328. if (m_nDecryptedReceiveBufferLen)
  329. TriggerEvent(FD_READ, nErrorCode, TRUE);
  330. return;
  331. }
  332. m_nReceiveBufferLen += numread;
  333. if (m_nReceiveBufferLen != 4)
  334. {
  335. if (m_nDecryptedReceiveBufferLen)
  336. TriggerEvent(FD_READ, nErrorCode, TRUE);
  337. return;
  338. }
  339. char tmp = m_pReceiveBuffer[0];
  340. m_pReceiveBuffer[0] = m_pReceiveBuffer[3];
  341. m_pReceiveBuffer[3] = tmp;
  342. tmp = m_pReceiveBuffer[1];
  343. m_pReceiveBuffer[1] = m_pReceiveBuffer[2];
  344. m_pReceiveBuffer[2] = tmp;
  345. unsigned int len = *(unsigned int*)m_pReceiveBuffer;
  346. if (len<4 || len > (1024*1024*4))
  347. {
  348. m_nGssNetworkError = WSAEMSGSIZE;
  349. TriggerEvent(FD_CLOSE, 0, TRUE);
  350. return;
  351. }
  352. if (m_nReceiveBufferSize < (len+4))
  353. {
  354. delete [] m_pReceiveBuffer;
  355. m_pReceiveBuffer = new char[len * 2 + 4];
  356. m_nReceiveBufferSize = len * 2 + 4;
  357. }
  358. memcpy(m_pReceiveBuffer, &len, 4);
  359. m_nReceiveBufferLen = 4;
  360. }
  361. ASSERT(m_pReceiveBuffer);
  362. int len = *(int*)m_pReceiveBuffer;
  363. ASSERT(len>4 && len < (1024*1024*4));
  364. int lenToReceive = len - m_nReceiveBufferLen + 4;
  365. int numread = ReceiveNext(m_pReceiveBuffer + m_nReceiveBufferLen, lenToReceive);
  366. if (!numread)
  367. {
  368. m_nGssNetworkError = -1;
  369. if (!m_nDecryptedReceiveBufferLen)
  370. TriggerEvent(FD_CLOSE, 0, TRUE);
  371. return;
  372. }
  373. else if (numread == SOCKET_ERROR)
  374. {
  375. if (GetLastError() != WSAEWOULDBLOCK)
  376. {
  377. m_nGssNetworkError = GetLastError();
  378. TriggerEvent(FD_CLOSE, 0, TRUE);
  379. }
  380. return;
  381. }
  382. m_nReceiveBufferLen += numread;
  383. if (numread != lenToReceive)
  384. {
  385. if (m_nDecryptedReceiveBufferLen)
  386. TriggerEvent(FD_READ, nErrorCode, TRUE);
  387. return;
  388. }
  389. ASSERT(m_nReceiveBufferLen-4 == len);
  390. char * decBuffer = m_tmpBuffer;
  391. if ((len*1.5) > (1024*32))
  392. decBuffer = new char[(int)(len * 1.5)];
  393. memcpy(decBuffer, m_pReceiveBuffer+4, len);
  394. m_nReceiveBufferLen = 0;
  395. int nDecrypted = pFzGss_DecryptData(m_pData, decBuffer, len, sendme);
  396. if (nDecrypted <= 0)
  397. {
  398. if (!m_nDecryptedReceiveBufferLen)
  399. //Trigger OnClose()
  400. TriggerEvent(FD_CLOSE, 0, TRUE);
  401. if (decBuffer != m_tmpBuffer)
  402. delete [] decBuffer;
  403. return;
  404. }
  405. //Add line to decrypted buffer
  406. if (!m_pDecryptedReceiveBuffer)
  407. {
  408. ASSERT(!m_nDecryptedReceiveBufferSize && !m_nDecryptedReceiveBufferLen);
  409. m_pDecryptedReceiveBuffer = new char[nDecrypted * 2];
  410. m_nDecryptedReceiveBufferSize = nDecrypted * 2;
  411. m_nDecryptedReceiveBufferLen = 0;
  412. }
  413. else if (m_nDecryptedReceiveBufferSize < (m_nDecryptedReceiveBufferLen+nDecrypted))
  414. {
  415. char *tmp=m_pDecryptedReceiveBuffer;
  416. m_pDecryptedReceiveBuffer = new char[m_nDecryptedReceiveBufferSize + nDecrypted + 4096];
  417. m_nDecryptedReceiveBufferSize = m_nDecryptedReceiveBufferSize + nDecrypted + 4096;
  418. memcpy(m_pDecryptedReceiveBuffer, tmp, m_nDecryptedReceiveBufferLen);
  419. delete [] tmp;
  420. }
  421. memcpy(m_pDecryptedReceiveBuffer + m_nDecryptedReceiveBufferLen, decBuffer, nDecrypted);
  422. m_nDecryptedReceiveBufferLen += nDecrypted;
  423. if (decBuffer != m_tmpBuffer)
  424. delete [] decBuffer;
  425. }
  426. else
  427. {
  428. if (m_nAwaitingReply == 1)
  429. {
  430. ReceiveReply();
  431. return;
  432. }
  433. int numread = ReceiveNext(m_tmpBuffer, BUFSIZE);
  434. if (!numread)
  435. {
  436. m_nGssNetworkError = -1;
  437. //Trigger OnClose()
  438. TriggerEvent(FD_CLOSE, 0, TRUE);
  439. return;
  440. }
  441. else if ( numread == SOCKET_ERROR )
  442. {
  443. if ( WSAGetLastError() != WSAEWOULDBLOCK )
  444. {
  445. m_nGssNetworkError = GetLastError();
  446. TriggerEvent(FD_CLOSE, 0, TRUE);
  447. }
  448. else if (m_nDecryptedReceiveBufferLen)
  449. TriggerEvent(FD_READ, 0, TRUE);
  450. return;
  451. }
  452. if (!m_pReceiveBuffer)
  453. {
  454. ASSERT(!m_nReceiveBufferLen && !m_nReceiveBufferSize);
  455. m_pReceiveBuffer = new char[numread * 2];
  456. m_nReceiveBufferSize = numread * 2;
  457. }
  458. else if (m_nReceiveBufferSize < (m_nReceiveBufferLen + numread))
  459. {
  460. char *tmp=m_pReceiveBuffer;
  461. m_pReceiveBuffer = new char[m_nReceiveBufferLen + numread + 4096];
  462. m_nReceiveBufferSize = m_nReceiveBufferLen + numread + 4096;
  463. memcpy(m_pReceiveBuffer, tmp, m_nReceiveBufferLen);
  464. delete [] tmp;
  465. }
  466. memcpy(m_pReceiveBuffer+m_nReceiveBufferLen, m_tmpBuffer, numread);
  467. int nOldLen = m_nReceiveBufferLen;
  468. m_nReceiveBufferLen += numread;
  469. //Now search for complete lines and decrypt them
  470. for (int i=nOldLen; i<m_nReceiveBufferLen; i++)
  471. {
  472. if (m_pReceiveBuffer[i]=='\n')
  473. {
  474. if (!i)
  475. {
  476. if (m_nReceiveBufferLen>1)
  477. memmove(m_pReceiveBuffer, m_pReceiveBuffer+1, m_nReceiveBufferLen-1);
  478. m_nReceiveBufferLen--;
  479. i--;
  480. continue;
  481. }
  482. if (m_pReceiveBuffer[i-1]=='\r')
  483. {
  484. //We've found a line
  485. char *decBuffer = m_tmpBuffer;
  486. if ((i*1.5) > (1024*32))
  487. decBuffer = new char[(int)(i * 1.5)];
  488. memcpy(decBuffer, m_pReceiveBuffer, i-2);
  489. decBuffer[i-1] = '\0';
  490. //Delete encrypted line from receive buffer
  491. if (!(m_nReceiveBufferLen-i-1))
  492. m_nReceiveBufferLen = 0;
  493. else
  494. {
  495. memmove(m_pReceiveBuffer, m_pReceiveBuffer+i+1, m_nReceiveBufferLen - i - 1);
  496. m_nReceiveBufferLen -= i + 1;
  497. }
  498. // Decrypt line
  499. char *str = new char[strlen(decBuffer) + 30];
  500. sprintf(str, "Encrypted reply: %s", decBuffer);
  501. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_INFO, (int)str);
  502. delete [] str;
  503. int nDecrypted = pFzGss_DecryptMessage(m_pData, decBuffer, sendme);
  504. if (!nDecrypted)
  505. {
  506. m_nGssNetworkError = -1;
  507. //Trigger OnClose()
  508. TriggerEvent(FD_CLOSE, 0, TRUE);
  509. if (decBuffer != m_tmpBuffer)
  510. delete [] decBuffer;
  511. return;
  512. }
  513. nDecrypted = strlen(decBuffer);
  514. if (m_nAwaitingReply && m_nAwaitingReply<3)
  515. {
  516. while (decBuffer[nDecrypted - 1]=='\n' || decBuffer[nDecrypted - 1]=='\r')
  517. nDecrypted--;
  518. decBuffer[nDecrypted] = 0;
  519. m_nAwaitingReply = 0;
  520. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_REPLY, (int)decBuffer);
  521. if (decBuffer[nDecrypted - 1]!='\n')
  522. {
  523. decBuffer[nDecrypted++]='\r';
  524. decBuffer[nDecrypted++]='\n';
  525. decBuffer[nDecrypted] = 0;
  526. }
  527. int res = pFzGss_ProcessReply(m_pData, decBuffer);
  528. if (res == 1)
  529. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_AUTHCOMPLETE, 0);
  530. else if (res!=-1)
  531. {
  532. m_gotAuth = 0;
  533. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_AUTHFAILED, 0);
  534. }
  535. if (decBuffer != m_tmpBuffer)
  536. delete [] decBuffer;
  537. }
  538. else
  539. {
  540. if (decBuffer[nDecrypted - 1]!='\n')
  541. {
  542. decBuffer[nDecrypted++]='\r';
  543. decBuffer[nDecrypted++]='\n';
  544. decBuffer[nDecrypted] = 0;
  545. }
  546. //Add line to decrypted buffer
  547. if (!m_pDecryptedReceiveBuffer)
  548. {
  549. m_pDecryptedReceiveBuffer = new char[nDecrypted * 2];
  550. m_nDecryptedReceiveBufferSize = nDecrypted * 2;
  551. m_nDecryptedReceiveBufferLen=0;
  552. }
  553. else if (m_nDecryptedReceiveBufferSize < (m_nDecryptedReceiveBufferLen+nDecrypted))
  554. {
  555. char *tmp=m_pDecryptedReceiveBuffer;
  556. m_pDecryptedReceiveBuffer = new char[m_nDecryptedReceiveBufferSize + nDecrypted + 4096];
  557. m_nDecryptedReceiveBufferSize = m_nDecryptedReceiveBufferSize + nDecrypted + 4096;
  558. memcpy(m_pDecryptedReceiveBuffer, tmp, m_nDecryptedReceiveBufferLen);
  559. delete [] tmp;
  560. }
  561. memcpy(m_pDecryptedReceiveBuffer + m_nDecryptedReceiveBufferLen, decBuffer, nDecrypted);
  562. m_nDecryptedReceiveBufferLen += nDecrypted;
  563. if (decBuffer != m_tmpBuffer)
  564. delete [] decBuffer;
  565. }
  566. //Try to decrypt any additional lines
  567. i=-1;
  568. }
  569. }
  570. }
  571. }
  572. }
  573. }
  574. void CAsyncGssSocketLayer::Close()
  575. {
  576. CloseNext();
  577. m_nAwaitingReply = 0;
  578. m_nGssNetworkError=0;
  579. if (!m_transfer)
  580. m_gotAuth = 0;
  581. m_nSendBufferLen = 0;
  582. m_nReceiveBufferLen = 0;
  583. m_nDecryptedReceiveBufferLen = 0;
  584. KillGSSData();
  585. }
  586. BOOL CAsyncGssSocketLayer::UnLoadGSSLibrary()
  587. {
  588. if (m_hGSS_API)
  589. {
  590. FreeLibrary(m_hGSS_API);
  591. m_hGSS_API = NULL;
  592. }
  593. return TRUE;
  594. }
  595. BOOL CAsyncGssSocketLayer::LoadGSSLibrary()
  596. {
  597. if (m_hGSS_API)
  598. return TRUE;
  599. m_hGSS_API = LoadLibrary(GFTPDLL);
  600. return !(m_hGSS_API==NULL);
  601. }
  602. BOOL CAsyncGssSocketLayer::InitGSS(BOOL bSpawned, BOOL promptPassword)
  603. {
  604. if (m_bUseGSS)
  605. return TRUE;
  606. if (m_bInitialized)
  607. return TRUE;
  608. if (!m_hGSS_API)
  609. LoadGSSLibrary();
  610. if (!m_hGSS_API)
  611. return FALSE;
  612. if (m_hGSS_API)
  613. {
  614. pFzGss_ProcessCommand = (t_FzGss_ProcessCommand)GetProcAddress(m_hGSS_API, "ProcessCommand");
  615. pFzGss_DecryptMessage = (t_FzGss_DecryptMessage)GetProcAddress(m_hGSS_API, "DecryptMessage");
  616. pFzGss_EncryptMessage = (t_FzGss_EncryptMessage)GetProcAddress(m_hGSS_API, "EncryptMessage");
  617. pFzGss_EncryptData = (t_FzGss_EncryptData)GetProcAddress(m_hGSS_API , "EncryptData");
  618. pFzGss_DecryptData = (t_FzGss_DecryptData)GetProcAddress(m_hGSS_API, "DecryptData");
  619. pFzGss_InitGSS = (t_FzGss_InitGSS)GetProcAddress(m_hGSS_API, "InitGSS");
  620. pFzGss_KillGSS = (t_FzGss_KillGSS)GetProcAddress(m_hGSS_API, "KillGSS");
  621. pFzGss_DoClientAuth = (t_FzGss_DoClientAuth)GetProcAddress(m_hGSS_API, "DoClientAuth");
  622. pFzGss_ProcessReply = (t_FzGss_ProcessReply)GetProcAddress(m_hGSS_API, "ProcessReply");
  623. pFzGss_GetUserFromKrbTicket = (t_FzGss_GetUserFromKrbTicket)GetProcAddress(m_hGSS_API, "GetUserFromKrbTicket");
  624. if (!pFzGss_ProcessCommand || !pFzGss_InitGSS || !pFzGss_KillGSS||
  625. !pFzGss_DecryptMessage || !pFzGss_EncryptMessage || !pFzGss_EncryptData ||
  626. !pFzGss_DecryptData ||
  627. !pFzGss_DoClientAuth ||
  628. !pFzGss_ProcessReply ||
  629. !pFzGss_GetUserFromKrbTicket
  630. )
  631. {
  632. return FALSE;
  633. }
  634. }
  635. if (!bSpawned)
  636. {
  637. m_pData=new void*;
  638. pFzGss_InitGSS(m_pData, Callback, this, promptPassword);
  639. }
  640. if (!bSpawned)
  641. m_bInitialized = TRUE;
  642. m_bUseGSS = TRUE;
  643. return TRUE;
  644. }
  645. BOOL CAsyncGssSocketLayer::KillGSSData()
  646. {
  647. if (!m_bUseGSS)
  648. return FALSE;
  649. if (!m_bInitialized)
  650. return TRUE;
  651. m_bUseGSS = FALSE;
  652. pFzGss_KillGSS(m_pData);
  653. m_bInitialized = FALSE;
  654. delete m_pData;
  655. m_pData = NULL;
  656. UnLoadGSSLibrary();
  657. return TRUE;
  658. }
  659. BOOL CAsyncGssSocketLayer::InitTransferChannel(CAsyncGssSocketLayer *pSocket)
  660. {
  661. KillGSSData();
  662. InitGSS(TRUE);
  663. m_pData = pSocket->m_pData;
  664. m_bUseGSS = pSocket->m_bUseGSS;
  665. m_gotAuth = pSocket->m_gotAuth;
  666. m_transfer = TRUE;
  667. return TRUE;
  668. }
  669. void CAsyncGssSocketLayer::OnSend(int nErrorCode)
  670. {
  671. if (!m_nSendBufferLen)
  672. TriggerEvent(FD_WRITE, nErrorCode, TRUE);
  673. else
  674. {
  675. ASSERT(m_pSendBuffer);
  676. int numsent = SendNext(m_pSendBuffer, m_nSendBufferLen, 0);
  677. if (!numsent)
  678. TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  679. else if (numsent == SOCKET_ERROR)
  680. {
  681. if (GetLastError() != WSAEWOULDBLOCK)
  682. TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  683. }
  684. else if (numsent != m_nSendBufferLen)
  685. {
  686. memmove(m_pSendBuffer, m_pSendBuffer + numsent, m_nSendBufferLen - numsent);
  687. m_nSendBufferLen -= numsent;
  688. }
  689. else
  690. {
  691. m_nSendBufferLen = 0;
  692. if (ShutDownComplete())
  693. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_SHUTDOWN_COMPLETE, 0);
  694. else
  695. TriggerEvent(FD_WRITE, nErrorCode, TRUE);
  696. }
  697. }
  698. }
  699. BOOL CAsyncGssSocketLayer::ShutDown(int nHow /*=sends*/)
  700. {
  701. if (m_gotAuth == GSSAPI_AUTHENTICATION_SUCCEEDED && m_bUseGSS)
  702. {
  703. if (m_nShutDown)
  704. {
  705. if (m_nSendBufferLen)
  706. return FALSE;
  707. else
  708. return TRUE;
  709. }
  710. m_nShutDown = 1;
  711. char sendme[4096];
  712. char *encBuffer = m_tmpBuffer;
  713. int encBufferLen = 0;
  714. encBufferLen = pFzGss_EncryptData(m_pData, encBuffer, 0, sendme);
  715. if (!encBufferLen)
  716. {
  717. WSASetLastError(WSAENETDOWN);
  718. return FALSE;
  719. }
  720. encBuffer[encBufferLen++] = '\r';
  721. encBuffer[encBufferLen++] = '\n';
  722. if (m_nSendBufferLen)
  723. {
  724. ASSERT(m_pSendBuffer);
  725. int numsent = SendNext(m_pSendBuffer, m_nSendBufferLen, 0);
  726. if (!numsent)
  727. return TRUE;
  728. else if (numsent == SOCKET_ERROR && GetLastError()!=WSAEWOULDBLOCK)
  729. return TRUE;
  730. else if (numsent != m_nSendBufferLen)
  731. {
  732. if (numsent == SOCKET_ERROR)
  733. numsent = 0;
  734. if (m_nSendBufferSize < (m_nSendBufferLen + encBufferLen))
  735. {
  736. char *tmp = m_pSendBuffer;
  737. m_pSendBuffer = new char[m_nSendBufferSize + encBufferLen + 4096];
  738. m_nSendBufferSize = m_nSendBufferSize + encBufferLen + 4096;
  739. memcpy(m_pSendBuffer, tmp+numsent, m_nSendBufferLen-numsent);
  740. delete [] tmp;
  741. }
  742. else
  743. memmove(m_pSendBuffer, m_pSendBuffer + numsent, m_nSendBufferLen - numsent);
  744. memcpy(m_pSendBuffer + m_nSendBufferLen-numsent, encBuffer, encBufferLen);
  745. m_nSendBufferLen += encBufferLen-numsent;
  746. WSASetLastError(WSAEWOULDBLOCK);
  747. return FALSE;
  748. }
  749. else
  750. m_nSendBufferLen = 0;
  751. }
  752. int numsent = SendNext(encBuffer, encBufferLen, 0);
  753. if (!numsent)
  754. return TRUE;
  755. if (numsent == SOCKET_ERROR)
  756. {
  757. if (GetLastError() == WSAEWOULDBLOCK)
  758. {
  759. if (m_nSendBufferSize < encBufferLen)
  760. {
  761. delete [] m_pSendBuffer;
  762. m_pSendBuffer = new char[encBufferLen * 2];
  763. m_nSendBufferLen = encBufferLen * 2;
  764. }
  765. memcpy(m_pSendBuffer, encBuffer, encBufferLen);
  766. m_nSendBufferLen = encBufferLen;
  767. return FALSE;
  768. }
  769. return TRUE;
  770. }
  771. if (numsent != encBufferLen)
  772. {
  773. if (m_nSendBufferSize < encBufferLen)
  774. {
  775. delete [] m_pSendBuffer;
  776. m_pSendBuffer = new char[encBufferLen * 2];
  777. m_nSendBufferSize = encBufferLen * 2;
  778. }
  779. memcpy(m_pSendBuffer, encBuffer+numsent, encBufferLen-numsent);
  780. m_nSendBufferLen = encBufferLen-numsent;
  781. }
  782. if (m_nSendBufferLen)
  783. {
  784. WSASetLastError(WSAEWOULDBLOCK);
  785. return FALSE;
  786. }
  787. else
  788. return TRUE;
  789. }
  790. else
  791. return ShutDownNext();
  792. }
  793. BOOL CAsyncGssSocketLayer::ShutDownComplete()
  794. {
  795. //If a ShutDown was issued, has the connection already been shut down?
  796. if (!m_nShutDown)
  797. return FALSE;
  798. else if (m_gotAuth != GSSAPI_AUTHENTICATION_SUCCEEDED || !m_bUseGSS)
  799. return FALSE;
  800. else if (m_nSendBufferLen)
  801. return FALSE;
  802. else
  803. return TRUE;
  804. }
  805. int CAsyncGssSocketLayer::ProcessCommand(const char *command, const char *args, char *sendme)
  806. {
  807. ASSERT(command);
  808. ASSERT(sendme);
  809. if (!m_bUseGSS)
  810. {
  811. strcpy(sendme, "501 GSSAPI not initialized");
  812. return -1;
  813. }
  814. char *argBuffer = m_tmpBuffer;
  815. if ((strlen(args) + 1000) >= (1024*32))
  816. argBuffer = new char[strlen(args) + 1000];
  817. if (!strcmp(command, "ADAT"))
  818. {
  819. SOCKADDR_IN his_addr;
  820. SOCKADDR_IN ctrl_addr;
  821. int addrlen = sizeof (his_addr);
  822. if (!GetPeerName((SOCKADDR*)&his_addr, &addrlen))
  823. {
  824. if (argBuffer != m_tmpBuffer)
  825. delete [] argBuffer;
  826. sprintf(sendme, "501 unable to getpeername");
  827. return -1;
  828. }
  829. addrlen = sizeof (ctrl_addr);
  830. if (!GetSockName((SOCKADDR*)&ctrl_addr, &addrlen))
  831. {
  832. if (argBuffer != m_tmpBuffer)
  833. delete [] argBuffer;
  834. sprintf(sendme, "501 unable to getsockname");
  835. return -1;
  836. }
  837. char localname[513];
  838. struct hostent *hp;
  839. if (gethostname(localname, 512))
  840. {
  841. if (argBuffer != m_tmpBuffer)
  842. delete [] argBuffer;
  843. sprintf(sendme, "501 couldn't get local hostname (%d)", errno);
  844. return -1;
  845. }
  846. if (!(hp = gethostbyname(localname)))
  847. {
  848. if (argBuffer != m_tmpBuffer)
  849. delete [] argBuffer;
  850. sprintf(sendme, "501 couldn't canonicalize local hostname");
  851. return -1;
  852. }
  853. strncpy(localname, hp->h_name, sizeof(localname) - 1);
  854. localname[sizeof(localname) - 1] = '\0';
  855. memcpy(argBuffer, &his_addr.sin_addr.s_addr, 4);
  856. memcpy(argBuffer+4, &ctrl_addr.sin_addr.s_addr, 4);
  857. strcpy(argBuffer + 8, localname);
  858. strcpy(argBuffer + 8 + strlen(localname) + 1, args);
  859. }
  860. else
  861. strcpy(argBuffer, args);
  862. int res = pFzGss_ProcessCommand(m_pData, command, argBuffer, sendme);
  863. if (!strcmp(command, "ADAT") && res != -1)
  864. {
  865. m_nAwaitingReply = 3;
  866. m_gotAuth = GSSAPI_AUTHENTICATION_SUCCEEDED;
  867. }
  868. if (argBuffer != m_tmpBuffer)
  869. delete [] argBuffer;
  870. return res;
  871. }
  872. BOOL CAsyncGssSocketLayer::AuthSuccessful() const
  873. {
  874. return m_gotAuth == GSSAPI_AUTHENTICATION_SUCCEEDED;
  875. }
  876. int CAsyncGssSocketLayer::ProcessCommand(const char *command, const char *args1, const char *args2, char *sendme)
  877. {
  878. ASSERT(command);
  879. ASSERT(sendme);
  880. if (!m_bUseGSS)
  881. {
  882. strcpy(sendme, "501 GSSAPI not initialized");
  883. return -1;
  884. }
  885. char *argBuffer = m_tmpBuffer;
  886. if ((strlen(args1) + strlen(args2) + 10) >= (1024*32))
  887. argBuffer = new char[strlen(args1) + strlen(args2) + 10];
  888. strcpy(argBuffer, args1);
  889. strcpy(argBuffer + strlen(args1) + 1, args2);
  890. int res = pFzGss_ProcessCommand(m_pData, command, argBuffer, sendme);
  891. if (!strcmp(command, "ADAT") && res != -1)
  892. m_gotAuth = GSSAPI_AUTHENTICATION_SUCCEEDED;
  893. if (argBuffer != m_tmpBuffer)
  894. delete [] argBuffer;
  895. return res;
  896. }
  897. int CAsyncGssSocketLayer::GetClientAuth(const char* pHost)
  898. {
  899. if (m_hGSS_API)
  900. {
  901. char *hostname;
  902. ULONG peeraddr;
  903. ULONG myaddr;
  904. int res;
  905. hostname = new char[strlen(pHost)+1];
  906. strcpy(hostname, pHost);
  907. SOCKADDR SockAddr;
  908. memset(&SockAddr,0,sizeof(SockAddr));
  909. int SockAddrLen=sizeof(SockAddr);
  910. if (!GetPeerName(&SockAddr, &SockAddrLen))
  911. {
  912. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_ERROR, (int)"GetAuth() GetPeerName() failed");
  913. return FALSE;
  914. }
  915. peeraddr=((LPSOCKADDR_IN)&SockAddr)->sin_addr.S_un.S_addr;
  916. memset(&SockAddr, 0, sizeof(SockAddr));
  917. if (!GetSockName(&SockAddr, &SockAddrLen))
  918. {
  919. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_ERROR, (int)"GetAuth() GetSockName() failed");
  920. return FALSE;
  921. }
  922. myaddr=((LPSOCKADDR_IN)&SockAddr)->sin_addr.S_un.S_addr;
  923. res = pFzGss_DoClientAuth(m_pData, hostname,
  924. myaddr,
  925. peeraddr,
  926. 'P', 0);
  927. m_gotAuth = res;
  928. if (m_gotAuth == -1)
  929. m_gotAuth = 1;
  930. delete [] hostname;
  931. return res;
  932. }
  933. else
  934. {
  935. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_ERROR, (int)"GetClientAuth(933): GSS api not initialized!");
  936. m_gotAuth = 0;//SEND_DATA_IN_THE_CLEAR;
  937. }
  938. return m_gotAuth;
  939. }
  940. void CAsyncGssSocketLayer::OnClose(int nErrorCode)
  941. {
  942. if (!m_nGssNetworkError)
  943. m_nGssNetworkError = -1;
  944. if (!nErrorCode)
  945. OnReceive(0);
  946. if (!m_nDecryptedReceiveBufferLen)
  947. TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  948. }
  949. int CALLBACK CAsyncGssSocketLayer::Callback(void *pData, int nParam1, int nParam2, int nParam3)
  950. {
  951. CAsyncGssSocketLayer *pLayer = reinterpret_cast<CAsyncGssSocketLayer *>(pData);
  952. switch (nParam1)
  953. {
  954. case 0:
  955. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_INFO, nParam2);
  956. break;
  957. case 1:
  958. {
  959. char *buffer = (char *)nParam2;
  960. int len = strlen(buffer);
  961. if (nParam3)
  962. {
  963. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_COMMAND, nParam3);
  964. char *str = new char[strlen((char *)nParam2)+25];
  965. sprintf(str, "Encrypted command: %s", (char *)nParam2);
  966. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_INFO, (int)str);
  967. delete [] str;
  968. }
  969. else
  970. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_COMMAND, nParam2);
  971. pLayer->m_nAwaitingReply = nParam3 ? 2:1;
  972. if (!pLayer->m_pSendBuffer)
  973. {
  974. pLayer->m_pSendBuffer = new char[len + 4096];
  975. pLayer->m_nSendBufferSize = len + 4096;
  976. }
  977. else if (pLayer->m_nSendBufferSize < (pLayer->m_nSendBufferLen + len + 2))
  978. {
  979. char *tmp = pLayer->m_pSendBuffer;
  980. pLayer->m_pSendBuffer = new char[pLayer->m_nSendBufferLen + len + 4096];
  981. pLayer->m_nSendBufferSize = pLayer->m_nSendBufferLen + len + 4096;
  982. memcpy(pLayer->m_pSendBuffer, tmp, pLayer->m_nSendBufferLen);
  983. delete [] tmp;
  984. }
  985. memcpy(pLayer->m_pSendBuffer+pLayer->m_nSendBufferLen, (char *)nParam2, len);
  986. pLayer->m_pSendBuffer[pLayer->m_nSendBufferLen+len] = '\r';
  987. pLayer->m_pSendBuffer[pLayer->m_nSendBufferLen+len+1] = '\n';
  988. pLayer->m_nSendBufferLen += len + 2;
  989. pLayer->TriggerEvent(FD_WRITE, 0);
  990. break;
  991. }
  992. }
  993. return 0;
  994. }
  995. void CAsyncGssSocketLayer::ReceiveReply()
  996. {
  997. if (m_nReceiveBufferSize < 4096)
  998. {
  999. delete [] m_pReceiveBuffer;
  1000. m_pReceiveBuffer = new char[4096];
  1001. m_nReceiveBufferSize = 4096;
  1002. }
  1003. char buffer;
  1004. int numread = ReceiveNext(&buffer, 1);
  1005. if (!numread)
  1006. {
  1007. m_nGssNetworkError = -1;
  1008. //Trigger OnClose()
  1009. TriggerEvent(FD_CLOSE, 0, TRUE);
  1010. return;
  1011. }
  1012. else if ( numread == SOCKET_ERROR )
  1013. {
  1014. if ( WSAGetLastError() != WSAEWOULDBLOCK )
  1015. {
  1016. m_nGssNetworkError = GetLastError();
  1017. TriggerEvent(FD_CLOSE, 0, TRUE);
  1018. }
  1019. else if (m_nDecryptedReceiveBufferLen)
  1020. TriggerEvent(FD_READ, 0, TRUE);
  1021. return;
  1022. }
  1023. if (buffer == 0 || buffer=='\r' || buffer=='\n')
  1024. {
  1025. if (!m_nReceiveBufferLen)
  1026. return;
  1027. m_nAwaitingReply = 0;
  1028. m_pReceiveBuffer[m_nReceiveBufferLen] = 0;
  1029. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_REPLY, (int)m_pReceiveBuffer);
  1030. int res = pFzGss_ProcessReply(m_pData, m_pReceiveBuffer);
  1031. m_nReceiveBufferLen = 0;
  1032. if (res == 1)
  1033. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_AUTHCOMPLETE, 0);
  1034. else if (res==-1)
  1035. return;
  1036. else
  1037. {
  1038. m_gotAuth = 0;
  1039. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, GSS_AUTHFAILED, 0);
  1040. }
  1041. }
  1042. else if (m_nReceiveBufferLen < 4095)
  1043. m_pReceiveBuffer[m_nReceiveBufferLen++] = buffer;
  1044. }
  1045. BOOL CAsyncGssSocketLayer::GetUserFromKrbTicket(char *buffer)
  1046. {
  1047. if (!m_gotAuth || !m_bUseGSS || !m_pData || !pFzGss_GetUserFromKrbTicket)
  1048. return FALSE;
  1049. return pFzGss_GetUserFromKrbTicket(m_pData, buffer);
  1050. }