changeset 9f4a4fe90ae6 in /home/hg/repos/python-nbxmpp

details:http://hg.gajim.org/python-nbxmpp?cmd=changeset;node=9f4a4fe90ae6
description: fix encoding issues (base64, HMAC, ...)

diffstat:

 nbxmpp/auth_nb.py          |  44 ++++++++++++++++++++++++++------------------
 nbxmpp/dispatcher_nb.py    |  24 ++++++++++++++----------
 nbxmpp/proxy_connectors.py |   6 ++++--
 nbxmpp/simplexml.py        |   2 +-
 nbxmpp/tls_nb.py           |   6 ++++--
 5 files changed, 49 insertions(+), 33 deletions(-)

diffs (242 lines):

diff -r 220e1936c4d2 -r 9f4a4fe90ae6 nbxmpp/auth_nb.py
--- a/nbxmpp/auth_nb.py Wed Jan 02 14:15:21 2013 +0100
+++ b/nbxmpp/auth_nb.py Wed Jan 02 15:36:55 2013 +0100
@@ -219,8 +219,8 @@
         if "EXTERNAL" in self.mecs:
             self.mecs.remove('EXTERNAL')
             sasl_data = '%s@%s' % (self.username, self._owner.Server)
-            sasl_data = sasl_data.encode('utf-8').encode('base64').replace(
-                '\n', '')
+            sasl_data = base64.b64encode(sasl_data.encode('utf-8')).decode(
+                'utf-8').replace('\n', '')
             node = Node('auth', attrs={'xmlns': NS_SASL,
                 'mechanism': 'EXTERNAL'}, payload=[sasl_data])
             self.mechanism = 'EXTERNAL'
@@ -285,10 +285,15 @@
             return
 
         def scram_base64(s):
-            return ''.join(s.encode('base64').split('\n'))
+            try:
+                s = s.encode('utf-8')
+            except:
+                pass
+            return ''.join(base64.b64encode(s).decode('utf-8').\
+                split('\n'))
 
         incoming_data = challenge.getData()
-        data=base64.decodestring(incoming_data)
+        data=base64.b64decode(incoming_data.encode('utf-8')).decode('utf-8')
         ### Handle Auth result
         def on_auth_fail(reason):
             log.info('Failed SASL authentification: %s' % reason)
@@ -361,11 +366,11 @@
             hashfn = hashlib.sha1
 
             def HMAC(k, s):
-                return hmac.HMAC(key=k, msg=s, digestmod=hashfn).digest()
+                return hmac.new(key=k, msg=s, digestmod=hashfn).digest()
 
             def XOR(x, y):
-                r = (chr(ord(px) ^ ord(py)) for px, py in zip(x, y))
-                return ''.join(r)
+                r = [px ^ py for px, py in zip(x, y)]
+                return bytes(r)
 
             def Hi(s, salt, iters):
                 ii = 1
@@ -373,7 +378,7 @@
                     s = s.encode('utf-8')
                 except:
                     pass
-                ui_1 = HMAC(s, salt + '\0\0\0\01')
+                ui_1 = HMAC(s, (salt + '\0\0\0\01').encode('utf-8'))
                 ui = ui_1
                 for i in range(iters - 1):
                     ii += 1
@@ -393,16 +398,18 @@
                 r = 'c=' + scram_base64(self.scram_gs2)
                 r += ',r=' + data['r']
                 self.scram_soup += r
-                salt = data['s'].decode('base64')
+                self.scram_soup = self.scram_soup.encode('utf-8')
+                salt = base64.b64decode(data['s'].encode('utf-8')).decode(
+                    'utf-8')
                 iter = int(data['i'])
                 SaltedPassword = Hi(self.password, salt, iter)
                 # TODO: Could cache this, along with salt+iter.
-                ClientKey = HMAC(SaltedPassword, 'Client Key')
+                ClientKey = HMAC(SaltedPassword, b'Client Key')
                 StoredKey = scram_H(ClientKey)
                 ClientSignature = HMAC(StoredKey, self.scram_soup)
                 ClientProof = XOR(ClientKey, ClientSignature)
                 r += ',p=' + scram_base64(ClientProof)
