\r
/*===== プロトタイプ =====*/\r
\r
-static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr);\r
-static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum);\r
+// バグ修正\r
+//static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr);\r
+//static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum);\r
+static void SaveStr(void *Handle, char *Key, char *Str, char *DefaultStr);\r
+static void SaveIntNum(void *Handle, char *Key, int Num, int DefaultNum);\r
static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf);\r
static int RestoreFontData(char *Str, LOGFONT *Font);\r
\r
\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 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
+extern int AutoCheckForUpdates;\r
+extern int AutoApplyUpdates;\r
+extern int AutoCheckForUptatesInterval;\r
+extern time_t LastAutoCheckForUpdates;\r
\r
/*----- マスタパスワードの設定 ----------------------------------------------\r
*\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
SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
EncodePassword(Host.PrivateKey, Str);\r
SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);\r
+ SaveIntNum(hKey5, "NoWeak", Host.NoWeakEncryption, DefaultHost.NoWeakEncryption);\r
// 同時接続対応\r
SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);\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
+ WriteIntValueToReg(hKey4, "UpdCheck", AutoCheckForUpdates);\r
+ WriteIntValueToReg(hKey4, "UpdApply", AutoApplyUpdates);\r
+ WriteIntValueToReg(hKey4, "UpdInterval", AutoCheckForUptatesInterval);\r
+ WriteBinaryToReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
}\r
CloseSubKey(hKey4);\r
}\r
+ // 全設定暗号化対応\r
+ EncryptSettings = NO;\r
+ WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20);\r
+ if(EncryptAllSettings == YES)\r
+ {\r
+ if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+ {\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "Host%d", i);\r
+ if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+ break;\r
+ }\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "History%d", i);\r
+ if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+ break;\r
+ }\r
+ CloseSubKey(hKey4);\r
+ }\r
+ DeleteSubKey(hKey3, "Options");\r
+ }\r
CloseReg(hKey3);\r
}\r
return;\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
+ if(GetMasterPasswordStatus() == PASSWORD_OK)\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
+ // 全設定暗号化対応\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
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
strcpy(Str, "");\r
ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
DecodePassword(Str, Host.PrivateKey);\r
+ ReadIntValueFromReg(hKey5, "NoWeak", &Host.NoWeakEncryption);\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\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
+ ReadIntValueFromReg(hKey4, "UpdCheck", &AutoCheckForUpdates);\r
+ ReadIntValueFromReg(hKey4, "UpdApply", &AutoApplyUpdates);\r
+ ReadIntValueFromReg(hKey4, "UpdInterval", &AutoCheckForUptatesInterval);\r
+ ReadBinaryFromReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
\r
CloseSubKey(hKey4);\r
}\r
+ // 全設定暗号化対応\r
+ EncryptSettings = NO;\r
+ if(Version >= 1990)\r
+ {\r
+ if(GetMasterPasswordStatus() == PASSWORD_OK)\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
+ }\r
CloseReg(hKey3);\r
}\r
else\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
if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
{\r
- MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
}\r
SetCurrentDirectory(CurDir);\r
}\r
{\r
if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
{\r
- MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
}\r
else\r
{\r
Ret = YES;\r
}\r
else\r
- MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+ // バグ修正\r
+// MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN293, "FFFTP", MB_OK | MB_ICONERROR);\r
}\r
return(Ret);\r
}\r
* 文字列がデフォルトの文字列と同じならセーブしない\r
*----------------------------------------------------------------------------*/\r
\r
-static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr)\r
+// バグ修正\r
+//static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr)\r
+static void SaveStr(void *Handle, char *Key, char *Str, char *DefaultStr)\r
{\r
if((DefaultStr != NULL) && (strcmp(Str, DefaultStr) == 0))\r
- DeleteValue(hKey, Key);\r
+// DeleteValue(hKey, Key);\r
+ DeleteValue(Handle, Key);\r
else\r
- WriteStringToReg(hKey, Key, Str);\r
+// WriteStringToReg(hKey, Key, Str);\r
+ WriteStringToReg(Handle, Key, Str);\r
\r
return;\r
}\r
* 数値がデフォルトの値と同じならセーブしない\r
*----------------------------------------------------------------------------*/\r
\r
-static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum)\r
+// バグ修正\r
+//static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum)\r
+static void SaveIntNum(void *Handle, char *Key, int Num, int DefaultNum)\r
{\r
if(Num == DefaultNum)\r
- DeleteValue(hKey, Key);\r
+// DeleteValue(hKey, Key);\r
+ DeleteValue(Handle, Key);\r
else\r
- WriteIntValueToReg(hKey, Key, Num);\r
+// WriteIntValueToReg(hKey, Key, Num);\r
+ WriteIntValueToReg(Handle, Key, Num);\r
\r
return;\r
}\r
struct regdatatbl *Next;\r
} REGDATATBL;\r
\r
+// 全設定暗号化対応\r
+typedef struct regdatatbl_reg {\r
+ char KeyName[80+1]; /* キー名 */\r
+ HKEY hKey;\r
+} REGDATATBL_REG;\r
+\r
/*===== プロトタイプ =====*/\r
\r
static BOOL WriteOutRegToFile(REGDATATBL *Pos);\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- strcpy(Tmp, "Software\\Sota\\");\r
- strcat(Tmp, Name);\r
- if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
- Sts = FFFTP_SUCCESS;\r
+ // 全設定暗号化対応\r
+// strcpy(Tmp, "Software\\Sota\\");\r
+// strcat(Tmp, Name);\r
+// if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
+// Sts = FFFTP_SUCCESS;\r
+ if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+ {\r
+ strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+ strcpy(Tmp, "Software\\Sota\\");\r
+ strcat(Tmp, Name);\r
+ if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, &(((REGDATATBL_REG *)(*Handle))->hKey)) == ERROR_SUCCESS)\r
+ Sts = FFFTP_SUCCESS;\r
+ if(Sts != FFFTP_SUCCESS)\r
+ free(*Handle);\r
+ }\r
}\r
else\r
{\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- strcpy(Tmp, "Software\\Sota\\");\r
- strcat(Tmp, Name);\r
- if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
- Sts = FFFTP_SUCCESS;\r
+ // 全設定暗号化対応\r
+// strcpy(Tmp, "Software\\Sota\\");\r
+// strcat(Tmp, Name);\r
+// if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
+// Sts = FFFTP_SUCCESS;\r
+ if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+ {\r
+ strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+ strcpy(Tmp, "Software\\Sota\\");\r
+ strcat(Tmp, Name);\r
+ if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, &(((REGDATATBL_REG *)(*Handle))->hKey), &Dispos) == ERROR_SUCCESS)\r
+ Sts = FFFTP_SUCCESS;\r
+ if(Sts != FFFTP_SUCCESS)\r
+ free(*Handle);\r
+ }\r
}\r
else\r
{\r
\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- RegCloseKey(Handle);\r
+ // 全設定暗号化対応\r
+// RegCloseKey(Handle);\r
+ RegCloseKey(((REGDATATBL_REG *)Handle)->hKey);\r
+ free(Handle);\r
\r
/* INIファイルを削除 */\r
// ポータブル版判定\r
Ret = TRUE;\r
}\r
else\r
- MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+ // バグ修正\r
+// MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN240, "FFFTP", MB_OK | MB_ICONERROR);\r
\r
return(Ret);\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_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- if(RegOpenKeyEx(Parent, Name, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
- Sts = FFFTP_SUCCESS;\r
+ // 全設定暗号化対応\r
+// if(RegOpenKeyEx(Parent, Name, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
+// Sts = FFFTP_SUCCESS;\r
+ if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+ {\r
+ strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, ((REGDATATBL_REG *)Parent)->KeyName);\r
+ strcat(((REGDATATBL_REG *)(*Handle))->KeyName, "\\");\r
+ strcat(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+ if(RegOpenKeyEx(((REGDATATBL_REG *)Parent)->hKey, Name, 0, KEY_READ, &(((REGDATATBL_REG *)(*Handle))->hKey)) == ERROR_SUCCESS)\r
+ Sts = FFFTP_SUCCESS;\r
+ if(Sts != FFFTP_SUCCESS)\r
+ free(*Handle);\r
+ }\r
}\r
else\r
{\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- if(RegCreateKeyEx(Parent, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
- Sts = FFFTP_SUCCESS;\r
+ // 全設定暗号化対応\r
+// if(RegCreateKeyEx(Parent, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
+// Sts = FFFTP_SUCCESS;\r
+ if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+ {\r
+ strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, ((REGDATATBL_REG *)Parent)->KeyName);\r
+ strcat(((REGDATATBL_REG *)(*Handle))->KeyName, "\\");\r
+ strcat(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+ if(RegCreateKeyEx(((REGDATATBL_REG *)Parent)->hKey, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &(((REGDATATBL_REG *)(*Handle))->hKey), &Dispos) == ERROR_SUCCESS)\r
+ Sts = FFFTP_SUCCESS;\r
+ if(Sts != FFFTP_SUCCESS)\r
+ free(*Handle);\r
+ }\r
}\r
else\r
{\r
static int CloseSubKey(void *Handle)\r
{\r
if(TmpRegType == REGTYPE_REG)\r
- RegCloseKey(Handle);\r
+ // 全設定暗号化対応\r
+// RegCloseKey(Handle);\r
+ {\r
+ RegCloseKey(((REGDATATBL_REG *)Handle)->hKey);\r
+ free(Handle);\r
+ }\r
else\r
{\r
/* Nothing */\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- if(RegDeleteKey(Handle, Name) == ERROR_SUCCESS)\r
+ // 全設定暗号化対応\r
+// if(RegDeleteKey(Handle, Name) == ERROR_SUCCESS)\r
+ if(RegDeleteKey(((REGDATATBL_REG *)Handle)->hKey, Name) == ERROR_SUCCESS)\r
Sts = FFFTP_SUCCESS;\r
}\r
else\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- if(RegDeleteValue(Handle, Name) == ERROR_SUCCESS)\r
+ // 全設定暗号化対応\r
+// if(RegDeleteValue(Handle, Name) == ERROR_SUCCESS)\r
+ if(RegDeleteValue(((REGDATATBL_REG *)Handle)->hKey, Name) == ERROR_SUCCESS)\r
Sts = FFFTP_SUCCESS;\r
}\r
else\r
int Sts;\r
DWORD Size;\r
char *Pos;\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
Size = sizeof(int);\r
- if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
+ // 全設定暗号化対応\r
+// if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
+ if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
Sts = FFFTP_SUCCESS;\r
}\r
else\r
Sts = FFFTP_SUCCESS;\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ UnmaskSettingsData(Path, strlen(Path), Value, sizeof(int), NO);\r
+ CalculateSettingsDataChecksum(Value, sizeof(int));\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
REGDATATBL *Pos;\r
char *Data;\r
char Tmp[20];\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ MaskSettingsData(Path, strlen(Path), &Value, sizeof(int), NO);\r
+ }\r
if(TmpRegType == REGTYPE_REG)\r
- RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
+ // 全設定暗号化対応\r
+// RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
+ RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
else\r
{\r
Pos = (REGDATATBL *)Handle;\r
strcat(Data, Tmp);\r
Pos->ValLen += strlen(Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Path, strlen(Path), &Value, sizeof(int), NO);\r
+ CalculateSettingsDataChecksum(&Value, sizeof(int));\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
DWORD TempSize;\r
char* pa0;\r
wchar_t* pw0;\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+ // 全設定暗号化対応\r
+// if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+ if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
{\r
if(*(Str + Size - 1) != NUL)\r
*(Str + Size) = NUL;\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
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ UnmaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
{\r
REGDATATBL *Pos;\r
char *Data;\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ MaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
+ }\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(((REGDATATBL_REG *)Handle)->hKey, 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(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
DWORD TempSize;\r
char* pa0;\r
wchar_t* pw0;\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+ // 全設定暗号化対応\r
+// if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+ if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
{\r
if(*(Str + Size - 1) != NUL)\r
*(Str + Size) = NUL;\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
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ UnmaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
{\r
REGDATATBL *Pos;\r
char *Data;\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ MaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
+ }\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(((REGDATATBL_REG *)Handle)->hKey, 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(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
{\r
int Sts;\r
char *Pos;\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
Sts = FFFTP_FAIL;\r
if(TmpRegType == REGTYPE_REG)\r
{\r
- if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
+ // 全設定暗号化対応\r
+// if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
+ if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
Sts = FFFTP_SUCCESS;\r
}\r
else\r
Sts = FFFTP_SUCCESS;\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ UnmaskSettingsData(Path, strlen(Path), Bin, Size, NO);\r
+ CalculateSettingsDataChecksum(Bin, Size);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
{\r
REGDATATBL *Pos;\r
char *Data;\r
+ // 全設定暗号化対応\r
+ char Path[80];\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ if(TmpRegType == REGTYPE_REG)\r
+ strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+ else\r
+ strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+ strcat(Path, "\\");\r
+ strcat(Path, Name);\r
+ MaskSettingsData(Path, strlen(Path), Bin, Len, NO);\r
+ }\r
if(TmpRegType == REGTYPE_REG)\r
- RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
+ // 全設定暗号化対応\r
+// RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
+ RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
else\r
{\r
Pos = (REGDATATBL *)Handle;\r
Data = Pos->ValTbl + Pos->ValLen;\r
Pos->ValLen += StrCatOut(Bin, Len, Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Path, strlen(Path), Bin, Len, NO);\r
+ CalculateSettingsDataChecksum(Bin, Len);\r
+ }\r
return(FFFTP_SUCCESS);\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
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(GetMainHwnd(), MSGJPN358, "FFFTP", MB_OK | MB_ICONERROR);\r
+ }\r
+}\r
+\r