You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					98 lines
				
				3.8 KiB
			
		
		
			
		
	
	
					98 lines
				
				3.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"""test passlib.hosts"""
							 | 
						||
| 
								 | 
							
								#=============================================================================
							 | 
						||
| 
								 | 
							
								# imports
							 | 
						||
| 
								 | 
							
								#=============================================================================
							 | 
						||
| 
								 | 
							
								from __future__ import with_statement
							 | 
						||
| 
								 | 
							
								# core
							 | 
						||
| 
								 | 
							
								import logging; log = logging.getLogger(__name__)
							 | 
						||
| 
								 | 
							
								# site
							 | 
						||
| 
								 | 
							
								# pkg
							 | 
						||
| 
								 | 
							
								from passlib import hosts, hash as hashmod
							 | 
						||
| 
								 | 
							
								from passlib.utils import unix_crypt_schemes
							 | 
						||
| 
								 | 
							
								from passlib.tests.utils import TestCase
							 | 
						||
| 
								 | 
							
								# module
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#=============================================================================
							 | 
						||
| 
								 | 
							
								# test predefined app contexts
							 | 
						||
| 
								 | 
							
								#=============================================================================
							 | 
						||
| 
								 | 
							
								class HostsTest(TestCase):
							 | 
						||
| 
								 | 
							
								    """perform general tests to make sure contexts work"""
							 | 
						||
| 
								 | 
							
								    # NOTE: these tests are not really comprehensive,
							 | 
						||
| 
								 | 
							
								    #       since they would do little but duplicate
							 | 
						||
| 
								 | 
							
								    #       the presets in apps.py
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    #       they mainly try to ensure no typos
							 | 
						||
| 
								 | 
							
								    #       or dynamic behavior foul-ups.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def check_unix_disabled(self, ctx):
							 | 
						||
| 
								 | 
							
								        for hash in [
							 | 
						||
| 
								 | 
							
								            "",
							 | 
						||
| 
								 | 
							
								            "!",
							 | 
						||
| 
								 | 
							
								            "*",
							 | 
						||
| 
								 | 
							
								            "!$1$TXl/FX/U$BZge.lr.ux6ekjEjxmzwz0",
							 | 
						||
| 
								 | 
							
								        ]:
							 | 
						||
| 
								 | 
							
								            self.assertEqual(ctx.identify(hash), 'unix_disabled')
							 | 
						||
| 
								 | 
							
								            self.assertFalse(ctx.verify('test', hash))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_linux_context(self):
							 | 
						||
| 
								 | 
							
								        ctx = hosts.linux_context
							 | 
						||
| 
								 | 
							
								        for hash in [
							 | 
						||
| 
								 | 
							
								            ('$6$rounds=41128$VoQLvDjkaZ6L6BIE$4pt.1Ll1XdDYduEwEYPCMOBiR6W6'
							 | 
						||
| 
								 | 
							
								                'znsyUEoNlcVXpv2gKKIbQolgmTGe6uEEVJ7azUxuc8Tf7zV9SD2z7Ij751'),
							 | 
						||
| 
								 | 
							
								            ('$5$rounds=31817$iZGmlyBQ99JSB5n6$p4E.pdPBWx19OajgjLRiOW0itGny'
							 | 
						||
| 
								 | 
							
								                 'xDGgMlDcOsfaI17'),
							 | 
						||
| 
								 | 
							
								            '$1$TXl/FX/U$BZge.lr.ux6ekjEjxmzwz0',
							 | 
						||
| 
								 | 
							
								            'kAJJz.Rwp0A/I',
							 | 
						||
| 
								 | 
							
								        ]:
							 | 
						||
| 
								 | 
							
								            self.assertTrue(ctx.verify("test", hash))
							 | 
						||
| 
								 | 
							
								        self.check_unix_disabled(ctx)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_bsd_contexts(self):
							 | 
						||
