a
    kÄ#d]:  ã                
   @   s  d Z ddlmZ ddlZddlZddlmZmZmZ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 ddlmZ dd	lmZ d
ddddddœZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ dd d!d"d#d$d%d&d'd(œ	Z!G d)d*„ d*eƒZ"G d+d,„ d,eƒZ#eeed-d.� eeed/d0� eeed1d0� eeed2d0� eee d3d0� eee"d4d0� eee#d5d0� eeeƒ eeeƒ ee#eƒ G d6d7„ d7eƒZ$G d8d9„ d9eƒZ%G d:d;„ d;eƒZ&G d<d=„ d=eƒZ'dS )>z(
TFTP (Trivial File Transfer Protocol).
é    )Úabsolute_importN)ÚPacketÚbind_layersÚsplit_bottom_upÚbind_bottom_up)ÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚStrNullField)ÚATMTÚ	Automaton)ÚUDPÚIP)Úconf)Ú	RandShortZRRQZWRQÚDATAZACKÚERRORZOACK)é   é   é   é   é   é   c                   @   s   e Zd ZdZeddeƒgZdS )ÚTFTPzTFTP opcodeÚopr   N)Ú__name__Ú
__module__Ú__qualname__Únamer   ÚTFTP_operationsÚfields_desc© r!   r!   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tftp.pyr      s   r   c                   @   s4   e Zd ZdZeddƒeddƒgZdd„ Zdd	„ Zd
S )ÚTFTP_RRQzTFTP Read RequestÚfilenameÚ ÚmodeÚoctetc                 C   s   dS ©Nr   r!   ©ÚselfÚotherr!   r!   r"   Úanswers$   s    zTFTP_RRQ.answersc                 C   s   |   d¡tgfS )NzRRQ %filename%©Zsprintfr   ©r*   r!   r!   r"   Ú	mysummary'   s    zTFTP_RRQ.mysummaryN©r   r   r   r   r
   r    r,   r/   r!   r!   r!   r"   r#      s   ÿr#   c                   @   s4   e Zd ZdZeddƒeddƒgZdd„ Zdd	„ Zd
S )ÚTFTP_WRQzTFTP Write Requestr$   r%   r&   r'   c                 C   s   dS r(   r!   r)   r!   r!   r"   r,   0   s    zTFTP_WRQ.answersc                 C   s   |   d¡tgfS )NzWRQ %filename%r-   r.   r!   r!   r"   r/   3   s    zTFTP_WRQ.mysummaryNr0   r!   r!   r!   r"   r1   +   s   ÿr1   c                   @   s,   e Zd ZdZeddƒgZdd„ Zdd„ ZdS )	Ú	TFTP_DATAz	TFTP DataÚblockr   c                 C   s   | j dkot|tƒS ©Nr   )r3   Ú
isinstancer#   r)   r!   r!   r"   r,   ;   s    zTFTP_DATA.answersc                 C   s   |   d¡tgfS )NzDATA %block%r-   r.   r!   r!   r"   r/   >   s    zTFTP_DATA.mysummaryN©r   r   r   r   r	   r    r,   r/   r!   r!   r!   r"   r2   7   s   r2   c                   @   s(   e Zd ZeddƒeddƒgZdd„ ZdS )ÚTFTP_OptionÚonamer%   Úvaluec                 C   s   d|fS )Nr%   r!   ©r*   Úpktr!   r!   r"   Úextract_paddingF   s    zTFTP_Option.extract_paddingN)r   r   r   r
   r    r<   r!   r!   r!   r"   r7   B   s   ÿr7   c                   @   s"   e Zd Zedg edd„ d�gZdS )ÚTFTP_OptionsÚoptionsc                 C   s   d S ©Nr!   )Úxr!   r!   r"   Ú<lambda>K   ó    zTFTP_Options.<lambda>)Zlength_fromN)r   r   r   r   r7   r    r!   r!   r!   r"   r=   J   s   r=   c                   @   s,   e Zd ZdZeddƒgZdd„ Zdd„ ZdS )	ÚTFTP_ACKzTFTP Ackr3   r   c                 C   s4   t |tƒr| j|jkS t |tttfƒr0| jdkS dS r(   )r5   r2   r3   r#   r1   Ú	TFTP_OACKr)   r!   r!   r"   r,   R   s
    

