Hello community, here is the log from the commit of package python-nbxmpp for openSUSE:Leap:15.2 checked in at 2020-02-04 17:59:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Leap:15.2/python-nbxmpp (Old) and /work/SRC/openSUSE:Leap:15.2/.python-nbxmpp.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-nbxmpp" Tue Feb 4 17:59:56 2020 rev:24 rq:769888 version:0.6.10 Changes: -------- --- /work/SRC/openSUSE:Leap:15.2/python-nbxmpp/python-nbxmpp.changes 2020-01-15 15:50:45.295505446 +0100 +++ /work/SRC/openSUSE:Leap:15.2/.python-nbxmpp.new.26092/python-nbxmpp.changes 2020-02-04 18:00:17.724962123 +0100 @@ -1,0 +2,27 @@ +Thu May 23 05:21:13 UTC 2019 - [email protected] + +- Update to 0.6.10: + * Add support for domain based name in features for GSSAPI + * Fix usage of BOSH + * Fix Jingle hash namespace + +------------------------------------------------------------------- +Thu Jan 31 07:51:28 UTC 2019 - [email protected] + +- Update to version 0.6.9 (boo#1123247): + * Always bind after SM failed Fixes #64 + * Dont try and guess system language + +------------------------------------------------------------------- +Mon Nov 19 12:42:07 UTC 2018 - [email protected] + +- Update to version 0.6.8 (changes since 0.6.6): + * Raise default TLS version to 1.2. + * Remove DIGEST-MD5 from the default auth mechs. + * Add STANZA RECEIVED Event (some servers send more than one + stanza in one packet). + * Add alternative locations to load TLS certs from. + * Reset SM counter after receiving <enabled>. + * Issue event when SM resume fails. + +------------------------------------------------------------------- Old: ---- nbxmpp-0.6.6.tar.gz New: ---- nbxmpp-0.6.10.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-nbxmpp.spec ++++++ --- /var/tmp/diff_new_pack.0hPbn8/_old 2020-02-04 18:00:18.424962546 +0100 +++ /var/tmp/diff_new_pack.0hPbn8/_new 2020-02-04 18:00:18.424962546 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-nbxmpp # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,12 +19,12 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define _name nbxmpp Name: python-nbxmpp -Version: 0.6.6 +Version: 0.6.10 Release: 0 Summary: XMPP library by Gajim team License: GPL-3.0-or-later Group: Development/Languages/Python -URL: https://python-nbxmpp.gajim.org/ +URL: https://dev.gajim.org/gajim/python-nbxmpp Source: https://files.pythonhosted.org/packages/source/n/%{_name}/%{_name}-%{version}.tar.gz BuildRequires: %{python_module setuptools} BuildRequires: fdupes @@ -33,8 +33,9 @@ %description Python-nbxmpp is a Python library that provides a way for Python -applications to use Jabber/XMPP networks in a non-blocking way. This -library is initialy a fork of xmpppy one, but using non-blocking sockets. +applications to use Jabber/XMPP networks in a non-blocking way. +This library is initialy a fork of xmpppy one, but using +non-blocking sockets. %python_subpackages ++++++ nbxmpp-0.6.6.tar.gz -> nbxmpp-0.6.10.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/ChangeLog new/nbxmpp-0.6.10/ChangeLog --- old/nbxmpp-0.6.6/ChangeLog 2018-05-19 20:52:45.000000000 +0200 +++ new/nbxmpp-0.6.10/ChangeLog 2019-02-18 20:51:20.000000000 +0100 @@ -1,3 +1,26 @@ +python-nbxmpp 0.6.10 (19 February 2019) + + * Add support for domain based name in features for GSSAPI + * Fix usage of BOSH + * Fix Jingle hash namespace + +python-nbxmpp 0.6.9 (10 January 2019) + + * Always bind after SM failed Fixes #64 + * Dont try and guess system language + +python-nbxmpp 0.6.8 (07 October 2018) + + * Reset SM counter after receiving <enabled> + * Issue event when SM resume fails + +python-nbxmpp 0.6.7 (19 August 2018) + + * Raise default TLS version to 1.2 + * Remove DIGEST-MD5 from the default auth mechs + * Add STANZA RECEIVED Event (Some servers send more than one stanza in one packet) + * Add alternative locations to load TLS certs from + python-nbxmpp 0.6.6 (20 May 2018) * Record all SSL errors instead of only the first diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/PKG-INFO new/nbxmpp-0.6.10/PKG-INFO --- old/nbxmpp-0.6.6/PKG-INFO 2018-05-19 20:56:31.000000000 +0200 +++ new/nbxmpp-0.6.10/PKG-INFO 2019-02-18 20:52:18.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: nbxmpp -Version: 0.6.6 +Version: 0.6.10 Summary: Non blocking Jabber/XMPP module Home-page: http://dev.gajim.org/gajim/python-nbxmpp Author: Yann Leboulanger diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/__init__.py new/nbxmpp-0.6.10/nbxmpp/__init__.py --- old/nbxmpp-0.6.6/nbxmpp/__init__.py 2018-05-19 20:52:45.000000000 +0200 +++ new/nbxmpp-0.6.10/nbxmpp/__init__.py 2019-02-18 20:51:20.000000000 +0100 @@ -17,4 +17,4 @@ from .plugin import PlugIn from .smacks import Smacks -__version__ = "0.6.6" +__version__ = "0.6.10" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/auth_nb.py new/nbxmpp-0.6.10/nbxmpp/auth_nb.py --- old/nbxmpp-0.6.6/nbxmpp/auth_nb.py 2018-03-17 17:37:47.000000000 +0100 +++ new/nbxmpp-0.6.10/nbxmpp/auth_nb.py 2019-02-18 20:51:20.000000000 +0100 @@ -24,7 +24,7 @@ from __future__ import unicode_literals from .protocol import NS_SASL, NS_SESSION, NS_STREAMS, NS_BIND, NS_AUTH -from .protocol import NS_STREAM_MGMT +from .protocol import NS_STREAM_MGMT, NS_DOMAIN_BASED_NAME from .protocol import Node, NodeProcessed, isResultNode, Iq, Protocol, JID from .plugin import PlugIn import sys @@ -96,7 +96,7 @@ SASL_AUTHENTICATION_MECHANISMS = \ set(['ANONYMOUS', 'EXTERNAL', 'GSSAPI', 'SCRAM-SHA-1-PLUS', 'SCRAM-SHA-1', - 'DIGEST-MD5', 'PLAIN', 'X-MESSENGER-OAUTH2']) + 'PLAIN', 'X-MESSENGER-OAUTH2']) class SASL(PlugIn): """ @@ -124,6 +124,7 @@ self.channel_binding = channel_binding self.enabled_auth_mechs = auth_mechs self.realm = None + self._domain_based_name = None def plugin(self, owner): if 'version' not in self._owner.Dispatcher.Stream._document_attrs: @@ -189,6 +190,10 @@ in feats.getTag('mechanisms', namespace=NS_SASL).getTags('mechanism') ) & self.enabled_auth_mechs + hostname = feats.getTag('hostname', namespace=NS_DOMAIN_BASED_NAME) + if hostname is not None: + self._domain_based_name = hostname.getData() + # Password based authentication mechanism ordered by strength. # If the server supports a mechanism disable all weaker mechanisms. password_auth_mechs_strength = ['SCRAM-SHA-1-PLUS', 'SCRAM-SHA-1', @@ -229,9 +234,9 @@ raise NodeProcessed if 'GSSAPI' in self.mecs and have_kerberos: self.mecs.remove('GSSAPI') + hostname = self._domain_based_name or self._owner.xmpp_hostname try: - self.gss_vc = kerberos.authGSSClientInit('xmpp@' + \ - self._owner.xmpp_hostname)[1] + self.gss_vc = kerberos.authGSSClientInit('xmpp@%s' % hostname)[1] kerberos.authGSSClientStep(self.gss_vc, '') response = kerberos.authGSSClientResponse(self.gss_vc) node=Node('auth', attrs={'xmlns': NS_SASL, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/bosh.py new/nbxmpp-0.6.10/nbxmpp/bosh.py --- old/nbxmpp-0.6.6/nbxmpp/bosh.py 2018-05-02 13:56:23.000000000 +0200 +++ new/nbxmpp-0.6.10/nbxmpp/bosh.py 2019-02-18 20:51:20.000000000 +0100 @@ -44,10 +44,6 @@ idlequeue, estabilish_tls, certs, tls_version, cipher_list) self.bosh_sid = None - if locale.getdefaultlocale()[0]: - self.bosh_xml_lang = locale.getdefaultlocale()[0].split('_')[0] - else: - self.bosh_xml_lang = 'en' self.http_version = 'HTTP/1.1' self.http_persistent = True @@ -416,7 +412,7 @@ t = BOSHBody( attrs={ 'to': self.bosh_to, 'sid': self.bosh_sid, - 'xml:lang': self.bosh_xml_lang, + 'xml:lang': self._owner.lang, 'xmpp:restart': 'true', 'secure': self.bosh_secure, 'xmlns:xmpp': 'urn:xmpp:xbosh'}) @@ -427,7 +423,7 @@ 'route': 'xmpp:%s:%s' % (self.route_host, self.route_port), 'to': self.bosh_to, 'wait': str(self.bosh_wait), - 'xml:lang': self.bosh_xml_lang, + 'xml:lang': self._owner.lang, 'xmpp:version': '1.0', 'ver': '1.6', 'xmlns:xmpp': 'urn:xmpp:xbosh'}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/client_nb.py new/nbxmpp-0.6.10/nbxmpp/client_nb.py --- old/nbxmpp-0.6.6/nbxmpp/client_nb.py 2018-05-19 20:52:45.000000000 +0200 +++ new/nbxmpp-0.6.10/nbxmpp/client_nb.py 2019-02-18 20:51:20.000000000 +0100 @@ -37,7 +37,7 @@ handling, whereas underlying modules take care of feature-specific logic """ - def __init__(self, domain, idlequeue, caller=None): + def __init__(self, domain, idlequeue, caller=None, lang='en'): """ Caches connection data @@ -48,6 +48,7 @@ """ self.Namespace = protocol.NS_CLIENT self.defaultNamespace = self.Namespace + self.lang = lang self.idlequeue = idlequeue self.disconnect_handlers = [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/dispatcher_nb.py new/nbxmpp-0.6.10/nbxmpp/dispatcher_nb.py --- old/nbxmpp-0.6.6/nbxmpp/dispatcher_nb.py 2018-01-27 21:32:42.000000000 +0100 +++ new/nbxmpp-0.6.10/nbxmpp/dispatcher_nb.py 2019-02-18 20:51:20.000000000 +0100 @@ -194,9 +194,7 @@ self._metastream.setAttr('version', '1.0') self._metastream.setAttr('xmlns:stream', NS_STREAMS) self._metastream.setAttr('to', self._owner.Server) - if locale.getdefaultlocale()[0]: - self._metastream.setAttr('xml:lang', - locale.getdefaultlocale()[0].split('_')[0]) + self._metastream.setAttr('xml:lang', self._owner.lang) self._owner.send("%s%s>" % (XML_DECLARATION, str(self._metastream)[:-2])) def _check_stream_start(self, ns, tag, attrs): @@ -417,6 +415,9 @@ #log.info('dispatch called: stanza = %s, session = %s, direct= %s' # % (stanza, session, direct)) + + self.Event('', 'STANZA RECEIVED', stanza) + if not session: session = self session.Stream._mini_dom = None @@ -434,21 +435,21 @@ # log.info('in dispatch, getting ns for %s, and the ns is %s' # % (stanza, xmlns)) if xmlns not in self.handlers: - log.warning("Unknown namespace: " + xmlns) + log.warning('Unknown namespace: %s', xmlns) xmlns = 'unknown' # features stanza has been handled before if name not in self.handlers[xmlns]: - if name != 'features': - log.warning("Unknown stanza: " + name) + if name not in ('features', 'stream'): + log.warning('Unknown stanza: %s', stanza) else: - log.debug("Got %s/%s stanza" % (xmlns, name)) - name='unknown' + log.debug('Got %s/%s stanza' % (xmlns, name)) + name = 'unknown' else: - log.debug("Got %s/%s stanza" % (xmlns, name)) + log.debug('Got %s/%s stanza' % (xmlns, name)) if stanza.__class__.__name__ == 'Node': # FIXME: this cannot work - stanza=self.handlers[xmlns][name][type](node=stanza) + stanza = self.handlers[xmlns][name][type](node=stanza) typ = stanza.getType() if not typ: @@ -456,6 +457,8 @@ stanza.props = stanza.getProperties() ID = stanza.getID() + log.debug('type: %s, properties: %s', typ, stanza.props) + # If server supports stream management if self.sm and self.sm.enabled and (stanza.getName() != 'r' and stanza.getName() != 'a' and stanza.getName() != 'enabled' and @@ -495,6 +498,7 @@ for handler in chain: if user or handler['system']: try: + log.debug('Call handler: %s', handler['func']) handler['func'](session, stanza) except Exception as typ: if typ.__class__.__name__ != 'NodeProcessed': @@ -617,9 +621,7 @@ self._metastream.setAttr('version', '1.0') self._metastream.setAttr('xmlns:stream', NS_STREAMS) self._metastream.setAttr('to', self._owner.Server) - if locale.getdefaultlocale()[0]: - self._metastream.setAttr('xml:lang', - locale.getdefaultlocale()[0].split('_')[0]) + self._metastream.setAttr('xml:lang', self._owner.lang) self.restart = True self._owner.Connection.send_init(after_SASL=self.after_SASL) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/protocol.py new/nbxmpp-0.6.10/nbxmpp/protocol.py --- old/nbxmpp-0.6.6/nbxmpp/protocol.py 2018-04-30 13:46:12.000000000 +0200 +++ new/nbxmpp-0.6.10/nbxmpp/protocol.py 2019-02-18 20:51:20.000000000 +0100 @@ -43,6 +43,8 @@ NS_ATTENTION = 'urn:xmpp:attention:0' # XEP-0224 NS_AUTH = 'jabber:iq:auth' NS_AVATAR = 'http://www.xmpp.org/extensions/xep-0084.html#ns-metadata' +NS_AVATAR_METADATA = 'urn:xmpp:avatar:metadata' # XEP-0084 +NS_AVATAR_DATA = 'urn:xmpp:avatar:data' # XEP-0084 NS_BIND = 'urn:ietf:params:xml:ns:xmpp-bind' NS_BLOCKING = 'urn:xmpp:blocking' # XEP-0191 NS_BOB = 'urn:xmpp:bob' # XEP-0231 @@ -188,6 +190,7 @@ NS_HASHES_BLAKE2B_256 = 'urn:xmpp:hash-function-text-names:id-blake2b256' NS_HASHES_BLAKE2B_512 = 'urn:xmpp:hash-function-text-names:id-blake2b512' NS_OPENPGP = 'urn:xmpp:openpgp:0' +NS_DOMAIN_BASED_NAME = 'urn:xmpp:domain-based-name:1' #xmpp_stream_error_conditions = ''' #bad-format -- -- -- The entity has sent XML that cannot be processed. @@ -1428,7 +1431,7 @@ supported = ('sha-256', 'sha-512', 'sha3-256', 'sha3-512', 'blake2b-256', 'blake2b-512') - def __init__(self, nsp=NS_HASHES): + def __init__(self, nsp=NS_HASHES_2): Node.__init__(self, None, {}, [], None, None, False, None) self.setNamespace(nsp) self.setName('hash') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/simplexml.py new/nbxmpp-0.6.10/nbxmpp/simplexml.py --- old/nbxmpp-0.6.6/nbxmpp/simplexml.py 2017-08-05 21:17:49.000000000 +0200 +++ new/nbxmpp-0.6.10/nbxmpp/simplexml.py 2019-02-18 20:51:20.000000000 +0100 @@ -634,6 +634,9 @@ self._document_attrs[attr] = val ns = self._document_nsp.get(nsp, 'http://www.gajim.org/xmlns/undeclared-root') try: + header = Node(tag=tag, attrs=attrs, + nsp=self._document_nsp, node_built=True) + self.dispatch(header) self.stream_header_received(ns, name, attrs) except ValueError as e: self._document_attrs = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/smacks.py new/nbxmpp-0.6.10/nbxmpp/smacks.py --- old/nbxmpp-0.6.6/nbxmpp/smacks.py 2018-01-27 21:32:42.000000000 +0100 +++ new/nbxmpp-0.6.10/nbxmpp/smacks.py 2019-02-18 20:51:20.000000000 +0100 @@ -50,6 +50,8 @@ def _neg_response(self, disp, stanza): r = stanza.getAttr('resume') + # When we receive enabled from the server, reset the IN count + self.in_h = 0 log.info("Session resumption: %s" % r) if r == 'true' or r == 'True' or r == '1': self.resumption = True @@ -182,42 +184,36 @@ self.old_uqueue = [] def error_handling(self, disp, stanza): - # If the server doesn't recognize previd, forget about resuming - # Ask for service discovery, etc.. - if stanza.getTag('item-not-found'): - self.resuming = False - self.enabled = False - # we need to bind a resource - self._owner.NonBlockingBind.resuming = False - self._owner._on_auth_bind(None) - self.failed_resume = True - - h = stanza.getAttr('h') - log.info('Session resumption failed (item-not-found), server h: %s' % str(h)) - if not h: - return - #prepare old_queue to contain only unacked stanzas for later resend (which is happening after our session is established properly) - h = int(h) - diff = self.out_h - h - - if diff < 0: - log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) - self.old_uqueue = [] #that's weird, but we don't resend this stanzas if the server says we don't need to - elif len(self.old_uqueue) < diff: - log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) - else: - log.info('Removing %d already acked stanzas from old outgoing queue (our h: %d, server h: %d, #queue: %d, remaining in queue: %d)' % (len(self.old_uqueue) - diff, self.out_h, h, len(self.old_uqueue), diff)) - while (len(self.old_uqueue) > diff): - self.old_uqueue.pop(0) - return - # Doesn't support resumption if stanza.getTag('feature-not-implemented'): log.info('Session resumption failed (feature-not-implemented)') self.negociate(False) return - if stanza.getTag('unexpected-request'): - log.error('Gajim failed to negociate Stream Management') - self.enabled = False + # If the server doesn't recognize previd, forget about resuming + # Ask for service discovery, etc.. + self.resuming = False + self.enabled = False + # we need to bind a resource + self._owner.NonBlockingBind.resuming = False + self._owner.Dispatcher.Event(NS_STREAM_MGMT, 'RESUME FAILED', None) + self._owner._on_auth_bind(None) + self.failed_resume = True + + h = stanza.getAttr('h') + log.info('Session resumption failed, server h: %s' % str(h)) + if not h: return + #prepare old_queue to contain only unacked stanzas for later resend (which is happening after our session is established properly) + h = int(h) + diff = self.out_h - h + + if diff < 0: + log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) + self.old_uqueue = [] #that's weird, but we don't resend this stanzas if the server says we don't need to + elif len(self.old_uqueue) < diff: + log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) + else: + log.info('Removing %d already acked stanzas from old outgoing queue (our h: %d, server h: %d, #queue: %d, remaining in queue: %d)' % (len(self.old_uqueue) - diff, self.out_h, h, len(self.old_uqueue), diff)) + while (len(self.old_uqueue) > diff): + self.old_uqueue.pop(0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/nbxmpp/tls_nb.py new/nbxmpp-0.6.10/nbxmpp/tls_nb.py --- old/nbxmpp-0.6.6/nbxmpp/tls_nb.py 2018-05-02 13:56:23.000000000 +0200 +++ new/nbxmpp-0.6.10/nbxmpp/tls_nb.py 2019-02-18 20:51:20.000000000 +0100 @@ -269,11 +269,11 @@ self.cacerts = cacerts self.mycerts = mycerts if cipher_list is None: - self.cipher_list = b'HIGH:!aNULL:RC4-SHA' + self.cipher_list = b'HIGH:!aNULL' else: self.cipher_list = cipher_list.encode('ascii') if tls_version is None: - self.tls_version = '1.0' + self.tls_version = '1.2' else: self.tls_version = tls_version self.alpn = alpn @@ -342,11 +342,12 @@ f = open(cert_path, encoding='utf-8') else: f = io.open(cert_path, encoding='utf-8') + lines = f.readlines() except (IOError, UnicodeError) as e: log.warning('Unable to open certificate file %s: %s' % \ (cert_path, str(e))) return - lines = f.readlines() + i = 0 begin = -1 for line in lines: @@ -447,12 +448,15 @@ store = tcpsock._sslContext.get_cert_store() self._load_cert_file(self.cacerts, store) self._load_cert_file(self.mycerts, store) - if os.path.isdir('/etc/ssl/certs'): - for f in os.listdir('/etc/ssl/certs'): - # We don't logg because there is a lot a duplicated certs in this - # folder - self._load_cert_file(os.path.join('/etc/ssl/certs', f), store, - logg=False) + paths = ['/etc/ssl/certs', + '/etc/ssl'] # FreeBSD uses this + for path in paths: + if not os.path.isdir(path): + continue + for f in os.listdir(path): + # We don't logg because there is a lot a duplicated certs + # in this folder + self._load_cert_file(os.path.join(path, f), store, logg=False) tcpsock._sslObj = OpenSSL.SSL.Connection(tcpsock._sslContext, tcpsock._sock) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nbxmpp-0.6.6/setup.py new/nbxmpp-0.6.10/setup.py --- old/nbxmpp-0.6.6/setup.py 2018-05-19 20:52:45.000000000 +0200 +++ new/nbxmpp-0.6.10/setup.py 2019-02-18 20:51:20.000000000 +0100 @@ -3,7 +3,7 @@ from distutils.core import setup setup(name='nbxmpp', - version='0.6.6', + version='0.6.10', description='Non blocking Jabber/XMPP module', author='Yann Leboulanger', author_email='[email protected]',
