o
    j=1                     @   s  d dl mZ d dlZd dlZd dlZd dlmZ zd dlmZ W n e	y-   e
d  w dZdZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZd	ZdZdddddddZd ZdZ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&G d+d, d,e Z'G d-d. d.e Z(G d/d0 d0e)Z*G d1d2 d2Z+e,d3krd4Z-d5Z.d5Z/e+e-d6d7Z0e0j1d8e.e/d9d: e02d; 	 e03 Z4e4D ]Z5e$e6e5Z7e8d=e7d> d? e7d@ f  qqdS )A    )print_functionN)	Structure)SSLz*pyOpenSSL is not installed, can't continue       0   @   P   `   p                           zConnection Acceptedz1Connection Refused, unacceptable protocol versionz'Connection Refused, identifier rejectedz&Connection Refused, Server unavailablez-Connection Refused, bad user name or passwordz"Connection Refused, not authorized)r      r            r   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
MQTT_Packet)
PacketTypeB=0)MessageLengthz<L=0))_VariablePartz_-VariablePartzself["MessageLength"])VariablePart:c                 C   s   | d  |d> O  < d S )Nr   r    )selfQoSr    r    /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/mqtt.pysetQoSS   s   zMQTT_Packet.setQoSc                 C   s   |d urVt |dkrVd}d}d}d}|d }|d@ dkr@t|| }||d@ | 7 }|d9 }|d7 }|dkr:td|d@ dks|td| ||||   }t| |S td	)
Nr   r   r   r      i    zMalformed Remaining Lengthz<Lz	Dont know)lenord	Exceptionstructpackr   
fromString)r!   dataindex
multipliervalueencodedByte
packetTyper    r    r#   r+   V   s"    zMQTT_Packet.fromStringc                 C   s   | d }d| _ tt| }d}|dkr.|d }|d }|dkr$|dO }|t|7 }|dksd| _ || d< || d< |dkrCtd| d< t| S )Nr   r     r   r   )r   )r   r   r   )	commonHdrr&   r   getDatachr)r!   r1   	packetLenoutputr0   r    r    r#   r4   i   s"   
zMQTT_Packet.getDataN)__name__
__module____qualname__r3   	structurer$   r+   r4   r    r    r    r#   r   J   s    r   c                   @      e Zd ZdZdS )MQTT_String))Lengthz>H-Name)Namer   Nr8   r9   r:   r;   r    r    r    r#   r=   }       r=   c                   @   s2   e Zd ZddefdddddefdfZdd
dZdS )MQTT_ConnectProtocolNamer   )VersionzB=3)FlagszB=2)	KeepAlivez>H=60ClientID)Payloadz:=""Nr   c                 C   &   t | || |d u rt| d< d S d S Nr   )r   __init__PACKET_CONNECTr!   r,   	alignmentr    r    r#   rK         zMQTT_Connect.__init__Nr   r8   r9   r:   r=   r;   rK   r    r    r    r#   rB      s    rB   c                   @   r<   )MQTT_ConnectAck))
ReturnCode>H=0Nr@   r    r    r    r#   rR      rA   rR   c                   @   s,   e Zd ZddefdfZd
ddZdd	 ZdS )MQTT_PublishTopicr   Messager   Nr   c                 C   rI   rJ   )r   rK   PACKET_PUBLISHrM   r    r    r#   rK      rO   zMQTT_Publish.__init__c                 C   s,   | d d@ dkrddt fddf| _t| S )Nr      r   rV   r   	MessageIDrT   rW   )r=   r;   r   r4   r!   r    r    r#   r4      s   
zMQTT_Publish.getDatarP   )r8   r9   r:   r=   r;   rK   r4   r    r    r    r#   rU      s    
rU   c                   @      e Zd ZdZdddZdS )MQTT_Disconnectr    Nr   c                 C   rI   rJ   )r   rK   PACKET_DISCONNECTrM   r    r    r#   rK      rO   zMQTT_Disconnect.__init__rP   r8   r9   r:   r;   rK   r    r    r    r#   r_      s    r_   c                   @   s&   e Zd ZdddefdfZd	ddZdS )
MQTT_Subscriber\   z>H=1rV   r   )rE   r   Nr   c                 C   rI   rJ   )r   rK   PACKET_SUBSCRIBErM   r    r    r#   rK      rO   zMQTT_Subscribe.__init__rP   rQ   r    r    r    r#   rb      s    rb   c                   @   r^   )MQTT_SubscribeACK)r[   )rS   r   Nr   c                 C   rI   rJ   )r   rK   PACKET_SUBSCRIBEACKrM   r    r    r#   rK      rO   zMQTT_SubscribeACK.__init__rP   ra   r    r    r    r#   re          re   c                   @   r^   )MQTT_UnSubscribe)rc   )Topicsr   Nr   c                 C   rI   rJ   )r   rK   PACKET_UNSUBSCRIBErM   r    r    r#   rK      rO   zMQTT_UnSubscribe.__init__rP   ra   r    r    r    r#   rh      rg   rh   c                   @   s:   e Zd ZdZdddZdd Zdd	 Zd
d Zdd ZdS )MQTTSessionErrorz9
    This is the exception every client should catch
    r   r2   c                 C   s    t |  || _|| _|| _d S N)r(   rK   errorpacketerrorString)r!   rm   rn   ro   r    r    r#   rK      s   

zMQTTSessionError.__init__c                 C      | j S rl   )rm   r]   r    r    r#   getErrorCode      zMQTTSessionError.getErrorCodec                 C   rp   rl   )rn   r]   r    r    r#   getErrorPacket   rr   zMQTTSessionError.getErrorPacketc                 C   rp   rl   ro   r]   r    r    r#   getErrorString   rr   zMQTTSessionError.getErrorStringc                 C   rp   rl   rt   r]   r    r    r#   __str__   rr   zMQTTSessionError.__str__N)r   r   r2   )	r8   r9   r:   __doc__rK   rq   rs   ru   rv   r    r    r    r#   rk      s    
rk   c                   @   s|   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zddddde	dfddZ
d ddZd!ddZd!ddZdd ZdS )"MQTTConnectionFc                 C   s*   || _ || _|| _d | _d| _|   d S )Nr   )_targetHost_targetPort_isSSL_socket
_messageIdconnectSocket)r!   hostportisSSLr    r    r#   rK      s   zMQTTConnection.__init__c                 C   rp   rl   )r|   r]   r    r    r#   	getSocket   rr   zMQTTConnection.getSocketc                 C   st   t   }|| jt| jf | jdu r5ttj}|	d
d t||| _| j  | j  d S || _d S )NTzALL:@SECLEVEL=0zutf-8)socketconnectry   intrz   r{   r   Context
TLS_METHODset_cipher_listencode
Connectionr|   set_connect_statedo_handshake)r!   sctxr    r    r#   r~      s   


zMQTTConnection.connectSocketc                 C   s   | j t|S rl   )r|   sendallstrr!   requestr    r    r#   send     zMQTTConnection.sendc                 C   s   |  | |  S rl   )r   recvr   r    r    r#   sendReceive  s   
zMQTTConnection.sendReceivec                 C   s   d}d}d}|s| j |}t||k rd}||7 }|rg }t|dkrQzt|}|t|d  }W n tyC   || j | }Y nw || |}t|dks$|  jd7  _|S )Ni    r2   FTr   r   )r|   r   r&   r   r(   appendr}   )r!   REQUEST_SIZEr,   donerecvDataresponsemessage	remainingr    r    r#   r     s,   
zMQTTConnection.recv NMQIsdpr   <   c                 C   s   t  }||d< ||d< ||d< t |d< ||d d< t |d< ||d d< |dur3|d  ttB O  < |du r:d}	n|}	|du rCd}
n|}
t }|	|d< t }|
|d< t|t| |d	< | |d
 }tt|}|d d
kr|t|d t|d  ddS )a  

        :param clientId: Whatever cliend Id that represents you
        :param username: if None, anonymous connection will be attempted
        :param password: if None, anonymous connection will be attempted
        :param protocolName: specification states default should be 'MQTT' but some brokers might expect 'MQIsdp'
        :param version: Allowed versions are 3 or 4 (some brokers might like 4)
        :param flags:
        :param keepAlive: default 60
        :return: True or MQTTSessionError if something went wrong
        rD   rE   rF   rC   r?   rG   Nr2   rH   r   rS   )rm   ro   T)	rB   r=   CONNECT_USERNAMECONNECT_PASSWORDr   r   rR   rk   CONNECT_ACK_ERROR_MSGS)r!   clientIdusernamepasswordprotocolNameversionflags	keepAliveconnectPacketuserpwdr,   r   r    r    r#   r   !  s4   

zMQTTConnection.connectr   r   c           	   
   C   s   t  }||d< t |d< ||d d< ||d< || z	| |d }W n ty7 } ztt|dd}~ww tt|}|d d	krItd
ddS )a  

        :param topic: Topic name you want to subscribe to
        :param messageID: optional messageId
        :param flags: Message flags
        :param QoS: define the QoS requested
        :return: True or MQTTSessionError if something went wrong
        r\   rV   r?   rE   r   rt   NrS   r   zFailure to subscribeT)rb   r=   r$   r   r(   rk   r   re   )	r!   topic	messageIDr   r"   subscribePacketr,   esubAckr    r    r#   	subscribeR  s    	


zMQTTConnection.subscribec                 C   s8   t  }||d< t |d< ||d d< || | |S )z
        Unsubscribes from a topic

        :param topic:
        :param messageID:
        :param QoS: define the QoS requested
        :return:
        r\   ri   r?   )rh   r=   r$   r   )r!   r   r   r"   rn   r    r    r#   unSubscriben  s   



zMQTTConnection.unSubscribec                 C   s@   t  }t |d< ||d d< ||d< ||d< || | |S )NrV   r?   rX   r\   )rU   r=   r$   r   )r!   r   r   r   r"   rn   r    r    r#   publish  s   


zMQTTConnection.publishc                 C   s   |  tt S rl   )r   r   r_   r]   r    r    r#   
disconnect  r   zMQTTConnection.disconnect)F)r   r   r   )r   r   )r8   r9   r:   rK   r   r~   r   r   r   CONNECT_CLEAN_SESSIONr   r   r   r   r   r    r    r    r#   rx      s    

1

rx   __main__z192.168.45.162testi[  Fzsecure-r   )r   r   r   z$SYS/#Tz%s -> %srV   r?   rX   ):
__future__r   loggingr)   r   impacket.structurer   OpenSSLr   ImportErrorcriticalrL   PACKET_CONNACKrY   PACKET_PUBACKPACKET_PUBRECPACKET_PUBRELPACKET_PUBCOMPrd   rf   rj   PACKET_UNSUBACKPACKET_PINGREQPACKET_PINGRESPr`   r   r   r   r   QOS_FIRE_AND_FORGETQOS_ACK_DELIVERYQOS_ASSURED_DELIVERYr   r=   rB   rR   rU   r_   rb   re   rh   r(   rk   rx   r8   HOSTUSERPASSmqttr   r   r   packetsrn   r   r   printr   r    r    r    r#   <module>   s   

3

 '
