[sugar] [PATCH] services/presence/server_plugin: When creating a room, make it non-anonymous.
Dan Williams
dcbw
Thu May 24 13:46:32 EDT 2007
On Tue, 2007-05-22 at 16:49 +0100, Simon McVittie wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Otherwise clients joining the room won't be able to convert other clients'
> channel-specific handles into global handles in order to make Buddy objects,
> because they're not the moderator of the room.
> - ---
> services/presence/server_plugin.py | 47 ++++++++++++++++++++++++++++++-----
> 1 files changed, 40 insertions(+), 7 deletions(-)
Looks good
> diff --git a/services/presence/server_plugin.py b/services/presence/server_plugin.py
> index 6b21888..18b4776 100644
> - --- a/services/presence/server_plugin.py
> +++ b/services/presence/server_plugin.py
> @@ -30,12 +30,14 @@ import psutils
> from telepathy.client import ConnectionManager, ManagerRegistry, Connection, Channel
> from telepathy.interfaces import (
> CONN_MGR_INTERFACE, CONN_INTERFACE, CHANNEL_TYPE_CONTACT_LIST, CHANNEL_INTERFACE_GROUP, CONN_INTERFACE_ALIASING,
> - - CONN_INTERFACE_AVATARS, CONN_INTERFACE_PRESENCE, CHANNEL_TYPE_TEXT, CHANNEL_TYPE_STREAMED_MEDIA)
> + CONN_INTERFACE_AVATARS, CONN_INTERFACE_PRESENCE, CHANNEL_TYPE_TEXT, CHANNEL_TYPE_STREAMED_MEDIA,
> + PROPERTIES_INTERFACE)
> from telepathy.constants import (
> CONNECTION_HANDLE_TYPE_NONE, CONNECTION_HANDLE_TYPE_CONTACT,
> CONNECTION_STATUS_CONNECTED, CONNECTION_STATUS_DISCONNECTED, CONNECTION_STATUS_CONNECTING,
> CONNECTION_HANDLE_TYPE_LIST, CONNECTION_HANDLE_TYPE_CONTACT, CONNECTION_HANDLE_TYPE_ROOM,
> - - CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED)
> + CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED,
> + PROPERTY_FLAG_WRITE)
>
> CONN_INTERFACE_BUDDY_INFO = 'org.laptop.Telepathy.BuddyInfo'
> CONN_INTERFACE_ACTIVITY_PROPERTIES = 'org.laptop.Telepathy.ActivityProperties'
> @@ -422,12 +424,43 @@ class ServerPlugin(gobject.GObject):
> reply_handler=self._set_self_avatar_cb,
> error_handler=lambda *args: self._log_error_cb("setting avatar", *args))
>
> - - def _join_activity_create_channel_cb(self, activity_id, signal, handle, userdata, chan_path):
> - - channel = Channel(self._conn._dbus_object._named_service, chan_path)
> + def _join_activity_channel_props_set_cb(self, activity_id, signal, handle, channel, userdata):
> self._joined_activities.append((activity_id, handle))
> self._set_self_activities()
> self.emit(signal, activity_id, channel, None, userdata)
>
> + def _join_activity_channel_props_listed_cb(self, activity_id, signal, handle, channel, userdata, props, prop_specs):
> +
> + props_to_set = []
> + for ident, name, sig, flags in prop_specs:
> + value = props.pop(name, None)
> + if value is not None:
> + if flags & PROPERTY_FLAG_WRITE:
> + props_to_set.append((ident, value))
> + # FIXME: else error, but only if we're creating the room?
> + # FIXME: if props is nonempty, then we want to set props that aren't
> + # supported here - raise an error?
> +
> + if props_to_set:
> + channel[PROPERTIES_INTERFACE].SetProperties(props_to_set,
> + reply_handler=lambda: self._join_activity_channel_props_set_cb(activity_id, signal, handle, channel, userdata),
> + error_handler=lambda e: self._join_error_cb(activity_id, signal, userdata, 'SetProperties(%r)' % props_to_set, e))
> + else:
> + self._join_activity_channel_props_set_cb(activity_id, signal, handle, channel, userdata)
> +
> + def _join_activity_create_channel_cb(self, activity_id, signal, handle, userdata, chan_path):
> + channel = Channel(self._conn._dbus_object._named_service, chan_path)
> + props = {
> + 'anonymous': False, # otherwise buddy resolution breaks
> + 'invite-only': False, # XXX: should be True in future
> + #'name': ... # XXX: set from activity name?
> + 'persistent': False, # vanish when there are no members
> + 'private': False, # XXX: should be True unless public
> + }
> + channel[PROPERTIES_INTERFACE].ListProperties(
> + reply_handler=lambda prop_specs: self._join_activity_channel_props_listed_cb(activity_id, signal, handle, channel, userdata, props, prop_specs),
> + error_handler=lambda e: self._join_error_cb(activity_id, signal, userdata, 'ListProperties', e))
> +
> def _join_activity_get_channel_cb(self, activity_id, signal, userdata, handles):
> if not self._activities.has_key(activity_id):
> self._activities[activity_id] = handles[0]
> @@ -441,10 +474,10 @@ class ServerPlugin(gobject.GObject):
> self._conn[CONN_INTERFACE].RequestChannel(CHANNEL_TYPE_TEXT,
> CONNECTION_HANDLE_TYPE_ROOM, handles[0], True,
> reply_handler=lambda *args: self._join_activity_create_channel_cb(activity_id, signal, handles[0], userdata, *args),
> - - error_handler=lambda *args: self._join_error_cb(activity_id, signal, userdata, *args))
> + error_handler=lambda e: self._join_error_cb(activity_id, signal, userdata, 'RequestChannel(TEXT, ROOM, %r, True)' % handles[0], e))
>
> - - def _join_error_cb(self, activity_id, signal, userdata, err):
> - - e = Exception("Error joining/sharing activity %s: %s" % (activity_id, err))
> + def _join_error_cb(self, activity_id, signal, userdata, where, err):
> + e = Exception("Error joining/sharing activity %s: (%s): %s" % (activity_id, err))
> _logger.debug(str(e))
> self.emit(signal, activity_id, None, e, userdata)
>
> - --
> 1.5.2-rc3.GIT
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.6 (GNU/Linux)
> Comment: OpenPGP key: http://www.pseudorandom.co.uk/2003/contact/ or pgp.net
>
> iD8DBQFGUxElWSc8zVUw7HYRApw4AJwO+/ndtybiTFPQEI35meJuyPzN5wCfUQWo
> EafNRdOl/ITBL5VY7N34abk=
> =piEB
> -----END PGP SIGNATURE-----
> _______________________________________________
> Sugar mailing list
> Sugar at laptop.org
> http://mailman.laptop.org/mailman/listinfo/sugar
More information about the Sugar-devel
mailing list