#endif\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\r
static int WriteMultiStringToReg(void *Handle, char *Name, char *Str);\r
static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size);\r
static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len);\r
+// 暗号化通信対応\r
+static int StrCatOut(char *Src, int Len, char *Dst);\r
+static int StrReadIn(char *Src, int Max, char *Dst);\r
\r
int CheckPasswordValidity( char* Password, int length, const char* HashStr );\r
void CreatePasswordHash( char* Password, int length, char* HashStr );\r
\r
// 暗号化通信対応\r
extern BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];\r
+extern BYTE SSLRootCAFileHash[20];\r
+// ファイルアイコン表示対応\r
+extern int DispFileIcon;\r
+// ディレクトリ自動作成\r
+extern int MakeAllDir;\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
// 暗号化通信対応\r
// char Str[FMAX_PATH+1];\r
char Str[PRIVATE_KEY_LEN*4+1];\r
+ char Buf[FMAX_PATH+1];\r
int i;\r
int n;\r
HOSTDATA DefaultHost;\r
\r
WriteMultiStringToReg(hKey4, "DefAttr", DefAttrList);\r
\r
- GetTempPath(FMAX_PATH, Str);\r
+ // 環境依存の不具合対策\r
+// GetTempPath(FMAX_PATH, Str);\r
+ GetAppTempPath(Str);\r
+ SetYenTail(Str);\r
SaveStr(hKey4, "Tmp", TmpPath, Str);\r
\r
WriteBinaryToReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE));\r
SaveStr(hKey5, "PKey", Str, DefaultHist.PrivateKey);\r
// 同時接続対応\r
SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount);\r
+ SaveIntNum(hKey5, "ReuseCmdSkt", Hist.ReuseCmdSkt, DefaultHist.ReuseCmdSkt);\r
// MLSD対応\r
SaveIntNum(hKey5, "MLSD", Hist.UseMLSD, DefaultHist.UseMLSD);\r
// IPv6対応\r
- SaveIntNum(hKey5, "IPv6", Hist.UseIPv6, DefaultHist.UseIPv6);\r
+ SaveIntNum(hKey5, "NetType", Hist.NetType, DefaultHist.NetType);\r
+ // 自動切断対策\r
+ SaveIntNum(hKey5, "Noop", Hist.NoopInterval, DefaultHist.NoopInterval);\r
+ // 再転送対応\r
+ SaveIntNum(hKey5, "ErrMode", Hist.TransferErrorMode, DefaultHist.TransferErrorMode);\r
+ SaveIntNum(hKey5, "ErrNotify", Hist.TransferErrorNotify, DefaultHist.TransferErrorNotify);\r
\r
CloseSubKey(hKey5);\r
n++;\r
SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);\r
// 同時接続対応\r
SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
+ SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);\r
// MLSD対応\r
SaveIntNum(hKey5, "MLSD", Host.UseMLSD, DefaultHost.UseMLSD);\r
// IPv6対応\r
- SaveIntNum(hKey5, "IPv6", Host.UseIPv6, DefaultHost.UseIPv6);\r
+ SaveIntNum(hKey5, "NetType", Host.NetType, DefaultHost.NetType);\r
+ // 自動切断対策\r
+ SaveIntNum(hKey5, "Noop", Host.NoopInterval, DefaultHost.NoopInterval);\r
+ // 再転送対応\r
+ SaveIntNum(hKey5, "ErrMode", Host.TransferErrorMode, DefaultHost.TransferErrorMode);\r
+ SaveIntNum(hKey5, "ErrNotify", Host.TransferErrorNotify, DefaultHost.TransferErrorNotify);\r
}\r
CloseSubKey(hKey5);\r
}\r
\r
// 暗号化通信対応\r
WriteBinaryToReg(hKey4, "CertCacheHash", &CertificateCacheHash, sizeof(CertificateCacheHash));\r
+ strcpy(Buf, "");\r
+ StrCatOut((char*)&SSLRootCAFileHash, sizeof(SSLRootCAFileHash), Buf);\r
+ EncodePassword(Buf, Str);\r
+ WriteStringToReg(hKey4, "RootCertHash", Str);\r
+ // ファイルアイコン表示対応\r
+ WriteIntValueToReg(hKey4, "ListIcon", DispFileIcon);\r
+ // ディレクトリ自動作成\r
+ WriteIntValueToReg(hKey4, "MakeDir", MakeAllDir);\r
}\r
CloseSubKey(hKey4);\r
}\r
* NO: 読み出し失敗(設定無し)\r
*----------------------------------------------------------------------------*/\r
\r
-int LoadRegistory(void)\r
+int LoadRegistry(void)\r
{\r
void *hKey3;\r
void *hKey4;\r
// 暗号化通信対応\r
// char Str[256]; /* ASCII_EXT_LENより大きい事 */\r
char Str[PRIVATE_KEY_LEN*4+1];\r
+ char Buf[FMAX_PATH+1];\r
char *Pos;\r
char *Pos2;\r
HOSTDATA Host;\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
DecodePassword(Str, Hist.PrivateKey);\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount);\r
+ ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Hist.ReuseCmdSkt);\r
// MLSD対応\r
ReadIntValueFromReg(hKey5, "MLSD", &Hist.UseMLSD);\r
// IPv6対応\r
- ReadIntValueFromReg(hKey5, "IPv6", &Hist.UseIPv6);\r
+ ReadIntValueFromReg(hKey5, "NetType", &Hist.NetType);\r
+ // 自動切断対策\r
+ ReadIntValueFromReg(hKey5, "Noop", &Hist.NoopInterval);\r
+ // 再転送対応\r
+ ReadIntValueFromReg(hKey5, "ErrMode", &Hist.TransferErrorMode);\r
+ ReadIntValueFromReg(hKey5, "ErrNotify", &Hist.TransferErrorNotify);\r
\r
CloseSubKey(hKey5);\r
AddHistoryToHistory(&Hist);\r
DecodePassword(Str, Host.PrivateKey);\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
- ReadIntValueFromReg(hKey5, "IPv6", &Host.UseIPv6);\r
+ ReadIntValueFromReg(hKey5, "NetType", &Host.NetType);\r
+ // 自動切断対策\r
+ ReadIntValueFromReg(hKey5, "Noop", &Host.NoopInterval);\r
+ // 再転送対応\r
+ ReadIntValueFromReg(hKey5, "ErrMode", &Host.TransferErrorMode);\r
+ ReadIntValueFromReg(hKey5, "ErrNotify", &Host.TransferErrorNotify);\r
\r
CloseSubKey(hKey5);\r
\r
\r
// 暗号化通信対応\r
ReadBinaryFromReg(hKey4, "CertCacheHash", &CertificateCacheHash, sizeof(CertificateCacheHash));\r
+ ReadStringFromReg(hKey4, "RootCertHash", Str, PRIVATE_KEY_LEN*4+1);\r
+ DecodePassword(Str, Buf);\r
+ StrReadIn(Buf, sizeof(SSLRootCAFileHash), (char*)&SSLRootCAFileHash);\r
+ // ファイルアイコン表示対応\r
+ ReadIntValueFromReg(hKey4, "ListIcon", &DispFileIcon);\r
+ // ディレクトリ自動作成\r
+ ReadIntValueFromReg(hKey4, "MakeDir", &MakeAllDir);\r
\r
CloseSubKey(hKey4);\r
}\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
}\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
static BOOL WriteOutRegToFile(REGDATATBL *Pos);\r
static int ReadInReg(char *Name, REGDATATBL **Handle);\r
-static int StrCatOut(char *Src, int Len, char *Dst);\r
-static int StrReadIn(char *Src, int Max, char *Dst);\r
+// 暗号化通信対応\r
+//static int StrCatOut(char *Src, int Len, char *Dst);\r
+//static int StrReadIn(char *Src, int Max, char *Dst);\r
static char *ScanValue(void *Handle, char *Name);\r
\r
\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
Sts = FFFTP_SUCCESS;\r
if(!CheckStringM(Str))\r
break;\r
- Str = Str;\r
// UTF-8ではない可能性がある\r
// Shift_JISとみなす\r
case KANJI_SJIS:\r
switch(IniKanjiCode)\r
{\r
case KANJI_NOCNV:\r
- TempSize = min1(Size-1, strlen(Pos));\r
+ TempSize = min1(Size - 2, strlen(Pos));\r
TempSize = StrReadIn(Pos, TempSize, Str);\r
*(Str + TempSize) = NUL;\r
+ *(Str + TempSize + 1) = NUL;\r
Sts = FFFTP_SUCCESS;\r
if(!CheckMultiStringM(Str))\r
break;\r
}\r
return rndValue;\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