관리-도구
편집 파일: __init__.cpython-39.pyc
a f�Wc�� � @ sF d Z ddlmZ ddlmZmZmZ ddlm Z m Z zddlmZ ddlm Z W n* eyz ddlmZ ddlm Z Y n0 ddlmZ ddlmZ dd lZdd lZdd lZe�e�Zdd lZdd lZdd lZdd lZdd lZe�rzdd l Z W n e�y d Z d Z!Y n0 ndd l Z dd l"Z"e �r.dd l#Z#zdd l$Z$W n e�yR d Z$Y n0 dd l%Z%dd l&Z&ddl'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 dd l7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z? ddlm@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP g d�ZQeRe�eF�r>ejSnejTd�d �ZUg d�ZVddgZWddl=mXZX dZYeGd�ZZeGd�Z[eRej\�]d��p�d�Z^G dd� de_�Z`eF�r�ejajbZcedecejajeg�Zfdd� Zgnd d� Zgd�d"d#�Zhd$d%� Zid&d'� ZjejZkzdd(llmmZj W n e�y Y n0 d�d*d+�Znd�d-d.�Zoe d u �r@d�d/d.�Zod0d1� ZpeF�r`d2d3� Zqd4d5� Zrn dd6lmsZsmtZt d7d3� Zqd8d5� Zre@eqd9� e@erd:� d;d<� Zud=d>� Zvd?d@� ZwdAZxeGdB�Zyd�dCdD�ZzdEdF� Z{dGZ|e|�}dH�Z~dIdJ� ZdKdL� Z�dMZ�eGdN�Z�dOdP� Z�d�dRdS�Z�d�dTdU�Z�eF�r"d�dVdW�Z�n d�dXdW�Z�e@e�dY� e8dZd[d\�d�d]d^��Z�edd_��� �Z�edd`��� �Z�edddag�Z�d�dcdd�Z�dedf� Z�zddgl�m�Z� W n0 e�y� d Z�d!Z�d!Z�d!Z�d Z�dhdi� Z�Y n�0 djZ�dBZ�e$�reP�rdkej� k�r�dlk�rn ne$��� Z�djZ�nddmlm�Z� e�� Z�d!Z�eGdn�Z�eF�rhdjZ�ze�dodp� W n" e��yR d!Z�Y n Y n0 dqdi� Z�ndjZ�drdi� Z�e@e�ds� dtdu� Z�e%j�Z�e�Z�dvdw� Z�ze��dx� djZ�W n e��y� d!Z�Y n0 d�dydz�Z�e��r�e��� Z�ne��e�� �Z�d{d|� Z�d}d~� Z�dZ�e8d[d�d�d��d�e�fd�d���Z�d�Z�d�d�� Z�d�Z�d�d�� Z�d�d�� Z�d�d�� Z�d S )�z4passlib.utils -- helpers for writing password hashes� )�JYTHON)� b2a_base64� a2b_base64�Error)� b64encode� b64decode)�Sequence)�Iterable)�lookup)�update_wrapperNznot present under Jython)�warn) �BASE64_CHARS� AB64_CHARS�HASH64_CHARS�BCRYPT_CHARS�Base64Engine�LazyBase64Engine�h64�h64big�bcrypt64�ab64_encode�ab64_decode�b64s_encode�b64s_decode)�deprecated_function�deprecated_method�memoized_property� classproperty� hybrid_method)�ExpectedStringError�ExpectedTypeError)�add_doc� join_bytes�join_byte_values�join_byte_elems�irange�imap�PY3�u�join_unicode�unicode�byte_elem_value� nextgetter�unicode_or_str�unicode_or_bytes_types�get_method_function�suppress_cause�PYPY)r �sys_bits�unix_crypt_schemes�rounds_cost_values�consteq�saslprep� xor_bytes�render_bytes� is_same_codec� is_ascii_safe�to_bytes� to_unicode� to_native_str� has_crypt� test_crypt� safe_crypt�tick�rng�getrandbytes� getrandstr�generate_password�is_crypt_handler�is_crypt_context�has_rounds_info� has_salt_info� g �?)Zsha512_cryptZsha256_cryptZ sha1_cryptZbcryptZ md5_cryptZ bsdi_cryptZ des_cryptZlinearZlog2)�MissingBackendError� � � ZPASSLIB_MAX_PASSWORD_SIZEi c @ sH e Zd ZdZdd� Zdd� Zdd� Zdd � Zd d� Zdd � Z dd� Z dS )� SequenceMixinz� helper which lets result object act like a fixed-length sequence. subclass just needs to provide :meth:`_as_tuple()`. c C s t d��d S )Nzimplement in subclass)�NotImplementedError��self� rS �:/usr/lib/python3.9/site-packages/passlib/utils/__init__.py� _as_tuple� s zSequenceMixin._as_tuplec C s t | �� �S �N)�reprrU rQ rS rS rT �__repr__� s zSequenceMixin.__repr__c C s | � � | S rV �rU )rR �idxrS rS rT �__getitem__� s zSequenceMixin.__getitem__c C s t | �� �S rV )�iterrU rQ rS rS rT �__iter__� s zSequenceMixin.__iter__c C s t | �� �S rV )�lenrU rQ rS rS rT �__len__� s zSequenceMixin.__len__c C s | � � |kS rV rY �rR �otherrS rS rT �__eq__� s zSequenceMixin.__eq__c C s | � |� S rV )rb r` rS rS rT �__ne__� s zSequenceMixin.__ne__N)�__name__� __module__�__qualname__�__doc__rU rX r[ r] r_ rb rc rS rS rS rT rO � s rO c C sJ t �t| ��j}|sdS |�|�}|r4|jtvr4dS |t|�d jtkS )�*test if function accepts specified keywordFT���) �inspectZ signaturer/ � parameters�get�kind�_VAR_ANY_SET�list�_VAR_KEYWORD)�func�key�params�argrS rS rT �accepts_keyword� s ru c C s"