o
    ßý°ji8  ã                   @   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¡\}}}|r&|r | ¡ | ¡ f}|S ||f}|S |r8| ¡ | d | | ¡  }|S || d | | }|S )NÚ ú ú=)Ú	partitionÚstrip)	ÚavaÚ	decomposeÚremove_spaceÚspace_around_equalÚspaceÚ	attr_nameÚ_ÚvalueÚ	component© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/utils/dn.pyÚ_add_ava%   s   	ùûþr   Fc           	      C   s¦   g }d}d}| D ]>}|dkrd}n1|r|dkrd}n(|dkr-|r-|  t||||ƒ¡ d}q|dkrBd|v rB|  t||||ƒ¡ d}q||7 }q|  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   Úseparate_rdnÚdnr   Úescape_sequenceÚcr   r   r   Úto_dn9   s(   
r$   c                 C   s’   	 |   ||¡}|dkr	 |S |dkr| |d  dkr	 |S |dkrD| |d  dkrDd}| |d dd… D ]
}|dkr>| }q4 |sD	 |S |d7 }q©NTéÿÿÿÿr   r	   r   r   )Úfind)r!   ÚcharÚposÚescapedr#   r   r   r   Ú_find_first_unescapedY   s&   óõþñr+   c                 C   sž   	 |   |||¡}|dkr	 |S |dkr| |d  dkr	 |S |dkrE| |d  dkrEd}| |d dd… D ]
}|dkr?| }q5 |sE	 |S ||k rNd}	 |S qr%   )Úrfind)r!   r(   ÚstartÚstopr*   r#   r   r   r   Ú_find_last_unescapedn   s,   ñóüír/   c                 C   s´   t | ddƒ}t | ddƒ}|dkr5||k s|dkr5t | d|d ƒ}||d kr5t| d||ƒ}| d |… dfS |dkrVt | d|d ƒ}||d krVt| 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_ava…   s   r3   Tc                 C   sÖ   |   d¡}|dkra| |d  dkrU|r7| d|…  ¡ }|r)t| |d d …  ¡ ƒn	| |d d …  ¡ }||fS | d|… }|rIt| |d d … ƒn| |d d … }||fS |   d|d ¡}|dks	d|rh| jfS | fS )Nr   r   r	   r   r
   )r'   r   Ú_escape_attribute_value)r   Úescaper   r2   Úattribute_typeÚattribute_valuer   r   r   Ú
_split_ava˜   s   
0ý(õr8   c                 C   sz   | st dƒ‚| dkrdS | D ]}|tv s$|tv s$|dks$t d| d ƒ‚q| d tv s1| d dkr;t 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   )r6   r#   r   r   r   Ú_validate_attribute_typeª   s   €r:   c                 C   s"  | sdS | d dkr'| D ]}|t vrtd| d ƒ‚qt| ƒd dkr'tdƒ‚| d dkr1td	ƒ‚|  d¡r?|  d
¡s?tdƒ‚t}| D ]C}|tkr]|dkrPt}qC|dv r\td| d ƒ‚qC|tkru|t v rht}qC|dv rot}qCtd| ƒ‚|tkr†|t v r€t}qCtd| ƒ‚qC|tkr�tdƒ‚dS )NFr   ú#z
character z5 not allowed in hex representation of attribute valuer   z:hex representation must be in the form of <HEX><HEX> pairsr   z=SPACE must be escaped as leading character of attribute valueú\ z>SPACE must be escaped as trailing character of attribute valuer   ú	"#+,;<=> zspecial character z must be escapedú "#+,;<=>\ zinvalid escaped character zinvalid final characterT)r   r   ÚlenÚendswithÚ	STATE_ANYÚSTATE_ESCAPEÚSTATE_ESCAPE_HEX)r7   r#   Ústater   r   r   Ú_validate_attribute_value»   sF   ÿÿürE   c                 C   sŒ  | sdS | d dkr)d}t | ƒd dkrd}|r%| D ]
}|tvr$d} nq|r)| S t}d}d}| D ][}|tkrN|dkr>t}q1|dv rI|d| 7 }q1||7 }q1|tkro|tv r[|}t}q1|d	v rh|d| 7 }t}q1|d
| 7 }q1|tkrŒ|tv r€|d| | 7 }n|d
| | 7 }d}t}q1|tkr–|d
7 }n
|tkr |d
| 7 }|d dkrªd| }|d dkrÄt |ƒdkrÄ|d dkrÄ|d d… d }|S )Nr
   r   r;   Tr   Fr   r=   r>   z\\r   r&   r	   éþÿÿÿr<   )r?   r   rA   rB   rC   )r7   Ú	valid_hexr#   rD   r*   Ú
