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.
		
		
		
		
		
			
		
			
				
					
					
						
							56 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							56 lines
						
					
					
						
							2.2 KiB
						
					
					
				"""passlib.handlers.postgres_md5 - MD5-based algorithm used by Postgres for pg_shadow table"""
 | 
						|
#=============================================================================
 | 
						|
# imports
 | 
						|
#=============================================================================
 | 
						|
# core
 | 
						|
from hashlib import md5
 | 
						|
import logging; log = logging.getLogger(__name__)
 | 
						|
# site
 | 
						|
# pkg
 | 
						|
from passlib.utils import to_bytes
 | 
						|
from passlib.utils.compat import str_to_uascii, unicode, u
 | 
						|
import passlib.utils.handlers as uh
 | 
						|
# local
 | 
						|
__all__ = [
 | 
						|
    "postgres_md5",
 | 
						|
]
 | 
						|
 | 
						|
#=============================================================================
 | 
						|
# handler
 | 
						|
#=============================================================================
 | 
						|
class postgres_md5(uh.HasUserContext, uh.StaticHandler):
 | 
						|
    """This class implements the Postgres MD5 Password hash, and follows the :ref:`password-hash-api`.
 | 
						|
 | 
						|
    It does a single round of hashing, and relies on the username as the salt.
 | 
						|
 | 
						|
    The :meth:`~passlib.ifc.PasswordHash.hash`, :meth:`~passlib.ifc.PasswordHash.genhash`, and :meth:`~passlib.ifc.PasswordHash.verify` methods all require the
 | 
						|
    following additional contextual keywords:
 | 
						|
 | 
						|
    :type user: str
 | 
						|
    :param user: name of postgres user account this password is associated with.
 | 
						|
    """
 | 
						|
    #===================================================================
 | 
						|
    # algorithm information
 | 
						|
    #===================================================================
 | 
						|
    name = "postgres_md5"
 | 
						|
    _hash_prefix = u("md5")
 | 
						|
    checksum_chars = uh.HEX_CHARS
 | 
						|
    checksum_size = 32
 | 
						|
 | 
						|
    #===================================================================
 | 
						|
    # primary interface
 | 
						|
    #===================================================================
 | 
						|
    def _calc_checksum(self, secret):
 | 
						|
        if isinstance(secret, unicode):
 | 
						|
            secret = secret.encode("utf-8")
 | 
						|
        user = to_bytes(self.user, "utf-8", param="user")
 | 
						|
        return str_to_uascii(md5(secret + user).hexdigest())
 | 
						|
 | 
						|
    #===================================================================
 | 
						|
    # eoc
 | 
						|
    #===================================================================
 | 
						|
 | 
						|
#=============================================================================
 | 
						|
# eof
 | 
						|
#=============================================================================
 |