\r
DWORD GetRandamDWRODValue(void);\r
\r
+// 全設定暗号化対応\r
+void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
+void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
+void CalculateSettingsDataChecksum(void* Data, DWORD Size);\r
+\r
/* 2010.01.30 genta 追加 */\r
static char SecretKey[FMAX_PATH+1];\r
static int SecretKeyLength;\r
// UTF-8対応\r
static int IniKanjiCode = KANJI_NOCNV;\r
\r
+// 全設定暗号化対応\r
+static int EncryptSettings = NO;\r
+static BYTE EncryptSettingsChecksum[20];\r
+static int EncryptSettingsError = NO;\r
+\r
/*===== 外部参照 =====*/\r
\r
/* 設定値 */\r
extern int FwallType;\r
extern int FwallDefault;\r
extern int FwallSecurity;\r
-extern int FwallResolv;\r
+extern int FwallResolve;\r
extern int FwallLower;\r
extern int FwallDelimiter;\r
extern int PasvDefault;\r
extern BYTE SSLRootCAFileHash[20];\r
// ファイルアイコン表示対応\r
extern int DispFileIcon;\r
+// タイムスタンプのバグ修正\r
+extern int DispTimeSeconds;\r
+// ファイルの属性を数字で表示\r
+extern int DispPermissionsNumber;\r
+// ディレクトリ自動作成\r
+extern int MakeAllDir;\r
+// UTF-8対応\r
+extern int LocalKanjiCode;\r
+// UPnP対応\r
+extern int UPnPEnabled;\r
+// 全設定暗号化対応\r
+extern int EncryptAllSettings;\r
+// ローカル側自動更新\r
+extern int AutoRefreshFileList;\r
+// 古い処理内容を消去\r
+extern int RemoveOldLog;\r
+// バージョン確認\r
+extern int ReadOnlySettings;\r
\r
/*----- マスタパスワードの設定 ----------------------------------------------\r
*\r
IsMasterPasswordError = PASSWORD_OK;\r
}\r
\r
+// セキュリティ強化\r
+void GetMasterPassword(char* Password)\r
+{\r
+ strcpy(Password, SecretKey);\r
+}\r
+\r
/*----- マスタパスワードの状態取得 ----------------------------------------------\r
*\r
* Parameter\r
* なし\r
*----------------------------------------------------------------------------*/\r
\r
-void SaveRegistory(void)\r
+void SaveRegistry(void)\r
{\r
void *hKey3;\r
void *hKey4;\r
return;\r
}\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettingsError == YES)\r
+ return;\r
+\r
+ // バージョン確認\r
+ if(ReadOnlySettings == YES)\r
+ return;\r
+\r
SetRegType(RegType);\r
if(CreateReg("FFFTP", &hKey3) == FFFTP_SUCCESS)\r
{\r
CreatePasswordHash( SecretKey, SecretKeyLength, buf );\r
WriteStringToReg(hKey3, "CredentialCheck", buf);\r
\r
- if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+ // 全設定暗号化対応\r
+ WriteIntValueToReg(hKey3, "EncryptAll", EncryptAllSettings);\r
+ sprintf(Buf, "%d", EncryptAllSettings);\r
+ EncodePassword(Buf, Str);\r
+ WriteStringToReg(hKey3, "EncryptAllDetector", Str);\r
+ EncryptSettings = EncryptAllSettings;\r
+ memset(&EncryptSettingsChecksum, 0, 20);\r
+\r
+ // 全設定暗号化対応\r
+// if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+ if(EncryptAllSettings == YES)\r
+ strcpy(Str, "EncryptedOptions");\r
+ else\r
+ strcpy(Str, "Options");\r
+ if(CreateSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
{\r
WriteIntValueToReg(hKey4, "NoSave", SuppressSave);\r
\r
WriteIntValueToReg(hKey4, "FwallDef", FwallDefault);\r
WriteIntValueToReg(hKey4, "FwallSec", FwallSecurity);\r
WriteIntValueToReg(hKey4, "PasvDef", PasvDefault);\r
- WriteIntValueToReg(hKey4, "FwallRes", FwallResolv);\r
+ WriteIntValueToReg(hKey4, "FwallRes", FwallResolve);\r
WriteIntValueToReg(hKey4, "FwallLow", FwallLower);\r
WriteIntValueToReg(hKey4, "FwallDel", FwallDelimiter);\r
\r
// 再転送対応\r
SaveIntNum(hKey5, "ErrMode", Hist.TransferErrorMode, DefaultHist.TransferErrorMode);\r
SaveIntNum(hKey5, "ErrNotify", Hist.TransferErrorNotify, DefaultHist.TransferErrorNotify);\r
+ // セッションあたりの転送量制限対策\r
+ SaveIntNum(hKey5, "ErrReconnect", Hist.TransferErrorReconnect, DefaultHist.TransferErrorReconnect);\r
\r
CloseSubKey(hKey5);\r
n++;\r
// 再転送対応\r
SaveIntNum(hKey5, "ErrMode", Host.TransferErrorMode, DefaultHost.TransferErrorMode);\r
SaveIntNum(hKey5, "ErrNotify", Host.TransferErrorNotify, DefaultHost.TransferErrorNotify);\r
+ // セッションあたりの転送量制限対策\r
+ SaveIntNum(hKey5, "ErrReconnect", Host.TransferErrorReconnect, DefaultHost.TransferErrorReconnect);\r
}\r
CloseSubKey(hKey5);\r
}\r
WriteStringToReg(hKey4, "RootCertHash", Str);\r
// ファイルアイコン表示対応\r
WriteIntValueToReg(hKey4, "ListIcon", DispFileIcon);\r
+ // タイムスタンプのバグ修正\r
+ WriteIntValueToReg(hKey4, "ListSecond", DispTimeSeconds);\r
+ // ファイルの属性を数字で表示\r
+ WriteIntValueToReg(hKey4, "ListPermitNum", DispPermissionsNumber);\r
+ // ディレクトリ自動作成\r
+ WriteIntValueToReg(hKey4, "MakeDir", MakeAllDir);\r
+ // UTF-8対応\r
+ WriteIntValueToReg(hKey4, "Kanji", LocalKanjiCode);\r
+ // UPnP対応\r
+ WriteIntValueToReg(hKey4, "UPnP", UPnPEnabled);\r
+ // ローカル側自動更新\r
+ WriteIntValueToReg(hKey4, "ListRefresh", AutoRefreshFileList);\r
+ // 古い処理内容を消去\r
+ WriteIntValueToReg(hKey4, "OldLog", RemoveOldLog);\r
}\r
CloseSubKey(hKey4);\r
}\r
+ // 全設定暗号化対応\r
+ EncryptSettings = NO;\r
+ WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20);\r
+ if(EncryptAllSettings == YES)\r
+ {\r
+ if(RegType == REGTYPE_REG)\r
+ {\r
+ if(RegCreateKeyEx(hKey3, "Options", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, (HKEY*)&hKey4, NULL) == ERROR_SUCCESS)\r
+ {\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "Host%d", i);\r
+ if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+ break;\r
+ }\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "History%d", i);\r
+ if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+ break;\r
+ }\r
+ RegCloseKey(hKey4);\r
+ }\r
+ RegDeleteKey(hKey3, "Options");\r
+ }\r
+ }\r
CloseReg(hKey3);\r
}\r
return;\r
* NO: 読み出し失敗(設定無し)\r
*----------------------------------------------------------------------------*/\r
\r
-int LoadRegistory(void)\r
+int LoadRegistry(void)\r
{\r
void *hKey3;\r
void *hKey4;\r
// char Str[256]; /* ASCII_EXT_LENより大きい事 */\r
char Str[PRIVATE_KEY_LEN*4+1];\r
char Buf[FMAX_PATH+1];\r
+ // 全設定暗号化対応\r
+ char Buf2[FMAX_PATH+1];\r
char *Pos;\r
char *Pos2;\r
HOSTDATA Host;\r
HISTORYDATA Hist;\r
int Sts;\r
int Version;\r
+ // 全設定暗号化対応\r
+ BYTE Checksum[20];\r
\r
Sts = NO;\r
\r
if(Version < 1980)\r
IniKanjiCode = KANJI_SJIS;\r
\r
- if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+ // 全設定暗号化対応\r
+ if(Version >= 1990)\r
+ {\r
+ ReadIntValueFromReg(hKey3, "EncryptAll", &EncryptAllSettings);\r
+ sprintf(Buf, "%d", EncryptAllSettings);\r
+ ReadStringFromReg(hKey3, "EncryptAllDetector", Str, 255);\r
+ DecodePassword(Str, Buf2);\r
+ EncryptSettings = EncryptAllSettings;\r
+ memset(&EncryptSettingsChecksum, 0, 20);\r
+ if(strcmp(Buf, Buf2) != 0)\r
+ {\r
+ switch(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\r
+ {\r
+ case IDABORT:\r
+ CloseReg(hKey3);\r
+ ClearRegistry();\r
+ ClearIni();\r
+ RestartAndTerminate();\r
+ break;\r
+ case IDRETRY:\r
+ EncryptSettingsError = YES;\r
+ break;\r
+ case IDIGNORE:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ // 全設定暗号化対応\r
+// if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+ if(EncryptAllSettings == YES)\r
+ strcpy(Str, "EncryptedOptions");\r
+ else\r
+ strcpy(Str, "Options");\r
+ if(OpenSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
{\r
ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX);\r
ReadIntValueFromReg(hKey4, "WinPosY", &WinPosY);\r
if(ReadMultiStringFromReg(hKey4, "AsciiFile", AsciiExt, ASCII_EXT_LEN+1) == FFFTP_FAIL)\r
{\r
/* 旧ASCIIモードの拡張子の設定を新しいものに変換 */\r
- ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1);\r
- memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
+ // アスキーモード判別の改良\r
+// ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1);\r
+// memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
+ Str[0] = NUL;\r
+ if(ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1) == FFFTP_SUCCESS)\r
+ memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
Pos = Str;\r
while(*Pos != NUL)\r
{\r
Pos++;\r
}\r
}\r
+ // アスキーモード判別の改良\r
+ if(Version < 1986)\r
+ {\r
+ Pos = "*.js\0*.vbs\0*.css\0*.rss\0*.rdf\0*.xml\0*.xhtml\0*.xht\0*.shtml\0*.shtm\0*.sh\0*.py\0*.rb\0*.properties\0*.sql\0*.asp\0*.aspx\0*.php\0*.htaccess\0";\r
+ while(*Pos != NUL)\r
+ {\r
+ Pos2 = AsciiExt;\r
+ while(*Pos2 != NUL)\r
+ {\r
+ if(_stricmp(Pos2, Pos) == 0)\r
+ break;\r
+ Pos2 = strchr(Pos2, NUL) + 1;\r
+ }\r
+ if(*Pos2 == NUL)\r
+ {\r
+ if((StrMultiLen(AsciiExt) + strlen(Pos) + 2) < ASCII_EXT_LEN)\r
+ strncpy(AsciiExt + StrMultiLen(AsciiExt), Pos, strlen(Pos) + 2);\r
+ }\r
+ Pos = strchr(Pos, NUL) + 1;\r
+ }\r
+ }\r
\r
ReadIntValueFromReg(hKey4, "LowUp", &FnameCnv);\r
ReadIntValueFromReg(hKey4, "Tout", &TimeOut);\r
ReadIntValueFromReg(hKey4, "FwallDef", &FwallDefault);\r
ReadIntValueFromReg(hKey4, "FwallSec", &FwallSecurity);\r
ReadIntValueFromReg(hKey4, "PasvDef", &PasvDefault);\r
- ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolv);\r
+ ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolve);\r
ReadIntValueFromReg(hKey4, "FwallLow", &FwallLower);\r
ReadIntValueFromReg(hKey4, "FwallDel", &FwallDelimiter);\r
\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
+ // 1.98d以前で同時接続数が1より大きい場合はソケットの再利用なし\r
+ if(Version < 1985)\r
+ {\r
+ if(Host.MaxThreadCount > 1)\r
+ Host.ReuseCmdSkt = NO;\r
+ }\r
// MLSD対応\r
ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
// IPv6対応\r
// 再転送対応\r
ReadIntValueFromReg(hKey5, "ErrMode", &Host.TransferErrorMode);\r
ReadIntValueFromReg(hKey5, "ErrNotify", &Host.TransferErrorNotify);\r
+ // セッションあたりの転送量制限対策\r
+ ReadIntValueFromReg(hKey5, "ErrReconnect", &Host.TransferErrorReconnect);\r
\r
CloseSubKey(hKey5);\r
\r
StrReadIn(Buf, sizeof(SSLRootCAFileHash), (char*)&SSLRootCAFileHash);\r
// ファイルアイコン表示対応\r
ReadIntValueFromReg(hKey4, "ListIcon", &DispFileIcon);\r
+ // タイムスタンプのバグ修正\r
+ ReadIntValueFromReg(hKey4, "ListSecond", &DispTimeSeconds);\r
+ // ファイルの属性を数字で表示\r
+ ReadIntValueFromReg(hKey4, "ListPermitNum", &DispPermissionsNumber);\r
+ // ディレクトリ自動作成\r
+ ReadIntValueFromReg(hKey4, "MakeDir", &MakeAllDir);\r
+ // UTF-8対応\r
+ ReadIntValueFromReg(hKey4, "Kanji", &LocalKanjiCode);\r
+ // UPnP対応\r
+ ReadIntValueFromReg(hKey4, "UPnP", &UPnPEnabled);\r
+ // ローカル側自動更新\r
+ ReadIntValueFromReg(hKey4, "ListRefresh", &AutoRefreshFileList);\r
+ // 古い処理内容を消去\r
+ ReadIntValueFromReg(hKey4, "OldLog", &RemoveOldLog);\r
\r
CloseSubKey(hKey4);\r
}\r
+ // 全設定暗号化対応\r
+ EncryptSettings = NO;\r
+ if(Version >= 1990)\r
+ {\r
+ memset(&Checksum, 0, 20);\r
+ ReadBinaryFromReg(hKey3, "EncryptAllChecksum", &Checksum, 20);\r
+ if(memcmp(&Checksum, &EncryptSettingsChecksum, 20) != 0)\r
+ {\r
+ switch(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\r
+ {\r
+ case IDABORT:\r
+ CloseReg(hKey3);\r
+ ClearRegistry();\r
+ ClearIni();\r
+ RestartAndTerminate();\r
+ break;\r
+ case IDRETRY:\r
+ EncryptSettingsError = YES;\r
+ break;\r
+ case IDIGNORE:\r
+ break;\r
+ }\r
+ }\r
+ }\r
CloseReg(hKey3);\r
}\r
else\r
* YES/NO=設定無し\r
*----------------------------------------------------------------------------*/\r
\r
-DWORD LoadHideDriveListRegistory(void)\r
+DWORD LoadHideDriveListRegistry(void)\r
{\r
HKEY hKey1;\r
HKEY hKey2;\r
* なし\r
*----------------------------------------------------------------------------*/\r
\r
-void ClearRegistory(void)\r
+void ClearRegistry(void)\r
{\r
HKEY hKey2;\r
HKEY hKey3;\r
RegCloseKey(hKey4);\r
}\r
RegDeleteKey(hKey3, "Options");\r
+ // 全設定暗号化対応\r
+ if(RegCreateKeyEx(hKey3, "EncryptedOptions", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS)\r
+ {\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "Host%d", i);\r
+ if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+ break;\r
+ }\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "History%d", i);\r
+ if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+ break;\r
+ }\r
+ RegCloseKey(hKey4);\r
+ }\r
+ RegDeleteKey(hKey3, "EncryptedOptions");\r
RegCloseKey(hKey3);\r
}\r
RegDeleteKey(hKey2, "FFFTP");\r
}\r
\r
\r
+// ポータブル版判定\r
+void ClearIni(void)\r
+{\r
+// FILE *Strm;\r
+// if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
+// {\r
+// fclose(Strm);\r
+// MoveFileToTrashCan(AskIniFilePath());\r
+// }\r
+ DeleteFile(AskIniFilePath());\r
+ return;\r
+}\r
+\r
+\r
/*----- 設定をファイルに保存 --------------------------------------------------\r
*\r
* Parameter\r
{\r
REGDATATBL *Pos;\r
REGDATATBL *Next;\r
- FILE *Strm;\r
+ // ポータブル版判定\r
+// FILE *Strm;\r
\r
if(TmpRegType == REGTYPE_REG)\r
{\r
RegCloseKey(Handle);\r
\r
/* INIファイルを削除 */\r
- if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
- {\r
- fclose(Strm);\r
- MoveFileToTrashCan(AskIniFilePath());\r
- }\r
+ // ポータブル版判定\r
+// if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
+// {\r
+// fclose(Strm);\r
+// MoveFileToTrashCan(AskIniFilePath());\r
+// }\r
}\r
else\r
{\r
if(WriteOutRegToFile(Handle) == TRUE)\r
{\r
// /* レジストリをクリア */\r
-// ClearRegistory();\r
+// ClearRegistry();\r
}\r
}\r
/* テーブルを削除 */\r
\r
Sts = FFFTP_FAIL;\r
*Handle = NULL;\r
+ // バグ修正\r
+ New = NULL;\r
\r
if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
{\r
{\r
if((Tmp = strchr(Buf, ']')) != NULL)\r
*Tmp = NUL;\r
- strcpy(New->KeyName, Buf+1);\r
+ // バグ修正\r
+// strcpy(New->KeyName, Buf+1);\r
+ strncpy(New->KeyName, Buf+1, 80);\r
+ New->KeyName[80] = NUL;\r
New->ValLen = 0;\r
New->Next = NULL;\r
Data = New->ValTbl;\r
}\r
else if(strlen(Buf) > 0)\r
{\r
- strcpy(Data, Buf);\r
- Data += strlen(Buf) + 1;\r
- New->ValLen += strlen(Buf) + 1;\r
+ // バグ修正\r
+// strcpy(Data, Buf);\r
+// Data += strlen(Buf) + 1;\r
+// New->ValLen += strlen(Buf) + 1;\r
+ if(Data != NULL && New != NULL)\r
+ {\r
+ if(New->ValLen + strlen(Buf) + 1 <= REG_SECT_MAX)\r
+ {\r
+ strcpy(Data, Buf);\r
+ Data += strlen(Buf) + 1;\r
+ New->ValLen += strlen(Buf) + 1;\r
+ }\r
+ }\r
}\r
}\r
}\r
Sts = FFFTP_SUCCESS;\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Value, sizeof(int), NO);\r
+ CalculateSettingsDataChecksum(Value, sizeof(int));\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
char *Data;\r
char Tmp[20];\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), &Value, sizeof(int), NO);\r
if(TmpRegType == REGTYPE_REG)\r
RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
else\r
strcat(Data, Tmp);\r
Pos->ValLen += strlen(Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), &Value, sizeof(int), NO);\r
+ CalculateSettingsDataChecksum(&Value, sizeof(int));\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
TempSize = StrReadIn(Pos, TempSize, Str);\r
*(Str + TempSize) = NUL;\r
Sts = FFFTP_SUCCESS;\r
- if(!CheckStringM(Str))\r
- break;\r
- // UTF-8ではない可能性がある\r
- // Shift_JISとみなす\r
+ break;\r
case KANJI_SJIS:\r
if(pa0 = AllocateStringA(Size * 4))\r
{\r
}\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
REGDATATBL *Pos;\r
char *Data;\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\r
if(TmpRegType == REGTYPE_REG)\r
- RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
+ // 全設定暗号化対応\r
+// RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
+ RegSetValueEx(Handle, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
else\r
{\r
Pos = (REGDATATBL *)Handle;\r
Data = Pos->ValTbl + Pos->ValLen;\r
Pos->ValLen += StrCatOut(Str, strlen(Str), Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
*(Str + TempSize) = NUL;\r
*(Str + TempSize + 1) = NUL;\r
Sts = FFFTP_SUCCESS;\r
- if(!CheckMultiStringM(Str))\r
- break;\r
- // UTF-8ではない可能性がある\r
- // Shift_JISとみなす\r
+ break;\r
case KANJI_SJIS:\r
if(pa0 = AllocateStringA(Size * 4))\r
{\r
}\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
REGDATATBL *Pos;\r
char *Data;\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\r
if(TmpRegType == REGTYPE_REG)\r
- RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
+ // 全設定暗号化対応\r
+// RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
+ RegSetValueEx(Handle, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
else\r
{\r
Pos = (REGDATATBL *)Handle;\r
Data = Pos->ValTbl + Pos->ValLen;\r
Pos->ValLen += StrCatOut(Str, StrMultiLen(Str), Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
Sts = FFFTP_SUCCESS;\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Bin, Size, NO);\r
+ CalculateSettingsDataChecksum(Bin, Size);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
REGDATATBL *Pos;\r
char *Data;\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), Bin, Len, NO);\r
if(TmpRegType == REGTYPE_REG)\r
RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
else\r
Data = Pos->ValTbl + Pos->ValLen;\r
Pos->ValLen += StrCatOut(Bin, Len, Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Bin, Len, NO);\r
+ CalculateSettingsDataChecksum(Bin, Len);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
}\r
return rndValue;\r
}\r
+\r
+// 全設定暗号化対応\r
+// 内部状態推定対策としてハッシュの160ビットのうち80ビットのみを鍵として使用\r
+void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
+{\r
+ char Key[FMAX_PATH*2+1];\r
+ BYTE* p;\r
+ DWORD i;\r
+ DWORD j;\r
+ ulong Hash[5];\r
+ BYTE Mask[10];\r
+ memcpy(&Key[0], SecretKey, SecretKeyLength);\r
+ memcpy(&Key[SecretKeyLength], Salt, SaltLength);\r
+ p = (BYTE*)Data;\r
+ for(i = 0; i < Size; i++)\r
+ {\r
+ if(i % 10 == 0)\r
+ {\r
+ memcpy(&Key[SecretKeyLength + SaltLength], &i, 4);\r
+ sha_memory(Key, SecretKeyLength + SaltLength + 4, Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(j = 0; j < 5; j++)\r
+ Hash[j] = _byteswap_ulong(Hash[j]);\r
+ memcpy(&Mask, &Hash, 10);\r
+ }\r
+ if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 10]))\r
+ p[i] ^= Mask[i % 10];\r
+ }\r
+}\r
+\r
+void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
+{\r
+ MaskSettingsData(Salt, SaltLength, Data, Size, EscapeZero);\r
+}\r
+\r
+void CalculateSettingsDataChecksum(void* Data, DWORD Size)\r
+{\r
+ ulong Hash[5];\r
+ DWORD i;\r
+ BYTE Mask[20];\r
+ sha_memory((char*)Data, Size, Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(i = 0; i < 5; i++)\r
+ Hash[i] = _byteswap_ulong(Hash[i]);\r
+ memcpy(&Mask, &Hash, 20);\r
+ for(i = 0; i < 20; i++)\r
+ EncryptSettingsChecksum[i] ^= Mask[i];\r
+}\r
+\r
+// ポータブル版判定\r
+int IsRegAvailable()\r
+{\r
+ int Sts;\r
+ void* h;\r
+ Sts = NO;\r
+ SetRegType(REGTYPE_REG);\r
+ if(OpenReg("FFFTP", &h) == FFFTP_SUCCESS)\r
+ {\r
+ CloseReg(h);\r
+ Sts = YES;\r
+ }\r
+ return Sts;\r
+}\r
+\r
+int IsIniAvailable()\r
+{\r
+ int Sts;\r
+ void* h;\r
+ Sts = NO;\r
+ SetRegType(REGTYPE_INI);\r
+ if(OpenReg("FFFTP", &h) == FFFTP_SUCCESS)\r
+ {\r
+ CloseReg(h);\r
+ Sts = YES;\r
+ }\r
+ return Sts;\r
+}\r
+\r
+// バージョン確認\r
+int ReadSettingsVersion()\r
+{\r
+ void *hKey3;\r
+ int i;\r
+ int Version;\r
+\r
+ SetRegType(REGTYPE_INI);\r
+ if((i = OpenReg("FFFTP", &hKey3)) != FFFTP_SUCCESS)\r
+ {\r
+ if(AskForceIni() == NO)\r
+ {\r
+ SetRegType(REGTYPE_REG);\r
+ i = OpenReg("FFFTP", &hKey3);\r
+ }\r
+ }\r
+ Version = INT_MAX;\r
+ if(i == FFFTP_SUCCESS)\r
+ {\r
+ ReadIntValueFromReg(hKey3, "Version", &Version);\r
+ CloseReg(hKey3);\r
+ }\r
+ return Version;\r
+}\r
+\r
+// FileZilla XML形式エクスポート対応\r
+void SaveSettingsToFileZillaXml()\r
+{\r
+ char Fname[FMAX_PATH+1];\r
+ FILE* f;\r
+ TIME_ZONE_INFORMATION tzi;\r
+ int Level;\r
+ int i;\r
+ HOSTDATA Host;\r
+ char Tmp[FMAX_PATH+1];\r
+ char* p1;\r
+ char* p2;\r
+ strcpy(Fname, "FileZilla.xml");\r
+ if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN357, "xml", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
+ {\r
+ if((f = fopen(Fname, "wt")) != NULL)\r
+ {\r
+ fputs("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n", f);\r
+ fputs("<FileZilla3>\n", f);\r
+ fputs("<Servers>\n", f);\r
+ GetTimeZoneInformation(&tzi);\r
+ Level = 0;\r
+ i = 0;\r
+ while(CopyHostFromList(i, &Host) == FFFTP_SUCCESS)\r
+ {\r
+ while((Host.Level & SET_LEVEL_MASK) < Level)\r
+ {\r
+ fputs("</Folder>\n", f);\r
+ Level--;\r
+ }\r
+ if(Host.Level & SET_LEVEL_GROUP)\r
+ {\r
+ fputs("<Folder expanded=\"1\">\n", f);\r
+ fprintf(f, "%s
\n", Host.HostName);\r
+ Level++;\r
+ }\r
+ else\r
+ {\r
+ fputs("<Server>\n", f);\r
+ fprintf(f, "<Host>%s</Host>\n", Host.HostAdrs);\r
+ fprintf(f, "<Port>%d</Port>\n", Host.Port);\r
+ if(Host.UseNoEncryption == YES)\r
+ fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
+ else if(Host.UseFTPES == YES)\r
+ fprintf(f, "<Protocol>%s</Protocol>\n", "4");\r
+ else if(Host.UseFTPIS == YES)\r
+ fprintf(f, "<Protocol>%s</Protocol>\n", "3");\r
+ else\r
+ fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
+ fprintf(f, "<Type>%s</Type>\n", "0");\r
+ fprintf(f, "<User>%s</User>\n", Host.UserName);\r
+ fprintf(f, "<Pass>%s</Pass>\n", Host.PassWord);\r
+ fprintf(f, "<Account>%s</Account>\n", Host.Account);\r
+ if(Host.Anonymous == YES || strlen(Host.UserName) == 0)\r
+ fprintf(f, "<Logontype>%s</Logontype>\n", "0");\r
+ else\r
+ fprintf(f, "<Logontype>%s</Logontype>\n", "1");\r
+ fprintf(f, "<TimezoneOffset>%d</TimezoneOffset>\n", tzi.Bias + Host.TimeZone * 60);\r
+ if(Host.Pasv == YES)\r
+ fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_PASSIVE");\r
+ else\r
+ fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_ACTIVE");\r
+ fprintf(f, "<MaximumMultipleConnections>%d</MaximumMultipleConnections>\n", Host.MaxThreadCount);\r
+ switch(Host.NameKanjiCode)\r
+ {\r
+ case KANJI_SJIS:\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
+ fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "Shift_JIS");\r
+ break;\r
+ case KANJI_JIS:\r
+ // 非対応\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+ break;\r
+ case KANJI_EUC:\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
+ fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "EUC-JP");\r
+ break;\r
+ case KANJI_SMB_HEX:\r
+ // 非対応\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+ break;\r
+ case KANJI_SMB_CAP:\r
+ // 非対応\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+ break;\r
+ case KANJI_UTF8N:\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "UTF-8");\r
+ break;\r
+ case KANJI_UTF8HFSX:\r
+ // 非対応\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+ break;\r
+ default:\r
+ fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+ break;\r
+ }\r
+ if(Host.FireWall == YES)\r
+ fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "0");\r
+ else\r
+ fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "1");\r
+ fprintf(f, "<Name>%s</Name>\n", Host.HostName);\r
+ fprintf(f, "<LocalDir>%s</LocalDir>\n", Host.LocalInitDir);\r
+ if(strchr(Host.RemoteInitDir, '\\') != NULL)\r
+ {\r
+ fputs("<RemoteDir>", f);\r
+ fputs("8 0", f);\r
+ strcpy(Tmp, Host.RemoteInitDir);\r
+ p1 = Tmp;\r
+ while(*p1 != '\0')\r
+ {\r
+ while(*p1 == '\\')\r
+ {\r
+ p1++;\r
+ }\r
+ if((p2 = strchr(p1, '\\')) != NULL)\r
+ {\r
+ *p2 = '\0';\r
+ p2++;\r
+ }\r
+ else\r
+ p2 = strchr(p1, '\0');\r
+ if(*p1 != '\0')\r
+ fprintf(f, " %d %s", _mbslen(p1), p1);\r
+ p1 = p2;\r
+ }\r
+ fputs("</RemoteDir>\n", f);\r
+ }\r
+ else if(strchr(Host.RemoteInitDir, '/') != NULL)\r
+ {\r
+ fputs("<RemoteDir>", f);\r
+ fputs("1 0", f);\r
+ strcpy(Tmp, Host.RemoteInitDir);\r
+ p1 = Tmp;\r
+ while(*p1 != '\0')\r
+ {\r
+ while(*p1 == '/')\r
+ {\r
+ p1++;\r
+ }\r
+ if((p2 = strchr(p1, '/')) != NULL)\r
+ {\r
+ *p2 = '\0';\r
+ p2++;\r
+ }\r
+ else\r
+ p2 = strchr(p1, '\0');\r
+ if(*p1 != '\0')\r
+ fprintf(f, " %d %s", _mbslen(p1), p1);\r
+ p1 = p2;\r
+ }\r
+ fputs("</RemoteDir>\n", f);\r
+ }\r
+ else\r
+ fprintf(f, "<RemoteDir>%s</RemoteDir>\n", Host.RemoteInitDir);\r
+ if(Host.SyncMove == YES)\r
+ fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "1");\r
+ else\r
+ fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "0");\r
+ fprintf(f, "%s
\n", Host.HostName);\r
+ fputs("</Server>\n", f);\r
+ }\r
+ i++;\r
+ }\r
+ while(Level > 0)\r
+ {\r
+ fputs("</Folder>\n", f);\r
+ Level--;\r
+ }\r
+ fputs("</Servers>\n", f);\r
+ // TODO: 環境設定\r
+// fputs("<Settings>\n", f);\r
+// fputs("</Settings>\n", f);\r
+ fputs("</FileZilla3>\n", f);\r
+ fclose(f);\r
+ }\r
+ else\r
+ MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK);\r
+ }\r
+}\r
+\r