o
    CD©iºÑ  ã                   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 ddl
T ddlmZ dZdZg ZedgƒD ]\Z\ZZe e¡ eeƒ e< q=g Zed	gƒD ]\Z\ZZe e¡ eeeƒ eƒ e< qUG 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ƒZG dd„ dƒZG 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&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 d0d1„ d1eƒZ,G d2d3„ d3eƒZ-G d4d5„ d5eƒZ.G d6d7„ d7eƒZ/G d8d9„ d9eƒZ0G d:d;„ d;eƒZ1G d<d=„ d=eƒZ2G d>d?„ d?eƒZ3G d@dA„ dAeƒZ4G dBdC„ dCeƒZ5G dDdE„ dEeƒZ6G dFdG„ dGeƒZ7G dHdI„ dIeƒZ8G dJdK„ dKeƒZ9G dLdM„ dMeƒZ:G dNdO„ dOeƒZ;dS )Pé    N©Úcopy)ÚStringIOé   )Ú*)ÚDataFaultToleranceStrategyT)ÚNT_LAN_MANAGER_DIALECTs
   NT LM 0.12)ÚSMB2_DIALECTs	   SMB 2.002c                   @   s   e Zd ZdZdS )ÚUnsupportedFeaturezz
    Raised when an supported feature is present/required in the protocol but is not
    currently supported by pysmb
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úH/var/www/Datamplify/venv/lib/python3.10/site-packages/smb/smb_structs.pyr
      s    r
   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚProtocolErrorNc                 C   ó   || _ || _|| _d S ©N)ÚmessageÚdata_bufÚsmb_message)Úselfr   r   r   r   r   r   Ú__init__$   ó   
zProtocolError.__init__c                 C   s~   t ƒ }| | jtj ¡ | jr| dtj ¡ | t| jƒ¡ | jr;| dtj ¡ | tt 	| j¡ƒ¡ | tj¡ | 
¡ S )Nz5==================== SMB Message ====================z?==================== SMB Data Packet (hex) ====================)r   Úwriter   ÚosÚlinesepr   Ústrr   ÚbinasciiÚhexlifyÚgetvalue©r   Úbr   r   r   Ú__str__)   s   zProtocolError.__str__)NN©r   r   r   r   r#   r   r   r   r   r   "   s    
r   c                   @   s   e Zd Zdd„ ZdS )ÚSMB2ProtocolHeaderErrorc                 C   s   t  | d¡ d S )NzPacket header belongs to SMB2)r   r   ©r   r   r   r   r   9   s   z SMB2ProtocolHeaderError.__init__N)r   r   r   r   r   r   r   r   r%   7   s    r%   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚOperationFailurec                 C   s&   || _ dd„ |D ƒ| _|| jf| _d S )Nc                 S   s   g | ]}t |ƒ‘qS r   r   )Ú.0Úmsgr   r   r   Ú
<listcomp>@   s    z-OperationFailure.__init__.<locals>.<listcomp>)r   Úsmb_messagesÚargs)r   r   r+   r   r   r   r   >   s   zOperationFailure.__init__c                 C   sÀ   t ƒ }| | jtj ¡ t| jƒD ]J\}}| dd|  d tj ¡ | dtj ¡ | dtj ¡ | t|ƒ¡ | dtj ¡ | dtj ¡ | tt 	|j
¡ƒ¡ | tj¡ q| ¡ S )Nz====================z SMB Message %d zSMB Header:z-----------zSMB Data Packet (hex):z----------------------)r   r   r   r   r   Ú	enumerater+   r   r   r   Úraw_datar    )r   r"   ÚidxÚmr   r   r   r#   C   s   zOperationFailure.__str__Nr$   r   r   r   r   r'   <   s    r'   c                   @   s0   e Zd Zdd„ Zdd„ Zdd„ Zedd„ ƒZd	S )
ÚSMBErrorc                 C   s   |   ¡  d S r   )Úresetr&   r   r   r   r   V   s   zSMBError.__init__c                 C   s   d| _ d| _d S )Nr   T)Úinternal_valueÚis_ntstatusr&   r   r   r   r2   Y   ó   
zSMBError.resetc                 C   s(   | j rd| j S d| jd? | jd@ f S )NzNTSTATUS=0x%08Xz"ErrorClass=0x%02X ErrorCode=0x%04Xé   éÿÿ  )r4   r3   r&   r   r   r   r#   ]   s   
zSMBError.__str__c                 C   s
   | j dkS )Nr   )r3   r&   r   r   r   ÚhasErrorc   s   
zSMBError.hasErrorN)r   r   r   r   r2   r#   Úpropertyr8   r   r   r   r   r1   T   s    r1   c                   @   s~   e Zd ZdZe e¡Ze d¡Z	dZ
ddd„Zdd„ Zd	d
„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdS )Ú
SMBMessagez<4sBIBHHQxxHHHHBzSMB.SMBMessager   Nc                 C   s&   |   ¡  |r|| _| j | ¡ d S d S r   )r2   ÚpayloadÚinitMessage)r   r;   r   r   r   r   p   s
   þzSMBMessage.__init__c              	   C   s<  t ƒ }| d| jt | jd¡tjf ¡ | dt| jƒtjf ¡ | d| j	tjf ¡ | d| j
