FFFTPのソースコードです。
Revisión | 7cb12f483de9b9744b4435a7720da9110446bfdf (tree) |
---|---|
Tiempo | 2014-01-11 18:47:44 |
Autor | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Change the algorithm to encrypt all settings.
Add a confirmation when the settings of a future version exist.
Modify documents.
@@ -1802,6 +1802,8 @@ int LoadSettingsFromFile(void); | ||
1802 | 1802 | // ポータブル版判定 |
1803 | 1803 | int IsRegAvailable(); |
1804 | 1804 | int IsIniAvailable(); |
1805 | +// バージョン確認 | |
1806 | +int ReadSettingsVersion(); | |
1805 | 1807 | |
1806 | 1808 | /*===== lvtips.c =====*/ |
1807 | 1809 |
@@ -49,6 +49,9 @@ Changes in Ver.1.99 | ||
49 | 49 | |
50 | 50 | -- Fixed bugs of Select dialog. |
51 | 51 | |
52 | +-- Changed to confirm how the settings will be saved when the settings of a | |
53 | + future version exist in the registry. | |
54 | + | |
52 | 55 | |
53 | 56 | Outline |
54 | 57 | ------- |
@@ -21,6 +21,9 @@ Changes in Ver.1.99 | ||
21 | 21 | |
22 | 22 | -- Fixed bugs of Select dialog. |
23 | 23 | |
24 | +-- Changed to confirm how the settings will be saved when the settings of a | |
25 | + future version exist in the registry. | |
26 | + | |
24 | 27 | Changes in Ver.1.98g |
25 | 28 | -------------------- |
26 | 29 |
@@ -53,6 +53,9 @@ Ver 1.99 | ||
53 | 53 | |
54 | 54 | ・選択ダイアログが正常に機能しないバグを修正しました。 |
55 | 55 | |
56 | +・レジストリに将来のバージョンの設定が存在する場合に設定の保存方法を | |
57 | + 確認するようにしました。 | |
58 | + | |
56 | 59 | |
57 | 60 | Ver 1.96d以前へ戻す場合 |
58 | 61 | ----------------------- |
@@ -25,6 +25,9 @@ FFFTP | ||
25 | 25 | |
26 | 26 | ・選択ダイアログが正常に機能しないバグを修正しました。 |
27 | 27 | |
28 | +・レジストリに将来のバージョンの設定が存在する場合に設定の保存方法を | |
29 | + 確認するようにしました。 | |
30 | + | |
28 | 31 | ■Ver 1.98g |
29 | 32 | |
30 | 33 | ・Windows 8 (32bit/64bit)で動作を確認しました。 |
@@ -265,6 +265,8 @@ int EncryptAllSettings = NO; | ||
265 | 265 | int AutoRefreshFileList = YES; |
266 | 266 | // 古い処理内容を消去 |
267 | 267 | int RemoveOldLog = NO; |
268 | +// バージョン確認 | |
269 | +int ReadOnlySettings = NO; | |
268 | 270 | |
269 | 271 | |
270 | 272 |
@@ -500,13 +502,33 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) | ||
500 | 502 | if(IsRegAvailable() == YES && IsIniAvailable() == NO) |
501 | 503 | { |
502 | 504 | if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) |
503 | - { | |
504 | 505 | ImportPortable = YES; |
505 | - ForceIni = NO; | |
506 | - RegType = REGTYPE_REG; | |
506 | + } | |
507 | + } | |
508 | + // バージョン確認 | |
509 | + if(ReadSettingsVersion() > VER_NUM) | |
510 | + { | |
511 | + if(IsRegAvailable() == YES && IsIniAvailable() == NO) | |
512 | + { | |
513 | + switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2)) | |
514 | + { | |
515 | + case IDCANCEL: | |
516 | + ReadOnlySettings = YES; | |
517 | + break; | |
518 | + case IDYES: | |
519 | + break; | |
520 | + case IDNO: | |
521 | + ImportPortable = YES; | |
522 | + break; | |
507 | 523 | } |
508 | 524 | } |
509 | 525 | } |
526 | + // ポータブル版判定 | |
527 | + if(ImportPortable == YES) | |
528 | + { | |
529 | + ForceIni = NO; | |
530 | + RegType = REGTYPE_REG; | |
531 | + } | |
510 | 532 | |
511 | 533 | // AllocConsole(); |
512 | 534 |
@@ -349,6 +349,7 @@ | ||
349 | 349 | #define MSGJPN348 _Tu8("EUC", "EUC") |
350 | 350 | #define MSGJPN349 _Tu8("UTF-8", "UTF-8") |
351 | 351 | #define MSGJPN350 _Tu8("UTF-8 HFS+", "UTF-8 HFS+") |
352 | +#define MSGJPN351 _Tu8("The settings of a newer version are detected.\nThe settings may not be read correctly, or they will be changed when they are overwritten for this version.\nChoose 'Yes' to overwrite settings for this version.\nChoose 'No' to save settings to the INI file.\nChoose 'Cancel' to load settings as read only.", "The settings of a newer version are detected.\nThe settings may not be read correctly, or they will be changed when they are overwritten for this version.\nChoose 'Yes' to overwrite settings for this version.\nChoose 'No' to save settings to the INI file.\nChoose 'Cancel' to load settings as read only.") | |
352 | 353 | #if defined(HAVE_TANDEM) |
353 | 354 | #define MSGJPN2000 _Tu8("NonStop Server", "NonStop Server") |
354 | 355 | #define MSGJPN2001 _Tu8("OSS<->GUARDIAN Switch(&O)", "OSS<->GUARDIAN Switch(&O)") |
@@ -349,6 +349,7 @@ | ||
349 | 349 | #define MSGJPN348 _Tu8("EUC", "EUC") |
350 | 350 | #define MSGJPN349 _Tu8("UTF-8", "UTF-8") |
351 | 351 | #define MSGJPN350 _Tu8("UTF-8 HFS+", "UTF-8 HFS+") |
352 | +#define MSGJPN351 _Tu8("新しいバージョンの設定が検出されました.\nこのバージョンでは一部の設定が正しく読み込まれない、またはこのバージョンで設定を上書きすると設定が変化する可能性があります.\nこのバージョン用に設定を上書きして保存するには「はい」を選択してください.\n設定をレジストリではなくINIファイルに保存するには「いいえ」を選択してください.\n読み取り専用で設定を読み込むには「キャンセル」を選択してください.", "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xA4\x9C\xE5\x87\xBA\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE3\x81\xAF\xE4\xB8\x80\xE9\x83\xA8\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xAD\xA3\xE3\x81\x97\xE3\x81\x8F\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x81\xBE\xE3\x82\x8C\xE3\x81\xAA\xE3\x81\x84\xE3\x80\x81\xE3\x81\xBE\xE3\x81\x9F\xE3\x81\xAF\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xA8\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE5\xA4\x89\xE5\x8C\x96\xE3\x81\x99\xE3\x82\x8B\xE5\x8F\xAF\xE8\x83\xBD\xE6\x80\xA7\xE3\x81\x8C\xE3\x81\x82\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE7\x94\xA8\xE3\x81\xAB\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x97\xE3\x81\xA6\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\xAF\xE3\x81\x84\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE3\x83\xAC\xE3\x82\xB8\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xAA\xE3\x81\xA7\xE3\x81\xAF\xE3\x81\xAA\xE3\x81\x8FINI\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE3\x81\xAB\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\x84\xE3\x81\x84\xE3\x81\x88\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xAA\xAD\xE3\x81\xBF\xE5\x8F\x96\xE3\x82\x8A\xE5\xB0\x82\xE7\x94\xA8\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x82\x80\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x82\xAD\xE3\x83\xA3\xE3\x83\xB3\xE3\x82\xBB\xE3\x83\xAB\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.") | |
352 | 353 | #if defined(HAVE_TANDEM) |
353 | 354 | #define MSGJPN2000 _Tu8("NonStop Server", "NonStop Server") |
354 | 355 | #define MSGJPN2001 _Tu8("OSS<->GUARDIAN 切り替え(&O)", "OSS<->GUARDIAN \xE5\x88\x87\xE3\x82\x8A\xE6\x9B\xBF\xE3\x81\x88(&O)") |
@@ -221,6 +221,8 @@ extern int EncryptAllSettings; | ||
221 | 221 | extern int AutoRefreshFileList; |
222 | 222 | // 古い処理内容を消去 |
223 | 223 | extern int RemoveOldLog; |
224 | +// バージョン確認 | |
225 | +extern int ReadOnlySettings; | |
224 | 226 | |
225 | 227 | /*----- マスタパスワードの設定 ---------------------------------------------- |
226 | 228 | * |
@@ -350,6 +352,10 @@ void SaveRegistry(void) | ||
350 | 352 | if(EncryptSettingsError == YES) |
351 | 353 | return; |
352 | 354 | |
355 | + // バージョン確認 | |
356 | + if(ReadOnlySettings == YES) | |
357 | + return; | |
358 | + | |
353 | 359 | SetRegType(RegType); |
354 | 360 | if(CreateReg("FFFTP", &hKey3) == FFFTP_SUCCESS) |
355 | 361 | { |
@@ -372,7 +378,13 @@ void SaveRegistry(void) | ||
372 | 378 | EncryptSettings = EncryptAllSettings; |
373 | 379 | memset(&EncryptSettingsChecksum, 0, 20); |
374 | 380 | |
375 | - if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS) | |
381 | + // 全設定暗号化対応 | |
382 | +// if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS) | |
383 | + if(EncryptAllSettings == YES) | |
384 | + strcpy(Str, "EncryptedOptions"); | |
385 | + else | |
386 | + strcpy(Str, "Options"); | |
387 | + if(CreateSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS) | |
376 | 388 | { |
377 | 389 | WriteIntValueToReg(hKey4, "NoSave", SuppressSave); |
378 | 390 |
@@ -683,6 +695,29 @@ void SaveRegistry(void) | ||
683 | 695 | // 全設定暗号化対応 |
684 | 696 | EncryptSettings = NO; |
685 | 697 | WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20); |
698 | + if(EncryptAllSettings == YES) | |
699 | + { | |
700 | + if(RegType == REGTYPE_REG) | |
701 | + { | |
702 | + if(RegCreateKeyEx(hKey3, "Options", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, (HKEY*)&hKey4, NULL) == ERROR_SUCCESS) | |
703 | + { | |
704 | + for(i = 0; ; i++) | |
705 | + { | |
706 | + sprintf(Str, "Host%d", i); | |
707 | + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) | |
708 | + break; | |
709 | + } | |
710 | + for(i = 0; ; i++) | |
711 | + { | |
712 | + sprintf(Str, "History%d", i); | |
713 | + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) | |
714 | + break; | |
715 | + } | |
716 | + RegCloseKey(hKey4); | |
717 | + } | |
718 | + RegDeleteKey(hKey3, "Options"); | |
719 | + } | |
720 | + } | |
686 | 721 | CloseReg(hKey3); |
687 | 722 | } |
688 | 723 | return; |
@@ -773,7 +808,13 @@ int LoadRegistry(void) | ||
773 | 808 | } |
774 | 809 | } |
775 | 810 | |
776 | - if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS) | |
811 | + // 全設定暗号化対応 | |
812 | +// if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS) | |
813 | + if(EncryptAllSettings == YES) | |
814 | + strcpy(Str, "EncryptedOptions"); | |
815 | + else | |
816 | + strcpy(Str, "Options"); | |
817 | + if(OpenSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS) | |
777 | 818 | { |
778 | 819 | ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX); |
779 | 820 | ReadIntValueFromReg(hKey4, "WinPosY", &WinPosY); |
@@ -1277,6 +1318,24 @@ void ClearRegistry(void) | ||
1277 | 1318 | RegCloseKey(hKey4); |
1278 | 1319 | } |
1279 | 1320 | RegDeleteKey(hKey3, "Options"); |
1321 | + // 全設定暗号化対応 | |
1322 | + if(RegCreateKeyEx(hKey3, "EncryptedOptions", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS) | |
1323 | + { | |
1324 | + for(i = 0; ; i++) | |
1325 | + { | |
1326 | + sprintf(Str, "Host%d", i); | |
1327 | + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) | |
1328 | + break; | |
1329 | + } | |
1330 | + for(i = 0; ; i++) | |
1331 | + { | |
1332 | + sprintf(Str, "History%d", i); | |
1333 | + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) | |
1334 | + break; | |
1335 | + } | |
1336 | + RegCloseKey(hKey4); | |
1337 | + } | |
1338 | + RegDeleteKey(hKey3, "EncryptedOptions"); | |
1280 | 1339 | RegCloseKey(hKey3); |
1281 | 1340 | } |
1282 | 1341 | RegDeleteKey(hKey2, "FFFTP"); |
@@ -3186,6 +3245,7 @@ DWORD GetRandamDWRODValue(void) | ||
3186 | 3245 | } |
3187 | 3246 | |
3188 | 3247 | // 全設定暗号化対応 |
3248 | +// 内部状態推定対策としてハッシュの160ビットのうち80ビットのみを鍵として使用 | |
3189 | 3249 | void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero) |
3190 | 3250 | { |
3191 | 3251 | char Key[FMAX_PATH*2+1]; |
@@ -3193,23 +3253,23 @@ void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, | ||
3193 | 3253 | DWORD i; |
3194 | 3254 | DWORD j; |
3195 | 3255 | ulong Hash[5]; |
3196 | - BYTE Mask[20]; | |
3256 | + BYTE Mask[10]; | |
3197 | 3257 | memcpy(&Key[0], SecretKey, SecretKeyLength); |
3198 | 3258 | memcpy(&Key[SecretKeyLength], Salt, SaltLength); |
3199 | 3259 | p = (BYTE*)Data; |
3200 | 3260 | for(i = 0; i < Size; i++) |
3201 | 3261 | { |
3202 | - if(i % 20 == 0) | |
3262 | + if(i % 10 == 0) | |
3203 | 3263 | { |
3204 | 3264 | memcpy(&Key[SecretKeyLength + SaltLength], &i, 4); |
3205 | 3265 | sha_memory(Key, SecretKeyLength + SaltLength + 4, Hash); |
3206 | 3266 | // sha.cはビッグエンディアンのため |
3207 | 3267 | for(j = 0; j < 5; j++) |
3208 | 3268 | Hash[j] = _byteswap_ulong(Hash[j]); |
3209 | - memcpy(&Mask, &Hash, 20); | |
3269 | + memcpy(&Mask, &Hash, 10); | |
3210 | 3270 | } |
3211 | - if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 20])) | |
3212 | - p[i] ^= Mask[i % 20]; | |
3271 | + if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 10])) | |
3272 | + p[i] ^= Mask[i % 10]; | |
3213 | 3273 | } |
3214 | 3274 | } |
3215 | 3275 |
@@ -3261,3 +3321,28 @@ int IsIniAvailable() | ||
3261 | 3321 | return Sts; |
3262 | 3322 | } |
3263 | 3323 | |
3324 | +// バージョン確認 | |
3325 | +int ReadSettingsVersion() | |
3326 | +{ | |
3327 | + void *hKey3; | |
3328 | + int i; | |
3329 | + int Version; | |
3330 | + | |
3331 | + SetRegType(REGTYPE_INI); | |
3332 | + if((i = OpenReg("FFFTP", &hKey3)) != FFFTP_SUCCESS) | |
3333 | + { | |
3334 | + if(AskForceIni() == NO) | |
3335 | + { | |
3336 | + SetRegType(REGTYPE_REG); | |
3337 | + i = OpenReg("FFFTP", &hKey3); | |
3338 | + } | |
3339 | + } | |
3340 | + Version = INT_MAX; | |
3341 | + if(i == FFFTP_SUCCESS) | |
3342 | + { | |
3343 | + ReadIntValueFromReg(hKey3, "Version", &Version); | |
3344 | + CloseReg(hKey3); | |
3345 | + } | |
3346 | + return Version; | |
3347 | +} | |
3348 | + |