o
    CDi5                    @   s8  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T ddlT ddl	T ddl
mZ d dlmZ ddlmZ dd	lmZmZ dd
lmZ z	d dlZejZW n eyd   ddlmZ Y nw 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ZG dd dZG dd dZdS )    N)datetime)tqdm   )*)SecurityDescriptor)
NMBSession)convertFILETIMEtoEpoch)ntlmsecurityblob)DataFaultToleranceStrategy)sha256c                   @      e Zd ZdZdS )NotReadyErrorzYRaised when SMB connection is not ready (i.e. not authenticated or authentication failed)N__name__
__module____qualname____doc__ r   r   A/var/www/Datamplify/venv/lib/python3.10/site-packages/smb/base.pyr          r   c                   @   r   )NotConnectedErrorzPRaised when underlying SMB connection has been disconnected or not connected yetNr   r   r   r   r   r      r   r   c                   @   r   )
SMBTimeoutzhRaised when a timeout has occurred while waiting for a response or for a SMB/CIFS operation to complete.Nr   r   r   r   r   r      r   r   c                   @   sx  e Zd ZdZedZdZdZdZ	dde	dfd	d
Z
edd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zdd*d+Zdd,d-Zdd.d/Zdd0d1Zdd2d3Zd)di fd4d5Z dd6d7Z!dd)di fd8d9Z"dd:d;Z#dd<d=Z$dd>d?Z%e&d)fd@dAZ'ddBdCZ(ddDdEZ)ddFdGZ*ddHdIZ+ddJdKZ,dLdM Z-dNdO Z.dPdQ Z/dRdS Z0dTdU Z1dVdW Z2ddXdYZ3ddZd[Z4dd\d]Z5dd^d_Z6d)di fd`daZ7d)di fdbdcZ8d)di fdddeZ9dd)di fdfdgZ:ddhdiZ;ddjdkZ<ddldmZ=e&d)fdndoZ>ddpdqZ?ddrdsZ@ddtduZAddvdwZBddxdyZCdzd{ ZDd|d} ZEd~S )SMBa   
    This class represents a "connection" to the remote SMB/CIFS server.
    It is not meant to be used directly in an application as it does not have any network transport implementations.

    For application use, please refer to
      - L{SMBProtocol.SMBProtocolFactory<smb.SMBProtocol>} if you are using Twisted framework

    In [MS-CIFS], this class will contain attributes of Client, Client.Connection and Client.Session abstract data models.

    References:
    ===========
      - [MS-CIFS]: 3.2.1
    zSMB.SMBr   r       TFc	           	      C   s  t j| |||d || _|| _|| _|| _|| _|| _t | _	d| _
i | _i | _i | _d| _d| _d| _d| _d | _d | _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _ d | _!| "  | j#$d| j%| j| jrxdpydt&r}d	p~d
 d S )N)is_direct_tcpFr   r   r   zqAuthentication with remote machine "%s" for user "%s" will be using NTLM %s authentication (%s extended security)v2v1withwithout)'r   __init__username	_passworddomainsign_optionsr   use_ntlm_v2
SMBMessagesmb_messageis_using_smb2async_requestspending_requestsconnected_treesnext_rpc_call_idhas_negotiatedhas_authenticatedis_signing_activesigning_session_keysigning_challenge_responsemiduidnext_signing_idcapabilitiessecurity_modeuse_plaintext_authenticationmax_raw_sizemax_buffer_sizemax_mpx_countmax_read_sizemax_write_sizemax_transact_size
session_idpbar_setupSMB1Methodsloginforemote_nameSUPPORT_EXTENDED_SECURITY)	selfr"   passwordmy_namerD   r$   r&   r%   r   r   r   r   r!   9   sL   
zSMB.__init__c                 C   s   t | jr	|  S | jS N)callabler#   rF   r   r   r   rG   m   s   
zSMB.passwordc                 C   s   |  tt  d S rI   )_sendSMBMessager'   ComNegotiateRequestrK   r   r   r   onNMBSessionOKw      zSMB.onNMBSessionOKc                 C      d S rI   r   rK   r   r   r   onNMBSessionFailedz      zSMB.onNMBSessionFailedc              	   C   s  	 z| j |}W n$ ty-   | jd d| _d| _|   |  | _ | j |}Y nw d}| jr7| j j	}|dkry| js[| j
dt| j jd| j j| j j| j j| j j| j j n| j
dt| j jd| j j| j j | | j ry|  | _ |dkr||d  }nd S q)NTz1Now switching over to SMB2 protocol communicationr   zRReceived SMB message "%s" (command:0x%2X flags:0x%02X flags2:0x%04X TID:%d UID:%d)z	<unknown>z8Received SMB2 message "%s" (command:0x%04X flags:0x%04x))r(   decodeSMB2ProtocolHeaderErrorrB   rC   r)   r3   _setupSMB2Methods_klassSMBMessagenext_command_offsetdebugSMB_COMMAND_NAMESgetcommandflagsflags2tidr4   SMB2_COMMAND_NAMES_updateState)rF   r\   datainext_message_offsetr   r   r   onNMBSessionMessage}   s<   

zSMB.onNMBSessionMessagec                 C   rP   rI   r   rK   r   r   r   onAuthOK   rR   zSMB.onAuthOKc                 C   rP   rI   r   rK   r   r   r   onAuthFailed   rR   zSMB.onAuthFailedc                 C      t | _| j| _| j| _| j| _| j| _	| j
| _| j| _| j| _| j| _| j| _| j| _| j| _| j| _| j| _| j| _| j| _| j | _!| j"| _#| j$| _%| j&| _'| j(| _)d S rI   )*r'   rV   _updateState_SMB1r`   _updateServerInfo_SMB1_updateServerInfo_handleNegotiateResponse_SMB1_handleNegotiateResponse_sendSMBMessage_SMB1rL   _handleSessionChallenge_SMB1_handleSessionChallenge_listShares_SMB1_listShares_listPath_SMB1	_listPath_listSnapshots_SMB1_listSnapshots_getSecurity_SMB1_getSecurity_getAttributes_SMB1_getAttributes_retrieveFile_SMB1_retrieveFile_retrieveFileFromOffset_SMB1_retrieveFileFromOffset_storeFile_SMB1
_storeFile_storeFileFromOffset_SMB1_storeFileFromOffset_deleteFiles_SMB1_deleteFiles_resetFileAttributes_SMB1_resetFileAttributes_createDirectory_SMB1_createDirectory_deleteDirectory_SMB1_deleteDirectory_rename_SMB1_rename
_echo_SMB1_echorK   r   r   r   rA      *   zSMB._setupSMB1Methodsc                 C   rg   rI   )*SMB2MessagerV   _updateState_SMB2r`   _updateServerInfo_SMB2rj   _handleNegotiateResponse_SMB2rl   _sendSMBMessage_SMB2rL   _handleSessionChallenge_SMB2ro   _listShares_SMB2rq   _listPath_SMB2rs   _listSnapshots_SMB2ru   _getSecurity_SMB2rw   _getAttributes_SMB2ry   _retrieveFile_SMB2r{   _retrieveFileFromOffset_SMB2r}   _storeFile_SMB2r   _storeFileFromOffset_SMB2r   _deleteFiles_SMB2r   _resetFileAttributes_SMB2r   _createDirectory_SMB2r   _deleteDirectory_SMB2r   _rename_SMB2r   
_echo_SMB2r   rK   r   r   r   rU      r   zSMB._setupSMB2Methodsc                 C      |  j d7  _ | j S Nr   )r-   rK   r   r   r   _getNextRPCCallID      zSMB._getNextRPCCallIDc                 C   s   |j dkr
|  |_ |jtkr| j|_| jrG| jtO  _| }t	
| j|t d d |_| |_| jd|j t|jt|j n| |_| |j d S )Nr      z9MID is %d. Signature is %s. Total raw message is %d bytes)r3   _getNextMID_SMB2r[   SMB2_COM_NEGOTIATEr?   r0   r\   SMB2_FLAGS_SIGNEDencodehmacnewr1   r   digest	signatureraw_datarB   rX   binasciihexlifylensendNMBMessage)rF   r(   r   r   r   r   r      s   



$
zSMB._sendSMBMessage_SMB2c                 C   r   r   r3   rK   r   r   r   r      r   zSMB._getNextMID_SMB2c              
   C   s  |j r|jtkr.|jdkr$d| _| jd | |j | 	| nNt
d|j |j||jtkrr|jdkr|j| _z6t|jj}|tjkrid| _| jd |jjs[|jjrdd| _| jd |   n	t
d| |j|W n tjy } z	t
t||j|d }~ww |jd	kr|j| _zt|jj\}}|tjkr| || W n tjtjfy } z	t
t||j|d }~ww |jd
ks|jdks|jdkrd| _| jd |   n|jdks|jdkrd| _| jd |   nz|jdkrd| _| jd |   nf|jdkr d| _| jd |   nR|jdks2|jdks2|jdkr@d| _| jd |   n2|jdkrTd| _| jd |   n|jdkrhd| _| jd |   n
t
d|j |j||jr|jdkr| j |j!d }|r|| j"|j#< d S d S | j" |j#d }|r|j$|fi |j% dS d S | j |j!d }|r|j$|fi |j% dS d S d S )Nr   Tz#SMB2 dialect negotiation successfulz3Unknown status value (0x%08X) in SMB2_COM_NEGOTIATEz$Authentication (on SMB2) successful!Fz3Signing disabled because session is guest/anonymouszJSMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is %d          m       d       j    zDAuthentication (on SMB2) failed. Please check username and password.         q    zAAuthentication (on SMB2) failed. Account or password has expired.   4   z`Authentication (on SMB2) failed. Account has been locked due to too many invalid logon attempts.   r    z;Authentication (on SMB2) failed. Account has been disabled.   o       [      p    z-Authentication (on SMB2) failed. Not allowed.      z4Authentication (on SMB2) failed. Domain not trusted.      z9Authentication (on SMB2) failed. Workstation not trusted.TUnknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)i  )&isReplyr[   r   statusr.   rB   rC   rj   payloadrl   ProtocolErrorr   SMB2_COM_SESSION_SETUPr?   r
   decodeAuthResponseSecurityBlobsecurity_blobRESULT_ACCEPT_COMPLETEDr/   isGuestSessionisAnonymousSessionr0   re   BadSecurityBlobErrorstrdecodeChallengeSecurityBlobRESULT_ACCEPT_INCOMPLETEro   UnsupportedSecurityProviderrf   isAsyncr+   popr3   r*   async_idcallbackkwargsrF   messageresultex
ntlm_tokenreqr   r   r   r      s   





















]zSMB._updateState_SMB2c                 C   s2   |j | _ |j| _|j| _|j| _|j| _d| _d S )NF)r6   r7   r>   r<   r=   r8   rF   r   r   r   r   r   \  s   
zSMB._updateServerInfo_SMB2c                 C   s(   t  }t|}| tt| d S rI   )r	   generateNegotiateMessager
   generateNegotiateSecurityBlobrL   r   SMB2SessionSetupRequest)rF   r   	ntlm_datablobr   r   r   r   e  s   
z!SMB._handleNegotiateResponse_SMB2c              	   C   s  t |\}}}| jdt| | jr/| jdt| t | j| j	||| j
\}}}n| jdt| t | j|d\}}}t ||||| j	| j
| j\}	}
| jtjru| jdt|t| | jdt|t| t|	}| tt| | jt@ r| jd | jtjk| _n| jt@ r| jd | jtjk| _nd| _| jr| jd	 |
| _ | jtjr| jd
t| j  | j!t"@ rd | _#d S || _#d S | jd d S )NzEPerforming NTLMv2 authentication (on SMB2) with server challenge "%s"zEPerforming NTLMv1 authentication (on SMB2) with server challenge "%s"T(NT challenge response is "%s" (%d bytes)(LM challenge response is "%s" (%d bytes)-Server requires all SMB messages to be signedServer supports SMB signingF7SMB signing activated. All SMB messages will be signed.zSMB signing key is %s9SMB signing deactivated. SMB messages will NOT be signed.)$r	   decodeChallengeMessagerB   rC   r   r   r&   generateChallengeResponseV2rG   r"   r$   generateChallengeResponseV1generateAuthenticateMessagerH   isEnabledForloggingDEBUGrX   r   r
   generateAuthSecurityBlobrL   r   r   r7   SMB2_NEGOTIATE_SIGNING_REQUIREDr%   r   
SIGN_NEVERr0   SMB2_NEGOTIATE_SIGNING_ENABLEDSIGN_WHEN_SUPPORTEDr1   r6   CAP_EXTENDED_SECURITYr2   )rF   r   r   server_challengeserver_flagsserver_infont_challenge_responselm_challenge_responsesession_keyr   session_signing_keyr   r   r   r   r   k  sR   





z SMB._handleSessionChallenge_SMB2   c                    sh  j stdt  d
g 		fdd	fdd	fdd	fd	d
	fdd fddfdd	fddd	fdd	 	fdd
jvr	
fdd}ttdj 
f }| t	|j
|
dj|j
< 	| d S j
  d S )N SMB connection not authenticatedIPC$c                    s   t tddttB tB tB tB tB tB t	B t
B ttB tB ttttB td}| |_| t|j | dj|j< | d S )Nsrvsvcr   file_attributesaccess_maskshare_accessoplockimpersonationcreate_optionscreate_dispr^   )r   SMB2CreateRequestFILE_READ_DATAFILE_WRITE_DATAFILE_APPEND_DATAFILE_READ_EAFILE_WRITE_EAREAD_CONTROLFILE_READ_ATTRIBUTESFILE_WRITE_ATTRIBUTESSYNCHRONIZEFILE_SHARE_READFILE_SHARE_WRITEFILE_SHARE_DELETESMB2_OPLOCK_LEVEL_NONESEC_IMPERSONATEFILE_NON_DIRECTORY_FILEFILE_OPEN_NO_RECALL	FILE_OPENr^   rL   _PendingRequestr3   r+   _pushToArrayr^   mconnectSrvSvcCBerrbackexpiry_timemessages_historyrF   r   r   connectSrvSvc  s   "
	
z+SMB._listShares_SMB2.<locals>.connectSrvSvcc                    s    |  | jdkrZ }tdddtd| tddddd }tt	| j
j|d}|d |_| t|j |d | j
jd	j|j<  | d S  td
 d S )Nr   s#   05 00 0b 03 10 00 00 00 74 00 00 00        <Is-  
b8 10 b8 10 00 00 00 00 02 00 00 00 00 00 01 00
c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00
2b 10 48 60 02 00 00 00 01 00 01 00 c8 4f 32 4b
70 16 d3 01 12 78 5a 47 bf 6e e1 88 03 00 00 00
2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00
01 00 00 00
   
r^   r^   fidCFailed to list shares: Unable to locate Server Service RPC endpoint)r  r   r   r   	unhexlifyreplacestructpackr   SMB2WriteRequestr   r-  r^   rL   r  r3   r+   OperationFailure)create_messager   call_id
data_bytesr!  r$  r%  r&  	rpcBindCBrF   r   r   r#    s"   



&z-SMB._listShares_SMB2.<locals>.connectSrvSvcCBc                    s    |  | jdkr;tt|d ddd}|d |_| t|j|d |d dj|j<  | d S  |d |d dd d S )	Nr   r-     )read_lenread_offsetr^   r,  zFFailed to list shares: Unable to read from Server Service RPC endpointerror)	r  r   r   SMB2ReadRequestr^   rL   r  r3   r+   )trans_messager   r!  )closeFidr$  r%  r&  	rpcReadCBrF   r   r   r9    s   


&z'SMB._listShares_SMB2.<locals>.rpcBindCBc           	         sJ   |  | jdkr }d}dj }t|d }|d }|d dkr,d}|d7 }tdddt	d	d
| d| tddd t	d|d| |d 
d | tddddd }tt|d ddd|d}|d |_| t|j|d |d dj|j<  | d S  |d |d dd d S )Nr   r)  z\\r   r           05 00 00 03 10 00 00 00r(  <HHIH   #   4c 00 00 00 00 00 0f 00 00 00 02 00<III UTF-16LEa   
01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
r+  r-  i i   )r\   max_out_sizein_datar^   r,  DFailed to list shares: Unable to bind to Server Service RPC endpointr=  )r  r   r   rD   r   r   r/  r0  r1  r2  r   r   SMB2IoctlRequestr^   rL   r  r3   r+   )	read_messager   r6  paddingrD   
server_lenserver_bytes_lenr7  r!  rA  r$  r%  listShareResultsCBr&  rF   r   r   rB    s@   




&z'SMB._listShares_SMB2.<locals>.rpcReadCBc                    s    |  | jdkr/| jj}|d d@ dkr#|d |d | d S |d |d | d S  |d |d  td d S )Nr      r   r^   r-  <Failed to list shares: Unable to retrieve shared device list)r  r   r   out_datar4  result_messager   r7  rA  decodeResultsr$  r&  rF   sendReadRequestr   r   rU    s   
z0SMB._listShares_SMB2.<locals>.listShareResultsCBc           
         t  t d|dd d }g }d}td|D ]}|tt d||d |d  d d d  |d7 }qtd|D ]v}t d	|||d  \}}}	|d7 }t||||	d
  d
  || _|	d
 dkrn||	d
 d
 7 }n||	d
 7 }t d	|||d  \}}}	|d7 }t||||	d
  d
  || _|	d
 dkr||	d
 d
 7 }q8||	d
 7 }q8| |  | d S Nr*  $   (   r   0            rH  r   	r1  unpackrangeappendSharedDevicer   data_bytes_decodenamecomments
r^   r-  r7  shares_countresultsoffsetrb   
max_length_lengthr   rA  r   r   r\    *   .
$$
z+SMB._listShares_SMB2.<locals>.decodeResultsc              	      s\   t dj}tt|d|}| |_| t|jtt		   | ||dj
|j< d S )N  r   )r^   r-  r7  minr<   r   r?  r^   rL   r  r3   inttimer+   r^   r-  r7  
read_countr!  r$  readCBrF   timeoutr   r   r]  +  s   
z-SMB._listShares_SMB2.<locals>.sendReadRequestc                    s    |  | jdkr?| jj}|d d@ dkr+|d |d |d |dd    d S |d |d |d |dd    d S  |d |d  td d S )	Nr   rV  r   r^   r-  r7     rW  )r  r   r   ra   r4  rP  r   r7  r[  r   r   r  3  s   
((z$SMB._listShares_SMB2.<locals>.readCBc                    J   t t|}| |_| t|j ||dj|j< | d S N)rp  r>  r   SMB2CloseRequestr^   rL   r  r3   r+   r  r^   r-  rp  r>  r!  closeCBr$  r%  r&  rF   r   r   rA  @  
   
z&SMB._listShares_SMB2.<locals>.closeFidc                    sB   |d d ur |d  d S |d d urt |d  d S d S )Nrp  r>  r4  close_messager   )r   r$  r&  r   r   r  G  s
   z%SMB._listShares_SMB2.<locals>.closeCBc                    sB    |  | jdkr| jj<  | j d S td d S )Nr   0Failed to list shares: Unable to connect to IPC$r  r   r^   r,   r4  connect_messager   r'  r$  r&  pathrF   r   r   	connectCBN  s
   
z'SMB._listShares_SMB2.<locals>.connectCB\\%s\%sr  NN)r/   r   r{  r,   r   SMB2TreeConnectRequestrD   upperrL   r  r3   r+   r  rF   r   r$  r  r  r!  r   )r   r  rA  r'  r#  r\  r$  r%  rU  r&  r  r  r9  rB  rF   r]  r  r   r     s,   !

zSMB._listShares_SMB2c           
         sl  j stdt | dddrdd  dr)d d g g fddfdd		
fd
dfdd
fdddfdd	 fddjvrfdd}ttdj	
 f }	|	 t|	j|dj|	j< |	 d S j  d S )Nr   /\r   c                    s   t ddddd}ttdttB tB tt	B t
B tttt|d	}| |_| t|j | dj|j< | d S Ns	  
28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00
44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00
00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
51 46 69 64 00 00 00 00
r(  r)  r+  r   r  r  r  r  r  r	  r
  create_context_datar  )r   r/  r0  r   r  r  r  r  r  r  r  r  r  FILE_DIRECTORY_FILEr  r^   rL   r  r3   r+   r  r^   r  r!  createCBr$  r%  r&  r  rF   r   r   
sendCreatej  s"   

	
z&SMB._listPath_SMB2.<locals>.sendCreatec                    sl    |  | jdkr|d | jjd d S | jdkr) tdf  d S  tdf  d S )Nr   r^   r)     4    z'Failed to list %s on %s: Path not foundz1Failed to list %s on %s: Unable to open directoryr  r   r   r-  r4  r5  r   r$  r&  r  rF   	sendQueryservice_namer   r   r    s   

z$SMB._listPath_SMB2.<locals>.createCBc              	      sX   t t|ddjd}| |_| t|j | ||dj|j< | d S )N%   r   )
info_classr\   output_buf_len)r^   r-  data_buf)	r   SMB2QueryDirectoryRequestr>   r^   rL   r  r3   r+   r  )r^   r-  r  r!  )r$  r%  r&  patternqueryCBrF   r   r   r    s   
 z%SMB._listPath_SMB2.<locals>.sendQueryc                    s    |  | jdkr!|d | jj }|d |d | d S | jdkr3 |d |d d d S | jdkrE |d |d d d S  |d |d | jd d S )	Nr   r  r^   r-         rp  l       r=  )r  r   r   ra   )query_messager   r  )rA  decodeQueryStructr&  rp  rF   r  r   r   r    s   


z#SMB._listPath_SMB2.<locals>.queryCBc                    s@  d}t |}t| }d}||k r|| |kr| |d  S t || |||  \}}}}}	}
}}}}}}}}}}|| }|| |krI| |d  S t| |||  }t|d | }d}|d@ dtfv rptkpnt@ }n|@ dk}|r 	t
t|t|t|	t|
||||||
 |r||7 }n	 dS ||k sdS )Nz<IIQQQQQQIIIBB24sHQr   F   r)  r1  calcsizer   rg  r   rk  ATTR_NORMALSMB_FILE_ATTRIBUTE_NORMALSMB_FILE_ATTRIBUTE_INCL_NORMALri  
SharedFiler   )r7  info_format	info_sizedata_lengthrq  next_offsetrs  create_timelast_access_timelast_write_timelast_attr_change_time	file_size
alloc_sizer  filename_lengthea_sizeshort_name_length
short_namefile_idoffset2filenameaccept_resultrp  searchr   r   r    s@   



z-SMB._listPath_SMB2.<locals>.decodeQueryStructc                    r  r  r  r  r  r   r   rA    r  z$SMB._listPath_SMB2.<locals>.closeFidc                    sd   |d d ur |d  d S |d d ur0|d dkr  g  d S t d|d f  d S d S )Nrp  r>  r  z;Failed to list %s on %s: Query failed with errorcode 0x%08xr  r  r   r$  r&  r  r  r   r   r    s    z#SMB._listPath_SMB2.<locals>.closeCBc                    J    |  | jdkr| jj< | j d S  tdf  d S )Nr   ;Failed to list %s on %s: Unable to connect to shared devicer  r  r$  r&  r  rF   r  r  r   r   r    
   
z%SMB._listPath_SMB2.<locals>.connectCBr  r  r  r/   r   r{  r0  
startswithendswithr,   r   r  rD   r  rL   r  r3   r+   r  
rF   r  r  r   r$  r  r  r  r  r!  r   )r   r  rA  r  r  r$  r%  r&  r  r  r  rp  r  rF   r  r  r  r   r   ]  s0   

	
'


zSMB._listPath_SMB2c                    s.  j stdt | dddrdd  dr)d d g fdd	
fdd	dfd
d	 
fdd
jvr	
fdd}ttdj	
 
f }| t|j|
dj|j< | d S 	j
  d S )Nr   r  r  r   r  c                    s   t ddddd}ttdttB tB tB t	t
B tB ttdt|d	}| |_| t|j | dj|j< | d S )Na	  
28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00
44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00
00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
51 46 69 64 00 00 00 00
 r   
r   r  r  )r   r/  r0  r   r  r  r  r  r  r  r  r  r  r  r  r^   rL   r  r3   r+   r  r  r  r   r   r    s"   
	
z+SMB._getAttributes_SMB2.<locals>.sendCreatec              
      s~    |  | jdkr2| j}}t|j|j|j|j|j	|j
|j||	} |d |j|d d S tdf  d S )Nr   r^   )rC   zHFailed to get attributes for %s on %s: Unable to open remote file object)r  r   r   _extractLastPathComponentr  r  lastaccess_timelastwrite_timechange_timer  allocation_sizer  r-  r4  )r5  r   pr  rC   rA  r$  r&  r  rF   r  r   r   r    s   

z)SMB._getAttributes_SMB2.<locals>.createCBc                    r  )N)rC   r>  r  )r^   r-  rC   r>  r!  r  r   r   rA    r  z)SMB._getAttributes_SMB2.<locals>.closeFidc                    L   |d d ur |d  d S |d d ur$t d|d f  d S d S )NrC   r>  zIFailed to get attributes for %s on %s: Query failed with errorcode 0x%08xr  r  r  r   r   r    
    z(SMB._getAttributes_SMB2.<locals>.closeCBc                    r  )Nr   IFailed to get attributes for %s on %s: Unable to connect to shared devicer  r  r  r   r   r  &  r  z*SMB._getAttributes_SMB2.<locals>.connectCBr  r  r  r  rF   r  r  r   r$  r  r  r!  r   )r   r  rA  r  r$  r%  r&  r  rF   r  r  r   r     s(   



zSMB._getAttributes_SMB2c           	         sD  	j stdt | dddrdd  dr)d d g g }	fdd
	fdd		fd
dd	fdd	 fdd	jvr	
fdd}ttd	j	
 f }	| t|j|d	j|j< 	| d S 
	j  d S )Nr   r  r  r   r  c                    sp   t tdttB tB tB tB ttB t	B t
tdtd}| |_| t|j | dj|j< | d S )Nr   r  r  )r   r  r  r  r  r  r  r  r  r  r  r  r  r^   rL   r  r3   r+   r  r   r  r   r   r  B  s   

z)SMB._getSecurity_SMB2.<locals>.sendCreatec              
      s    |  | jdkrDtt| jjdttB tB t	ddj
d}|d |_| t|j |d | jjdj|j<  | d S  tdf  d S )Nr   r   r\   additional_info	info_typefile_info_class	input_bufr  r^   r,  zSFailed to get the security descriptor of %s on %s: Unable to open file or directory)r  r   r   SMB2QueryInfoRequestr   r-  OWNER_SECURITY_INFORMATIONGROUP_SECURITY_INFORMATIONDACL_SECURITY_INFORMATIONSMB2_INFO_SECURITYr>   r^   rL   r  r3   r+   r4  r5  r   r!  )r$  r%  r&  r  r  rF   r  r   r   r  P  s   




&z'SMB._getSecurity_SMB2.<locals>.createCBc                    sZ    |  | jdkrt| jj} |d |d |d d S  |d |d | jd d S )Nr   r^   r-  )r   r=  )r  r   r   
from_bytesr   ra   )r  r   securityrA  r&  rF   r   r   r  a  s
   
z&SMB._getSecurity_SMB2.<locals>.queryCBc                    r  )N)r   r>  r  )r^   r-  r   r>  r!  r  r   r   rA  i  r  z'SMB._getSecurity_SMB2.<locals>.closeFidc                    r  )Nr   r>  zUFailed to get the security descriptor of %s on %s: Query failed with errorcode 0x%08xr  r  r  r   r   r  p  r  z&SMB._getSecurity_SMB2.<locals>.closeCBc                    r  )Nr   zUFailed to get the security descriptor of %s on %s: Unable to connect to shared devicer  r  r  r   r   r  w  r  z(SMB._getSecurity_SMB2.<locals>.connectCBr  r  r  r  	rF   r  r  r   r$  r  rp  r  r!  r   )r   r  rA  r  r$  r%  r&  r  r  rF   r  r  r   r   5  s,   



zSMB._getSecurity_SMB2c              
   C   s   |  |||||dd|S Nr   r  r}   rF   r  r  file_objr   r$  r  r   r   r   r     s   zSMB._retrieveFile_SMB2c                    s~  j stdt  
dd

dr
dd  

dr)
d d 
g 	g }	
fdd	
fdd	 	
fd
dfdd	fddd	fdd	 	
fddjvr	
fdd}ttdj	
 f }| t|j|dj|j< 	| d S j  d S )Nr   r  r  r   r  c                    s   t ddddd}ttdttB tB tB t	B t
tB ttttB t|d	}| |_| t|j | dj|j< | d S r  )r   r/  r0  r   r  r  r  r  r  r  r  r  r  r  FILE_SEQUENTIAL_ONLYr  r  r^   rL   r  r3   r+   r  r  r  r   r   r    s"   	
z4SMB._retrieveFileFromOffset_SMB2.<locals>.sendCreatec              
      s    |  | jdkrBtt| jjddtdddd}|d |_| t	|j
 |d | jj| jjdj|j
<  | d S  tdf  d S )	Nr      r)  i   r  r^   )r^   r-  r  0Failed to retrieve %s on %s: Unable to open file)r  r   r   r  r   r-  SMB2_INFO_FILEr^   rL   r  r3   r  r+   r4  r  )r$  r%  infoCBr&  r  rF   r  r   r   r    s&   



z2SMB._retrieveFileFromOffset_SMB2.<locals>.createCBc                    s4   |  | jdkrtd| jjdd d }dks!|kr?jr,j  d _| j|d   |d df d S }|dk rG|}| |krQ| }
r|	d| 	dd	 	d
d 	dd 	dd  t
di _|d |d |d|d  d S td	f  d S )Nr   z<Qrd  r   r-  r  totalunitB
unit_scaleTunit_divisorr:  descDownloading r^   zCFailed to retrieve %s on %s: Unable to retrieve information on filer   )r  r   r1  rg  r   ra   r@   closer^   
setdefaultr   r4  )info_messager   file_lenremaining_lenr   rA  r$  r  rr  r&  r  rF   sendReadr  show_progressstarting_offsettqdm_kwargsr   r   r    s.   

"z0SMB._retrieveFileFromOffset_SMB2.<locals>.infoCBc                    sb   t j|}tt|||}| |_| t|jtt		   | |||||d
j
|j< d S )N)r^   r-  rq  r  r;  r  rx  )r^   r-  rq  r  r;  r  r}  r!  r~  r   r   r    s   
z2SMB._retrieveFileFromOffset_SMB2.<locals>.sendReadc                    s   | j dkr_| jj}| jj |d | }|dkr>|d |d |d | ||d | |d  jr<j| d S d S jrIj  d _ |d |d |d |d | fd d S |   |d |d | j d	 d S )
Nr   r  r^   r-  rq  r;  r  )retr=  )	r   r   r  writera   r@   updater  r  )rP  r   data_lenr  )rA  r  r&  rF   r  r   r   r    s   
.
,z0SMB._retrieveFileFromOffset_SMB2.<locals>.readCBc                    r  )N)r  r>  r  )r^   r-  r  r>  r!  r  r   r   rA    r  z2SMB._retrieveFileFromOffset_SMB2.<locals>.closeFidc                    sF   |d d ur |d  d S |d d ur!t df  d S d S )Nr  r>  (Failed to retrieve %s on %s: Read failedr  r  r  r   r   r    s
   z1SMB._retrieveFileFromOffset_SMB2.<locals>.closeCBc                    r  )Nr   ?Failed to retrieve %s on %s: Unable to connect to shared devicer  r  r  r   r   r  
  r  z3SMB._retrieveFileFromOffset_SMB2.<locals>.connectCBr  r  r  r  )rF   r  r  r  r   r$  r  rr  r  r  r  rp  r  r!  r   )r   r  rA  r  r$  r%  r  r  rr  r&  r  r  rF   r  r  r  r  r  r  r  r   r     s0   

$

z SMB._retrieveFileFromOffset_SMB2c              
   C   s   |  |||||dd| d S Nr   T)r   r  r   r   r   r        zSMB._storeFile_SMB2c                    s  j stdt  }dddrdd  dr)d d g |	r]tjj	}|

d| |

dd |

d	d
 |

dd |

dd  tdi |
_fdd	
fddfdd

fddd fdd	 fddjvr	fdd}ttdj f }| t|jtt  |dj|j< | d S 	j  d S )!Nr   r  r  r   r  r   r  r  r  Tr  r:  r  
Uploading c                    s   t ddddd}tttttB tB t	B t
B tB tB tB tB dttttB r,tnt|d	}| |_| t|jtt   | dj|j< | d S )Nsi  
28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00
44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 20 00 00 00 10 00 04 00
00 00 18 00 08 00 00 00 41 6c 53 69 00 00 00 00
85 62 00 00 00 00 00 00 18 00 00 00 10 00 04 00
00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
51 46 69 64 00 00 00 00
r(  r)  r+  r   r  r  )r   r/  r0  r   r  ATTR_ARCHIVEr  r  r  r  r  r  r  r  r  r  r  r  r  FILE_OVERWRITE_IFFILE_OPEN_IFr^   rL   r  r3   rz  r{  r+   r  r  )r  r$  r&  r  rF   r  truncater   r   r  0  s"   	
"
	
(z1SMB._storeFileFromOffset_SMB2.<locals>.sendCreatec                    sP   |d | _ |  | jdkr| j | jj d S  tdf  d S )Nr^   r   -Failed to store %s on %s: Unable to open filer^   r  r   r   r-  r4  r  )r$  r&  r  rF   	sendWriter  r  r   r   r  I  s
   

z/SMB._storeFileFromOffset_SMB2.<locals>.createCBc              	      s   j }|}t|}|dkrCtt|||}| |_| jr)j| t	|j
tt  | ||| dj|j
< d S jrNj  d _ | ||d d S )Nr   )r^   r-  rq  )rq  )r=   readr   r   r3  r^   rL   r@   r  r  r3   rz  r{  r+   r  )r^   r-  rq  write_countra   r  r!  )rA  r$  r  rF   r  writeCBr   r   r   Q  s   

4
z0SMB._storeFileFromOffset_SMB2.<locals>.sendWritec                    st   | j dkr|d |d |d  d S jrj  d _|   |d |d  tdf  d S )Nr   r^   r-  rq  &Failed to store %s on %s: Write failed)r   r@   r  r  r4  write_messager   rA  r$  r&  r  rF   r   r  r   r   r#  b  s   

z.SMB._storeFileFromOffset_SMB2.<locals>.writeCBc              	      sX   t t|}| |_| t|jtt   |||dj|j< 	| d S )N)r-  rq  r>  
r   r  r^   rL   r  r3   rz  r{  r+   r  )r^   r-  r>  rq  r!  r  r$  r&  rF   r  r   r   rA  n  s
   
,z/SMB._storeFileFromOffset_SMB2.<locals>.closeFidc                    sJ   |d d ur |d f d S |d d ur#t df  d S d S )Nrq  r>  r$  r  r  )r   r$  r  r&  r  r  r   r   r  u  s
   z.SMB._storeFileFromOffset_SMB2.<locals>.closeCBc                    r  )Nr   <Failed to store %s on %s: Unable to connect to shared devicer  r  r  r   r   r  |  r  z0SMB._storeFileFromOffset_SMB2.<locals>.connectCBr  r  r   r  )r/   r   r{  r0  r  r  osstatrl  st_sizer  r   r@   r,   r   r  rD   r  rL   r  r3   rz  r+   r  )rF   r  r  r  r   r$  r  r  r  r  r  r%  total_bytesr  r!  r   )r   r  rA  r  r$  r  r&  r  rF   r  r   r  r  r  r  r#  r   r     s<   



(zSMB._storeFileFromOffset_SMB2c                    s  
j stdt  }d 	dddr dd  dr,d d n$d}|d ddksC|d ddkrPd|d d |d 	g g 	d u r|d}t	|dkru
d|d d |d f n
df  
fd	d
fdd
jvr͇	
fdd}	ttd
j f }

|
 t|
j||	d
j|
j< 
|
 d S rՈd  d S 
	 d S )Nr   r  r  r   r  r   ?r   c                    sf   r- d\}}|r"|r|d | }j | d S | d S   d S )Nr   r  )r   _deleteFiles_SMB2__delr,   r   r  r  r  r   deleteCBr$  files_queuepath_file_patternrF   r  r  r   r   r3    s   z'SMB._deleteFiles_SMB2.<locals>.deleteCBc                        |   d  d S rI   extend
files_listr3  r4  r   r   listCB     
z%SMB._deleteFiles_SMB2.<locals>.listCBc              	      sf    |  | jdkr&| jj	< r d  d S 	
 d S td	f  d S Nr   =Failed to delete %s on %s: Unable to connect to shared device)r  r   r^   r,   _deleteFiles_SMB2__listr4  r  r3  delete_matching_foldersr$  r4  r<  r&  r  r  rF   r  r  r   r   r    s   
z(SMB._deleteFiles_SMB2.<locals>.connectCBr  r  )r/   r   r{  r0  r  r  splitfindjoinr   ri  r,   r   r  rD   r  rL   r  r3   r+   r  r@  rF   r  r5  rB  r   r$  r  r%  path_componentsr  r!  r   r   r3  rB  r$  r4  r<  r&  r  r5  r  rF   r  r  r   r     s<   


$

"
 
zSMB._deleteFiles_SMB2c                    b   g g gt tB tB tB tB tB  	
fdd	j
||d d S )Nc              	         g }t dd | D ]}|jrrd d |j  q	|d |jf q	d kr9r9|d d f |rA|dd< r[ }|d< 	j
d ddd d S   d S )Nc                 S   
   | j dvS N).z..r  xr   r   r   <lambda>     
 z=SMB._deleteFiles_SMB2__list.<locals>.listCB.<locals>.<lambda>r   r  r   r   r  r  r  )filterisDirectoryri  r  r   r   rp  filesfr  r   current_pathrB  r$  r:  folder_queuer<  r  r  rF   r  r   r   r<         z+SMB._deleteFiles_SMB2__list.<locals>.listCBrS  )SMB_FILE_ATTRIBUTE_READONLYSMB_FILE_ATTRIBUTE_HIDDENSMB_FILE_ATTRIBUTE_SYSTEMSMB_FILE_ATTRIBUTE_DIRECTORYSMB_FILE_ATTRIBUTE_ARCHIVEr  r   rF   r  r  r  rB  r   r$  r  r   rY  r   r@        zSMB._deleteFiles_SMB2__listc                    s   g fdd} 	
fddfdd	fdddfd	d
	 
fdd|| d S )Nc                       t ddddd}ttdttB ttB t	B t
ttt|d	}| |_| t|jtt   | dj|j< | d S )Ns%  
    28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00
    44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00
    00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
    00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
    51 46 69 64 00 00 00 00
    r(  r)  r+  r   r  r  )r   r/  r0  r   r  DELETEr  r  r  r  r  r  r  r  r^   rL   r  r3   rz  r{  r+   r  r  r  r$  r&  r  rF   r  r   r   r    "   
	
(z.SMB._deleteFiles_SMB2__del.<locals>.sendCreatec                    s   |d | _ |  | jdkr| j | jj d S | jdkr%  d S | jdkr7tdf  d S tdf  d S )Nr^   r   r         Failed to delete %s on %s: Cannot delete a folder. Please use deleteDirectory() method or append "/*" to your path if you wish to delete all files in the folder.z.Failed to delete %s on %s: Unable to open filer  open_messager   )r   r$  r&  r  rF   
sendDeleter  r   r   r    s   



z,SMB._deleteFiles_SMB2__del.<locals>.createCBc                    `   t t|dtddd}| |_| t|jtt   | |dj	|j< 
| d S Nr         r  r  r  ra   r,  r   SMB2SetInfoRequestr  r^   rL   r  r3   rz  r{  r+   r  r^   r-  r!  r3  r$  r&  rF   r  r   r   rl    s   
*z.SMB._deleteFiles_SMB2__del.<locals>.sendDeletec                    L    |  | jdkr |d |d dd d S  |d |d | jd d S Nr   r^   r-  r   r  r   delete_messager   r  r   r   r3       
z,SMB._deleteFiles_SMB2__del.<locals>.deleteCBc                    T   t t|}| |_| t|jtt   |dj|j< 	| d S Nrx  r(  r^   r-  r   r!  r)  r   r   rA  !  
   
(z,SMB._deleteFiles_SMB2__del.<locals>.closeFidc                    2   |d dkr  d S t df  d S Nr   r   (Failed to delete %s on %s: Delete failedr  r  r  r   r   r  (     z+SMB._deleteFiles_SMB2__del.<locals>.closeCBrI   r   )rF   r  r^   r  r   r$  r  r  r   )r   r  rA  r  r3  r$  r&  r  rF   rl  r  r  r   r0    s   zSMB._deleteFiles_SMB2__delc           
         sV  
j stdt  }dddrdd  dr)d d g 
fdd
fdd		
fd
d
fdd	d
fdd	 fdd
jvr
fdd}ttd
j	
 f }	
|	 t|	j||d
j|	j< 
|	 d S 
j  d S )Nr   r  r  r   r  c                    s   t ddddd}ttdtttB tt	dt
|d	}| |_| t|jtt   | dj|j< | d S r  )r   r/  r0  r   r  r  r  r  r  r  r  r^   rL   r  r3   rz  r{  r+   r  r  rf  r   r   r  <  s"   		
(z1SMB._resetFileAttributes_SMB2.<locals>.sendCreatec                    F    |  | jdkr|d | jj d S  tdf  d S )Nr   r^   z;Failed to reset attributes of %s on %s: Unable to open filer  rj  )r$  r&  r  rF   	sendResetr  r   r   r  T     
z/SMB._resetFileAttributes_SMB2.<locals>.createCBc                    sr   t t|dtdtddddddd}| |_| t|jt	t

   | |dj|j< | d S )Nr   rc  qqqqiirq  r,  )r   rs  r  r1  r2  r^   rL   r  r3   rz  r{  r+   r  rt  )r$  r  r&  resetCBrF   r  r   r   r  [  s   
*z0SMB._resetFileAttributes_SMB2.<locals>.sendResetc                    rv  rw  ry  )reset_messager   r  r   r   r  g  r|  z.SMB._resetFileAttributes_SMB2.<locals>.resetCBc                    r}  r~  r(  r  r)  r   r   rA  n  r  z/SMB._resetFileAttributes_SMB2.<locals>.closeFidc                    s2   |d dkr  d S t df  d S )Nr   r   z4Failed to reset attributes of %s on %s: Reset failedr  r  )r   r$  r&  r  r5  r  r   r   r  u  r  z.SMB._resetFileAttributes_SMB2.<locals>.closeCBc                    r  )Nr   zJFailed to reset attributes of %s on %s: Unable to connect to shared devicer  r  r  r   r   r  |  r  z0SMB._resetFileAttributes_SMB2.<locals>.connectCBr  r  rI   r  )
rF   r  r5  r   r$  r  r  r%  r  r!  r   )r   r  rA  r  r$  r  r&  r  r5  r  rF   r  r  r  r  r   r   0  s,   



zSMB._resetFileAttributes_SMB2c           	         s&  j stdt 
 }dddrdd  dr)d d g 
fdd	fdd	
fd
d fdd	jvr	fdd}ttdj	
 	f }| t|j||	dj|j< | d S j	  d S )Nr   r  r  r   r  c                    s   t ddddd}ttdttB tB tB t	B t
B tB tB tB dttttB t|d	}| |_| t|jtt   | dj|j< | d S r  )r   r/  r0  r   r  r  r  r  r  r  r  r  re  r  r  r  r  FILE_SYNCHRONOUS_IO_NONALERTFILE_CREATEr^   rL   r  r3   rz  r{  r+   r  r  rf  r   r   r    s"   "	
(z-SMB._createDirectory_SMB2.<locals>.sendCreatec                    sF    |  | jdkr |d | jj d S tdf  d S )Nr   r^   2Failed to create directory %s on %s: Create failedr  r  r  r   r   r    r  z+SMB._createDirectory_SMB2.<locals>.createCBc                    sP   t t|}| |_| t|jtt   j|j< 	| d S rI   r(  rt  r)  r   r   rA    
   
$z+SMB._createDirectory_SMB2.<locals>.closeFidc                    s     d S rI   r   r  )r   r  r   r   r    s   z*SMB._createDirectory_SMB2.<locals>.closeCBc                    r  )Nr   GFailed to create directory %s on %s: Unable to connect to shared devicer  r  r  r   r   r    r  z,SMB._createDirectory_SMB2.<locals>.connectCBr  r  r  )	rF   r  r  r   r$  r  r%  r  r!  r   )r   r  rA  r  r$  r&  r  rF   r  r  r  r   r     s(   



zSMB._createDirectory_SMB2c                    R  	j stdt  dddrdd  dr)d d g 	fdd
	fdd		fd
d	fddd	fdd	 fdd	jvr	
fdd}ttd	j	
 f }	| t|j|d	j|j< 	| d S 
	j  d S )Nr   r  r  r   r  c                    rd  r  )r   r/  r0  r   r  re  r  r  r  r  r  r  r  r  r^   rL   r  r3   rz  r{  r+   r  r  rf  r   r   r    rg  z-SMB._deleteDirectory_SMB2.<locals>.sendCreatec                    r  )Nr   r^   z3Failed to delete %s on %s: Unable to open directoryr  rj  r$  r&  r  rF   rl  r  r   r   r    r  z+SMB._deleteDirectory_SMB2.<locals>.createCBc                    rm  rn  rr  rt  ru  r   r   rl    s   
*z-SMB._deleteDirectory_SMB2.<locals>.sendDeletec                    rv  rw  ry  rz  r  r   r   r3    r|  z+SMB._deleteDirectory_SMB2.<locals>.deleteCBc                    H   t t|}| |_| t|j |dj|j< | d S r~  r  r  r  r   r   rA    
   
z+SMB._deleteDirectory_SMB2.<locals>.closeFidc                    r  r  r  r  r  r   r   r    r  z*SMB._deleteDirectory_SMB2.<locals>.closeCBc                    r  r>  r  r  r  r   r   r    r  z,SMB._deleteDirectory_SMB2.<locals>.connectCBr  r  rI   r  r  r   )r   r  rA  r  r3  r$  r%  r&  r  rF   r  rl  r  r  r   r     s,   



zSMB._deleteDirectory_SMB2c           	         s  
j stdt  g dddr dd  dr+d d dddr<dd  drGd d 
fdd
fdd		
fd
d
fdd	d
fdd	 fdd
jvr
fdd}ttd
j	
 f }
| t|j|d
j|j< 
| d S 
j  d S )Nr   r  r  r   r  c                    s   t ddddd}ttdttB tB tt	B t
B tttt|d	}| |_| t|jtt   | dj|j< | d S r  )r   r/  r0  r   r  re  r  r  r  r  r  r  r  r  r  r^   rL   r  r3   rz  r{  r+   r  r  )r  r$  r&  old_pathrF   r  r   r   r  ;  s"   

	
(z$SMB._rename_SMB2.<locals>.sendCreatec                    r  )Nr   r^   z8Failed to rename %s on %s: Unable to open file/directoryr  r  r$  r&  r  rF   
sendRenamer  r   r   r  R  r  z"SMB._rename_SMB2.<locals>.createCBc                    s   dt dtd  d }tt|dtd|d}| |_| t	|j
tt   | |dj|j
< | d S )	Ns                   r*  r   rJ  r   
   rq  r,  )r1  r2  r   r   r   rs  r  r^   rL   r  r3   rz  r{  r+   r  )r^   r-  ra   r!  )r$  r&  new_pathrenameCBrF   r  r   r   r  Y  s   "
*z$SMB._rename_SMB2.<locals>.sendRenamec                    rv  rw  ry  rename_messager   r  r   r   r  e  r|  z"SMB._rename_SMB2.<locals>.renameCBc                    r  r~  r  r  r  r   r   rA  l  r  z"SMB._rename_SMB2.<locals>.closeFidc                    s6   |d dkr f d S t df  d S )Nr   r   (Failed to rename %s on %s: Rename failedr  r  )r   r$  r&  r  r  r  r   r   r  s     z!SMB._rename_SMB2.<locals>.closeCBc                    r  )Nr   =Failed to rename %s on %s: Unable to connect to shared devicer  r  )r$  r&  r  rF   r  r  r   r   r  z  r  z#SMB._rename_SMB2.<locals>.connectCBr  r  rI   r  	rF   r  r  r  r   r$  r  r  r!  r   )r   r  rA  r  r$  r%  r&  r  r  r  rF   r  r  r  r  r   r   (  s6   





zSMB._rename_SMB2c                    r  )Nr   r  r  r   r  c                    s   t ddddd}ttdttB tB tt	B t
ttt|d	}| |_| t|jtt   | dj|j< | d S )Ns   
28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00
44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00
00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
r(  r)  r+  r   r  r  )r   r/  r0  r   r  r  r  r  r  r  r  r  r  r  r^   rL   r  r3   rz  r{  r+   r  r  rf  r   r   r    s"   
	
(z+SMB._listSnapshots_SMB2.<locals>.sendCreatec                    r  )Nr   r^   z@Failed to list snapshots %s on %s: Unable to open file/directoryr  r  r$  r&  r  rF   sendEnumSnapshotsr  r   r   r    r  z)SMB._listSnapshots_SMB2.<locals>.createCBc                    s^   t t|dddd}| |_| t|jtt   | |dj|j< 	| d S )Nd@ r   r)  )ctlcoder\   rM  r,  )
r   rO  r^   rL   r  r3   rz  r{  r+   r  rt  )enumSnapshotsCBr$  r&  rF   r  r   r   r    s   
*z2SMB._listSnapshots_SMB2.<locals>.sendEnumSnapshotsc                    s    |  | jdkrmg }td| jjdd d }td|D ]?}t| jjd|d  d|d   }|	t
ttt|dd	 |d
d |dd |dd |dd |dd f  q  |d |d |d d S  |d |d | jd d S )Nr   r*  rc  rd  re  2   <   r  	   r  ro     r               r  r^   r-  r  rx  )r  r   r1  rg  r   rX  rh  r   rk  ri  r   listmaprz  enum_messager   rp  snapshots_countrb   sr  r   r   r    s   
&Vz0SMB._listSnapshots_SMB2.<locals>.enumSnapshotsCBc                    r  )N)r   rp  r  )r^   r-  r   rp  r!  r  r   r   rA    r  z)SMB._listSnapshots_SMB2.<locals>.closeFidc                    s6   |d d ur |d  d S t df  d S )Nrp  z.Failed to list snapshots %s on %s: List failedr  r  r  r   r   r    r  z(SMB._listSnapshots_SMB2.<locals>.closeCBc                    r  )Nr   EFailed to list snapshots %s on %s: Unable to connect to shared devicer  r  r  r   r   r    r  z*SMB._listSnapshots_SMB2.<locals>.connectCBr  r  r  r  r  r   )r   r  rA  r  r  r$  r%  r&  r  rF   r  r  r  r  r   r     s,   




zSMB._listSnapshots_SMB2c                    s`   g  fdd}t t }| t|jtt | |j|j< | d S )Nc                    s4    |  | jdkr  d S td d S )Nr   Echo failed)r  r   r4  echo_messager   r   ra   r$  r&  rF   r   r   echoCB  s   
zSMB._echo_SMB2.<locals>.echoCB)	r   SMB2EchoRequestrL   r  r3   rz  r{  r+   r  rF   ra   r   r$  r  r  r!  r   r  r   r     s   

$zSMB._echo_SMB2c                 C   s   |j dkr
|  |_ |js| j|_| jrg| jtO  _| j|_|  jd7  _| }t	
| j}| jr9|| j || | d d }| jd|j |jt|t| |d d | |dd   |_n| |_| |j d S )Nr   r   rd  zKMID is %d. Signing ID is %d. Signature is %s. Total raw message is %d bytes   r  )r3   _getNextMID_SMB1r4   r0   r]   !SMB_FLAGS2_SMB_SECURITY_SIGNATUREr5   r  r   r	   MD5r1   r2   r  r   rB   rX   r   r   r   r   r   )rF   r(   r   mdr   r   r   r   rm     s$   


" 
zSMB._sendSMBMessage_SMB1c                 C   s$   |  j d7  _ | j dkrd| _ | j S )Nr     r   rK   r   r   r   r    s   
zSMB._getNextMID_SMB1c              
   C   s  |j r|jtkr0|jjs%d| _| jd|j | 	|j
 | | ntd|jj |j||jtkr|jrz|jjsz2t|j
j}|tjkre| jd|j |j| _d| _| jd |   n	td| |j|W n_ tjy } z	tt||j|d }~ww |jjdkrzt|j
j\}}|tjkr| || W n+ tjtjfy } z	tt||j|d }~ww |jjdks|jjd	ks|jjd
krd| _| jd |   n|jjdks|jjdkrd| _| jd |   n|jjdkrd| _| jd |   n|jjdkr"d| _| jd |   n|jjdks7|jjdks7|jjdkrEd| _| jd |   n|jjdkrZd| _| jd |   nv|jjdkrod| _| jd |   natd|jj |j||jjdkr| jd|j |j| _d| _| jd |   n5d| _| jd |   n'|jtkrz| j |j! }W n
 t"y   Y nw |jjs|j#| j$|j%d  < | j &|j!d }|r|j'|fi |j% dS d S d S )!NTz8SMB dialect negotiation successful (ExtendedSecurity:%s)z2Unknown status value (0x%08X) in SMB_COM_NEGOTIATEzSMB uid is now %dz3Authentication (with extended security) successful!zNSMB_COM_SESSION_SETUP_ANDX status is 0 but security blob negResult value is %dr   r   r   r   FzSAuthentication (with extended security) failed. Please check username and password.r   r   zPAuthentication (with extended security) failed. Account or password has expired.r   zoAuthentication (with extended security) failed. Account has been locked due to too many invalid logon attempts.r   zJAuthentication (with extended security) failed. Account has been disabled.r   r   r   z<Authentication (with extended security) failed. Not allowed.r   zCAuthentication (with extended security) failed. Domain not trusted.r   zHAuthentication (with extended security) failed. Workstation not trusted.r   r   z6Authentication (without extended security) successful!zUAuthentication (without extended security) failed. Please check username and passwordr  )(r   r[   SMB_COM_NEGOTIATEr   hasErrorr.   rB   rC   hasExtendedSecurityrj   r   rl   r   internal_valuer   SMB_COM_SESSION_SETUP_ANDXr
   r   r   r   rX   r4   r/   re   r   r   r   r   ro   r   rf   SMB_COM_TREE_CONNECT_ANDXr+   r3   KeyErrorr^   r,   r   r   r   r   r   r   r   rh     s   













YzSMB._updateState_SMB1c                 C   sT   |j | _ |j| _|j| _|j| _|j| _t|jt@  | _| jr(| j	d d S d S )NzjRemote server only supports plaintext authentication. Your password can be stolen easily over the network.)
r6   r7   r9   r:   r;   boolNEGOTIATE_ENCRYPT_PASSWORDSr8   rB   warningr   r   r   r   ri   x  s   zSMB._updateServerInfo_SMB1c              	   C   s  |j sJ |jr| js|j| _t|\}}}| jr4| jdt| t	| j
| j||| j\}}}n| jdt| t| j
|d\}}}t||||| j| j| j\}	}
| jtjrz| jdt|t| | jdt|t| t|	}| ttd| | jt@ r| jd | jtjk| _n| jt @ r| jd | jtj!k| _nd	| _| jr| jd
 |
| _"| j#t$@ rd | _%d S || _%d S | jd d S )NzTPerforming NTLMv2 authentication (with extended security) with server challenge "%s"zTPerforming NTLMv1 authentication (with extended security) with server challenge "%s"Tr   r   r   r   r   Fr   r   )&r  r4   r	   r   r&   rB   rC   r   r   r   rG   r"   r$   r   r   rH   r   r   r   rX   r   r
   r   rL   r'   1ComSessionSetupAndxRequest__WithSecurityExtensionr7   %NEGOTIATE_SECURITY_SIGNATURES_REQUIREr%   r   r   r0   $NEGOTIATE_SECURITY_SIGNATURES_ENABLEr   r1   r6   r   r2   )rF   r   r   r   r   r   r   r   r   r   r1   r   r   r   r   rn     sR   






z SMB._handleSessionChallenge_SMB1c              	   C   s   |j r
| j s
|j | _ |js|jjr(t }t|}| t	t
|jj| d S t| j|jjd\}}}| jdt|jjt| | t	t|jj| j|d| j d S )NFzlPerforming NTLMv1 authentication (without extended security) with challenge "%s" and hashed password of "%s"T)r4   r  r   supportsExtendedSecurityr	   r   r
   r   rL   r'   r  r   r   rG   	challengerB   rC   r   r   /ComSessionSetupAndxRequest__NoSecurityExtensionr"   r$   )rF   r   r   r   nt_passwordrs  r   r   r   rk     s"   
z!SMB._handleNegotiateResponse_SMB1c                    s"  j stdt  d	g fddfddfddfd	d
 fdd
fddfdd
fdd	fdd}ttdj 	f td}| t	|j
|	dj|j
< | d S )Nr   r  c                    sx   t tdtttB tB tB tB tB t	B t
B ttB tttB tdd}| |_| t|j j|j< | d S )Nz\srvsvcr   )r\   r  r  r
  r	  r  security_flags)r'   ComNTCreateAndxRequest#NT_CREATE_REQUEST_EXTENDED_RESPONSEr  r  r  r  r  r  r  r  r  r  r  r  r  r  r^   rL   r  r3   r+   r  r   r"  r   r   r'    s   
z+SMB._listShares_SMB1.<locals>.connectSrvSvcc                    s    |  | jjs_ }tdd| jj}t	d
ddtd| t	d
dd
dd }ttd	d
d	||d}| j|_| t|j | jjdj|j<  | d S  td d S )N<HH&   s#   05 00 0b 03 10 00 00 00 48 00 00 00r(  r)  r*  s   
b8 10 b8 10 00 00 00 00 01 00 00 00 00 00 01 00
c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00
2b 10 48 60 02 00 00 00r+  r   rw  max_params_countmax_data_countmax_setup_countr7  setup_bytesr-  r.  )r  r   r  r   r1  r2  r   r-  r   r/  r0  r'   ComTransactionRequestr^   rL   r  r3   r+   r4  )r5  r   r6  r  r7  r!  r8  r   r   r#    s.   

 z-SMB._listShares_SMB1.<locals>.connectSrvSvcCBc           	         sP   |  | jjs }d}tjd }|d }|d dkr'd}|d7 }tdd|d }t	d	
d
dtdd| d| t	d
d
d td|d| jd d | t	d
d
d
dd }ttddd||d}| j|_| t|j|d dj|j<  | d S  | j|d  td d S )Nr)  r   r   r   rC  r  r  r-  rD  r(  rE  rF  rG  rH  rI  rJ  rK  r+  rw  r  r  rN  )r  r   r  r   r   rD   r1  r2  r   r/  r0  r   r'   r  r^   rL   r  r3   r+   r4  )	r@  r   r6  rQ  rR  rS  r  r7  r!  rT  r   r   r9    sL   

 z'SMB._listShares_SMB1.<locals>.rpcBindCBc                    sz    |  | jjs,| jj}|d d@ dkr!| j|d | d S | j|d | d S  | j|d  td d S )NrV  r   r   r-  rW  )r  r   r  r   r7  r^   r4  rY  r[  r   r   rU  &  s   z0SMB._listShares_SMB1.<locals>.listShareResultsCBc           
         r^  r_  rf  rn  ru  r   r   r\  4  rv  z+SMB._listShares_SMB1.<locals>.decodeResultsc                    sb   t djd }tt|d||d}| |_| t|jtt		   ||dj
|j< d S )Nrw  r   r   r-  rq  max_return_bytes_countmin_return_bytes_count)r-  r7  )ry  r9   r'   ComReadAndxRequestr^   rL   r  r3   rz  r{  r+   r|  r~  r   r   r]  R  s   
.z-SMB._listShares_SMB1.<locals>.sendReadRequestc                    s    |  | jjs<| jj}|d d@ dkr)| j|d |d |dd    d S | j|d |d |dd    d S  | j|d  td d S )NrV  r   r   r-  r7  r  rW  )r  r   r  r   ra   r^   r4  r  r[  r   r   r  \  s   &&z$SMB._listShares_SMB1.<locals>.readCBc                    ,   t t|}| |_|  | d S rI   r'   ComCloseRequestr^   rL   r  rt  r&  rF   r   r   rA  i     
z&SMB._listShares_SMB1.<locals>.closeFidc                    s@    |  | jjs| jj<  | j d S td d S )Nr  r  r   r  r^   r,   r4  r  r  r   r   r  o  s
   z'SMB._listShares_SMB1.<locals>.connectCBr  r   r  )r/   r   r{  r'   ComTreeConnectAndxRequestrD   r  SERVICE_ANYrL   r  r3   r+   r  r  r   )r   rA  r'  r#  r\  r$  r%  rU  r&  r  r  r9  rF   r]  r  r   rp     s$   '

zSMB._listShares_SMB1c           
         sj  j stdt | dddsd7 g g 
d	f	dd	
fdd 
fd	d
fdd 
fddfddfddjvrfdd}ttdj	 f t
d}	|	 t|	j|dj|	j< |	 d S j  d S )Nr   r  r  Fc                    s   t dd}t dd@ dddd}|r)|d	j d	    d
 d7 }n| d
 d7 }ttddd||d}| |_|rK| jtO  _	| t
|j j|j< | d S )N<Hr   z<HHHHIr  d        r   r  rI  rJ  r  A  r  r  r  params_bytesr  )r1  r2  rD   r   r'   ComTransaction2Requestr^   r]   SMB_FLAGS2_DFSrL   r  r3   r+   r  )r^   support_dfsr  r  r!  )	r$  r%  findFirstCBr&  r  r  r  rF   r  r   r   sendFindFirst  s0   *
z)SMB._listPath_SMB1.<locals>.sendFindFirstc                    s2  d}t |}t| }d}||k r|| |kr| |d  S t || |||  \}}}}}	}
}}}}}}}}|| }|| |krG| |d  S t| |||  }t|}d}|d@ dtfv rjtkpht@ }n|@ dk}|r 	t
t|t|t|	t|
|||||	 |r||7 }n	 dS ||k sdS )Nz<IIQQQQQQIIIBB24sr   Fr  r)  r  )r7  r  r  r  rq  r  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   decodeFindStruct  s@   




z,SMB._listPath_SMB1.<locals>.decodeFindStructc           	   	      s   |  | jjsd|vr*td| jjd d \}}}}}||||dd n|d |d |d }}}d	}| jjr|d
 | jj }d|vrht	| jj| jj
krg|t	| jj| jj
|d d}n%|d  t	| jj7  < t| jj
|d |d< ||d
< |d |d krd}|st| jfi |j| j< d S |r  d S 	| j|dd j|dd d S | jjdkrǈ g  d S td
f  d S )Ntotal_countz<HHHHHr  r)  )sidend_of_searchlast_name_offsetr  r  r  r  Tr  
data_countr  r  r  Fr   r  r  r  5Failed to list %s on %s: Unable to retrieve file list)r  r   r  r1  rg  r   r  r  r7  r   total_data_country  r  r3   r+   r^   r  rZ   r  r4  )	find_messager   r  search_countr  rs  r  	send_nextd)r   r  r$  r%  r  r&  r  rp  rF   sendFindNextr  r   r   r    s<   "$$z'SMB._listPath_SMB1.<locals>.findFirstCBc                    s   t dd}t d|dd|d}||d d7 }ttd	d
d||d}| |_|r0| jtO  _| t	|j
 ||dj|j
< | d S )Nr  r   z<HHHIHr  r  r  rI  rJ  r  r  r   r  )r  r  )r1  r2  r   r'   r  r^   r]   r  rL   r  r3   r+   r  )r^   r  
resume_keyresume_filer  r  r  r!  )r$  r%  
findNextCBr&  rF   r   r   r    s,   
z(SMB._listPath_SMB1.<locals>.sendFindNextc              	      s   |  | jjsd|vr(td| jjd d \}}}}|||dd n	|d |d }}d}| jjr|d	 | jj }d
|vrat	| jj| jj
kr`|t	| jj| jj
|d d}n%|d
  t	| jj7  < t| jj
|d |d< ||d	< |d
 |d krd}|st| jfi |j| j< d S |r  d S 	| j|d dd j|dd d S td
f  d S )Nr  z<HHHHrd  r)  )r  r  r  r  r  Tr  r  r  Fr  r   r  r  r  )r  r   r  r1  rg  r   r  r  r7  r   r  ry  r  r3   r+   r^   r  rZ   r4  )r  r   r   r  rs  r  r  r  )r   r  r$  r%  r  r&  r  rp  rF   r  r  r   r   r  	  s8    $(z&SMB._listPath_SMB1.<locals>.findNextCBc                    s   t dd}t dd}|dj d  d7 }ttddd||d	}| |_| t|j	 j
|j	< | d S )
Nr  r   rV  r  rJ  r  r  r   r  )r1  r2  rD   r   r'   r  r^   rL   r  r3   r+   r  r^   r  r  r!  )dfsReferralCBr$  r%  r&  rF   r  r   r   sendDFSReferral+	  s   
z+SMB._listPath_SMB1.<locals>.sendDFSReferralc                    s    | j d d S )NTr  )dfs_messager   )r  r   r   r  :	  s   z)SMB._listPath_SMB1.<locals>.dfsReferralCBc                    sd    |  | jjs%| jj< | jjt@ r| j d S | jd d S  tdf  d S )NFr  )	r  r   r  r^   r,   r   optional_supportSMB_TREE_CONNECTX_SUPPORT_DFSr4  r  )r$  r&  r  rF   r	  r  r  r   r   r  >	  s   z%SMB._listPath_SMB1.<locals>.connectCBr  r   r  )Fr/   r   r{  r0  r  r,   r'   r  rD   r  r  rL   r  r3   r+   r  r  r   )r   r  r  r$  r%  r  r  r&  r  r  rp  r  rF   r	  r  r  r  r   rr   |  s,   
 '( $

zSMB._listPath_SMB1c                    s  j stdt | dddrdd  dr)d d g fdd fdd	jvr{fd
d}ttdj	
 f td}| t|j|dj|j< | d S j  d S )Nr   r  r  r   r  c                    sz   t dd}t ddd}|d d7 }ttdd	d||d
}| |_| t|j j	|j< 
| d S )Nr  r  z<HIi  r   rI  rJ  r   r  r  )r1  r2  r   r'   r  r^   rL   r  r3   r+   r  r  )r$  r%  r&  r  r  rF   r   r   r  \	  s"   
z*SMB._getAttributes_SMB1.<locals>.sendQueryc              
      s    |  | jjsDd}t|}t|| jjd | \}}}}}}	}
}}t	t
|t
|t
|t
|||
|||	} | d S tdf  d S )Nz	<QQQQIIQQz2Failed to get attributes for %s on %s: Read failed)r  r   r  r1  r  rg  r   r7  r  r  r   r4  )r  r   r  r  r  r  r  r  r  rs  r  r  r  rC   r   r$  r&  r  rF   r  r   r   r  n	  s   



z(SMB._getAttributes_SMB1.<locals>.queryCBc                    H    |  | jjs| jj< | j d S  tdf  d S )Nr  r  r  r  r   r   r  ~	  
   z*SMB._getAttributes_SMB1.<locals>.connectCBr  r   r  )r/   r   r{  r0  r  r  r,   r'   r  rD   r  r  rL   r  r3   r+   r  r  r   )	r   r$  r%  r&  r  r  rF   r  r  r   rx   P	  s$   



zSMB._getAttributes_SMB1c                 C      t d)Nz+getSecurity is not yet implemented for SMB1r   )rF   r  r5  r   r$  r  r   r   r   rv   	     zSMB._getSecurity_SMB1c	           	      C   s   |  |||||dd|||
S r  r  	rF   r  r  r  r   r$  r  r  r  r   r   r   rz   	  r  zSMB._retrieveFile_SMB1c                    s(  	j stdddg 	fdd
 	fdd	fdd	 	f
d
d	fdd	jvr	
fdd}ttd	j f td}		| t
|jtt  |d	j|j< 	| d S 
	j  d S )Nr   r  r  c                    sb   t tddttB d d}| |_| t|jtt		   j
|j< | d S )N@   r     r  access_mode	open_modesearch_attributesr  r'   ComOpenAndxRequestr^  r_  r^   rL   r  r3   rz  r{  r+   r  r   r$  r&  openCBr  rF   r  r   r   sendOpen	  s   
$z2SMB._retrieveFileFromOffset_SMB1.<locals>.sendOpenc                    s    |  | jjs`dkr!| j| jj  | jjdf d S 
rPdkrPd dd dd dd d	d
  tdi _	| j| jj| jjd d S t
d	f  d S )Nr   r   r  r  r  Tr  r:  r  r  r  r   )r  r   r  r^   r   r-  r  r  r   r@   r4  rj  r  r   r   r  	  s    z0SMB._retrieveFileFromOffset_SMB1.<locals>.openCBc                    sh   j d }tt|||td|d}| |_| t|jtt		   |||||d	j
|j< d S )Nr   r  r  )r-  rq  r  r;  r  )r9   r'   r  ry  r^   rL   r  r3   rz  r{  r+   )r^   r-  rq  r  r;  r  r}  r!  r~  r   r   r  	  s   

z2SMB._retrieveFileFromOffset_SMB1.<locals>.sendReadc                    sj  | j js|d }|d }| jj}dkr:||kr*| jjd |  ||7 }d}n| jj ||8 }||7 }n| jj ||7 }jrNj| dkrV|dks]|jd k r{jrhj	  d _| j
|d   |d |f d S | j
|d |d | |d || d S jrj	  d _|  | j
|d  td	f  d S )	Nr;  r  r   r   r-  r  rq  r  )r   r  r   r  r  ra   r@   r  r9   r  r^   r  r4  )rP  r   r;  r  r  )
r   rA  r$  r  rr  r&  r  rF   r  r  r   r   r  	  s:   

(
z0SMB._retrieveFileFromOffset_SMB1.<locals>.readCBc                    r  rI   r  rt  r  r   r   rA  	  r  z2SMB._retrieveFileFromOffset_SMB1.<locals>.closeFidc                    r  )Nr  r  r  r$  r&  r  rF   r  r  r   r   r  	  r  z3SMB._retrieveFileFromOffset_SMB1.<locals>.connectCBr  r   r  r/   r   r0  r,   r'   r  rD   r  r  rL   r  r3   rz  r{  r+   r  )rF   r  r  r  r   r$  r  rr  r  r  r  r  r!  r   )r   rA  r$  r  rr  r&  r  r  r  rF   r  r  r  r  r  r  r  r   r|   	  s    $&

(z SMB._retrieveFileFromOffset_SMB1c	           	      C   s    |  |||||dd|||
 d S r  )r   r  r   r   r   r~   	  s    zSMB._storeFile_SMB1c              	      s"  j stdddg fdd	
f	dd fdd			
fd
dfdd
jvr
fdd}ttdj 
f td}	| t
|jtt  |
dj|j< | d S j
  d S )Nr   r  r  c                    sj   t tdrdndttB d d}| |_| t|jtt		   j
|j< | d S )NA   r     r  r  r  r   )r$  r&  r  r  rF   r  r  r   r   r  
  s   

$z/SMB._storeFileFromOffset_SMB1.<locals>.sendOpenc                    s    |  | jjs:r/dd dd dd dd  td
i _| j| jj d S  t	d	f  d S )Nr  r  r  Tr  r:  r  r  r  r   )
r  r   r  r  r   r@   r^   r   r-  r4  rj  )	r$  r&  r  rF   r   r  r  r  r  r   r   r  
  s   z-SMB._storeFileFromOffset_SMB1.<locals>.openCBc                    s   t jd d}|}t|}|dkr?tt|||d}| |_| t|j	t
t  ||| dj|j	< d S jrJj  d _| |  |f d S )Nr  i  r   )r-  rq  r7  )r-  rq  )ry  r:   r!  r   r'   ComWriteAndxRequestr^   rL   r  r3   rz  r{  r+   r@   r  )r^   r-  rq  r"  r7  r  r!  )r   rA  r$  r  rF   r  r#  r   r   r    
  s   

2

z0SMB._storeFileFromOffset_SMB1.<locals>.sendWritec                    s   | j jsjrj|d  | j|d |d  d S jr'j  d _|   | j|d  tdf  d S )Nrq  r-  r$  )r   r  r@   r  r^   r  r  r4  r%  r'  r   r   r#  1
  s   
z.SMB._storeFileFromOffset_SMB1.<locals>.writeCBc                    r  rI   r  rt  r  r   r   rA  ?
  r  z/SMB._storeFileFromOffset_SMB1.<locals>.closeFidc                    r  )Nr*  r  r  r   r   r   r  F
  r  z0SMB._storeFileFromOffset_SMB1.<locals>.connectCBr  r   r  r!  )rF   r  r  r  r   r$  r  r  r  r  r  r  r!  r   )r   rA  r$  r  r&  r  r  rF   r  r   r  r  r  r  r  r  r#  r   r   
  s    

(zSMB._storeFileFromOffset_SMB1c                    s  
j stdt  }d 	dddr dd  dr,d d n$d}|d ddksC|d ddkrPd|d d |d 	g g 	d u r|d}t	|dkru
d|d d |d f n
df  
fd	d
fdd
jvrχ	
fdd}	ttd
j f td}

|
 t|
j||	d
j|
j< 
|
 d S r׈d  d S 
	 d S )Nr   r  r  r   r  r   r/  r   c                    sh   r. d\}}|r"|r|d | }j | d S j|dd d S   d S )Nr   r  r   )r  )r   _deleteFiles_SMB1__delr,   r   r1  r2  r   r   r3  n
  s   z'SMB._deleteFiles_SMB1.<locals>.deleteCBc                    r6  rI   r7  r9  r;  r   r   r<  z
  r=  z%SMB._deleteFiles_SMB1.<locals>.listCBc              	      sd    |  | jjs%| jj	< r d  d S 	
 d S td	f  d S )Nr?  )r  r   r  r^   r,   _deleteFiles_SMB1__listr4  r  rA  r   r   r  
  s   z(SMB._deleteFiles_SMB1.<locals>.connectCBr  r  )r/   r   r{  r0  r  r  rC  rD  rE  r   ri  r,   r'   r  rD   r  r  rL   r  r3   r+   r  r&  rF  r   rH  r   r   U
  s<   


$

"
 
zSMB._deleteFiles_SMB1c                    rI  )Nc              	      rJ  )Nc                 S   rK  rL  rN  rO  r   r   r   rQ  
  rR  z=SMB._deleteFiles_SMB1__list.<locals>.listCB.<locals>.<lambda>r   r  r   r   rS  )rT  rU  ri  r  r   rr   rV  rY  r   r   r<  
  r\  z+SMB._deleteFiles_SMB1__list.<locals>.listCBrS  )r]  r^  r_  r`  ra  r  rr   rb  r   rY  r   r&  
  rc  zSMB._deleteFiles_SMB1__listc                    s<   g fdd} fdd|| d S )Nc                    sX   t tttB d}| |_| t|jtt		   j
|j< | d S )N)filename_patternr  )r'   ComDeleteRequestr^  r_  r^   rL   r  r3   rz  r{  r+   r  r   r3  r$  r&  r  rF   r  r   r   rl  
  s   
$z.SMB._deleteFiles_SMB1__del.<locals>.sendDeletec                    s    |  | jjs  d S | jjdkr  d S | jjdkr/tdf  d S | jjdkrBtdf  d S tdf  d S )Nr  rh  ri  r  z)Failed to delete %s on %s: Path not foundr  )r  r   r  r  r4  rz  r  r   r   r3  
  s   z,SMB._deleteFiles_SMB1__del.<locals>.deleteCBr   )rF   r  r^   r  r   r$  r  rl  r   )r   r3  r$  r&  r  rF   r  r  r   r%  
  s   zSMB._deleteFiles_SMB1__delc                 C   r  )Nz3resetFileAttributes is not yet implemented for SMB1r  )rF   r  r5  r   r$  r  r  r   r   r   r   
  r  zSMB._resetFileAttributes_SMB1c                       j stdddg fdd fddjvrefdd	}ttd
j f td}	| t
|jtt  |dj|j< | d S j  d S )Nr   r  r  c                    P   t t}| |_| t|jtt   j|j< 	| d S rI   )
r'   ComCreateDirectoryRequestr^   rL   r  r3   rz  r{  r+   r  r   rf  r   r   r  
  r  z-SMB._createDirectory_SMB1.<locals>.sendCreatec                    :    |  | jjs  d S tdf  d S )Nr  r  r   r  r4  r  r  r   r   r  
     z+SMB._createDirectory_SMB1.<locals>.createCBc                    r  )Nr  r  r  r  r   r   r  
  r  z,SMB._createDirectory_SMB1.<locals>.connectCBr  r   r  r!  r  r   )	r   r  r$  r&  r  rF   r  r  r  r   r   
     

(zSMB._createDirectory_SMB1c                    r*  )Nr   r  r  c                    r+  rI   )
r'   ComDeleteDirectoryRequestr^   rL   r  r3   rz  r{  r+   r  r   r)  r   r   rl  
  r  z-SMB._deleteDirectory_SMB1.<locals>.sendDeletec                    r-  )Nz2Failed to delete directory %s on %s: Delete failedr.  rz  r  r   r   r3    r/  z+SMB._deleteDirectory_SMB1.<locals>.deleteCBc                    r  )NzGFailed to delete directory %s on %s: Unable to connect to shared devicer  r  r  r   r   r  
  r  z,SMB._deleteDirectory_SMB1.<locals>.connectCBr  r   r  r!  r  r   )	r   r3  r$  r&  r  rF   rl  r  r  r   r   
  r0  zSMB._deleteDirectory_SMB1c           	         s   j stdddddg 	fdd fddjvrmfdd	}ttd
j f td}	| t
|jtt 	 |dj|j< | d S j  d S )Nr   r  r  c                    sZ   t tttB d}| |_| t|jtt		   j
|j< | d S )N)r  r  r  )r'   ComRenameRequestr^  r_  r^   rL   r  r3   rz  r{  r+   r  r   )r$  r&  r  r  r  rF   r  r   r   r  !  s   
$z$SMB._rename_SMB1.<locals>.sendRenamec                    s>    |  | jjs f d S tdf  d S )Nr  r.  r  )r   r$  r&  r  r  rF   r  r   r   r  *  s   z"SMB._rename_SMB1.<locals>.renameCBc                    r  )Nr  r  r  r  r   r   r  2  r  z#SMB._rename_SMB1.<locals>.connectCBr  r   r  r!  r  r   )
r   r$  r&  r  r  r  rF   r  r  r  r   r     s   	

(zSMB._rename_SMB1c           	         s,  j stdt  dddsd7 g g }fdd
	fddfdd		 fd
dfddjvr
fdd}ttdj	 f t
d}| t|j|dj|j< | d S 
j  d S )Nr   r  r  c                    s^   t tdddd d}| |_| t|jtt   j|j< 	| d S )Nr  r   r   r  r  )
r'   r  r^   rL   r  r3   rz  r{  r+   r  r   r  r   r   r  L  s   
$z)SMB._listSnapshots_SMB1.<locals>.sendOpenc                    sB    |  | jjs| j| jj d S  tdf  d S )Nz6Failed to list snapshots %s on %s: Unable to open path)r  r   r  r^   r   r-  r4  rj  r  r   r   r  W  s   z'SMB._listSnapshots_SMB1.<locals>.openCBc                    sf   t dd|dd}ttdddd|d}| |_| t|j | |dj|j< 	| d S )	Nz<IHBBr  r   r   r   r  )functionr  r  r  r  r,  )
r1  r2  r'   ComNTTransactRequestr^   rL   r  r3   r+   r  )r^   r-  r  r!  )r  r$  r%  r&  rF   r   r   r  ^  s    
z2SMB._listSnapshots_SMB1.<locals>.sendEnumSnapshotsc                    s   |  | jjsng }td| jjdd d }td|D ]?}t	| jjd|d  d|d   }|
tttt|dd	 |d
d |dd |dd |dd |dd f  q|d |d   | d S |d |d  tdf  d S )Nr*  rc  rd  r   re  r  r  r  r  r  ro  r  r   r  r  r  r  r  r^   r-  zCFailed to list snapshots %s on %s: Unable to list snapshots on path)r  r   r  r1  rg  r   r7  rh  r   rk  ri  r   r  r  rz  r4  r  )r   rA  r$  r&  r  rF   r  r   r   r  p  s   &Vz0SMB._listSnapshots_SMB1.<locals>.enumSnapshotsCBc                    r  rI   r  rt  r  r   r   rA  ~  r  z)SMB._listSnapshots_SMB1.<locals>.closeFidc                    r  )Nr  r  r  r   r   r   r    r  z*SMB._listSnapshots_SMB1.<locals>.connectCBr  r   r  r  r  r   )r   rA  r  r$  r%  r&  r  r  rF   r  r  r  r  r   rt   A  s(   


zSMB._listSnapshots_SMB1c                    s   g t |tdstdtdjt|jf  fdd}tt|d}| t|jt	t

 | |j|j< | d S )Nr)  zEcho data must be %s not %sc                    s6    |  | jjs | jj d S td d S )Nr  )r  r   r  r   ra   r4  r  r   r$  r&  rF   r   r   r    s   zSMB._echo_SMB1.<locals>.echoCB)	echo_data)
isinstancetype	TypeErrorr   r'   ComEchoRequestrL   r  r3   rz  r{  r+   r  r  r   r5  r   r     s   
$zSMB._echo_SMB1c                 C   s   | dddd S )Nr  r  r  )r0  rC  )rF   r  r   r   r   r    s   zSMB._extractLastPathComponentc                 C   s$   t |dkr|d || d S )Nr  r   )r   r   ri  )rF   r&  r   r   r   r   r    s   
zSMB._pushToArrayN)r   )Fr   r   r   r   r   	getLoggerrB   r   r   SIGN_WHEN_REQUIREDr!   propertyrG   rN   rQ   rd   re   rf   rA   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@  r0  r  r   r   r   r   r   r   rm   r  rh   ri   rn   rk   rp   rr   rx   rv   rz   r|   r~   r   r   r&  r%  r   r   r   r   rt   r   r  r  r   r   r   r   r   $   s    
4
	&c	
7 
< 

L
Q 

p
?
H
[
D
Y
a
[_6
 
0 
U
=k
T
?


%
%
(
Sr   c                   @   sT   e Zd ZdZdZdZdZdZdd Ze	dd	 Z
e	d
d Ze	dd Zdd ZdS )rj  a  
    Contains information about a single shared device on the remote server.

    The following attributes are available:

    * name : An unicode string containing the name of the shared device
    * comments : An unicode string containing the user description of the shared device
    r   r   r   rV  c                 C   s   || _ || _|| _d S rI   )_typerl  rm  )rF   r8  rl  rm  r   r   r   r!     s   
zSharedDevice.__init__c                 C   s
   | j d@ S )z
        Returns one of the following integral constants.
         - SharedDevice.DISK_TREE
         - SharedDevice.PRINT_QUEUE
         - SharedDevice.COMM_DEVICE
         - SharedDevice.IPC
        r  )r>  rK   r   r   r   r8    s   
	zSharedDevice.typec                 C      t | jd@ S )a   
        Returns True if this shared device is a special share reserved for interprocess communication (IPC$)
        or remote administration of the server (ADMIN$). Can also refer to administrative shares such as
        C$, D$, E$, and so forth
        l        r  r>  rK   r   r   r   	isSpecial  s   zSharedDevice.isSpecialc                 C   r?  )z
        Returns True if this is a temporary share that is not persisted for creation each time the file server initializes.
        i   @r@  rK   r   r   r   isTemporary  s   zSharedDevice.isTemporaryc                 C      d| j | j| jf S )Nz+Shared device: %s (type:0x%02x comments:%s))rl  r8  rm  rK   r   r   r   __unicode__  rO   zSharedDevice.__unicode__N)r   r   r   r   	DISK_TREEPRINT_QUEUECOMM_DEVICEIPCr!   r=  r8  rA  rB  rD  r   r   r   r   rj    s    



rj  c                   @   sF   e Zd ZdZdddZedd Zedd Zed	d
 Zdd Z	dS )r  a  
    Contain information about a file/folder entry that is shared on the shared device.

    As an application developer, you should not need to instantiate a *SharedFile* instance directly in your application.
    These *SharedFile* instances are usually returned via a call to *listPath* method in :doc:`smb.SMBProtocol.SMBProtocolFactory<smb_SMBProtocolFactory>`.

    If you encounter *SharedFile* instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond
    to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains
    one of these prohibited characters: "\/[]:+|<>=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).

    The following attributes are available:

    * create_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
    * last_access_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
    * last_write_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
    * last_attr_change_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
    * file_size : File size in number of bytes
    * alloc_size : Total number of bytes allocated to store this file
    * file_attributes : A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
    * short_name : Unicode string containing the short name of this file (usually in 8.3 notation)
    * filename : Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
    * file_id : Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
    Nc                 C   s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S rI   )
r  r  r  r  r  r  r  r  r  r  )rF   r  r  r  r  r  r  r  r  r  r  r   r   r   r!     s   
zSharedFile.__init__c                 C      t | jt@ S )z_A convenience property to return True if this file resource is a directory on the remote server)r  r  ATTR_DIRECTORYrK   r   r   r   rU       zSharedFile.isDirectoryc                 C   rI  )z\A convenient property to return True if this file resource is read-only on the remote server)r  r  ATTR_READONLYrK   r   r   r   
isReadOnly  rK  zSharedFile.isReadOnlyc                 C   s   | j tkp| j d@ dkS )a@  
        A convenient property to return True if this is a normal file.

        Note that pysmb defines a normal file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
        It ignores other attributes like compression, indexed, sparse, temporary and encryption.
        r  r   )r  r  rK   r   r   r   isNormal  s   zSharedFile.isNormalc                 C   rC  )Nz3Shared file: %s (FileSize:%d bytes, isDirectory:%s))r  r  rU  rK   r   r   r   rD    rO   zSharedFile.__unicode__rI   )
r   r   r   r   r!   r=  rU  rM  rN  rD  r   r   r   r   r    s    



	r  c                   @   s   e Zd Zdd ZdS )r  c                 K   s"   || _ || _|| _|| _|| _d S rI   )r3   r%  r   r$  r   )rF   r3   r%  r   r$  r   r   r   r   r!   "  s
   
z_PendingRequest.__init__N)r   r   r   r!   r   r   r   r   r     s    r  ) r   r   r{  r   r   r   smb_constantssmb2_constantssmb_structssmb2_structssecurity_descriptorsr   nmb.baser   utilsr   r   r	   r
   strategyr   hashlibr   ImportError	Exceptionr   r   r   r   rj  r  r  r   r   r   r   <module>   s`    
                       !5=