From 9fec12425073b80a4b9fd9c6164ddb4f5375e6d3 Mon Sep 17 00:00:00 2001 From: mathieui Date: Wed, 8 Aug 2012 23:59:00 +0200 Subject: [PATCH] Fix yet another bunch of potential tracebacks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (notably, the /message one) All JID calls in poezio’s code were already covered, but sleekxmpp does that, too, so each jid given to sleek must be validated, otherwise an unwanted exception may occur. --- src/connection.py | 6 +++++- src/core.py | 12 +++++++----- src/multiuserchat.py | 12 +++++++++++- src/tabs.py | 16 +++++++++------- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/connection.py b/src/connection.py index 30e0b552..b712004b 100644 --- a/src/connection.py +++ b/src/connection.py @@ -21,6 +21,7 @@ import sleekxmpp from config import config, options from logger import logger import common +from common import safeJID class Connection(sleekxmpp.ClientXMPP): """ @@ -40,8 +41,11 @@ class Connection(sleekxmpp.ClientXMPP): password = config.get('password', '') or getpass.getpass() else: # anonymous auth self.anon = True - jid = '%s/%s' % (config.get('server', 'anon.louiz.org'), resource) + jid = config.get('server', 'anon.louiz.org') + if resource: + jid = '%s/%s' % (jid, resource) password = None + jid = safeJID(jid) sleekxmpp.ClientXMPP.__init__(self, jid, password) self.core = None self.auto_reconnect = True if config.get('auto_reconnect', 'false').lower() in ('true', '1') else False diff --git a/src/core.py b/src/core.py index 519e82a3..5ed1cd17 100644 --- a/src/core.py +++ b/src/core.py @@ -826,7 +826,7 @@ class Core(object): Disable private tabs when leaving a room """ for tab in self.tabs: - if tab.get_name().startswith(room_name) and isinstance(tab, tabs.PrivateTab): + if isinstance(tab, tabs.PrivateTab) and tab.get_name().startswith(room_name): tab.deactivate(reason=reason) def enable_private_tabs(self, room_name, reason='\x195}You joined the chatroom\x193}'): @@ -1909,8 +1909,8 @@ class Core(object): if len(args) < 2: return reason = args[2] if len(args) > 2 else '' - to = args[0] - room = args[1] + to = safeJID(args[0]) + room = safeJID(args[1]) self.xmpp.plugin['xep_0045'].invite(room, to, reason) def completion_invite(self, the_input): @@ -2058,8 +2058,10 @@ class Core(object): if len(args) < 1: self.command_help('message') return - jid = args[0] - tab = self.open_conversation_window(jid, focus=True) + jid = safeJID(args[0]) + if not jid.user and not jid.domain and not jid.resource: + return self.information('Invalid JID.', 'Error') + tab = self.open_conversation_window(jid.full, focus=True) if len(args) > 1: tab.command_say(args[1]) diff --git a/src/multiuserchat.py b/src/multiuserchat.py index 53bf4987..273a8dea 100644 --- a/src/multiuserchat.py +++ b/src/multiuserchat.py @@ -13,6 +13,7 @@ sleek plugin from xml.etree import cElementTree as ET +from common import safeJID import logging log = logging.getLogger(__name__) @@ -22,18 +23,21 @@ def send_private_message(xmpp, jid, line): """ Send a private message """ + jid = safeJID(jid) xmpp.send_message(mto=jid, mbody=line, mtype='chat') def send_groupchat_message(xmpp, jid, line): """ Send a message to the groupchat """ + jid = safeJID(jid) xmpp.send_message(mto=jid, mbody=line, mtype='groupchat') def change_show(xmpp, jid, own_nick, show, status): """ Change our 'Show' """ + jid = safeJID(jid) pres = xmpp.make_presence(pto='%s/%s' % (jid, own_nick)) if show: # if show is None, don't put a tag. It means "available" pres['type'] = show @@ -45,6 +49,7 @@ def change_subject(xmpp, jid, subject): """ Change the room subject """ + jid = safeJID(jid) msg = xmpp.make_message(jid) msg['type'] = 'groupchat' msg['subject'] = subject @@ -54,9 +59,10 @@ def change_nick(xmpp, jid, nick, status=None, show=None): """ Change our own nick in a room """ - xmpp.make_presence(pshow=show, pstatus=status, pto='%s/%s' % (jid, nick)).send() + xmpp.make_presence(pshow=show, pstatus=status, pto=safeJID('%s/%s' % (jid, nick))).send() def join_groupchat(xmpp, jid, nick, passwd='', maxhistory=None, status=None, show=None, seconds=0): + jid = safeJID(jid) if not seconds: xmpp.plugin['xep_0045'].joinMUC(jid, nick, maxhistory=maxhistory, password=passwd, pstatus=status, pshow=show) else: @@ -79,6 +85,7 @@ def leave_groupchat(xmpp, jid, own_nick, msg): """ Leave the groupchat """ + jid = safeJID(jid) try: xmpp.plugin['xep_0045'].leaveMUC(jid, own_nick, msg) except KeyError: @@ -89,6 +96,7 @@ def set_user_role(xmpp, jid, nick, reason, role): (try to) Set the role of a MUC user (role = 'none': eject user) """ + jid = safeJID(jid) iq = xmpp.makeIqSet() query = ET.Element('{%s}query' % NS_MUC_ADMIN) item = ET.Element('{%s}item' % NS_MUC_ADMIN, {'nick':nick, 'role':role}) @@ -108,6 +116,8 @@ def set_user_affiliation(xmpp, muc_jid, affiliation, nick=None, jid=None, reason """ (try to) Set the affiliation of a MUC user """ + jid = safeJID(jid) + muc_jid = safeJID(muc_jid) try: return xmpp.plugin['xep_0045'].set_affiliation(muc_jid, jid, nick, affiliation) except: diff --git a/src/tabs.py b/src/tabs.py index ecfa3e40..9291654f 100644 --- a/src/tabs.py +++ b/src/tabs.py @@ -805,8 +805,8 @@ class MucTab(ChatTab): if not arg: return self.core.command_help('version') if arg in [user.nick for user in self.users]: - jid = safeJID(self.name) - jid.resource = arg + jid = safeJID(self.name).bare + jid = safeJID(jid + '/' + arg) else: jid = safeJID(arg) self.core.xmpp.plugin['xep_0092'].get_version(jid, callback=callback) @@ -821,6 +821,8 @@ class MucTab(ChatTab): if not self.joined: return self.core.information('/nick only works in joined rooms', 'Info') current_status = self.core.get_status() + if not safeJID(self.get_name() + '/' + nick): + return self.core.information('Invalid nick', 'Info') muc.change_nick(self.core.xmpp, self.name, nick, current_status.message, current_status.show) def command_part(self, arg): @@ -968,7 +970,6 @@ class MucTab(ChatTab): msg = '' self.command_affiliation('"'+args[0]+ '" outcast'+msg) - def command_role(self, arg): """ /role [reason] @@ -987,6 +988,8 @@ class MucTab(ChatTab): if not self.joined or \ not role in ('none', 'visitor', 'participant', 'moderator'): return + if not safeJID(self.get_name() + '/' + nick): + return self.core('Invalid nick', 'Info') res = muc.set_user_role(self.core.xmpp, self.get_name(), nick, reason, role) if res['type'] == 'error': self.core.room_error(res, self.get_name()) @@ -1010,7 +1013,7 @@ class MucTab(ChatTab): if nick in [user.nick for user in self.users]: res = muc.set_user_affiliation(self.core.xmpp, self.get_name(), affiliation, nick=nick) else: - res = muc.set_user_affiliation(self.core.xmpp, self.get_name(), affiliation, jid=nick) + res = muc.set_user_affiliation(self.core.xmpp, self.get_name(), affiliation, jid=safeJID(nick)) if not res: self.core.information('Could not set affiliation', 'Error') @@ -1676,7 +1679,7 @@ class PrivateTab(ChatTab): self.core.information(version, 'Info') if arg: return self.core.command_version(arg) - jid = self.name + jid = safeJID(self.name) self.core.xmpp.plugin['xep_0092'].get_version(jid, callback=callback) def command_info(self, arg): @@ -2774,8 +2777,7 @@ class ConversationTab(ChatTab): self.core.information(version, 'Info') if arg: return self.core.command_version(arg) - jid = self.name - jid = safeJID(jid) + jid = safeJID(self.name) if not jid.resource: if jid in roster: resource = roster[jid].get_highest_priority_resource()