discover proxy transport for server (#803)

This commit is contained in:
Dimitur Kirov 2006-03-20 23:17:36 +00:00
parent c16167025c
commit 5a1ff6a4d2
2 changed files with 41 additions and 13 deletions

View File

@ -113,8 +113,15 @@ class ConnectionBytestream:
proxyhosts = [] proxyhosts = []
if fast and cfg_proxies: if fast and cfg_proxies:
proxies = map(lambda e:e.strip(), cfg_proxies.split(',')) proxies = map(lambda e:e.strip(), cfg_proxies.split(','))
default = gajim.proxy65_manager.get_default_for_name(self.name)
if default:
# add/move default proxy at top of the others
if proxies.__contains__(default):
proxies.remove(default)
proxies.insert(0, default)
for proxy in proxies: for proxy in proxies:
(host, _port, jid) = gajim.proxy65_manager.get_proxy(proxy) (host, _port, jid) = gajim.proxy65_manager.get_proxy(proxy, self.name)
if host is None: if host is None:
continue continue
host_dict={ host_dict={
@ -496,16 +503,16 @@ class ConnectionBytestream:
class ConnectionDisco: class ConnectionDisco:
''' hold xmpppy handlers and public methods for discover services''' ''' hold xmpppy handlers and public methods for discover services'''
def discoverItems(self, jid, node = None): def discoverItems(self, jid, node = None, id_prefix = None):
'''According to JEP-0030: jid is mandatory, '''According to JEP-0030: jid is mandatory,
name, node, action is optional.''' name, node, action is optional.'''
self._discover(common.xmpp.NS_DISCO_ITEMS, jid, node) self._discover(common.xmpp.NS_DISCO_ITEMS, jid, node, id_prefix)
def discoverInfo(self, jid, node = None): def discoverInfo(self, jid, node = None, id_prefix = None):
'''According to JEP-0030: '''According to JEP-0030:
For identity: category, type is mandatory, name is optional. For identity: category, type is mandatory, name is optional.
For feature: var is mandatory''' For feature: var is mandatory'''
self._discover(common.xmpp.NS_DISCO_INFO, jid, node) self._discover(common.xmpp.NS_DISCO_INFO, jid, node, id_prefix)
def request_register_agent_info(self, agent): def request_register_agent_info(self, agent):
if not self.connection: if not self.connection:
@ -556,10 +563,13 @@ class ConnectionDisco:
common.xmpp.features_nb.register(self.connection, agent, info, None) common.xmpp.features_nb.register(self.connection, agent, info, None)
def _discover(self, ns, jid, node = None): def _discover(self, ns, jid, node = None, id_prefix = None):
if not self.connection: if not self.connection:
return return
iq = common.xmpp.Iq(typ = 'get', to = jid, queryNS = ns) iq = common.xmpp.Iq(typ = 'get', to = jid, queryNS = ns)
if id_prefix:
id = self.connection.getAnID()
iq.setID('%s%s' % (id_prefix, id))
if node: if node:
iq.setQuerynode(node) iq.setQuerynode(node)
self.connection.send(iq) self.connection.send(iq)
@ -617,7 +627,14 @@ class ConnectionDisco:
attr[key] = i.getAttrs()[key] attr[key] = i.getAttrs()[key]
items.append(attr) items.append(attr)
jid = helpers.get_full_jid_from_iq(iq_obj) jid = helpers.get_full_jid_from_iq(iq_obj)
self.dispatch('AGENT_INFO_ITEMS', (jid, node, items)) hostname = gajim.config.get_per('accounts', self.name,
'hostname')
id = iq_obj.getID()
if jid == hostname and id[0] == 'p':
for item in items:
self.discoverInfo(item['jid'], id_prefix='p')
else:
self.dispatch('AGENT_INFO_ITEMS', (jid, node, items))
def _DiscoverInfoGetCB(self, con, iq_obj): def _DiscoverInfoGetCB(self, con, iq_obj):
gajim.log.debug('DiscoverInfoGetCB') gajim.log.debug('DiscoverInfoGetCB')
@ -662,7 +679,11 @@ class ConnectionDisco:
elif i.getName() == 'x' and i.getAttr('xmlns') == common.xmpp.NS_DATA: elif i.getName() == 'x' and i.getAttr('xmlns') == common.xmpp.NS_DATA:
data.append(common.xmpp.DataForm(node=i)) data.append(common.xmpp.DataForm(node=i))
jid = helpers.get_full_jid_from_iq(iq_obj) jid = helpers.get_full_jid_from_iq(iq_obj)
id = iq_obj.getID()
if identities: #if not: an error occured if identities: #if not: an error occured
if id[0] == 'p':
if features.__contains__(common.xmpp.NS_BYTESTREAM):
gajim.proxy65_manager.resolve(jid, self.connection, self.name)
self.dispatch('AGENT_INFO_INFO', (jid, node, identities, self.dispatch('AGENT_INFO_INFO', (jid, node, identities,
features, data)) features, data))
@ -1488,6 +1509,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco)
proxies = map(lambda e:e.strip(), cfg_proxies.split(',')) proxies = map(lambda e:e.strip(), cfg_proxies.split(','))
for proxy in proxies: for proxy in proxies:
gajim.proxy65_manager.resolve(proxy, self.connection) gajim.proxy65_manager.resolve(proxy, self.connection)
self.discoverItems(gajim.config.get_per('accounts', self.name,
'hostname'), id_prefix='p')
def _on_roster_set(self, roster): def _on_roster_set(self, roster):
raw_roster = roster.getRaw() raw_roster = roster.getRaw()

View File

@ -39,8 +39,10 @@ class Proxy65Manager:
# dict {proxy: proxy properties} # dict {proxy: proxy properties}
self.idlequeue = idlequeue self.idlequeue = idlequeue
self.proxies = {} self.proxies = {}
# dict {account: proxy} default proxy for account
self.default_proxies = {}
def resolve(self, proxy, connection): def resolve(self, proxy, connection, default = None):
''' start ''' ''' start '''
if self.proxies.has_key(proxy): if self.proxies.has_key(proxy):
resolver = self.proxies[proxy] resolver = self.proxies[proxy]
@ -49,10 +51,9 @@ class Proxy65Manager:
resolver = ProxyResolver(proxy) resolver = ProxyResolver(proxy)
self.proxies[proxy] = resolver self.proxies[proxy] = resolver
resolver.add_connection(connection) resolver.add_connection(connection)
if default:
if resolver.state == S_FINISHED: # add this proxy as default for account
# resolving this proxy is already started or completed self.default_proxies[default] = proxy
return
def disconnect(self, connection): def disconnect(self, connection):
for resolver in self.proxies.values(): for resolver in self.proxies.values():
@ -78,7 +79,11 @@ class Proxy65Manager:
resolver.keep_conf() resolver.keep_conf()
break break
def get_proxy(self, proxy): def get_default_for_name(self, account):
if self.default_proxies.has_key(account):
return self.default_proxies[account]
def get_proxy(self, proxy, account):
if self.proxies.has_key(proxy): if self.proxies.has_key(proxy):
resolver = self.proxies[proxy] resolver = self.proxies[proxy]
if resolver.state == S_FINISHED: if resolver.state == S_FINISHED: