/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\r
#include <windowsx.h>\r
#include <commctrl.h>\r
#include <stdarg.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
\r
#include "common.h"\r
#include "resource.h"\r
\r
static DWORD dwCookie;\r
\r
+// 暗号化通信対応\r
+static char SSLRootCAFilePath[FMAX_PATH+1];\r
+\r
\r
/*===== グローバルなワーク =====*/\r
\r
int FolderAttrNum = 777;\r
// 暗号化通信対応\r
BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];\r
+BYTE SSLRootCAFileHash[20];\r
\r
\r
\r
// 暗号化通信対応\r
SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);\r
SetSSLConfirmCallback(SSLConfirmCallback);\r
+ GetModuleFileName(NULL, SSLRootCAFilePath, FMAX_PATH);\r
+ strcpy(GetFileName(SSLRootCAFilePath), "ssl.pem");\r
+ LoadSSLRootCAFile();\r
\r
LoadJre();\r
if(NoRasControl == NO)\r
\r
switch (message)\r
{\r
+ // 自動切断対策\r
+ case WM_TIMER :\r
+ if(wParam == 1)\r
+ NoopProc();\r
+ break;\r
+\r
case WM_COMMAND :\r
// 同時接続対応\r
// 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない\r
switch(LOWORD(wParam))\r
{\r
case MENU_CONNECT :\r
+ // 自動切断対策\r
+ KillTimer(hWnd, 1);\r
ConnectProc(DLG_TYPE_CON, -1);\r
+ // 自動切断対策\r
+ if(AskNoopInterval() > 0)\r
+ SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
break;\r
\r
case MENU_CONNECT_NUM :\r
+ // 自動切断対策\r
+ KillTimer(hWnd, 1);\r
ConnectProc(DLG_TYPE_CON, (int)lParam);\r
+ // 自動切断対策\r
+ if(AskNoopInterval() > 0)\r
+ SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
if(AskConnecting() == YES)\r
{\r
if(HIWORD(wParam) & OPT_MIRROR)\r
break;\r
\r
case MENU_SET_CONNECT :\r
+ // 自動切断対策\r
+ KillTimer(hWnd, 1);\r
ConnectProc(DLG_TYPE_SET, -1);\r
+ // 自動切断対策\r
+ if(AskNoopInterval() > 0)\r
+ SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
break;\r
\r
case MENU_QUICK :\r
+ // 自動切断対策\r
+ KillTimer(hWnd, 1);\r
QuickConnectProc();\r
+ // 自動切断対策\r
+ if(AskNoopInterval() > 0)\r
+ SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
break;\r
\r
case MENU_DISCONNECT :\r
case MENU_HIST_18 :\r
case MENU_HIST_19 :\r
case MENU_HIST_20 :\r
+ // 自動切断対策\r
+ KillTimer(hWnd, 1);\r
HistoryConnectProc(LOWORD(wParam));\r
+ // 自動切断対策\r
+ if(AskNoopInterval() > 0)\r
+ SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
break;\r
\r
case MENU_UPDIR :\r
// 任意のコードが実行されるバグ修正\r
// 拡張子が無いと補完されるため\r
// if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
- if((App == -1) && strrchr(Fname, '.') > strrchr(Fname, '\\') && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
+ if((App == -1) && (strlen(GetFileExt(GetFileName(Fname))) > 0) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
{\r
DoPrintf("ShellExecute - %s", Fname);\r
ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);\r
return bResult;\r
}\r
\r
+BOOL LoadSSLRootCAFile()\r
+{\r
+ BOOL bResult;\r
+ HANDLE hFile;\r
+ DWORD Size;\r
+ BYTE* pBuffer;\r
+ uint32 Hash[5];\r
+ bResult = FALSE;\r
+ if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
+ {\r
+ Size = GetFileSize(hFile, NULL);\r
+ if(pBuffer = (BYTE*)malloc(Size))\r
+ {\r
+ if(ReadFile(hFile, pBuffer, Size, &Size, NULL))\r
+ {\r
+ sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash);\r
+ // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
+ if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 20) == 0\r
+ || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ {\r
+ memcpy(&SSLRootCAFileHash, &Hash, 20);\r
+ if(SetSSLRootCertificate(pBuffer, Size))\r
+ bResult = TRUE;\r
+ }\r
+ }\r
+ free(pBuffer);\r
+ }\r
+ CloseHandle(hFile);\r
+ }\r
+ return bResult;\r
+}\r
+\r