tjf ¡ | d| jtjf ¡ | d| jtjf ¡ | d| jtjf ¡ | d	| jtjf ¡ | d
| jtjf ¡ | dt| jƒtjtt | j¡ƒtjf ¡ | dt| jƒtjtt | j¡ƒtjf ¡ | ¡ S )NzCommand: 0x%02X (%s) %sz	<unknown>zStatus: %s %szFlags: 0x%02X %szFlags2: 0x%04X %sz
PID: %d %sz
UID: %d %sz
MID: %d %sz
TID: %d %szSecurity: 0x%016X %szParameters: %d bytes %s%s %szData: %d bytes %s%s %s)r   r   ÚcommandÚSMB_COMMAND_NAMESÚgetr   r   r   ÚstatusÚflagsÚflags2ÚpidÚuidÚmidÚtidÚsecurityÚlenÚparameters_datar   r   Údatar    r!   r   r   r   r#   v   s   ",,zSMBMessage.__str__c                 C   sT   d| _ d| _tƒ | _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d | _d S )Nó    r   )r.   r=   r1   r@   rA   rB   rC   rF   rD   rE   rG   rI   rJ   r;   r&   r   r   r   r2   …   s   
zSMBMessage.resetc                 C   ó   t | jt@ ƒS r   )ÚboolrA   ÚSMB2_FLAGS_ASYNC_COMMANDr&   r   r   r   ÚisAsync”   ó   zSMBMessage.isAsyncc                 C   rL   r   )rM   rA   ÚSMB_FLAGS_REPLYr&   r   r   r   ÚisReply˜   rP   zSMBMessage.isReplyc                 C   rL   r   )rM   rB   ÚSMB_FLAGS2_EXTENDED_SECURITYr&   r   r   r   ÚhasExtendedSecurityœ   rP   zSMBMessage.hasExtendedSecurityc                 C   sª   | j sJ ‚t ¡ | _| j  | ¡ t| jƒ}|d dksJ ‚t | j	d| j
| jj| j| j| jd? d@ | j| j| jd@ | j| jt|d ƒ¡}|| j t dt| jƒ¡ | j S )a!  
        Encode this SMB message into a series of bytes suitable to be embedded with a NetBIOS session message.
        AssertionError will be raised if this SMB message has not been initialized with a Payload instance

        @return: a string containing the encoded SMB message
        é   r   ó   ÿSMBé   r7   ú<H)r;   r   ÚgetpidrC   ÚpreparerH   rI   ÚstructÚpackÚHEADER_STRUCT_FORMATr=   r@   r3   rA   rB   rG   rF   rD   rE   ÚintrJ   )r   Úparameters_lenÚheaders_datar   r   r   Úencode    s   


ý"zSMBMessage.encodec                 C   sh  t |ƒ}|| jk rtd|ƒ‚|  ¡  t | j|d| j… ¡\}| _}| _| _	}| _
| _}| _| _}|dkr8tƒ ‚|dkrAtd|ƒ‚|d> |B | _|| j_t| j	t@ ƒ| j_| j}||d d k retd|ƒ‚||d  }	t d	||	|	d … ¡d
 }
|
d
krŠ||	d |
 k rŠtd|ƒ‚|||	… | _|
d
kr¢||	d |	d |
 … | _|| _|  ¡  | j|d  d |
 S )a
  
        Decodes the SMB message in buf.
        All fields of the SMBMessage object will be reset to default values before decoding.
        On errors, do not assume that the fields will be reinstated back to what they are before
        this method is invoked.

        @param buf: data containing one complete SMB message
        @type buf: string
        @return: a positive integer indicating the number of bytes used in buf to decode this SMB message
        @raise ProtocolError: raised when decoding fails
        z$Not enough data to decode SMB headerNs   þSMBrV   zInvalid 4-byte protocol fieldrW   rU   z0Not enough data. Parameters list decoding failedrX   r   z%Not enough data. Body decoding failed)rH   ÚHEADER_STRUCT_SIZEr   r2   r[   Úunpackr]   r=   rA   rB   rG   rF   rD   rE   r%   rC   r@   r3   rM   ÚSMB_FLAGS2_NT_STATUSr4   rI   rJ   r.   Ú_decodePayload)r   ÚbufÚbuf_lenÚprotocolr@   Úpid_highÚpid_lowÚparams_countÚoffsetÚdatalen_offsetÚbody_lenr   r   r   Údecodeµ   s8   

þ


zSMBMessage.decodec                 C   sà   | j tkr
tƒ | _nY| j tkrtƒ | _nO| j tkrtƒ | _nE| j tkr(t	ƒ | _n;| j t
kr2tƒ | _n1| j tkr<tƒ | _n'| j tkrFtƒ | _n| j tkrPtƒ | _n| j tkrZtƒ | _n	| j tkrctƒ | _| jrn| j | ¡ d S d S r   )r=   ÚSMB_COM_READ_ANDXÚComReadAndxResponser;   ÚSMB_COM_WRITE_ANDXÚComWriteAndxResponseÚSMB_COM_TRANSACTIONÚComTransactionResponseÚSMB_COM_TRANSACTION2ÚComTransaction2ResponseÚSMB_COM_OPEN_ANDXÚComOpenAndxResponseÚSMB_COM_NT_CREATE_ANDXÚComNTCreateAndxResponseÚSMB_COM_TREE_CONNECT_ANDXÚComTreeConnectAndxResponseÚSMB_COM_ECHOÚComEchoResponseÚSMB_COM_SESSION_SETUP_ANDXÚComSessionSetupAndxResponseÚSMB_COM_NEGOTIATEÚComNegotiateResponsero   r&   r   r   r   re   ê   s.   


















ÿzSMBMessage._decodePayloadr   )r   r   r   r]   r[   Úcalcsizerb   ÚloggingÚ	getLoggerÚlogrh   r   r#   r2   r9   rO   rR   rT   ra   ro   re   r   r   r   r   r:   h   s"    





5r:   c                   @   ó,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚPayloads   ÿ   é   c                 C   sD   |j | ksJ ‚ttB |_ttB tB tB |_t	r | jt
O  _d S d S r   )r;   ÚSMB_FLAGS_CASE_INSENSITIVEÚSMB_FLAGS_CANONICALIZED_PATHSrA   ÚSMB_FLAGS2_UNICODErd   ÚSMB_FLAGS2_IS_LONG_NAMEÚSMB_FLAGS2_LONG_NAMESrB   ÚSUPPORT_EXTENDED_SECURITYrS   ©r   r   r   r   r   r<   	  s   
ÿzPayload.initMessagec                 C   ó   t ‚r   ©ÚNotImplementedErrorr‘   r   r   r   rZ     ó   zPayload.preparec                 C   r’   r   r“   r‘   r   r   r   ro     r•   zPayload.decodeN)r   r   r   ÚDEFAULT_ANDX_PARAM_HEADERÚDEFAULT_ANDX_PARAM_SIZEr<   rZ   ro   r   r   r   r   r‰     s    r‰   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚComNegotiateRequestz[
    References:
    ===========
    - [MS-CIFS]: 2.2.4.52.1
    - [MS-SMB]: 2.2.4.5.1
    c                 C   ó   t  | |¡ t|_d S r   )r‰   r<   r‚   r=   r‘   r   r   r   r<   #  ó   
