示例#1
0
 def test_95_context_algs(self):
     handler = self.handler
     from otp.ai.passlib.context import CryptContext
     c1 = CryptContext(['scram'], scram__algs='sha1,md5')
     h = c1.hash('dummy')
     self.assertEqual(handler.extract_digest_algs(h), ['md5', 'sha-1'])
     self.assertFalse(c1.needs_update(h))
     c2 = c1.copy(scram__algs='sha1')
     self.assertFalse(c2.needs_update(h))
     c2 = c1.copy(scram__algs='sha1,sha256')
     self.assertTrue(c2.needs_update(h))
示例#2
0
    def test_46_needs_update(self):
        cc = CryptContext(**self.sample_4_dict)
        self.assertTrue(cc.needs_update('9XXD4trGYeGJA'))
        self.assertFalse(cc.needs_update('$1$J8HC2RCr$HcmM.7NxB2weSvlw2FgzU0'))
        self.assertTrue(cc.needs_update('$5$rounds=1999$jD81UCoo.zI.UETs$Y7qSTQ6mTiU9qZB4fRr43wRgQq4V.5AAf7F97Pzxey/'))
        self.assertFalse(cc.needs_update('$5$rounds=2000$228SSRje04cnNCaQ$YGV4RYu.5sNiBvorQDlO0WWQjyJVGKBcJXz3OtyQ2u8'))
        self.assertFalse(cc.needs_update('$5$rounds=3000$fS9iazEwTKi7QPW4$VasgBC8FqlOvD7x2HhABaMXCTh9jwHclPA9j5YQdns.'))
        self.assertTrue(cc.needs_update('$5$rounds=3001$QlFHHifXvpFX4PLs$/0ekt7lSs/lOikSerQ0M/1porEHxYq7W/2hdFpxA3fA'))
        check_state = []

        class dummy(uh.StaticHandler):
            name = 'dummy'
            _hash_prefix = '@'

            @classmethod
            def needs_update(cls, hash, secret=None):
                check_state.append((hash, secret))
                return secret == 'nu'

            def _calc_checksum(self, secret):
                from hashlib import md5
                if isinstance(secret, unicode):
                    secret = secret.encode('utf-8')
                return str_to_uascii(md5(secret).hexdigest())

        ctx = CryptContext([dummy])
        hash = refhash = dummy.hash('test')
        self.assertFalse(ctx.needs_update(hash))
        self.assertEqual(check_state, [(hash, None)])
        del check_state[:]
        self.assertFalse(ctx.needs_update(hash, secret='bob'))
        self.assertEqual(check_state, [(hash, 'bob')])
        del check_state[:]
        self.assertTrue(ctx.needs_update(hash, secret='nu'))
        self.assertEqual(check_state, [(hash, 'nu')])
        del check_state[:]
        cc = CryptContext(['des_crypt'])
        for hash, kwds in self.nonstring_vectors:
            self.assertRaises(TypeError, cc.needs_update, hash, **kwds)

        self.assertRaises(KeyError, CryptContext().needs_update, 'hash')
        self.assertRaises(KeyError, cc.needs_update, refhash, scheme='fake')
        self.assertRaises(TypeError, cc.needs_update, refhash, scheme=1)
        self.assertRaises(TypeError, cc.needs_update, refhash, category=1)
        return