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