Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2008-04-08 03:02:35 (GMT)
committer Jonas Smedegaard <dr@jones.dk>2008-04-08 03:02:35 (GMT)
commitd02551fe2b144cd6babfd562e45290beca9b2183 (patch)
treeca59482c9d69467e6d813d0c575e76369dce301a
parent95253f88614ec74a3b3af3feede9f86a7f64c920 (diff)
Imported Upstream version 0.79.2upstream/0.79.2
-rwxr-xr-xconfigure20
-rw-r--r--configure.ac2
-rw-r--r--src/activity.py39
-rw-r--r--src/buddy.py21
-rw-r--r--src/linklocal_plugin.py32
-rw-r--r--src/presenceservice.py19
-rw-r--r--src/pstest.py4
-rw-r--r--src/psutils.py28
-rw-r--r--src/server_plugin.py56
-rw-r--r--src/telepathy_plugin.py15
10 files changed, 139 insertions, 97 deletions
diff --git a/configure b/configure
index cdf9d41..9fe9231 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for Sugar Presence Service 0.79.0.
+# Generated by GNU Autoconf 2.61 for Sugar Presence Service 0.79.2.
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -572,8 +572,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='Sugar Presence Service'
PACKAGE_TARNAME='sugar-presence-service'
-PACKAGE_VERSION='0.79.0'
-PACKAGE_STRING='Sugar Presence Service 0.79.0'
+PACKAGE_VERSION='0.79.2'
+PACKAGE_STRING='Sugar Presence Service 0.79.2'
PACKAGE_BUGREPORT=''
ac_unique_file="src/sugar-presence-service.in"
@@ -1152,7 +1152,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures Sugar Presence Service 0.79.0 to adapt to many kinds of systems.
+\`configure' configures Sugar Presence Service 0.79.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1218,7 +1218,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of Sugar Presence Service 0.79.0:";;
+ short | recursive ) echo "Configuration of Sugar Presence Service 0.79.2:";;
esac
cat <<\_ACEOF
@@ -1282,7 +1282,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-Sugar Presence Service configure 0.79.0
+Sugar Presence Service configure 0.79.2
generated by GNU Autoconf 2.61
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1296,7 +1296,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by Sugar Presence Service $as_me 0.79.0, which was
+It was created by Sugar Presence Service $as_me 0.79.2, which was
generated by GNU Autoconf 2.61. Invocation command line was
$ $0 $@
@@ -1972,7 +1972,7 @@ fi
# Define the identity of the package.
PACKAGE='sugar-presence-service'
- VERSION='0.79.0'
+ VERSION='0.79.2'
cat >>confdefs.h <<_ACEOF
@@ -2686,7 +2686,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by Sugar Presence Service $as_me 0.79.0, which was
+This file was extended by Sugar Presence Service $as_me 0.79.2, which was
generated by GNU Autoconf 2.61. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -2729,7 +2729,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-Sugar Presence Service config.status 0.79.0
+Sugar Presence Service config.status 0.79.2
configured by $0, generated by GNU Autoconf 2.61,
with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/configure.ac b/configure.ac
index 82bc99b..554fbff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([Sugar Presence Service],[0.79.0],[],[sugar-presence-service])
+AC_INIT([Sugar Presence Service],[0.79.2],[],[sugar-presence-service])
AC_PREREQ([2.59])
diff --git a/src/activity.py b/src/activity.py
index 1401699..ec20536 100644
--- a/src/activity.py
+++ b/src/activity.py
@@ -793,14 +793,15 @@ class Activity(ExportedGObject):
self._join_cb()
_logger.debug("%s of activity %r succeeded", verb, self)
except Exception, e:
- self._join_failed_cb(e)
+ self._join_failed_cb(e, 'Activity._joined_cb')
self._join_cb = None
self._join_err_cb = None
- def _join_failed_cb(self, e):
+ def _join_failed_cb(self, e, location='unknown'):
verb = self._join_is_sharing and 'Share' or 'Join'
- _logger.debug("%s of activity %r failed: %s", verb, self, e)
+ _logger.debug("%s of activity %r failed: %s in %s",
+ verb, self, e, location)
throw_into_callback(self._join_err_cb, e)
self._join_cb = None
@@ -830,7 +831,8 @@ class Activity(ExportedGObject):
if props_to_set:
self._text_channel[PROPERTIES_INTERFACE].SetProperties(
props_to_set, reply_handler=self._joined_cb,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: self._join_failed_cb(e,
+ 'Activity._join_activity_channel_props_listed_cb'))
else:
self._joined_cb()
@@ -869,13 +871,15 @@ class Activity(ExportedGObject):
_logger.debug('%r: I am local pending - entering room', self)
group.AddMembers([self_ident[0]], '',
reply_handler=lambda: None,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: self._join_failed_cb(e,
+ 'got_all_members AddMembers'))
elif self._self_handle in local_pending:
_logger.debug('%r: I am local pending with channel-specific '
'handle - entering room', self)
group.AddMembers([self._self_handle], '',
reply_handler=lambda: None,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: self._join_failed_cb(e,
+ 'got_all_members AddMembers cs handle'))
elif self._self_handle in members:
_logger.debug('%r: I am already in the room', self)
assert self._joined # set by _text_channel_members_changed_cb
@@ -890,7 +894,8 @@ class Activity(ExportedGObject):
# bootstrap by getting the current state. This is where we find
# out whether anyone was lying to us in their PEP info
group.GetAllMembers(reply_handler=got_all_members,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: \
+ self._join_failed_cb(e, 'got_group_flags'))
def got_self_handle(self_handle):
self._self_handle = self_handle
@@ -900,10 +905,14 @@ class Activity(ExportedGObject):
self._text_channel_matches.append(m)
group.GetGroupFlags(reply_handler=got_group_flags,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: \
+ self._join_failed_cb(e,
+ 'got_self_handle GetGroupFlags'))
group.GetSelfHandle(reply_handler=got_self_handle,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: \
+ self._join_failed_cb(e,
+ 'GetSelfHandle'))
def _join_activity_create_channel_cb(self, text_chan_path):
@@ -913,7 +922,8 @@ class Activity(ExportedGObject):
reply_handler=lambda tubes_chan_path: \
self._join_activity_create_tubes_cb(
text_chan_path, tubes_chan_path),
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: self._join_failed_cb(e,
+ 'Activity._join_activity_create_channel_cb'))
def _join_activity_got_handles_cb(self, handles):
assert len(handles) == 1
@@ -924,7 +934,8 @@ class Activity(ExportedGObject):
conn[CONN_INTERFACE].RequestChannel(CHANNEL_TYPE_TEXT,
HANDLE_TYPE_ROOM, self._room, True,
reply_handler=self._join_activity_create_channel_cb,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: self._join_failed_cb(e,
+ 'Activity._join_activity_got_handles_cb'))
def join(self, async_cb, async_err_cb, sharing, private=None,
sender=None):
@@ -978,7 +989,8 @@ class Activity(ExportedGObject):
conn[CONN_INTERFACE].RequestHandles(HANDLE_TYPE_ROOM,
[self._tp.suggest_room_for_activity(self._id)],
reply_handler=self._join_activity_got_handles_cb,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: self._join_failed_cb(e,
+ 'Activity.join RequestHandles'))
else:
_logger.warning("Raising RuntimeError: Don't know room for %r",
self)
@@ -1132,7 +1144,8 @@ class Activity(ExportedGObject):
else:
self._text_channel[PROPERTIES_INTERFACE].ListProperties(
reply_handler=self._join_activity_channel_props_listed_cb,
- error_handler=self._join_failed_cb)
+ error_handler=lambda e: self._join_failed_cb(e,
+ 'Activity._text_channel_members_changed_cb'))
def _text_channel_closed_cb(self):
"""Callback method called when the text channel is closed.
diff --git a/src/buddy.py b/src/buddy.py
index 5be2725..84da0a7 100644
--- a/src/buddy.py
+++ b/src/buddy.py
@@ -660,7 +660,6 @@ class GenericOwner(Buddy):
self._ps = ps
self._server = kwargs.pop("server", None)
self._key_hash = kwargs.pop("key_hash", None)
- self._registered = kwargs.pop("registered", False)
#: Telepathy plugin -> dict { activity ID -> room handle }
self._activities_by_connection = {}
@@ -907,15 +906,11 @@ class GenericOwner(Buddy):
if tp.status == CONNECTION_STATUS_CONNECTED:
self._set_self_olpc_properties(tp)
- def _ip4_address_changed_cb(self, monitor, address):
+ def _ip4_address_changed_cb(self, monitor, address, iface):
"""Handle IPv4 address change, set property to generate event"""
props = {_PROP_IP4_ADDRESS: address}
self.set_properties(props)
- def get_registered(self):
- """Retrieve whether owner has registered with presence server"""
- return self._registered
-
def get_server(self):
"""Retrieve XMPP server hostname (used by the server plugin)"""
return self._server
@@ -926,10 +921,6 @@ class GenericOwner(Buddy):
"""
return self._key_hash
- def set_registered(self, registered):
- """Customisation point: handle the registration of the owner"""
- raise RuntimeError("Subclasses must implement")
-
def update_avatar(self, tp, new_avatar_token, icon=None, mime_type=None):
# This should never get called because Owner avatar changes are
# driven by the Sugar shell, but just in case:
@@ -963,7 +954,6 @@ class ShellOwner(GenericOwner):
profile = get_profile()
server = profile.jabber_server
- registered = profile.jabber_registered
key_hash = profile.privkey_hash
key = profile.pubkey
nick = profile.nick_name
@@ -977,7 +967,7 @@ class ShellOwner(GenericOwner):
GenericOwner.__init__(self, ps, bus,
'keyid/' + psutils.pubkey_to_keyid(key),
key=key, nick=nick, color=color, icon=icon, server=server,
- key_hash=key_hash, registered=registered)
+ key_hash=key_hash)
# Ask to get notifications on Owner object property changes in the
# shell. If it's not currently running, no problem - we'll get the
@@ -994,13 +984,6 @@ class ShellOwner(GenericOwner):
# we already know our own nick, color, key
self._awaiting = None
- def set_registered(self, value):
- """Handle notification that we have been registered"""
- if value:
- profile = get_profile()
- profile.jabber_registered = True
- profile.save()
-
def _icon_changed_cb(self, icon):
"""Handle icon change, set property to generate event"""
icon = str(icon)
diff --git a/src/linklocal_plugin.py b/src/linklocal_plugin.py
index 5646018..0fd914c 100644
--- a/src/linklocal_plugin.py
+++ b/src/linklocal_plugin.py
@@ -62,6 +62,10 @@ class LinkLocalPlugin(TelepathyPlugin):
self._watch = self._sys_bus.watch_name_owner('org.freedesktop.Avahi',
self._avahi_owner_cb)
+ # Glib source ID indicating we have to wait before be allowed to try
+ # to connect
+ self._have_to_wait_id = 0
+
def _avahi_owner_cb(self, unique_name):
had_avahi = self._have_avahi
@@ -74,7 +78,7 @@ class LinkLocalPlugin(TelepathyPlugin):
else:
_logger.info('Avahi appeared on the system bus (%s) - '
'starting...', unique_name)
- self.start()
+ self.emit('want-to-connect')
else:
self._have_avahi = False
if had_avahi:
@@ -89,7 +93,8 @@ class LinkLocalPlugin(TelepathyPlugin):
self._watch = None
def _could_connect(self):
- return TelepathyPlugin._could_connect(self) and self._have_avahi
+ return TelepathyPlugin._could_connect(self) and self._have_avahi and \
+ self._have_to_wait_id == 0
def _get_account_info(self):
"""Retrieve connection manager parameters for this account
@@ -194,3 +199,26 @@ class LinkLocalPlugin(TelepathyPlugin):
ret[handle] = 'salut/' + psutils.escape_identifier(ident)
return ret
+
+
+ def _have_to_wait_cb(self):
+ if self._have_to_wait_id > 0:
+ gobject.source_remove(self._have_to_wait_id)
+ self._have_to_wait_id = 0
+
+ _logger.debug("Timeout elapsed. Salut can connect now")
+ self.emit('want-to-connect')
+
+ def _ip4_address_changed_cb(self, ip4am, address, iface):
+ TelepathyPlugin._ip4_address_changed_cb(self, ip4am, address, iface)
+
+ # FIXME: what about IPv6 ?
+ if iface == "msh0" and not address.startswith("169.254."):
+ # msh0 got a not link-local IP so we are connected to a school
+ # server. Let's disable Salut. See #6299 for details.
+ _logger.debug("Connected to a school server. Disable Salut")
+ self._stop()
+
+ # Salut can't connect during the next 2 minutes
+ self._have_to_wait_id = gobject.timeout_add(120000,
+ self._have_to_wait_cb)
diff --git a/src/presenceservice.py b/src/presenceservice.py
index fa38efd..0c51f61 100644
--- a/src/presenceservice.py
+++ b/src/presenceservice.py
@@ -125,6 +125,7 @@ class PresenceService(ExportedGObject):
self._activity_invitation)
tp.connect('private-invitation',
self._private_invitation)
+ tp.connect('want-to-connect', self._want_to_connect)
tp.start()
self._contacts_online_queue = []
@@ -148,9 +149,12 @@ class PresenceService(ExportedGObject):
def _tp_status_cb(self, plugin, status, reason):
if status == CONNECTION_STATUS_CONNECTED:
self._tp_connected(plugin)
- if plugin == self._server_plugin and self._ll_plugin:
+ if (plugin == self._server_plugin and self._ll_plugin) or \
+ (plugin == self._ll_plugin and self._server_plugin and \
+ self._server_plugin.status == CONNECTION_STATUS_CONNECTED):
# For now, Gabble takes precedence over Salut to alleviate
# corner cases where laptops on mesh can't talk to ones on APs
+ _logger.debug("Gabble takes precedence, disconnect Salut")
self._ll_plugin.cleanup()
else:
self._tp_disconnected(plugin)
@@ -569,6 +573,19 @@ class PresenceService(ExportedGObject):
self.PrivateInvitation(str(conn.service_name), conn.object_path,
chan_path)
+ def _want_to_connect(self, plugin):
+ if plugin == self._ll_plugin:
+ # Link-local plugin can connect only if the Server plugin isn't
+ # connected
+ if not self._server_plugin or \
+ self._server_plugin.status != CONNECTION_STATUS_CONNECTED:
+ plugin.start()
+
+ elif plugin == self._server_plugin:
+ # Server plugin can always try to connect
+ plugin.start()
+
+
@dbus.service.signal(PRESENCE_INTERFACE, signature="o")
def ActivityAppeared(self, activity):
pass
diff --git a/src/pstest.py b/src/pstest.py
index b3c8183..e7a0fa4 100644
--- a/src/pstest.py
+++ b/src/pstest.py
@@ -110,10 +110,6 @@ class TestOwner(GenericOwner):
if self._change_timeout == 0:
self._change_timeout = gobject.timeout_add(10000, self._update_something)
- def set_registered(self, value):
- if value:
- self._registered = True
-
def _load_config(self):
if not os.path.exists(self._cfg_file):
return (None, None, False)
diff --git a/src/psutils.py b/src/psutils.py
index 6b8ec95..f7c6db7 100644
--- a/src/psutils.py
+++ b/src/psutils.py
@@ -129,7 +129,7 @@ class IP4AddressMonitor(gobject.GObject):
__gsignals__ = {
'address-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
+ ([gobject.TYPE_PYOBJECT, gobject.TYPE_STRING]))
}
__gproperties__ = {
@@ -155,22 +155,22 @@ class IP4AddressMonitor(gobject.GObject):
sys_bus = dbus.SystemBus()
self._watch = sys_bus.watch_name_owner(NM_SERVICE, self._nm_owner_cb)
if not sys_bus.name_has_owner(NM_SERVICE):
- addr = self._get_address_fallback()
- self._update_address(addr)
+ addr, iface = self._get_address_fallback()
+ self._update_address(addr, iface)
def do_get_property(self, pspec):
if pspec.name == "address":
return self._addr
- def _update_address(self, new_addr):
+ def _update_address(self, new_addr, iface):
if new_addr == "0.0.0.0":
new_addr = None
if new_addr == self._addr:
return
self._addr = new_addr
- _logger.debug("IP4 address now '%s'" % new_addr)
- self.emit('address-changed', new_addr)
+ _logger.debug("IP4 address now '%s' (%s)" % (new_addr, iface))
+ self.emit('address-changed', new_addr, iface)
def _connect_to_nm(self):
"""Connect to NM device state signals to tell when the IPv4 address changes"""
@@ -215,7 +215,7 @@ class IP4AddressMonitor(gobject.GObject):
if act_stage != 8 and act_stage != 7:
# not activated
return
- self._update_address(props[6])
+ self._update_address(props[6], props[1])
def _device_properties_error_cb(self, err):
_logger.debug("Error querying device properties: %s" % err)
@@ -244,11 +244,11 @@ class IP4AddressMonitor(gobject.GObject):
self._query_device_properties(device)
def _nm_device_no_longer_active_cb(self, device):
- self._update_address(None)
+ self._update_address(None, None)
def _nm_state_change_cb(self, new_state):
if new_state == 4: # NM_STATE_DISCONNECTED
- self._update_address(None)
+ self._update_address(None, None)
def _nm_owner_cb(self, unique_name):
"""Clear state when NM goes away"""
@@ -259,10 +259,10 @@ class IP4AddressMonitor(gobject.GObject):
match.remove()
self._matches = []
if self._nm_has_been_present:
- self._update_address(None)
+ self._update_address(None, None)
else:
- addr = self._get_address_fallback()
- self._update_address(addr)
+ addr, iface = self._get_address_fallback()
+ self._update_address(addr, iface)
elif not self._nm_present:
# NM started up
self._nm_present = True
@@ -278,7 +278,7 @@ class IP4AddressMonitor(gobject.GObject):
SIOCGIFADDR = 0x8915
addr = fcntl.ioctl(fd, SIOCGIFADDR, struct.pack('256s', iface[:15]))[20:24]
s.close()
- return socket.inet_ntoa(addr)
+ return socket.inet_ntoa(addr), iface
def _get_address_fallback(self):
import commands
@@ -290,4 +290,4 @@ class IP4AddressMonitor(gobject.GObject):
if fields[0] == "0.0.0.0":
iface = fields[len(fields) - 1]
return self._get_iface_address(iface)
- return None
+ return None, None
diff --git a/src/server_plugin.py b/src/server_plugin.py
index 9ebc8d9..c81a936 100644
--- a/src/server_plugin.py
+++ b/src/server_plugin.py
@@ -32,7 +32,7 @@ from telepathy.interfaces import (CONN_MGR_INTERFACE, CONN_INTERFACE,
from telepathy.constants import (HANDLE_TYPE_CONTACT, HANDLE_TYPE_GROUP,
CONNECTION_STATUS_CONNECTED, CONNECTION_STATUS_DISCONNECTED,
CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES,
- CONNECTION_STATUS_REASON_NAME_IN_USE)
+ CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED)
import sugar.profile
# Presence Service local modules
@@ -62,21 +62,24 @@ class ServerPlugin(TelepathyPlugin):
self._friends_channel = None
- def _ip4_address_changed_cb(self, ip4am, address):
- TelepathyPlugin._ip4_address_changed_cb(self, ip4am, address)
+ def _ip4_address_changed_cb(self, ip4am, address, iface):
+ TelepathyPlugin._ip4_address_changed_cb(self, ip4am, address, iface)
if address:
_logger.debug("::: valid IP4 address, conn_status %s" %
self._conn_status)
# this is a no-op if starting would be inappropriate right now
if self._conn_status != CONNECTION_STATUS_CONNECTED:
- self.start()
+ self.emit('want-to-connect')
else:
_logger.debug("::: invalid IP4 address, will disconnect")
self._stop()
def _get_account_info(self):
- """Retrieve connection manager parameters for this account
+ """Retrieve connection manager parameters for this account.
+ We first try to connect without the register flag. If the connection
+ fails because of an authentication error we'll try to register
+ the account.
"""
server = self._owner.get_server()
khash = psutils.pubkey_to_keyid(self._owner.props.key)
@@ -85,7 +88,7 @@ class ServerPlugin(TelepathyPlugin):
'account': "%s@%s" % (khash, server),
'fallback-conference-server': "conference.%s" % server,
'password': self._owner.get_key_hash(),
- 'register': not self._owner.get_registered(),
+ 'register': False,
'port': dbus.UInt32(5223),
'old-ssl': True,
'ignore-ssl-errors': True,
@@ -234,10 +237,6 @@ class ServerPlugin(TelepathyPlugin):
return ret
def _connected_cb(self):
- if not self._owner.get_registered():
- # we successfully register this account
- self._owner.set_registered(True)
-
TelepathyPlugin._connected_cb(self)
# request Friends group channel
@@ -305,20 +304,26 @@ class ServerPlugin(TelepathyPlugin):
def _handle_connection_status_change(self, status, reason):
"""Override TelepathyPlugin implementation to manage connection errors
- due to registration problem. So, if for any reason the registered flag
- was not set in the config file but the account was registered, we don't
- fail to connect (see ticket #2062)."""
+ due to authentication problem. If the connection fails because of an
+ authentication error that's probably because the account isn't
+ registered yet on the server. So we try to register it.
+ If it fails because any other reason we unset the register flag so futur
+ connection attempts won't try to register until we got a new
+ authentication error. This should properly handle the "XO having to use
+ different jabber servers" use case."""
if status == self._conn_status:
return
- if (status == CONNECTION_STATUS_DISCONNECTED and
- reason == CONNECTION_STATUS_REASON_NAME_IN_USE and
- self._account['register']):
- _logger.debug('This account is already registered. Connect to it')
- self._account['register'] = False
- self._stop()
- self._init_connection()
- return
+ if status == CONNECTION_STATUS_DISCONNECTED:
+ if reason == CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED and \
+ not self._account['register']:
+ _logger.debug('Authentication failed. Trying to register the account')
+ self._account['register'] = True
+ self._stop()
+ self._init_connection()
+ return
+ else:
+ self._account['register'] = False
TelepathyPlugin._handle_connection_status_change(self, status, reason)
@@ -369,14 +374,7 @@ class ServerPlugin(TelepathyPlugin):
friends_handles = set()
friends = set()
for key in keys:
- try:
- decoded = base64.b64decode(key)
- except TypeError:
- # key is invalid; skip this friend
- _logger.debug('skipping friend with invalid key')
- continue
-
- id = psutils.pubkey_to_keyid(decoded)
+ id = psutils.pubkey_to_keyid(key)
# this assumes that all our friends are on the same server as us
jid = '%s@%s' % (id, profile.jabber_server)
friends.add(jid)
diff --git a/src/telepathy_plugin.py b/src/telepathy_plugin.py
index c486884..b4581d8 100644
--- a/src/telepathy_plugin.py
+++ b/src/telepathy_plugin.py
@@ -75,6 +75,10 @@ class TelepathyPlugin(gobject.GObject):
# args:
# channel object path
(gobject.SIGNAL_RUN_FIRST, None, [object]),
+ 'want-to-connect':
+ # The TelepathyPlugin wants to connect. presenceservice.py will
+ # call the start() method if that's OK with its policy.
+ (gobject.SIGNAL_RUN_FIRST, None, []),
}
_RECONNECT_INITIAL_TIMEOUT = 5000 # 5 seconds
@@ -163,9 +167,6 @@ class TelepathyPlugin(gobject.GObject):
"""
raise NotImplementedError
- def start(self):
- raise NotImplementedError
-
def suggest_room_for_activity(self, activity_id):
"""Suggest a room to use to share the given activity.
"""
@@ -340,6 +341,7 @@ class TelepathyPlugin(gobject.GObject):
self._backoff_id = 0
self._ip4am.disconnect(self._ip4am_sigid)
+ self._ip4am_sigid = 0
def _contacts_offline(self, handles):
"""Handle contacts going offline (send message, update set)"""
@@ -544,6 +546,11 @@ class TelepathyPlugin(gobject.GObject):
otherwise initiate a connection and transfer control to
_connect_reply_cb or _connect_error_cb
"""
+
+ if self._ip4am_sigid == 0:
+ self._ip4am_sigid = self._ip4am.connect('address-changed',
+ self._ip4_address_changed_cb)
+
if self._conn is not None:
return
@@ -555,7 +562,7 @@ class TelepathyPlugin(gobject.GObject):
else:
_logger.debug('%r: Postponing connection', self)
- def _ip4_address_changed_cb(self, ip4am, address):
+ def _ip4_address_changed_cb(self, ip4am, address, iface):
_logger.debug("::: IP4 address now %s", address)
self._reconnect_timeout = self._RECONNECT_INITIAL_TIMEOUT