| 
								 | 
							
								        for ctx in [
							 | 
						||
| 
								 | 
							
								            hosts.freebsd_context,
							 | 
						||
| 
								 | 
							
								            hosts.openbsd_context,
							 | 
						||
| 
								 | 
							
								            hosts.netbsd_context,
							 | 
						||
| 
								 | 
							
								        ]:
							 | 
						||
| 
								 | 
							
								            for hash in [
							 | 
						||
| 
								 | 
							
								                '$1$TXl/FX/U$BZge.lr.ux6ekjEjxmzwz0',
							 | 
						||
| 
								 | 
							
								                'kAJJz.Rwp0A/I',
							 | 
						||
| 
								 | 
							
								            ]:
							 | 
						||
| 
								 | 
							
								                self.assertTrue(ctx.verify("test", hash))
							 | 
						||
| 
								 | 
							
								            h1 = "$2a$04$yjDgE74RJkeqC0/1NheSSOrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIS"
							 | 
						||
| 
								 | 
							
								            if hashmod.bcrypt.has_backend():
							 | 
						||
| 
								 | 
							
								                self.assertTrue(ctx.verify("test", h1))
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                self.assertEqual(ctx.identify(h1), "bcrypt")
							 | 
						||
| 
								 | 
							
								            self.check_unix_disabled(ctx)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_host_context(self):
							 | 
						||
| 
								 | 
							
								        ctx = getattr(hosts, "host_context", None)
							 | 
						||
| 
								 | 
							
								        if not ctx:
							 | 
						||
| 
								 | 
							
								            return self.skipTest("host_context not available on this platform")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # validate schemes is non-empty,
							 | 
						||
| 
								 | 
							
								        # and contains unix_disabled + at least one real scheme
							 | 
						||
| 
								 | 
							
								        schemes = list(ctx.schemes())
							 | 
						||
| 
								 | 
							
								        self.assertTrue(schemes, "appears to be unix system, but no known schemes supported by crypt")
							 | 
						||
| 
								 | 
							
								        self.assertTrue('unix_disabled' in schemes)
							 | 
						||
| 
								 | 
							
								        schemes.remove("unix_disabled")
							 | 
						||
| 
								 | 
							
								        self.assertTrue(schemes, "should have schemes beside fallback scheme")
							 | 
						||
| 
								 | 
							
								        self.assertTrue(set(unix_crypt_schemes).issuperset(schemes))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # check for hash support
							 | 
						||
| 
								 | 
							
								        self.check_unix_disabled(ctx)
							 | 
						||
| 
								 | 
							
								        for scheme, hash in [
							 | 
						||
| 
								 | 
							
								            ("sha512_crypt", ('$6$rounds=41128$VoQLvDjkaZ6L6BIE$4pt.1Ll1XdDYduEwEYPCMOBiR6W6'
							 | 
						||
| 
								 | 
							
								                'znsyUEoNlcVXpv2gKKIbQolgmTGe6uEEVJ7azUxuc8Tf7zV9SD2z7Ij751')),
							 | 
						||
| 
								 | 
							
								            ("sha256_crypt", ('$5$rounds=31817$iZGmlyBQ99JSB5n6$p4E.pdPBWx19OajgjLRiOW0itGny'
							 | 
						||
| 
								 | 
							
								                 'xDGgMlDcOsfaI17')),
							 | 
						||
| 
								 | 
							
								            ("md5_crypt", '$1$TXl/FX/U$BZge.lr.ux6ekjEjxmzwz0'),
							 | 
						||
| 
								 | 
							
								            ("des_crypt", 'kAJJz.Rwp0A/I'),
							 | 
						||
| 
								 | 
							
								        ]:
							 | 
						||
| 
								 | 
							
								            if scheme in schemes:
							 | 
						||
| 
								 | 
							
								                self.assertTrue(ctx.verify("test", hash))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#=============================================================================
							 | 
						||
| 
								 | 
							
								# eof
							 | 
						||
| 
								 | 
							
								#=============================================================================
							 |