zComNegotiateRequest.initMessagec                 C   sP   |j | ksJ ‚d|_trd dd„ tt D ƒ¡|_d S d dd„ tD ƒ¡|_d S )NrK   c                 S   ó   g | ]}d | d ‘qS ©ó   ó    r   ©r(   Úsr   r   r   r*   +  ó    z/ComNegotiateRequest.prepare.<locals>.<listcomp>c                 S   r›   rœ   r   rŸ   r   r   r   r*   -  r¡   )r;   rI   ÚSUPPORT_SMB2ÚjoinÚDIALECTSÚ	DIALECTS2rJ   r‘   r   r   r   rZ   '  s
   zComNegotiateRequest.prepareN)r   r   r   r   r<   rZ   r   r   r   r   r˜     s    r˜   c                   @   s2   e Zd ZdZdZe e¡Zdd„ Ze	dd„ ƒZ
dS )rƒ   aÏ  
    Contains information on the SMB_COM_NEGOTIATE response from server

    After calling the decode method, each instance will contain the following attributes,
    - security_mode (integer)
    - max_mpx_count (integer)
    - max_number_vcs (integer)
    - max_buffer_size (long)
    - max_raw_size (long)
    - session_key (long)
    - capabilities (long)
    - system_time (long)
    - server_time_zone (integer)
    - challenge_length (integer)

    If the underlying SMB message's flag2 does not have SMB_FLAGS2_EXTENDED_SECURITY bit enabled,
    then the instance will have the following additional attributes,
    - challenge (string)
    - domain (unicode)

    If the underlying SMB message's flags2 has SMB_FLAGS2_EXTENDED_SECURITY bit enabled,
    then the instance will have the following additional attributes,
    - server_guid (string)
    - security_blob (string)

    References:
    ===========
    - [MS-SMB]: 2.2.4.5.2.1
    - [MS-CIFS]: 2.2.4.52.2
    z<HBHHIIIIQHBc                 C   s  |j tksJ ‚|jstd|j|ƒ‚d\
| _| _| _| _| _	| _
| _| _| _| _t|jƒ}|dk r7td|j|ƒ‚t d|jd d… ¡d | _| jtkrz|dkrWtd| |j|ƒ‚t | j|jd | j… ¡\}| _| _| _| _| _	| _
| _| _| _| _n| jd	kr†td
|j|ƒ‚td| j |j|ƒ‚t|jƒ}|jséd\| _| _| jdkrç|| jkrà|jd | j… | _d}| j}||k rÜ|j||d … }|dkrÎt |¡| _n||7 }|d7 }||k sºd S d S d S td|j|ƒ‚d S |dk rôtd|j|ƒ‚|jd d… | _|jdd … | _d S )NzNot a SMB_COM_NEGOTIATE reply©
r   r   r   r   r   r   r   r   r   r   rU   z?Not enough data to decode SMB_COM_NEGOTIATE dialect_index fieldrX   r   é"   zhNT LAN Manager dialect selected in SMB_COM_NEGOTIATE but parameters bytes count (%d) does not meet specsr7   zcServer does not support any of the pysmb dialects. Please email pysmb to add in support for your OSzUnknown dialect index (0x%04X))Ú r¨   rK   ó     zYNot enough data to decode SMB_COM_NEGOTIATE (without security extensions) Challenge fieldrW   zWNot enough data to decode SMB_COM_NEGOTIATE (with security extensions) ServerGUID field)r=   r‚   rR   r   r.   Úsecurity_modeÚmax_mpx_countÚmax_number_vcsÚmax_buffer_sizeÚmax_raw_sizeÚsession_keyÚcapabilitiesÚsystem_timeÚserver_time_zoneÚchallenge_lengthrH   rI   r[   rc   Údialect_indexr   ÚPAYLOAD_STRUCT_FORMATÚPAYLOAD_STRUCT_SIZErJ   rT   Ú	challengeÚdomainr   Údata_bytes_decodeÚserver_guidÚsecurity_blob)r   r   Údata_lenÚ_r    rl   Ú_sr   r   r   ro   S  s`   þ

ÿþ
ÿ


ùñzComNegotiateResponse.decodec                 C   rL   r   )rM   r°   ÚCAP_EXTENDED_SECURITYr&   r   r   r   ÚsupportsExtendedSecurityŠ  rP   z-ComNegotiateResponse.supportsExtendedSecurityN)r   r   r   r   rµ   r[   r„   r¶   ro   r9   rÀ   r   r   r   r   rƒ   0  s    
7rƒ   c                   @   rˆ   )
Ú1ComSessionSetupAndxRequest__WithSecurityExtensionz?
    References:
    ===========
    - [MS-SMB]: 2.2.4.6.1
    z<HHHIHIIc                 C   ó   || _ || _d S r   )r¯   r»   )r   r¯   r»   r   r   r   r   ˜  r5   z:ComSessionSetupAndxRequest__WithSecurityExtension.__init__c                 C   r™   r   ©r‰   r<   r€   r=   r‘   r   r   r   r<   œ  rš   z=ComSessionSetupAndxRequest__WithSecurityExtension.initMessagec                 C   s˜   |j sJ ‚| jtO  _ttB tB tB }| jt 	| j
ddd| jt| jƒd|¡ |_| j|_tjt|jƒ t|jƒ d dkrD|jd |_|jd |_d S )NéA  é
   r   r   rU   rž   s       )rT   rB   r   ÚCAP_UNICODEÚCAP_STATUS32r¿   ÚCAP_NT_SMBSr–   r[   r\   rµ   r¯   rH   r»   rI   rJ   r:   rb   )r   r   Úcapr   r   r   rZ      s   
ÿÿÿ"z9ComSessionSetupAndxRequest__WithSecurityExtension.prepareN©r   r   r   r   rµ   r   r<   rZ   r   r   r   r   rÁ     s    rÁ   c                   @   rˆ   )
Ú/ComSessionSetupAndxRequest__NoSecurityExtensionzA
    References:
    ===========
    - [MS-CIFS]: 2.2.4.53.1
    z	<HHHIHHIIc                 C   s"   || _ || _|| _|| _|| _d S r   )Úusernamer¯   ÚpasswordÚ
