2003.08.05 (火) 03:16:05 <Heracules> shuusei24159からの移植です。2.1.1ベースでは使えない関数などを置き換えたり追加したりしたので、24159よりもパッチ量が増えてます。
2003.08.05 (火) 03:17:06 <Heracules> 一応、Utatane 0.25、WinMX 2.6、WinMX 3.31、Napchan 0.79.718でチェック完了しました。
2003.08.05 (火) 03:18:57 <Heracules> 2getとXNapの判定はまだ試してません。どなたか試したら報告お願いします(一応、24159と同等のはずですが)。
2003.08.05 (火) 03:20:09 <Heracules> http://cafe-au-lait.ath.cx/files/SlavaDev211112.rar バイナリのみ。
2003.08.05 (火) 03:39:46 <Heracules> 本家2.4.1でデフォルトでサポートされてるWinMXHidden等への対応が不完全なので、24159以上に誤判定の可能性があります。
2003.08.05 (火) 03:40:11 <Heracules> 2.4.1との差については近いうちに改めて追加パッチをリリースします。
2003.08.05 (火) 04:12:19 <Heracules> locPingableがうまく取得できてない模様。2getの判定がMX2.xになる。次のパッチで修正可能なら直す予定。
shuusei211112:クライアント自動判別機能(24159参照, 移植改変 by Heracules)
diff --dos -urN 211111/console.pas 211112/console.pas --- 211111/console.pas Sun Jul 27 13:47:08 2003 +++ 211112/console.pas Tue Aug 05 02:40:54 2003 @@ -474,6 +474,30 @@ if str<>'' then str:=str+', '; str:=str+GetLangI(LNG_LIST_CHATTING); end; + if FindLocalUser(user)<>nil then + begin + tmp_pos:=1379; + if TLocalUser(FindLocalUser(user)).softwareID=softWinMXHidden then + if str<>'' then str:=str+', WinMX' + else + {if (TLocalUser(FindLocalUser(user)).softwareID<>softWinMXNormal) and (TLocalUser(FindLocalUser(user)).softwareID<>softWinMXJap) and (not (locPingable in TLocalUser(FindLocalUser(user)).localstate)) and ((current_time-20000)>TLocalUser(FindLocalUser(user)).last_seen) then + begin + if str<>'' then str:=str+', WinMX??'; + end;} + if str<>'' then str:=str+', '; + if locPingable in TLocalUser(FindLocalUser(user)).localstate then + begin + if loc326 in TLocalUser(FindLocalUser(user)).detector then str:=str+'2get' + else if loc10300 in TLocalUser(FindLocalUser(user)).detector then str:=str+'XNap'; + //else if not (loc208 in TLocalUser(FindLocalUser(user)).detector) then str:=str+'XNap??'; + end + else if loc326 in TLocalUser(FindLocalUser(user)).detector then str:=str+'MX2.x' + else if loc110 in TLocalUser(FindLocalUser(user)).detector then str:=str+'Napchan' + else if loc208 in TLocalUser(FindLocalUser(user)).detector then str:=str+'Utatane' + else if locMD5Zeros in TLocalUser(FindLocalUser(user)).detector then str:=str+'Utatane' + else if locMD5NonZero in TLocalUser(FindLocalUser(user)).detector then str:=str+'MX3.x' + else str:=str+'MX3.x??'; + end; item.SubItems.Add(str); end; end; diff --dos -urN 211111/localusers.pas 211112/localusers.pas --- 211111/localusers.pas Tue Jul 22 15:06:40 2003 +++ 211112/localusers.pas Tue Aug 05 02:41:54 2003 @@ -26,7 +26,10 @@ servers, users, registered, lang, slavastrings; type - TLocalUserState = set of (locSwapBytes, locNeedsUpdate, locWriteOnly, locFloodWarning); + TLocalUserState = set of (locSwapBytes, locNeedsUpdate, locWriteOnly, + locFloodWarning, locPingable); + TLocalUserDetector = set of (loc326, loc110, loc640, loc208, + loc100, loc870, loc10300, locMD5Zero, locMD5NonZero, locMD5Zeros); TLocalUser = class(TObject) data : POnlineUser; socket : HSocket; @@ -58,6 +61,7 @@ ratepointcache : Integer; last_channel_time: Integer; auto_channel : Boolean; + detector : TLocalUserDetector; constructor Create; destructor Destroy; override; function logged: Boolean; @@ -117,6 +121,7 @@ softwareID:=softUnknown; last_channel_time:=3; auto_channel:=False; + detector:=[]; {$IFDEF USERS_DOUBLE_QUEUE} StrHash_Reset(out_list2); {$ENDIF} @@ -185,6 +190,8 @@ wantqueuep3m:=0; ratepointcache:=0; softwareID:=softUnknown; + auto_channel:=False; + detector:=[]; {$IFDEF USERS_DOUBLE_QUEUE} StrHash_Clear(out_list2); {$ENDIF} diff --dos -urN 211111/handler.pas 211112/handler.pas --- 211111/handler.pas Wed Jul 30 02:26:24 2003 +++ 211112/handler.pas Tue Aug 05 03:04:22 2003 @@ -24,6 +24,7 @@ constants, users, servers, stypes, blcksock, synsock, localusers, registered, slavastrings, class_cmdlist, class_cmdexlist, mmsystem, local2global, mainform; +function FindLocalUser(data: POnlineUser): TLocalUser; overload; function ProcessCommand(usr: TLocalUser; q: TQuery=queryNormal): Boolean; procedure ProcessServerCommand(srv: TServer); procedure DisconnectUser(usr: TLocalUser; reason, text, sender: String;close_socket: Boolean); @@ -1571,6 +1572,9 @@ if query<>queryNormal then exit; if not isLogged then exit; if not CheckParams(1) then exit; + if gcmd.id=MSG_CLIENT_ADD_HOTLIST_SEQ then + if GetTickCount-local.last_seen<30000 then + local.detector:=local.detector+[loc208]; tmp_pos:=251; case gcmd.id of MSG_CLIENT_ADD_HOTLIST, @@ -1649,6 +1653,8 @@ local.Exec(MSG_SERVER_NOT_IGNORED,gcmd.cmd); end; MSG_CLIENT_CLEAR_IGNORE: begin + if GetTickCount-local.last_seen<30000 then + local.detector:=local.detector+[loc326]; i:=local.ignored.Count; StrHash_Clear(local.ignored); local.Exec(gcmd.id,IntToStr(i)); @@ -2498,6 +2504,10 @@ local.Exec(MSG_SERVER_NOSUCH,GetLangT(LNG_SHARE_LARGE,filename)); exit; end; + if (dir='') and not valid_dir then local.detector:=local.detector+[loc100]; + if hlist.Strings[1]='0' then local.detector:=local.detector+[locMD5Zero] + else if hlist.Strings[1]='00000000000000000000000000000000' then local.detector:=local.detector+[locMD5Zeros] + else local.detector:=local.detector+[locMD5NonZero]; tmp_pos:=12262; if autoban_incomplete then if AnsiPos('__INCOMPLETE___',rec.name)<>0 then @@ -2563,6 +2573,7 @@ end; exit; end; + local.detector:=local.detector+[loc870]; tmp_pos:=302; dir:=hlist.Strings[0]; hlist.Delete(0); @@ -2598,6 +2609,10 @@ if query<>queryNormal then exit; if user^.level=napUserLeech then exit; if not CheckParams(4) then exit; + local.detector:=local.detector+[loc10300]; + if hlist.Strings[1]='0' then local.detector:=local.detector+[locMD5Zero] + else if hlist.Strings[1]='00000000000000000000000000000000' then local.detector:=local.detector+[locMD5Zeros] + else local.detector:=local.detector+[locMD5NonZero]; tmp_pos:=311; rec.mime:=StrToType(hlist.Strings[3]); if rec.mime=TYPE_INVALID then exit; @@ -2684,6 +2699,7 @@ tmp_pos:=320; if not isLocal then exit; if not isLogged then exit; + if GetTickCount-local.last_seen<30000 then local.detector:=local.detector+[loc110]; if local.shared=nil then exit; if user^.shared=0 then exit; tmp_pos:=321; @@ -6025,6 +6041,17 @@ Exec(user2,gcmd.id,user^.nick); end; +procedure Handler_Pong; +begin + if user^.server=nil then + if (not (locPingable in local.localstate)) and (AnsiLowerCase(gcmd.cmd)='server') then + begin + local.localstate:=local.localstate+[locPingable]; + exit; + end; + Handler_Relay; +end; + procedure Handler_UserMode; var st: TUserState; @@ -10299,7 +10326,7 @@ MSG_CLIENT_CHANGE_DATA_PORT : Handler_SetDataPort; // 703 - change data port MSG_CLIENT_PING_SERVER : Handler_ServerPing; // 750 - ping server MSG_CLIENT_PING : Handler_Relay2; // 751 - user ping - MSG_CLIENT_PONG : Handler_Relay; // 752 - user pong + MSG_CLIENT_PONG : Handler_Pong; // 752 - user pong MSG_CLIENT_ALTER_PASS : Handler_AlterPass; // 753 - change password MSG_CLIENT_SERVER_RECONFIG : Handler_Restart; // 800 - reconfig MSG_CLIENT_SERVER_VERSION : Handler_ServerVersion; // 801 - server version diff --dos -urN 211111/stypes.pas 211112/stypes.pas --- 211111/stypes.pas Fri Aug 01 16:10:11 2003 +++ 211112/stypes.pas Tue Aug 05 02:54:12 2003 @@ -1245,7 +1245,7 @@ end; end; end; - for i:=2 to 5 do + for i:=1 to 5 do if AnsiPos('$'+IntToStr(i),str)>0 then begin Result:=false; diff --dos -urN 211111/mainform.pas 211112/mainform.pas --- 211111/mainform.pas Sun Jul 27 17:01:40 2003 +++ 211112/mainform.pas Tue Aug 05 02:45:54 2003 @@ -1559,6 +1559,7 @@ StrHash_Reset(cons_ignored); cons_list:=consFriends; cons:=TLocalUser.Create; + cons.localstate:=cons.localstate+[locPingable]; cons.last_seen:=GetTickCount; rec.nick:=ini.ReadString('Console','User','Admin'); rec.state:=Int2UserState(ini.ReadInteger('Console','UserMode',0),false);