zTFTP_ACK.answersc                 C   s   |   d¡tgfS )NzACK %block%r-   r.   r!   r!   r"   r/   Y   s    zTFTP_ACK.mysummaryNr6   r!   r!   r!   r"   rC   N   s   rC   zNot definedzFile not foundzAccess violationz Disk full or allocation exceededzIllegal TFTP operationzUnknown transfer IDzFile already existszNo such userz,Terminate transfer due to option negotiation)	r   r   r   r   r   r   r   é   é   c                   @   s6   e Zd ZdZeddeƒeddƒgZdd„ Zdd	„ Z	d
S )Ú
TFTP_ERRORz
TFTP ErrorÚ	errorcoder   Úerrormsgr%   c                 C   s   t |ttttfƒS r?   )r5   r2   r#   r1   rC   r)   r!   r!   r"   r,   n   s    zTFTP_ERROR.answersc                 C   s   |   d¡tgfS )NzERROR %errorcode%: %errormsg%r-   r.   r!   r!   r"   r/   q   s    zTFTP_ERROR.mysummaryN)
r   r   r   r   r   ÚTFTP_Error_Codesr
   r    r,   r/   r!   r!   r!   r"   rG   i   s   
ÿrG   c                   @   s   e Zd ZdZg Zdd„ ZdS )rD   zTFTP Option Ackc                 C   s   t |ttfƒS r?   )r5   r1   r#   r)   r!   r!   r"   r,   y   s    zTFTP_OACK.answersN)r   r   r   r   r    r,   r!   r!   r!   r"   rD   u   s   rD   éE   ©Údportr   )r   r   r   r   r   r   c                   @   sÚ   e Zd Zd!dd„Zdd„ Zejdd�d	d
„ ƒZe ¡ dd„ ƒZe 	e¡dd„ ƒZ
ej	edd�dd„ ƒZe ed¡dd„ ƒZe e¡dd„ ƒZe e
¡dd„ ƒZe ¡ dd„ ƒZejdd�dd„ ƒZejdd�dd „ ƒZdS )"Ú	TFTP_readNrK   c                 K   s.   t j| fi |¤Ž || _|| _|| _|| _d S r?   )r   Ú
parse_argsr$   ÚserverÚportÚsport)r*   r$   rP   rR   rQ   Úkargsr!   r!   r"   rO   Š   s
    zTFTP_read.parse_argsc                 C   sJ   t |v oH|t  j| jkoHt|v oH|t j| jkoH| jd u pH|t j| jkS r?   ©r   ÚsrcrP   r   rM   Úmy_tidÚ
server_tidrR   r:   r!   r!   r"   Úmaster_filter‘   s
     ÿþzTFTP_read.master_filterr   ©Úinitialc                 C   sŒ   d| _ | jptƒ  ¡ | _ttt| jd� d | _d| _	t
| jd�t| j| jd� tƒ  | _| jt| jdd� | _|  | j¡ d| _|  ¡ ‚d S )	Né   rL   rB   ©Údst©rR   rM   r'   ©r$   r&   r   )Ú	blocksizerR   r   Ú_fixrV   r   r   r   rW   Úresr   rP   rQ   Úl3r#   r$   Úlast_packetÚsendÚawaitingÚWAITINGr.   r!   r!   r"   ÚBEGIN—   s    $zTFTP_read.BEGINc                 C   s   d S r?   r!   r.   r!   r!   r"   rg   §   s    zTFTP_read.WAITINGc                 C   sJ   t |v rF|t  j| jkrF| jd u r<|t j| _| j| jt _|  |¡‚d S r?   )	r2   r3   rf   rW   r   rR   rc   rM   Ú	RECEIVINGr:   r!   r!   r"   Úreceive_data«   s
    
