summaryrefslogtreecommitdiff
path: root/sleekxmpp
diff options
context:
space:
mode:
Diffstat (limited to 'sleekxmpp')
-rw-r--r--sleekxmpp/plugins/xep_0004/stanza/field.py4
-rw-r--r--sleekxmpp/plugins/xep_0012.py5
-rw-r--r--sleekxmpp/plugins/xep_0045.py42
-rw-r--r--sleekxmpp/plugins/xep_0078/legacyauth.py39
-rw-r--r--sleekxmpp/plugins/xep_0199/ping.py24
-rw-r--r--sleekxmpp/roster/single.py20
6 files changed, 92 insertions, 42 deletions
diff --git a/sleekxmpp/plugins/xep_0004/stanza/field.py b/sleekxmpp/plugins/xep_0004/stanza/field.py
index 43293bfd..8131233c 100644
--- a/sleekxmpp/plugins/xep_0004/stanza/field.py
+++ b/sleekxmpp/plugins/xep_0004/stanza/field.py
@@ -85,7 +85,7 @@ class FormField(ElementBase):
return None
elif self._type == 'boolean':
return valsXML[0].text in self.true_values
- elif self._type in self.multi_value_types:
+ elif self._type in self.multi_value_types or len(valsXML) > 1:
values = []
for valXML in valsXML:
if valXML.text is None:
@@ -95,6 +95,8 @@ class FormField(ElementBase):
values = "\n".join(values)
return values
else:
+ if valsXML[0].text is None:
+ return ''
return valsXML[0].text
def set_answer(self, answer):
diff --git a/sleekxmpp/plugins/xep_0012.py b/sleekxmpp/plugins/xep_0012.py
index d636d4d7..8fe818b8 100644
--- a/sleekxmpp/plugins/xep_0012.py
+++ b/sleekxmpp/plugins/xep_0012.py
@@ -112,7 +112,4 @@ class xep_0012(base.base_plugin):
iq.attrib['from'] = self.xmpp.boundjid.full
id = iq.get('id')
result = iq.send()
- if result and result is not None and result.get('type', 'error') != 'error':
- return result['last_activity']['seconds']
- else:
- return False
+ return result['last_activity']['seconds']
diff --git a/sleekxmpp/plugins/xep_0045.py b/sleekxmpp/plugins/xep_0045.py
index 364fbbd9..338ed154 100644
--- a/sleekxmpp/plugins/xep_0045.py
+++ b/sleekxmpp/plugins/xep_0045.py
@@ -188,8 +188,12 @@ class xep_0045(base.base_plugin):
iq['from'] = ifrom
query = ET.Element('{http://jabber.org/protocol/muc#owner}query')
iq.append(query)
- result = iq.send()
- if result['type'] == 'error':
+ # For now, swallow errors to preserve existing API
+ try:
+ result = iq.send()
+ except IqError:
+ return False
+ except IqTimeout:
return False
xform = result.xml.find('{http://jabber.org/protocol/muc#owner}query/{jabber:x:data}x')
if xform is None: return False
@@ -209,8 +213,12 @@ class xep_0045(base.base_plugin):
form = form.getXML('submit')
query.append(form)
iq.append(query)
- result = iq.send()
- if result['type'] == 'error':
+ # For now, swallow errors to preserve existing API
+ try:
+ result = iq.send()
+ except IqError:
+ return False
+ except IqTimeout:
return False
return True
@@ -254,8 +262,12 @@ class xep_0045(base.base_plugin):
destroy.append(xreason)
query.append(destroy)
iq.append(query)
- r = iq.send()
- if r is False or r['type'] == 'error':
+ # For now, swallow errors to preserve existing API
+ try:
+ r = iq.send()
+ except IqError:
+ return False
+ except IqTimeout:
return False
return True
@@ -271,9 +283,13 @@ class xep_0045(base.base_plugin):
query.append(item)
iq = self.xmpp.makeIqSet(query)
iq['to'] = room
- result = iq.send()
- if result is False or result['type'] != 'result':
- raise ValueError
+ # For now, swallow errors to preserve existing API
+ try:
+ result = iq.send()
+ except IqError:
+ return False
+ except IqTimeout:
+ return False
return True
def invite(self, room, jid, reason='', mfrom=''):
@@ -303,8 +319,12 @@ class xep_0045(base.base_plugin):
iq = self.xmpp.makeIqGet('http://jabber.org/protocol/muc#owner')
iq['to'] = room
iq['from'] = ifrom
- result = iq.send()
- if result is None or result['type'] != 'result':
+ # For now, swallow errors to preserve existing API
+ try:
+ result = iq.send()
+ except IqError:
+ raise ValueError
+ except IqTimeout:
raise ValueError
form = result.xml.find('{http://jabber.org/protocol/muc#owner}query/{jabber:x:data}x')
if form is None:
diff --git a/sleekxmpp/plugins/xep_0078/legacyauth.py b/sleekxmpp/plugins/xep_0078/legacyauth.py
index bdd2df67..edb8f314 100644
--- a/sleekxmpp/plugins/xep_0078/legacyauth.py
+++ b/sleekxmpp/plugins/xep_0078/legacyauth.py
@@ -56,11 +56,17 @@ class xep_0078(base_plugin):
iq['type'] = 'get'
iq['to'] = self.xmpp.boundjid.host
iq['auth']['username'] = self.xmpp.boundjid.user
- resp = iq.send(now=True)
- if resp is None or resp['type'] != 'result':
+ try:
+ resp = iq.send(now=True)
+ except IqError:
log.info("Authentication failed: %s" % resp['error']['condition'])
- self.xmpp.event('failed_auth', resp, direct=True)
+ self.xmpp.event('failed_auth', direct=True)
+ self.xmpp.disconnect()
+ return True
+ except IqTimeout:
+ log.info("Authentication failed: %s" % 'timeout')
+ self.xmpp.event('failed_auth', direct=True)
self.xmpp.disconnect()
return True
@@ -91,18 +97,23 @@ class xep_0078(base_plugin):
iq['auth']['password'] = self.xmpp.password
# Step 3: Send credentials
- result = iq.send(now=True)
- if result is not None and result.attrib['type'] == 'result':
- self.xmpp.features.add('auth')
-
- self.xmpp.authenticated = True
- log.debug("Established Session")
- self.xmpp.sessionstarted = True
- self.xmpp.session_started_event.set()
- self.xmpp.event('session_start')
- else:
+ try:
+ result = iq.send(now=True)
+ except IqError as err:
log.info("Authentication failed")
self.xmpp.disconnect()
- self.xmpp.event("failed_auth")
+ self.xmpp.event("failed_auth", direct=True)
+ except IqTimeout:
+ log.info("Authentication failed")
+ self.xmpp.disconnect()
+ self.xmpp.event("failed_auth", direct=True)
+
+ self.xmpp.features.add('auth')
+
+ self.xmpp.authenticated = True
+ log.debug("Established Session")
+ self.xmpp.sessionstarted = True
+ self.xmpp.session_started_event.set()
+ self.xmpp.event('session_start')
return True
diff --git a/sleekxmpp/plugins/xep_0199/ping.py b/sleekxmpp/plugins/xep_0199/ping.py
index 0fa22f8a..b0304b09 100644
--- a/sleekxmpp/plugins/xep_0199/ping.py
+++ b/sleekxmpp/plugins/xep_0199/ping.py
@@ -11,6 +11,7 @@ import logging
import sleekxmpp
from sleekxmpp import Iq
+from sleekxmpp.exceptions import IqError, IqTimeout
from sleekxmpp.xmlstream import register_stanza_plugin
from sleekxmpp.xmlstream.matcher import StanzaPath
from sleekxmpp.xmlstream.handler import Callback
@@ -89,8 +90,13 @@ class xep_0199(base_plugin):
def scheduled_ping():
"""Send ping request to the server."""
log.debug("Pinging...")
- resp = self.send_ping(self.xmpp.boundjid.host, self.timeout)
- if resp is None or resp is False:
+ try:
+ self.send_ping(self.xmpp.boundjid.host, self.timeout)
+ except IqError:
+ log.debug("Ping response was an error." + \
+ "Requesting Reconnect.")
+ self.xmpp.reconnect()
+ except IqTimeout:
log.debug("Did not recieve ping back in time." + \
"Requesting Reconnect.")
self.xmpp.reconnect()
@@ -142,9 +148,14 @@ class xep_0199(base_plugin):
iq.enable('ping')
start_time = time.clock()
- resp = iq.send(block=block,
- timeout=timeout,
- callback=callback)
+
+ try:
+ resp = iq.send(block=block,
+ timeout=timeout,
+ callback=callback)
+ except IqError as err:
+ resp = err.iq
+
end_time = time.clock()
delay = end_time - start_time
@@ -152,9 +163,6 @@ class xep_0199(base_plugin):
if not block:
return None
- if not resp or resp['type'] == 'error':
- return False
-
log.debug("Pong: %s %f" % (jid, delay))
return delay
diff --git a/sleekxmpp/roster/single.py b/sleekxmpp/roster/single.py
index deb1ac8b..c2a73d34 100644
--- a/sleekxmpp/roster/single.py
+++ b/sleekxmpp/roster/single.py
@@ -75,6 +75,10 @@ class RosterNode(object):
self.add(key, save=True)
return self._jids[key]
+ def __len__(self):
+ """Return the number of JIDs referenced by the roster."""
+ return len(self._jids)
+
def keys(self):
"""Return a list of all subscribed JIDs."""
return self._jids.keys()
@@ -83,6 +87,16 @@ class RosterNode(object):
"""Returns whether the roster has a JID."""
return jid in self._jids
+ def groups(self):
+ """Return a dictionary mapping group names to JIDs."""
+ result = {}
+ for jid in self._jids:
+ for group in self._jids[jid]['groups']:
+ if group not in result:
+ result[group] = []
+ result[group].append(jid)
+ return result
+
def __iter__(self):
"""Iterate over the roster items."""
return self._jids.__iter__()
@@ -204,10 +218,8 @@ class RosterNode(object):
iq['roster']['items'] = {jid: {'name': name,
'subscription': subscription,
'groups': groups}}
- response = iq.send(block, timeout, callback)
- if response in [False, None] or isinstance(response, Iq):
- return response
- return response and response['type'] == 'result'
+
+ return iq.send(block, timeout, callback)
def presence(self, jid, resource=None):
"""