is_unicoder¸   )r   r¯   rÌ   rÍ   rÎ   r¸   r   r   r   r   »  s
   
z8ComSessionSetupAndxRequest__NoSecurityExtension.__init__c                 C   r™   r   rÃ   r‘   r   r   r   r<   Â  rš   z;ComSessionSetupAndxRequest__NoSecurityExtension.initMessagec                 C   sx  | j r| jtO  _n
| jt d@ M  _t| jƒ}| jt | jddd| j	| j  r+|p,d| j r1|p2ddt
tB tB ¡	 |_tjt|jƒ }| j|_|t|jƒ d dkr^|jt@ r^|jd |_|jt@ rp|j| j d¡ d |_n|jt| jƒ d¡ d |_|t|jƒ d dkr”|jt@ r”|jd |_|jt@ r®|j| j d¡ d	 d
 d¡ d	 |_d S |j| j d¡ d |_d S )Nr7   rÄ   rÅ   r   rU   rž   úUTF-16LEúUTF-8r©   Úpysmbs    pysmb )rÎ   rB   r   rH   rÍ   r–   r[   r\   rµ   r¯   rÆ   ÚCAP_LARGE_FILESrÇ   rI   r:   rb   rJ   rÌ   ra   r   r¸   )r   r   Úpassword_lenÚ
est_offsetr   r   r   rZ   Æ  s4   


ûÿÿ	 
 
*z7ComSessionSetupAndxRequest__NoSecurityExtension.prepareNrÊ   r   r   r   r   rË   ²  s    rË   c                   @   s4   e Zd ZdZdZe e¡ZdZe e¡Z	dd„ Z
dS )r   a  
    Contains information on the SMB_COM_SESSION_SETUP_ANDX response from server

    If the underlying SMB message's flags2 does not have SMB_FLAGS2_EXTENDED_SECURITY bit enabled,
    then the instance will have the following attributes,
    - action

    If the underlying SMB message's flags2 has SMB_FLAGS2_EXTENDED_SECURITY bit enabled
    and the message status is STATUS_MORE_PROCESSING_REQUIRED or equals to 0x00 (no error),
    then the instance will have the following attributes,
    - action
    - securityblob

    If the underlying SMB message's flags2 has SMB_FLAGS2_EXTENDED_SECURITY bit enabled but
    the message status is not STATUS_MORE_PROCESSING_REQUIRED

    References:
    ===========
    - [MS-SMB]: 2.2.4.6.2
    - [MS-CIFS]: 2.2.4.53.2
    ú<BBHHz<BBHHHc                 C   sò   |j tksJ ‚|js3|jjs1t|jƒ| jk rtd|j	|ƒ‚t
 | j|jd | j… ¡\}}}| _d S d S |jjr=|jjdkrwt|jƒ| jk rLtd|j	|ƒ‚t
 | j|jd | j… ¡\}}}| _}t|jƒ|k rmtd|j	|ƒ‚|jd |… | _d S d S )NzXNot enough data to decode SMB_COM_SESSION_SETUP_ANDX (no security extensions) parametersl       zZNot enough data to decode SMB_COM_SESSION_SETUP_ANDX (with security extensions) parametersz]Not enough data to decode SMB_COM_SESSION_SETUP_ANDX (with security extensions) security blob)r=   r€   rT   r@   r8   rH   rI   ÚNOSECURE_PARAMETER_STRUCT_SIZEr   r.   r[   rc   Ú NOSECURE_PARAMETER_STRUCT_FORMATÚactionr3   ÚSECURE_PARAMETER_STRUCT_SIZEÚSECURE_PARAMETER_STRUCT_FORMATrJ   r»   )r   r   r½   Úblob_lengthr   r   r   ro     s   (ü&øz"ComSessionSetupAndxResponse.decodeN)r   r   r   r   r×   r[   r„   rÖ   rÚ   rÙ   ro   r   r   r   r   r   ê  s    

r   c                   @   ó8   e Zd ZdZdZe e¡Zddd„Zdd„ Z	dd	„ Z
d
S )ÚComTreeConnectAndxRequestz[
    References:
    ===========
    - [MS-CIFS]: 2.2.4.55.1
    - [MS-SMB]: 2.2.4.7.1
    z<HHr¨   c                 C   s   || _ || _|d | _d S )Nú )ÚpathÚservicerÍ   )r   rß   rà   rÍ   r   r   r   r   &  s   z"ComTreeConnectAndxRequest.__init__c                 C   r™   r   )r‰   r<   r|   r=   r‘   r   r   r   r<   +  rš   z%ComTreeConnectAndxRequest.initMessagec                 C   s’   t | jƒ}| jt | jd|jrdpdB |jr|jdkrdpdB |¡ |_d}|d dkr.d}| j 	d	¡| | j
 	d
¡ d | j 	d	¡ d |_d S )Né   rŠ   r   r7   r   rK   rU   rž   rÐ   rÏ   r©   )rH   rÍ   r–   r[   r\   rµ   rT   rF   rI   ra   rß   rà   rJ   )r   r   rÓ   Úpaddingr   r   r   rZ   /  s    
ÿþüÿÿ6z!ComTreeConnectAndxRequest.prepareN)r¨   ©r   r   r   r   rµ   r[   r„   r¶   r   r<   rZ   r   r   r   r   rÝ     s    

rÝ   c                   @   ó&   e Zd ZdZdZe e¡Zdd„ ZdS )r}   a  
    Contains information about the SMB_COM_TREE_CONNECT_ANDX response from the server.

    If the message has no errors, each instance contains the following attributes:
    - optional_support

    References:
    ===========
    - [MS-CIFS]: 2.2.4.55.2
    rÕ   c                 C   s`   |j tksJ ‚|jjs.t|jƒ| jk rtd|j|ƒ‚t	 
| j|jd | j… ¡\}}}| _d S d S )Nz>Not enough data to decode SMB_COM_TREE_CONNECT_ANDX parameters)r=   r|   r@   r8   rH   rI   r¶   r   r.   r[   rc   rµ   Úoptional_support©r   r   r½   r   r   r   ro   P  s   (üz!ComTreeConnectAndxResponse.decodeN©	r   r   r   r   rµ   r[   r„   r¶   ro   r   r   r   r   r}   A  ó
    
r}   c                   @   s<   e Zd ZdZdZe e¡Z		ddd„Zdd„ Z	dd	„ Z
d
S )ÚComNTCreateAndxRequestz[
    References:
    ===========
    - [MS-CIFS]: 2.2.4.64.1
    - [MS-SMB]: 2.2.4.9.1
    z<BHIIIQIIIIIBr   c                 C   sP   |d   d¡| _|| _|| _|| _|| _|| _|| _|| _|	| _	|
| _
|| _d S )NrÞ   rÏ   )ra   ÚfilenamerA   Úroot_fidÚaccess_maskÚallocation_sizeÚext_attrÚshare_accessÚcreate_dispÚcreate_optionsÚimpersonationÚsecurity_flags)r   rê   rA   rë   rì   rí   rî   rï   rð   rñ   rò   ró   r   r   r   r   e  s   
zComNTCreateAndxRequest.__init__c                 C   r™   r   )r‰   r<   rz   r=   r‘   r   r   r   r<   s  rš   z"ComNTCreateAndxRequest.initMessagec                 C   sz   t | jƒ}| jt | jd|| j| j| j| j	| j
| j| j| j| j| j¡ |_d}|jt |jƒ d dkr5d}|| j |_d S )Nr   rK   rU   rž   )rH   rê   r–   r[   r\   rµ   rA   rë   rì   rí   rî   rï   rð   rñ   rò   ró   rI   rb   rJ   )r   r   Úfilename_lenrâ   r   r   r   rZ   w  s,   
ôÿÿzComNTCreateAndxRequest.prepareNr¦   rã   r   r   r   r   ré   Z  s    

ÿré   c                   @   rä   )r{   a  
    Contains (partial) information about the SMB_COM_NT_CREATE_ANDX response from the server.

    Each instance contains the following attributes after decoding:
    - oplock_level
    - fid

    References:
    ===========
    - [MS-CIFS]: 2.2.4.64.2
    z<BBHBHc                 C   sd   |j tksJ ‚|jjs0t|jƒ| jk rtd|j|ƒ‚t	 
| j|jd | j… ¡\}}}| _| _d S d S )Nz;Not enough data to decode SMB_COM_NT_CREATE_ANDX parameters)r=   rz   r@   r8   rH   rI   r¶   r   r.   r[   rc   rµ   Úoplock_levelÚfidræ   r   r   r   ro      s   ,üzComNTCreateAndxResponse.decodeNrç   r   r   r   r   r{   ‘  rè   r{   c                   @   s>   e Zd ZdZdZe e¡Z			ddd„Zdd	„ Z	d
d„ Z
dS )ÚComTransactionRequestzA
    References:
    ===========
    - [MS-CIFS]: 2.2.4.33.1
    z<HHHHBBHIHHHHHHr   rK   ú\PIPE\c                 C   sV   |pt |ƒ| _|pt |ƒ| _|| _|| _|| _|	| _|
| _|| _|| _	|| _
|| _d S r   )rH   Útotal_params_countÚtotal_data_countÚmax_params_countÚmax_data_countÚmax_setup_countrA   ÚtimeoutÚparams_bytesÚ
data_bytesÚsetup_bytesÚname)r   rû   rü   rý   rù   rú   rÿ   r   r  rA   rþ   r  r   r   r   r   ´  s   
zComTransactionRequest.__init__c                 C   r™   r   )r‰   r<   rt   r=   r‘   r   r   r   r<   Ä  rš   z!ComTransactionRequest.initMessagec                 C   sb  | j d  d¡}t|ƒ}t| jƒ}t| jƒ}t| jƒ}d}|j| j | d }|d dkr3d}|d7 }||7 }d}	|d dkrOdd|d   }	|d|d  7 }|dkrZ|}
||7 }nd}
d}|d dkrtdd|d   }|d|d  7 }|dkr{|}nd}t 	| j
| j| j| j| j| jd| j| jd||
||t|d ƒ¡| j |_|| |	 | j | | j |_d S )	NrÞ   rÏ   rK   rU   r   rž   r   rŠ   )r  ra   rH   r  rÿ   r   rb   r¶   r[   r\   rµ   rù   rú   rû   rü   rý   rA   rþ   r^   rI   rJ   )r   r   r  Úname_lenÚsetup_bytes_lenÚparams_bytes_lenÚdata_bytes_lenÚpadding0rl   Úpadding1Úparams_bytes_offsetÚpadding2Údata_bytes_offsetr   r   r   rZ   È  s\   




òñÿ"zComTransactionRequest.prepareN)r   r   rK   rK   rK   r   r   rø   rã   r   r   r   r   r÷   ª  s    

ýr÷   c                   @   rä   )ru   ak  
    Contains information about a SMB_COM_TRANSACTION response from the server

    After decoding, each instance contains the following attributes:
    - total_params_count (integer)
    - total_data_count (integer)
    - setup_bytes (string)
    - data_bytes (string)
    - params_bytes (string)

    References:
    ===========
    - [MS-CIFS]: 2.2.4.33.2
    z<HHHHHHHHHHc                 C   s2  |j tksJ ‚|jjs—t|jƒ| jk rtd|j|ƒ‚t	 
| j|jd | j… ¡\
| _| _}}}}}}}}	|	dkrY|	d }
t|jƒ| j|
 k rLtd|j|ƒ‚|j| j| j|
 … | _nd| _|j| j |	d  d }|dkr{|j|| || | … | _nd| _|dkr’|j|| || | … | _d S d| _d S d S )Nú8Not enough data to decode SMB_COM_TRANSACTION parametersr   rU   r¨   )r=   rt   r@   r8   rH   rI   r¶   r   r.   r[   rc   rµ   rù   rú   r  rb   rJ   rÿ   r   ©r   r   r½   r  r	  Úparams_bytes_displr  r  Údata_bytes_displÚsetup_countr  rl   r   r   r   ro     s.   ý 
ãzComTransactionResponse.decodeNrç   r   r   r   r   ru      ó
    
ru   c                   @   s>   e Zd ZdZdZe e¡Z			ddd„Zdd„ Z	d	d
„ Z
dS )ÚComTransaction2RequestzA
    References:
    ===========
    - [MS-CIFS]: 2.2.4.46.1
    ÚHHHHBBHIHHHHHHr   rK   c                 C   sP   |pt |ƒ| _|pt |ƒ| _|| _|| _|| _|	| _|
| _|| _|| _	|| _
d S r   )rH   rù   rú   rû   rü   rý   rA   rþ   rÿ   r   r  )r   rû   rü   rý   rù   rú   rÿ   r   r  rA   rþ   r   r   r   r   @  s   
zComTransaction2Request.__init__c                 C   r™   r   )r‰   r<   rv   r=   r‘   r   r   r   r<   O  rš   z"ComTransaction2Request.initMessagec                 C   s.  t | jƒ}t | jƒ}t | jƒ}d}d}|j| j | d }|d dkr)d}|d7 }|d7 }d}|d dkr=dd|d   }|dkrH|}	||7 }nd}	d}
|d dkrZdd|d   }
|dkra|}nd}t | j| j	| j
| j| j| jd| j| jd||	||t|d ƒ¡| j |_|| | | j |
 | j |_d S )Nr©   rK   rU   r   rž   r   rŠ   )rH   r  rÿ   r   rb   r¶   r[   r\   rµ   rù   rú   rû   rü   rý   rA   rþ   r^   rI   rJ   )r   r   r  r  r  r  r  rl   r  r	  r
  r  r   r   r   rZ   S  sV   




òñÿ"zComTransaction2Request.prepareN)r   r   rK   rK   rK   r   r   rã   r   r   r   r   r  6  s    

ýr  c                   @   rä   )rw   al  
    Contains information about a SMB_COM_TRANSACTION2 response from the server

    After decoding, each instance contains the following attributes:
    - total_params_count (integer)
    - total_data_count (integer)
    - setup_bytes (string)
    - data_bytes (string)
    - params_bytes (string)

    References:
    ===========
    - [MS-CIFS]: 2.2.4.46.2
    z<HHHHHHHHHBBc                 C   s4  |j tksJ ‚|jjs˜t|jƒ| jk rtd|j|ƒ‚t	 
| j|jd | j… ¡\| _| _}}}}}}}}	}|	dkrZ|	d }
t|jƒ| j|
 k rMtd|j|ƒ‚|j| j| j|
 … | _nd| _|j| j |	d  d }|dkr||j|| || | … | _nd| _|dkr“|j|| || | … | _d S d| _d S d S )Nz9Not enough data to decode SMB_COM_TRANSACTION2 parametersr   rU   r  r¨   )r=   rv   r@   r8   rH   rI   r¶   r   r.   r[   rc   rµ   rù   rú   r  rb   rJ   rÿ   r   r  r   r   r   ro   ›  s.   ý 
ãzComTransaction2Response.decodeNrç   r   r   r   r   rw   ˆ  r  rw   c                   @   rÜ   )ÚComCloseRequestz@
    References:
    ===========
    - [MS-CIFS]: 2.2.4.5.1
    z<HIì   ÿÿ c                 C   rÂ   r   )rö   Úlast_modified_time)r   rö   r  r   r   r   r   È  r5   zComCloseRequest.__init__c                 C   r™   r   )r‰   r<   ÚSMB_COM_CLOSEr=   r‘   r   r   r   r<   Ì  rš   zComCloseRequest.initMessagec                 C   s    t  | j| j| j¡|_d|_d S )NrK   )r[   r\   rµ   rö   r  rI   rJ   r‘   r   r   r   rZ   Ð  s   
zComCloseRequest.prepareN)r  rã   r   r   r   r   r  ¾  s    

r  c                   @   rÜ   )ÚComOpenAndxRequestzA
    References:
    ===========
    - [MS-CIFS]: 2.2.4.41.1
    z
<HHHHIHIIIr   c	           	      C   s@   || _ || _|| _|| _|| _|| _|ptt ¡ ƒ| _|| _	dS )a6  
        @param create_time: Epoch time value to indicate the time of creation for this file. If zero, we will automatically assign the current time
        @type create_time: int
        @param timeout: Number of milliseconds to wait for blocked open request before failing
        @type timeout: int
        N)
rê   Úaccess_modeÚ	open_moderA   Úsearch_attributesÚfile_attributesr^   ÚtimeÚcreate_timerþ   )	r   rê   r  r  rA   r  r  r  rþ   r   r   r   r   ß  s   
zComOpenAndxRequest.__init__c                 C   r™   r   )r‰   r<   rx   r=   r‘   r   r   r   r<   ï  rš   zComOpenAndxRequest.initMessagec                 C   sL   | j t | j| j| j| j| j| j| j	ddd¡
 |_
d| j d¡ d |_d S )Nr   rž   rÏ   r©   )r–   r[   r\   rµ   rA   r  r  r  r  r  rI   rê   ra   rJ   r‘   r   r   r   rZ   ó  s   ÷ÿÿzComOpenAndxRequest.prepareN)r   r   r   r   r   rã   r   r   r   r   r  Õ  s    

r  c                   @   rä   )ry   aœ  
    Contains information about a SMB_COM_OPEN_ANDX response from the server

    After decoding, each instance will contain the following attributes:
    - fid (integer)
    - file_attributes (integer)
    - last_write_time (long)
    - access_rights (integer)
    - resource_type (integer)
    - open_results (integer)

    References:
    ===========
    - [MS-CIFS]: 2.2.4.41.2
    - [MS-SMB]: 2.2.4.1.2
    z<BBHHHIIHHHHHHHc                 C   s~   |j tksJ ‚|jjs=t|jƒ| jk rtd|j|ƒ‚t	 
| j|jd | j… ¡\}}}| _| _| _}| _| _}| _}}}d S d S )Nz6Not enough data to decode SMB_COM_OPEN_ANDX parameters)r=   rx   r@   r8   rH   rI   r¶   r   r.   r[   rc   rµ   rö   r  Úlast_write_timeÚaccess_rightsÚresource_typeÚopen_resultsræ   r   r   r   ro     s   ÿÿûzComOpenAndxResponse.decodeNrç   r   r   r   r   ry     s
    
ry   c                   @   rÜ   )ÚComWriteAndxRequestz[
    References:
    ===========
    - [MS-CIFS]: 2.2.4.43.1
    - [MS-SMB]: 2.2.4.3.1
    z
<HIIHHHHHIr   c                 C   s"   || _ || _|| _|| _|| _dS )z®
        @param timeout: Number of milliseconds to wait for blocked write request before failing. Must be zero for writing to regular file
        @type timeout: int
        N)rö   rl   r   rþ   Ú
write_mode)r   rö   r   rl   r$  rþ   r   r   r   r   0  s
   
zComWriteAndxRequest.__init__c                 C   r™   r   )r‰   r<   rr   r=   r‘   r   r   r   r<   ;  rš   zComWriteAndxRequest.initMessagec                 C   sr   |j | j | j d d }t| jƒ}| jt | j| j	| j
d@ | j| j|dt| jƒ|| j
d? ¡
 |_d| j |_d S )Nr   rU   r  r   é    rž   )rb   r—   r¶   rH   r   r–   r[   r\   rµ   rö   rl   rþ   r$  rI   rJ   )r   r   Údata_offsetr¼   r   r   r   rZ   ?  s"   
÷ÿÿzComWriteAndxRequest.prepareN©r   r   rã   r   r   r   r   r#  %  s    

r#  c                   @   rä   )rs   z[
    References:
    ===========
    - [MS-CIFS]: 2.2.4.43.2
    - [MS-SMB]: 2.2.4.3.2
    z<BBHHHHHc                 C   sx   |j tksJ ‚|jjs:t|jƒ| jk rtd|j|ƒ‚t	 
| j|jd | j… ¡\}}}}| _}}|d@ |d> B | _d S d S )Nz7Not enough data to decode SMB_COM_WRITE_ANDX parametersr7   rW   )r=   rr   r@   r8   rH   rI   r¶   r   r.   r[   rc   rµ   Ú	availableÚcount)r   r   r½   r)  Ú
high_countr   r   r   ro   `  s   *ûzComWriteAndxResponse.decodeNrç   r   r   r   r   rs   U  ó
    
