a
    kÄ#dt%  ã                   @   s$  d dl mZmZ d dlmZmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ G dd	„ d	eƒZG d
d„ deƒZddddddddddddddddœZddddœZG d d!„ d!eƒZd"d#d$d%œZG d&d'„ d'eƒZG d(d)„ d)eƒZd*d+d,d-d.d/d0œZG d1d2„ d2eƒZ G d3d4„ d4eƒZ!G d5d6„ d6eƒZ"G d7d8„ d8eƒZ#G d9d:„ d:eƒZ$G d;d<„ d<eƒZ%G d=d>„ d>eƒZ&G d?d@„ d@e&ƒZ'G dAdB„ dBeƒZ(dCdCdCdDdEœZ)G dFdG„ dGeƒZ*G dHdI„ dIeƒZ+G dJdK„ dKeƒZ,eeedLdM� eeedLdN� eeedOdP� eee dQdP� eee!dRdP� eee"dSdP� eee#dTdP� eee$dUdP� eee%dVdP� eee(dWdP� eee*dXdP� eee+dYdP� eee,dZdP� eeed[dP� eeeƒ ee eƒ ee!eƒ ee"eƒ ee#eƒ ee$eƒ ee%eƒ ee(eƒ ee*eƒ ee+eƒ ee,eƒ eeeƒ d\S )]é    )ÚPacketÚbind_layers)ÚFieldLenFieldÚBitEnumFieldÚStrLenFieldÚ
ShortFieldÚConditionalFieldÚByteEnumFieldÚ	ByteFieldÚPacketListField)ÚTCP)ÚScapy_Exception)ÚorbÚchb)ÚRandNum)Úconfc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚVariableFieldLenFieldc                    s”   |   ||¡}g }|rŒ|dkr4| |d@ ¡ |d }n:| |¡ t|ƒd ‰ d ‡ fdd„t|ƒD ƒ¡}|| S t|ƒdkrtd| jj ƒ‚q|d	 S )
Né   é€   é   ó    c                 3   s*   | ]"\}}t ||ˆ krd ndB ƒV  qdS )r   r   N)r   )Ú.0ÚiÚval©Z
lastoffset© úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/mqtt.pyÚ	<genexpr>    s   ÿz1VariableFieldLenField.addfield.<locals>.<genexpr>é   ú%s: malformed length fieldó    )Zi2mÚappendÚlenÚjoinÚ	enumerater   Ú	__class__Ú__name__)ÚselfÚpktÚsr   Údatar   r   r   Úaddfield   s"    

