B
    à%Q[Ê3  ã               @   s´   d Z ddlmZmZmZ ddlmZ ddlmZ dZ	dZ
dZdd„ Zd$d
d„Zdd„ Zd%dd„Zdd„ Zd&dd„Zdd„ Zdd„ Zdd„ Zd'dd„Zd(dd„Zd)dd „Zd!d"„ Zd#S )*Ú
é    )Ú	hexdigitsÚascii_lettersÚdigitsé   )ÚSEQUENCE_TYPES)ÚLDAPInvalidDnErroré   c       	      C   s‚   | sdS |rdnd}|   d¡\}}}|rH|r>| ¡ | ¡ f}q~||f}n6|rj| ¡ | d | | ¡  }n|| d | | }|S )NÚ ú ú=)Ú	partitionÚstrip)	ÚavaÚ	decomposeÚremove_spaceÚspace_around_equalÚspaceÚ	attr_nameÚ_ÚvalueÚ	component© r   úQC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6i93dh7p\ldap3\ldap3\utils\dn.pyÚ_add_ava%   s    
r   Fc       	      C   s¬   g }d}d}x†| D ]~}|dkr$d}nd|r6|dkr6d}nR|dkr^|r^|  t||||ƒ¡ d}qn*|dkrˆd|krˆ|  t||||ƒ¡ d}q||7 }qW |  t||||ƒ¡ |S )	ac  
    Convert an iterator to a list of dn parts
    if decompose=True return a list of tuple (one for each dn component) else return a list of strings
    if remove_space=True removes unneeded spaces
    if space_around_equal=True add spaces around equal in returned strings
    if separate_rdn=True consider multiple RDNs as different component of DN
    r
   Fú\Tr   ú+ú,r   )Úappendr   )	Úiteratorr   r   r   Zseparate_rdnÚdnr   Zescape_sequenceÚcr   r   r   Úto_dn9   s(    
r"   c             C   sB   x<|   ||¡}|dkrP |dkr2| |d  dkr2P |d7 }qW |S )Néÿÿÿÿr   r	   r   )Úfind)r    ÚcharÚposr   r   r   Ú_find_first_unescapedY   s    r'   c             C   sJ   xD|   |||¡}|dkrP |dkr4| |d  dkr4P ||k rd}P qW |S )Nr#   r   r	   r   )Úrfind)r    r%   ÚstartÚstopr   r   r   Ú_find_last_unescapedf   s    r+   c             C   s´   t | ddƒ}t | ddƒ}|dkrj||k s0|dkrjt | d|d ƒ}||d krjt| d||ƒ}| d |… dfS |dkr¬t | d|d ƒ}||d kr¬t| d||ƒ}| d |… dfS | dfS )Nr   r   r   r#   r   r	   r
   )r'   r+   )r    ÚcommaÚplusÚequalr   r   r   Ú_get_next_avau   s    r/   Tc             C   sÌ   |   d¡}x®|dkr¸| |d  dkr¦|rj| d|…  ¡ }|rTt| |d d …  ¡ ƒn| |d d …  ¡ }n4| d|… }|rŽt| |d d … ƒn| |d d … }||fS |   d|d ¡}qW d|rÆ| jn| fS )Nr   r   r	   r   r
   )r$   r   Ú_escape_attribute_value)r   Úescaper   r.   Úattribute_typeÚattribute_valuer   r   r   Ú
_split_avaˆ   s    

2(r4   c             C   s~   | st dƒ‚| dkrdS x4| D ],}|tks|tks|dkst d| d ƒ‚qW | d tksf| d dkrzt d| d  d ƒ‚dS )	Nzattribute type not presentz<GUIDTú-zcharacter 'z' not allowed in attribute typer   z2' not allowed as first character of attribute type)r   r   r   )r2   r!   r   r   r   Ú_validate_attribute_typeš   s    
r6   c             C   s(  | sdS | d dkrRx$| D ]}dt krtd| d ƒ‚qW t| ƒd dkrRtdƒ‚| d d	krftd
ƒ‚| d d	krztdƒ‚t}x’| D ]Š}|tkr¸|dkržt}n|dkr¶td| d ƒ‚q„|tkrê|t krÎt}n|dkrÜt}ntd| ƒ‚q„|tkr„|t k�rt}q„td| ƒ‚q„W |tk�r$tdƒ‚dS )NFr   ú#r!   z
character z5 not allowed in hex representation of attribute valuer   z:hex representation must be in the form of <HEX><HEX> pairsr   z7SPACE not allowed as first character of attribute valuer#   z6SPACE not allowed as last character of attribute valuer   z	"#+,;<=> zspecial characters z must be escapedz "#+,;<=>\ zinvalid escaped character zinvalid final characterT)r   r   ÚlenÚ	STATE_ANYÚSTATE_ESCAPEÚSTATE_ESCAPE_HEX)r3   r!   Ústater   r   r   Ú_validate_attribute_value«   s@    