rs   c                   @   rÜ   )ÚComReadAndxRequestz[
    References:
    ===========
    - [MS-CIFS]: 2.2.4.42.1
    - [MS-SMB]: 2.2.4.2.1
    z<HIHHIHIr   c                 C   s(   || _ || _|| _|| _|| _|| _dS )zv
        @param timeout: If reading from a regular file, this parameter must be 0.
        @type timeout: int
        N)rö   Ú	remainingÚmax_return_bytes_countÚmin_return_bytes_countrl   rþ   )r   rö   rl   r.  r/  rþ   r-  r   r   r   r   v  s   
zComReadAndxRequest.__init__c                 C   r™   r   )r‰   r<   rp   r=   r‘   r   r   r   r<   ‚  rš   zComReadAndxRequest.initMessagec                 C   sL   | j t | j| j| jd@ | j| j| jp| jd? | j	| jd? ¡ |_
d|_d S )Nr  r%  rK   )r–   r[   r\   rµ   rö   rl   r.  r/  rþ   r-  rI   rJ   r‘   r   r   r   rZ   †  s   ùÿÿ
zComReadAndxRequest.prepareNr'  rã   r   r   r   r   r,  k  s    

r,  c                   @   rä   )rq   z[
    References:
    ===========
    - [MS-CIFS]: 2.2.4.42.2
    - [MS-SMB]: 2.2.4.2.2
    z<BBHHHHHHHHHHHc                 C   s°   |j tksJ ‚|jjsTt|jƒ| jk rtd|j|ƒ‚t	 
| j|jd | j… ¡\}}}}}}| _}}}}}}||j | j d }|j||| j … | _t| jƒ| jksVJ ‚d S d S )Nz6Not enough data to decode SMB_COM_READ_ANDX parametersrU   )r=   rp   r@   r8   rH   rI   r¶   r   r.   r[   rc   rµ   Údata_lengthrb   rJ   )r   r   r½   r&  rl   r   r   r   ro      s    ÿ÷	zComReadAndxResponse.decodeNrç   r   r   r   r   rq   •  r+  rq   c                   @   ó*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )ÚComDeleteRequestz@
    References:
    ===========
    - [MS-CIFS]: 2.2.4.7.1
    r   c                 C   rÂ   r   )Úfilename_patternr  )r   r3  r  r   r   r   r   ¶  r5   zComDeleteRequest.__init__c                 C   r™   r   )r‰   r<   ÚSMB_COM_DELETEr=   r‘   r   r   r   r<   º  rš   zComDeleteRequest.initMessagec                 C   s*   t  d| j¡|_d| j d¡ d |_d S )NrX   ó   rÏ   r©   )r[   r\   r  rI   r3  ra   rJ   r‘   r   r   r   rZ   ¾  s   zComDeleteRequest.prepareN©r   ©r   r   r   r   r   r<   rZ   r   r   r   r   r2  ¯  s
    
r2  c                   @   ó(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚComCreateDirectoryRequesta  
    Although this command has been marked deprecated in [MS-CIFS], we continue to use it for its simplicity
    as compared to its replacement TRANS2_CREATE_DIRECTORY sub-command [MS-CIFS]: 2.2.6.14

    References:
    ===========
    - [MS-CIFS]: 2.2.4.1.1
    c                 C   ó
   || _ d S r   ©rß   ©r   rß   r   r   r   r   Í  ó   
z"ComCreateDirectoryRequest.__init__c                 C   r™   r   )r‰   r<   ÚSMB_COM_CREATE_DIRECTORYr=   r‘   r   r   r   r<   Ð  rš   z%ComCreateDirectoryRequest.initMessagec                 C   ó    d|_ d| j d¡ d |_d S ©NrK   r5  rÏ   r©   ©rI   rß   ra   rJ   r‘   r   r   r   rZ   Ô  ó   z!ComCreateDirectoryRequest.prepareNr7  r   r   r   r   r9  Ã  s
    	r9  c                   @   r8  )	ÚComDeleteDirectoryRequestz@
    References:
    ===========
    - [MS-CIFS]: 2.2.4.2.1
    c                 C   r:  r   r;  r<  r   r   r   r   à  r=  z"ComDeleteDirectoryRequest.__init__c                 C   r™   r   )r‰   r<   ÚSMB_COM_DELETE_DIRECTORYr=   r‘   r   r   r   r<   ã  rš   z%ComDeleteDirectoryRequest.initMessagec                 C   r?  r@  rA  r‘   r   r   r   rZ   ç  rB  z!ComDeleteDirectoryRequest.prepareNr7  r   r   r   r   rC  Ù  s
    rC  c                   @   r1  )ÚComRenameRequestz@
    References:
    ===========
    - [MS-CIFS]: 2.2.4.8.1
    r   c                 C   r   r   )Úold_pathÚnew_pathr  )r   rF  rG  r  r   r   r   r   ó  r   zComRenameRequest.__init__c                 C   r™   r   )r‰   r<   ÚSMB_COM_RENAMEr=   r‘   r   r   r   r<   ø  rš   zComRenameRequest.initMessagec                 C   s:   t  d| j¡|_d| j d¡ d | j d¡ d |_d S )NrX   r5  rÏ   s      r©   )r[   r\   r  rI   rF  ra   rG  rJ   r‘   r   r   r   rZ   ü  s   *zComRenameRequest.prepareNr6  r7  r   r   r   r   rE  ì  s
    
rE  c                   @   s*   e Zd ZdZddd„Zdd„ Zdd	„ Zd
S )ÚComEchoRequestzA
    References:
    ===========
    - [MS-CIFS]: 2.2.4.39.1
    rK   r   c                 C   s   || _ || _d S r   )Ú
