U
    ð¤ùdð  ã                	   @   s¢   d Z ddlmZmZ zddlZW n0 ek
rP   dZd
eee edœdd„Z	Y nNX 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eee edœd	d„Z	dS )z&An implementation of RFC4013 SASLprep.é    )ÚAnyÚOptionalNFT)Ú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-oblwsawz/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 )ar  An implementation of RFC4013 SASLprep.

        :Parameters:
          - `data`: The string to SASLprep. Unicode strings
            (:class:`str`) are supported. Byte strings
            (:class:`bytes`) are ignored.
          - `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).

        :Returns:
        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>U   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>n   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   4   s*    
ÿ

)T)T)Ú__doc__Útypingr   r   r   ÚImportErrorZHAVE_STRINGPREPÚboolr   r   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&   
ô