Add UIs for encryption.
Add support for FTP over Explicit SSL/TLS (OpenSSL is required).
Fix bugs of synchronization between threads.
Fix bugs of behavior caused by uninitialized variables.
Fix bugs of algorithm to wait for SOCKET signals.
>
</File>
<File
+ RelativePath=".\socketwrapper.c"
+ >
+ </File>
+ <File
RelativePath=".\statuswin.c"
>
</File>
RelativePath=".\Resource\resource.h"
>
</File>
+ <File
+ RelativePath=".\socketwrapper.h"
+ >
+ </File>
</Filter>
<Filter
Name="Resource Files"
>\r
</File>\r
<File\r
+ RelativePath=".\mbswrapper.c"\r
+ >\r
+ </File>\r
+ <File\r
RelativePath=".\md4.c"\r
>\r
</File>\r
>\r
</File>\r
<File\r
+ RelativePath=".\socketwrapper.c"\r
+ >\r
+ </File>\r
+ <File\r
RelativePath=".\statuswin.c"\r
>\r
</File>\r
>\r
</File>\r
<File\r
+ RelativePath=".\mbswrapper.h"\r
+ >\r
+ </File>\r
+ <File\r
RelativePath=".\Resource\resource.h"\r
>\r
</File>\r
+ <File\r
+ RelativePath=".\socketwrapper.h"\r
+ >\r
+ </File>\r
</Filter>\r
<Filter\r
Name="Resource Files"\r
>
</File>
<File
+ RelativePath=".\socketwrapper.c"
+ >
+ </File>
+ <File
RelativePath=".\statuswin.c"
>
</File>
RelativePath=".\Resource_eng\resource.h"
>
</File>
+ <File
+ RelativePath=".\socketwrapper.h"
+ >
+ </File>
</Filter>
<Filter
Name="Resource Files"
>\r
</File>\r
<File\r
+ RelativePath=".\mbswrapper.c"\r
+ >\r
+ </File>\r
+ <File\r
RelativePath=".\md4.c"\r
>\r
</File>\r
>\r
</File>\r
<File\r
+ RelativePath=".\socketwrapper.c"\r
+ >\r
+ </File>\r
+ <File\r
RelativePath=".\statuswin.c"\r
>\r
</File>\r
>\r
</File>\r
<File\r
+ RelativePath=".\mbswrapper.h"\r
+ >\r
+ </File>\r
+ <File\r
RelativePath=".\Resource_eng\resource.h"\r
>\r
</File>\r
+ <File\r
+ RelativePath=".\socketwrapper.h"\r
+ >\r
+ </File>\r
</Filter>\r
<Filter\r
Name="Resource Files"\r
CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,172,42,8,8\r
END\r
\r
+hset_crypt_dlg DIALOG 0, 0, 207, 139\r
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+FONT 9, "\82l\82r \82o\83S\83V\83b\83N"\r
+BEGIN\r
+ CONTROL "FTPS (Explicit)\82Å\90Ú\91±",HSET_FTPES,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,7,148,10\r
+ CONTROL "FTPS (Inplicit)\82Å\90Ú\91±",HSET_FTPIS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,21,148,10\r
+ CONTROL "SFTP\82Å\90Ú\91±",HSET_SFTP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35,148,10\r
+END\r
+\r
\r
/////////////////////////////////////////////////////////////////////////////\r
//\r
#define forcepasschange_dlg 186\r
#define newmasterpasswd_dlg 187\r
#define masterpasswd_dlg 188\r
+#define hset_crypt_dlg 189\r
#define TRANS_TIME_BAR 1002\r
#define TRANS_TEXT 1003\r
#define TRANS_REMOTE 1003\r
#define HSET_SJIS_CNV 1195\r
#define HSET_UTF8N_CNV 1196\r
#define HSET_FN_SJIS_CNV 1197\r
+#define HSET_FTPES 1198\r
+#define HSET_FTPIS 1199\r
+#define HSET_SFTP 1200\r
#define MENU_END 40001\r
#define MENU_EXIT 40001\r
#define MENU_CONNECT 40003\r
// \r
#ifdef APSTUDIO_INVOKED\r
#ifndef APSTUDIO_READONLY_SYMBOLS\r
-#define _APS_NEXT_RESOURCE_VALUE 189\r
+#define _APS_NEXT_RESOURCE_VALUE 190\r
#define _APS_NEXT_COMMAND_VALUE 40175\r
-#define _APS_NEXT_CONTROL_VALUE 1198\r
+#define _APS_NEXT_CONTROL_VALUE 1201\r
#define _APS_NEXT_SYMED_VALUE 101\r
#endif\r
#endif\r
CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,173,39,8,8\r
END\r
\r
+hset_crypt_dlg DIALOG 0, 0, 207, 139\r
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+FONT 9, "\82l\82r \82o\83S\83V\83b\83N"\r
+BEGIN\r
+ CONTROL "Connect with FTPS (Explicit)",HSET_FTPES,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,7,148,10\r
+ CONTROL "Connect with FTPS (Inplicit)",HSET_FTPIS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,21,148,10\r
+ CONTROL "Connect with SFTP",HSET_SFTP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35,148,10\r
+END\r
+\r
\r
/////////////////////////////////////////////////////////////////////////////\r
//\r
#define forcepasschange_dlg 186\r
#define newmasterpasswd_dlg 187\r
#define masterpasswd_dlg 188\r
+#define hset_crypt_dlg 189\r
#define TRANS_TIME_BAR 1002\r
#define TRANS_TEXT 1003\r
#define TRANS_REMOTE 1003\r
#define HSET_SJIS_CNV 1195\r
#define HSET_UTF8N_CNV 1196\r
#define HSET_FN_SJIS_CNV 1197\r
+#define HSET_FTPES 1198\r
+#define HSET_FTPIS 1199\r
+#define HSET_SFTP 1200\r
#define MENU_END 40001\r
#define MENU_EXIT 40001\r
#define MENU_CONNECT 40003\r
// \r
#ifdef APSTUDIO_INVOKED\r
#ifndef APSTUDIO_READONLY_SYMBOLS\r
-#define _APS_NEXT_RESOURCE_VALUE 189\r
+#define _APS_NEXT_RESOURCE_VALUE 190\r
#define _APS_NEXT_COMMAND_VALUE 40175\r
-#define _APS_NEXT_CONTROL_VALUE 1198\r
+#define _APS_NEXT_CONTROL_VALUE 1201\r
#define _APS_NEXT_SYMED_VALUE 101\r
#endif\r
#endif\r
#define DEFAULT_PASSWORD "DefaultPassword"\r
#define MAX_PASSWORD_LEN 128\r
\r
+// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+#define CRYPT_NONE 0\r
+#define CRYPT_FTPES 1\r
+#define CRYPT_FTPIS 2\r
+#define CRYPT_SFTP 3\r
+\r
\r
/*=================================================\r
* \83X\83g\83\89\83N\83`\83\83\r
int DialupAlways; /* \8fí\82É\82±\82Ì\83G\83\93\83g\83\8a\82Ö\90Ú\91±\82·\82é\82©\82Ç\82¤\82© (YES/NO) */\r
int DialupNotify; /* \8dÄ\90Ú\91±\82Ì\8dÛ\82É\8am\94F\82·\82é (YES/NO) */\r
char DialEntry[RAS_NAME_LEN+1]; /* \83_\83C\83A\83\8b\83A\83b\83v\83G\83\93\83g\83\8a */\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ int CryptMode; /* \88Ã\8d\86\89»\92Ê\90M\83\82\81[\83h (CRYPT_xxx) */\r
+ int UseFTPES; /* FTPES\82Å\90Ú\91±\82·\82é (YES/NO) */\r
+ int UseFTPIS; /* FTPIS\82Å\90Ú\91±\82·\82é (YES/NO) */\r
+ int UseSFTP; /* SFTP\82Å\90Ú\91±\82·\82é (YES/NO) */\r
} HOSTDATA;\r
\r
\r
int DialupAlways; /* \8fí\82É\82±\82Ì\83G\83\93\83g\83\8a\82Ö\90Ú\91±\82·\82é\82©\82Ç\82¤\82© (YES/NO) */\r
int DialupNotify; /* \8dÄ\90Ú\91±\82Ì\8dÛ\82É\8am\94F\82·\82é (YES/NO) */\r
char DialEntry[RAS_NAME_LEN+1]; /* \83_\83C\83A\83\8b\83A\83b\83v\83G\83\93\83g\83\8a */\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ int UseFTPES; /* FTPES\82Å\90Ú\91±\82·\82é (YES/NO) */\r
+ int UseFTPIS; /* FTPIS\82Å\90Ú\91±\82·\82é (YES/NO) */\r
+ int UseSFTP; /* SFTP\82Å\90Ú\91±\82·\82é (YES/NO) */\r
struct historydata *Next;\r
} HISTORYDATA;\r
\r
FILETIME Time; /* \83t\83@\83C\83\8b\82Ì\8e\9e\8aÔ(UTC) */\r
int Attr; /* \83t\83@\83C\83\8b\82Ì\91®\90« */\r
int KanjiCode; /* \8a¿\8e\9a\83R\81[\83h (KANJI_xxx) */\r
- int KanjiCodeDesired; /* \95Ï\8a·\90æ\82Ì\8a¿\8e\9a\83R\81[\83h (KANJI_xxx) */\r
+ // UTF-8\91Î\89\9e\r
+ int KanjiCodeDesired; /* \83\8d\81[\83J\83\8b\82Ì\8a¿\8e\9a\83R\81[\83h (KANJI_xxx) */\r
int KanaCnv; /* \94¼\8ap\83J\83i\82ð\91S\8ap\82É\95Ï\8a·(YES/NO) */\r
int Mode; /* \93]\91\97\83\82\81[\83h (EXIST_xxx) */\r
HWND hWndTrans; /* \93]\91\97\92\86\83_\83C\83A\83\8d\83O\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b */\r
int Abort; /* \93]\91\97\92\86\8e~\83t\83\89\83O (ABORT_xxx) */\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ int CryptMode; /* \88Ã\8d\86\89»\92Ê\90M\83\82\81[\83h (CRYPT_xxx) */\r
struct transpacket *Next;\r
} TRANSPACKET;\r
\r
int BackgrndMessageProc(void);\r
void ResetAutoExitFlg(void);\r
int AskAutoExit(void);\r
+// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+BOOL __stdcall SSLTimeoutCallback();\r
\r
/*===== filelist.c =====*/\r
\r
SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork);\r
int AskTryingConnect(void);\r
int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data);\r
+// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+int AskCryptMode(void);\r
+int AskUseFTPES(void);\r
+int AskUseFTPIS(void);\r
+int AskUseSFTP(void);\r
\r
/*===== cache.c =====*/\r
\r
/* OPENVMS\97p\82Ì\83R\81[\83h\82ð\97L\8cø\82É\82·\82é\81B\94ó\8cû\93a\8dì\90¬\82Ì\83p\83b\83`\82ð\91g\82Ý\8d\9e\82Ý\82Ü\82µ\82½\81B */\r
#define HAVE_OPENVMS\r
\r
-//\91S\91Ì\82É\89e\8b¿\82·\82é\90Ý\92è\82Í\82±\82±\82É\8bL\8fq\82·\82é\97\\92è\r
-//\93à\95\94\82ðUTF-8\82Æ\82µ\82Ä\88µ\82¢\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\83\8f\83C\83h\95¶\8e\9aAPI\83\89\83b\83p\81[\82ð\8eg\97p\82·\82é\r
+// \91S\91Ì\82É\89e\8b¿\82·\82é\90Ý\92è\82Í\82±\82±\82É\8bL\8fq\82·\82é\97\\92è\r
+// \93à\95\94\82ðUTF-8\82Æ\82µ\82Ä\88µ\82¢\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\83\8f\83C\83h\95¶\8e\9aAPI\83\89\83b\83p\81[\82ð\8eg\97p\82·\82é\r
#include "mbswrapper.h"\r
-//\8eg\97p\82·\82éCPU\82ð1\8cÂ\82É\8cÀ\92è\82·\82é\81i\83}\83\8b\83`\83R\83ACPU\82Ì\93Á\92è\8aÂ\8b«\89º\82Å\83t\83@\83C\83\8b\92Ê\90M\92\86\82É\83N\83\89\83b\83V\83\85\82·\82é\83o\83O\91Î\8dô\81j\r
+// OpenSSL\97p\83\\83P\83b\83g\83\89\83b\83p\81[\82ð\8eg\97p\82·\82é\r
+#include "socketwrapper.h"\r
+// \8eg\97p\82·\82éCPU\82ð1\8cÂ\82É\8cÀ\92è\82·\82é\81i\83}\83\8b\83`\83R\83ACPU\82Ì\93Á\92è\8aÂ\8b«\89º\82Å\83t\83@\83C\83\8b\92Ê\90M\92\86\82É\83N\83\89\83b\83V\83\85\82·\82é\83o\83O\91Î\8dô\81j\r
#define DISABLE_MULTI_CPUS\r
-//\83l\83b\83g\83\8f\81[\83N\83o\83b\83t\83@\82ð\96³\8cø\82É\82·\82é\81i\92Ê\90M\92\86\8e~\8cã\82É\83\8a\83\82\81[\83g\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ª\95\\8e¦\82³\82ê\82È\82¢\83o\83O\91Î\8dô\81j\r
-//#define DISABLE_NETWORK_BUFFERS\r
+// \83t\83@\83C\83\8b\93]\91\97\97p\82Ì\83l\83b\83g\83\8f\81[\83N\83o\83b\83t\83@\82ð\96³\8cø\82É\82·\82é\81i\92Ê\90M\92\86\8e~\8cã\82É\83\8a\83\82\81[\83g\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ª\95\\8e¦\82³\82ê\82È\82¢\83o\83O\91Î\8dô\81j\r
+//#define DISABLE_TRANSFER_NETWORK_BUFFERS\r
+// \83R\83\93\83g\83\8d\81[\83\8b\97p\82Ì\83l\83b\83g\83\8f\81[\83N\83o\83b\83t\83@\82ð\96³\8cø\82É\82·\82é\81i\83t\83\8a\81[\83Y\91Î\8dô\81j\r
+#define DISABLE_CONTROL_NETWORK_BUFFERS\r
\r
{\r
if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET)\r
{\r
+ // \83o\83b\83t\83@\82ð\96³\8cø\r
+#ifdef DISABLE_CONTROL_NETWORK_BUFFERS\r
+ int BufferSize = 0;\r
+ setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int));\r
+ setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int));\r
+#endif\r
while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM)\r
;\r
\r
Flg = 1;\r
if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
ReportWSError("setsockopt", WSAGetLastError());\r
+ if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
+ ReportWSError("setsockopt", WSAGetLastError());\r
#pragma aaa\r
Flg = 1;\r
if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
else\r
strcpy(Buf, User);\r
\r
+ // FTPES\91Î\89\9e\r
+ // 2\89ñ\88È\8fã\8cÄ\82Î\82ê\82é\8e\96\82ª\82 \82é\82½\82ß\8aù\82ÉFTPES\82Å\90Ú\91±\82µ\82Ä\82¢\82Ä\82à\8dÄ\8am\94F\r
+ if(CurHost.CryptMode == CRYPT_NONE || CurHost.CryptMode == CRYPT_FTPES)\r
+ {\r
+ if(IsOpenSSLLoaded() && CurHost.UseFTPES == YES && (Sts = command(ContSock, Reply, &CancelFlg, "AUTH TLS")) == 234)\r
+ {\r
+ // SSL\82É\90Ø\82è\91Ö\82¦\r
+ SetTaskMsg(MSGJPN315);\r
+ CurHost.CryptMode = CRYPT_FTPES;\r
+ if(AttachSSL(ContSock))\r
+ {\r
+ if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200)\r
+ {\r
+ if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200)\r
+ {\r
+ }\r
+ else\r
+ Sts = FTP_ERROR;\r
+ }\r
+ else\r
+ Sts = FTP_ERROR;\r
+ }\r
+ else\r
+ Sts = FTP_ERROR;\r
+ }\r
+ else\r
+ {\r
+ // \88Ã\8d\86\89»\82È\82µ\r
+ CurHost.CryptMode = CRYPT_NONE;\r
+ SetTaskMsg(MSGJPN314);\r
+ }\r
+ }\r
+\r
ReInPass = NO;\r
do\r
{\r
\r
\r
\r
+// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+int AskCryptMode(void)\r
+{\r
+ return(CurHost.CryptMode);\r
+}\r
+\r
+int AskUseFTPES(void)\r
+{\r
+ return(CurHost.UseFTPES);\r
+}\r
+\r
+int AskUseFTPIS(void)\r
+{\r
+ return(CurHost.UseFTPIS);\r
+}\r
+\r
+int AskUseSFTP(void)\r
+{\r
+ return(CurHost.UseSFTP);\r
+}\r
+\r
Pkt.Size = Pos->Size;\r
Pkt.Time = Pos->Time;\r
Pkt.KanjiCode = AskHostKanjiCode();\r
+ // UTF-8\91Î\89\9e\r
Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
Pkt.KanaCnv = AskHostKanaCnv();\r
\r
/* \83T\83C\83Y\82Æ\93ú\95t\82Í\93]\91\97\91¤\83X\83\8c\83b\83h\82Å\8eæ\93¾\82µ\81A\83Z\83b\83g\82·\82é */\r
\r
Pkt.KanjiCode = AskHostKanjiCode();\r
+ // UTF-8\91Î\89\9e\r
Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
Pkt.KanaCnv = AskHostKanaCnv();\r
\r
Pkt.Time = RemotePos->Time;\r
// Pkt.Attr = 0;\r
Pkt.KanjiCode = AskHostKanjiCode();\r
+ // UTF-8\91Î\89\9e\r
Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
Pkt.KanaCnv = AskHostKanaCnv();\r
Pkt.Mode = EXIST_OVW;\r
Pkt.Time = Pos->Time;\r
Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile);\r
Pkt.KanjiCode = AskHostKanjiCode();\r
+ // UTF-8\91Î\89\9e\r
Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
Pkt.KanaCnv = AskHostKanaCnv();\r
Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);\r
Pkt.Time = Pos->Time;\r
Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile);\r
Pkt.KanjiCode = AskHostKanjiCode();\r
+ // UTF-8\91Î\89\9e\r
Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
Pkt.KanaCnv = AskHostKanaCnv();\r
Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);\r
Pkt.Time = LocalPos->Time;\r
Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile);\r
Pkt.KanjiCode = AskHostKanjiCode();\r
+ // UTF-8\91Î\89\9e\r
Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
Pkt.KanaCnv = AskHostKanaCnv();\r
Pkt.Mode = EXIST_OVW;\r
#define SOCKBUF_SIZE (256 * 1024)\r
/* End */\r
\r
-#ifdef DISABLE_NETWORK_BUFFERS\r
+#ifdef DISABLE_TRANSFER_NETWORK_BUFFERS\r
#undef BUFSIZE\r
#define BUFSIZE (64 * 1024) // RWIN\92l\88È\89º\82Å\8f[\95ª\82È\91å\82«\82³\82ª\96]\82Ü\82µ\82¢\82Æ\8ev\82í\82ê\82é\81B\r
#undef SET_BUFFER_SIZE\r
\r
if(data_socket != INVALID_SOCKET)\r
{\r
- iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+ // FTPS\91Î\89\9e\r
+// iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ {\r
+ if(AttachSSL(data_socket))\r
+ iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+ else\r
+ iRetCode = FTP_ERROR;\r
+ }\r
+ else\r
+ iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
// data_socket = DoClose(data_socket);\r
}\r
}\r
{\r
if((data_socket = connectsock(Adrs, Port, MSGJPN091, CancelCheckWork)) != INVALID_SOCKET)\r
{\r
+ // \95Ï\90\94\82ª\96¢\8f\89\8aú\89»\82Ì\83o\83O\8fC\90³\r
+ Flg = 1;\r
if(setsockopt(data_socket, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
ReportWSError("setsockopt", WSAGetLastError());\r
\r
iRetCode = command(Pkt->ctrl_skt, Reply, CancelCheckWork, "%s", Buf);\r
if(iRetCode/100 == FTP_PRELIM)\r
{\r
- iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+ // FTPS\91Î\89\9e\r
+// iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ {\r
+ if(AttachSSL(data_socket))\r
+ iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+ else\r
+ iRetCode = FTP_ERROR;\r
+ }\r
+ else\r
+ iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
// data_socket = DoClose(data_socket);\r
}\r
else\r
/* End */\r
#endif\r
\r
-#ifdef DISABLE_NETWORK_BUFFERS\r
- // \94O\82Ì\82½\82ß\8eó\90M\83o\83b\83t\83@\82ð\96³\8cø\82É\82·\82é\81B\r
+ // \94O\82Ì\82½\82ß\8eó\90M\83o\83b\83t\83@\82ð\96³\8cø\82É\82·\82é\r
+#ifdef DISABLE_TRANSFER_NETWORK_BUFFERS\r
int buf_size = 0;\r
setsockopt(dSkt, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size, sizeof(buf_size));\r
#endif\r
\r
if(data_socket != INVALID_SOCKET)\r
{\r
- iRetCode = UpLoadFile(Pkt, data_socket);\r
+ // FTPS\91Î\89\9e\r
+// iRetCode = UpLoadFile(Pkt, data_socket);\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ {\r
+ if(AttachSSL(data_socket))\r
+ iRetCode = UpLoadFile(Pkt, data_socket);\r
+ else\r
+ iRetCode = FTP_ERROR;\r
+ }\r
+ else\r
+ iRetCode = UpLoadFile(Pkt, data_socket);\r
data_socket = DoClose(data_socket);\r
}\r
}\r
{\r
if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET)\r
{\r
+ // \95Ï\90\94\82ª\96¢\8f\89\8aú\89»\82Ì\83o\83O\8fC\90³\r
+ Flg = 1;\r
if(setsockopt(data_socket, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
ReportWSError("setsockopt", WSAGetLastError());\r
\r
iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf);\r
if(iRetCode/100 == FTP_PRELIM)\r
{\r
- iRetCode = UpLoadFile(Pkt, data_socket);\r
+ // FTPS\91Î\89\9e\r
+// iRetCode = UpLoadFile(Pkt, data_socket);\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ {\r
+ if(AttachSSL(data_socket))\r
+ iRetCode = UpLoadFile(Pkt, data_socket);\r
+ else\r
+ iRetCode = FTP_ERROR;\r
+ }\r
+ else\r
+ iRetCode = UpLoadFile(Pkt, data_socket);\r
\r
data_socket = DoClose(data_socket);\r
}\r
/* End */\r
#endif\r
\r
-#ifdef DISABLE_NETWORK_BUFFERS\r
- // \94O\82Ì\82½\82ß\91\97\90M\83o\83b\83t\83@\82ð\96³\8cø\82É\82·\82é\81B\r
+ // \94O\82Ì\82½\82ß\91\97\90M\83o\83b\83t\83@\82ð\96³\8cø\82É\82·\82é\r
+#ifdef DISABLE_TRANSFER_NETWORK_BUFFERS\r
int buf_size = 0;\r
setsockopt(dSkt, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size));\r
#endif\r
int Sts;\r
\r
Sts = NO;\r
- // \83o\83O\8fC\90³\r
+ // \94ä\8ar\82ª\95s\8a®\91S\82È\83o\83O\8fC\90³\r
// if((_stricmp(Fname, "CON") == 0) ||\r
// (_stricmp(Fname, "PRN") == 0) ||\r
// (_stricmp(Fname, "AUX") == 0) ||\r
New->DialupAlways = Host->DialupAlways;\r
New->DialupNotify = Host->DialupNotify;\r
strcpy(New->DialEntry, Host->DialEntry);\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ New->UseFTPES = Host->UseFTPES;\r
+ New->UseFTPIS = Host->UseFTPIS;\r
+ New->UseSFTP = Host->UseSFTP;\r
return;\r
}\r
\r
Host->DialupAlways = Hist->DialupAlways;\r
Host->DialupNotify = Hist->DialupNotify;\r
strcpy(Host->DialEntry, Hist->DialEntry);\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ Host->UseFTPES = Hist->UseFTPES;\r
+ Host->UseFTPIS = Hist->UseFTPIS;\r
+ Host->UseSFTP = Hist->UseSFTP;\r
return;\r
}\r
\r
static BOOL CALLBACK CodeSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
static BOOL CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
static BOOL CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+static BOOL CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
\r
/*===== \8aO\95\94\8eQ\8fÆ =====*/\r
\r
Set->UseNLST_R = Pos->Set.UseNLST_R;\r
Set->LastDir = Pos->Set.LastDir;\r
Set->TimeZone = Pos->Set.TimeZone;\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ Set->UseFTPES = Pos->Set.UseFTPES;\r
+ Set->UseFTPIS = Pos->Set.UseFTPIS;\r
+ Set->UseSFTP = Pos->Set.UseSFTP;\r
Sts = SUCCESS;\r
}\r
return(Sts);\r
Set->DialupAlways = NO;\r
Set->DialupNotify = YES;\r
strcpy(Set->DialEntry, "");\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ Set->CryptMode = CRYPT_NONE;\r
+ Set->UseFTPES = YES;\r
+ Set->UseFTPIS = YES;\r
+ Set->UseSFTP = YES;\r
return;\r
}\r
\r
\r
static int DispHostSetDlg(HWND hDlg)\r
{\r
- PROPSHEETPAGE psp[5];\r
+// SFTP\81AFTPES\81AFTPIS\91Î\89\9e\r
+// PROPSHEETPAGE psp[5];\r
+ PROPSHEETPAGE psp[6];\r
PROPSHEETHEADER psh;\r
\r
psp[0].dwSize = sizeof(PROPSHEETPAGE);\r
psp[4].lParam = 0;\r
psp[4].pfnCallback = NULL;\r
\r
+// SFTP\81AFTPES\81AFTPIS\91Î\89\9e\r
+ psp[5].dwSize = sizeof(PROPSHEETPAGE);\r
+ psp[5].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
+ psp[5].hInstance = GetFtpInst();\r
+ psp[5].pszTemplate = MAKEINTRESOURCE(hset_crypt_dlg);\r
+ psp[5].pszIcon = NULL;\r
+ psp[5].pfnDlgProc = CryptSettingProc;\r
+ psp[5].pszTitle = MSGJPN313;\r
+ psp[5].lParam = 0;\r
+ psp[5].pfnCallback = NULL;\r
+\r
psh.dwSize = sizeof(PROPSHEETHEADER);\r
psh.dwFlags = PSH_HASHELP | PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE;\r
psh.hwndParent = hDlg;\r
\r
// UTF-8\91Î\89\9e\r
case HSET_NO_CNV :\r
- case HSET_SJIS_CNV :\r
case HSET_UTF8N_CNV :\r
EnableWindow(GetDlgItem(hDlg, HSET_HANCNV), FALSE);\r
break;\r
\r
+ case HSET_SJIS_CNV :\r
case HSET_FN_JIS_CNV :\r
case HSET_FN_EUC_CNV :\r
EnableWindow(GetDlgItem(hDlg, HSET_FN_HANCNV), TRUE);\r
}\r
\r
\r
+// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+static BOOL CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+ NMHDR *pnmhdr;\r
+ int Num;\r
+\r
+ switch (iMessage)\r
+ {\r
+ case WM_INITDIALOG :\r
+ if(IsOpenSSLLoaded())\r
+ {\r
+ SendDlgItemMessage(hDlg, HSET_FTPES, BM_SETCHECK, TmpHost.UseFTPES, 0);\r
+ SendDlgItemMessage(hDlg, HSET_FTPIS, BM_SETCHECK, TmpHost.UseFTPIS, 0);\r
+ SendDlgItemMessage(hDlg, HSET_SFTP, BM_SETCHECK, TmpHost.UseSFTP, 0);\r
+ }\r
+ else\r
+ {\r
+ SendDlgItemMessage(hDlg, HSET_FTPES, BM_SETCHECK, BST_UNCHECKED, 0);\r
+ EnableWindow(GetDlgItem(hDlg, HSET_FTPES), FALSE);\r
+ SendDlgItemMessage(hDlg, HSET_FTPIS, BM_SETCHECK, BST_UNCHECKED, 0);\r
+ EnableWindow(GetDlgItem(hDlg, HSET_FTPIS), FALSE);\r
+ SendDlgItemMessage(hDlg, HSET_SFTP, BM_SETCHECK, BST_UNCHECKED, 0);\r
+ EnableWindow(GetDlgItem(hDlg, HSET_SFTP), FALSE);\r
+ }\r
+ // TODO: FTPIS\91Î\89\9e\r
+ SendDlgItemMessage(hDlg, HSET_FTPIS, BM_SETCHECK, BST_UNCHECKED, 0);\r
+ EnableWindow(GetDlgItem(hDlg, HSET_FTPIS), FALSE);\r
+ // TODO: SFTP\91Î\89\9e\r
+ SendDlgItemMessage(hDlg, HSET_SFTP, BM_SETCHECK, BST_UNCHECKED, 0);\r
+ EnableWindow(GetDlgItem(hDlg, HSET_SFTP), FALSE);\r
+ return(TRUE);\r
+\r
+ case WM_NOTIFY:\r
+ pnmhdr = (NMHDR FAR *)lParam;\r
+ switch(pnmhdr->code)\r
+ {\r
+ case PSN_APPLY :\r
+ if(IsOpenSSLLoaded())\r
+ {\r
+ TmpHost.UseFTPES = SendDlgItemMessage(hDlg, HSET_FTPES, BM_GETCHECK, 0, 0);\r
+ // TODO: FTPIS\91Î\89\9e\r
+// TmpHost.UseFTPIS = SendDlgItemMessage(hDlg, HSET_FTPIS, BM_GETCHECK, 0, 0);\r
+ // TODO: SFTP\91Î\89\9e\r
+// TmpHost.UseSFTP = SendDlgItemMessage(hDlg, HSET_SFTP, BM_GETCHECK, 0, 0);\r
+ }\r
+ Apply = YES;\r
+ break;\r
+\r
+ case PSN_RESET :\r
+ break;\r
+\r
+ case PSN_HELP :\r
+ // TODO: \83w\83\8b\83v\83g\83s\83b\83N\r
+// hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000032);\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+ return(FALSE);\r
+}\r
+\r
+\r
\r
InitCommonControls();\r
\r
+#ifdef USE_OPENSSL\r
+ LoadOpenSSL();\r
+#endif\r
+\r
Ret = FALSE;\r
hWndFtp = NULL;\r
hInstFtp = hInstance;\r
Ret = Msg.wParam;\r
}\r
UnregisterClass(FtpClassStr, hInstFtp);\r
+#ifdef USE_OPENSSL\r
+ FreeOpenSSL();\r
+#endif\r
OleUninitialize();\r
return(Ret);\r
}\r
{\r
LoadRegistory();\r
\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);\r
+\r
LoadJre();\r
if(NoRasControl == NO)\r
LoadRasLib();\r
}\r
}\r
\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+#ifdef USE_OPENSSL\r
+ if(IsOpenSSLLoaded())\r
+ SetTaskMsg(MSGJPN318);\r
+ else\r
+ SetTaskMsg(MSGJPN319);\r
+#endif\r
+\r
if(sts == FAIL)\r
DeleteAllObject();\r
\r
DispTransferType();\r
CheckHistoryNum(0);\r
SetAllHistoryToMenu();\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);\r
break;\r
\r
case MENU_FILTER :\r
int Ret;\r
\r
Ret = NO;\r
+ SendMessage(GetMainHwnd(), WM_NULL, 0, 0);\r
while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))\r
{\r
if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
}\r
return 0;\r
}\r
+\r
+// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+BOOL __stdcall SSLTimeoutCallback()\r
+{\r
+ Sleep(1);\r
+ if(BackgrndMessageProc() == YES)\r
+ return TRUE;\r
+ // \94O\82Ì\82½\82ß\83c\81[\83\8b\83o\81[\82ÌMENU_ABORT\82à\8am\94F\r
+// if(MainTransPkt.Abort != ABORT_NONE)\r
+// {\r
+// MainTransPkt.Abort = ABORT_NONE;\r
+// return TRUE;\r
+// }\r
+ return FALSE;\r
+}\r
+\r
pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
r = SendMessageW(hWnd, CB_ADDSTRING, wParam, (LPARAM)pw0);
break;
+ case CB_GETLBTEXT:
+ Size = SendMessageW(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
+ pw0 = AllocateStringW(Size);
+ SendMessageW(hWnd, CB_GETLBTEXT, wParam, (LPARAM)pw0);
+ // \83o\83b\83t\83@\92·\95s\96¾\82Ì\82½\82ß\83I\81[\83o\81[\83\89\83\93\82Ì\89Â\94\\90«\82 \82è
+ WtoM((LPSTR)lParam, Size * 4, pw0, -1);
+ r = TerminateStringM((LPSTR)lParam, Size * 4);
+ break;
+ case CB_GETLBTEXTLEN:
+ Size = SendMessageW(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
+ pw0 = AllocateStringW(Size);
+ SendMessageW(hWnd, WM_GETTEXT, wParam, (LPARAM)pw0);
+ r = WtoM(NULL, 0, pw0, -1) - 1;
+ break;
case CB_INSERTSTRING:
pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
r = SendMessageW(hWnd, CB_INSERTSTRING, wParam, (LPARAM)pw0);
break;
case LB_GETTEXT:
Size = SendMessageW(hWnd, LB_GETTEXTLEN, wParam, 0) + 1;
- pw0 = AllocateStringW(Size * 4);
+ pw0 = AllocateStringW(Size);
SendMessageW(hWnd, LB_GETTEXT, wParam, (LPARAM)pw0);
// \83o\83b\83t\83@\92·\95s\96¾\82Ì\82½\82ß\83I\81[\83o\81[\83\89\83\93\82Ì\89Â\94\\90«\82 \82è
WtoM((LPSTR)lParam, Size * 4, pw0, -1);
r = TerminateStringM((LPSTR)lParam, Size * 4);
break;
+ case LB_GETTEXTLEN:
+ Size = SendMessageW(hWnd, LB_GETTEXTLEN, wParam, 0) + 1;
+ pw0 = AllocateStringW(Size);
+ SendMessageW(hWnd, WM_GETTEXT, wParam, (LPARAM)pw0);
+ r = WtoM(NULL, 0, pw0, -1) - 1;
+ break;
default:
r = SendMessageW(hWnd, Msg, wParam, lParam);
break;
return r;
}
-
-
-
-
-
#define MSGJPN310 "EUC Kanji Code (Local)"\r
#define MSGJPN311 "JIS Kanji Code (Local)"\r
#define MSGJPN312 "UTF-8N Kanji Code (Local)"\r
+#define MSGJPN313 "Encryption"\r
+#define MSGJPN314 "Communication is not encrypted.\r\nPassword and other data may be intercepted by a third party."\r
+#define MSGJPN315 "Using FTP over Explicit SSL/TLS (FTPES)."\r
+#define MSGJPN316 "Using FTP over Inplicit SSL/TLS (FTPIS)."\r
+#define MSGJPN317 "Using SSH FTP (SFTP)."\r
+#define MSGJPN318 "OpenSSL is loaded."\r
+#define MSGJPN319 "OpenSSL is not installed.\r\nCommunication will not be encrypted."\r
#define MSGJPN310 "EUC Kanji Code (Local)"
#define MSGJPN311 "JIS Kanji Code (Local)"
#define MSGJPN312 "UTF-8N Kanji Code (Local)"
+#define MSGJPN313 "Encryption"
+#define MSGJPN314 "Communication is not encrypted.\r\nPassword and other data may be intercepted by a third party."
+#define MSGJPN315 "Using FTP over Explicit SSL/TLS (FTPES)."
+#define MSGJPN316 "Using FTP over Inplicit SSL/TLS (FTPIS)."
+#define MSGJPN317 "Using SSH FTP (SFTP)."
+#define MSGJPN318 "OpenSSL is loaded."
+#define MSGJPN319 "OpenSSL is not installed.\r\nCommunication will not be encrypted."
#define MSGJPN310 "\xE3\x83\xAD\xE3\x83\xBC\xE3\x82\xAB\xE3\x83\xAB\xE3\x81\xAE\xE6\xBC\xA2\xE5\xAD\x97\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAF\x45UC"\r
#define MSGJPN311 "\xE3\x83\xAD\xE3\x83\xBC\xE3\x82\xAB\xE3\x83\xAB\xE3\x81\xAE\xE6\xBC\xA2\xE5\xAD\x97\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAFJIS"\r
#define MSGJPN312 "\xE3\x83\xAD\xE3\x83\xBC\xE3\x82\xAB\xE3\x83\xAB\xE3\x81\xAE\xE6\xBC\xA2\xE5\xAD\x97\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAFUTF-8N"\r
+#define MSGJPN313 "\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96"\r
+#define MSGJPN314 "\xE9\x80\x9A\xE4\xBF\xA1\xE3\x81\xAF\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.\r\n\xE7\xAC\xAC\xE4\xB8\x89\xE8\x80\x85\xE3\x81\xAB\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\x8A\xE3\x82\x88\xE3\x81\xB3\xE5\x86\x85\xE5\xAE\xB9\xE3\x82\x92\xE5\x82\x8D\xE5\x8F\x97\xE3\x81\x95\xE3\x82\x8C\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."\r
+#define MSGJPN315 "FTP over Explicit SSL/TLS (FTPES)\xE3\x82\x92\xE4\xBD\xBF\xE7\x94\xA8\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99."\r
+#define MSGJPN316 "FTP over Inplicit SSL/TLS (FTPIS)\xE3\x82\x92\xE4\xBD\xBF\xE7\x94\xA8\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99."\r
+#define MSGJPN317 "SSH FTP (SFTP)\xE3\x82\x92\xE4\xBD\xBF\xE7\x94\xA8\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99."\r
+#define MSGJPN318 "OpenSSL\xE3\x81\x8C\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x81\xBE\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F."\r
+#define MSGJPN319 "OpenSSL\xE3\x81\x8C\xE3\x82\xA4\xE3\x83\xB3\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xBC\xE3\x83\xAB\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.\r\n\xE9\x80\x9A\xE4\xBF\xA1\xE3\x81\xAE\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\xAF\xE8\xA1\x8C\xE3\x82\x8F\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93."\r
#define MSGJPN310 "\83\8d\81[\83J\83\8b\82Ì\8a¿\8e\9a\83R\81[\83h\82ÍEUC"
#define MSGJPN311 "\83\8d\81[\83J\83\8b\82Ì\8a¿\8e\9a\83R\81[\83h\82ÍJIS"
#define MSGJPN312 "\83\8d\81[\83J\83\8b\82Ì\8a¿\8e\9a\83R\81[\83h\82ÍUTF-8N"
+#define MSGJPN313 "\88Ã\8d\86\89»"
+#define MSGJPN314 "\92Ê\90M\82Í\88Ã\8d\86\89»\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ.\r\n\91æ\8eO\8eÒ\82É\83p\83X\83\8f\81[\83h\82¨\82æ\82Ñ\93à\97e\82ð\96T\8eó\82³\82ê\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·."
+#define MSGJPN315 "FTP over Explicit SSL/TLS (FTPES)\82ð\8eg\97p\82µ\82Ü\82·."
+#define MSGJPN316 "FTP over Inplicit SSL/TLS (FTPIS)\82ð\8eg\97p\82µ\82Ü\82·."
+#define MSGJPN317 "SSH FTP (SFTP)\82ð\8eg\97p\82µ\82Ü\82·."
+#define MSGJPN318 "OpenSSL\82ª\93Ç\82Ý\8d\9e\82Ü\82ê\82Ü\82µ\82½."
+#define MSGJPN319 "OpenSSL\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ.\r\n\92Ê\90M\82Ì\88Ã\8d\86\89»\82Í\8ds\82í\82ê\82Ü\82¹\82ñ."
SaveIntNum(hKey5, "UseIt", Hist.DialupAlways, DefaultHist.DialupAlways);\r
SaveIntNum(hKey5, "Notify", Hist.DialupNotify, DefaultHist.DialupNotify);\r
SaveStr(hKey5, "DialTo", Hist.DialEntry, DefaultHist.DialEntry);\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ SaveIntNum(hKey5, "FTPES", Hist.UseFTPES, DefaultHist.UseFTPES);\r
+ SaveIntNum(hKey5, "FTPIS", Hist.UseFTPIS, DefaultHist.UseFTPIS);\r
+ SaveIntNum(hKey5, "SFTP", Hist.UseSFTP, DefaultHist.UseSFTP);\r
\r
CloseSubKey(hKey5);\r
n++;\r
SaveIntNum(hKey5, "UseIt", Host.DialupAlways, DefaultHost.DialupAlways);\r
SaveIntNum(hKey5, "Notify", Host.DialupNotify, DefaultHost.DialupNotify);\r
SaveStr(hKey5, "DialTo", Host.DialEntry, DefaultHost.DialEntry);\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ SaveIntNum(hKey5, "FTPES", Host.UseFTPES, DefaultHost.UseFTPES);\r
+ SaveIntNum(hKey5, "FTPIS", Host.UseFTPIS, DefaultHost.UseFTPIS);\r
+ SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
}\r
CloseSubKey(hKey5);\r
}\r
ReadIntValueFromReg(hKey5, "UseIt", &Hist.DialupAlways);\r
ReadIntValueFromReg(hKey5, "Notify", &Hist.DialupNotify);\r
ReadStringFromReg(hKey5, "DialTo", Hist.DialEntry, RAS_NAME_LEN+1);\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ ReadIntValueFromReg(hKey5, "FTPES", &Hist.UseFTPES);\r
+ ReadIntValueFromReg(hKey5, "FTPIS", &Hist.UseFTPIS);\r
+ ReadIntValueFromReg(hKey5, "SFTP", &Hist.UseSFTP);\r
\r
CloseSubKey(hKey5);\r
AddHistoryToHistory(&Hist);\r
ReadIntValueFromReg(hKey5, "UseIt", &Host.DialupAlways);\r
ReadIntValueFromReg(hKey5, "Notify", &Host.DialupNotify);\r
ReadStringFromReg(hKey5, "DialTo", Host.DialEntry, RAS_NAME_LEN+1);\r
+ // \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+ ReadIntValueFromReg(hKey5, "FTPES", &Host.UseFTPES);\r
+ ReadIntValueFromReg(hKey5, "FTPIS", &Host.UseFTPIS);\r
+ ReadIntValueFromReg(hKey5, "SFTP", &Host.UseSFTP);\r
\r
CloseSubKey(hKey5);\r
\r
memset(Buf, 0, Max);\r
\r
if((SizeOnce == -2) || (AskTransferNow() == YES))\r
- DisconnectSet();\r
+ // \93]\91\97\92\86\82É\91S\82Ä\92\86\8e~\82ð\8ds\82¤\82Æ\95s\90³\82È\83f\81[\83^\82ª\93¾\82ç\82ê\82é\8fê\8d\87\82Ì\83o\83O\8fC\90³\r
+ // \83G\83\89\81[\82Ì\8eí\97Þ\82É\82æ\82Á\82Ä\82Í\96³\8cÀ\83\8b\81[\83v\82Æ\83X\83^\83b\83N\83I\81[\83o\81[\83t\83\8d\81[\82Ì\89Â\94\\90«\82 \82è\r
+// DisconnectSet();\r
+ {\r
+ if(SizeOnce == -1)\r
+ ReConnectCmdSkt();\r
+ else\r
+ DisconnectSet();\r
+ }\r
}\r
else\r
{\r
} ASYNCSIGNALDATABASE;\r
\r
\r
-#define MAX_SIGNAL_ENTRY 10\r
-#define MAX_SIGNAL_ENTRY_DBASE 5\r
+// \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+//#define MAX_SIGNAL_ENTRY 10\r
+//#define MAX_SIGNAL_ENTRY_DBASE 5\r
+#define MAX_SIGNAL_ENTRY 100\r
+#define MAX_SIGNAL_ENTRY_DBASE 50\r
\r
\r
\r
static ASYNCSIGNALDATABASE SignalDbase[MAX_SIGNAL_ENTRY_DBASE];\r
\r
//static HANDLE hAsyncTblAccMutex;\r
+// \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+static HANDLE hAsyncTblAccMutex;\r
\r
\r
\r
{\r
// hAsyncTblAccMutex = CreateMutex(NULL, FALSE, NULL);\r
\r
- for(i = 0; i < MAX_SIGNAL_ENTRY; i++)\r
- Signal[i].Socket = INVALID_SOCKET;\r
- for(i = 0; i < MAX_SIGNAL_ENTRY_DBASE; i++)\r
- SignalDbase[i].Async = 0;\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+// for(i = 0; i < MAX_SIGNAL_ENTRY; i++)\r
+// Signal[i].Socket = INVALID_SOCKET;\r
+// for(i = 0; i < MAX_SIGNAL_ENTRY_DBASE; i++)\r
+// SignalDbase[i].Async = 0;\r
+ if(hAsyncTblAccMutex = CreateMutex(NULL, FALSE, NULL))\r
+ {\r
+ for(i = 0; i < MAX_SIGNAL_ENTRY; i++)\r
+ Signal[i].Socket = INVALID_SOCKET;\r
+ for(i = 0; i < MAX_SIGNAL_ENTRY_DBASE; i++)\r
+ SignalDbase[i].Async = 0;\r
+ }\r
Sts = SUCCESS;\r
}\r
return(Sts);\r
void DeleteSocketWin(void)\r
{\r
// CloseHandle(hAsyncTblAccMutex);\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ CloseHandle(hAsyncTblAccMutex);\r
+ hAsyncTblAccMutex = NULL;\r
\r
if(hWndSocket != NULL)\r
DestroyWindow(hWndSocket);\r
switch(message)\r
{\r
case WM_ASYNC_SOCKET :\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
{\r
if(Signal[Pos].Socket == (SOCKET)wParam)\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
break;\r
\r
case WM_ASYNC_DBASE :\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)\r
{\r
if(SignalDbase[Pos].Async == (HANDLE)wParam)\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
break;\r
\r
default :\r
int Sts;\r
int Pos;\r
\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
Sts = NO;\r
*Error = 0;\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
\r
if(Pos == MAX_SIGNAL_ENTRY)\r
{\r
int Sts;\r
int Pos;\r
\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
Sts = NO;\r
*Error = 0;\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
\r
if(Pos == MAX_SIGNAL_ENTRY_DBASE)\r
{\r
int Sts;\r
int Pos;\r
\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
Sts = NO;\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
{\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
\r
if(Pos == MAX_SIGNAL_ENTRY)\r
{\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
{\r
if(Signal[Pos].Socket == INVALID_SOCKET)\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
\r
if(Pos == MAX_SIGNAL_ENTRY)\r
{\r
int Sts;\r
int Pos;\r
\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
Sts = NO;\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)\r
{\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
\r
if(Pos == MAX_SIGNAL_ENTRY_DBASE)\r
{\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
{\r
if(SignalDbase[Pos].Async == 0)\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
\r
if(Pos == MAX_SIGNAL_ENTRY_DBASE)\r
{\r
int Sts;\r
int Pos;\r
\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
Sts = NO;\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
{\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
return(Sts);\r
}\r
\r
int Sts;\r
int Pos;\r
\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
Sts = NO;\r
for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)\r
{\r
break;\r
}\r
}\r
+ // \83X\83\8c\83b\83h\8fÕ\93Ë\82Ì\83o\83O\8fC\90³\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
return(Sts);\r
}\r
\r
#endif\r
CancelCheckWork = NO;\r
\r
- Ret = closesocket(s);\r
+ // FTPS\91Î\89\9e\r
+// Ret = closesocket(s);\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ Ret = closesocketS(s);\r
+ else\r
+ Ret = closesocket(s);\r
if(Ret == SOCKET_ERROR)\r
{\r
Error = 0;\r
Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE);\r
if(Ret != SOCKET_ERROR)\r
{\r
- Ret = connect(s, name, namelen);\r
+ // FTPS\91Î\89\9e\r
+// Ret = connect(s, name, namelen);\r
+ if(AskCryptMode() == CRYPT_FTPIS)\r
+ Ret = connectS(s, name, namelen);\r
+ else\r
+ Ret = connect(s, name, namelen);\r
if(Ret == SOCKET_ERROR)\r
{\r
do\r
{\r
do\r
{\r
- Ret2 = accept(s, addr, addrlen);\r
+ // FTPS\91Î\89\9e\r
+// Ret2 = accept(s, addr, addrlen);\r
+ if(AskCryptMode() == CRYPT_FTPIS)\r
+ Ret2 = acceptS(s, addr, addrlen);\r
+ else\r
+ Ret2 = accept(s, addr, addrlen);\r
if(Ret2 != INVALID_SOCKET)\r
{\r
#if DBG_MSG\r
if(TimeOut != 0)\r
time(&StartTime);\r
\r
- while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES))\r
+ // FTPS\91Î\89\9e\r
+ // OpenSSL\82Å\82Í\8eó\90M\8am\94F\82ÍFD_READ\82ª\95¡\90\94\89ñ\8eó\90M\82³\82ê\82é\89Â\94\\90«\82ª\82 \82é\r
+// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES))\r
+ while(AskCryptMode() == CRYPT_NONE && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES))\r
{\r
if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)\r
{\r
DoPrintf("## recv()");\r
#endif\r
\r
- Ret = recv(s, buf, len, flags);\r
+ // FTPS\91Î\89\9e\r
+// Ret = recv(s, buf, len, flags);\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ Ret = recvS(s, buf, len, flags);\r
+ else\r
+ Ret = recv(s, buf, len, flags);\r
if(Ret != SOCKET_ERROR)\r
break;\r
Error = WSAGetLastError();\r
Sleep(1);\r
if(BackgrndMessageProc() == YES)\r
break;\r
+ // FTPS\91Î\89\9e\r
+ // \8eó\90M\8am\94F\82ð\83o\83C\83p\83X\82µ\82½\82½\82ß\82±\82±\82Å\83^\83C\83\80\83A\83E\83g\82Ì\8am\94F\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ {\r
+ if(BackgrndMessageProc() == YES)\r
+ *CancelCheckWork = YES;\r
+ }\r
+ else if(TimeOut != 0)\r
+ {\r
+ time(&ElapseTime);\r
+ ElapseTime -= StartTime;\r
+ if(ElapseTime >= TimeOut)\r
+ {\r
+ DoPrintf("do_recv timed out");\r
+ *TimeOutErr = YES;\r
+ *CancelCheckWork = YES;\r
+ }\r
+ }\r
+ if(*CancelCheckWork == YES)\r
+ break;\r
}\r
while(Error == WSAEWOULDBLOCK);\r
}\r
if(BackgrndMessageProc() == YES)\r
*CancelCheckWork = YES;\r
\r
- while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))\r
+ // FTPS\91Î\89\9e\r
+ // \91\97\90M\83o\83b\83t\83@\82Ì\8bó\82«\8am\94F\82É\82Í\89e\8b¿\82µ\82È\82¢\82ª\94O\82Ì\82½\82ß\r
+// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))\r
+ while(AskCryptMode() == CRYPT_NONE && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))\r
{\r
if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)\r
{\r
DoPrintf("## send()");\r
#endif\r
\r
- Ret = send(s, buf, len, flags);\r
+ // FTPS\91Î\89\9e\r
+// Ret = send(s, buf, len, flags);\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ Ret = sendS(s, buf, len, flags);\r
+ else\r
+ Ret = send(s, buf, len, flags);\r
if(Ret != SOCKET_ERROR)\r
{\r
#if DBG_MSG\r
Sleep(1);\r
if(BackgrndMessageProc() == YES)\r
break;\r
+ // FTPS\91Î\89\9e\r
+ // \91\97\90M\83o\83b\83t\83@\8am\94F\82ð\83o\83C\83p\83X\82µ\82½\82½\82ß\82±\82±\82Å\83^\83C\83\80\83A\83E\83g\82Ì\8am\94F\r
+ if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
+ {\r
+ if(BackgrndMessageProc() == YES)\r
+ *CancelCheckWork = YES;\r
+ }\r
+ else if(TimeOut != 0)\r
+ {\r
+ time(&ElapseTime);\r
+ ElapseTime -= StartTime;\r
+ if(ElapseTime >= TimeOut)\r
+ {\r
+ DoPrintf("do_recv timed out");\r
+ *TimeOutErr = YES;\r
+ *CancelCheckWork = YES;\r
+ }\r
+ }\r
+ if(*CancelCheckWork == YES)\r
+ break;\r
}\r
while(Error == WSAEWOULDBLOCK);\r
}\r
--- /dev/null
+// socketwrapper.cpp
+// Copyright (C) 2011 Suguru Kawamoto
+// \83\\83P\83b\83g\83\89\83b\83p\81[
+// socket\8aÖ\98A\8aÖ\90\94\82ðOpenSSL\97p\82É\92u\8a·
+// \83R\83\93\83p\83C\83\8b\82É\82ÍOpenSSL\82Ì\83w\83b\83_\81[\83t\83@\83C\83\8b\82ª\95K\97v
+// \8eÀ\8ds\82É\82ÍOpenSSL\82ÌDLL\82ª\95K\97v
+
+#include <windows.h>
+#include <mmsystem.h>
+#include <openssl/ssl.h>
+
+#include "socketwrapper.h"
+
+typedef void (__stdcall* _SSL_load_error_strings)();
+typedef int (__stdcall* _SSL_library_init)();
+typedef SSL_METHOD* (__stdcall* _SSLv23_method)();
+typedef SSL_CTX* (__stdcall* _SSL_CTX_new)(SSL_METHOD*);
+typedef void (__stdcall* _SSL_CTX_free)(SSL_CTX*);
+typedef SSL* (__stdcall* _SSL_new)(SSL_CTX*);
+typedef void (__stdcall* _SSL_free)(SSL*);
+typedef int (__stdcall* _SSL_shutdown)(SSL*);
+typedef int (__stdcall* _SSL_get_fd)(SSL*);
+typedef int (__stdcall* _SSL_set_fd)(SSL*, int);
+typedef int (__stdcall* _SSL_accept)(SSL*);
+typedef int (__stdcall* _SSL_connect)(SSL*);
+typedef int (__stdcall* _SSL_write)(SSL*, const void*, int);
+typedef int (__stdcall* _SSL_peek)(SSL*, void*, int);
+typedef int (__stdcall* _SSL_read)(SSL*, void*, int);
+typedef int (__stdcall* _SSL_get_error)(SSL*, int);
+
+_SSL_load_error_strings pSSL_load_error_strings;
+_SSL_library_init pSSL_library_init;
+_SSLv23_method pSSLv23_method;
+_SSL_CTX_new pSSL_CTX_new;
+_SSL_CTX_free pSSL_CTX_free;
+_SSL_new pSSL_new;
+_SSL_free pSSL_free;
+_SSL_shutdown pSSL_shutdown;
+_SSL_get_fd pSSL_get_fd;
+_SSL_set_fd pSSL_set_fd;
+_SSL_accept pSSL_accept;
+_SSL_connect pSSL_connect;
+_SSL_write pSSL_write;
+_SSL_peek pSSL_peek;
+_SSL_read pSSL_read;
+_SSL_get_error pSSL_get_error;
+
+#define MAX_SSL_SOCKET 16
+
+BOOL g_bOpenSSLLoaded;
+HMODULE g_hOpenSSL;
+CRITICAL_SECTION g_OpenSSLLock;
+DWORD g_OpenSSLTimeout;
+LPSSLTIMEOUTCALLBACK g_pOpenSSLTimeoutCallback;
+SSL_CTX* g_pOpenSSLCTX;
+SSL* g_pOpenSSLHandle[MAX_SSL_SOCKET];
+
+BOOL __stdcall DefaultSSLTimeoutCallback()
+{
+ Sleep(100);
+ return FALSE;
+}
+
+BOOL LoadOpenSSL()
+{
+ if(g_bOpenSSLLoaded)
+ return FALSE;
+ g_hOpenSSL = LoadLibrary("ssleay32.dll");
+ if(!g_hOpenSSL)
+ g_hOpenSSL = LoadLibrary("libssl32.dll");
+ if(!g_hOpenSSL
+ || !(pSSL_load_error_strings = (_SSL_load_error_strings)GetProcAddress(g_hOpenSSL, "SSL_load_error_strings"))
+ || !(pSSL_library_init = (_SSL_library_init)GetProcAddress(g_hOpenSSL, "SSL_library_init"))
+ || !(pSSLv23_method = (_SSLv23_method)GetProcAddress(g_hOpenSSL, "SSLv23_method"))
+ || !(pSSL_CTX_new = (_SSL_CTX_new)GetProcAddress(g_hOpenSSL, "SSL_CTX_new"))
+ || !(pSSL_CTX_free = (_SSL_CTX_free)GetProcAddress(g_hOpenSSL, "SSL_CTX_free"))
+ || !(pSSL_new = (_SSL_new)GetProcAddress(g_hOpenSSL, "SSL_new"))
+ || !(pSSL_free = (_SSL_free)GetProcAddress(g_hOpenSSL, "SSL_free"))
+ || !(pSSL_shutdown = (_SSL_shutdown)GetProcAddress(g_hOpenSSL, "SSL_shutdown"))
+ || !(pSSL_get_fd = (_SSL_get_fd)GetProcAddress(g_hOpenSSL, "SSL_get_fd"))
+ || !(pSSL_set_fd = (_SSL_set_fd)GetProcAddress(g_hOpenSSL, "SSL_set_fd"))
+ || !(pSSL_accept = (_SSL_accept)GetProcAddress(g_hOpenSSL, "SSL_accept"))
+ || !(pSSL_connect = (_SSL_connect)GetProcAddress(g_hOpenSSL, "SSL_connect"))
+ || !(pSSL_write = (_SSL_write)GetProcAddress(g_hOpenSSL, "SSL_write"))
+ || !(pSSL_peek = (_SSL_peek)GetProcAddress(g_hOpenSSL, "SSL_peek"))
+ || !(pSSL_read = (_SSL_read)GetProcAddress(g_hOpenSSL, "SSL_read"))
+ || !(pSSL_get_error = (_SSL_get_error)GetProcAddress(g_hOpenSSL, "SSL_get_error")))
+ {
+ FreeLibrary(g_hOpenSSL);
+ g_hOpenSSL = NULL;
+ return FALSE;
+ }
+ InitializeCriticalSection(&g_OpenSSLLock);
+ pSSL_load_error_strings();
+ pSSL_library_init();
+ SetSSLTimeoutCallback(60000, DefaultSSLTimeoutCallback);
+ g_bOpenSSLLoaded = TRUE;
+ return TRUE;
+}
+
+void FreeOpenSSL()
+{
+ int i;
+ if(!g_bOpenSSLLoaded)
+ return;
+ EnterCriticalSection(&g_OpenSSLLock);
+ for(i = 0; i < MAX_SSL_SOCKET; i++)
+ {
+ if(g_pOpenSSLHandle[i])
+ {
+ pSSL_shutdown(g_pOpenSSLHandle[i]);
+ pSSL_free(g_pOpenSSLHandle[i]);
+ g_pOpenSSLHandle[i] = NULL;
+ }
+ }
+ if(g_pOpenSSLCTX)
+ pSSL_CTX_free(g_pOpenSSLCTX);
+ g_pOpenSSLCTX = NULL;
+ FreeLibrary(g_hOpenSSL);
+ g_hOpenSSL = NULL;
+ LeaveCriticalSection(&g_OpenSSLLock);
+ DeleteCriticalSection(&g_OpenSSLLock);
+ g_bOpenSSLLoaded = FALSE;
+}
+
+BOOL IsOpenSSLLoaded()
+{
+ return g_bOpenSSLLoaded;
+}
+
+SSL** GetUnusedSSLPointer()
+{
+ int i;
+ for(i = 0; i < MAX_SSL_SOCKET; i++)
+ {
+ if(!g_pOpenSSLHandle[i])
+ return &g_pOpenSSLHandle[i];
+ }
+ return NULL;
+}
+
+SSL** FindSSLPointerFromSocket(SOCKET s)
+{
+ int i;
+ for(i = 0; i < MAX_SSL_SOCKET; i++)
+ {
+ if(g_pOpenSSLHandle[i])
+ {
+ if(pSSL_get_fd(g_pOpenSSLHandle[i]) == s)
+ return &g_pOpenSSLHandle[i];
+ }
+ }
+ return NULL;
+}
+
+void SetSSLTimeoutCallback(DWORD Timeout, LPSSLTIMEOUTCALLBACK pCallback)
+{
+ EnterCriticalSection(&g_OpenSSLLock);
+ g_OpenSSLTimeout = Timeout;
+ g_pOpenSSLTimeoutCallback = pCallback;
+ LeaveCriticalSection(&g_OpenSSLLock);
+}
+
+BOOL AttachSSL(SOCKET s)
+{
+ BOOL r;
+ DWORD Time;
+ SSL** ppSSL;
+ r = FALSE;
+ Time = timeGetTime();
+ EnterCriticalSection(&g_OpenSSLLock);
+ if(!g_pOpenSSLCTX)
+ g_pOpenSSLCTX = pSSL_CTX_new(pSSLv23_method());
+ if(g_pOpenSSLCTX)
+ {
+ if(ppSSL = GetUnusedSSLPointer())
+ {
+ if(*ppSSL = pSSL_new(g_pOpenSSLCTX))
+ {
+ if(pSSL_set_fd(*ppSSL, s) != 0)
+ {
+ r = TRUE;
+ // SSL\82Ì\83l\83S\83V\83G\81[\83V\83\87\83\93\82É\82Í\8e\9e\8aÔ\82ª\82©\82©\82é\8fê\8d\87\82ª\82 \82é
+ while(pSSL_connect(*ppSSL) != 1)
+ {
+ LeaveCriticalSection(&g_OpenSSLLock);
+ if(g_pOpenSSLTimeoutCallback() || timeGetTime() - Time >= g_OpenSSLTimeout)
+ {
+ DetachSSL(s);
+ r = FALSE;
+ EnterCriticalSection(&g_OpenSSLLock);
+ break;
+ }
+ EnterCriticalSection(&g_OpenSSLLock);
+ }
+ }
+ else
+ DetachSSL(s);
+ }
+ }
+ }
+ LeaveCriticalSection(&g_OpenSSLLock);
+ return r;
+}
+
+BOOL DetachSSL(SOCKET s)
+{
+ BOOL r;
+ SSL** ppSSL;
+ r = FALSE;
+ EnterCriticalSection(&g_OpenSSLLock);
+ if(ppSSL = FindSSLPointerFromSocket(s))
+ {
+ pSSL_shutdown(*ppSSL);
+ pSSL_free(*ppSSL);
+ *ppSSL = NULL;
+ r = TRUE;
+ }
+ LeaveCriticalSection(&g_OpenSSLLock);
+ return r;
+}
+
+BOOL IsSSLAttached(SOCKET s)
+{
+ SSL** ppSSL;
+ EnterCriticalSection(&g_OpenSSLLock);
+ ppSSL = FindSSLPointerFromSocket(s);
+ LeaveCriticalSection(&g_OpenSSLLock);
+ if(!ppSSL)
+ return TRUE;
+ return TRUE;
+}
+
+SOCKET socketS(int af, int type, int protocol)
+{
+ return socket(af, type, protocol);
+}
+
+int bindS(SOCKET s, const struct sockaddr *addr, int namelen)
+{
+ return bind(s, addr, namelen);
+}
+
+int listenS(SOCKET s, int backlog)
+{
+ return listen(s, backlog);
+}
+
+SOCKET acceptS(SOCKET s, struct sockaddr *addr, int *addrlen)
+{
+ SOCKET r;
+ r = accept(s, addr, addrlen);
+ if(!AttachSSL(r))
+ {
+ closesocket(r);
+ return INVALID_SOCKET;
+ }
+ return r;
+}
+
+int connectS(SOCKET s, const struct sockaddr *name, int namelen)
+{
+ int r;
+ r = connect(s, name, namelen);
+ if(!AttachSSL(r))
+ return SOCKET_ERROR;
+ return r;
+}
+
+int closesocketS(SOCKET s)
+{
+ DetachSSL(s);
+ return closesocket(s);
+}
+
+int sendS(SOCKET s, const char * buf, int len, int flags)
+{
+ SSL** ppSSL;
+ EnterCriticalSection(&g_OpenSSLLock);
+ ppSSL = FindSSLPointerFromSocket(s);
+ LeaveCriticalSection(&g_OpenSSLLock);
+ if(!ppSSL)
+ return send(s, buf, len, flags);
+ return pSSL_write(*ppSSL, buf, len);
+}
+
+int recvS(SOCKET s, char * buf, int len, int flags)
+{
+ SSL** ppSSL;
+ EnterCriticalSection(&g_OpenSSLLock);
+ ppSSL = FindSSLPointerFromSocket(s);
+ LeaveCriticalSection(&g_OpenSSLLock);
+ if(!ppSSL)
+ return recv(s, buf, len, flags);
+ if(flags & MSG_PEEK)
+ return pSSL_peek(*ppSSL, buf, len);
+ return pSSL_read(*ppSSL, buf, len);
+}
+
--- /dev/null
+// socketwrapper.h
+// Copyright (C) 2011 Suguru Kawamoto
+// \83\\83P\83b\83g\83\89\83b\83p\81[
+
+#ifndef __SOCKETWRAPPER_H__
+#define __SOCKETWRAPPER_H__
+
+#define USE_OPENSSL
+
+typedef BOOL (__stdcall* LPSSLTIMEOUTCALLBACK)();
+
+BOOL LoadOpenSSL();
+void FreeOpenSSL();
+BOOL IsOpenSSLLoaded();
+void SetSSLTimeoutCallback(DWORD Timeout, LPSSLTIMEOUTCALLBACK pCallback);
+BOOL AttachSSL(SOCKET s);
+BOOL DetachSSL(SOCKET s);
+BOOL IsSSLAttached(SOCKET s);
+SOCKET socketS(int af, int type, int protocol);
+int bindS(SOCKET s, const struct sockaddr *addr, int namelen);
+int listenS(SOCKET s, int backlog);
+SOCKET acceptS(SOCKET s, struct sockaddr *addr, int *addrlen);
+int connectS(SOCKET s, const struct sockaddr *name, int namelen);
+int closesocketS(SOCKET s);
+int sendS(SOCKET s, const char * buf, int len, int flags);
+int recvS(SOCKET s, char * buf, int len, int flags);
+
+#endif
+