OSDN Git Service

Add support for retrying file transfer.
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index 79d3709..2c162f2 100644 (file)
--- a/main.c
+++ b/main.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -37,7 +39,8 @@
 #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
@@ -127,6 +130,9 @@ static int SuppressRefresh = 0;
 \r
 static DWORD dwCookie;\r
 \r
+// 暗号化通信対応\r
+static char SSLRootCAFilePath[FMAX_PATH+1];\r
+\r
 \r
 /*===== グローバルなワーク =====*/\r
 \r
@@ -220,6 +226,7 @@ int FolderAttr = NO;
 int FolderAttrNum = 777;\r
 // 暗号化通信対応\r
 BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];\r
+BYTE SSLRootCAFileHash[20];\r
 \r
 \r
 \r
@@ -469,6 +476,9 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                        // 暗号化通信対応\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
@@ -837,6 +847,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \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
@@ -845,11 +861,21 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        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
@@ -870,11 +896,21 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        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
@@ -908,7 +944,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                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
@@ -2476,7 +2517,7 @@ void ExecViewer(char *Fname, int App)
        // 任意のコードが実行されるバグ修正\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
@@ -2947,3 +2988,35 @@ BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certif
        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