zTFTP_read.receive_data©Úprioc                 C   s   t |v r|  |¡‚d S r?   ©rG   r   r:   r!   r!   r"   Úreceive_error³   s    zTFTP_read.receive_errorr   c                 C   s   |   ¡ ‚d S r?   )rg   r.   r!   r!   r"   Útimeout_waiting¸   s    zTFTP_read.timeout_waitingc                 C   s   |   | j¡ d S r?   ©re   rd   r.   r!   r!   r"   Úretransmit_last_packet¼   s    z TFTP_read.retransmit_last_packetc                 C   s$   | j t| jd� | _|  | j¡ d S ©N©r3   )rc   rC   rf   rd   re   r.   r!   r!   r"   Úsend_ackÀ   s    zTFTP_read.send_ackc                 C   sZ   t j|v r|t j j}nd}|  j|7  _|  jd7  _t|ƒ| jkrN|  ¡ ‚|  ¡ ‚d S )NrB   r   )	r   Z	raw_layerÚloadrb   rf   Úlenr`   rg   ÚEND)r*   r;   Zrecvdr!   r!   r"   ri   Ç   s    
zTFTP_read.RECEIVING©Úerrorc                 C   s   t tt| jd� |t  ¡ S ©NrL   ©r   r   r   rV   rG   Úsummaryr:   r!   r!   r"   r   Ô   s    zTFTP_read.ERROR©Úfinalc                 C   s   t tt| jd� | jS rz   )r   r   r   rV   rb   r.   r!   r!   r"   rw   Ú   s    zTFTP_read.END)NrK   )r   r   r   rO   rX   r   Ústaterh   rg   Úreceive_conditionrj   rn   Útimeoutro   Úactionrq   rt   ri   r   rw   r!   r!   r!   r"   rN   ‰   s,   













rN   c                   @   sÄ   e Zd Zddd„Zdd„ Zejdd�d	d
„ ƒZe ¡ dd„ ƒZe 	e¡dd„ ƒZ
e 	e¡dd„ ƒZe ed¡dd„ ƒZe e¡dd„ ƒZe ¡ dd„ ƒZejdd�dd„ ƒZejdd�dd„ ƒZdS )Ú
TFTP_writeNrK   c                 K   s:   t j| fi |¤Ž || _|| _|| _|| _d| _|| _d S )Nr[   )r   rO   r$   rP   rQ   rR   r`   Úorigdata)r*   r$   ÚdatarP   rR   rQ   rS   r!   r!   r"   rO   á   s    zTFTP_write.parse_argsc                 C   sJ   t |v oH|t  j| jkoHt|v oH|t j| jkoH| jd u pH|t j| jkS r?   rT   r:   r!   r!   r"   rX   ê   s
     ÿþzTFTP_write.master_filterr   rY   c                    s®   ‡ fdd„t tˆ jƒˆ j d ƒD ƒˆ _ˆ jp6tƒ  ¡ ˆ _t	t
tˆ jd� d ˆ _tˆ jd�t
ˆ jˆ jd� tƒ  ˆ _ˆ jtˆ jdd� ˆ _ˆ  ˆ j¡ d	ˆ _d
ˆ _ˆ  ¡ ‚d S )Nc                    s*   g | ]"}ˆ j |ˆ j |d  ˆ j … ‘qS )r   )r„   r`   )Ú.0Úir.   r!   r"   Ú
<listcomp>ò   s   ÿz$TFTP_write.BEGIN.<locals>.<listcomp>r   rL   r\   r^   r'   r_   r%   r   )Úrangerv   r„   r`   r…   rR   r   ra   rV   r   r   r   rW   r   rP   rQ   rc   r1   r$   rd   re   rb   rf   ÚWAITING_ACKr.   r!   r.   r"   rh   ð   s    
ÿ$zTFTP_write.BEGINc                 C   s   d S r?   r!   r.   r!   r!   r"   rŠ     s    zTFTP_write.WAITING_ACKc                 C   sH   t |v rD|t  j| jkrD| jd u r<|t j| _| j| jt _|  ¡ ‚d S r?   )	rC   r3   rf   rW   r   rR   rc   rM   Ú	SEND_DATAr:   r!   r!   r"   Úreceived_ack  s
    
