
    >OOfi8                         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 ZddZd	 Zdd
Zd ZddZd Zd Zd ZddZddZddZd Zy)
    )	hexdigitsascii_lettersdigits   )SEQUENCE_TYPES)LDAPInvalidDnError   c                    | sy|rdnd}| j                  d      \  }}}|r*|r"|j                         |j                         f}|S ||f}|S |r,|j                         |z   dz   |z   |j                         z   }|S ||z   dz   |z   |z   }|S )N  =)	partitionstrip)	ava	decomposeremove_spacespace_around_equalspace	attr_name_value	components	            O/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/ldap3/utils/dn.py_add_avar   %   s    %C2E--,Iq%"*EKKM:I  #E*I  !)E1C7%?%++-OI  "E)C/%7%?I    c           	      (   g }d}d}| D ]i  }|dk(  rd}nZ|r|dk7  rd}nP|dk(  r"|r |j                  t        ||||             d}<|dk(  r$d|v r |j                  t        ||||             d}e||z  }k |j                  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cs	            r   to_dnr'   9   s     
BIO 9"Oc#O#X,IIhy)\CUVWI#Xi		(9iGYZ[	Q	" IIhy)\;MNOIr   c                     	 | j                  ||      }|dk(  r	 |S |dkD  r| |dz
     dk7  r	 |S |dkD  r,| |dz
     dk(  r!d}| |dz
  dd   D ]  }|dk(  r| } n |s	 |S |dz  }dNTr   r
   r   r   )find)r$   charposescapedr&   s        r   _find_first_unescapedr/   Y   s    
ggdC "9 J 7r#'{d* J 1WC!G,Ga"% 9")kG	
  J 	q r   c                     	 | j                  |||      }|dk(  r	 |S |dk\  r| |dz
     dk7  r	 |S |dkD  r,| |dz
     dk(  r!d}| |dz
  dd   D ]  }|dk(  r| } n |s	 |S ||k  rd}	 |S jr)   )rfind)r$   r,   startstopr.   r&   s         r   _find_last_unescapedr4   n   s    
xxeT*2:  K 19D1H- K AX"TAX,$.Gq2& 9")kG	
 
 K	 %<DK' r   c                    t        | dd      }t        | dd      }|dkD  r7||k  s|dk(  r-t        | d|dz         }||dz   kD  rt        | d||      }| d | dfS |dkD  r-t        | d|dz         }||dz   kD  rt        | d||      }| d | dfS | dfS )Nr    r   r   r*   r   r
   r   )r/   r4   )r$   commaplusequals       r   _get_next_avar9      s    !"c1-E S!,DaxTE\Ub[%b#tax84!8'Cu=Det9c>!qy%b#uqy9519(S%?Efu:s?"r6Mr   c                    | j                  d      }|dkD  r| |dz
     dk7  rt|rN| d| j                         }|rt        | |dz   d  j                               n| |dz   d  j                         }||fS | d| }|rt        | |dz   d        n| |dz   d  }||fS | j                  d|dz         }|dkD  rd|r| j                  fS | fS )Nr   r   r
   r   r   )r+   r   _escape_attribute_value)r   escaper   r8   attribute_typeattribute_values         r   
_split_avar?      s    HHSME
!)uqy>T!!$Qu!3!3!5V\"9#eaij/:O:O:Q"Rbefknofofpbqbwbwby
 "?22 "%QuNT"9#eaij/"JZ]^cfg^g^hZi!?22eai( !) U		,,,,r   c                     | st        d      | dk(  ry| D ]*  }|t        v r|t        v r|dk(  rt        d|z   dz          | d   t        v s| d   dk(  rt        d| d   z   dz         y)	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   )r=   r&   s     r   _validate_attribute_typerB      s     !=>>  ^]"a6kQ#X$^a%7:\%\]]^ aF"nQ&73&> .2C!CF{!{||r   c                 X   | sy| d   dk(  r<| D ]  }|t         vst        d|z   dz          t        |       dz  dk(  rt        d      | d   dk(  rt        d	      | j                  d      r| j                  d
      st        d      t        }| D ]  }|t        k(  r"|dk(  rt
        }|dv st        d|z   dz         |t
        k(  r(|t         v rt        }F|dv rt        }Qt        d|z         |t        k(  si|t         v rt        }xt        d|z          |t        k7  rt        d      y)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)r>   r&   states      r   _validate_attribute_valuerN      s_   qS   	uA	!()9<s)stt	u !#q($%abbqS  !`aa$_-E-Ee-L !abbE KIDy$m#()=)ADV)VWWl"I~(&&!()E)IJJ&&I~!()E)IJJ#K( 	 !:;;r   c                 ^   | sy| d   dk(  r.d}t        |       dz  dk(  rd}|r| D ]  }|t        vsd} n |r| S t        }d}d}| D ]  }|t        k(  r|dk(  rt        }|dv r	|d|z   z  }%||z  }+|t        k(  r-|t        v r	|}t        }E|d	v r|d|z   z  }t        }X|d
