B
    à%Q[K   ã               @   s¶   d Z ddlmZmZ ddlZddlZddlmZmZm	Z	m
Z
 ddlmZ ddlmZ d d	d
„Zd!dd„Zd"dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )#Ú
é    )Ú	b64encodeÚ	b64decodeNé   )ÚSEQUENCE_TYPESÚSTRING_TYPESÚNUMERIC_TYPESÚget_config_parameter)ÚCaseInsensitiveDict)ÚLDAPDefinitionErrorFc             C   sD  t dƒ}t dƒ}t dƒ}t dƒ}t| tƒr2t| ƒ} t| ttfƒ�r|r®|dkrR|}y
|  |¡S  tk
rª   x,|D ]$}y
|  |¡S  tk
r”   Y qrX qrW td|  ƒ‚Y nX nj|dkrº|}y
|  |¡S  tk
�r   x.|D ]&}y
|  |¡S  tk
�r    Y qÜX qÜW td|  ƒ‚Y nX t| t	ƒ�r(| S tdt
| ƒjj| f ƒ‚dS )	zƒTry to convert bytes (and str in python2) to unicode.
     Return object unmodified if python3 string, else raise an exception
    ZDEFAULT_CLIENT_ENCODINGZDEFAULT_SERVER_ENCODINGZADDITIONAL_SERVER_ENCODINGSZADDITIONAL_CLIENT_ENCODINGSNz,Unable to convert server data to unicode: %rz,Unable to convert client data to unicode: %rz(Unable to convert type %s to unicode: %r)r	   Ú
isinstancer   ÚstrÚbytesÚ	bytearrayÚdecodeÚUnicodeDecodeErrorÚUnicodeErrorr   ÚtypeÚ	__class__Ú__name__)ÚobjÚencodingZfrom_serverZconf_default_client_encodingZconf_default_server_encodingZ conf_additional_server_encodingsZ conf_additional_client_encodings© r   úSC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6i93dh7p\ldap3\ldap3\utils\conv.pyÚ
to_unicode#   sB    








r   úutf-8c             C   sL   t | tƒrt| ƒ} t | tƒsHt | tƒr4dd„ | D ƒS t | tƒrH|  |¡S | S )z*Tries to convert to raw bytes from unicodec             S   s   g | ]}t |ƒ‘qS r   )Úto_raw)Ú.0Úelementr   r   r   ú
<listcomp>U   s    zto_raw.<locals>.<listcomp>)r   r   r   r   r   r   Úencode)r   r   r   r   r   r   N   s    




r   c             C   s€   |dkrt dƒ}yJt| |ƒ} |  dd¡}| dd¡}| dd¡}| d	d
¡}| dd¡}W n  tk
rz   tt| ƒƒ}Y nX |S )z$ Escape chars mentioned in RFC4515. NZDEFAULT_ENCODINGú\z\5cÚ*z\2aú(z\28ú)z\29ú z\00)r	   r   ÚreplaceÚ	ExceptionÚescape_bytes)Útextr   Úescapedr   r   r   Úescape_filter_chars[   s    
r+   c             C   sv   | rbt tk	r8t| t ƒr"t| dd�} d dd„ | D ƒ¡}qft| tƒrL|  d¡} d dd„ | D ƒ¡}nd}|rrd| S dS )zY Convert a byte sequence to a properly escaped for LDAP (format BACKSLASH HEX HEX) stringzutf-8)r   r!   c             S   s   g | ]}d t |ƒ ‘qS )z%02x)Úint)r   Úbr   r   r   r   t   s    z escape_bytes.<locals>.<listcomp>c             S   s   g | ]}d t |ƒ ‘qS )z%02x)Úord)r   r-   r   r   r   r   x   s    Ú )r   r   r   r   ÚjoinÚunicoder    )Zbytes_valuer*   r   r   r   r(   n   s    


r(   c             C   s   t tk	r| S |  ¡ S d S )N)r   r   r   )Úvaluer   r   r   Úprepare_for_stream   s    r3   c          
   C   sT   yt dt| ƒd�S  tk
rN } z tdt| ƒ d t|ƒ ƒ‚W d d }~X Y nX d S )NÚbase64)r   Úencodedzunable to encode z - )Údictr   r'   r   r   )r   Úer   r   r   Újson_encode_b64…   s    r8   c             C   s¨   x¢|   ¡ D ]–\}}t|tƒr&t|ƒ q
t|tƒr<t|jƒ q
t|tƒr”xXt|ƒD ]>\}}t|tƒrlt|ƒ qPt|tƒr‚t|jƒ qPt|ƒ||< qPW q
t|ƒ| |< q
W d S )N)	Úitemsr   r6   Úcheck_json_dictr
   Ú_storer   Ú	enumerateÚformat_json)Z	json_dictÚkÚvÚir7   r   r   r   r:   �   s    






r:   c             C   sF   t | dƒrBtt|  ¡ ƒƒdkrBd|  ¡ krBd|  ¡ krBt| d ƒS | S )NÚkeysr   r   r5   )ÚhasattrÚlenÚlistrA   r   )r   r   r   r   Ú	json_hook¡   s    6rE   c          	   C   sä   t | tƒr| jS t | tjƒr$t| ƒS t | tƒr2| S ttkrHt | tƒrH| S yLttk	r|t | tƒrjt| ddd�S tdt| ƒ ƒ‚nt | t	ƒrŠ| S t	| ƒS W n t
tfk
r¬   Y nX ytt| ƒƒS  tk
rÎ   Y nX tdt| ƒ ƒ‚d S )Nzutf-8Ústrict)Úerrorszunable to serialize )r   r
   r;   Údatetimer   r,   r   Úlongr   r1   Ú	TypeErrorr   r8   r'   )r   r   r   r   r=   ©   s0    




r=   c                sD   t ˆ ƒttk	rtptks tdƒ‚t‡ fdd„dD ƒƒoBt dˆ ¡ S )Nzunicode input expectedc             3   s   | ]}|ˆ kV  qd S )Nr   )r   Úc)r)   r   r   ú	<genexpr>Ò   s    z$is_filter_escaped.<locals>.<genexpr>z()* z \\([^0-9a-fA-F]|(.[^0-9a-fA-F])))r   r   r   r1   Ú
ValueErrorÚallÚreÚsearch)r)   r   )r)   r   Úis_filter_escapedÎ   s    rQ   c             C   sp   t ƒ }|  d¡rd|  d¡}x@|dd … D ]0}t|ƒdkrH| ¡ sHtdƒ‚| t|dƒ¡ q(W t|ƒS tdƒ‚d S )Nr!   é   r   z*badly formatted LDAP byte escaped sequenceé   )	r   Ú
startswithÚsplitrC   Úisdigitr   Úappendr,   r   )r)   ZbytesequenceZbyte_valuesr2   r   r   r   Úldap_escape_to_bytesÕ   s    

rX   )NF)r   )N)Ú__doc__r4   r   r   rH   rO   r/   r   r   r   r	   Zutils.ciDictr
   Zcore.exceptionsr   r   r   r+   r(   r3   r8   r:   rE   r=   rQ   rX   r   r   r   r   Ú<module>   s"   
+

%