echo_countÚ	echo_data)r   rK  rJ  r   r   r   r     r5   zComEchoRequest.__init__c                 C   s   t  | |¡ t|_d|_d S )Nr7   )r‰   r<   r~   r=   rF   r‘   r   r   r   r<     s   
zComEchoRequest.initMessagec                 C   s   t  d| j¡|_| j|_d S )NrX   )r[   r\   rJ  rI   rK  rJ   r‘   r   r   r   rZ     s   zComEchoRequest.prepareN)rK   r   r7  r   r   r   r   rI    s
    
rI  c                   @   s   e Zd ZdZdd„ ZdS )r   zA
    References:
    ===========
    - [MS-CIFS]: 2.2.4.39.2
    c                 C   s(   t  d|jd d… ¡d | _|j| _d S )NrX   rU   r   )r[   rc   rI   Úsequence_numberrJ   r‘   r   r   r   ro     s   zComEchoResponse.decodeN)r   r   r   r   ro   r   r   r   r   r     s    r   c                   @   s<   e Zd ZdZdZe e¡Z		ddd„Zdd„ Z	d	d
„ Z
dS )ÚComNTTransactRequestzA
    References:
    ===========
    - [MS-CIFS]: 2.2.4.62.1
    z<BHIIIIIIIIBHr   rK   c
           
      C   sJ   || _ |pt|ƒ| _|pt|	ƒ| _|| _|| _|| _|| _|| _|	| _	d S r   )
