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()