gajim.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2026
October
September
August
July
June
May
April
March
February
January
2025
December
November
October
September
August
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
List overview
Download
Commits
August 2011
----- 2026 -----
October 2026
September 2026
August 2026
July 2026
June 2026
May 2026
April 2026
March 2026
February 2026
January 2026
----- 2025 -----
December 2025
November 2025
October 2025
September 2025
August 2025
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
commits@gajim.org
3 participants
99 discussions
Start a n
N
ew thread
gajim: coding standards + choose correct streamhost when we rece...
by Yann Leboulanger
24 Aug '11
24 Aug '11
changeset 9be7d754233a in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=9be7d754233a
description: coding standards + choose correct streamhost when we receive the streamhost_used after we sent it diffstat: src/common/jingle_ft.py | 83 ++++++++++++++++++++++++------------------------ 1 files changed, 42 insertions(+), 41 deletions(-) diffs (219 lines): diff -r 907a907d8c70 -r 9be7d754233a src/common/jingle_ft.py --- a/src/common/jingle_ft.py Wed Aug 24 10:36:00 2011 +0200 +++ b/src/common/jingle_ft.py Wed Aug 24 10:42:16 2011 +0200 @@ -85,7 +85,7 @@ self.file_props['transfered_size'] = [] log.info("FT request: %s" % file_props) - + if transport is None: self.transport = JingleTransportSocks5() self.transport.set_connection(session.connection) @@ -111,8 +111,8 @@ security = content.getTag('security') if not security: # responder can not verify our fingerprint self.use_security = False - - + + if self.state == STATE_TRANSPORT_REPLACE: # We ack the session accept response = stanza.buildReply('result') @@ -120,19 +120,19 @@ # We send the file con.files_props[self.file_props['sid']] = self.file_props fp = open(self.file_props['file-name'], 'r') - con.OpenStream( self.transport.sid, self.session.peerjid, + con.OpenStream( self.transport.sid, self.session.peerjid, fp, blocksize=4096) raise xmpp.NodeProcessed - + self.file_props['streamhosts'] = self.transport.remote_candidates for host in self.file_props['streamhosts']: host['initiator'] = self.session.initiator host['target'] = self.session.responder host['sid'] = self.file_props['sid'] - + response = stanza.buildReply('result') con.connection.send(response) - + if not gajim.socks5queue.get_file_props( self.session.connection.name, self.file_props['sid']): gajim.socks5queue.add_file_props(self.session.connection.name, @@ -144,7 +144,7 @@ self.file_props['sid'], self.send_candidate_used, self._on_connect_error, fingerprint=fingerprint, receiving=False) - + raise xmpp.NodeProcessed def __on_session_terminate(self, stanza, content, error, action): @@ -175,7 +175,7 @@ self.session.transport_replace() else: self.state = STATE_CAND_RECEIVED_PENDING_REPLY - + return streamhost_cid = content.getTag('transport').getTag('candidate-used').\ getAttr('cid') @@ -192,12 +192,12 @@ if self.state == STATE_CAND_SENT_PENDING_REPLY: response = stanza.buildReply('result') self.session.connection.connection.send(response) - self.start_transfer(streamhost_used) + self.start_transfer() raise xmpp.NodeProcessed else: self.state = STATE_CAND_RECEIVED_PENDING_REPLY - - + + def __on_iq_result(self, stanza, content, error, action): log.info("__on_iq_result") @@ -230,16 +230,15 @@ # proxy activated self.state = STATE_PROXY_ACTIVATED elif self.state == STATE_CAND_SENT_AND_RECEIVED: - if not self.nominated_cand['our-cand'] and \ - not self.nominated_cand['peer-cand']: - if not self.weinitiate: - return - self.session.transport_replace() + not self.nominated_cand['peer-cand']: + if not self.weinitiate: return + self.session.transport_replace() + return # initiate transfer - self.start_transfer(None) - + self.start_transfer() + def send_candidate_used(self, streamhost): """ send candidate-used stanza @@ -247,13 +246,13 @@ log.info('send_candidate_used') if streamhost is None: return - + self.nominated_cand['our-cand'] = streamhost if self.state == STATE_CAND_RECEIVED_PENDING_REPLY: self.state = STATE_CAND_SENT_AND_RECEIVED else: self.state = STATE_CAND_SENT_PENDING_REPLY - + content = xmpp.Node('content') content.setAttr('creator', 'initiator') content.setAttr('name', self.name) @@ -274,15 +273,15 @@ def _on_connect_error(self, to, _id, sid, code=404): self.nominated_cand['our-cand'] = False self.send_error_candidate() - + if self.state == STATE_CAND_RECEIVED_PENDING_REPLY: self.state = STATE_CAND_SENT_AND_RECEIVED else: self.state = STATE_CAND_SENT_PENDING_REPLY - - + + log.info('connect error, sid=' + sid) - + def _fill_content(self, content): description_node = xmpp.simplexml.Node( tag=xmpp.NS_JINGLE_FILE_TRANSFER + ' description') @@ -312,10 +311,10 @@ def _store_socks5_sid(self, sid, hash_id): # callback from socsk5queue.start_listener self.file_props['hash'] = hash_id - + def _listen_host(self, stanza=None, content=None, error=None , action=None): - + receiver = self.file_props['receiver'] sender = self.file_props['sender'] @@ -328,7 +327,7 @@ fingerprint = None if self.use_security: fingerprint = 'server' - + if self.weinitiate: listener = gajim.socks5queue.start_listener(port, sha_str, self._store_socks5_sid, self.file_props, @@ -346,33 +345,35 @@ If this method returns true then the candidate we nominated will be used, if false, the candidate nominated by peer will be used ''' - + if self.nominated_cand['peer-cand'] == False: return True if self.nominated_cand['our-cand'] == False: return False - + peer_pr = int(self.nominated_cand['peer-cand']['priority']) our_pr = int(self.nominated_cand['our-cand']['priority']) - + if peer_pr != our_pr: return our_pr > peer_pr else: return self.weinitiate - - - def start_transfer(self, streamhost_used): - + + + def start_transfer(self): + self.state = STATE_TRANSFERING - + # It tells wether we start the transfer as client or server - type = None - + type = None + if self.isOurCandUsed(): type = 'client' + streamhost_used = self.nominated_cand['our-cand'] else: - type = 'server' - + type = 'server' + streamhost_used = self.nominated_cand['peer-cand'] + # FIXME if streamhost_used is none where do we get the proxy host if streamhost_used and streamhost_used['type'] == 'proxy': self.file_props['streamhost-used'] = True @@ -397,7 +398,7 @@ jid = gajim.get_jid_without_resource(self.session.ourjid) gajim.socks5queue.send_file(self.file_props, self.session.connection.name, type) - + def get_content(desc): return JingleFileTransfer
1
0
0
0
gajim: coding standards
by Yann Leboulanger
24 Aug '11
24 Aug '11
changeset 907a907d8c70 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=907a907d8c70
description: coding standards diffstat: src/common/socks5.py | 218 +++++++++++++++++++++++++------------------------- 1 files changed, 107 insertions(+), 111 deletions(-) diffs (truncated from 615 to 300 lines): diff -r 83a02c001360 -r 907a907d8c70 src/common/socks5.py --- a/src/common/socks5.py Mon Aug 22 23:57:29 2011 -0400 +++ b/src/common/socks5.py Wed Aug 24 10:36:00 2011 +0200 @@ -67,7 +67,7 @@ """ def __init__(self, idlequeue, complete_transfer_cb=None, - progress_transfer_cb=None, error_cb=None): + progress_transfer_cb=None, error_cb=None): self.connected = 0 self.readers = {} self.files_props = {} @@ -85,7 +85,7 @@ self.on_failure = {} # {id: cb} def start_listener(self, port, sha_str, sha_handler, fp, fingerprint=None, - type='sender'): + type='sender'): """ Start waiting for incomming connections on (host, port) and do a socks5 authentication using sid for generated SHA @@ -95,15 +95,15 @@ self.sha_handlers[sha_str] = (sha_handler, sid) if self.listener is None: self.listener = Socks5Listener(self.idlequeue, port, fp, - fingerprint=fingerprint) + fingerprint=fingerprint) self.listener.queue = self self.listener.bind() if self.listener.started is False: self.listener = None # We cannot bind port, call error callback and fail self.error_cb(_('Unable to bind to port %s.') % port, - _('Maybe you have another running instance of Gajim. File ' - 'Transfer will be cancelled.')) + _('Maybe you have another running instance of Gajim. File ' + 'Transfer will be cancelled.')) return None self.connected += 1 return self.listener @@ -132,7 +132,7 @@ self.on_failure[sid] = on_failure file_props = self.files_props[account][sid] file_props['failure_cb'] = on_failure - + # add streamhosts to the queue for streamhost in file_props['streamhosts']: if 'type' in streamhost and streamhost['type'] == 'proxy': @@ -142,19 +142,17 @@ if receiving: self.type = 'receiver' socks5obj = Socks5Receiver(self.idlequeue, streamhost, sid, - 'client', file_props, - fingerprint=fp) + 'client', file_props, fingerprint=fp) self.add_sockobj(account, socks5obj) - else: + else: self.type = 'sender' - socks5obj = Socks5Sender(self.idlequeue, - file_props['sha_str'], self, mode='client' , - _sock=None, host=str(streamhost['host']), - port=int(streamhost['port']), fingerprint=fp, - connected=False, file_props=file_props) + socks5obj = Socks5Sender(self.idlequeue, file_props['sha_str'], + self, mode='client' , _sock=None, + host=str(streamhost['host']), port=int(streamhost['port']), + fingerprint=fp, connected=False, file_props=file_props) socks5obj.streamhost = streamhost self.add_sockobj(account, socks5obj, type='sender') - + streamhost['idx'] = socks5obj.queue_idx def _socket_connected(self, streamhost, file_props): @@ -206,7 +204,7 @@ # FIXME: make the sender reconnect also print 'reconnecting using socks receiver' client = Socks5Receiver(self.idlequeue, host, host['sid'], - 'client',file_props) + 'client',file_props) self.add_sockobj(client.account, client) host['idx'] = client.queue_idx # we still have chances to connect @@ -235,7 +233,7 @@ # failure_cb exists - this means that it has never been called if 'failure_cb' in file_props and file_props['failure_cb']: file_props['failure_cb'](streamhost['initiator'], None, - file_props['sid'], code = 404) + file_props['sid'], code = 404) del(file_props['failure_cb']) def add_sockobj(self, account, sockobj, type='receiver'): @@ -264,9 +262,8 @@ Adds the sockobj to the current list of sockobjects ''' keys = (fp['sid'], fp['name'], hash) - sockobjects[keys] = sockobj - - + sockobjects[keys] = sockobj + def result_sha(self, sha_str, idx): if sha_str in self.sha_handlers: props = self.sha_handlers[sha_str] @@ -303,8 +300,8 @@ def send_file(self, file_props, account, type): for key in self.senders.keys(): if file_props['name'] in key and file_props['sid'] in key \ - and self.senders[key].mode == type: - + and self.senders[key].mode == type: + log.info("socks5: sending file") sender = self.senders[key] file_props['streamhost-used'] = True @@ -318,7 +315,6 @@ file_props['last-time'] = self.idlequeue.current_time() file_props['received-len'] = 0 sender.file_props = file_props - def add_file_props(self, account, file_props): """ @@ -354,7 +350,7 @@ if sid in fl_props: return fl_props[sid] return None - + def isHashInSockObjs(self, sockobjs, hash): ''' It tells wether there is a particular hash in sockobjs or not @@ -367,16 +363,16 @@ def on_connection_accepted(self, sock, listener): sock_hash = sock.__hash__() if self.type == 'sender' and \ - not self.isHashInSockObjs(self.senders, sock_hash): - - sockobj = Socks5Sender(self.idlequeue, sock_hash, self, - 'server', sock[0], sock[1][0], sock[1][1], - fingerprint='server', file_props=listener.file_props) + not self.isHashInSockObjs(self.senders, sock_hash): + + sockobj = Socks5Sender(self.idlequeue, sock_hash, self, 'server', + sock[0], sock[1][0], sock[1][1], fingerprint='server', + file_props=listener.file_props) self._add(sockobj, self.senders, listener.file_props, sock_hash) # Start waiting for data self.idlequeue.plug_idle(sockobj, False, True) self.connected += 1 - + if self.type == 'receiver' and \ not self.isHashInSockObjs(self.readers, sock_hash): sh = {} @@ -384,19 +380,18 @@ sh['port'] = sock[1][1] sh['initiator'] = None sh['target'] = None - - sockobj = Socks5Receiver(idlequeue=self.idlequeue, - streamhost=sh,sid=None, - file_props=listener.file_props, - mode='server',fingerprint='server') - + + sockobj = Socks5Receiver(idlequeue=self.idlequeue, + streamhost=sh,sid=None, file_props=listener.file_props, + mode='server',fingerprint='server') + self._add(sockobj, self.readers, listener.file_props, sock_hash) - + sockobj.set_sock(sock[0]) sockobj.queue = self self.connected += 1 - - + + def process_result(self, result, actor): """ Take appropriate actions upon the result: @@ -461,7 +456,7 @@ try: self.host = host self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, - socket.SOCK_STREAM) + socket.SOCK_STREAM) except socket.gaierror: self.ais = None self.idlequeue = idlequeue @@ -485,12 +480,12 @@ Must be implemented by subclass. """ pass - + def _is_connected(self): if self.state < 5: return False return True - + def connect(self): """ Create the socket and plug it to the idlequeue @@ -532,8 +527,8 @@ errnum = ee[0] self.connect_timeout += 1 if errnum == 111 or self.connect_timeout > 1000: - self.queue._connection_refused(self.streamhost, - self.file_props, self.queue_idx) + self.queue._connection_refused(self.streamhost, self.file_props, + self.queue_idx) self.connected = False return None # win32 needs this @@ -554,7 +549,7 @@ self.queue._socket_connected(self.streamhost, self.file_props) self.idlequeue.plug_idle(self, True, False) return 1 # we are connected - + def svr_main(self): """ Initial requests for verifying the connection @@ -575,7 +570,7 @@ # unplug & plug for writing self.idlequeue.plug_idle(self, True, False) return None - + def clnt_main(self, timeout=0): """ Begin negotiation. on success 'address' != 0 @@ -615,7 +610,7 @@ self.state = 5 # for senders: init file_props and send '\n' if self.queue.on_success: result = self.queue.send_success_reply(self.file_props, - self.streamhost) + self.streamhost) if result == 0: self.state = 8 @@ -641,7 +636,7 @@ else: # receiving file contents from socket self.idlequeue.plug_idle(self, False, True) - + self.file_props['continue_cb'] = self.continue_paused_transfer # we have set up the connection, next - retrieve file self.state = 6 @@ -649,13 +644,13 @@ self.idlequeue.plug_idle(self, True, False) self.state += 1 return None - + def pollout(self): if self.mode == 'client': self.clnt_pollout() elif self.mode == 'server': self.svr_pollout() - + def svr_pollout(self): if not self.connected: self.disconnect() @@ -685,7 +680,7 @@ self.state += 1 # unplug and plug this time for reading self.idlequeue.plug_idle(self, False, True) - + def clnt_pollout(self): self.idlequeue.remove_timeout(self.fd) try: @@ -700,26 +695,25 @@ if self.file_props['paused']: self.idlequeue.plug_idle(self, False, False) return - result = self.start_transfer() # send + result = self.start_transfer() # send self.queue.process_result(result, self) return except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError), e: log.info('caught SSL exception, ignored') return self.state += 1 # unplug and plug for reading self.idlequeue.plug_idle(self, False, True) self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) - -
1
0
0
0
gajim: stop installing files in $PREFIX/share/doc/gajim/. It's p...
by Yann Leboulanger
23 Aug '11
23 Aug '11
changeset 0caab448976f in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=0caab448976f
description: stop installing files in $PREFIX/share/doc/gajim/. It's packagers's job diffstat: Makefile.am | 9 --------- 1 files changed, 0 insertions(+), 9 deletions(-) diffs (19 lines): diff -r 1c08475e5219 -r 0caab448976f Makefile.am --- a/Makefile.am Mon Aug 22 13:45:29 2011 +0200 +++ b/Makefile.am Tue Aug 23 13:07:58 2011 +0200 @@ -4,15 +4,6 @@ bin_SCRIPTS = scripts/gajim scripts/gajim-history-manager scripts/gajim-remote -docfilesdir = $(docdir) -docfiles_DATA = README \ - README.html \ - ChangeLog \ - COPYING \ - THANKS \ - THANKS.artists \ - AUTHORS - EXTRA_DIST = \ $(docfiles_DATA) \ autogen.sh \
1
0
0
0
gajim: fix candidate priority
by Jefry Lagrange
23 Aug '11
23 Aug '11
changeset 83a02c001360 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=83a02c001360
description: fix candidate priority diffstat: src/common/jingle_ft.py | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diffs (20 lines): diff -r 7bd5fde68a03 -r 83a02c001360 src/common/jingle_ft.py --- a/src/common/jingle_ft.py Sun Aug 21 19:02:58 2011 -0400 +++ b/src/common/jingle_ft.py Mon Aug 22 23:57:29 2011 -0400 @@ -356,7 +356,7 @@ our_pr = int(self.nominated_cand['our-cand']['priority']) if peer_pr != our_pr: - return peer_pr > our_pr + return our_pr > peer_pr else: return self.weinitiate @@ -373,7 +373,6 @@ else: type = 'server' - print type # FIXME if streamhost_used is none where do we get the proxy host if streamhost_used and streamhost_used['type'] == 'proxy': self.file_props['streamhost-used'] = True
1
0
0
0
gajim: follow RFC-6120 section 6.4.4: send <abord> and a SASL au...
by Yann Leboulanger
22 Aug '11
22 Aug '11
changeset 1c08475e5219 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=1c08475e5219
description: follow RFC-6120 section 6.4.4: send <abord> and a SASL authentication mechanism fails, wait for server <failure> reply before trying a new mechanism diffstat: src/common/xmpp/auth_nb.py | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diffs (46 lines): diff -r 7b8f90cf9cf7 -r 1c08475e5219 src/common/xmpp/auth_nb.py --- a/src/common/xmpp/auth_nb.py Mon Aug 22 12:31:24 2011 +0200 +++ b/src/common/xmpp/auth_nb.py Mon Aug 22 13:45:29 2011 +0200 @@ -49,6 +49,7 @@ GSS_STATE_STEP = 0 GSS_STATE_WRAP = 1 +SASL_FAILURE_IN_PROGRESS = 'failure-in-process' SASL_FAILURE = 'failure' SASL_SUCCESS = 'success' SASL_UNSUPPORTED = 'not-supported' @@ -285,15 +286,20 @@ ### Handle Auth result def on_auth_fail(reason): log.info('Failed SASL authentification: %s' % reason) + self._owner.send(str(Node('abort', attrs={'xmlns': NS_SASL}))) if len(self.mecs) > 0: - # There are other mechanisms to test - self.MechanismHandler() + # There are other mechanisms to test, but wait for <failure> + # answer from server + self.startsasl = SASL_FAILURE_IN_PROGRESS raise NodeProcessed if self.on_sasl: self.on_sasl() raise NodeProcessed if challenge.getName() == 'failure': + if self.startsasl == SASL_FAILURE_IN_PROGRESS: + self.MechanismHandler() + raise NodeProcessed self.startsasl = SASL_FAILURE try: reason = challenge.getChildren()[0] @@ -666,9 +672,9 @@ if self.supports_sm: # starts negociation sm.set_owner(self._owner) - sm.negociate() + sm.negociate() self._owner.Dispatcher.sm = sm - + if hasattr(self, 'session') and self.session == -1: # Server don't want us to initialize a session log.info('No session required.')
1
0
0
0
gajim: fix chat tab finding when we get a pm
by Yann Leboulanger
22 Aug '11
22 Aug '11
changeset 7b8f90cf9cf7 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=7b8f90cf9cf7
description: fix chat tab finding when we get a pm diffstat: src/message_window.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (20 lines): diff -r ceb45ebd484e -r 7b8f90cf9cf7 src/message_window.py --- a/src/message_window.py Mon Aug 22 09:45:51 2011 +0200 +++ b/src/message_window.py Mon Aug 22 12:31:24 2011 +0200 @@ -1096,14 +1096,14 @@ """ fjid = jid if resource: - jid += '/' + resource + fjid += '/' + resource ctrl = self.get_control(fjid, account) if ctrl: return ctrl win = self.get_window(jid, account) if win: ctrl = win.get_control(jid, account) - if not ctrl.resource: + if not ctrl.resource and ctrl.type_id != message_control.TYPE_GC: return ctrl return None
1
0
0
0
gajim: merge XEP-0198 implementation from gajim-XEP-198 branch t...
by Yann Leboulanger
22 Aug '11
22 Aug '11
changeset ceb45ebd484e in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=ceb45ebd484e
description: merge XEP-0198 implementation from gajim-XEP-198 branch to trunk. Thanks Jefry for your work during GSOC diffstat: src/common/connection.py | 42 +++++++++-- src/common/xmpp/__init__.py | 1 + src/common/xmpp/auth_nb.py | 113 ++++++++++++++++++++------------ src/common/xmpp/client_nb.py | 11 ++- src/common/xmpp/dispatcher_nb.py | 17 ++++ src/common/xmpp/protocol.py | 29 ++++++++ src/common/xmpp/smacks.py | 129 +++++++++++++++++++++++++++++++++++++ test/unit/test_xmpp_smacks.py | 133 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 424 insertions(+), 51 deletions(-) diffs (truncated from 797 to 300 lines): diff -r b1153c146cfa -r ceb45ebd484e src/common/connection.py --- a/src/common/connection.py Mon Aug 22 09:10:50 2011 +0200 +++ b/src/common/connection.py Mon Aug 22 09:45:51 2011 +0200 @@ -57,9 +57,9 @@ from common import gpg from common import passwords from common import exceptions - from connection_handlers import * +from xmpp import Smacks from string import Template import logging log = logging.getLogger('gajim.c.connection') @@ -717,6 +717,9 @@ self.privacy_rules_requested = False self.streamError = '' self.secret_hmac = str(random.random())[2:] + + self.sm = Smacks(self) # Stream Management + gajim.ged.register_event_handler('privacy-list-received', ged.CORE, self._nec_privacy_list_received) gajim.ged.register_event_handler('agent-info-error-received', ged.CORE, @@ -780,6 +783,8 @@ self.connected = 0 self.time_to_reconnect = None self.privacy_rules_supported = False + if on_purpose: + self.sm = Smacks(self) if self.connection: # make sure previous connection is completely closed gajim.proxy65_manager.disconnect(self.connection) @@ -788,6 +793,15 @@ self.connection.disconnect() self.last_connection = None self.connection = None + def set_oldst(self): # Set old state + if self.old_show: + self.connected = gajim.SHOW_LIST.index(self.old_show) + gajim.nec.push_incoming_event(OurShowEvent(None, conn=self, + show=self.connected)) + else: # we default to online + self.connected = 2 + gajim.nec.push_incoming_event(OurShowEvent(None, conn=self, + show=gajim.SHOW_LIST[self.connected])) def _disconnectedReconnCB(self): """ @@ -800,8 +814,9 @@ self.old_show = gajim.SHOW_LIST[self.connected] self.connected = 0 if not self.on_purpose: - gajim.nec.push_incoming_event(OurShowEvent(None, conn=self, - show='offline')) + if not (self.sm and self.sm.resumption): + gajim.nec.push_incoming_event(OurShowEvent(None, conn=self, + show='offline')) self.disconnect() if gajim.config.get_per('accounts', self.name, 'autoreconnect'): self.connected = -1 @@ -989,7 +1004,14 @@ if self.connection: return self.connection, '' - if data: + if self.sm.resuming and self.sm.location: + # If resuming and server gave a location, connect from there + hostname = self.sm.location + self.try_connecting_for_foo_secs = gajim.config.get_per('accounts', + self.name, 'try_connecting_for_foo_secs') + use_custom = False + + elif data: hostname = data['hostname'] self.try_connecting_for_foo_secs = 45 p = data['proxy'] @@ -1607,12 +1629,16 @@ self.connection.set_send_timeout2(self.pingalives, self.sendPing) self.connection.onreceive(None) - self.request_message_archiving_preferences() + self.privacy_rules_requested = False - self.privacy_rules_requested = False - self.discoverInfo(gajim.config.get_per('accounts', self.name, 'hostname'), - id_prefix='Gajim_') + # If we are not resuming, we ask for discovery info + # and archiving preferences + if not self.sm.resuming: + self.request_message_archiving_preferences() + self.discoverInfo(gajim.config.get_per('accounts', self.name, + 'hostname'), id_prefix='Gajim_') + self.sm.resuming = False # back to previous state # Discover Stun server(s) gajim.resolver.resolve('_stun._udp.' + helpers.idn_to_ascii( self.connected_hostname), self._on_stun_resolved) diff -r b1153c146cfa -r ceb45ebd484e src/common/xmpp/__init__.py --- a/src/common/xmpp/__init__.py Mon Aug 22 09:10:50 2011 +0200 +++ b/src/common/xmpp/__init__.py Mon Aug 22 09:45:51 2011 +0200 @@ -15,3 +15,4 @@ import dispatcher_nb, features_nb, idlequeue, bosh, tls_nb, proxy_connectors from client_nb import NonBlockingClient from plugin import PlugIn +from smacks import Smacks diff -r b1153c146cfa -r ceb45ebd484e src/common/xmpp/auth_nb.py --- a/src/common/xmpp/auth_nb.py Mon Aug 22 09:10:50 2011 +0200 +++ b/src/common/xmpp/auth_nb.py Mon Aug 22 09:45:51 2011 +0200 @@ -22,8 +22,10 @@ """ from protocol import NS_SASL, NS_SESSION, NS_STREAMS, NS_BIND, NS_AUTH +from protocol import NS_STREAM_MGMT from protocol import Node, NodeProcessed, isResultNode, Iq, Protocol, JID from plugin import PlugIn +from smacks import Smacks import base64 import random import itertools @@ -142,7 +144,7 @@ elif self._owner.Dispatcher.Stream.features: try: self.FeaturesHandler(self._owner.Dispatcher, - self._owner.Dispatcher.Stream.features) + self._owner.Dispatcher.Stream.features) except NodeProcessed: pass else: @@ -154,16 +156,16 @@ """ if 'features' in self._owner.__dict__: self._owner.UnregisterHandler('features', self.FeaturesHandler, - xmlns=NS_STREAMS) + xmlns=NS_STREAMS) if 'challenge' in self._owner.__dict__: self._owner.UnregisterHandler('challenge', self.SASLHandler, - xmlns=NS_SASL) + xmlns=NS_SASL) if 'failure' in self._owner.__dict__: self._owner.UnregisterHandler('failure', self.SASLHandler, - xmlns=NS_SASL) + xmlns=NS_SASL) if 'success' in self._owner.__dict__: self._owner.UnregisterHandler('success', self.SASLHandler, - xmlns=NS_SASL) + xmlns=NS_SASL) def auth(self): """ @@ -178,12 +180,12 @@ elif self._owner.Dispatcher.Stream.features: try: self.FeaturesHandler(self._owner.Dispatcher, - self._owner.Dispatcher.Stream.features) + self._owner.Dispatcher.Stream.features) except NodeProcessed: pass else: self._owner.RegisterHandler('features', - self.FeaturesHandler, xmlns=NS_STREAMS) + self.FeaturesHandler, xmlns=NS_STREAMS) def FeaturesHandler(self, conn, feats): """ @@ -198,7 +200,8 @@ 'mechanism'): self.mecs.append(mec.getData()) - self._owner.RegisterHandler('challenge', self.SASLHandler, xmlns=NS_SASL) + self._owner.RegisterHandler('challenge', self.SASLHandler, + xmlns=NS_SASL) self._owner.RegisterHandler('failure', self.SASLHandler, xmlns=NS_SASL) self._owner.RegisterHandler('success', self.SASLHandler, xmlns=NS_SASL) self.MechanismHandler() @@ -206,7 +209,8 @@ def MechanismHandler(self): if 'ANONYMOUS' in self.mecs and self.username is None: self.mecs.remove('ANONYMOUS') - node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'ANONYMOUS'}) + node = Node('auth', attrs={'xmlns': NS_SASL, + 'mechanism': 'ANONYMOUS'}) self.mechanism = 'ANONYMOUS' self.startsasl = SASL_IN_PROCESS self._owner.send(str(node)) @@ -226,11 +230,11 @@ self.mecs.remove('GSSAPI') try: self.gss_vc = kerberos.authGSSClientInit('xmpp@' + \ - self._owner.xmpp_hostname)[1] + self._owner.xmpp_hostname)[1] kerberos.authGSSClientStep(self.gss_vc, '') response = kerberos.authGSSClientResponse(self.gss_vc) - node=Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'GSSAPI'}, - payload=(response or '')) + node=Node('auth', attrs={'xmlns': NS_SASL, + 'mechanism': 'GSSAPI'}, payload=(response or '')) self.mechanism = 'GSSAPI' self.gss_step = GSS_STATE_STEP self.startsasl = SASL_IN_PROCESS @@ -247,7 +251,8 @@ raise NodeProcessed if 'DIGEST-MD5' in self.mecs: self.mecs.remove('DIGEST-MD5') - node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'DIGEST-MD5'}) + node = Node('auth', attrs={'xmlns': NS_SASL, + 'mechanism': 'DIGEST-MD5'}) self.mechanism = 'DIGEST-MD5' self.startsasl = SASL_IN_PROCESS self._owner.send(str(node)) @@ -307,13 +312,13 @@ handlers = self._owner.Dispatcher.dumpHandlers() # Bosh specific dispatcher replugging - # save old features. They will be used in case we won't get response on - # stream restart after SASL auth (happens with XMPP over BOSH with - # Openfire) + # save old features. They will be used in case we won't get response + # on stream restart after SASL auth (happens with XMPP over BOSH + # with Openfire) old_features = self._owner.Dispatcher.Stream.features self._owner.Dispatcher.PlugOut() dispatcher_nb.Dispatcher.get_instance().PlugIn(self._owner, - after_SASL=True, old_features=old_features) + after_SASL=True, old_features=old_features) self._owner.Dispatcher.restoreHandlers(handlers) self._owner.User = self.username @@ -333,12 +338,12 @@ rc = kerberos.authGSSClientUnwrap(self.gss_vc, incoming_data) response = kerberos.authGSSClientResponse(self.gss_vc) rc = kerberos.authGSSClientWrap(self.gss_vc, response, - kerberos.authGSSClientUserName(self.gss_vc)) + kerberos.authGSSClientUserName(self.gss_vc)) response = kerberos.authGSSClientResponse(self.gss_vc) if not response: response = '' self._owner.send(Node('response', attrs={'xmlns': NS_SASL}, - payload=response).__str__()) + payload=response).__str__()) raise NodeProcessed if self.mechanism == 'SCRAM-SHA-1': hashfn = hashlib.sha1 @@ -416,8 +421,8 @@ else: self.resp['realm'] = self._owner.Server self.resp['nonce'] = chal['nonce'] - self.resp['cnonce'] = ''.join("%x" % randint(0, 2**28) for randint in - itertools.repeat(random.randint, 7)) + self.resp['cnonce'] = ''.join("%x" % randint(0, 2**28) for randint \ + in itertools.repeat(random.randint, 7)) self.resp['nc'] = ('00000001') self.resp['qop'] = 'auth' self.resp['digest-uri'] = 'xmpp/' + self._owner.Server @@ -477,14 +482,15 @@ else: sasl_data += u'%s="%s",' % (key, self.resp[key]) sasl_data = sasl_data[:-1].encode('utf-8').encode('base64').replace( - '\r', '').replace('\n', '') - node = Node('response', attrs={'xmlns':NS_SASL}, payload=[sasl_data]) + '\r', '').replace('\n', '') + node = Node('response', attrs={'xmlns': NS_SASL}, + payload=[sasl_data]) elif self.mechanism == 'PLAIN': sasl_data = u'\x00%s\x00%s' % (self.username, self.password) sasl_data = sasl_data.encode('utf-8').encode('base64').replace( - '\n', '') + '\n', '') node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'PLAIN'}, - payload=[sasl_data]) + payload=[sasl_data]) self._owner.send(str(node)) @@ -516,8 +522,8 @@ self.owner = owner owner.Dispatcher.SendAndWaitForResponse( - Iq('get', NS_AUTH, payload=[Node('username', payload=[self.user])]), - func=self._on_username) + Iq('get', NS_AUTH, payload=[Node('username', payload=[self.user])]), + func=self._on_username) def _on_username(self, resp): if not isResultNode(resp): @@ -532,8 +538,8 @@ if query.getTag('digest'): log.info("Performing digest authentication") query.setTagData('digest', - hashlib.sha1(self.owner.Dispatcher.Stream._document_attrs['id'] - + self.password).hexdigest()) + hashlib.sha1(self.owner.Dispatcher.Stream._document_attrs['id'] + + self.password).hexdigest()) if query.getTag('password'): query.delChild('password') self._method = 'digest' @@ -548,23 +554,25 @@ def hash_n_times(s, count): return count and hasher(hash_n_times(s, count-1)) or s
1
0
0
0
gajim: fix typo
by Yann Leboulanger
22 Aug '11
22 Aug '11
changeset b1153c146cfa in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=b1153c146cfa
description: fix typo diffstat: src/common/xmpp/auth_nb.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r 80d2f71e364c -r b1153c146cfa src/common/xmpp/auth_nb.py --- a/src/common/xmpp/auth_nb.py Sun Aug 21 23:14:11 2011 +0200 +++ b/src/common/xmpp/auth_nb.py Mon Aug 22 09:10:50 2011 +0200 @@ -427,7 +427,7 @@ elif 'rspauth' in chal: # Check rspauth value if chal['rspauth'] != self.digest_rspauth: - on_auth_fail('rspauth is wrong'): + on_auth_fail('rspauth is wrong') self._owner.send(str(Node('response', attrs={'xmlns':NS_SASL}))) else: self.startsasl = SASL_FAILURE
1
0
0
0
gajim: connect to candidate with highest priority
by Jefry Lagrange
21 Aug '11
21 Aug '11
changeset 7bd5fde68a03 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=7bd5fde68a03
description: connect to candidate with highest priority diffstat: src/common/jingle_ft.py | 30 ++--- src/common/socks5.py | 210 ++++++++++++++++++++++++++++------------------- 2 files changed, 137 insertions(+), 103 deletions(-) diffs (truncated from 385 to 300 lines): diff -r 85fc19efaa78 -r 7bd5fde68a03 src/common/jingle_ft.py --- a/src/common/jingle_ft.py Mon Aug 15 12:16:17 2011 -0400 +++ b/src/common/jingle_ft.py Sun Aug 21 19:02:58 2011 -0400 @@ -342,6 +342,10 @@ # send error message, notify the user return def isOurCandUsed(self): + ''' + If this method returns true then the candidate we nominated will be + used, if false, the candidate nominated by peer will be used + ''' if self.nominated_cand['peer-cand'] == False: return True @@ -352,32 +356,24 @@ our_pr = int(self.nominated_cand['our-cand']['priority']) if peer_pr != our_pr: - if peer_pr > our_pr: - # Choose peer host - return False - else: - # Choose our host - return True + return peer_pr > our_pr else: - if self.weinitiate: - # Choose our host - return True - else: - # Choose peer host - return False - + return self.weinitiate def start_transfer(self, streamhost_used): self.state = STATE_TRANSFERING + # It tells wether we start the transfer as client or server + type = None + if self.isOurCandUsed(): - print 'our' + type = 'client' else: - print 'peer' + type = 'server' - + print type # FIXME if streamhost_used is none where do we get the proxy host if streamhost_used and streamhost_used['type'] == 'proxy': self.file_props['streamhost-used'] = True @@ -401,7 +397,7 @@ else: jid = gajim.get_jid_without_resource(self.session.ourjid) gajim.socks5queue.send_file(self.file_props, - self.session.connection.name) + self.session.connection.name, type) def get_content(desc): return JingleFileTransfer diff -r 85fc19efaa78 -r 7bd5fde68a03 src/common/socks5.py --- a/src/common/socks5.py Mon Aug 15 12:16:17 2011 -0400 +++ b/src/common/socks5.py Sun Aug 21 19:02:58 2011 -0400 @@ -152,11 +152,9 @@ _sock=None, host=str(streamhost['host']), port=int(streamhost['port']), fingerprint=fp, connected=False, file_props=file_props) - #socks5obj.file_props = file_props socks5obj.streamhost = streamhost self.add_sockobj(account, socks5obj, type='sender') - socks5obj.file_props = file_props streamhost['idx'] = socks5obj.queue_idx def _socket_connected(self, streamhost, file_props): @@ -242,12 +240,13 @@ def add_sockobj(self, account, sockobj, type='receiver'): """ - Add new file a sockobj type receiver or sendder + Add new file a sockobj type receiver or sender, and use it to connect + to server """ if type == 'receiver': - self.readers[self.idx] = sockobj + self._add(sockobj, self.readers, sockobj.file_props, self.idx) else: - self.senders[self.idx] = sockobj + self._add(sockobj, self.senders, sockobj.file_props, self.idx) sockobj.queue_idx = self.idx sockobj.queue = self sockobj.account = account @@ -260,57 +259,66 @@ return 1 return None - + def _add(self, sockobj, sockobjects, fp, hash): + ''' + Adds the sockobj to the current list of sockobjects + ''' + keys = (fp['sid'], fp['name'], hash) + sockobjects[keys] = sockobj + + def result_sha(self, sha_str, idx): if sha_str in self.sha_handlers: props = self.sha_handlers[sha_str] props[0](props[1], idx) def activate_proxy(self, idx): - if idx not in self.readers: + if not self.isHashInSockObjs(self.readers, idx): return - reader = self.readers[idx] - if reader.file_props['type'] != 's': - return - if reader.state != 5: - return - reader.state = 6 - if reader.connected: - reader.file_props['error'] = 0 - reader.file_props['disconnect_cb'] = reader.disconnect - reader.file_props['started'] = True - reader.file_props['completed'] = False - reader.file_props['paused'] = False - reader.file_props['stalled'] = False - reader.file_props['elapsed-time'] = 0 - reader.file_props['last-time'] = self.idlequeue.current_time() - reader.file_props['received-len'] = 0 - reader.pauses = 0 - # start sending file to proxy - self.idlequeue.set_read_timeout(reader.fd, STALLED_TIMEOUT) - self.idlequeue.plug_idle(reader, True, False) - result = reader.write_next() - self.process_result(result, reader) + for key in self.readers.keys(): + if idx in key: + reader = self.readers[key] + if reader.file_props['type'] != 's': + return + if reader.state != 5: + return + reader.state = 6 + if reader.connected: + reader.file_props['error'] = 0 + reader.file_props['disconnect_cb'] = reader.disconnect + reader.file_props['started'] = True + reader.file_props['completed'] = False + reader.file_props['paused'] = False + reader.file_props['stalled'] = False + reader.file_props['elapsed-time'] = 0 + reader.file_props['last-time'] = self.idlequeue.current_time() + reader.file_props['received-len'] = 0 + reader.pauses = 0 + # start sending file to proxy + self.idlequeue.set_read_timeout(reader.fd, STALLED_TIMEOUT) + self.idlequeue.plug_idle(reader, True, False) + result = reader.write_next() + self.process_result(result, reader) - def send_file(self, file_props, account): - if 'hash' in file_props and file_props['hash'] in self.senders: - log.info("socks5: sending file") - sender = self.senders[file_props['hash']] - file_props['streamhost-used'] = True - sender.account = account - if file_props['type'] == 's': - sender.file_props = file_props - result = sender.send_file() - self.process_result(result, sender) - else: - file_props['elapsed-time'] = 0 - file_props['last-time'] = self.idlequeue.current_time() - file_props['received-len'] = 0 - sender.file_props = file_props + def send_file(self, file_props, account, type): + for key in self.senders.keys(): + if file_props['name'] in key and file_props['sid'] in key \ + and self.senders[key].mode == type: + + log.info("socks5: sending file") + sender = self.senders[key] + file_props['streamhost-used'] = True + sender.account = account + if file_props['type'] == 's': + sender.file_props = file_props + result = sender.send_file() + self.process_result(result, sender) + else: + file_props['elapsed-time'] = 0 + file_props['last-time'] = self.idlequeue.current_time() + file_props['received-len'] = 0 + sender.file_props = file_props - else: - - log.info("socks5: NOT sending file") def add_file_props(self, account, file_props): """ @@ -346,30 +354,49 @@ if sid in fl_props: return fl_props[sid] return None + + def isHashInSockObjs(self, sockobjs, hash): + ''' + It tells wether there is a particular hash in sockobjs or not + ''' + for key in sockobjs: + if hash in key: + return True + return False def on_connection_accepted(self, sock, listener): sock_hash = sock.__hash__() - if self.type == 'sender' and (sock_hash not in self.senders): - self.senders[sock_hash] = Socks5Sender(self.idlequeue, sock_hash, self, - 'server', sock[0], sock[1][0], sock[1][1], - fingerprint='server', file_props=listener.file_props) + if self.type == 'sender' and \ + not self.isHashInSockObjs(self.senders, sock_hash): + + sockobj = Socks5Sender(self.idlequeue, sock_hash, self, + 'server', sock[0], sock[1][0], sock[1][1], + fingerprint='server', file_props=listener.file_props) + self._add(sockobj, self.senders, listener.file_props, sock_hash) # Start waiting for data - self.idlequeue.plug_idle(self.senders[sock_hash], False, True) + self.idlequeue.plug_idle(sockobj, False, True) self.connected += 1 - if self.type == 'receiver' and (sock_hash not in self.readers): + if self.type == 'receiver' and \ + not self.isHashInSockObjs(self.readers, sock_hash): sh = {} sh['host'] = sock[1][0] sh['port'] = sock[1][1] sh['initiator'] = None sh['target'] = None - self.readers[sock_hash] = Socks5Receiver(idlequeue=self.idlequeue, - streamhost=sh,sid=None, file_props=None, + + sockobj = Socks5Receiver(idlequeue=self.idlequeue, + streamhost=sh,sid=None, + file_props=listener.file_props, mode='server',fingerprint='server') - self.readers[sock_hash].set_sock(sock[0]) - self.readers[sock_hash].queue = self + + self._add(sockobj, self.readers, listener.file_props, sock_hash) + + sockobj.set_sock(sock[0]) + sockobj.queue = self self.connected += 1 + def process_result(self, result, actor): """ Take appropriate actions upon the result: @@ -393,16 +420,17 @@ connections with 1 """ if idx != -1: - if idx in self.readers: - reader = self.readers[idx] - self.idlequeue.unplug_idle(reader.fd) - self.idlequeue.remove_timeout(reader.fd) - if do_disconnect: - reader.disconnect() - else: - if reader.streamhost is not None: - reader.streamhost['state'] = -1 - del(self.readers[idx]) + for key in self.readers.keys(): + if idx in key: + reader = self.readers[key] + self.idlequeue.unplug_idle(reader.fd) + self.idlequeue.remove_timeout(reader.fd) + if do_disconnect: + reader.disconnect() + else: + if reader.streamhost is not None: + reader.streamhost['state'] = -1 + del(self.readers[key]) def remove_sender(self, idx, do_disconnect=True): """ @@ -410,17 +438,18 @@ connections with 1 """ if idx != -1: - if idx in self.senders: - sender = self.senders[idx] - if do_disconnect:
1
0
0
0
gajim: check DIGEST-MD% and SCRAM-SHA-1 latest answer from serve...
by Yann Leboulanger
21 Aug '11
21 Aug '11
changeset 80d2f71e364c in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=80d2f71e364c
description: check DIGEST-MD% and SCRAM-SHA-1 latest answer from server before accepting authentication. Fixes #6940 diffstat: src/common/xmpp/auth_nb.py | 51 +++++++++++++++++++++++++++++---------------- 1 files changed, 33 insertions(+), 18 deletions(-) diffs (108 lines): diff -r 6138d8484c77 -r 80d2f71e364c src/common/xmpp/auth_nb.py --- a/src/common/xmpp/auth_nb.py Sun Aug 21 23:13:25 2011 +0200 +++ b/src/common/xmpp/auth_nb.py Sun Aug 21 23:14:11 2011 +0200 @@ -271,13 +271,14 @@ """ if challenge.getNamespace() != NS_SASL: return + + def scram_base64(s): + return ''.join(s.encode('base64').split('\n')) + + incoming_data = challenge.getData() + data=base64.decodestring(incoming_data) ### Handle Auth result - if challenge.getName() == 'failure': - self.startsasl = SASL_FAILURE - try: - reason = challenge.getChildren()[0] - except Exception: - reason = challenge + def on_auth_fail(reason): log.info('Failed SASL authentification: %s' % reason) if len(self.mecs) > 0: # There are other mechanisms to test @@ -286,9 +287,21 @@ if self.on_sasl: self.on_sasl() raise NodeProcessed + + if challenge.getName() == 'failure': + self.startsasl = SASL_FAILURE + try: + reason = challenge.getChildren()[0] + except Exception: + reason = challenge + on_auth_fail(reason) elif challenge.getName() == 'success': - # TODO: Need to validate any data-with-success. - # TODO: Important for DIGEST-MD5 and SCRAM. + if self.mechanism == 'SCRAM-SHA-1': + # check data-with-success + data = scram_parse(data) + if data['v'] != scram_base64(self.scram_ServerSignature): + on_auth_fail('ServerSignature is wrong') + self.startsasl = SASL_SUCCESS log.info('Successfully authenticated with remote server.') handlers = self._owner.Dispatcher.dumpHandlers() @@ -309,8 +322,6 @@ raise NodeProcessed ### Perform auth step - incoming_data = challenge.getData() - data=base64.decodestring(incoming_data) log.info('Got challenge:' + data) if self.mechanism == 'GSSAPI': @@ -353,12 +364,9 @@ ui = XOR(ui, ui_1) return ui - def H(s): + def scram_H(s): return hashfn(s).digest() - def scram_base64(s): - return ''.join(s.encode('base64').split('\n')) - if self.scram_step == 0: self.scram_step = 1 self.scram_soup += ',' + data + ',' @@ -373,7 +381,7 @@ SaltedPassword = Hi(self.password, salt, iter) # TODO: Could cache this, along with salt+iter. ClientKey = HMAC(SaltedPassword, 'Client Key') - StoredKey = H(ClientKey) + StoredKey = scram_H(ClientKey) ClientSignature = HMAC(StoredKey, self.scram_soup) ClientProof = XOR(ClientKey, ClientSignature) r += ',p=' + scram_base64(ClientProof) @@ -417,6 +425,9 @@ # Password is now required self._owner._caller.get_password(self.set_password, self.mechanism) elif 'rspauth' in chal: + # Check rspauth value + if chal['rspauth'] != self.digest_rspauth: + on_auth_fail('rspauth is wrong'): self._owner.send(str(Node('response', attrs={'xmlns':NS_SASL}))) else: self.startsasl = SASL_FAILURE @@ -449,10 +460,14 @@ hash_realm = self._convert_to_iso88591(self.resp['realm']) hash_password = self._convert_to_iso88591(self.password) A1 = C([H(C([hash_username, hash_realm, hash_password])), - self.resp['nonce'], self.resp['cnonce']]) + self.resp['nonce'], self.resp['cnonce']]) A2 = C(['AUTHENTICATE', self.resp['digest-uri']]) - response= HH(C([HH(A1), self.resp['nonce'], self.resp['nc'], - self.resp['cnonce'], self.resp['qop'], HH(A2)])) + response = HH(C([HH(A1), self.resp['nonce'], self.resp['nc'], + self.resp['cnonce'], self.resp['qop'], HH(A2)])) + A2 = C(['', self.resp['digest-uri']]) + self.digest_rspauth = HH(C([HH(A1), self.resp['nonce'], + self.resp['nc'], self.resp['cnonce'], self.resp['qop'], + HH(A2)])) self.resp['response'] = response sasl_data = u'' for key in ('charset', 'username', 'realm', 'nonce', 'nc', 'cnonce',
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
9
10
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
Results per page:
10
25
50
100
200