changeset ca0cbe69a25f in /home/hg/repos/gajim
branches: gajim_0.16 details:http://hg.gajim.org/gajim?cmd=changeset;node=ca0cbe69a25f description: don't allow to browse non-MUC server in join groupchat dialog.
diffstat:
src/common/connection_handlers.py | 24 ++++++++++++-- src/common/connection_handlers_events.py | 9 +++++ src/dialogs.py | 50 ++++++++++++++++++++++++++++++- 3 files changed, 76 insertions(+), 7 deletions(-)
diffs (203 lines):
diff -r af16b3f443a8 -r ca0cbe69a25f src/common/connection_handlers.py --- a/src/common/connection_handlers.py Mon Jul 29 22:05:39 2013 +0200 +++ b/src/common/connection_handlers.py Tue Jul 30 20:09:52 2013 +0200 @@ -104,7 +104,8 @@ jid is mandatory; name, node, action is optional. """ - self._discover(nbxmpp.NS_DISCO_ITEMS, jid, node, id_prefix) + id_ = self._discover(nbxmpp.NS_DISCO_ITEMS, jid, node, id_prefix) + self.disco_items_ids.append(id_)
def discoverInfo(self, jid, node=None, id_prefix=None): """ @@ -112,7 +113,8 @@ For identity: category, type is mandatory, name is optional. For feature: var is mandatory. """ - self._discover(nbxmpp.NS_DISCO_INFO, jid, node, id_prefix) + id_ = self._discover(nbxmpp.NS_DISCO_INFO, jid, node, id_prefix) + self.disco_info_ids.append(id_)
def request_register_agent_info(self, agent): if not self.connection or self.connected < 2: @@ -166,12 +168,14 @@ if not self.connection or self.connected < 2: return iq = nbxmpp.Iq(typ='get', to=jid, queryNS=ns) + id_ = self.connection.getAnID() if id_prefix: - id_ = self.connection.getAnID() - iq.setID('%s%s' % (id_prefix, id_)) + id_ = id_prefix + id_ + iq.setID(id_) if node: iq.setQuerynode(node) self.connection.send(iq) + return id_
def _ReceivedRegInfo(self, con, resp, agent): nbxmpp.features_nb._ReceivedRegInfo(con, resp, agent) @@ -1439,6 +1443,10 @@ self.version_ids = [] # IDs of urn:xmpp:time requests self.entity_time_ids = [] + # IDs of disco#items requests + self.disco_items_ids = [] + # IDs of disco#info requests + self.disco_info_ids = [] # ID of urn:xmpp:ping requests self.awaiting_xmpp_ping_id = None self.continue_connect_info = None @@ -1590,6 +1598,14 @@ gajim.nec.push_incoming_event(TimeResultReceivedEvent(None, conn=self, stanza=obj.stanza)) return True + if obj.id_ in self.disco_items_ids: + gajim.nec.push_incoming_event(AgentItemsErrorReceivedEvent(None, + conn=self, stanza=obj.stanza)) + return True + if obj.id_ in self.disco_info_ids: + gajim.nec.push_incoming_event(AgentInfoErrorReceivedEvent(None, + conn=self, stanza=obj.stanza)) + return True
def _nec_private_storate_bookmarks_received(self, obj): if obj.conn.name != self.name: diff -r af16b3f443a8 -r ca0cbe69a25f src/common/connection_handlers_events.py --- a/src/common/connection_handlers_events.py Mon Jul 29 22:05:39 2013 +0200 +++ b/src/common/connection_handlers_events.py Tue Jul 30 20:09:52 2013 +0200 @@ -1929,6 +1929,8 @@ self.get_jid_resource() hostname = gajim.config.get_per('accounts', self.conn.name, 'hostname') self.get_id() + if self.id_ in self.conn.disco_items_ids: + self.conn.disco_items_ids.remove(self.id_) if self.fjid == hostname and self.id_[:6] == 'Gajim_': for item in self.items: self.conn.discoverInfo(item['jid'], id_prefix='Gajim_') @@ -1941,6 +1943,9 @@
def generate(self): self.get_jid_resource() + self.get_id() + if self.id_ in self.conn.disco_items_ids: + self.conn.disco_items_ids.remove(self.id_) return True
class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): @@ -1949,6 +1954,8 @@
def generate(self): self.get_id() + if self.id_ in self.conn.disco_info_ids: + self.conn.disco_info_ids.remove(self.id_) if self.id_ is None: log.warn('Invalid IQ received without an ID. Ignoring it: %s' % \ self.stanza) @@ -1993,6 +2000,8 @@ def generate(self): self.get_jid_resource() self.get_id() + if self.id_ in self.conn.disco_info_ids: + self.conn.disco_info_ids.remove(self.id_) return True
class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): diff -r af16b3f443a8 -r ca0cbe69a25f src/dialogs.py --- a/src/dialogs.py Mon Jul 29 22:05:39 2013 +0200 +++ b/src/dialogs.py Tue Jul 30 20:09:52 2013 +0200 @@ -32,6 +32,7 @@ import gtk import gobject import os +import nbxmpp
import gtkgui_helpers import vcard @@ -2407,6 +2408,11 @@ if 'jabber' in gajim.connections[account].muc_jid: server_list.append(gajim.connections[account].muc_jid['jabber'])
+ entry = self.server_comboboxentry.child + entry.connect('changed', self.on_server_entry_changed) + self.browse_button = self.xml.get_object('browse_rooms_button') + self.browse_button.set_sensitive(False) + self.recently_combobox = self.xml.get_object('recently_combobox') liststore = gtk.ListStore(str, str) self.recently_combobox.set_model(liststore) @@ -2451,12 +2457,22 @@ if account and not gajim.connections[account].private_storage_supported: self.xml.get_object('bookmark_checkbutton').set_sensitive(False)
+ self.requested_jid = None + gajim.ged.register_event_handler('agent-info-received', ged.GUI1, + self._nec_agent_info_received) + gajim.ged.register_event_handler('agent-info-error-received', ged.GUI1, + self._nec_agent_info_error_received) + self.window.show_all()
def on_join_groupchat_window_destroy(self, widget): """ Close window """ + gajim.ged.remove_event_handler('agent-info-received', ged.GUI1, + self._nec_agent_info_received) + gajim.ged.register_event_handler('agent-info-error-received', ged.GUI1, + self._nec_agent_info_error_received) if self.account and 'join_gc' in gajim.interface.instances[self.account]: # remove us from open windows del gajim.interface.instances[self.account]['join_gc'] @@ -2505,19 +2521,47 @@
def on_browse_rooms_button_clicked(self, widget): server = self.server_comboboxentry.child.get_text().decode('utf-8') - if server in gajim.interface.instances[self.account]['disco']: - gajim.interface.instances[self.account]['disco'][server].window.\ + self.requested_jid = server + gajim.connections[self.account].discoverInfo(server) + + def _nec_agent_info_error_received(self, obj): + if obj.conn.name != self.account: + return + if obj.jid != self.requested_jid: + return + self.requested_jid = None + ErrorDialog(_('Wrong server'), _('%s is not a groupchat server') % \ + obj.jid) + + def _nec_agent_info_received(self, obj): + if obj.conn.name != self.account: + return + if obj.jid != self.requested_jid: + return + self.requested_jid = None + if nbxmpp.NS_MUC not in obj.features: + ErrorDialog(_('Wrong server'), _('%s is not a groupchat server') % \ + obj.jid) + return + if obj.jid in gajim.interface.instances[self.account]['disco']: + gajim.interface.instances[self.account]['disco'][obj.jid].window.\ present() else: try: # Object will add itself to the window dict import disco - disco.ServiceDiscoveryWindow(self.account, server, + disco.ServiceDiscoveryWindow(self.account, obj.jid, initial_identities=[{'category': 'conference', 'type': 'text'}]) except GajimGeneralException: pass
+ def on_server_entry_changed(self, widget): + if not widget.get_text(): + self.browse_button.set_sensitive(False) + else: + self.browse_button.set_sensitive(True) + def on_cancel_button_clicked(self, widget): """ When Cancel button is clicked