Ticket #5066: 5066_patch_3.diff

File 5066_patch_3.diff, 4.9 KB (added by Sergey, 9 years ago)
  • twisted/words/protocols/jabber/sasl_mechanisms.py

     
    8585    name = 'DIGEST-MD5'
    8686
    8787    def __init__(self, serv_type, host, serv_name, username, password):
     88        """
     89        @type serv_type: C{unicode}
     90
     91        @type host: C{unicode}
     92
     93        @type serv_name: C{unicode}
     94       
     95        @type username: C{unicode}
     96
     97        @type password: C{unicode}
     98        """
    8899        self.username = username
    89100        self.password = password
    90101        self.defaultRealm = host
    91102
    92         self.digest_uri = '%s/%s' % (serv_type, host)
     103        self.digest_uri = u'%s/%s' % (serv_type, host)
    93104        if serv_name is not None:
    94             self.digest_uri += '/%s' % serv_name
     105            self.digest_uri += u'/%s' % serv_name
    95106
    96107
    97108    def getInitialResponse(self):
     
    205216        try:
    206217            username = self.username.encode(charset)
    207218            password = self.password.encode(charset)
     219            realm = realm.encode(charset)
     220            digest_uri = self.digest_uri.encode(charset)
    208221        except UnicodeError:
    209222            # TODO - add error checking
    210223            raise
     
    217230        a1 = "%s:%s:%s" % (H("%s:%s:%s" % (username, realm, password)),
    218231                           nonce,
    219232                           cnonce)
    220         a2 = "AUTHENTICATE:%s" % self.digest_uri
     233        a2 = "AUTHENTICATE:%s" % digest_uri
    221234
    222235        response = HEX( KD ( HEX(H(a1)),
    223236                             "%s:%s:%s:%s:%s" % (nonce, nc,
     
    229242                      'cnonce' : cnonce,
    230243                      'nc' : nc,
    231244                      'qop' : qop,
    232                       'digest-uri': self.digest_uri,
     245                      'digest-uri': digest_uri,
    233246                      'response': response,
    234247                      'charset': charset}
    235248
     
    237250
    238251
    239252    def _gen_nonce(self):
    240         return md5("%s:%s:%s" % (str(random.random()) , str(time.gmtime()),str(os.getpid()))).hexdigest()
     253        return md5("%s:%s:%s" % (random.random(),
     254                                 time.gmtime(),
     255                                 os.getpid())).hexdigest()
  • twisted/words/test/test_jabbersaslmechanisms.py

     
    44"""
    55Tests for L{twisted.words.protocols.jabber.sasl_mechanisms}.
    66"""
     7import binascii
    78
    89from twisted.trial import unittest
    910
    1011from twisted.words.protocols.jabber import sasl_mechanisms
     12from twisted.python.hashlib import md5
    1113
    1214class PlainTest(unittest.TestCase):
    1315    def test_getInitialResponse(self):
     
    7274        directives = self.mechanism._parse(self.mechanism.getResponse(challenge))
    7375        self.assertEqual(directives['realm'], 'example.org')
    7476
     77    def test_getResponseUnicode(self):
     78        def H(s):
     79            return md5(s).digest()
     80
     81        def HEX(n):
     82            return binascii.b2a_hex(n)
     83
     84        def KD(k, s):
     85            return H(u'%s:%s' % (k, s))
     86
     87        domain = u'\u0418example.org'
     88        password = u'\u0418secret'
     89        username = u'test\u0418'
     90        for encoding in ('utf-8', 'cp1251'):
     91            self.mechanism = sasl_mechanisms.DigestMD5(u'xmpp', domain, None,
     92                                                       username, password)
     93            challenge = 'nonce="1234",qop="auth",charset=%s,algorithm=md5-sess' % (
     94                encoding
     95            )
     96            directives = self.mechanism._parse(self.mechanism.getResponse(challenge))
     97            self.assertEqual(directives['realm'], domain.encode(encoding))
     98            self.assertEqual(directives['username'], username.encode(encoding))
     99            a1 = "%s:%s:%s" % (H(("%s:%s:%s" % (username, domain, password)).encode(encoding)),
     100                               1234,
     101                               directives['cnonce'])
     102            a2 = "AUTHENTICATE:xmpp/%s" % domain
     103            a2 = a2.encode(encoding)
     104            nc = '%08x' % 1 # TODO: support subsequent auth.
     105            response = HEX( KD ( HEX(H(a1)),
     106                                "%s:%s:%s:%s:%s" % (1234, nc,
     107                                                    directives['cnonce'],
     108                                                    "auth", HEX(H(a2)))))
     109            self.assertEqual(directives['response'], response)
     110
    75111    def test__parse(self):
    76112        """
    77113        Test challenge decoding.
  • twisted/words/topfiles/5066.bugfix

     
     1twisted.words.protocols.jabber.sasl_mechansisms.DigestMD5 can work now with
     2unicode arguments