don't allow to browse non-MUC server in join groupchat dialog.

This commit is contained in:
Yann Leboulanger 2013-07-30 20:09:52 +02:00
parent 1c8a57404a
commit 967fa409a9
3 changed files with 76 additions and 7 deletions

View File

@ -104,7 +104,8 @@ class ConnectionDisco:
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 @@ class ConnectionDisco:
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 @@ class ConnectionDisco:
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 @@ ConnectionJingle, ConnectionIBBytestream):
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 @@ ConnectionJingle, ConnectionIBBytestream):
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:

View File

@ -1929,6 +1929,8 @@ class AgentItemsReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
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 @@ class AgentItemsErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
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 @@ class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
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 @@ class AgentInfoErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
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):

View File

@ -32,6 +32,7 @@
import gtk
import gobject
import os
import nbxmpp
import gtkgui_helpers
import vcard
@ -2407,6 +2408,11 @@ class JoinGroupchatWindow:
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 @@ class JoinGroupchatWindow:
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 @@ class JoinGroupchatWindow:
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