From 4fb77ac8787422169566d613562127acf75a427b Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Sat, 6 Nov 2010 01:28:59 -0400 Subject: Logging no longer uses root logger. Each module should now log into its own logger. --- sleekxmpp/basexmpp.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'sleekxmpp/basexmpp.py') diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py index 1e8441aa..77191e77 100644 --- a/sleekxmpp/basexmpp.py +++ b/sleekxmpp/basexmpp.py @@ -26,6 +26,9 @@ from sleekxmpp.xmlstream.matcher import * from sleekxmpp.xmlstream.handler import * +log = logging.getLogger(__name__) + + # Flag indicating if DNS SRV records are available for use. SRV_SUPPORT = True try: @@ -192,9 +195,9 @@ class BaseXMPP(XMLStream): xep = "(XEP-%s) " % self.plugin[plugin].xep desc = (xep, self.plugin[plugin].description) - logging.debug("Loaded Plugin %s%s" % desc) + log.debug("Loaded Plugin %s%s" % desc) except: - logging.exception("Unable to load plugin: %s", plugin) + log.exception("Unable to load plugin: %s", plugin) def register_plugins(self): """ @@ -228,7 +231,7 @@ class BaseXMPP(XMLStream): if key in self.plugin: return self.plugin[key] else: - logging.warning("""Plugin "%s" is not loaded.""" % key) + log.warning("""Plugin "%s" is not loaded.""" % key) return False def get(self, key, default): @@ -446,12 +449,12 @@ class BaseXMPP(XMLStream): """ Attribute accessor for bare jid """ - logging.warning("jid property deprecated. Use boundjid.bare") + log.warning("jid property deprecated. Use boundjid.bare") return self.boundjid.bare @jid.setter def jid(self, value): - logging.warning("jid property deprecated. Use boundjid.bare") + log.warning("jid property deprecated. Use boundjid.bare") self.boundjid.bare = value @property @@ -459,12 +462,12 @@ class BaseXMPP(XMLStream): """ Attribute accessor for full jid """ - logging.warning("fulljid property deprecated. Use boundjid.full") + log.warning("fulljid property deprecated. Use boundjid.full") return self.boundjid.full @fulljid.setter def fulljid(self, value): - logging.warning("fulljid property deprecated. Use boundjid.full") + log.warning("fulljid property deprecated. Use boundjid.full") self.boundjid.full = value @property @@ -472,12 +475,12 @@ class BaseXMPP(XMLStream): """ Attribute accessor for jid resource """ - logging.warning("resource property deprecated. Use boundjid.resource") + log.warning("resource property deprecated. Use boundjid.resource") return self.boundjid.resource @resource.setter def resource(self, value): - logging.warning("fulljid property deprecated. Use boundjid.full") + log.warning("fulljid property deprecated. Use boundjid.full") self.boundjid.resource = value @property @@ -485,12 +488,12 @@ class BaseXMPP(XMLStream): """ Attribute accessor for jid usernode """ - logging.warning("username property deprecated. Use boundjid.user") + log.warning("username property deprecated. Use boundjid.user") return self.boundjid.user @username.setter def username(self, value): - logging.warning("username property deprecated. Use boundjid.user") + log.warning("username property deprecated. Use boundjid.user") self.boundjid.user = value @property @@ -498,17 +501,17 @@ class BaseXMPP(XMLStream): """ Attribute accessor for jid host """ - logging.warning("server property deprecated. Use boundjid.host") + log.warning("server property deprecated. Use boundjid.host") return self.boundjid.server @server.setter def server(self, value): - logging.warning("server property deprecated. Use boundjid.host") + log.warning("server property deprecated. Use boundjid.host") self.boundjid.server = value def set_jid(self, jid): """Rip a JID apart and claim it as our own.""" - logging.debug("setting jid to %s" % jid) + log.debug("setting jid to %s" % jid) self.boundjid.full = jid def getjidresource(self, fulljid): @@ -588,7 +591,7 @@ class BaseXMPP(XMLStream): # disconnects. Determine if this was the last connection # for the JID. if show == 'unavailable': - logging.debug("%s %s got offline" % (jid, resource)) + log.debug("%s %s got offline" % (jid, resource)) del connections[resource] if not connections and not self.roster[jid]['in_roster']: @@ -604,7 +607,7 @@ class BaseXMPP(XMLStream): self.event("changed_status", presence) if got_online: self.event("got_online", presence) - logging.debug("STATUS: %s%s/%s[%s]: %s" % (name, jid, resource, + log.debug("STATUS: %s%s/%s[%s]: %s" % (name, jid, resource, show, status)) def _handle_subscribe(self, presence): -- cgit v1.2.3 From 9dbf246f0bfcac2c4ce538431ee629f126c86447 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Mon, 8 Nov 2010 09:14:17 +0800 Subject: Doesn't fail if host has NO SRV record Just catch an other exception type coming from the dns resolver that could be raised with hosts like "anon.example.com" which just don't have any SRV record. --- sleekxmpp/basexmpp.py | 9 --------- 1 file changed, 9 deletions(-) (limited to 'sleekxmpp/basexmpp.py') diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py index 77191e77..cd7d2510 100644 --- a/sleekxmpp/basexmpp.py +++ b/sleekxmpp/basexmpp.py @@ -28,15 +28,6 @@ from sleekxmpp.xmlstream.handler import * log = logging.getLogger(__name__) - -# Flag indicating if DNS SRV records are available for use. -SRV_SUPPORT = True -try: - import dns.resolver -except: - SRV_SUPPORT = False - - # In order to make sure that Unicode is handled properly # in Python 2.x, reset the default encoding. if sys.version_info < (3, 0): -- cgit v1.2.3 From 673545c7e48d86b02f811ad239ed317e4bca0bbc Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Tue, 26 Oct 2010 23:47:17 -0400 Subject: First pass at integrating the new roster manager. --- sleekxmpp/basexmpp.py | 149 +++++++++++++++++++------------------------------- 1 file changed, 55 insertions(+), 94 deletions(-) (limited to 'sleekxmpp/basexmpp.py') diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py index cd7d2510..fb718fba 100644 --- a/sleekxmpp/basexmpp.py +++ b/sleekxmpp/basexmpp.py @@ -15,6 +15,7 @@ import logging import sleekxmpp from sleekxmpp import plugins +from sleekxmpp.roster import MultiRoster from sleekxmpp.stanza import Message, Presence, Iq, Error from sleekxmpp.stanza.roster import Roster from sleekxmpp.stanza.nick import Nick @@ -78,7 +79,7 @@ class BaseXMPP(XMLStream): send_presence_subscribe -- Send a subscription request. """ - def __init__(self, default_ns='jabber:client'): + def __init__(self, jid='', default_ns='jabber:client'): """ Adapt an XML stream for use with XMPP. @@ -107,10 +108,13 @@ class BaseXMPP(XMLStream): self.default_ns = default_ns self.stream_ns = 'http://etherx.jabber.org/streams' - self.boundjid = JID("") + self.boundjid = JID(jid) self.plugin = {} + self.rosters = MultiRoster(self) + self.rosters.add(self.boundjid.bare) self.roster = {} + self.is_component = False self.auto_authorize = True self.auto_subscribe = True @@ -127,10 +131,20 @@ class BaseXMPP(XMLStream): MatchXPath("{%s}presence" % self.default_ns), self._handle_presence)) - self.add_event_handler('presence_subscribe', - self._handle_subscribe) self.add_event_handler('disconnected', self._handle_disconnected) + self.add_event_handler('presence_available', self._handle_available) + self.add_event_handler('presence_dnd', self._handle_available) + self.add_event_handler('presence_xa', self._handle_available) + self.add_event_handler('presence_chat', self._handle_available) + self.add_event_handler('presence_away', self._handle_available) + self.add_event_handler('presence_unavailable', self._handle_unavailable) + self.add_event_handler('presence_subscribe', self._handle_subscribe) + self.add_event_handler('presence_subscribed', self._handle_subscribed) + self.add_event_handler('presence_unsubscribe', self._handle_unsubscribe) + self.add_event_handler('presence_unsubscribed', self._handle_unsubscribed) + self.add_event_handler('presence_probe', self._handle_probe) + self.add_event_handler('roster_subscription_request', self._handle_new_subscription) # Set up the XML stream with XMPP's root stanzas. self.registerStanza(Message) @@ -522,12 +536,49 @@ class BaseXMPP(XMLStream): """Process incoming message stanzas.""" self.event('message', msg) + def _handle_available(self, presence): + self.rosters[presence['to'].bare][presence['from'].bare].handle_available(presence) + + def _handle_unavailable(self, presence): + self.rosters[presence['to'].bare][presence['from'].bare].handle_unavailable(presence) + + def _handle_new_subscription(self, stanza): + roster = self.rosters[stanza['to'].bare] + item = self.rosters[stanza['to'].bare][stanza['from'].bare] + if item['whitelisted']: + item.authorize() + elif roster.auto_authorize: + item.authorize() + if roster.auto_subscribe: + item.subscribe() + elif roster.auto_authorize == False: + item.unauthorize() + + def _handle_removed_subscription(self, presence): + self.rosters[presence['to'].bare][presence['from'].bare].unauthorize() + + def _handle_subscribe(self, stanza): + self.rosters[stanza['to'].bare][stanza['from'].bare].handle_subscribe(stanza) + + def _handle_subscribed(self, stanza): + self.rosters[stanza['to'].bare][stanza['from'].bare].handle_subscribed(stanza) + + def _handle_unsubscribe(self, stanza): + self.rosters[stanza['to'].bare][stanza['from'].bare].handle_unsubscribe(stanza) + + def _handle_unsubscribed(self, stanza): + self.rosters[stanza['to'].bare][stanza['from'].bare].handle_unsubscribed(stanza) + + def _handle_probe(self, stanza): + self.rosteritems[stanza['to'].bare][stanza['from'].bare].handle_probe(stanza) + def _handle_presence(self, presence): """ Process incoming presence stanzas. Update the roster with presence information. """ + logging.debug(presence['type']) self.event("presence_%s" % presence['type'], presence) # Check for changes in subscription state. @@ -538,97 +589,7 @@ class BaseXMPP(XMLStream): elif not presence['type'] in ('available', 'unavailable') and \ not presence['type'] in presence.showtypes: return - - # Strip the information from the stanza. - jid = presence['from'].bare - resource = presence['from'].resource - show = presence['type'] - status = presence['status'] - priority = presence['priority'] - - was_offline = False - got_online = False - old_roster = self.roster.get(jid, {}).get(resource, {}) - - # Create a new roster entry if needed. - if not jid in self.roster: - self.roster[jid] = {'groups': [], - 'name': '', - 'subscription': 'none', - 'presence': {}, - 'in_roster': False} - - # Alias to simplify some references. - connections = self.roster[jid]['presence'] - - # Determine if the user has just come online. - if not resource in connections: - if show == 'available' or show in presence.showtypes: - got_online = True - was_offline = True - connections[resource] = {} - - if connections[resource].get('show', 'unavailable') == 'unavailable': - was_offline = True - - # Update the roster's state for this JID's resource. - connections[resource] = {'show': show, - 'status': status, - 'priority': priority} - - name = self.roster[jid].get('name', '') - - # Remove unneeded state information after a resource - # disconnects. Determine if this was the last connection - # for the JID. - if show == 'unavailable': - log.debug("%s %s got offline" % (jid, resource)) - del connections[resource] - - if not connections and not self.roster[jid]['in_roster']: - del self.roster[jid] - if not was_offline: - self.event("got_offline", presence) - else: - return False - - name = '(%s) ' % name if name else '' - - # Presence state has changed. self.event("changed_status", presence) - if got_online: - self.event("got_online", presence) - log.debug("STATUS: %s%s/%s[%s]: %s" % (name, jid, resource, - show, status)) - - def _handle_subscribe(self, presence): - """ - Automatically managage subscription requests. - - Subscription behavior is controlled by the settings - self.auto_authorize and self.auto_subscribe. - - auto_auth auto_sub Result: - True True Create bi-directional subsriptions. - True False Create only directed subscriptions. - False * Decline all subscriptions. - None * Disable automatic handling and use - a custom handler. - """ - presence.reply() - presence['to'] = presence['to'].bare - - # We are using trinary logic, so conditions have to be - # more explicit than usual. - if self.auto_authorize == True: - presence['type'] = 'subscribed' - presence.send() - if self.auto_subscribe: - presence['type'] = 'subscribe' - presence.send() - elif self.auto_authorize == False: - presence['type'] = 'unsubscribed' - presence.send() # Restore the old, lowercased name for backwards compatibility. basexmpp = BaseXMPP -- cgit v1.2.3 From 69d430dd75f526984fd6ea6f9db294731698712c Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Wed, 27 Oct 2010 08:09:50 -0400 Subject: Cleaned up names. --- sleekxmpp/basexmpp.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'sleekxmpp/basexmpp.py') diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py index fb718fba..46c8985a 100644 --- a/sleekxmpp/basexmpp.py +++ b/sleekxmpp/basexmpp.py @@ -15,7 +15,7 @@ import logging import sleekxmpp from sleekxmpp import plugins -from sleekxmpp.roster import MultiRoster +import sleekxmpp.roster as roster from sleekxmpp.stanza import Message, Presence, Iq, Error from sleekxmpp.stanza.roster import Roster from sleekxmpp.stanza.nick import Nick @@ -111,9 +111,8 @@ class BaseXMPP(XMLStream): self.boundjid = JID(jid) self.plugin = {} - self.rosters = MultiRoster(self) - self.rosters.add(self.boundjid.bare) - self.roster = {} + self.roster = roster.Roster(self) + self.roster.add(self.boundjid.bare) self.is_component = False self.auto_authorize = True @@ -537,14 +536,14 @@ class BaseXMPP(XMLStream): self.event('message', msg) def _handle_available(self, presence): - self.rosters[presence['to'].bare][presence['from'].bare].handle_available(presence) + self.roster[presence['to'].bare][presence['from'].bare].handle_available(presence) def _handle_unavailable(self, presence): - self.rosters[presence['to'].bare][presence['from'].bare].handle_unavailable(presence) + self.roster[presence['to'].bare][presence['from'].bare].handle_unavailable(presence) def _handle_new_subscription(self, stanza): - roster = self.rosters[stanza['to'].bare] - item = self.rosters[stanza['to'].bare][stanza['from'].bare] + roster = self.roster[stanza['to'].bare] + item = self.roster[stanza['to'].bare][stanza['from'].bare] if item['whitelisted']: item.authorize() elif roster.auto_authorize: @@ -555,22 +554,22 @@ class BaseXMPP(XMLStream): item.unauthorize() def _handle_removed_subscription(self, presence): - self.rosters[presence['to'].bare][presence['from'].bare].unauthorize() + self.roster[presence['to'].bare][presence['from'].bare].unauthorize() def _handle_subscribe(self, stanza): - self.rosters[stanza['to'].bare][stanza['from'].bare].handle_subscribe(stanza) + self.roster[stanza['to'].bare][stanza['from'].bare].handle_subscribe(stanza) def _handle_subscribed(self, stanza): - self.rosters[stanza['to'].bare][stanza['from'].bare].handle_subscribed(stanza) + self.roster[stanza['to'].bare][stanza['from'].bare].handle_subscribed(stanza) def _handle_unsubscribe(self, stanza): - self.rosters[stanza['to'].bare][stanza['from'].bare].handle_unsubscribe(stanza) + self.roster[stanza['to'].bare][stanza['from'].bare].handle_unsubscribe(stanza) def _handle_unsubscribed(self, stanza): - self.rosters[stanza['to'].bare][stanza['from'].bare].handle_unsubscribed(stanza) + self.roster[stanza['to'].bare][stanza['from'].bare].handle_unsubscribed(stanza) def _handle_probe(self, stanza): - self.rosteritems[stanza['to'].bare][stanza['from'].bare].handle_probe(stanza) + self.roster[stanza['to'].bare][stanza['from'].bare].handle_probe(stanza) def _handle_presence(self, presence): """ -- cgit v1.2.3