o
    �õ±j"  ã                   @  s\   d dl mZ d dlZd dlmZ G dd„ dƒZG dd„ dƒZG dd	„ d	ƒZG d
d„ dƒZdS )é    )ÚannotationsN)ÚListc                   @  sX   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zd	d
„ Zdd„ Z	edd„ ƒZ
dd„ ZdS )ÚKeytabPrincipalc                 C  s   d | _ d | _d | _g | _d S ©N)Únum_componentsÚ	name_typeÚrealmÚ
components©Úself© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minikerberos/common/keytab.pyÚ__init__   s   
zKeytabPrincipal.__init__c                 C  sN   t ƒ }| d |_t| d ƒ|_t |¡|_| d D ]}|j t 	|¡¡ q|S )z'Returns a principal from asn1 and realmú	name-typeúname-string)
r   r   Úlenr   ÚKeytabOctetStringÚfrom_stringr   r	   ÚappendÚ	from_asn1)Ú	principalr   ÚpÚcompr   r   r   r      s   
zKeytabPrincipal.from_asn1c                  C  sB   t ƒ } d| _d| _t d¡| _tdƒD ]}| j t d¡¡ q| S )zReturns a dummy principalé   z
kerbi.corpÚkerbi)	r   r   r   r   r   r   Úranger	   r   )r   Ú_r   r   r   Úempty#   s   zKeytabPrincipal.emptyc                 C  s   d  dd„ | jD ƒ¡S )z!Returns the principal as a stringú-c                 S  ó   g | ]}|  ¡ ‘qS r   ©Ú	to_string)Ú.0Úcr   r   r   Ú
<listcomp>1   ó    z-KeytabPrincipal.to_string.<locals>.<listcomp>)Újoinr	   r
   r   r   r   r!   /   s   zKeytabPrincipal.to_stringc                 C  s   d  ttdd„ | jƒƒ¡S )z1Returns the principal as a string in pname formatú/c                 S  s   |   ¡ S r   r    )r#   r   r   r   Ú<lambda>5   s    z*KeytabPrincipal.to_pname.<locals>.<lambda>)r&   ÚlistÚmapr	   r
   r   r   r   Úto_pname3   s   zKeytabPrincipal.to_pnamec                 C  s&   | j dd„ | jD ƒdœ}|| j ¡ fS )z2Returns the principal as a tuple of asn1 and realmc                 S  r   r   r    )r"   Únamer   r   r   r$   9   r%   z+KeytabPrincipal.to_asn1.<locals>.<listcomp>)r   r   )r   r	   r   r!   ©r   Útr   r   r   Úto_asn17   s   zKeytabPrincipal.to_asn1c                 C  sh   t ƒ }tj|  d¡ddd�|_t | ¡|_t|jƒD ]}|j	 
t | ¡¡ qtj|  d¡ddd�|_|S )z$Parses the principal from the bufferé   ÚbigF©Ú	byteorderÚsignedé   )r   ÚintÚ
from_bytesÚreadr   r   Úparser   r   r	   r   r   )Úbufferr   r   r   r   r   Úfrom_buffer<   s   zKeytabPrincipal.from_bufferc                 C  sV   t | jƒjdddd�}|| j ¡ 7 }| jD ]}|| ¡ 7 }q|| jjdddd�7 }|S )z%Returns the principal as a byte arrayr0   r1   Fr2   r5   )r   r	   Úto_bytesr   r   )r   r.   Úcomr   r   r   r<   G   s   
zKeytabPrincipal.to_bytesN)Ú__name__Ú
__module__Ú__qualname__r   Ústaticmethodr   r   r!   r+   r/   r;   r<   r   r   r   r   r      s    



r   c                   @  sj   e Zd Zdd„ Zeddd„ƒZddd„Zdd
d„Zeddd„ƒZeddd„ƒZ	eddd„ƒZ
ddd„ZdS )r   c                 C  s   d | _ d | _d S r   )ÚlengthÚdatar
   r   r   r   r   R   s   
zKeytabOctetString.__init__Úreturnc                  C  s   t ƒ } d| _d| _| S )zCreates an empty octet stringr   ó    )r   rB   rC   )Úor   r   r   r   V   s   zKeytabOctetString.emptyÚbytesc                 C  s   | j S )ú(Returns the octet string as a byte array©rC   r
   r   r   r   r/   ^   s   zKeytabOctetString.to_asn1Ústrc                 C  ó
   | j  ¡ S )z$Returns the octet string as a string)rC   Údecoder
   r   r   r   r!   b   ó   
zKeytabOctetString.to_stringc                 C  s    t ƒ }|  ¡ |_t|jƒ|_|S )z%Creates an octet string from a string)r   ÚencoderC   r   rB   ©rC   rF   r   r   r   r   f   s   
zKeytabOctetString.from_stringc                 C  s2   t ƒ }t| ƒ|_t| tƒr|  ¡ |_|S | |_|S )z+Creates an octet string from an asn1 object)r   r   rB   Ú
isinstancerJ   rN   rC   rO   r   r   r   r   n   s   


ÿzKeytabOctetString.from_asn1Úreaderú
io.BytesIOc                 C  s0   t ƒ }tj|  d¡ddd�|_|  |j¡|_|S )z'Parses the octet string from the readerr0   r1   Fr2   )r   r6   r7   r8   rB   rC   )rQ   rF   r   r   r   r9   y   s   zKeytabOctetString.parsec                 C  sH   t | jtƒr| j ¡ | _t| jƒ| _t| jƒjdddd�}|| j7 }|S )rH   r0   r1   Fr2   )rP   rC   rJ   rN   r   rB   r<   r-   r   r   r   r<   �   s   
zKeytabOctetString.to_bytesN)rD   r   ©rD   rG   )rD   rJ   )rQ   rR   rD   r   )r>   r?   r@   r   rA   r   r/   r!   r   r   r9   r<   r   r   r   r   r   Q   s    