zTFTP_write.received_ackc                 C   s   t |v r|  |¡‚d S r?   rm   r:   r!   r!   r"   Úreceived_error  s    zTFTP_write.received_errorr   c                 C   s   |   ¡ ‚d S r?   )rŠ   r.   r!   r!   r"   ro     s    zTFTP_write.timeout_waitingc                 C   s   |   | j¡ d S r?   rp   r.   r!   r!   r"   rq     s    z!TFTP_write.retransmit_last_packetc                 C   sT   |  j d7  _ | jt| j d� | j d¡ | _|  | j¡ | jrH|  ¡ ‚|  ¡ ‚d S )Nr   rs   r   )	rf   rc   r2   r…   Úpoprd   re   rŠ   rw   r.   r!   r!   r"   r‹     s     zTFTP_write.SEND_DATArx   c                 C   s   t tt| jd� |t  ¡ S rz   r{   r:   r!   r!   r"   r   %  s    zTFTP_write.ERRORr}   c                 C   s   t tt| jd� d S rz   ©r   r   r   rV   r.   r!   r!   r"   rw   +  s    zTFTP_write.END)NrK   )r   r   r   rO   rX   r   r   rh   rŠ   r€   rŒ   r�   r�   ro   r‚   rq   r‹   r   rw   r!   r!   r!   r"   rƒ   à   s(   
	








	


rƒ   c                   @   sÂ   e Zd Zddd„Zdd„ Zejdd�dd	„ ƒZe e¡d
d„ ƒZ	e 
e	¡dd„ ƒZe ¡ dd„ ƒZe ed¡dd„ ƒZe e¡dd„ ƒZe 
e¡dd„ ƒZe ¡ dd„ ƒZejdd�dd„ ƒZdS )ÚTFTP_WRQ_serverNc                 O   s(   t j| g|¢R i |¤Ž || _|| _d S r?   )r   rO   ÚiprR   )r*   r‘   rR   ÚargsrS   r!   r!   r"   rO   2  s    zTFTP_WRQ_server.parse_argsc                 C   s    t |v o| j p|t j| jkS r?   ©r   r‘   r   r]   r:   r!   r!   r"   rX   7  s    zTFTP_WRQ_server.master_filterr   rY   c                 C   s:   d| _ d| _d| _| jp"t dd¡| _ttt	| jd� d S )Nr[   r   rB   é'  éÜÿ  rL   )
ÚblksizeÚblkÚfiledatarR   ÚrandomÚrandintrV   r   r   r   r.   r!   r!   r"   rh   :  s
    zTFTP_WRQ_server.BEGINc                 C   s   t |v r|  ¡  |¡‚d S r?   )r1   Ú	WAIT_DATAZaction_parametersr:   r!   r!   r"   Úreceive_WRQB  s    zTFTP_WRQ_server.receive_WRQc                 C   sÜ   |t  }|j| _|j| _|t j| _| t¡}t |j|jd�t| j	|j
