o
    Žõ±j  ã                   @   s@   d dl Z d dlZd dlmZmZ G dd„ dƒZG dd„ dƒZdS )é    N)ÚDictÚListc                   @   s   e Zd Zdd„ ZdS )ÚLDIFIdxc                 C   s   || _ || _|| | _d S ©N)ÚstartÚendÚlength)Úselfr   r   © r
   ú†/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/msldap/commons/ldif.pyÚ__init__   s   zLDIFIdx.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r
   r
   r
   r   r      s    r   c                   @   sf   e Zd Zddefdd„Zedefdd„ƒZdd	„ Zd
d„ Z	defdd„Z
dee fdd„Zdd„ ZdS )ÚMSLDAPLdiffé'  Úmax_cache_sizec                 C   s4   d | _ d | _i | _i | _i | _i | _|| _i | _d S r   )ÚfilenameÚ
filehandleÚdn_indexÚobjectclass_indexÚsamaccounttype_indexÚobjecttype_indexr   Údncache)r	   r   r
   r
   r   r      s   
zMSLDAPLdiff.__init__r   c                 Ã   s    �t ƒ }| |_| ¡ I d H  d S r   )r   r   Úparse)r   Úldiffr
   r
   r   Ú	from_file   s   €zMSLDAPLdiff.from_filec                 Ã   s$   �| j d u rt| jddd�| _ | j S )NÚrúutf-8©Úencoding)r   Úopenr   ©r	   r
   r
   r   Úopen_or_handle   s   €
zMSLDAPLdiff.open_or_handlec                 Ã   sx  �t dƒ t| jddd��¥}	 | ¡ }| ¡ }|s&|d ur%t||ƒ| j|< n„| d¡r?|d ur7t||ƒ| j|< | ¡  	¡ }|}| d¡r\| ¡  	¡ }|| j
vrTg | j
|< | j
|  |¡ | d¡ry| ¡  	¡ }|| j
vrqg | j
|< | j|  |¡ | d	¡r—| ¡  	¡ }|| j
vrŽg | j
|< | j|  |¡ n| ¡ s©|d ur©t||ƒ| j|< d }qW d   ƒ d S 1 sµw   Y  d S )
Nz[+] Building index...r   r   r   Tzdn: zobjectClass: zsAMAccountType: zobjectType: )Úprintr!   r   ÚtellÚreadliner   r   Ú
startswithÚstripÚupperr   Úappendr   r   )r	   ÚfÚposÚlineÚ
current_dnÚ	start_posÚobjectclassr
   r
   r   Úbuild_index"   sH   €









Ú"÷zMSLDAPLdiff.build_indexÚdnc                 Ã   sÄ   �|  ¡ }|| jv r| j| S || jvrd S g }|  ¡ I d H }| j| }| |j¡ | |j¡}| d¡D ]}| 	¡ }|dkr@q5| 
d¡rFq5| |¡ q5|  |¡}t| jƒ| jkr`| j ¡  d S d S )NÚ
Ú ú#)r)   r   r   r#   Úseekr   Úreadr   Úsplitr(   r'   r*   Úparse_entryÚlenr   Úpopitem)r	   r2   Ú	raw_entryr+   ÚidxÚdatar-   Úentryr
   r
   r   ÚfetchN   s,   €





ÿzMSLDAPLdiff.fetchr<   c                 C   sŽ   i }|D ]@}|  ¡ }|dkrq| d¡rq| dd¡\}}|  ¡ }|  ¡ }| dd¡d  d¡r5t |¡}||vr=g ||< ||  |¡ q|S )Nr4   r5   ú:é   r   z::)r(   r'   r8   ÚendswithÚbase64Ú	b64decoder*   )r	   r<   Úedr-   ÚkeyÚvaluer
   r
   r   r9   g   s    

zMSLDAPLdiff.parse_entryc                 Ã   s   �|   ¡ I d H  d S r   )r1   r"   r
   r
   r   r   }   s   €zMSLDAPLdiff.parseN)r   )r   r   r   Úintr   ÚstaticmethodÚstrr   r#   r1   r@   r   r9   r   r
   r
   r
   r   r      s    ,r   )ÚiorD   Útypingr   r   r   r   r
   r
   r
   r   Ú<module>   s
    