tmp_bufferr   r   r   r4   å   s`   þ
€
$r4   c           	      C   s  g }g }| rLt | ƒ\}}| t|ƒd d… } t|ddƒdks$t|ƒdkr,| ||f¡ n|t|ƒd  d |t|ƒd  d  | |f|t|ƒd < | s|D ]2\}}t|||ƒ\}}t|ƒsdtd| ƒ‚t|ƒsntd| ƒ‚| |||f¡ | t|ƒd d… } qN|s‡tdƒ‚|S )a†  
    Parses a DN into syntactic components
    :param dn:
    :param escape:
    :param strip:
    :return:
    a list of tripels representing `attributeTypeAndValue` elements
    containing `attributeType`, `attributeValue` and the following separator (`COMMA` or `PLUS`) if given, else an empty `str`.
    in their original representation, still containing escapes or encoded as hex.
    r	   Nr   r   z%unable to validate attribute type in z&unable to validate attribute value in zempty dn)r3   r?   r+   r   r8   r:   r   rE   )	r!   r5   r   ÚrdnsÚavasr   Ú	separatorr6   r7   r   r   r   Úparse_dn"  s(   <ù	rL   c                 C   sT  t | tƒrdd„ | D ƒ}|rd t|ƒ¡} nd |¡} |r g }nd}|  d¡r0|  d¡r0| }|S |  d¡r>|  d¡r>| }|S |  d¡rL|  d¡rL| }|S d	| vr|t| d
d�D ]#}|ri| |d |d |d f¡ qV||d d |d  |d  7 }qV|S d	| v r‘d| vr‘t|  	d	¡ƒdkr‘t
dƒ‚d| v r¦d| vr¦t|  	d¡ƒdkr¦t
dƒ‚| }|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>P  s    zsafe_dn.<locals>.<listcomp>r   r
   z<GUID=ú>z<WKGUID=z<SID=ú@T©r5   r   r	   r   r   z@Active Directory User Principal Name must consist of name@domainr   zDActive Directory Domain Level Logon Name must consist of name\domain)Ú
isinstancer   ÚjoinÚreversedÚ
startswithr@   rL   r   r?   Úsplitr   )r!   r   ÚreverseÚ
componentsÚ
escaped_dnr   r   r   r   Úsafe_dnJ  s:   

ïñó""ù"r[   c                 C   s’   g }d}t | dd�D ]2}|d dks|r<|r"| |d |d f¡ n| |d d |d  ¡ |d dkr8d}q
d} nq
|rGt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 usedTrR   r   r   r   r	   r   Fzbad dn )rL   r   r   Ústr)r!   r   Úescaped_rdnÚone_morer   r   r   r   Úsafe_rdnp  s   ÷r_   c                 C   sf   dD ]
}|   |d| ¡} q| d dks| d dkr d d| f¡} | d dkr1d | dd… d	f¡} | S )
zK
    Escape rdn characters to prevent injection according to RFC 4514.
    )	r   r   r   ú"ú<rP   ú;r   ú r   r   r;   r   r
   r&   Nr<   )ÚreplacerT   )rN   r(   r   r   r   Ú
escape_rdn†  s   re   N)FFFF)r   )FT)FF)F)Ú__doc__Ústringr   r   r   r
   r   Úcore.exceptionsr   rA   rB   rC   r   r$   r+   r/   r3   r8   r:   rE   r4   rL   r[   r_   re   r   r   r   r   Ú<module>   s(    
 

*
=
(
&