d� tƒ  | _|d u r~| jtdd� | _|  | j¡ nZdd„ |jD ƒ}|r´t|d jƒ| _|  dd| j ¡ | jtƒ  t|d	� | _|  | j¡ d S )
N©rU   r]   r^   r   rs   c                 S   s   g | ]}|j  ¡ d kr|‘qS ©s   BLKSIZE©r8   Úupper©r†   r@   r!   r!   r"   rˆ   S  rB   z+TFTP_WRQ_server.ack_WRQ.<locals>.<listcomp>r   úNegotiated new blksize at %i©r>   )r   r]   r‘   rU   r1   r$   Zgetlayerr=   r   rV   rR   r   rc   rC   rd   re   r>   Úintr9   r–   ÚdebugrD   )r*   r;   r‘   r>   Úoptr!   r!   r"   Úack_WRQG  s    
(zTFTP_WRQ_server.ack_WRQc                 C   s   d S r?   r!   r.   r!   r!   r"   r›   Z  s    zTFTP_WRQ_server.WAIT_DATAc                 C   s   |   | j¡ |  ¡ ‚d S r?   )re   rd   r›   r.   r!   r!   r"   Ú
resend_ack^  s    zTFTP_WRQ_server.resend_ackc                 C   s*   t |v r&|t  }|j| jkr&|  |¡‚d S r?   )r2   r3   r—   r   )r*   r;   r…   r!   r!   r"   rj   c  s    zTFTP_WRQ_server.receive_datac                 C   s$   | j t| jd� | _|  | j¡ d S rr   )rc   rC   r—   rd   re   r.   r!   r!   r"   Úack_dataj  s    zTFTP_WRQ_server.ack_datac                 C   sB   |  j |j7  _ t|jƒ| jk r(|  ¡ ‚|  jd7  _|  ¡ ‚d S r4   )r˜   ru   rv   r–   rw   r—   r›   )r*   r…   r!   r!   r"   r   o  s
    zTFTP_WRQ_server.DATAr}   c                 C   s   t tt| jd� | j| jfS rz   )r   r   r   rV   r$   r˜   r.   r!   r!   r"   rw   w  s    zTFTP_WRQ_server.END)NN)r   r   r   rO   rX   r   r   rh   r€   rœ   r‚   r§   r›   r�   r¨   rj   r©   r   rw   r!   r!   r!   r"   r�   0  s(   











r�   c                   @   s  e Zd Zd'dd„Zdd„ Zejdd�d	d
„ ƒZe e¡dd„ ƒZ	e ¡ dd„ ƒZ
e e
¡dd„ ƒZe e
¡dd„ ƒZe e¡dd„ ƒZe ¡ dd„ ƒZe ed¡dd„ ƒZe e¡dd„ ƒZe ¡ dd„ ƒZe e¡dd„ ƒZejed d!�d"d#„ ƒZejdd$�d%d&„ ƒZdS )(ÚTFTP_RRQ_serverNFc                 K   sŒ   t j| fi |¤Ž |d u ri }|d ur@tj tj |¡d¡| _nd | _|| _|| _|| _	|| _
|| _| j
ptt dd¡| _ttt| jd� d S )Nr%   r”   r•   rL   )r   rO   ÚosÚpathÚjoinÚabspathÚdirÚstoreÚjokerr‘   rR   Ú	serve_oner™   rš   rV   r   r   r   )r*   r°   r±   r¯   r‘   rR   r²   rS   r!   r!   r"   rO   ~  s    zTFTP_RRQ_server.parse_argsc                 C   s    t |v o| j p|t j| jkS r?   r“   r:   r!   r!   r"   rX   Ž  s    zTFTP_RRQ_server.master_filterr   rY   c                 C   s   d| _ d| _d S )Nr[   r   )r–   r—   r.   r!   r!   r"   ÚWAIT_RRQ‘  s    zTFTP_RRQ_server.WAIT_RRQc                 C   s   t |v r|  |¡‚d S r?   )r#   ÚRECEIVED_RRQr:   r!   r!   r"   Úreceive_rrq–  s    zTFTP_RRQ_server.receive_rrqc                 C   sh  |t  }|t }t |j|jd�t| j|jd� tƒ  | _|t	 j
 dd¡| _
d| _d | _| j
| jv rt| j| j
 | _nz| jd urîtj tj | j| j