-                ServerKey = HMAC(SaltedPassword, 'Server Key')
+                ServerKey = HMAC(SaltedPassword, b'Server Key')
                 self.scram_ServerSignature = HMAC(ServerKey, self.scram_soup)
                 sasl_data = scram_base64(r)
                 node = Node('response', attrs={'xmlns': NS_SASL},
@@ -412,7 +419,8 @@
 
             if self.scram_step == 1:
                 data = scram_parse(data)
-                if data['v'].decode('base64') != self.scram_ServerSignature:
+                if base64.b64decode(data['v'].encode('utf-8')).decode('utf-8') 
\
+                != self.scram_ServerSignature:
                     # TODO: Not clear what to do here - need to abort.
                     raise Exception
                 node = Node('response', attrs={'xmlns': NS_SASL});
@@ -468,8 +476,8 @@
                 itertools.repeat(random.randint, 7))
             self.scram_soup = 'n=' + self.username + ',r=' + nonce
             self.scram_gs2 = 'n,,' # No CB yet.
-            sasl_data = (self.scram_gs2 + self.scram_soup).encode('base64').\
-                replace('\n', '')
+            sasl_data = base64.b64encode((self.scram_gs2 + self.scram_soup).\
+                encode('utf-8')).decode('utf-8').replace('\n', '')
             node = Node('auth', attrs={'xmlns': NS_SASL,
                 'mechanism': self.mechanism}, payload=[sasl_data])
         elif self.mechanism == 'DIGEST-MD5':
@@ -493,14 +501,14 @@
                     sasl_data += "%s=%s," % (key, self.resp[key])
                 else:
                     sasl_data += '%s="%s",' % (key, self.resp[key])
-            sasl_data = 
sasl_data[:-1].encode('utf-8').encode('base64').replace(
-                '\r', '').replace('\n', '')
+            sasl_data = base64.b64encode(sasl_data[:-1].encode('utf-8')).\
+                decode('utf-8').replace('\r', '').replace('\n', '')
             node = Node('response', attrs={'xmlns': NS_SASL},
                 payload=[sasl_data])
         elif self.mechanism == 'PLAIN':
             sasl_data = '\x00%s\x00%s' % (self.username, self.password)
-            sasl_data = sasl_data.encode('utf-8').encode('base64').replace(
-                '\n', '')
+            sasl_data = base64.b64encode(sasl_data.encode('utf-8')).decode(
+                'utf-8').replace('\n', '')
             node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'PLAIN'},
                 payload=[sasl_data])
         elif self.mechanism == 'X-MESSENGER-OAUTH2':
diff -r 220e1936c4d2 -r 9f4a4fe90ae6 nbxmpp/dispatcher_nb.py
--- a/nbxmpp/dispatcher_nb.py   Wed Jan 02 14:15:21 2013 +0100
+++ b/nbxmpp/dispatcher_nb.py   Wed Jan 02 15:36:55 2013 +0100
@@ -98,21 +98,21 @@
 
         # \ufddo -> \ufdef range
         c = '\ufdd0'
-        r = c.encode('utf8')
+        r = c
         while (c < '\ufdef'):
             c = chr(ord(c) + 1)
-            r += '|' + c.encode('utf8')
+            r += '|' + c
 
         # \ufffe-\uffff, \u1fffe-\u1ffff, ..., \u10fffe-\u10ffff
         c = '\ufffe'
-        r += '|' + c.encode('utf8')
-        r += '|' + chr(ord(c) + 1).encode('utf8')
+        r += '|' + c
+        r += '|' + chr(ord(c) + 1)
         while (c < '\U0010fffe'):
             c = chr(ord(c) + 0x10000)
-            r += '|' + c.encode('utf8')
-            r += '|' + chr(ord(c) + 1).encode('utf8')
+            r += '|' + c
+            r += '|' + chr(ord(c) + 1)
 
-        self.invalid_chars_re = re.compile(r)
+        self.invalid_chars_re = re.compile(r.encode('utf-8'))
 
     def getAnID(self):
         global outgoingID
@@ -222,7 +222,9 @@
             handler(self)
         if len(self._pendingExceptions) > 0:
             _pendingException = self._pendingExceptions.pop()