ÿÿzVariableFieldLenField.addfieldc                 C   sr   d}t |ƒD ]`\}}t|ƒ}||d@ d|  7 }|d@ dkrT||d d … |f  S |dkrtd| jj ƒ‚qd S )Nr   r   r   r   é   r   )r$   r   r   r%   r&   )r'   r(   r)   ÚvalueÚoffsetZcurbyter   r   r   Úgetfield)   s    ÿzVariableFieldLenField.getfieldc                 C   s   t ƒ S ©N)ÚRandVariableFieldLen©r'   r   r   r   Úrandval4   s    zVariableFieldLenField.randvalN)r&   Ú
__module__Ú__qualname__r+   r/   r3   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )r1   c                 C   s   t  | dd¡ d S )Nr   iÿÿÿ)r   Ú__init__r2   r   r   r   r6   9   s    zRandVariableFieldLen.__init__N)r&   r4   r5   r6   r   r   r   r   r1   8   s   r1   ZCONNECTZCONNACKZPUBLISHZPUBACKZPUBRECZPUBRELZPUBCOMPZ	SUBSCRIBEZSUBACKZUNSUBSCRIBEZUNSUBACKZPINGREQZPINGRESPZ
DISCONNECTZAUTH)r   r,   r   é   é   é   é   é   é	   é
   é   é   é   é   é   zAt most once deliveryzAt least once deliveryzExactly once delivery)r   r   r,   c                
   @   sb   e Zd ZdZedddeƒedddddd	œƒed
ddeƒedddddd	œƒeddddd„ d�gZdS )ÚMQTTzMQTT fixed headerÚtyper   r7   ÚDUPr   ÚDisabledÚEnabled©r   r   ÚQOSr,   ZRETAINr"   Nc                 C   s
   t | jƒS r0   )r"   Úpayload)r(   Úxr   r   r   Ú<lambda>f   r   zMQTT.<lambda>)Ú	length_ofÚadjust)	r&   r4   r5   Únamer   ÚCONTROL_PACKET_TYPEÚ	QOS_LEVELr   Úfields_descr   r   r   r   rC   Y   s   
ÿ
ÿÿörC   zv3.1zv3.1.1zv5.0)r   r7   r8   c                   @   s–  e Zd ZdZedddd�edddd„ d	�ed
deƒeddddddœƒeddddddœƒeddddddœƒeddde	ƒeddddddœƒeddddddœƒeddddddœƒe
ddƒedddd�edddd„ d	�eedddd�dd„ ƒeeddd d„ d	�d!d„ ƒeed"dd#d�d$d„ ƒeed#dd%d„ d	�d&d„ ƒeed'dd(d�d)d„ ƒeed(dd*d„ d	�d+d„ ƒeed,dd-d�d.d„ ƒeed-dd/d„ d	�d0d„ ƒgZdS )1ÚMQTTConnectzMQTT connectÚlengthNZ	protoname©rM   Ú c                 C   s   | j S r0   ©rT   ©r(   r   r   r   rL   v   r   zMQTTConnect.<lambda>©Zlength_fromZ
protolevelr8   Úusernameflagr   r   rF   rG   rH   ÚpasswordflagZwillretainflagZwillQOSflagr,   ÚwillflagZ	cleansessÚreservedZkliveÚclientIdlenZclientIdc                 C   s   | j S r0   )r^   rX   r   r   r   rL   ˆ   r   ÚwtoplenZ	willtopicc                 C   s
   | j dkS ©Nr   ©r\   rX   r   r   r   rL   ‹   r   c                 C   s   | j S r0   )r_   rX   r   r   r   rL   �   r   c                 C   s
   | j dkS r`   ra   rX   r   r   r   rL   Ž   r   ÚwmsglenZwillmsgc                 C   s
   | j dkS r`   ra   rX   r   r   r   rL   �   r   c                 C   s   | j S r0   )rb   rX   r   r   r   rL   ’   r   c                 C   s
   | j dkS r`   ra   rX   r   r   r   rL   “   r   ÚuserlenÚusernamec                 C   s
   | j dkS r`   ©rZ   rX   r   r   r   rL   •   r   c                 C   s   | j S r0   )rc   rX   r   r   r   rL   —   r   c                 C   s
   | j dkS r`   re   rX   r   r   r   rL   ˜   r   ÚpasslenÚpasswordc                 C   s
   | j dkS r`   ©r[   rX   r   r   r   rL   š   r   c                 C   s   | j S r0   )rf   rX   r   r   r   rL   œ   r   c                 C   s
   | j dkS r`   rh   rX   r   r   r   rL   �   r   )r&   r4   r5   rO   r   r   r	   ÚPROTOCOL_LEVELr   rQ   r   r   rR   r   r   r   r   rS   q   s~   ÿ

ÿ
ÿ
ÿ
ÿ
ÿ
ÿÿÿÿþÿÿþÿÿþÿÿþØrS   c                   @   s   e Zd ZdZg ZdS )ÚMQTTDisconnectzMQTT disconnectN)r&   r4   r5   rO   rR   r   r   r   r   rj   ¡   s   rj   zConnection AcceptedzUnacceptable protocol versionzIdentifier rejectedzServer unavailablezBad username/passwordzNot authorized)r   r   r,   r   r7   r8   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚMQTTConnackzMQTT connackZsessPresentFlagr   ÚretcodeN)r&   r4   r5   rO   r
   r	   ÚRETURN_CODErR   r   r   r   r   rk   °   s   