¡¡}| | j¡rîz6t|ƒ�}| ¡ | _W d   ƒ n1 sÎ0    Y  W n tyì   Y n0 | jd u �r| j| _|�rddd„ |jD ƒ}|�r@t|d jƒ| _|  d	d
| j ¡ | jtƒ  t|d� | _|   | j¡ d S )Nr�   r^   zutf-8Úignorer   c                 S   s   g | ]}|j  ¡ d kr|‘qS rž   rŸ   r¡   r!   r!   r"   rˆ   ±  rB   z0TFTP_RRQ_server.RECEIVED_RRQ.<locals>.<listcomp>r   r   r¢   r£   )!r   r=   r]   rU   r   rV   rR   r   rc   r#   r$   Údecoder—   r…   r°   r¯   r«   r¬   r®   r­   Ú
startswithÚopenÚreadÚIOErrorr±   r>   r¤   r9   r–   r¥   rD   rd   re   )r*   r;   r‘   r>   ÚfnÚfdr¦   r!   r!   r"   r´   ›  s2    (

,zTFTP_RRQ_server.RECEIVED_RRQc                 C   s,   | j d ur(t| j ƒ| j d | _|  ¡ ‚d S r4   )r…   rv   r–   ÚblknbÚ	SEND_FILEr.   r!   r!   r"   Úfile_in_store¸  s    
zTFTP_RRQ_server.file_in_storec                 C   s   | j d u r|  ¡ ‚d S r?   )r…   r³   r.   r!   r!   r"   Úfile_not_found¾  s    
zTFTP_RRQ_server.file_not_foundc                 C   s    |   | jtdtd d� ¡ d S )Nr   )rH   rI   )re   rc   rG   rJ   r.   r!   r!   r"   Ú
send_errorÃ  s    zTFTP_RRQ_server.send_errorc                 C   s>   |   | jt| jd� | j| jd | j | j| j …  ¡ d S )Nrs   r   )re   rc   r2   r—   r…   r–   r.   r!   r!   r"   r¿   Ç  s    zTFTP_RRQ_server.SEND_FILEr   c                 C   s   |   ¡ ‚d S r?   ©r¿   r.   r!   r!   r"   Útimeout_waiting_ackË  s    z#TFTP_RRQ_server.timeout_waiting_ackc                 C   s$   t |v r |t  j| jkr |  ¡ ‚d S r?   )rC   r3   r—   ÚRECEIVED_ACKr:   r!   r!   r"   rŒ   Ï  s    zTFTP_RRQ_server.received_ackc                 C   s   |  j d7  _ d S r4   )r—   r.   r!   r!   r"   rÅ   Ô  s    zTFTP_RRQ_server.RECEIVED_ACKc                 C   s&   | j | jkr"| jr|  ¡ ‚|  ¡ ‚d S r?   )r—   r¾   r²   rw   r³   r.   r!   r!   r"   Úno_more_dataØ  s    zTFTP_RRQ_server.no_more_datar   rk   c                 C   s   |   ¡ ‚d S r?   rÃ   r.   r!   r!   r"   Údata_remainingß  s    zTFTP_RRQ_server.data_remainingr}   c                 C   s   t tt| jd� d S rz   r�   r.   r!   r!   r"   rw   ã  s    zTFTP_RRQ_server.END)NNNNNF)r   r   r   rO   rX   r   r   r³   r€   rµ   r´   Ú	conditionrÀ   rÁ   r‚   rÂ   r¿   r�   rÄ   rŒ   rÅ   rÆ   rÇ   rw   r!   r!   r!   r"   rª   }  s8   















rª   )(Ú__doc__Ú
__future__r   r«   r™   Zscapy.packetr   r   r   r   Zscapy.fieldsr   r   r	   r
   Zscapy.automatonr   r   Zscapy.layers.inetr   r   Zscapy.configr   Zscapy.volatiler   r   r   r#   r1   r2   r7   r=   rC   rJ   rG   rD   rN   rƒ   r�   rª   r!   r!   r!   r"   Ú<module>   sV   ø


WPM