ÚfunctionrH   rù   rú   rû   rü   rý   rÿ   r  r   )
r   rN  rû   rü   rý   rù   rú   rÿ   r  r   r   r   r   r   +  s   
zComNTTransactRequest.__init__c                 C   r™   r   )r‰   r<   ÚSMB_COM_NT_TRANSACTr=   r‘   r   r   r   r<   8  rš   z ComNTTransactRequest.initMessagec           
      C   s  t | jƒ}t | jƒ}t | jƒ}d}|j| j | d }|d dkr1dd|d   }|d|d  7 }|dkr8|}nd}||7 }d}|d dkrVdd|d   }|d|d  7 }|dkr]|}	nd}	t | j| j	d| j
| j| j| j||||	t|d ƒ| j¡| j |_|| j | | j |_d S )NrK   rU   rŠ   r   rž   )rH   r  rÿ   r   rb   r¶   r[   r\   rµ   rý   rù   rú   rû   rü   r^   rN  rI   rJ   )
r   r   r  r  r  r  rl   r	  r  r  r   r   r   rZ   <  sJ   



ôóÿzComNTTransactRequest.prepareN)r   r   rK   rK   rK   rã   r   r   r   r   rM  "  s    

þrM  c                   @   rä   )ÚComNTTransactResponseak  
    Contains information about a SMB_COM_NT_TRANSACT response from the server

    After decoding, each instance contains the following attributes:
    - total_params_count (integer)
    - total_data_count (integer)
    - setup_bytes (string)
    - data_bytes (string)
    - params_bytes (string)

    References:
    ===========
    - [MS-CIFS]: 2.2.4.62.2
    z<3sIIIIIIIIBHc           
   
   C   sî   |j tksJ ‚|jjsut | j|jd | j… ¡\
}| _	| _
}}}}}}}	|j| j| j|	d  … | _|dkrO||j| j |	d  d 8 }|j||| … | _nd| _|dkrp||j| j |	d  d 8 }|j||| … | _d S d| _d S d S )NrU   r   rK   )r=   rO  r@   r8   r[   rc   rµ   rI   r¶   rù   rú   r  rb   rJ   rÿ   r   )
r   r   r½   rk   Úparams_offsetÚparams_displÚ
data_countr&  Ú
data_displr  r   r   r   ro   |  s$   ÿþ
îzComNTTransactResponse.decodeNrç   r   r   r   r   rP  j  s
    
rP  )<r   Úsysr[   Útypesr…   r   r  r   Úior   Úsmb_constantsÚstrategyr   r   r¢   r¤   r-   Úir  ÚdialectÚappendÚglobalsr¥   rH   Ú	Exceptionr
   r   r%   r'   r1   r:   r‰   r˜   rƒ   rÁ   rË   r   rÝ   r}   ré   r{   r÷   ru   r  rw   r  r  ry   r#  rs   r,  rq   r2  r9  rC  rE  rI  r   rM  rP  r   r   r   r   Ú<module>   sf   8

 _#81&7V6R6/!0*H