þrk   c                   @   sR   e Zd ZdZedddd�edddd„ d	�eed
dƒdd„ ƒedddd„ d	�gZdS )ÚMQTTPublishzMQTT publishrT   NÚtopicrU   rV   c                 C   s   | j S r0   rW   rX   r   r   r   rL   ¾   r   zMQTTPublish.<lambda>rY   Úmsgidc                 C   s   | j jdkp| j jdkS )Nr   r,   )Ú
underlayerrI   rX   r   r   r   rL   À   s   r-   c                 C   s0   | j jdkr| j j| j d S | j j| j d S )Nr   r,   r7   )rq   rI   r"   rT   rX   r   r   r   rL   Ã   s    
ÿ)	r&   r4   r5   rO   r   r   r   r   rR   r   r   r   r   rn   ¹   s   ÿ
ÿÿùrn   c                   @   s   e Zd ZdZeddƒgZdS )Ú
MQTTPubackzMQTT pubackrp   N©r&   r4   r5   rO   r   rR   r   r   r   r   rr   É   s   ÿrr   c                   @   s   e Zd ZdZeddƒgZdS )Ú
MQTTPubreczMQTT pubrecrp   Nrs   r   r   r   r   rt   Ð   s   ÿrt   c                   @   s   e Zd ZdZeddƒgZdS )Ú
MQTTPubrelzMQTT pubrelrp   Nrs   r   r   r   r   ru   ×   s   ÿru   c                   @   s   e Zd ZdZeddƒgZdS )ÚMQTTPubcompzMQTT pubcomprp   Nrs   r   r   r   r   rv   Þ   s   ÿrv   c                   @   s8   e Zd ZdZedddd�edddd„ d	�gZd
d„ ZdS )Ú	MQTTTopicz
MQTT topicrT   Nro   rU   rV   c                 C   s   | j S r0   rW   rX   r   r   r   rL   é   r   zMQTTTopic.<lambda>rY   c                 C   s   t jS r0   )r   Zpadding_layer)r'   rJ   r   r   r   Úguess_payload_classì   s    zMQTTTopic.guess_payload_class)r&   r4   r5   rO   r   r   rR   rx   r   r   r   r   rw   å   s
   þrw   c                   @   s    e Zd Zejeddeƒg ZdS )ÚMQTTTopicQOSrI   r   N)r&   r4   r5   rw   rR   r	   rQ   r   r   r   r   ry   ð   s   ry   c                   @   s(   e Zd ZdZeddƒedg ed�gZdS )ÚMQTTSubscribezMQTT subscriberp   NÚtopics©Zpkt_cls)r&   r4   r5   rO   r   r   ry   rR   r   r   r   r   rz   ô   s   þrz   ZSuccessZFailure)r   r   r,   r   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú
MQTTSubackzMQTT subackrp   Nrl   )r&   r4   r5   rO   r   r	   ÚALLOWED_RETURN_CODErR   r   r   r   r   r}     s   
þr}   c                   @   s(   e Zd ZdZeddƒedg ed�gZdS )ÚMQTTUnsubscribezMQTT unsubscriberp   Nr{   r|   )r&   r4   r5   rO   r   r   rw   rR   r   r   r   r   r     s   þr   c                   @   s   e Zd ZdZeddƒgZdS )ÚMQTTUnsubackzMQTT unsubackrp   Nrs   r   r   r   r   r€     s   ÿr€   i[  )Zsport)Údportr   )rD   r,   r   r7   r8   r9   r:   r;   r<   r=   r>   rA   N)-Zscapy.packetr   r   Zscapy.fieldsr   r   r   r   r   r	   r
   r   Zscapy.layers.inetr   Zscapy.errorr   Zscapy.compatr   r   Zscapy.volatiler   Zscapy.configr   r   r1   rP   rQ   rC   ri   rS   rj   rm   rk   rn   rr   rt   ru   rv   rw   ry   rz   r~   r}   r   r€   r   r   r   r   Ú<module>	   sª   (#ñýý0ú
		ü	