r   c                   @  sJ   e Zd Zdd„ Zddd„Zdd„ Zedd	d
„ƒZeddd„ƒZdd„ Z	dS )ÚKeytabEntryc                 C  s(   d | _ d | _d | _d | _d | _d | _d S r   )r   Ú	timestampÚkey_versionÚenctypeÚ
key_lengthÚkey_contentsr
   r   r   r   r   Œ   s   
zKeytabEntry.__init__rD   rG   c                 C  sp   | j  ¡ }|| jjdddd�7 }|| jjdddd�7 }|| jjdddd�7 }|| jjdddd�7 }|| j7 }|S )z!Returns the entry as a byte arrayr5   r1   F©r4   r   r0   )r   r<   rU   rV   rW   rX   rY   r-   r   r   r   r<   ”   s   

zKeytabEntry.to_bytesc                 C  rK   )z'Returns the principal name of the entry©r   r+   r
   r   r   r   r+   ž   rM   zKeytabEntry.to_pnamec                 C  ó   t  t | ¡¡S )z%Reads a KeytabEntry from a byte array)rT   r;   ÚioÚBytesIOrI   r   r   r   r7   ¢   ó   zKeytabEntry.from_bytesr:   rR   c                 C  s„   t ƒ }t | ¡|_tj|  d¡ddd�|_tj|  d¡ddd�|_tj|  d¡ddd�|_	tj|  d¡ddd�|_
|  |j
¡|_|S )z!Reads a KeytabEntry from a bufferr5   r1   Fr2   r   rZ   r0   )rT   r   r;   r   r6   r7   r8   rU   rV   rW   rX   rY   )r:   Úker   r   r   r;   §   s   zKeytabEntry.from_bufferc                 C  sd   d}|d| j  ¡  7 }|d| j 7 }|d| j 7 }|d| j 7 }|d| j 7 }|d| j ¡  7 }|S )Nz=== KeytabEntry ===
zPrincipal : %s
ztimestamp : %s
zkey_version : %s
zenctype : %s
zkey_length : %s
zkey_contents : %s
)r   r!   rU   rV   rW   rX   rY   Úhexr-   r   r   r   Ú__repr__³   s   zKeytabEntry.__repr__NrS   )rD   rT   )r:   rR   rD   rT   )
r>   r?   r@   r   r<   r+   rA   r7   r;   rb   r   r   r   r   rT   ‹   s    

rT   c                   @  sb   e Zd Zdd„ Zddd„Zdd„ Zedd
d„ƒZeddd„ƒZeddd„ƒZ	ddd„Z
dd„ ZdS )ÚKeytabc                 C  s   d| _ d| _g | _d S )Né   r0   )Úkrb5ÚversionÚentriesr
   r   r   r   r   À   s   
zKeytab.__init__rD   rG   c                 C  s`   | j jdddd�}|| jjdddd�7 }| jD ]}| ¡ }|t|ƒjdddd�7 }||7 }q|S )z"Returns the keytab as a byte arrayr   r1   FrZ   r5   )re   r<   rf   rg   r   )r   r.   ÚerC   r   r   r   r<   Å   s   

zKeytab.to_bytesc                 C  s   dd„ | j D ƒS )z2Returns all princial names available in the kaytabc                 S  s   g | ]}|j  ¡ ‘qS r   r[   )r"   rh   r   r   r   r$   Ò   s    z%Keytab.get_pnames.<locals>.<listcomp>)rg   r
   r   r   r   Ú
get_pnamesÐ   s   zKeytab.get_pnamesrC   c                 C  r\   )z Reads a keytab from a byte array)rc   r;   r]   r^   rI   r   r   r   r7   Ô   r_   zKeytab.from_bytesÚfilenamerJ   c                 C  s8   t | dƒ�}t |¡W  d  ƒ S 1 sw   Y  dS )zReads a keytab from a fileÚrbN)Úopenrc   r;   )rj   Úfr   r   r   Ú	from_fileÙ   s   $ÿzKeytab.from_filer:   rR   c                 C  sÔ   |   ¡ }|  dd¡ |   ¡ | }|  |d¡ tƒ }tj|  d¡ddd�|_tj|  d¡ddd�|_d}||k rhtj|  d¡ddd�}|dkrI	 |S |dk rT||d	 7 }q3|j 	t
 |  |¡¡¡ ||7 }||k s7|S )
zReads a keytab from a bufferr   r0   r   r1   FrZ   r5   Téÿÿÿÿ)ÚtellÚseekrc   r6   r7   r8   re   rf   rg   r   rT   )r:   ÚposÚbuffer_sizeÚkÚiÚ
entry_sizer   r   r   r;   ß   s(   ÷ôzKeytab.from_bufferc                 C  s>   t |dƒ�}| |  ¡ ¡ W d  ƒ dS 1 sw   Y  dS )zWrites the keytab to a fileÚwbN)rl   Úwriter<   )r   rj   rm   r   r   r   Úto_fileû   s   "ÿzKeytab.to_filec                 C  s.   d}|d| j  7 }| jD ]}|t|ƒ7 }q|S )Nz=== Keytab ===
zVersion : %s
)rf   rg   Úrepr)r   r.   rh   r   r   r   rb      s
   
zKeytab.__repr__NrS   )rC   rG   )rj   rJ   )r:   rR   rD   rc   )r>   r?   r@   r   r<   ri   rA   r7   rn   r;   ry   rb   r   r   r   r   rc   ¿   s    

rc   )	Ú
__future__r   r]   Útypingr   r   r   rT   rc   r   r   r   r   Ú<module>   s   
A:4