X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=connect.c;h=bebf227d3f72c4f77da7bd9f03857de481d2e548;hb=b973cd74709d6f624fdc31d6008c1b8c521c87b7;hp=23b4e95297d7bc611923bf37245b4f4961fc7875;hpb=756eb24e756aa444a4f4bc2bfd2640d525ccdcb1;p=ffftp%2Fffftp.git diff --git a/connect.c b/connect.c index 23b4e95..bebf227 100644 --- a/connect.c +++ b/connect.c @@ -1,6 +1,6 @@ -/*============================================================================= +/*============================================================================= * -* ƒzƒXƒg‚ւ̐ڑ±^Ø’f +* ホストへの接続/切断 * =============================================================================== / Copyright (C) 1997-2007 Sota. All rights reserved. @@ -35,7 +35,9 @@ #include #include #include -#include +// IPv6対応 +//#include +#include #include #include @@ -45,30 +47,44 @@ #include #include "helpid.h" +// UTF-8対応 +#undef __MBSWRAPPER_H__ +#include "mbswrapper.h" -/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +/*===== プロトタイプ =====*/ static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static int SendInitCommand(char *Cmd); static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List); static void SaveCurrentSetToHistory(void); static int ReConnectSkt(SOCKET *Skt); -static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security); +// 暗号化通信対応 +// 同時接続対応 +//static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security); +static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork); +static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork); static int CheckOneTimePassword(char *Pass, char *Reply, int Type); static BOOL CALLBACK BlkHookFnc(void); static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port); +// IPv6対応 +static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port); static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork); -static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet); -static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet); +// 同時接続対応 +//static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet); +static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet, int *CancelCheckWork); +// 同時接続対応 +//static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet); +static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet, int *CancelCheckWork); static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork); -/*===== ŠO•”ŽQÆ =====*/ +/*===== 外部参照 =====*/ extern char FilterStr[FILTER_EXT_LEN+1]; extern char TitleHostName[HOST_ADRS_LEN+1]; extern int CancelFlg; -/* Ý’è’l */ +/* 設定値 */ extern char UserMailAdrs[USER_MAIL_LEN+1]; extern char FwallHost[HOST_ADRS_LEN+1]; extern char FwallUser[USER_NAME_LEN+1]; @@ -83,7 +99,7 @@ extern int FwallDelimiter; extern int PasvDefault; extern int QuickAnonymous; -/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ +/*===== ローカルなワーク =====*/ static int Anonymous; static int TryConnect = NO; @@ -91,10 +107,16 @@ static SOCKET CmdCtrlSocket = INVALID_SOCKET; static SOCKET TrnCtrlSocket = INVALID_SOCKET; static HOSTDATA CurHost; -/* Ú‘±’†‚̐ڑ±æASOCKSƒT[ƒo‚̃AƒhƒŒƒXî•ñ‚ð•Û‘¶‚µ‚Ä‚¨‚­ */ -/* ‚±‚̏î•ñ‚Ílistenƒ\ƒPƒbƒg‚ðŽæ“¾‚·‚éÛ‚É—p‚¢‚é */ -static struct sockaddr_in SocksSockAddr; /* SOCKSƒT[ƒo‚̃AƒhƒŒƒXî•ñ */ -static struct sockaddr_in CurSockAddr; /* Ú‘±æƒzƒXƒg‚̃AƒhƒŒƒXî•ñ */ +/* 接続中の接続先、SOCKSサーバのアドレス情報を保存しておく */ +/* この情報はlistenソケットを取得する際に用いる */ +// IPv6対応 +//static struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */ +//static struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */ +static struct sockaddr_in SocksSockAddrIPv4; /* SOCKSサーバのアドレス情報 */ +static struct sockaddr_in CurSockAddrIPv4; /* 接続先ホストのアドレス情報 */ +static struct sockaddr_in6 SocksSockAddrIPv6; /* SOCKSサーバのアドレス情報 */ +static struct sockaddr_in6 CurSockAddrIPv6; /* 接続先ホストのアドレス情報 */ +static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; static int UseIPadrs; static char DomainName[HOST_ADRS_LEN+1]; @@ -102,14 +124,14 @@ static char DomainName[HOST_ADRS_LEN+1]; -/*----- ƒzƒXƒgˆê——‚ðŽg‚Á‚ăzƒXƒg‚֐ڑ± ---------------------------------------- +/*----- ホスト一覧を使ってホストへ接続 ---------------------------------------- * * Parameter -* int Type : ƒ_ƒCƒAƒƒO‚̃^ƒCƒv (DLG_TYPE_xxx) -* int Num : Ú‘±‚·‚éƒzƒXƒg”ԍ†(0`, -1=ƒ_ƒCƒAƒƒO‚ðo‚·) +* int Type : ダイアログのタイプ (DLG_TYPE_xxx) +* int Num : 接続するホスト番号(0~, -1=ダイアログを出す) * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void ConnectProc(int Type, int Num) @@ -128,7 +150,7 @@ void ConnectProc(int Type, int Num) if(Num >= 0) SetCurrentHost(Num); - /* Ú‘±’†‚È‚çØ’f‚·‚é */ + /* 接続中なら切断する */ if(CmdCtrlSocket != INVALID_SOCKET) DisconnectProc(); @@ -136,8 +158,12 @@ void ConnectProc(int Type, int Num) InitPWDcommand(); CopyHostFromList(AskCurrentHost(), &CurHost); + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; - if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == SUCCESS) + if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS) { SetHostKanaCnvImm(CurHost.KanaCnv); SetHostKanjiCodeImm(CurHost.KanjiCode); @@ -155,11 +181,54 @@ void ConnectProc(int Type, int Num) Save = YES; DisableUserOpe(); - CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security); + // 暗号化通信対応 + // 同時接続対応 +// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // 暗号化通信対応 + switch(CurHost.CryptMode) + { + case CRYPT_NONE: + if(CurHost.UseFTPIS != NO || CurHost.UseSFTP != NO) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostExcryption(AskCurrentHost(), CurHost.UseNoEncryption, CurHost.UseFTPES, NO, NO); + } + break; + case CRYPT_FTPES: + if(CurHost.UseNoEncryption != NO || CurHost.UseFTPIS != NO || CurHost.UseSFTP != NO) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostExcryption(AskCurrentHost(), NO, CurHost.UseFTPES, NO, NO); + } + break; + case CRYPT_FTPIS: + if(CurHost.UseNoEncryption != NO || CurHost.UseFTPES != NO || CurHost.UseSFTP != NO) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostExcryption(AskCurrentHost(), NO, NO, CurHost.UseFTPIS, NO); + } + break; + case CRYPT_SFTP: + if(CurHost.UseNoEncryption != NO || CurHost.UseFTPES != NO || CurHost.UseFTPIS != NO) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostExcryption(AskCurrentHost(), NO, NO, NO, CurHost.UseSFTP); + } + break; + } + + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostName); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -189,13 +258,13 @@ void ConnectProc(int Type, int Num) } -/*----- ƒzƒXƒg–¼‚ð“ü—Í‚µ‚ăzƒXƒg‚֐ڑ± ---------------------------------------- +/*----- ホスト名を入力してホストへ接続 ---------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void QuickConnectProc(void) @@ -208,7 +277,7 @@ void QuickConnectProc(void) if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(hostname_dlg), GetMainHwnd(), QuickConDialogCallBack, (LPARAM)Tmp) == YES) { - /* Ú‘±’†‚È‚çØ’f‚·‚é */ + /* 接続中なら切断する */ if(CmdCtrlSocket != INVALID_SOCKET) DisconnectProc(); @@ -216,7 +285,11 @@ void QuickConnectProc(void) InitPWDcommand(); CopyDefaultHost(&CurHost); - if(SplitUNCpath(Tmp, CurHost.HostAdrs, CurHost.RemoteInitDir, File, CurHost.UserName, CurHost.PassWord, &CurHost.Port) == SUCCESS) + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; + if(SplitUNCpath(Tmp, CurHost.HostAdrs, CurHost.RemoteInitDir, File, CurHost.UserName, CurHost.PassWord, &CurHost.Port) == FFFTP_SUCCESS) { if(strlen(CurHost.UserName) == 0) { @@ -234,11 +307,21 @@ void QuickConnectProc(void) SetSyncMoveMode(CurHost.SyncMove); DisableUserOpe(); - CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + // 暗号化通信対応 + // 同時接続対応 +// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostAdrs); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -263,13 +346,13 @@ void QuickConnectProc(void) } -/*----- ƒNƒCƒbƒNÚ‘±ƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +/*----- クイック接続ダイアログのコールバック ---------------------------------- * * Parameter -* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ -* UINT message : ƒƒbƒZ[ƒW”ԍ† -* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” -* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* HWND hDlg : ウインドウハンドル +* UINT message : メッセージ番号 +* WPARAM wParam : メッセージの WPARAM 引数 +* LPARAM lParam : メッセージの LPARAM 引数 * * Return Value * BOOL TRUE/FALSE @@ -304,7 +387,7 @@ static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wPa SendDlgItemMessage(hDlg, QHOST_PASV, BM_SETCHECK, PasvDefault, 0); for(i = 0; i < HISTORY_MAX; i++) { - if(GetHistoryByNum(i, &Tmp) == SUCCESS) + if(GetHistoryByNum(i, &Tmp) == FFFTP_SUCCESS) { //sprintf(Str, "%s (%s) %s", Tmp.HostAdrs, Tmp.UserName, Tmp.RemoteInitDir); //SendDlgItemMessage(hDlg, QHOST_HOST, CB_ADDSTRING, 0, (LPARAM)Str); @@ -341,17 +424,17 @@ static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wPa } -/*----- Žw’肵‚½ƒzƒXƒg–¼‚ŃzƒXƒg‚֐ڑ± ---------------------------------------- +/*----- 指定したホスト名でホストへ接続 ---------------------------------------- * * Parameter -* char *unc : UNC•¶Žš—ñ -* int Kanji : ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) -* int Kana : ”¼Šp‚©‚ȁ¨‘SŠp•ÏŠ·ƒ‚[ƒh (YES/NO) -* int Fkanji : ƒtƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) -* int TrMode : “]‘—ƒ‚[ƒh (TYPE_xx) +* char *unc : UNC文字列 +* int Kanji : ホストの漢字コード (KANJI_xxx) +* int Kana : 半角かな→全角変換モード (YES/NO) +* int Fkanji : ファイル名の漢字コード (KANJI_xxx) +* int TrMode : 転送モード (TYPE_xx) * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) @@ -366,14 +449,14 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) SaveBookMark(); SaveCurrentSetToHost(); - /* Ú‘±’†‚È‚çØ’f‚·‚é */ + /* 接続中なら切断する */ if(CmdCtrlSocket != INVALID_SOCKET) DisconnectProc(); SetTaskMsg("----------------------------"); InitPWDcommand(); - if(SplitUNCpath(unc, Host, Path, File, User, Pass, &Port) == SUCCESS) + if(SplitUNCpath(unc, Host, Path, File, User, Pass, &Port) == FFFTP_SUCCESS) { if(strlen(User) == 0) { @@ -393,7 +476,11 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) CurHost.KanjiCode = Kanji; CurHost.KanaCnv = Kana; CurHost.NameKanjiCode = Fkanji; - CurHost.KanaCnv = YES; /* ‚Æ‚è‚ ‚¦‚¸ */ + CurHost.KanaCnv = YES; /* とりあえず */ + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; SetHostKanaCnvImm(CurHost.KanaCnv); SetHostKanjiCodeImm(CurHost.KanjiCode); @@ -406,11 +493,21 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) } DisableUserOpe(); - CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + // 暗号化通信対応 + // 同時接続対応 +// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostAdrs); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -436,13 +533,13 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) } -/*----- ƒzƒXƒg‚̃qƒXƒgƒŠ‚ÅŽw’肳‚ꂽƒzƒXƒg‚֐ڑ± ------------------------------ +/*----- ホストのヒストリで指定されたホストへ接続 ------------------------------ * * Parameter -* int MenuCmd : Žæ‚èo‚·ƒqƒXƒgƒŠ‚ÉŠ„‚è“–‚Ä‚ç‚ꂽƒƒjƒ…[ƒRƒ}ƒ“ƒh +* int MenuCmd : 取り出すヒストリに割り当てられたメニューコマンド * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void HistoryConnectProc(int MenuCmd) @@ -453,12 +550,12 @@ void HistoryConnectProc(int MenuCmd) int RFSort; int RDSort; - if(GetHistoryByCmd(MenuCmd, &Hist) == SUCCESS) + if(GetHistoryByCmd(MenuCmd, &Hist) == FFFTP_SUCCESS) { SaveBookMark(); SaveCurrentSetToHost(); - /* Ú‘±’†‚È‚çØ’f‚·‚é */ + /* 接続中なら切断する */ if(CmdCtrlSocket != INVALID_SOCKET) DisconnectProc(); @@ -466,8 +563,12 @@ void HistoryConnectProc(int MenuCmd) InitPWDcommand(); CopyHistoryToHost(&Hist, &CurHost); + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; - if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == SUCCESS) + if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS) { SetCurrentHost(HOSTNUM_NOENTRY); SetHostKanaCnvImm(CurHost.KanaCnv); @@ -482,11 +583,21 @@ void HistoryConnectProc(int MenuCmd) DispTransferType(); DisableUserOpe(); - CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + // 暗号化通信対応 + // 同時接続対応 +// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostAdrs); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -516,16 +627,16 @@ void HistoryConnectProc(int MenuCmd) } -/*----- ƒzƒXƒg‚̏‰Šú‰»ƒRƒ}ƒ“ƒh‚ð‘—‚é ------------------------------------------ +/*----- ホストの初期化コマンドを送る ------------------------------------------ * * Parameter -* int Cmd : ‰Šú‰»ƒRƒ}ƒ“ƒhƒX +* int Cmd : 初期化コマンドス * * Return Value -* ‚È‚µ +* なし * * NOte -* ‰Šú‰»ƒRƒ}ƒ“ƒh‚͈ȉº‚̂悤‚ȃtƒH[ƒ}ƒbƒg‚Å‚ ‚邱‚Æ +* 初期化コマンドは以下のようなフォーマットであること * cmd1\0 * cmd1\r\ncmd2\r\n\0 *----------------------------------------------------------------------------*/ @@ -552,16 +663,16 @@ static int SendInitCommand(char *Cmd) } -/*----- Žw’è‚̃zƒXƒg‚ÍFireWall‚ðŽg‚¤Ý’è‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------ +/*----- 指定のホストはFireWallを使う設定かどうかを返す ------------------------ * * Parameter -* char *Hots : ƒzƒXƒg–¼ -* int *Fire : FireWall‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð•Ô‚·ƒ[ƒN -* int *Pasv : PASVƒ‚[ƒh‚ð•Ô‚·ƒ[ƒN -* int *List : LISTƒRƒ}ƒ“ƒh‚Ì‚ÝŽg—pƒtƒ‰ƒO +* char *Hots : ホスト名 +* int *Fire : FireWallを使うかどうかを返すワーク +* int *Pasv : PASVモードを返すワーク +* int *List : LISTコマンドのみ使用フラグ * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List) @@ -571,10 +682,11 @@ static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List) *Fire = FwallDefault; *Pasv = PasvDefault; - *List = NO; + // NLSTを送ってしまうバグ修正(ただしNLSTを使うべきホストへクイック接続できなくなる) +// *List = NO; i = 0; - while(CopyHostFromList(i, &Tmp) == SUCCESS) + while(CopyHostFromList(i, &Tmp) == FFFTP_SUCCESS) { if(strcmp(Host, Tmp.HostAdrs) == 0) { @@ -589,13 +701,13 @@ static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃AƒhƒŒƒX‚ð•Ô‚· ------------------------------------ +/*----- 接続しているホストのアドレスを返す ------------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ƒzƒXƒg‚̃AƒhƒŒƒX +* char *ホストのアドレス *----------------------------------------------------------------------------*/ char *AskHostAdrs(void) @@ -604,13 +716,13 @@ char *AskHostAdrs(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃|[ƒg‚ð•Ô‚· -------------------------------------- +/*----- 接続しているホストのポートを返す -------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒzƒXƒg‚̃|[ƒg +* int ホストのポート *----------------------------------------------------------------------------*/ int AskHostPort(void) @@ -618,31 +730,33 @@ int AskHostPort(void) return(CurHost.Port); } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ð•Ô‚· ---------------------- +/*----- 接続しているホストのファイル名の漢字コードを返す ---------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int Š¿ŽšƒR[ƒh (KANJI_xxx) +* int 漢字コード (KANJI_xxx) *----------------------------------------------------------------------------*/ int AskHostNameKanji(void) { - if(AskCurrentHost() != HOSTNUM_NOENTRY) - CopyHostFromListInConnect(AskCurrentHost(), &CurHost); - - return(CurHost.NameKanjiCode); + // UTF-8対応 +// if(AskCurrentHost() != HOSTNUM_NOENTRY) +// CopyHostFromListInConnect(AskCurrentHost(), &CurHost); +// +// return(CurHost.NameKanjiCode); + return(CurHost.CurNameKanjiCode); } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚Ì”¼ŠpƒJƒi•ÏŠ·ƒtƒ‰ƒO‚ð•Ô‚· -------------- +/*----- 接続しているホストのファイル名の半角カナ変換フラグを返す -------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* int 半角カナを全角に変換するかどうか (YES/NO) *----------------------------------------------------------------------------*/ int AskHostNameKana(void) @@ -654,13 +768,13 @@ int AskHostNameKana(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌLISTƒRƒ}ƒ“ƒhƒ‚[ƒh‚ð•Ô‚· -------------------------- +/*----- 接続しているホストのLISTコマンドモードを返す -------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int LISTƒRƒ}ƒ“ƒhƒ‚[ƒh (YES/NO) +* int LISTコマンドモード (YES/NO) *----------------------------------------------------------------------------*/ int AskListCmdMode(void) @@ -676,13 +790,13 @@ int AskListCmdMode(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÅNLST -R‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------ +/*----- 接続しているホストでNLST -Rを使うかどうかを返す ------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* int NLST -R‚ðŽg‚¤‚©‚Ç‚¤‚© (YES/NO) +* int NLST -Rを使うかどうか (YES/NO) *----------------------------------------------------------------------------*/ int AskUseNLST_R(void) @@ -694,13 +808,13 @@ int AskUseNLST_R(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌChmodƒRƒ}ƒ“ƒh‚ð•Ô‚· ------------------------------- +/*----- 接続しているホストのChmodコマンドを返す ------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ChmodƒRƒ}ƒ“ƒh +* char *Chmodコマンド *----------------------------------------------------------------------------*/ char *AskHostChmodCmd(void) @@ -712,13 +826,13 @@ char *AskHostChmodCmd(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃^ƒCƒ€ƒ][ƒ“‚ð•Ô‚· -------------------------------- +/*----- 接続しているホストのタイムゾーンを返す -------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒ^ƒCƒ€ƒ][ƒ“ +* int タイムゾーン *----------------------------------------------------------------------------*/ int AskHostTimeZone(void) @@ -730,13 +844,13 @@ int AskHostTimeZone(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌPASVƒ‚[ƒh‚ð•Ô‚· ---------------------------------- +/*----- 接続しているホストのPASVモードを返す ---------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int PASVƒ‚[ƒh‚©‚Ç‚¤‚© (YES/NO) +* int PASVモードかどうか (YES/NO) *----------------------------------------------------------------------------*/ int AskPasvMode(void) @@ -745,13 +859,13 @@ int AskPasvMode(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌLNSTƒtƒ@ƒCƒ‹–¼‚ð•Ô‚· ------------------------------ +/*----- 接続しているホストのLNSTファイル名を返す ------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“ +* char *ファイル名/オプション *----------------------------------------------------------------------------*/ char *AskHostLsName(void) @@ -763,13 +877,13 @@ char *AskHostLsName(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃zƒXƒgƒ^ƒCƒv‚ð•Ô‚· -------------------------------- +/*----- 接続しているホストのホストタイプを返す -------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“ +* char *ファイル名/オプション *----------------------------------------------------------------------------*/ int AskHostType(void) @@ -781,13 +895,13 @@ int AskHostType(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÍFireWall‚ðŽg‚¤ƒzƒXƒg‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------- +/*----- 接続しているホストはFireWallを使うホストかどうかを返す ---------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int FireWall‚ðŽg‚¤‚©‚Ç‚¤‚© (YES/NO) +* int FireWallを使うかどうか (YES/NO) *----------------------------------------------------------------------------*/ int AskHostFireWall(void) @@ -796,13 +910,13 @@ int AskHostFireWall(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚Ńtƒ‹ƒpƒX‚Ńtƒ@ƒCƒ‹ƒAƒNƒZƒX‚µ‚È‚¢‚©‚Ç‚¤‚©‚ð•Ô‚· ---- +/*----- 接続しているホストでフルパスでファイルアクセスしないかどうかを返す ---- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒtƒ‹ƒpƒX‚ŃAƒNƒZƒX‚µ‚È‚¢ (YES=ƒtƒ‹ƒpƒX‹ÖŽ~/NO) +* int フルパスでアクセスしない (YES=フルパス禁止/NO) *----------------------------------------------------------------------------*/ int AskNoFullPathMode(void) @@ -814,13 +928,13 @@ int AskNoFullPathMode(void) } -/*----- Ú‘±‚µ‚Ä‚¢‚郆[ƒU–¼‚ð•Ô‚· -------------------------------------------- +/*----- 接続しているユーザ名を返す -------------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ƒ†[ƒU–¼ +* char *ユーザ名 *----------------------------------------------------------------------------*/ char *AskHostUserName(void) @@ -829,16 +943,16 @@ char *AskHostUserName(void) } -/*----- Œ»Ý‚̐ݒè‚ðƒzƒXƒg‚̐ݒè‚ɃZƒbƒg‚·‚é ---------------------------------- +/*----- 現在の設定をホストの設定にセットする ---------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし * * Note -* ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠAƒ\[ƒg•û–@‚ðƒzƒXƒg‚̐ݒè‚ɃZƒbƒg‚·‚é +* カレントディレクトリ、ソート方法をホストの設定にセットする *----------------------------------------------------------------------------*/ void SaveCurrentSetToHost(void) @@ -865,13 +979,13 @@ void SaveCurrentSetToHost(void) } -/*----- Œ»Ý‚̐ݒè‚ðƒqƒXƒgƒŠ‚ɃZƒbƒg‚·‚é -------------------------------------- +/*----- 現在の設定をヒストリにセットする -------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void SaveCurrentSetToHistory(void) @@ -898,20 +1012,21 @@ static void SaveCurrentSetToHistory(void) } -/*----- ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚̍Đڑ± ---------------------------------- +/*----- コマンドコントロールソケットの再接続 ---------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ int ReConnectCmdSkt(void) { int Sts; + if(CmdCtrlSocket != TrnCtrlSocket) do_closesocket(TrnCtrlSocket); TrnCtrlSocket = INVALID_SOCKET; @@ -924,30 +1039,76 @@ int ReConnectCmdSkt(void) } -/*----- “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚̍Đڑ± -------------------------------------- +/*----- 転送コントロールソケットの再接続 -------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ //int ReConnectTrnSkt(void) //{ // return(ReConnectSkt(&TrnCtrlSocket)); //} +// 同時接続対応 +int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) +{ +// char Path[FMAX_PATH+1]; + int Sts; + // 暗号化通信対応 + HOSTDATA HostData; + Sts = FFFTP_FAIL; + + SetTaskMsg(MSGJPN003); + +// DisableUserOpe(); + /* 現在のソケットは切断 */ + if(*Skt != INVALID_SOCKET) + do_closesocket(*Skt); + /* 再接続 */ + // 暗号化通信対応 + HostData = CurHost; + if(HostData.CryptMode != CRYPT_NONE) + HostData.UseNoEncryption = NO; + if(HostData.CryptMode != CRYPT_FTPES) + HostData.UseFTPES = NO; + if(HostData.CryptMode != CRYPT_FTPIS) + HostData.UseFTPIS = NO; + if(HostData.CryptMode != CRYPT_SFTP) + HostData.UseSFTP = NO; + // UTF-8対応 + HostData.CurNameKanjiCode = HostData.NameKanjiCode; + // IPv6対応 + HostData.CurNetType = HostData.NetType; + // 暗号化通信対応 + // 同時接続対応 +// if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) + if((*Skt = DoConnect(&HostData, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, CancelCheckWork)) != INVALID_SOCKET) + { +// AskRemoteCurDir(Path, FMAX_PATH); +// DoCWD(Path, YES, YES, YES); + Sts = FFFTP_SUCCESS; + } + else + SoundPlay(SND_ERROR); -/*----- ‰ñü‚̍Đڑ± ---------------------------------------------------------- +// EnableUserOpe(); + return(Sts); +} + + +/*----- 回線の再接続 ---------------------------------------------------------- * * Parameter -* SOCKET *Skt : Ú‘±‚µ‚½ƒ\ƒPƒbƒg‚ð•Ô‚·ƒ[ƒN +* SOCKET *Skt : 接続したソケットを返すワーク * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ static int ReConnectSkt(SOCKET *Skt) @@ -955,20 +1116,23 @@ static int ReConnectSkt(SOCKET *Skt) char Path[FMAX_PATH+1]; int Sts; - Sts = FAIL; + Sts = FFFTP_FAIL; SetTaskMsg(MSGJPN003); DisableUserOpe(); - /* Œ»Ý‚̃\ƒPƒbƒg‚͐ؒf */ + /* 現在のソケットは切断 */ if(*Skt != INVALID_SOCKET) do_closesocket(*Skt); - /* ÄÚ‘± */ - if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) + /* 再接続 */ + // 暗号化通信対応 + // 同時接続対応 +// if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) + if((*Skt = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg)) != INVALID_SOCKET) { AskRemoteCurDir(Path, FMAX_PATH); DoCWD(Path, YES, YES, YES); - Sts = SUCCESS; + Sts = FFFTP_SUCCESS; } else SoundPlay(SND_ERROR); @@ -978,13 +1142,13 @@ static int ReConnectSkt(SOCKET *Skt) } -/*----- ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ð•Ô‚· ------------------------------------ +/*----- コマンドコントロールソケットを返す ------------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* SOCKET ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* SOCKET コマンドコントロールソケット *----------------------------------------------------------------------------*/ SOCKET AskCmdCtrlSkt(void) @@ -993,13 +1157,13 @@ SOCKET AskCmdCtrlSkt(void) } -/*----- “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ð•Ô‚· ---------------------------------------- +/*----- 転送コントロールソケットを返す ---------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* SOCKET “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* SOCKET 転送コントロールソケット *----------------------------------------------------------------------------*/ SOCKET AskTrnCtrlSkt(void) @@ -1008,13 +1172,13 @@ SOCKET AskTrnCtrlSkt(void) } -/*----- ƒRƒ}ƒ“ƒh^“]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚Ì‹¤—L‚ð‰ðœ ------------------------ +/*----- コマンド/転送コントロールソケットの共有を解除 ------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void SktShareProh(void) @@ -1024,21 +1188,27 @@ void SktShareProh(void) //SetTaskMsg("############### SktShareProh"); - CmdCtrlSocket = INVALID_SOCKET; - ReConnectSkt(&CmdCtrlSocket); + // 同時接続対応 +// CmdCtrlSocket = INVALID_SOCKET; +// ReConnectSkt(&CmdCtrlSocket); + if(CurHost.ReuseCmdSkt == YES) + { + CmdCtrlSocket = INVALID_SOCKET; + ReConnectSkt(&CmdCtrlSocket); + } } return; } -/*----- ƒRƒ}ƒ“ƒh^“]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚Ì‹¤—L‚ª‰ðœ‚³‚ê‚Ä‚¢‚é‚©ƒ`ƒFƒbƒN ---- +/*----- コマンド/転送コントロールソケットの共有が解除されているかチェック ---- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒXƒe[ƒ^ƒX -* YES=‹¤—L‰ðœ/NO=‹¤—L +* int ステータス +* YES=共有解除/NO=共有 *----------------------------------------------------------------------------*/ int AskShareProh(void) @@ -1046,20 +1216,22 @@ int AskShareProh(void) int Sts; Sts = YES; - if(CmdCtrlSocket == TrnCtrlSocket) + // 同時接続対応 +// if(CmdCtrlSocket == TrnCtrlSocket) + if(CmdCtrlSocket == TrnCtrlSocket || TrnCtrlSocket == INVALID_SOCKET) Sts = NO; return(Sts); } -/*----- ƒzƒXƒg‚©‚çØ’f -------------------------------------------------------- +/*----- ホストから切断 -------------------------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void DisconnectProc(void) @@ -1095,13 +1267,13 @@ void DisconnectProc(void) } -/*----- ƒ\ƒPƒbƒg‚ª‹­§Ø’f‚³‚ꂽ‚Æ‚«‚̏ˆ— ------------------------------------ +/*----- ソケットが強制切断されたときの処理 ------------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void DisconnectSet(void) @@ -1117,13 +1289,13 @@ void DisconnectSet(void) } -/*----- ƒzƒXƒg‚ɐڑ±’†‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------------------------ +/*----- ホストに接続中かどうかを返す ------------------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒXƒe[ƒ^ƒX (YES/NO) +* int ステータス (YES/NO) *----------------------------------------------------------------------------*/ int AskConnecting(void) @@ -1138,39 +1310,40 @@ int AskConnecting(void) } -/*----- ƒzƒXƒg‚֐ڑ±‚·‚é ------------------------------------------------------ +/*----- ホストへ接続する ------------------------------------------------------ * * Parameter -* char *Host : ƒzƒXƒg–¼ -* char *User : ƒ†[ƒU–¼ -* char *Pass : ƒpƒXƒ[ƒh -* char *Acct : ƒAƒJƒEƒ“ƒg -* int Port : ƒ|[ƒg -* int Fwall : FireWall‚ðŽg‚¤‚©‚Ç‚¤‚© (YES/NO) -* int SavePass : ƒpƒXƒ[ƒh‚ðÄ“ü—Í‚µ‚½Žž‚É•Û‘¶‚·‚é‚©‚Ç‚¤‚© (YES/NO) -* int Security : ƒZƒLƒ…ƒŠƒeƒB (SECURITY_xxx, MDx) +* char *Host : ホスト名 +* char *User : ユーザ名 +* char *Pass : パスワード +* char *Acct : アカウント +* int Port : ポート +* int Fwall : FireWallを使うかどうか (YES/NO) +* int SavePass : パスワードを再入力した時に保存するかどうか (YES/NO) +* int Security : セキュリティ (SECURITY_xxx, MDx) * * Return Value -* SOCKET ƒ\ƒPƒbƒg +* SOCKET ソケット * * Note -* ƒzƒXƒg–¼Aƒ†[ƒU–¼AƒpƒXƒ[ƒh‚ªŽw’肳‚ê‚Ä‚¢‚È‚©‚Á‚½‚Æ‚«‚́AÚ‘±‚ÉŽg—p -* ‚µ‚½‚à‚Ì‚ðƒRƒs[‚µ‚Ä‚©‚¦‚· -* char *Host : ƒzƒXƒg–¼ -* char *User : ƒ†[ƒU–¼ -* char *Pass : ƒpƒXƒ[ƒh -* char *Acct : ƒAƒJƒEƒ“ƒg -* -* FireWall‚ÍŽŸ‚̂悤‚É“®ì‚·‚é -* TYPE1 Connect fire ¨ USER user(f) ¨ PASS pass(f) ¨ SITE host ¨ USER user(h) ¨ PASS pass(h) ¨ ACCT acct -* TYPE2 Connect fire ¨ USER user(f) ¨ PASS pass(f) ¨ USER user(h)@host ¨ PASS pass(h) ¨ ACCT acct -* TYPE3 Connect fire ¨ USER user(h)@host ¨ PASS pass(h) ¨ ACCT acct -* TYPE4 Connect fire ¨ OPEN host ¨ USER user(h) ¨ PASS pass(h) ¨ ACCT acct +* ホスト名、ユーザ名、パスワードが指定されていなかったときは、接続に使用 +* したものをコピーしてかえす +* char *Host : ホスト名 +* char *User : ユーザ名 +* char *Pass : パスワード +* char *Acct : アカウント +* +* FireWallは次のように動作する +* TYPE1 Connect fire → USER user(f) → PASS pass(f) → SITE host → USER user(h) → PASS pass(h) → ACCT acct +* TYPE2 Connect fire → USER user(f) → PASS pass(f) → USER user(h)@host → PASS pass(h) → ACCT acct +* TYPE3 Connect fire → USER user(h)@host → PASS pass(h) → ACCT acct +* TYPE4 Connect fire → OPEN host → USER user(h) → PASS pass(h) → ACCT acct * TYPE5 SOCKS4 -* none Connect host ¨ USER user(h) ¨ PASS pass(h) ¨ ACCT acct +* none Connect host → USER user(h) → PASS pass(h) → ACCT acct *----------------------------------------------------------------------------*/ -static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security) +// 暗号化通信対応 +static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork) { int Sts; int Flg; @@ -1186,142 +1359,176 @@ static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port char TmpBuf[ONELINE_BUF_SIZE]; struct linger LingerOpt; - if(Fwall == YES) - Fwall = FwallType; - else - Fwall = FWALL_NONE; + // 暗号化通信対応 + ContSock = INVALID_SOCKET; - TryConnect = YES; - CancelFlg = NO; + if(CryptMode == CRYPT_NONE || CryptMode == CRYPT_FTPES || CryptMode == CRYPT_FTPIS) + { + if(Fwall == YES) + Fwall = FwallType; + else + Fwall = FWALL_NONE; + + TryConnect = YES; + // 暗号化通信対応 +// CancelFlg = NO; #if 0 -// WSASetBlockingHook(BlkHookFnc); +// WSASetBlockingHook(BlkHookFnc); #endif - ContSock = INVALID_SOCKET; + ContSock = INVALID_SOCKET; - HostPort = Port; - Tmp = Host; - if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || - (Fwall == FWALL_SIDEWINDER) || - (Fwall == FWALL_FU_FP)) - { - Tmp = FwallHost; - Port = FwallPort; - } + HostPort = Port; + Tmp = Host; + if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || + (Fwall == FWALL_SIDEWINDER) || + (Fwall == FWALL_FU_FP)) + { + Tmp = FwallHost; + Port = FwallPort; + } - if(strlen(Tmp) != 0) - { - if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET) + if(strlen(Tmp) != 0) { - // ƒoƒbƒtƒ@‚𖳌ø + // 同時接続対応 +// if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET) + if((ContSock = connectsock(Tmp, Port, "", CancelCheckWork)) != INVALID_SOCKET) + { + // バッファを無効 #ifdef DISABLE_CONTROL_NETWORK_BUFFERS - int BufferSize = 0; - setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int)); - setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int)); + int BufferSize = 0; + setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int)); + setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int)); #endif - while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM) - ; - - if(Sts == FTP_COMPLETE) - { - Flg = 1; - if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); - if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); -#pragma aaa - Flg = 1; - if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); - LingerOpt.l_onoff = 1; - LingerOpt.l_linger = 90; - if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); -/////// - - - /*===== ”FØ‚ðs‚È‚¤ =====*/ - - Sts = FTP_COMPLETE; - if((Fwall == FWALL_FU_FP_SITE) || - (Fwall == FWALL_FU_FP_USER) || - (Fwall == FWALL_FU_FP)) + // FTPIS対応 +// while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM) +// ; + if(CryptMode == CRYPT_FTPIS) { - if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE) + if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork)) { - CheckOneTimePassword(FwallPass, Reply, FwallSecurity); - Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM) + ; } + else + Sts = FTP_ERROR; } - else if(Fwall == FWALL_SIDEWINDER) + else { - Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; + while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM) + ; } - if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) - { - SetTaskMsg(MSGJPN006); - DoClose(ContSock); - ContSock = INVALID_SOCKET; - } - else + + if(Sts == FTP_COMPLETE) { - if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN)) + Flg = 1; + if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); + // データ転送用ソケットのTCP遅延転送が無効されているので念のため + if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); +//#pragma aaa + Flg = 1; + if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); + LingerOpt.l_onoff = 1; + LingerOpt.l_linger = 90; + if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); +/////// + + + /*===== 認証を行なう =====*/ + + Sts = FTP_COMPLETE; + if((Fwall == FWALL_FU_FP_SITE) || + (Fwall == FWALL_FU_FP_USER) || + (Fwall == FWALL_FU_FP)) { - Flg = 0; - if(Fwall == FWALL_OPEN) - Flg = 2; - if(FwallLower == YES) - Flg++; - - if(HostPort == PORT_NOR) - Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100; - else - Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + // 同時接続対応 +// if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE) + if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", FwallUser) / 100) == FTP_CONTINUE) + { + CheckOneTimePassword(FwallPass, Reply, FwallSecurity); + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "PASS %s", Reply) / 100; + } + } + else if(Fwall == FWALL_SIDEWINDER) + { + // 同時接続対応 +// Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; + Sts = command(ContSock, Reply, CancelCheckWork, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; } - if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) { - SetTaskMsg(MSGJPN007, Host); + SetTaskMsg(MSGJPN006); DoClose(ContSock); ContSock = INVALID_SOCKET; } else { - Anony = NO; - if((strlen(User) != 0) || - (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN)) { - if(Anony == YES) - { - strcpy(User, "anonymous"); - strcpy(Pass, UserMailAdrs); - } + Flg = 0; + if(Fwall == FWALL_OPEN) + Flg = 2; + if(FwallLower == YES) + Flg++; + + if(HostPort == PORT_NOR) + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "%s %s", SiteTbl[Flg], Host) / 100; + else + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + } - if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER)) + if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) + { + SetTaskMsg(MSGJPN007, Host); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + else + { + Anony = NO; + if((strlen(User) != 0) || + (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) { - if(HostPort == PORT_NOR) - sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host); + if(Anony == YES) + { + strcpy(User, "anonymous"); + strcpy(Pass, UserMailAdrs); + } + + if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER)) + { + if(HostPort == PORT_NOR) + sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host); + else + sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort); + } else - sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort); - } - else - strcpy(Buf, User); + strcpy(Buf, User); - // FTPES‘Ήž - // 2‰ñˆÈãŒÄ‚΂ê‚鎖‚ª‚ ‚邽‚ߊù‚ÉFTPES‚Őڑ±‚µ‚Ä‚¢‚Ä‚àÄŠm”F - if(CurHost.CryptMode == CRYPT_NONE || CurHost.CryptMode == CRYPT_FTPES) - { - if(IsOpenSSLLoaded() && CurHost.UseFTPES == YES && (Sts = command(ContSock, Reply, &CancelFlg, "AUTH TLS")) == 234) + // FTPES対応 + if(CryptMode == CRYPT_FTPES) { - // SSL‚ɐ؂è‘Ö‚¦ - SetTaskMsg(MSGJPN315); - CurHost.CryptMode = CRYPT_FTPES; - if(AttachSSL(ContSock)) + if(IsOpenSSLLoaded() && (Sts = command(ContSock, Reply, CancelCheckWork, "AUTH TLS")) == 234) { - if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200) + if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork)) { - if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200) + if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200) { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200) + { + } + else + Sts = FTP_ERROR; } else Sts = FTP_ERROR; @@ -1332,121 +1539,198 @@ static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port else Sts = FTP_ERROR; } - else + + // FTPIS対応 + // "PBSZ 0"と"PROT P"は黙示的に設定されているはずだが念のため + if(CryptMode == CRYPT_FTPIS) { - // ˆÃ†‰»‚È‚µ - CurHost.CryptMode = CRYPT_NONE; - SetTaskMsg(MSGJPN314); + if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200) + { + } + } } - } - ReInPass = NO; - do - { - Continue = NO; - if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) + ReInPass = NO; + do { - if((strlen(Pass) != 0) || - (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + // FTPES対応 + if(Sts == FTP_ERROR) + break; + Continue = NO; + // 同時接続対応 +// if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) + if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", Buf) / 100) == FTP_CONTINUE) { - CheckOneTimePassword(Pass, Reply, Security); + if((strlen(Pass) != 0) || + (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + { + CheckOneTimePassword(Pass, Reply, Security); - /* ƒpƒXƒ[ƒh‚ªƒXƒy[ƒX1ŒÂ‚ÌŽž‚̓pƒXƒ[ƒh‚ÌŽÀ‘Ì‚È‚µ‚Æ‚·‚é */ - if(strcmp(Reply, " ") == 0) - strcpy(Reply, ""); + /* パスワードがスペース1個の時はパスワードの実体なしとする */ + if(strcmp(Reply, " ") == 0) + strcpy(Reply, ""); - Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; - if(Sts == FTP_ERROR) - { - strcpy(Pass, ""); - if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) - Continue = YES; - else - DoPrintf("No password specified."); - ReInPass = YES; - } - else if(Sts == FTP_CONTINUE) - { - if((strlen(Acct) != 0) || - (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "PASS %s", Reply) / 100; + if(Sts == FTP_ERROR) { - Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100; + strcpy(Pass, ""); + if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) + Continue = YES; + else + DoPrintf("No password specified."); + ReInPass = YES; + } + else if(Sts == FTP_CONTINUE) + { + if((strlen(Acct) != 0) || + (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + { + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "ACCT %s", Acct) / 100; + } + else + DoPrintf("No account specified"); } - else - DoPrintf("No account specified"); } - } - else - { - Sts = FTP_ERROR; - DoPrintf("No password specified."); + else + { + Sts = FTP_ERROR; + DoPrintf("No password specified."); + } } } + while(Continue == YES); + } + else + { + Sts = FTP_ERROR; + DoPrintf("No user name specified"); } - while(Continue == YES); - } - else - { - Sts = FTP_ERROR; - DoPrintf("No user name specified"); - } - if(Sts != FTP_COMPLETE) - { - SetTaskMsg(MSGJPN008, Host); - DoClose(ContSock); - ContSock = INVALID_SOCKET; - } - else if((SavePass == YES) && (ReInPass == YES)) - { - if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) - SetHostPassword(AskCurrentHost(), Pass); + if(Sts != FTP_COMPLETE) + { + SetTaskMsg(MSGJPN008, Host); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + else if((SavePass == YES) && (ReInPass == YES)) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostPassword(AskCurrentHost(), Pass); + } } } } + else + { +//#pragma aaa + SetTaskMsg(MSGJPN009/*"接続できません(1) %x", ContSock*/); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } } + } + else + { + + if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || + (Fwall == FWALL_FU_FP)) + SetTaskMsg(MSGJPN010); else + SetTaskMsg(MSGJPN011); + } + +#if 0 +// WSAUnhookBlockingHook(); +#endif + TryConnect = NO; + + // FEAT対応 + // ホストの機能を確認 + if(ContSock != INVALID_SOCKET) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "FEAT")) == 211) { -//#pragma aaa - SetTaskMsg(MSGJPN009/*"Ú‘±‚Å‚«‚Ü‚¹‚ñ(1) %x", ContSock*/); - DoClose(ContSock); - ContSock = INVALID_SOCKET; + // 改行文字はReadReplyMessageで消去されるため区切り文字に空白を使用 + // UTF-8対応 + if(strstr(Reply, " UTF8 ")) + HostData->Feature |= FEATURE_UTF8; + // MLST対応 + if(strstr(Reply, " MLST ") || strstr(Reply, " MLSD ")) + HostData->Feature |= FEATURE_MLSD; + // IPv6対応 + if(strstr(Reply, " EPRT ") || strstr(Reply, " EPSV ")) + HostData->Feature |= FEATURE_EPRT | FEATURE_EPSV; + } + // UTF-8対応 + if(HostData->CurNameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8)) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON")) == 200) + HostData->CurNameKanjiCode = KANJI_UTF8N; } } } - else + else if(CryptMode == CRYPT_SFTP) { - - if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || - (Fwall == FWALL_FU_FP)) - SetTaskMsg(MSGJPN010); - else - SetTaskMsg(MSGJPN011); } -#if 0 -// WSAUnhookBlockingHook(); -#endif - TryConnect = NO; - return(ContSock); } +// 同時接続対応 +//static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security) +static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork) +{ + SOCKET ContSock; + ContSock = INVALID_SOCKET; + *CancelCheckWork = NO; + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseSFTP == YES) + { + SetTaskMsg(MSGJPN317); + if((ContSock = DoConnectCrypt(CRYPT_SFTP, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) + HostData->CryptMode = CRYPT_SFTP; + } + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseFTPIS == YES) + { + SetTaskMsg(MSGJPN316); + if((ContSock = DoConnectCrypt(CRYPT_FTPIS, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) + HostData->CryptMode = CRYPT_FTPIS; + } + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseFTPES == YES) + { + SetTaskMsg(MSGJPN315); + if((ContSock = DoConnectCrypt(CRYPT_FTPES, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) + HostData->CryptMode = CRYPT_FTPES; + } + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseNoEncryption == YES) + { + SetTaskMsg(MSGJPN314); + if((ContSock = DoConnectCrypt(CRYPT_NONE, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) + HostData->CryptMode = CRYPT_NONE; + } + return ContSock; +} + -/*----- ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚̃`ƒFƒbƒN ---------------------------------------- +/*----- ワンタイムパスワードのチェック ---------------------------------------- * * Parameter -* chat *Pass : ƒpƒXƒ[ƒh^ƒpƒXƒtƒŒ[ƒY -* char *Reply : USERƒRƒ}ƒ“ƒh‚ð‘—‚Á‚½‚ ‚Ƃ̃Šƒvƒ‰ƒC•¶Žš—ñ -* ^PASSƒRƒ}ƒ“ƒh‚Å‘—‚éƒpƒXƒ[ƒh‚ð•Ô‚·ƒoƒbƒtƒ@ -* int Type : ƒ^ƒCƒv (SECURITY_xxx, MDx) +* chat *Pass : パスワード/パスフレーズ +* char *Reply : USERコマンドを送ったあとのリプライ文字列 +* /PASSコマンドで送るパスワードを返すバッファ +* int Type : タイプ (SECURITY_xxx, MDx) * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL * * Note -* ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚Å‚È‚¢Žž‚ÍPass‚ð‚»‚Ì‚Ü‚ÜReply‚ɃRƒs[ +* ワンタイムパスワードでない時はPassをそのままReplyにコピー *----------------------------------------------------------------------------*/ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) @@ -1457,7 +1741,7 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) char Seed[MAX_SEED_LEN+1]; int i; - Sts = SUCCESS; + Sts = FFFTP_SUCCESS; Pos = NULL; if(Type == SECURITY_AUTO) @@ -1483,10 +1767,10 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) if((Type == MD4) || (Type == MD5) || (Type == SHA1)) { - /* ƒV[ƒPƒ“ƒX”ԍ†‚ðŒ©‚Â‚¯‚郋[ƒv */ + /* シーケンス番号を見つけるループ */ DoPrintf("Analize OTP"); DoPrintf("%s", Pos); - Sts = FAIL; + Sts = FFFTP_FAIL; while((Pos = GetNextField(Pos)) != NULL) { if(IsDigit(*Pos)) @@ -1497,9 +1781,9 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) /* Seed */ if((Pos = GetNextField(Pos)) != NULL) { - if(GetOneField(Pos, Seed, MAX_SEED_LEN) == SUCCESS) + if(GetOneField(Pos, Seed, MAX_SEED_LEN) == FFFTP_SUCCESS) { - /* Seed‚͉p”Žš‚Ì‚Ý—LŒø‚Æ‚·‚é */ + /* Seedは英数字のみ有効とする */ for(i = strlen(Seed)-1; i >= 0; i--) { if((IsAlpha(Seed[i]) == 0) && (IsDigit(Seed[i]) == 0)) @@ -1511,11 +1795,11 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) Make6WordPass(Seq, Seed, Pass, Type, Reply); DoPrintf("Response=%s", Reply); - /* ƒV[ƒPƒ“ƒX”ԍ†‚̃`ƒFƒbƒN‚ÆŒx */ + /* シーケンス番号のチェックと警告 */ if(Seq <= 10) DialogBox(GetFtpInst(), MAKEINTRESOURCE(otp_notify_dlg), GetMainHwnd(), ExeEscDialogProc); - Sts = SUCCESS; + Sts = FFFTP_SUCCESS; } } } @@ -1523,7 +1807,7 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) } } - if(Sts == FAIL) + if(Sts == FFFTP_FAIL) SetTaskMsg(MSGJPN015); } else @@ -1547,19 +1831,47 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) -/*----- ƒ\ƒPƒbƒg‚ðÚ‘±‚·‚é ---------------------------------------------------- +/*----- ソケットを接続する ---------------------------------------------------- * * Parameter -* char *host : ƒzƒXƒg–¼ -* int port : ƒ|[ƒg”ԍ† -* char *PreMsg : ƒƒbƒZ[ƒW‚Ì‘O”¼•”•ª +* char *host : ホスト名 +* int port : ポート番号 +* char *PreMsg : メッセージの前半部分 * * Return Value -* SOCKET ƒ\ƒPƒbƒg +* SOCKET ソケット *----------------------------------------------------------------------------*/ +// IPv6対応 SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) { + SOCKET Result; + Result = INVALID_SOCKET; + switch(CurHost.CurNetType) + { + case NTYPE_AUTO: + if((Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) + CurHost.CurNetType = NTYPE_IPV4; + else if((Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) + CurHost.CurNetType = NTYPE_IPV6; + break; + case NTYPE_IPV4: + Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork); + CurHost.CurNetType = NTYPE_IPV4; + break; + case NTYPE_IPV6: + Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork); + CurHost.CurNetType = NTYPE_IPV6; + break; + } + return Result; +} + + +// IPv6対応 +//SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) +SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork) +{ struct sockaddr_in saSockAddr; char HostEntry[MAXGETHOSTSTRUCT]; struct hostent *pHostEntry; @@ -1572,7 +1884,7 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) SOCKS5REPLY Socks5Reply; ////////////////////////////// - // ƒzƒXƒg–¼‰ðŒˆ‚Ɛڑ±‚̏€”õ + // ホスト名解決と接続の準備 ////////////////////////////// Fwall = FWALL_NONE; @@ -1583,37 +1895,49 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) UseIPadrs = YES; strcpy(DomainName, host); - memset(&CurSockAddr, 0, sizeof(CurSockAddr)); - CurSockAddr.sin_port = htons((u_short)port); - CurSockAddr.sin_family = AF_INET; - if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) + // IPv6対応 +// memset(&CurSockAddr, 0, sizeof(CurSockAddr)); +// CurSockAddr.sin_port = htons((u_short)port); +// CurSockAddr.sin_family = AF_INET; +// if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) + memset(&CurSockAddrIPv4, 0, sizeof(CurSockAddrIPv4)); + CurSockAddrIPv4.sin_port = htons((u_short)port); + CurSockAddrIPv4.sin_family = AF_INET; + if((CurSockAddrIPv4.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) { - // ƒzƒXƒg–¼‚ªŽw’肳‚ꂽ - // ƒzƒXƒg–¼‚©‚çƒAƒhƒŒƒX‚ð‹‚ß‚é + // ホスト名が指定された + // ホスト名からアドレスを求める if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) && (FwallResolv == YES)) { - // ƒzƒXƒg–¼‰ðŒˆ‚ÍSOCKSƒT[ƒo‚É”C‚¹‚é + // ホスト名解決はSOCKSサーバに任せる pHostEntry = NULL; } else { - // ƒAƒhƒŒƒX‚ðŽæ“¾ + // アドレスを取得 SetTaskMsg(MSGJPN016, DomainName); - pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); + // IPv6対応 +// pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); + pHostEntry = do_gethostbynameIPv4(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); } if(pHostEntry != NULL) { - memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); - SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + // IPv6対応 +// memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); +// SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + memcpy((char *)&CurSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); + SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port)); } else { if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) { UseIPadrs = NO; - SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port)); + // IPv6対応 +// SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port)); + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv4.sin_port)); } else { @@ -1623,51 +1947,72 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) } } else - SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + // IPv6対応 +// SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port)); if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) { - // SOCKS‚ðŽg‚¤ - // SOCKS‚ɐڑ±‚·‚鏀”õ + // SOCKSを使う + // SOCKSに接続する準備 if(Fwall == FWALL_SOCKS4) { Socks4Cmd.Ver = SOCKS4_VER; Socks4Cmd.Cmd = SOCKS4_CMD_CONNECT; - Socks4Cmd.Port = CurSockAddr.sin_port; - Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + // IPv6対応 +// Socks4Cmd.Port = CurSockAddr.sin_port; +// Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + Socks4Cmd.Port = CurSockAddrIPv4.sin_port; + Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr; strcpy(Socks4Cmd.UserID, FwallUser); Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; } else { - Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + // IPv6対応 +// Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port); } - memset(&SocksSockAddr, 0, sizeof(SocksSockAddr)); - if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) + // IPv6対応 +// memset(&SocksSockAddr, 0, sizeof(SocksSockAddr)); +// if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) + memset(&SocksSockAddrIPv4, 0, sizeof(SocksSockAddrIPv4)); + if((SocksSockAddrIPv4.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) { - if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) - memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); + // IPv6対応 +// if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) +// memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); + if((pHostEntry = do_gethostbynameIPv4(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) + memcpy((char *)&SocksSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); else { SetTaskMsg(MSGJPN021, FwallHost); return INVALID_SOCKET; } } - SocksSockAddr.sin_port = htons((u_short)FwallPort); - SocksSockAddr.sin_family = AF_INET; - SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port)); - // connect‚Őڑ±‚·‚éæ‚ÍSOCKSƒT[ƒo - memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr)); + // IPv6対応 +// SocksSockAddr.sin_port = htons((u_short)FwallPort); +// SocksSockAddr.sin_family = AF_INET; +// SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port)); + SocksSockAddrIPv4.sin_port = htons((u_short)FwallPort); + SocksSockAddrIPv4.sin_family = AF_INET; + SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port)); + // connectで接続する先はSOCKSサーバ + // IPv6対応 +// memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr)); + memcpy(&saSockAddr, &SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4)); } else { - // connect‚Őڑ±‚·‚é‚̂͐ڑ±æ‚̃zƒXƒg - memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr)); + // connectで接続するのは接続先のホスト + // IPv6対応 +// memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr)); + memcpy(&saSockAddr, &CurSockAddrIPv4, sizeof(CurSockAddrIPv4)); } ///////////// - // Ú‘±ŽÀs + // 接続実行 ///////////// if((sSocket = do_socket(AF_INET, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET) @@ -1677,8 +2022,12 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) if(Fwall == FWALL_SOCKS4) { Socks4Reply.Result = -1; - if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != SUCCESS) || - (Socks4GetCmdReply(sSocket, &Socks4Reply) != SUCCESS) || + // 同時接続対応 +// if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks4GetCmdReply(sSocket, &Socks4Reply) != FFFTP_SUCCESS) || +// (Socks4Reply.Result != SOCKS4_RES_OK)) + if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks4GetCmdReply(sSocket, &Socks4Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks4Reply.Result != SOCKS4_RES_OK)) { SetTaskMsg(MSGJPN023, Socks4Reply.Result); @@ -1688,15 +2037,19 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) } else if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) { - if(Socks5SelMethod(sSocket, CancelCheckWork) == FAIL) + if(Socks5SelMethod(sSocket, CancelCheckWork) == FFFTP_FAIL) { DoClose(sSocket); sSocket = INVALID_SOCKET; } Socks5Reply.Result = -1; - if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != SUCCESS) || - (Socks5GetCmdReply(sSocket, &Socks5Reply) != SUCCESS) || + // 同時接続対応 +// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) + if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5Reply.Result != SOCKS5_RES_OK)) { SetTaskMsg(MSGJPN024, Socks5Reply.Result); @@ -1712,7 +2065,7 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) else { //#pragma aaa - SetTaskMsg(MSGJPN026/*"Ú‘±‚Å‚«‚Ü‚¹‚ñ(2) %x", sSocket*/); + SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/); DoClose(sSocket); sSocket = INVALID_SOCKET; } @@ -1724,17 +2077,186 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) } -/*----- ƒŠƒbƒXƒ“ƒ\ƒPƒbƒg‚ðŽæ“¾ ------------------------------------------------ +SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork) +{ + struct sockaddr_in6 saSockAddr; + char HostEntry[MAXGETHOSTSTRUCT]; + struct hostent *pHostEntry; + SOCKET sSocket; + int Len; + int Fwall; + SOCKS5REQUEST Socks5Cmd; + SOCKS5REPLY Socks5Reply; + + ////////////////////////////// + // ホスト名解決と接続の準備 + ////////////////////////////// + + Fwall = FWALL_NONE; + if(AskHostFireWall() == YES) + Fwall = FwallType; + + sSocket = INVALID_SOCKET; + + UseIPadrs = YES; + strcpy(DomainName, host); + memset(&CurSockAddrIPv6, 0, sizeof(CurSockAddrIPv6)); + CurSockAddrIPv6.sin6_port = htons((u_short)port); + CurSockAddrIPv6.sin6_family = AF_INET6; + CurSockAddrIPv6.sin6_addr = inet6_addr(host); + if(memcmp(&CurSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0) + { + // ホスト名が指定された + // ホスト名からアドレスを求める + if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) && + (FwallResolv == YES)) + { + // ホスト名解決はSOCKSサーバに任せる + pHostEntry = NULL; + } + else + { + // アドレスを取得 + SetTaskMsg(MSGJPN016, DomainName); + pHostEntry = do_gethostbynameIPv6(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); + } + + if(pHostEntry != NULL) + { + memcpy((char *)&CurSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length); + SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port)); + } + else + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + UseIPadrs = NO; + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv6.sin6_port)); + } + else + { + SetTaskMsg(MSGJPN019, host); + return(INVALID_SOCKET); + } + } + } + else + SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port)); + + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + // SOCKSを使う + // SOCKSに接続する準備 + { + Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port); + } + + memset(&SocksSockAddrIPv6, 0, sizeof(SocksSockAddrIPv6)); + SocksSockAddrIPv6.sin6_addr = inet6_addr(FwallHost); + if(memcmp(&SocksSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0) + { + if((pHostEntry = do_gethostbynameIPv6(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) + memcpy((char *)&SocksSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length); + else + { + SetTaskMsg(MSGJPN021, FwallHost); + return INVALID_SOCKET; + } + } + SocksSockAddrIPv6.sin6_port = htons((u_short)FwallPort); + SocksSockAddrIPv6.sin6_family = AF_INET6; + SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddrIPv6.sin6_addr), ntohs(SocksSockAddrIPv6.sin6_port)); + // connectで接続する先はSOCKSサーバ + memcpy(&saSockAddr, &SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6)); + } + else + { + // connectで接続するのは接続先のホスト + memcpy(&saSockAddr, &CurSockAddrIPv6, sizeof(CurSockAddrIPv6)); + } + + ///////////// + // 接続実行 + ///////////// + + inet6_ntoa(saSockAddr.sin6_addr); + if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET) + { + if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR) + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + if(Socks5SelMethod(sSocket, CancelCheckWork) == FFFTP_FAIL) + { + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + + Socks5Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) + if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5Reply.Result != SOCKS5_RES_OK)) + { + SetTaskMsg(MSGJPN024, Socks5Reply.Result); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + + } + + if(sSocket != INVALID_SOCKET) + SetTaskMsg(MSGJPN025); + } + else + { +//#pragma aaa + SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + } + else + SetTaskMsg(MSGJPN027); + + return(sSocket); +} + + +/*----- リッスンソケットを取得 ------------------------------------------------ * * Parameter -* SOCKET ctrl_skt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* SOCKET ctrl_skt : コントロールソケット * * Return Value -* SOCKET ƒŠƒbƒXƒ“ƒ\ƒPƒbƒg +* SOCKET リッスンソケット *----------------------------------------------------------------------------*/ +// IPv6対応 SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) { + SOCKET Result; + Result = INVALID_SOCKET; + switch(CurHost.CurNetType) + { + case NTYPE_IPV4: + Result = GetFTPListenSocketIPv4(ctrl_skt, CancelCheckWork); + break; + case NTYPE_IPV6: + Result = GetFTPListenSocketIPv6(ctrl_skt, CancelCheckWork); + break; + } + return Result; +} + + +// IPv6対応 +//SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) +SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork) +{ SOCKET listen_skt; int iLength; char *a,*p; @@ -1756,20 +2278,29 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) { if(Fwall == FWALL_SOCKS4) { - /*===== SOCKS4‚ðŽg‚¤ =====*/ + /*===== SOCKS4を使う =====*/ DoPrintf("Use SOCKS4 BIND"); - if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + // IPv6対応 +// if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR) { Socks4Cmd.Ver = SOCKS4_VER; Socks4Cmd.Cmd = SOCKS4_CMD_BIND; - Socks4Cmd.Port = CurSockAddr.sin_port; - Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + // IPv6対応 +// Socks4Cmd.Port = CurSockAddr.sin_port; +// Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + Socks4Cmd.Port = CurSockAddrIPv4.sin_port; + Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr; strcpy(Socks4Cmd.UserID, FwallUser); Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; Socks4Reply.Result = -1; - if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != SUCCESS) || - (Socks4GetCmdReply(listen_skt, &Socks4Reply) != SUCCESS) || + // 同時接続対応 +// if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks4GetCmdReply(listen_skt, &Socks4Reply) != FFFTP_SUCCESS) || +// (Socks4Reply.Result != SOCKS4_RES_OK)) + if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks4GetCmdReply(listen_skt, &Socks4Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks4Reply.Result != SOCKS4_RES_OK)) { SetTaskMsg(MSGJPN028, Socks4Reply.Result); @@ -1778,7 +2309,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) } if(Socks4Reply.AdrsInt == 0) - Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + // IPv6対応 +// Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + Socks4Reply.AdrsInt = SocksSockAddrIPv4.sin_addr.s_addr; a = (char *)&Socks4Reply.AdrsInt; p = (char *)&Socks4Reply.Port; @@ -1786,22 +2319,30 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) } else if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) { - /*===== SOCKS5‚ðŽg‚¤ =====*/ + /*===== SOCKS5を使う =====*/ DoPrintf("Use SOCKS5 BIND"); - if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + // IPv6対応 +// if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR) { - if(Socks5SelMethod(listen_skt, CancelCheckWork) == FAIL) + if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL) { DoClose(listen_skt); listen_skt = INVALID_SOCKET; return(listen_skt); } - Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + // IPv6対応 +// Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port); Socks5Reply.Result = -1; - if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != SUCCESS) || - (Socks5GetCmdReply(listen_skt, &Socks5Reply) != SUCCESS) || + // 同時接続対応 +// if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) + if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(listen_skt, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5Reply.Result != SOCKS5_RES_OK)) { SetTaskMsg(MSGJPN029, Socks5Reply.Result); @@ -1809,16 +2350,20 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) listen_skt = INVALID_SOCKET; } - if(Socks5Reply.AdrsInt == 0) - Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + // IPv6対応 +// if(Socks5Reply.AdrsInt == 0) +// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; - a = (char *)&Socks5Reply.AdrsInt; - p = (char *)&Socks5Reply.Port; + // IPv6対応 +// a = (char *)&Socks5Reply.AdrsInt; +// p = (char *)&Socks5Reply.Port; + a = (char *)&Socks5Reply._dummy[0]; + p = (char *)&Socks5Reply._dummy[4]; } } else { - /*===== SOCKS‚ðŽg‚í‚È‚¢ =====*/ + /*===== SOCKSを使わない =====*/ DoPrintf("Use normal BIND"); saCtrlAddr.sin_port = htons(0); saCtrlAddr.sin_family = AF_INET; @@ -1869,7 +2414,11 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) if(listen_skt != INVALID_SOCKET) { #define UC(b) (((int)b)&0xff) - if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", + // 同時接続対応 +// if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", +// UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), +// UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) + if((command(ctrl_skt,NULL, CancelCheckWork, "PORT %d,%d,%d,%d,%d,%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) { @@ -1885,13 +2434,147 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) } -/*----- ƒzƒXƒg‚֐ڑ±ˆ—’†‚©‚Ç‚¤‚©‚ð•Ô‚·--------------------------------------- +SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork) +{ + SOCKET listen_skt; + int iLength; + char *a,*p; + struct sockaddr_in6 saCtrlAddr; + struct sockaddr_in6 saTmpAddr; + SOCKS5REQUEST Socks5Cmd; + SOCKS5REPLY Socks5Reply; + + int Len; + int Fwall; + + char Adrs[40]; + + Fwall = FWALL_NONE; + if(AskHostFireWall() == YES) + Fwall = FwallType; + + if((listen_skt = do_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET) + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + /*===== SOCKS5を使う =====*/ + DoPrintf("Use SOCKS5 BIND"); + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6), CancelCheckWork) != SOCKET_ERROR) + { + if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL) + { + DoClose(listen_skt); + listen_skt = INVALID_SOCKET; + return(listen_skt); + } + + Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port); + + Socks5Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) + if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(listen_skt, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5Reply.Result != SOCKS5_RES_OK)) + { + SetTaskMsg(MSGJPN029, Socks5Reply.Result); + DoClose(listen_skt); + listen_skt = INVALID_SOCKET; + } + + // IPv6対応 +// if(Socks5Reply.AdrsInt == 0) +// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + + // IPv6対応 +// a = (char *)&Socks5Reply.AdrsInt; +// p = (char *)&Socks5Reply.Port; + a = (char *)&Socks5Reply._dummy[0]; + p = (char *)&Socks5Reply._dummy[16]; + } + } + else + { + /*===== SOCKSを使わない =====*/ + DoPrintf("Use normal BIND"); + saCtrlAddr.sin6_port = htons(0); + saCtrlAddr.sin6_family = AF_INET6; + memset(&saCtrlAddr.sin6_addr, 0, 16); + + if(bind(listen_skt, (struct sockaddr *)&saCtrlAddr, sizeof(struct sockaddr_in6)) != SOCKET_ERROR) + { + iLength = sizeof(saCtrlAddr); + if(getsockname(listen_skt, (struct sockaddr *)&saCtrlAddr, &iLength) != SOCKET_ERROR) + { + if(do_listen(listen_skt, 1) == 0) + { + iLength = sizeof(saTmpAddr); + if(getsockname(ctrl_skt, (struct sockaddr *)&saTmpAddr, &iLength) == SOCKET_ERROR) + ReportWSError("getsockname", WSAGetLastError()); + + a = (char *)&saTmpAddr.sin6_addr; + p = (char *)&saCtrlAddr.sin6_port; + } + else + { + ReportWSError("listen", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + } + else + { + ReportWSError("getsockname", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + } + else + { + ReportWSError("bind", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + + if(listen_skt == INVALID_SOCKET) + SetTaskMsg(MSGJPN030); + } + } + else + ReportWSError("socket create", WSAGetLastError()); + + if(listen_skt != INVALID_SOCKET) + { +#define UC(b) (((int)b)&0xff) + // 同時接続対応 +// if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", +// UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), +// UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) + if((command(ctrl_skt,NULL, CancelCheckWork, "EPRT |2|%s|%d|", + AddressToStringIPv6(Adrs, a), + (UC(p[0]) << 8) | UC(p[1])) / 100) != FTP_COMPLETE) + { + SetTaskMsg(MSGJPN031); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } +// else +// DoPrintf("Skt=%u : listener %s port %u",listen_skt,inet_ntoa(saCtrlAddr.sin_addr),ntohs(saCtrlAddr.sin_port)); + } + + return(listen_skt); +} + + +/*----- ホストへ接続処理中かどうかを返す--------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒXƒe[ƒ^ƒX +* int ステータス * YES/NO *----------------------------------------------------------------------------*/ @@ -1902,10 +2585,10 @@ int AskTryingConnect(void) #if 0 -///*----- ƒuƒƒbƒLƒ“ƒOƒR[ƒ‹‚̃tƒbƒNƒR[ƒ‹ƒoƒbƒN -------------------------------- +///*----- ブロッキングコールのフックコールバック -------------------------------- //* //* Parameter -//* ‚È‚µ +//* なし //* //* Return Value //* BOOL FALSE @@ -1927,18 +2610,18 @@ int AskTryingConnect(void) -/*----- SOCKS5‚̃Rƒ}ƒ“ƒhƒpƒPƒbƒg‚ðì¬‚·‚é ------------------------------------ +/*----- SOCKS5のコマンドパケットを作成する ------------------------------------ * * Parameter -* SOCKS5REQUEST *Packet : ƒpƒPƒbƒg‚ðì¬‚·‚郏[ƒN -* char Cmd : ƒRƒ}ƒ“ƒh -* int ValidIP : IPƒAƒhƒŒƒX‚ðŽg‚¤‚©‚Ç‚¤‚©(YES/NO) -* ulong IP : IPƒAƒhƒŒƒX -* char *Host : ƒzƒXƒg–¼ -* ushort Port : ƒ|[ƒg +* SOCKS5REQUEST *Packet : パケットを作成するワーク +* char Cmd : コマンド +* int ValidIP : IPアドレスを使うかどうか(YES/NO) +* ulong IP : IPアドレス +* char *Host : ホスト名 +* ushort Port : ポート * * Return Value -* int ƒRƒ}ƒ“ƒhƒpƒPƒbƒg‚Ì’·‚³ +* int コマンドパケットの長さ *----------------------------------------------------------------------------*/ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port) @@ -1949,14 +2632,14 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo Pos = (uchar *)Packet; Pos += SOCKS5REQUEST_SIZE; - TotalLen = SOCKS5REQUEST_SIZE + 2; /* +2‚̓|[ƒg‚Ì•ª */ + TotalLen = SOCKS5REQUEST_SIZE + 2; /* +2はポートの分 */ Packet->Ver = SOCKS5_VER; Packet->Cmd = Cmd; Packet->Rsv = 0; if(ValidIP == YES) { - /* IPƒAƒhƒŒƒX‚ðŽw’è */ + /* IPアドレスを指定 */ Packet->Type = SOCKS5_ADRS_IPV4; *((ulong *)Pos) = IP; Pos += 4; @@ -1964,7 +2647,7 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo } else { - /* ƒzƒXƒg–¼‚ðŽw’è */ + /* ホスト名を指定 */ Packet->Type = SOCKS5_ADRS_NAME; Len = strlen(Host); *Pos++ = Len; @@ -1978,15 +2661,53 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo } -/*----- SOCKS‚̃Rƒ}ƒ“ƒh‚ð‘—‚é ------------------------------------------------- +// IPv6対応 +static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port) +{ + uchar *Pos; + int Len; + int TotalLen; + + Pos = (uchar *)Packet; + Pos += SOCKS5REQUEST_SIZE; + TotalLen = SOCKS5REQUEST_SIZE + 2; /* +2はポートの分 */ + + Packet->Ver = SOCKS5_VER; + Packet->Cmd = Cmd; + Packet->Rsv = 0; + if(ValidIP == YES) + { + /* IPアドレスを指定 */ + Packet->Type = SOCKS5_ADRS_IPV6; + memcpy(Pos, IP, 16); + Pos += 16; + TotalLen += 16; + } + else + { + /* ホスト名を指定 */ + Packet->Type = SOCKS5_ADRS_NAME; + Len = strlen(Host); + *Pos++ = Len; + strcpy(Pos, Host); + Pos += Len; + TotalLen += Len + 1; + } + *((ushort *)Pos) = Port; + + return(TotalLen); +} + + +/*----- SOCKSのコマンドを送る ------------------------------------------------- * * Parameter -* SOCKET Socket : ƒ\ƒPƒbƒg -* void *Data : ‘—‚éƒf[ƒ^ -* int Size : ƒTƒCƒY +* SOCKET Socket : ソケット +* void *Data : 送るデータ +* int Size : サイズ * * Return Value -* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork) @@ -1995,24 +2716,26 @@ static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWor Ret = SendData(Socket, (char *)Data, Size, 0, CancelCheckWork); - if(Ret != SUCCESS) + if(Ret != FFFTP_SUCCESS) SetTaskMsg(MSGJPN033, *((short *)Data)); return(Ret); } -/*----- SOCKS5‚̃Rƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒCƒpƒPƒbƒg‚ðŽóM‚·‚é -------------------- +/*----- SOCKS5のコマンドに対するリプライパケットを受信する -------------------- * * Parameter -* SOCKET Socket : ƒ\ƒPƒbƒg -* SOCKS5REPLY *Packet : ƒpƒPƒbƒg +* SOCKET Socket : ソケット +* SOCKS5REPLY *Packet : パケット * * Return Value -* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ -static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) +// 同時接続対応 +//static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) +static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet, int *CancelCheckWork) { uchar *Pos; int Len; @@ -2021,62 +2744,72 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) Pos = (uchar *)Packet; Pos += SOCKS5REPLY_SIZE; - if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == SUCCESS) + // 同時接続対応 +// if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == FFFTP_SUCCESS) + if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, CancelCheckWork)) == FFFTP_SUCCESS) { if(Packet->Type == SOCKS5_ADRS_IPV4) Len = 4 + 2; else if(Packet->Type == SOCKS5_ADRS_IPV6) - Len = 6 + 2; + Len = 16 + 2; else { - if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == SUCCESS) + // 同時接続対応 +// if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == FFFTP_SUCCESS) + if((Ret = ReadNchar(Socket, (char *)Pos, 1, CancelCheckWork)) == FFFTP_SUCCESS) { Len = *Pos + 2; Pos++; } } - if(Ret == SUCCESS) - Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg); + if(Ret == FFFTP_SUCCESS) + // 同時接続対応 +// Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg); + Ret = ReadNchar(Socket, (char *)Pos, Len, CancelCheckWork); } - if(Ret != SUCCESS) + if(Ret != FFFTP_SUCCESS) SetTaskMsg(MSGJPN034); return(Ret); } -/*----- SOCKS4‚̃Rƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒCƒpƒPƒbƒg‚ðŽóM‚·‚é -------------------- +/*----- SOCKS4のコマンドに対するリプライパケットを受信する -------------------- * * Parameter -* SOCKET Socket : ƒ\ƒPƒbƒg -* SOCKS5REPLY *Packet : ƒpƒPƒbƒg +* SOCKET Socket : ソケット +* SOCKS5REPLY *Packet : パケット * * Return Value -* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ -static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet) +// 同時接続対応 +//static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet) +static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet, int *CancelCheckWork) { int Ret; - Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg); + // 同時接続対応 +// Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg); + Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, CancelCheckWork); - if(Ret != SUCCESS) + if(Ret != FFFTP_SUCCESS) DoPrintf(MSGJPN035); return(Ret); } -/*----- SOCKS5‚Ì”FØ‚ðs‚¤ ---------------------------------------------------- +/*----- SOCKS5の認証を行う ---------------------------------------------------- * * Parameter -* SOCKET Socket : ƒ\ƒPƒbƒg +* SOCKET Socket : ソケット * * Return Value -* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) @@ -2089,7 +2822,7 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) int Len; int Len2; - Ret = SUCCESS; + Ret = FFFTP_SUCCESS; Socks5Method.Ver = SOCKS5_VER; Socks5Method.Num = 1; if(FwallType == FWALL_SOCKS5_NOAUTH) @@ -2097,12 +2830,16 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) else Socks5Method.Methods[0] = SOCKS5_AUTH_USER; - if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != SUCCESS) || - (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != SUCCESS) || + // 同時接続対応 +// if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || +// (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != FFFTP_SUCCESS) || +// (Socks5MethodReply.Method == (uchar)0xFF)) + if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || + (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5MethodReply.Method == (uchar)0xFF)) { SetTaskMsg(MSGJPN036); - Ret = FAIL; + Ret = FFFTP_FAIL; } else if(Socks5MethodReply.Method == SOCKS5_AUTH_USER) { @@ -2115,12 +2852,16 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) Buf[2 + Len] = Len2; strcpy(Buf+3+Len, FwallPass); - if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != SUCCESS) || - (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != SUCCESS) || + // 同時接続対応 +// if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != FFFTP_SUCCESS) || +// (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != FFFTP_SUCCESS) || +// (Socks5Status.Status != 0)) + if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != FFFTP_SUCCESS) || + (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5Status.Status != 0)) { SetTaskMsg(MSGJPN037); - Ret = FAIL; + Ret = FFFTP_FAIL; } } else @@ -2130,46 +2871,57 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) } -/*----- SOCKS‚ÌBIND‚Ì‘æ‚QƒŠƒvƒ‰ƒCƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚é ------------------------- +/*----- SOCKSのBINDの第2リプライメッセージを受け取る ------------------------- * * Parameter -* SOCKET Socket : ƒ\ƒPƒbƒg -* SOCKET *Data : ƒf[ƒ^ƒ\ƒPƒbƒg‚ð•Ô‚·ƒ[ƒN +* SOCKET Socket : ソケット +* SOCKET *Data : データソケットを返すワーク * * Return Value -* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ -int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data) +// 同時接続対応 +//int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data) +int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data, int *CancelCheckWork) { int Ret; char Buf[300]; - Ret = FAIL; + Ret = FFFTP_FAIL; if((AskHostFireWall() == YES) && (FwallType == FWALL_SOCKS4)) { - Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf); + // 同時接続対応 +// Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf); + Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf, CancelCheckWork); *Data = Socket; - Ret = SUCCESS; + Ret = FFFTP_SUCCESS; } else if((AskHostFireWall() == YES) && ((FwallType == FWALL_SOCKS5_NOAUTH) || (FwallType == FWALL_SOCKS5_USER))) { - Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf); + // 同時接続対応 +// Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf); + Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf, CancelCheckWork); *Data = Socket; - Ret = SUCCESS; + Ret = FFFTP_SUCCESS; } return(Ret); } -// ˆÃ†‰»’ʐM‘Ήž +// 暗号化通信対応 int AskCryptMode(void) { return(CurHost.CryptMode); } +int AskUseNoEncryption(void) +{ + return(CurHost.UseNoEncryption); +} + int AskUseFTPES(void) { return(CurHost.UseFTPES); @@ -2185,3 +2937,54 @@ int AskUseSFTP(void) return(CurHost.UseSFTP); } +char *AskPrivateKey(void) +{ + return(CurHost.PrivateKey); +} + +// 同時接続対応 +int AskMaxThreadCount(void) +{ + return(CurHost.MaxThreadCount); +} + +int AskReuseCmdSkt(void) +{ + return(CurHost.ReuseCmdSkt); +} + +// FEAT対応 +int AskHostFeature(void) +{ + return(CurHost.Feature); +} + +// MLSD対応 +int AskUseMLSD(void) +{ + return(CurHost.UseMLSD); +} + +// IPv6対応 +int AskCurNetType(void) +{ + return(CurHost.CurNetType); +} + +// 自動切断対策 +int AskNoopInterval(void) +{ + return(CurHost.NoopInterval); +} + +// 再転送対応 +int AskTransferErrorMode(void) +{ + return(CurHost.TransferErrorMode); +} + +int AskTransferErrorNotify(void) +{ + return(CurHost.TransferErrorNotify); +} +