|z   z  }a|t        k(  sk|t        v r|d|z   |z   z  }n|d
|z   |z   z  }d}t        } |t        k(  r|d
z  }n|t        k(  r|d
|z   z  }|d   dk(  rd|z   }|d   dk(  rt        |      dkD  r|d   dk7  r|d d dz   }|S )Nr   r   rD   Tr   Fr   rF   rG   z\\r   r*   r
   rE   )rH   r   rJ   rK   rL   )r>   	valid_hexr&   rM   r.   
tmp_buffers         r   r;   r;      s   qS 	!#q(I$ I% %I
 ""EGJ IDy$m#4!8#1l"I~
(&&4!8#!6A:%&&I~4*,q006J.22JE/4 6	"	"6J&&qzS.r{cc'lQ.72;$3F#2,&Nr   c                 0   g }g }| rt        |       \  }}| t        |      dz   d } t        |dd      dkD  st        |      dk(  r|j                  ||f       n=|t        |      dz
     d   |t        |      dz
     d   z   |z   |f|t        |      dz
  <   | r|D ]l  \  }}t	        |||      \  }}t        |      st        d|z         t        |      st        d|z         |j                  |||f       | t        |      dz   d } n |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)r9   rH   r/   r!   r?   rB   r	   rN   )	r$   r<   r   rdnsavasr   	separatorr=   r>   s	            r   parse_dnrW   "  sC    DD
&r*YC1 c1-1SY!^KKi()#'D	A#6q#9DTQ<OPQ<R#RUX#XZc"dDTQ   
Y*4S&%*H''7$%Ls%RSS(9$%MPS%STT^_i@AC1
  ,,Kr   c                    t        | t              r=| D cg c]  }| }}|rdj                  t        |            } ndj                  |      } |rg }nd}| j	                  d      r| j                  d      r| }|S | j	                  d      r| j                  d      r| }|S | j	                  d      r| j                  d      r| }|S d| vrKt        | d	      D ]9  }|r|j                  |d
   |d   |d   f       #||d
   dz   |d   z   |d   z   z  }; |S d| v r,d| vr(t        | j                  d            dk7  rt        d      d| v r,d| vr(t        | j                  d            dk7  rt        d      | }|S c c}w )z
    normalize and escape a dn, if dn is a sequence it is joined.
    the reverse parameter changes the join direction of the sequence
    r    r   z<GUID=>z<WKGUID=z<SID=@Tr<   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
startswithrI   rW   r!   rH   splitr	   )r$   r   reverserdn
components
escaped_dnr   s          r   safe_dnre   J  s   
 "n%%'(cc(
((:./B*%B

	}}X2;;s#3
$ # 
z	"r{{3'7
   
w	BKK$4
  
B!"T2 	OI!!9Q<1y|"LMilS09Q<?)A,NN
		O  
s"}RXXc]);q)@ !cdd	2#bhhtn*=*B !hii
; )s   	E:c                    g }d}t        | d      D ]T  }|d   dk(  s|s|r|j                  |d   |d   f       n|j                  |d   dz   |d   z          |d   dk(  rd}Rd} n |rt        d	t        |       z         |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 usedTr[   r   r   r   r
   r   Fzbad dn )rW   r!   r	   str)r$   r   escaped_rdnone_morer   s        r   safe_rdnrj   p  s    KHb. 
	Q<3(""IaL)A,#?@""9Q<##5	!#DE|s" 
  SW!455r   c                     dD ]  }| j                  |d|z         }  | d   dk(  s| d   dk(  rdj                  d| f      } | d   dk(  rdj                  | dd d	f      } | S )
zK
    Escape rdn characters to prevent injection according to RFC 4514.
    )	r   r    r   "<rY   ;r    r   r   rD   r   r   r*   NrE   )replacer]   )rb   r,   s     r   
escape_rdnrq     sz     B -kk$t,- 1v}A#ggtSk"
2w#~ggs3Bx'(Jr   N)FFFF)r   )FT)FF)F)__doc__stringr   r   r   r   r   core.exceptionsr	   rJ   rK   rL   r   r'   r/   r4   r9   r?   rB   rN   r;   rW   re   rj   rq    r   r   <module>rv      sp   2 4 3  0 	 (@*.&-$"'T:z%P#L,r   