Changeset 10326
- Timestamp:
- 08/27/08 15:11:46 (3 months ago)
- Location:
- trunk/src/common
- Files:
-
- 2 modified
-
connection_handlers.py (modified) (2 diffs)
-
proxy65_manager.py (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/common/connection_handlers.py
r10319 r10326 835 835 break 836 836 if features.__contains__(common.xmpp.NS_BYTESTREAM): 837 gajim.proxy65_manager.resolve(jid, self.connection, self.name) 837 our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name) +\ 838 '/' + self.server_resource) 839 gajim.proxy65_manager.resolve(jid, self.connection, our_jid, 840 self.name) 838 841 if features.__contains__(common.xmpp.NS_MUC) and is_muc: 839 842 type_ = transport_type or 'jabber' … … 2243 2246 cfg_proxies = gajim.config.get_per('accounts', self.name, 2244 2247 'file_transfer_proxies') 2248 our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name) + '/' +\ 2249 self.server_resource) 2245 2250 if cfg_proxies: 2246 2251 proxies = map(lambda e:e.strip(), cfg_proxies.split(',')) 2247 2252 for proxy in proxies: 2248 gajim.proxy65_manager.resolve(proxy, self.connection )2253 gajim.proxy65_manager.resolve(proxy, self.connection, our_jid) 2249 2254 2250 2255 def _on_roster_set(self, roster): -
trunk/src/common/proxy65_manager.py
r10250 r10326 50 50 # dict {account: proxy} default proxy for account 51 51 self.default_proxies = {} 52 53 def resolve(self, proxy, connection, default =None):52 53 def resolve(self, proxy, connection, sender_jid, default=None): 54 54 ''' start ''' 55 55 if self.proxies.has_key(proxy): … … 57 57 else: 58 58 # proxy is being ressolved for the first time 59 resolver = ProxyResolver(proxy )59 resolver = ProxyResolver(proxy, sender_jid) 60 60 self.proxies[proxy] = resolver 61 61 resolver.add_connection(connection) … … 63 63 # add this proxy as default for account 64 64 self.default_proxies[default] = proxy 65 65 66 66 def disconnect(self, connection): 67 67 for resolver in self.proxies.values(): 68 68 resolver.disconnect(connection) 69 69 70 70 def resolve_result(self, proxy, query): 71 71 if not self.proxies.has_key(proxy): … … 80 80 # we can have only one streamhost 81 81 raise common.xmpp.NodeProcessed 82 82 83 83 def error_cb(self, proxy, query): 84 84 sid = query.getAttr('sid') … … 87 87 resolver.keep_conf() 88 88 break 89 89 90 90 def get_default_for_name(self, account): 91 91 if self.default_proxies.has_key(account): 92 92 return self.default_proxies[account] 93 93 94 94 def get_proxy(self, proxy, account): 95 95 if self.proxies.has_key(proxy): … … 102 102 def resolve_result(self, host, port, jid): 103 103 ''' test if host has a real proxy65 listening on port ''' 104 self.host = unicode(host)104 self.host = str(host) 105 105 self.port = int(port) 106 106 self.jid = unicode(jid) 107 107 self.state = S_RESOLVED 108 self.receiver_tester = ReceiverTester(self.host, self.port, self.jid, 109 self.sid, self.sender_jid, self._on_receiver_success, 110 self._on_connect_failure) 111 self.receiver_tester.connect() 112 113 def _on_receiver_success(self): 108 114 self.host_tester = HostTester(self.host, self.port, self.jid, 109 self._on_connect_success, self._on_connect_failure) 115 self.sid, self.sender_jid, self._on_connect_success, 116 self._on_connect_failure) 110 117 self.host_tester.connect() 111 118 112 119 def _on_connect_success(self): 113 iq = common.xmpp.Protocol(name = 'iq', to = self.jid, typ ='set')120 iq = common.xmpp.Protocol(name='iq', to=self.jid, typ='set') 114 121 query = iq.setTag('query') 115 122 query.setNamespace(common.xmpp.NS_BYTESTREAM) 116 123 query.setAttr('sid', self.sid) 117 124 118 125 activate = query.setTag('activate') 119 activate.setData( self.jid + "/" + self.sid)126 activate.setData('test@gajim.org/test2') 120 127 121 128 if self.active_connection: 122 self.active_connection. send(iq)129 self.active_connection.SendAndCallForResponse(iq, self.keep_conf) 123 130 self.state = S_ACTIVATED 124 131 else: 125 132 self.state = S_INITIAL 126 127 def keep_conf(self): 133 134 def keep_conf(self, data=None): 135 self.disconnect(self.active_connection) 128 136 self.state = S_FINISHED 129 137 130 138 def _on_connect_failure(self): 131 139 self.state = S_FINISHED … … 133 141 self.port = 0 134 142 self.jid = None 135 143 136 144 def disconnect(self, connection): 137 145 if self.host_tester: 138 146 self.host_tester.disconnect() 139 147 self.host_tester = None 148 if self.receiver_tester: 149 self.receiver_tester.disconnect() 150 self.receiver_tester = None 140 151 try: 141 152 self.connections.remove(connection) … … 147 158 self.state = S_INITIAL 148 159 self.try_next_connection() 149 160 150 161 def try_next_connection(self): 151 162 ''' try to resolve proxy with the next possible connection ''' … … 153 164 connection = self.connections.pop(0) 154 165 self.start_resolve(connection) 155 166 156 167 def add_connection(self, connection): 157 168 ''' add a new connection in case the first fails ''' … … 159 170 if self.state == S_INITIAL: 160 171 self.start_resolve(connection) 161 172 162 173 def start_resolve(self, connection): 163 174 ''' request network address from proxy ''' 164 175 self.state = S_STARTED 165 176 self.active_connection = connection 166 iq = common.xmpp.Protocol(name = 'iq', to = self.proxy, typ ='get')177 iq = common.xmpp.Protocol(name='iq', to=self.proxy, typ='get') 167 178 query = iq.setTag('query') 168 179 query.setNamespace(common.xmpp.NS_BYTESTREAM) 169 180 connection.send(iq) 170 171 def __init__(self, proxy ):181 182 def __init__(self, proxy, sender_jid): 172 183 self.proxy = proxy 173 184 self.state = S_INITIAL … … 175 186 self.connections = [] 176 187 self.host_tester = None 188 self.receiver_tester = None 177 189 self.jid = None 178 190 self.host = None 179 191 self.port = None 180 192 self.sid = helpers.get_random_string_16() 181 193 self.sender_jid = sender_jid 194 182 195 class HostTester(Socks5, IdleObject): 183 196 ''' fake proxy tester. ''' 184 def __init__(self, host, port, jid, on_success, on_failure):197 def __init__(self, host, port, jid, sid, sender_jid, on_success, on_failure): 185 198 ''' try to establish and auth to proxy at (host, port) 186 199 call on_success, or on_failure according to the result''' … … 191 204 self.on_failure = on_failure 192 205 self._sock = None 193 self.file_props = {} 206 self.file_props = {'is_a_proxy': True, 207 'proxy_sender': sender_jid, 208 'proxy_receiver': 'test@gajim.org/test2'} 194 209 Socks5.__init__(self, gajim.idlequeue, host, port, None, None, None) 195 210 self.sid = sid 211 196 212 def connect(self): 197 213 ''' create the socket and plug it to the idlequeue ''' … … 207 223 self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 208 224 return None 209 225 210 226 def read_timeout(self): 211 227 self.idlequeue.remove_timeout(self.fd) 212 228 self.pollend() 213 229 214 230 def pollend(self): 215 231 self.disconnect() 216 232 self.on_failure() 217 233 218 234 def pollout(self): 219 235 self.idlequeue.remove_timeout(self.fd) … … 230 246 gajim.idlequeue.plug_idle(self, False, True) 231 247 gajim.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 232 248 233 249 def pollin(self): 234 250 self.idlequeue.remove_timeout(self.fd) … … 247 263 if version != 0x05 or method == 0xff: 248 264 self.pollend() 249 self.disconnect() 265 return 266 data = self._get_request_buff(self._get_sha1_auth()) 267 self.send_raw(data) 268 self.state += 1 269 elif self.state == 3: 250 270 self.on_success() 251 else: 252 self.disconnect() 253 271 self.state += 1 272 254 273 def do_connect(self): 255 274 try: 256 275 self._sock.connect((self.host, self.port)) 257 276 self._sock.setblocking(False) 258 self._send =self._sock.send259 self._recv =self._sock.recv277 self._send = self._sock.send 278 self._recv = self._sock.recv 260 279 except Exception, ee: 261 280 (errnum, errstr) = ee … … 271 290 # socket is already connected 272 291 self._sock.setblocking(False) 273 self._send =self._sock.send274 self._recv =self._sock.recv292 self._send = self._sock.send 293 self._recv = self._sock.recv 275 294 self.buff = '' 276 295 self.state = 1 # connected 277 296 self.idlequeue.plug_idle(self, True, False) 278 297 return 279 298 299 class ReceiverTester(Socks5, IdleObject): 300 ''' fake proxy tester. ''' 301 def __init__(self, host, port, jid, sid, sender_jid, on_success, on_failure): 302 ''' try to establish and auth to proxy at (host, port) 303 call on_success, or on_failure according to the result''' 304 self.host = host 305 self.port = port 306 self.jid = jid 307 self.on_success = on_success 308 self.on_failure = on_failure 309 self._sock = None 310 self.file_props = {'is_a_proxy': True, 311 'proxy_sender': sender_jid, 312 'proxy_receiver': 'test@gajim.org/test2'} 313 Socks5.__init__(self, gajim.idlequeue, host, port, None, None, None) 314 self.sid = sid 315 316 def connect(self): 317 ''' create the socket and plug it to the idlequeue ''' 318 if self.host is None: 319 self.on_failure() 320 return None 321 self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 322 self._sock.setblocking(False) 323 self.fd = self._sock.fileno() 324 self.state = 0 # about to be connected 325 gajim.idlequeue.plug_idle(self, True, False) 326 self.do_connect() 327 self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 328 return None 329 330 def read_timeout(self): 331 self.idlequeue.remove_timeout(self.fd) 332 self.pollend() 333 334 def pollend(self): 335 self.disconnect() 336 self.on_failure() 337 338 def pollout(self): 339 self.idlequeue.remove_timeout(self.fd) 340 if self.state == 0: 341 self.do_connect() 342 return 343 elif self.state == 1: # send initially: version and auth types 344 data = self._get_auth_buff() 345 self.send_raw(data) 346 else: 347 return 348 self.state += 1 349 # unplug and plug for reading 350 gajim.idlequeue.plug_idle(self, False, True) 351 gajim.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 352 353 def pollin(self): 354 self.idlequeue.remove_timeout(self.fd) 355 if self.state in (2, 3): 356 self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 357 # begin negotiation. on success 'address' != 0 358 buff = self.receive() 359 if buff == '': 360 # end connection 361 self.pollend() 362 return 363 if self.state == 2: 364 # read auth response 365 if buff is None or len(buff) != 2: 366 return None 367 version, method = struct.unpack('!BB', buff[:2]) 368 if version != 0x05 or method == 0xff: 369 self.pollend() 370 return 371 data = self._get_request_buff(self._get_sha1_auth()) 372 self.send_raw(data) 373 self.state += 1 374 elif self.state == 3: 375 # read connect response 376 if buff is None or len(buff) < 2: 377 return None 378 version, reply = struct.unpack('!BB', buff[:2]) 379 if version != 0x05 or reply != 0x00: 380 self.pollend() 381 return 382 self.on_success() 383 self.state += 1 384 385 def do_connect(self): 386 try: 387 self._sock.connect((self.host, self.port)) 388 self._sock.setblocking(False) 389 self._send = self._sock.send 390 self._recv = self._sock.recv 391 except Exception, ee: 392 (errnum, errstr) = ee 393 # 56 is for freebsd 394 if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): 395 # still trying to connect 396 return 397 # win32 needs this 398 if errnum not in (0, 10056, errno.EISCONN): 399 # connection failed 400 self.on_failure() 401 return 402 # socket is already connected 403 self._sock.setblocking(False) 404 self._send = self._sock.send 405 self._recv = self._sock.recv 406 self.buff = '' 407 self.state = 1 # connected 408 self.idlequeue.plug_idle(self, True, False) 409 return 280 410 281 411 # vim: se ts=3:
