o
    ßý°jAM  ã                   @   s  d Z ddlmZmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZ d	d
lmZmZ ddlmZmZmZm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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 )-Ú
é    )Úa2b_hexÚhexlify)Údatetime)Útimegm)ÚUUID)Úpacké   )ÚSEQUENCE_TYPESÚSTRING_TYPESÚNUMERIC_TYPESÚINTEGER_TYPESé   )Úformat_timeÚformat_ad_timestamp)Úto_rawÚ
to_unicodeÚldap_escape_to_bytesÚescape_bytesc                 C   sH   t | ttfƒrd| v r|  dd¡} | S t | tƒr"d| v r"|  dd¡} | S )Nó   \s   \5Cú\z\5C)Ú
isinstanceÚ	bytearrayÚbytesÚreplacer   )Úvalue© r   ú—/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/protocol/formatters/validators.pyÚcheck_backslash(   s   
ýr   c                 C   s:   t | |ƒrdS t | tƒr| D ]
}t ||ƒs dS qdS dS )NTF)r   r
   )Úinput_valueÚ
value_typer   r   r   r   Ú
check_type2   s   


ÿr!   c                 C   s   dS )NTr   ©r   r   r   r   Úalways_valid@   s   r#   c                 C   s<   t | tƒsdS zt| ƒdkrW dS W dS  ty   Y dS w )NTr   F)r   r
   ÚlenÚ	Exceptionr"   r   r   r   Úvalidate_generic_single_valueD   s   
ÿýýr&   c                 C   sz   t | tƒst | tƒst | tƒrt| ƒdkrdS dS dS t| ƒdkr;t | d tƒs/t | d tƒr;t| d ƒdkr9dS dS dS )z4Accept -1 and 0 only (used by pwdLastSet in AD)
    éÿÿÿÿTFr   r   )r   r
   r   r   Úintr$   r"   r   r   r   Ú,validate_zero_and_minus_one_and_positive_intQ   s   
(r)   c           	      C   sÊ   t | ttfƒr	dS t | tƒrdS t| tƒsd}| g} nd}g }ddlm}m} | D ]3}z#t|t	ƒr5t
|ƒn|}||ƒ}t|ƒ}||krI| |¡ nW  dS W q) tt|fy\   Y  dS w |ra|S |d S )NFTr   )ÚDecimalÚInvalidOperation)r!   ÚfloatÚboolr   r   r
   Údecimalr*   r+   r   r   r(   ÚappendÚ
ValueErrorÚ	TypeError)	r   ÚsequenceÚvalid_valuesr*   r+   Úelementr   Údecimal_valueÚ	int_valuer   r   r   Úvalidate_integer_   s2   

þÿr7   c                 C   s
   t | tƒS )N)r!   r   r"   r   r   r   Úvalidate_bytes   s   
r8   c                 C   sx   t | ƒr:t| tƒr| d } t| tƒr| rdS dS ttur%t| tƒr%t| ƒ} t| tƒr:|  ¡ dkr2dS |  ¡ dkr:dS dS )Nr   ÚTRUEÚFALSEÚtrueÚfalseF)	r&   r   r
   r-   Ústrr   r   r   Úlowerr"   r   r   r   Úvalidate_booleanƒ   s   


r?   c                 C   sæ   t | tƒsd}| g} nd}g }d}| D ]S}ttur"t |tƒr"t|ƒ}t |tƒr>| d¡s5t tt|ƒƒt	ƒr;| 
|¡ q dS t |t	ƒrdd}|jrQ| 
| d¡¡ qt	 ¡ t	 ¡  }| 
||  d¡¡ q dS |rq|rm|S |d S dS )NFTÚ0000ú%Y%m%d%H%M%S%zú%Y%m%d%H%M%SZr   )r   r
   r=   r   r   r   Ú
startswithr   r   r   r/   ÚtzinfoÚstrftimeÚnowÚutcnow©r   r2   r3   Úchangedr4   Úoffsetr   r   r   Úvalidate_time_with_0_year—   s2   


rK   c                 C   sÜ   t | tƒsd}| g} nd}g }d}| D ]N}ttur"t |tƒr"t|ƒ}t |tƒr9t tt|ƒƒtƒr6| 	|¡ q dS t |tƒr_d}|j
rL| 	| d¡¡ qt ¡ t ¡  }| 	||  d¡¡ q dS |rl|rh|S |d S dS )NFTrA   rB   r   )r   r
   r=   r   r   r   r   r   r   r/   rD   rE   rF   rG   rH   r   r   r   Úvalidate_time½   s2   


rL   c                 C   s8  t | tƒsd}| g} nd}g }d}| D ]|}ttur"t |tƒr"t|ƒ}t |tƒr>d|  kr1dkr;n  dS | |¡ q dS t |tƒrUt tt	|ƒƒt
ƒrR| |¡ q dS t |t
ƒr�d}|jrq| t	t| ¡ ƒd d dd�¡ qt
 ¡ t
 ¡  }| t	t||  ¡ ƒd d dd�¡ q dS |rš|r–|S |d S dS )	a  
    Active Directory stores date/time values as the number of 100-nanosecond intervals
    that have elapsed since the 0 hour on January 1, 1601 till the date/time that is being stored.
    The time is always stored in Greenwich Mean Time (GMT) in the Active Directory.
    FTr   l   ÿÿÿÿ l    !l
 i€–˜ Úascii)Úencoding)r   r
   r=   r   r   r   r/   r   r   r   r   rD   r   ÚutctimetuplerF   rG   Ú	timetuplerH   r   r   r   Úvalidate_ad_timestampâ   s<   

þ

$(rQ   c                 C   s"   t | tƒr	| dkrdS t| d ƒS )z
    Should be validated like an AD timestamp except that since it is a time
    delta, it is stored as a negative number.
    r   Fr'   )r   r   rQ   r"   r   r   r   Úvalidate_ad_timedelta  s   rR   c                 C   sì   t | tƒsd}| g} nd}g }d}| D ]V}t |tƒrZz| t|ƒj¡ d}W q tyY   zt|ƒ}| t|d�j¡ d}W Y q tyX   tturKn| |¡ Y Y qY Y  dS w w t |tt	fƒrg| |¡ q dS |rt|rp|S |d S dS )z8
    object guid in uuid format (Novell eDirectory)
    FT)r   r   )
r   r
   r   r/   r   r   r0   r   r=   r   )r   r2   r3   rI   r4   Úxr   r   r   Úvalidate_guid  sD   


ýúúrT   c                 C   sî   t | tƒsd}| g} nd}g }d}| D ]W}t |tƒr[z| tt|ƒƒ¡ d}W q tyZ   z| tt| dd¡ƒƒ¡ d}W Y q tyY   tturLn| |¡ Y Y qY Y  dS w w t |tt	fƒrh| |¡ q dS |ru|rq|S |d S dS )z)
    object entryUUID in uuid format
    FTr   Ú r   )
r   r
   r   r/   r=   r   r0   r   r   r   )r   r2   r3   rI   r4   r   r   r   Úvalidate_uuidG  sB   