-            raise _pendingException
+            e = _pendingException[0](_pendingException[1])
+            e.__traceback__ = _pendingException[2]
+            raise e
         try:
             self.Stream.Parse(data)
             # end stream:stream tag received
@@ -239,7 +241,9 @@
             return 0
         if len(self._pendingExceptions) > 0:
             _pendingException = self._pendingExceptions.pop()
-            raise _pendingException
+            e = _pendingException[0](_pendingException[1])
+            e.__traceback__ = _pendingException[2]
+            raise e
         if len(data) == 0:
             return '0'
         return len(data)
@@ -507,7 +511,7 @@
         # we have released dispatcher, so self._owner has no methods
         if not res:
             return
-        for (_id, _iq) in self._expected.items():
+        for (_id, _iq) in list(self._expected.items()):
             if _iq is None:
                 # If the expected Stanza would have arrived, ProcessNonBlocking
                 # would have placed the reply stanza in there
diff -r 220e1936c4d2 -r 9f4a4fe90ae6 nbxmpp/proxy_connectors.py
--- a/nbxmpp/proxy_connectors.py        Wed Jan 02 14:15:21 2013 +0100
+++ b/nbxmpp/proxy_connectors.py        Wed Jan 02 15:36:55 2013 +0100
@@ -22,7 +22,8 @@
 Authentication to NTLM (Microsoft implementation) proxies can be next.
 """
 
-import struct, socket, base64
+import struct, socket
+from base64 import b64encode
 import logging
 log = logging.getLogger('nbxmpp.proxy_connectors')
 
@@ -91,7 +92,8 @@
                 'User-Agent: Gajim']
         if self.proxy_user and self.proxy_pass:
             credentials = '%s:%s' % (self.proxy_user, self.proxy_pass)
-            credentials = base64.encodestring(credentials).strip()
+            credentials = b64encode(credentials.encode('utf-8')).decode(
+                'utf-8').strip()
             connector.append('Proxy-Authorization: Basic '+credentials)
         connector.append('\r\n')
         self.onreceive(self._on_headers_sent)
diff -r 220e1936c4d2 -r 9f4a4fe90ae6 nbxmpp/simplexml.py
--- a/nbxmpp/simplexml.py       Wed Jan 02 14:15:21 2013 +0100
+++ b/nbxmpp/simplexml.py       Wed Jan 02 15:36:55 2013 +0100
@@ -163,7 +163,7 @@
             for a in self.kids:
                 if not fancy and (len(self.data)-1)>=cnt: 
s=s+XMLescape(self.data[cnt])
                 elif (len(self.data)-1)>=cnt: 
s=s+XMLescape(self.data[cnt].strip())
-                if isinstance(a, str) or isinstance(a, str):
+                if isinstance(a, str):
                     s = s + a.__str__()
                 else:
                     s = s + a.__str__(fancy and fancy+1)
diff -r 220e1936c4d2 -r 9f4a4fe90ae6 nbxmpp/tls_nb.py
--- a/nbxmpp/tls_nb.py  Wed Jan 02 14:15:21 2013 +0100
+++ b/nbxmpp/tls_nb.py  Wed Jan 02 15:36:55 2013 +0100
@@ -345,6 +345,7 @@
                             '%s' % cert_path)
                 begin = -1
             i += 1
+        f.close()
 
     def _startSSL_pyOpenSSL(self):
         log.debug("_startSSL_pyOpenSSL called")
@@ -449,11 +450,12 @@
     def _ssl_verify_callback(self, sslconn, cert, errnum, depth, ok):
         # Exceptions can't propagate up through this callback, so print them 
here.
         try:
-            self._owner.ssl_fingerprint_sha1.append(cert.digest('sha1'))
+            self._owner.ssl_fingerprint_sha1.append(cert.digest('sha1').decode(
+                'utf-8'))
             self._owner.ssl_certificate.append(cert)
             self._owner.ssl_errnum.append(errnum)
             self._owner.ssl_cert_pem.append(OpenSSL.crypto.dump_certificate(
-                    OpenSSL.crypto.FILETYPE_PEM, cert))
+                    OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8'))
             return True
         except:
             log.error("Exception caught in _ssl_info_callback:", exc_info=True)
_______________________________________________
Commits mailing list
[email protected]
http://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to