X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=main.c;h=c731384ef50cf79e14af5688c91cc988a08d7b9b;hb=refs%2Fheads%2F1.98e;hp=60628616768bd4db559e5fd3a71691f36e3475f7;hpb=bcc0424d0bfdc429e383051700365714c5c09618;p=ffftp%2Fffftp.git diff --git a/main.c b/main.c index 6062861..c731384 100644 --- a/main.c +++ b/main.c @@ -136,6 +136,9 @@ static DWORD dwCookie; static char SSLRootCAFilePath[FMAX_PATH+1]; // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 static DWORD MainThreadId; +// ポータブル版判定 +static char PortableFilePath[FMAX_PATH+1]; +int PortableVersion; /*===== グローバルなワーク =====*/ @@ -233,6 +236,8 @@ BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20]; BYTE SSLRootCAFileHash[20]; // ファイルアイコン表示対応 int DispFileIcon = NO; +// ディレクトリ自動作成 +int MakeAllDir = YES; @@ -258,66 +263,68 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi // プロセス保護 #ifdef ENABLE_PROCESS_PROTECTION - DWORD ProtectLevel; - char* pCommand; - char Option[FMAX_PATH+1]; - ProtectLevel = PROCESS_PROTECTION_NONE; - pCommand = lpszCmdLine; - while(pCommand = GetToken(pCommand, Option)) { - if(strcmp(Option, "--protect") == 0) + DWORD ProtectLevel; + char* pCommand; + char Option[FMAX_PATH+1]; + ProtectLevel = PROCESS_PROTECTION_NONE; + pCommand = lpszCmdLine; + while(pCommand = GetToken(pCommand, Option)) { - ProtectLevel = PROCESS_PROTECTION_DEFAULT; - break; - } - else if(strcmp(Option, "--protect-high") == 0) - { - ProtectLevel = PROCESS_PROTECTION_HIGH; - break; - } - else if(strcmp(Option, "--protect-medium") == 0) - { - ProtectLevel = PROCESS_PROTECTION_MEDIUM; - break; - } - else if(strcmp(Option, "--protect-low") == 0) - { - ProtectLevel = PROCESS_PROTECTION_LOW; - break; + if(strcmp(Option, "--protect") == 0) + { + ProtectLevel = PROCESS_PROTECTION_DEFAULT; + break; + } + else if(strcmp(Option, "--protect-high") == 0) + { + ProtectLevel = PROCESS_PROTECTION_HIGH; + break; + } + else if(strcmp(Option, "--protect-medium") == 0) + { + ProtectLevel = PROCESS_PROTECTION_MEDIUM; + break; + } + else if(strcmp(Option, "--protect-low") == 0) + { + ProtectLevel = PROCESS_PROTECTION_LOW; + break; + } } - } - if(ProtectLevel != PROCESS_PROTECTION_NONE) - { - SetProcessProtectionLevel(ProtectLevel); - if(!InitializeLoadLibraryHook()) + if(ProtectLevel != PROCESS_PROTECTION_NONE) { - MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR); - return 0; - } + SetProcessProtectionLevel(ProtectLevel); + if(!InitializeLoadLibraryHook()) + { + MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } #ifndef _DEBUG - if(IsDebuggerPresent()) - { - MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR); - return 0; - } + if(IsDebuggerPresent()) + { + MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } #endif - if(!UnloadUntrustedModule()) - { - MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR); - return 0; - } + if(!UnloadUntrustedModule()) + { + MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } #ifndef _DEBUG - if(RestartProtectedProcess(" --restart")) - return 0; + if(RestartProtectedProcess(" --restart")) + return 0; #endif - if(!EnableLoadLibraryHook(TRUE)) - { - MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR); - return 0; + if(!EnableLoadLibraryHook(TRUE)) + { + MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } } + else + InitializeLoadLibraryHook(); } - else - InitializeLoadLibraryHook(); #endif // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 @@ -339,9 +346,6 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi LoadOpenSSL(); #endif - // SFTP対応 - LoadPuTTY(); - Ret = FALSE; hWndFtp = NULL; hInstFtp = hInstance; @@ -377,8 +381,6 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi #ifdef USE_OPENSSL FreeOpenSSL(); #endif - // SFTP対応 - FreePuTTY(); OleUninitialize(); return(Ret); } @@ -405,6 +407,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) char PwdBuf[FMAX_PATH+1]; int useDefautPassword = 0; /* 警告文表示用 */ int masterpass; + // ポータブル版判定 + int ImportPortable; sts = FFFTP_FAIL; @@ -442,13 +446,32 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) ForceIni = YES; RegType = REGTYPE_INI; } + // ポータブル版判定 + GetModuleFileName(NULL, PortableFilePath, FMAX_PATH); + strcpy(GetFileName(PortableFilePath), "portable"); + CheckPortableVersion(); + ImportPortable = NO; + if(PortableVersion == YES) + { + ForceIni = YES; + RegType = REGTYPE_INI; + if(IsRegAvailable() == YES && IsIniAvailable() == NO) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + { + ImportPortable = YES; + ForceIni = NO; + RegType = REGTYPE_REG; + } + } + } // AllocConsole(); /* 2010.02.01 genta マスターパスワードを入力させる -z オプションがあるときは最初だけスキップ -z オプションがないときは,デフォルトパスワードをまず試す - LoadRegistory()する + LoadRegistry()する パスワードが不一致なら再入力するか尋ねる. (破損していた場合はさせない) */ @@ -493,7 +516,14 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) if(masterpass != 0) { - LoadRegistory(); + LoadRegistry(); + + // ポータブル版判定 + if(ImportPortable == YES) + { + ForceIni = YES; + RegType = REGTYPE_INI; + } // 暗号化通信対応 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback); @@ -979,6 +1009,22 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_DCLICK : if(hWndCurFocus == GetLocalHwnd()) + // ローカルフォルダを開く +// DoubleClickProc(WIN_LOCAL, YES, -1); + DoubleClickProc(WIN_LOCAL, NO, -1); + else + { + SuppressRefresh = 1; + // ローカルフォルダを開く +// DoubleClickProc(WIN_REMOTE, YES, -1); + DoubleClickProc(WIN_REMOTE, NO, -1); + SuppressRefresh = 0; + } + break; + + // ローカルフォルダを開く + case MENU_OPEN : + if(hWndCurFocus == GetLocalHwnd()) DoubleClickProc(WIN_LOCAL, YES, -1); else { @@ -1047,42 +1093,42 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_DOWNLOAD : SetCurrentDirAsDirHist(); - DownLoadProc(NO, NO, NO); + DownloadProc(NO, NO, NO); break; case MENU_DOWNLOAD_AS : SetCurrentDirAsDirHist(); - DownLoadProc(YES, NO, NO); + DownloadProc(YES, NO, NO); break; case MENU_DOWNLOAD_AS_FILE : SetCurrentDirAsDirHist(); - DownLoadProc(NO, YES, NO); + DownloadProc(NO, YES, NO); break; case MENU_DOWNLOAD_ALL : SetCurrentDirAsDirHist(); - DownLoadProc(NO, NO, YES); + DownloadProc(NO, NO, YES); break; case MENU_DOWNLOAD_NAME : SetCurrentDirAsDirHist(); - InputDownLoadProc(); + InputDownloadProc(); break; case MENU_UPLOAD : SetCurrentDirAsDirHist(); - UpLoadListProc(NO, NO); + UploadListProc(NO, NO); break; case MENU_UPLOAD_AS : SetCurrentDirAsDirHist(); - UpLoadListProc(YES, NO); + UploadListProc(YES, NO); break; case MENU_UPLOAD_ALL : SetCurrentDirAsDirHist(); - UpLoadListProc(NO, YES); + UploadListProc(NO, YES); break; case MENU_MIRROR_UPLOAD : @@ -1343,7 +1389,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_REGSAVE : GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); SaveSettingsToFile(); break; @@ -1359,7 +1405,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_REGINIT : if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES) { - ClearRegistory(); + ClearRegistry(); + // ポータブル版判定 + ClearIni(); SaveExit = NO; PostMessage(hWnd, WM_CLOSE, 0, 0L); } @@ -2066,7 +2114,10 @@ static void ExitProc(HWND hWnd) if(SaveExit == YES) { GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); + // ポータブル版判定 + if(RegType == REGTYPE_REG) + ClearIni(); if((CacheEntry > 0) && (CacheSave == YES)) SaveCache(); @@ -2127,7 +2178,9 @@ void DoubleClickProc(int Win, int Mode, int App) if(Win == WIN_LOCAL) { - if((App != -1) || (Type == NODE_FILE)) + // ローカルフォルダを開く +// if((App != -1) || (Type == NODE_FILE)) + if((App != -1) || (Type == NODE_FILE) || (Mode == YES)) { if((DclickOpen == YES) || (Mode == YES)) { @@ -2204,12 +2257,12 @@ void DoubleClickProc(int Win, int Mode, int App) /* 不正なパスを検出 */ if(CheckPathViolation(&MainTransPkt) == NO) { -// if((Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429) +// if((Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429) // { // ReConnectCmdSkt(); // 同時接続対応 CancelFlg = NO; - Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg); + Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg); // } } @@ -2573,6 +2626,13 @@ void ExecViewer(char *Fname, int App) DoPrintf("ShellExecute - %s", Fname); ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW); } + // ローカルフォルダを開く + else if((App == -1) && (GetFileAttributes(Fname) & FILE_ATTRIBUTE_DIRECTORY)) + { + MakeDistinguishableFileName(ComLine, Fname); + DoPrintf("ShellExecute - %s", Fname); + ShellExecute(NULL, "open", ComLine, NULL, Fname, SW_SHOW); + } else { App = max1(0, App); @@ -3069,7 +3129,7 @@ BOOL LoadSSLRootCAFile() for(i = 0; i < 5; i++) Hash[i] = _byteswap_ulong(Hash[i]); // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること - if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xF0\x1B\x48\x26\x67\x44\x3A\xFF\x0A\x16\xD3\xBB\x8A\x33\xEB\x70\x6D\x75\xA6\x0D", 20) == 0 + if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x63\xAC\x6C\x43\xCE\xD6\x5B\xCF\x33\xB9\x45\x70\xC3\x9B\x8C\x91\x19\x0D\xEF\xE6", 20) == 0 || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) { memcpy(&SSLRootCAFileHash, &Hash, 20); @@ -3098,3 +3158,21 @@ int AskDispFileIcon(void) return(DispFileIcon); } +// ポータブル版判定 +void CheckPortableVersion() +{ + HANDLE hFile; + if((hFile = CreateFile(PortableFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) + { + PortableVersion = YES; + CloseHandle(hFile); + } + else + PortableVersion = NO; +} + +int AskPortableVersion(void) +{ + return(PortableVersion); +} +