r=   c             C   s   | sdS | d dkrTd}t | ƒd dkr,d}|rLx| D ]}|tkr6d}P q6W |rT| S t}d}d}xÀ| D ]¸}|tkr |dkr€t}n|dkr–|d| 7 }n||7 }qf|tkrâ|tkrº|}t}n&|d	krÔ|d| 7 }t}n|d
| 7 }qf|tkrf|tk�r|d| | 7 }n|d
| | 7 }d}t}qfW |tk�r6|d
7 }n|tk�rL|d
| 7 }|d dk�rbd| }|d dk�rœt |ƒdk�rœ|d dk�rœ|d d… d }|S )Nr
   r   r7   Tr   Fr   z	"#+,;<=> z "#+,;<=>\ z\\r   r#   r	   éþÿÿÿz\ )r8   r   r9   r:   r;   )r3   Z	valid_hexr!   r<   ÚescapedZ
tmp_bufferr   r   r   r0   Õ   s\    






*r0   c       	      C   s  g }g }x�| r˜t | ƒ\}}| t|ƒd d … } t|ddƒdksJt|ƒdkrZ| ||f¡ q
|t|ƒd  d |t|ƒd  d  | |f|t|ƒd < q
W xl|D ]d\}}t|||ƒ\}}t|ƒsÌtd| ƒ‚t|ƒsàtd| ƒ‚| |||f¡ | t|ƒd d … } q W |�stdƒ‚|S )Nr	   r   r   z%unable to validate attribute type in z&unable to validate attribute value in zempty dn)r/   r8   r'   r   r4   r6   r   r=   )	r    r1   r   ZrdnsZavasr   Ú	separatorr2   r3   r   r   r   Úparse_dn  s&    @rA   c             C   s.  t | tƒr6dd„ | D ƒ}|r,d t|ƒ¡} n
d |¡} |r@g }nd}|  d¡r^|  d¡r^| }nÌd| krÈd| krÈxºt| d	d
�D ]F}|r¢| |d |d |d f¡ q|||d d |d  |d  7 }q|W nbd| krôd| krôt|  	d¡ƒdkrôt
dƒ‚n6d| k�r&d| k�r&t|  	d¡ƒdk�r&t
dƒ‚n| }|S )z‹
    normalize and escape a dn, if dn is a sequence it is joined.
    the reverse parameter changes the join direction of the sequence
    c             S   s   g | ]}|‘qS r   r   )Ú.0Úrdnr   r   r   ú
<listcomp>6  s    zsafe_dn.<locals>.<listcomp>r   r
   z<GUID=ú>ú@r   T)r1   r   r	   r   r   z@Active Directory User Principal Name must consist of name@domainzDActive Directory Domain Level Logon Name must consist of name\domain)Ú
isinstancer   ÚjoinÚreversedÚ
startswithÚendswithrA   r   r8   Úsplitr   )r    r   ÚreverseÚ
componentsZ
escaped_dnr   r   r   r   Úsafe_dn0  s*    

&"
(
rO   c             C   s”   g }d}xrt | dd�D ]b}|d dks*|r|rF| |d |d f¡ n| |d d |d  ¡ |d dkrrd}qd}P qW |r�td	t| ƒ ƒ‚|S )
ztReturns a list of rdn for the dn, usually there is only one rdn, but it can be more than one when the + sign is usedT)r1   r   r   r   r	   r   Fzbad dn )rA   r   r   Ústr)r    r   Zescaped_rdnZone_morer   r   r   r   Úsafe_rdnR  s    rQ   c             C   sj   xdD ]}|   |d| ¡} qW | d dks6| d dkrDd d| f¡} | d dkrfd | dd… d	f¡} | S )
zK
    Escape rdn characters to prevent injection according to RFC 4514.
    )	r   r   r   ú"ú<rE   ú;r   ú r   r   r7   r   r
   r#   Nz\ )ÚreplacerH   )rC   r%   r   r   r   Ú
escape_rdnh  s    
rW   N)FFFF)r   )FT)FT)FF)F)Ú__doc__Ústringr   r   r   r
   r   Zcore.exceptionsr   r9   r:   r;   r   r"   r'   r+   r/   r4   r6   r=   r0   rA   rO   rQ   rW   r   r   r   r   Ú<module>   s&   
 

*=

"
