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
rd}|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rz|tt|d
j d}W n ty   d}Y nw |rt	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    
 &%.
-,=