U
    Û~fh  ã                	   @  s¦   d Z ddlmZ ddlmZmZ zddlZW n, ek
rX   dZddddd	œd
d„Z	Y nJX dZddl
Z
ejejejejejejejejejf	Zddddd	œdd„Z	dS )z&An implementation of RFC4013 SASLprep.é    )Úannotations)ÚAnyÚOptionalNFTr   zOptional[bool])ÚdataÚprohibit_unassigned_code_pointsÚreturnc                 C  s   t | tƒrtdƒ‚| S )zSASLprep dummyz[The stringprep module is not available. Usernames and passwords must be instances of bytes.)Ú
isinstanceÚstrÚ	TypeError)r   r   © r   ú4/tmp/pip-unpacked-wheel-36gvocj8/pymongo/saslprep.pyÚsaslprep   s
    
ÿr   c                   sÂ   t | tƒs| S |r ttjf˜}nt}tj‰tj‰d ‡‡fdd„| D ƒ¡} tj	 
d| ¡} tj}|| d ƒrŒ|| d ƒs~tdƒ‚|tjf˜}n
||f˜}| D ]"‰ t‡ fdd	„|D ƒƒrštd
ƒ‚qš| S )aV  An implementation of RFC4013 SASLprep.

        :param data: The string to SASLprep. Unicode strings
            (:class:`str`) are supported. Byte strings
            (:class:`bytes`) are ignored.
        :param prohibit_unassigned_code_points: True / False. RFC 3454
            and RFCs for various SASL mechanisms distinguish between
            `queries` (unassigned code points allowed) and
            `stored strings` (unassigned code points prohibited). Defaults
            to ``True`` (unassigned code points are prohibited).

        :return: The SASLprep'ed version of `data`.
        Ú c                   s$   g | ]}ˆ |ƒsˆ|ƒrd n|‘qS )ú r   )Ú.0Úelt)Úin_table_b1Úin_table_c12r   r   Ú
<listcomp>X   s      zsaslprep.<locals>.<listcomp>ÚNFKCr   éÿÿÿÿz$SASLprep: failed bidirectional checkc                 3  s   | ]}|ˆ ƒV  qd S )Nr   )r   Zin_table)Úcharr   r   Ú	<genexpr>q   s     zsaslprep.<locals>.<genexpr>z+SASLprep: failed prohibited character check)r   r	   Ú_PROHIBITEDÚ
stringprepÚin_table_a1r   r   ÚjoinÚunicodedataÚ	ucd_3_2_0Ú	normalizeÚin_table_d1Ú
ValueErrorÚin_table_d2Úany)r   r   Z
prohibitedr    r   )r   r   r   r   r   9   s*    
ÿ

)T)T)Ú__doc__Ú
__future__r   Útypingr   r   r   ÚImportErrorZHAVE_STRINGPREPr   r   r   Úin_table_c21_c22Úin_table_c3Úin_table_c4Úin_table_c5Úin_table_c6Úin_table_c7Úin_table_c8Úin_table_c9r   r   r   r   r   Ú<module>   s*    þô