From d2e671392beea1031416bf443839f86ac81fa375 Mon Sep 17 00:00:00 2001 From: leper Date: Sun, 15 Dec 2013 18:33:01 +0000 Subject: [PATCH] Fix bug in ipstamp module. Sync with server. Refs #2307. This was SVN commit r14363. --- source/tools/XpartaMuPP/XpartaMuPP.py | 14 ++--- source/tools/XpartaMuPP/mod_ipstamp.erl | 72 ++++++++++++++----------- 2 files changed, 49 insertions(+), 37 deletions(-) diff --git a/source/tools/XpartaMuPP/XpartaMuPP.py b/source/tools/XpartaMuPP/XpartaMuPP.py index 98604d1215..4aa6b86354 100644 --- a/source/tools/XpartaMuPP/XpartaMuPP.py +++ b/source/tools/XpartaMuPP/XpartaMuPP.py @@ -479,15 +479,15 @@ class XpartaMuPP(sleekxmpp.ClientXMPP): """ pass elif iq['type'] == 'set': - if 'gamelist|en' in iq.values: + if 'gamelist' in iq.values: """ Register-update / unregister a game """ - command = iq['gamelist|en']['command'] + command = iq['gamelist']['command'] if command == 'register': # Add game try: - self.gameList.addGame(iq['from'], iq['gamelist|en']['game']) + self.gameList.addGame(iq['from'], iq['gamelist']['game']) self.sendGameList() except: traceback.print_exc() @@ -504,19 +504,19 @@ class XpartaMuPP(sleekxmpp.ClientXMPP): elif command == 'changestate': # Change game status (waiting/running) try: - self.gameList.changeGameState(iq['from'], iq['gamelist|en']['game']) + self.gameList.changeGameState(iq['from'], iq['gamelist']['game']) self.sendGameList() except: traceback.print_exc() logging.error("Failed to process changestate data") else: logging.error("Failed to process command '%s' received from %s" % command, iq['from'].bare) - elif 'gamereport|en' in iq.values: + elif 'gamereport' in iq.values: """ Client is reporting end of game statistics """ try: - self.reportManager.addReport(iq['from'], iq['gamereport|en']['game']) + self.reportManager.addReport(iq['from'], iq['gamereport']['game']) if self.leaderboard.getLastRatedMessage() != "": self.send_message(mto=self.room, mbody=self.leaderboard.getLastRatedMessage(), mtype="groupchat", mnick=self.nick) @@ -647,6 +647,6 @@ if __name__ == '__main__': xmpp.register_plugin('xep_0199') # XMPP Ping if xmpp.connect(): - xmpp.process(block=False) + xmpp.process(threaded=False) else: logging.error("Unable to connect") diff --git a/source/tools/XpartaMuPP/mod_ipstamp.erl b/source/tools/XpartaMuPP/mod_ipstamp.erl index 75a3e5b1df..d9669aa8bb 100644 --- a/source/tools/XpartaMuPP/mod_ipstamp.erl +++ b/source/tools/XpartaMuPP/mod_ipstamp.erl @@ -13,6 +13,7 @@ %% %% You should have received a copy of the GNU General Public License %% along with 0 A.D. If not, see . + -module(mod_ipstamp). -behaviour(gen_mod). @@ -25,52 +26,63 @@ -define (Domain, "lobby.wildfiregames.com"). %% Login of the Xpartamupp jabber client --define (XpartamuppLogin, "xpartamupp"). +%% TODO: It would be nice to get this from the module options. +-define (XpartamuppLogin, "wfgbot"). start(_Host, _Opts) -> - ?INFO_MSG("mod_ipip starting", []), + ?INFO_MSG("mod_ipstamp starting", []), ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 50), ok. stop(_Host) -> + ?INFO_MSG("mod_ipstamp stopping", []), ejabberd_hooks:delete(filter_packet, global, ?MODULE, on_filter_packet, 50), ok. on_filter_packet({From, To, Packet} = Input) -> - {_,STo,_,_,_,_,_} = To, + {_,SElement,LPacketInfo,LPacketQuery} = Packet, {_,SFrom,_,_,_,_,_} = From, - if STo == "xpartamupp" -> - {_,SElement,LPacketInfo,LPacketQuery} = Packet, - if SElement == "iq" -> + {_,STo,_,_,_,_,_} = To, + %% We only want to do something for the bot + if STo == ?XpartamuppLogin -> + if SElement == "iq" -> + %% Get iq type (get/set/result...). {_, SType} = lists:keyfind("type",1,LPacketInfo), if SType == "set" -> - {_,_,LXmlns,LGame} = lists:keyfind("query",2,LPacketQuery), + %% Get the sender's IP for later. + Info = ejabberd_sm:get_user_info(SFrom,[?Domain],"0ad"), + {ip, {Ploc, _Port}} = lists:keyfind(ip, 1, Info), + SIp = inet_parse:ntoa(Ploc), + %% Get XMLNS and message body (we assume the first xml element contains the xmlns). + {_,_,LXmlns,LBody} = lists:keyfind(xmlelement,1,LPacketQuery), {_,SXmlns} = lists:keyfind("xmlns",1,LXmlns), + %% Insert IP into game registration requests. if SXmlns == "jabber:iq:gamelist" -> - {_,_,_,LCommand} = lists:keyfind("command",2,LGame), + {_,_,_,LCommand} = lists:keyfind("command",2,LBody), {_,SCommand} = lists:keyfind(xmlcdata,1,LCommand), if SCommand == <<"register">> -> - {_,_,KGame,_} = lists:keyfind("game",2,LGame), - Info = ejabberd_sm:get_user_info(SFrom,[?Domain],"0ad"), - {ip, {Ploc, _Port}} = lists:keyfind(ip, 1, Info), - SIp = inet_parse:ntoa(Ploc), - ?INFO_MSG(string:concat("stamp ip: ",SIp), []), - {From,To,{xmlelement,"iq",LPacketInfo,[ - {xmlelement,"query",[{"xmlns","jabber:iq:gamelist"}],[ - {xmlelement,"game",lists:keyreplace("ip",1,KGame,{"ip",SIp}),[]}, - {xmlelement,"command",[],[{xmlcdata,<<"register">>}]} - ] - } - ]}} - ; true -> Input - end - ; true -> Input - end - ; true -> Input - end - ; true -> Input - end - ; true -> Input + {_,_,KGame,_} = lists:keyfind("game",2,LBody), + ?INFO_MSG(string:concat("Inserting IP into game registration stanza: ",SIp), []), + {From,To,{xmlelement,"iq",LPacketInfo,[ + {xmlelement,"query",[{"xmlns","jabber:iq:gamelist"}],[ + {xmlelement,"game",lists:keyreplace("ip",1,KGame,{"ip",SIp}),[]}, + {xmlelement,"command",[],[{xmlcdata,<<"register">>}]} + ] + } + ]}}; + true -> + Input + end; + true -> + Input + end; + true -> + Input + end; + true -> + Input + end; + true -> + Input end. -