This file is indexed.

/usr/lib/python2.7/dist-packages/twisted/words/test/test_jabbersaslmechanisms.py is in python-twisted-words 14.0.2-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

"""
Tests for L{twisted.words.protocols.jabber.sasl_mechanisms}.
"""

from twisted.trial import unittest

from twisted.words.protocols.jabber import sasl_mechanisms

class PlainTest(unittest.TestCase):
    def test_getInitialResponse(self):
        """
        Test the initial response.
        """
        m = sasl_mechanisms.Plain(None, 'test', 'secret')
        self.assertEqual(m.getInitialResponse(), '\x00test\x00secret')



class AnonymousTest(unittest.TestCase):
    """
    Tests for L{twisted.words.protocols.jabber.sasl_mechanisms.Anonymous}.
    """
    def test_getInitialResponse(self):
        """
        Test the initial response to be empty.
        """
        m = sasl_mechanisms.Anonymous()
        self.assertEqual(m.getInitialResponse(), None)



class DigestMD5Test(unittest.TestCase):
    def setUp(self):
        self.mechanism = sasl_mechanisms.DigestMD5(
            u'xmpp', u'example.org', None, u'test', u'secret')


    def test_getInitialResponse(self):
        """
        Test that no initial response is generated.
        """
        self.assertIdentical(self.mechanism.getInitialResponse(), None)


    def test_getResponse(self):
        """
        The response to a Digest-MD5 challenge includes the parameters from the
        challenge.
        """
        challenge = (
            'realm="localhost",nonce="1234",qop="auth",charset=utf-8,'
            'algorithm=md5-sess')
        directives = self.mechanism._parse(
            self.mechanism.getResponse(challenge))
        del directives["cnonce"], directives["response"]
        self.assertEqual({
                'username': 'test', 'nonce': '1234', 'nc': '00000001',
                'qop': ['auth'], 'charset': 'utf-8', 'realm': 'localhost',
                'digest-uri': 'xmpp/example.org'
                }, directives)


    def test_getResponseNonAsciiRealm(self):
        """
        Bytes outside the ASCII range in the challenge are nevertheless
        included in the response.
        """
        challenge = ('realm="\xc3\xa9chec.example.org",nonce="1234",'
                     'qop="auth",charset=utf-8,algorithm=md5-sess')
        directives = self.mechanism._parse(
            self.mechanism.getResponse(challenge))
        del directives["cnonce"], directives["response"]
        self.assertEqual({
                'username': 'test', 'nonce': '1234', 'nc': '00000001',
                'qop': ['auth'], 'charset': 'utf-8',
                'realm': '\xc3\xa9chec.example.org',
                'digest-uri': 'xmpp/example.org'}, directives)


    def test_getResponseNoRealm(self):
        """
        The response to a challenge without a realm uses the host part of the
        JID as the realm.
        """
        challenge = 'nonce="1234",qop="auth",charset=utf-8,algorithm=md5-sess'
        directives = self.mechanism._parse(self.mechanism.getResponse(challenge))
        self.assertEqual(directives['realm'], 'example.org')


    def test_getResponseNoRealmIDN(self):
        """
        If the challenge does not include a realm and the host part of the JID
        includes bytes outside of the ASCII range, the response still includes
        the host part of the JID as the realm.
        """
        self.mechanism = sasl_mechanisms.DigestMD5(
            u'xmpp', u'\u00e9chec.example.org', None, u'test', u'secret')
        challenge = 'nonce="1234",qop="auth",charset=utf-8,algorithm=md5-sess'
        directives = self.mechanism._parse(
            self.mechanism.getResponse(challenge))
        self.assertEqual(directives['realm'], '\xc3\xa9chec.example.org')


    def test_calculateResponse(self):
        """
        The response to a Digest-MD5 challenge is computed according to RFC
        2831.
        """
        charset = 'utf-8'
        nonce = 'OA6MG9tEQGm2hh'
        nc = '%08x' % (1,)
        cnonce = 'OA6MHXh6VqTrRk'

        username = u'\u0418chris'
        password = u'\u0418secret'
        host = u'\u0418elwood.innosoft.com'
        digestURI = u'imap/\u0418elwood.innosoft.com'.encode(charset)

        mechanism = sasl_mechanisms.DigestMD5(
            'imap', host, None, username, password)
        response = mechanism._calculateResponse(
            cnonce, nc, nonce, username.encode(charset),
            password.encode(charset), host.encode(charset), digestURI)
        self.assertEqual(response, '7928f233258be88392424d094453c5e3')


    def test_parse(self):
        """
        A challenge can be parsed into a L{dict} with L{bytes} or L{list}
        values.
        """
        challenge = (
            'nonce="1234",qop="auth,auth-conf",charset=utf-8,'
            'algorithm=md5-sess,cipher="des,3des"')
        directives = self.mechanism._parse(challenge)
        self.assertEqual({
                "algorithm": "md5-sess", "nonce": "1234", "charset": "utf-8",
                "qop": ['auth', 'auth-conf'], "cipher": ['des', '3des']
                }, directives)