ýúûrV   c              	   C   sˆ  t | tƒsd}| g} nd}g }d}| D ]¤}d}t |tƒr¨|d dkrA|d dkrAz| t|d�j¡ d}W nf ty@   d}Y n\w d|v r^z| t|d�j¡ d}W nI ty]   d}Y n?w d	|v r}z| tt|ƒd
�j¡ d}W n* ty|   d}Y n w d|vrœz| tt|ƒd
�j¡ d}W n ty›   d}Y nw |r§t	t
u r§| |¡ qt |t
tfƒrµ| |¡ q dS |rÂ|r¾|S |d S dS )aÒ  
    Active Directory stores objectGUID in uuid_le format, follows RFC4122 and MS-DTYP:
    "{07039e68-4373-264d-a0a7-07039e684373}": string representation big endian, converted to little endian (with or without brace curles)
    "689e030773434d26a7a007039e684373": packet representation, already in little endian
    "\68\9e\03\07\73\43\4d\26\a7\a0\07\03\9e\68\43\73": bytes representation, already in little endian
    byte sequence: already in little endian

    FTr   Ú{r'   Ú})Úhexú-r   )Úbytes_le)r   r
   r   r/   r   r[   r0   r   r   r=   r   r   )r   r2   r3   rI   r4   Úerrorr   r   r   Úvalidate_uuid_les  s`   
	
ÿÿÿÿ
€r]   c                 C   s(  t | tƒsd}| g} nd}g }d}| D ]t}t |tƒr‡| d¡r‡| d¡}tdt|d ƒƒdd… }|tdt|dd	… ƒƒdd… 7 }t|d
 ƒdkrZ|tdt|d
 ƒƒd
d	… 7 }n|tdt|d
 dƒƒd
d	… 7 }|dd	… D ]}|tdt|ƒƒdd… 7 }qp| |¡ d}q|r’|rŽ|S |d S dS )a*
  
        SID= "S-1-" IdentifierAuthority 1*SubAuthority
               IdentifierAuthority= IdentifierAuthorityDec / IdentifierAuthorityHex
                  ; If the identifier authority is < 2^32, the
                  ; identifier authority is represented as a decimal
                  ; number
                  ; If the identifier authority is >= 2^32,
                  ; the identifier authority is represented in
                  ; hexadecimal
                IdentifierAuthorityDec =  1*10DIGIT
                  ; IdentifierAuthorityDec, top level authority of a
                  ; security identifier is represented as a decimal number
                IdentifierAuthorityHex = "0x" 12HEXDIG
                  ; IdentifierAuthorityHex, the top-level authority of a
                  ; security identifier is represented as a hexadecimal number
                SubAuthority= "-" 1*10DIGIT
                  ; Sub-Authority is always represented as a decimal number
                  ; No leading "0" characters are allowed when IdentifierAuthority
                  ; or SubAuthority is represented as a decimal number
                  ; All hexadecimal digits must be output in string format,
                  ; pre-pended by "0x"

        Revision (1 byte): An 8-bit unsigned integer that specifies the revision level of the SID. This value MUST be set to 0x01.
        SubAuthorityCount (1 byte): An 8-bit unsigned integer that specifies the number of elements in the SubAuthority array. The maximum number of elements allowed is 15.
        IdentifierAuthority (6 bytes): A SID_IDENTIFIER_AUTHORITY structure that indicates the authority under which the SID was created. It describes the entity that created the SID. The Identifier Authority value {0,0,0,0,0,5} denotes SIDs created by the NT SID authority.
        SubAuthority (variable): A variable length array of unsigned 32-bit integers that uniquely identifies a principal relative to the IdentifierAuthority. Its length is determined by SubAuthorityCount.

        If you have a SID like S-a-b-c-d-e-f-g-...

        Then the bytes are
        a 	(revision)
        N 	(number of dashes minus two)
        bbbbbb 	(six bytes of "b" treated as a 48-bit number in big-endian format)
        cccc 	(four bytes of "c" treated as a 32-bit number in little-endian format)
        dddd 	(four bytes of "d" treated as a 32-bit number in little-endian format)
        eeee 	(four bytes of "e" treated as a 32-bit number in little-endian format)
        ffff 	(four bytes of "f" treated as a 32-bit number in little-endian format)

    FTzS-rZ   z<qr   r   r	   Né   é
   z>qé   é   )	r   r
   r   rC   Úsplitr   r(   r$   r/   )r   r2   r3   rI   r4   ÚpartsÚ	sid_bytesÚsub_authr   r   r   Úvalidate_sid°  s2   
(


"  
€rf   N)(Ú__doc__Úbinasciir   r   r   Úcalendarr   Úuuidr   Ústructr   rU   r
   r   r   r   Ú
formattersr   r   Ú
utils.convr   r   r   r   r   r!   r#   r&   r)   r7   r8   r?   rK   rL   rQ   rR   rT   rV   r]   rf   r   r   r   r   Ú<module>   s2    
 &%.
-,=