o
    jjU                     @   s   d dl mZmZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlT d dlmZ d dlmZ d d	lmZ d dlT d d
lmZ d dlmZ G dd dZddefddZddefddZddefddZdd Zedkr{d dlZee  dS dS )    )DictListN)asynccontextmanager)PureWindowsPath)SMBFile)*)FileAttributes)FileInfoClass)SecurityInfo)SMBConnection)	SMBTargetc                   @   sH  e Zd Zdd ZedefddZedefddZed	e	d
efddZ
ed	e	d
efddZed	e	d
efddZdd Zd6defddZd6defddZd	e	fddZd	e	fddZdd Zded	e	fd d!Zdefd"d#Zd$d%ddg d%fd	e	d&ed'ed(ed)ed*ee fd+d,Zd7d.d/Zd	e	fd0d1Zd	e	fd2d3Zd4d5 Zd%S )8SMBDirectoryc                 C   s^   d | _ d | _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _i | _i | _d S N)tree_idfullpathunc_path
parent_dirnamecreation_timelast_access_timelast_write_timechange_timeallocation_size
attributesfile_idsecurity_descriptorfilessubdirs)self r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/commons/interfaces/directory.py__init__   s   
zSMBDirectory.__init__r   c                 C   s6   t | }t }|j|_d|jdd |_| |_|S )zh
		Creates SMBFile object from the UNC path supplied.
		Example uncpath: \\127.0.0.1\C$\temp\test.exe
		\   N)r   r   drive
share_pathjoinpartsr   r   )r   uncfr   r   r    from_uncpath&   s   zSMBDirectory.from_uncpathtargetc                 C   s:   | j du rdS | j dd}d}||  |f }t|S )z8
		Creates SMBDirectory object from the SMBUrl object
		N/r"   \\%s%s)pathreplaceget_hostname_or_ipr   r*   )r+   fpathtempr(   r   r   r    from_smbtarget4   s   

zSMBDirectory.from_smbtarget
connection
remotepathc                 C   s0   d}|d dkr
d}|| j  |f }t|S )zv
		Creates SMBFile object from the connection and the remote path supplied.
		Example remotepath: \C$\temp\test.exe
		z\\%s\%sr   r"   r-   )r+   r0   r   r*   )r4   r5   r2   r(   r   r   r    from_remotepathA   s
   
zSMBDirectory.from_remotepathc              
      s   z^t |}| |jI dH \}}|dur||j}tjtjB }tj	}t
jt
jB }tj}	d}
| j||j||||	|
ddI dH \}}|durH||durU| ||I dH  | |I dH  W dS  tyu } z
d|fW  Y d}~S d}~ww )z*
		Deletes a directory at a given path.
		Nr   Freturn_replyTN)r   r*   tree_connectr%   r   FileAccessMaskDELETEFILE_READ_ATTRIBUTESShareAccessFILE_SHARE_DELETECreateOptionsFILE_DIRECTORY_FILEFILE_DELETE_ON_CLOSECreateDisposition	FILE_OPENcreater   closetree_disconnect	Exceptionr4   r5   remfile
tree_entryerrr   desired_access
share_modecreate_optionscreate_disposition
file_attrsr   er   r   r    
delete_uncM   s.   
&zSMBDirectory.delete_uncc              
      s$  zzt | |}| |jI d H \}}|d ur||j}tjtjB tjB tj	B tj
B tjB tjB tjB tjB }tjtjB tjB }tjtjB }tj}	d}
| j||j||||	|
ddI d H \}}|d urd||d urq| ||I d H  | |I d H  W dS  ty } z
d|fW  Y d }~S d }~ww )Nr   Fr7   r9   )r   r6   r:   r%   r   r;   FILE_READ_DATAFILE_WRITE_DATAFILE_READ_EAFILE_WRITE_EAr=   FILE_WRITE_ATTRIBUTESREAD_CONTROLr<   SYNCHRONIZEr>   FILE_SHARE_READFILE_SHARE_WRITEr?   r@   rA   FILE_SYNCHRONOUS_IO_NONALERTrC   FILE_CREATErE   r   rF   rG   rH   rI   r   r   r    create_remotek   s.   6&zSMBDirectory.create_remotec                 C   s   t | j}|jS r   )r   r   r$   )r   r(   r   r   r    get_share_path   s   
zSMBDirectory.get_share_pathFr   c                 C   :   g }| j  D ]}|du r||j q||j q|S )zD
		Returns a list of paths of all subdirectories in the directory
		T)r   valuesappendr   r   r   r   pathsr)   r   r   r    get_subdir_paths      zSMBDirectory.get_subdir_pathsc                 C   ra   )z;
		Returns a list of paths of all files in the directory
		T)r   rb   rc   r   r   rd   r   r   r    get_file_paths   rg   zSMBDirectory.get_file_pathsc              
      sf   z| j d ur|| j| j I d H  t|| jI d H W S  ty2 } z
d|fW  Y d }~S d }~ww NF)r   rF   r   r   rS   r   rH   )r   r4   rR   r   r   r    delete   s   
zSMBDirectory.deletec              
      s  | j d u rd }zzi| j}| jd u r&|| jI d H \}}|d ur#||j}tj}tj}tj	tj
B }d}	tj}
||| j||||
|	I d H \}}|d urN||j||tjtjtjtjB tjB tjB ddI d H \| _ }|d urq|W n7 ty } z+d |fW  Y d }~W |d ur|||I d H  |d ur| jd u r||I d H  S S S d }~ww W |d ur|||I d H  |d ur| jd u r||I d H  n!|d ur|||I d H  |d ur| jd u r||I d H  w w w | j d fS )Nr   )	info_typeinformation_classadditional_informationflags)r   r   r:   r%   r;   rY   r>   r[   r@   rA   r]   rC   rD   rE   r   
query_infoQueryInfoTypeSECURITYr	   NONEr
   ATTRIBUTE_SECURITY_INFORMATIONDACL_SECURITY_INFORMATIONOWNER_SECURITY_INFORMATIONGROUP_SECURITY_INFORMATIONrH   rF   rG   )r   r4   r   r   rK   rL   rM   rN   rO   rQ   rP   rR   r   r   r    get_security_descriptor   sd   

"
z$SMBDirectory.get_security_descriptorc                 C   st   g }| j D ]}| j | }dd|j|j|jf }|| q| jD ]}| j| }dd|j|j|jf }|| q |S )Nz%s	%s	%s	%sz
drw-rw-rw-z
 rw-rw-rw-)r   r   r   r   rc   r   )r   linesr   	directoryentryr   r   r    get_console_output   s   



zSMBDirectory.get_console_outputdir_namec           	   
      s  zd}| j sd}||  I d H \}}|d ur||j | _ d }|}| jdkr/d| j|f }z^|| j |tjtjB tjB tj	B tj
B tjB tjB tjB tjB tjtjB tjB tjtjB tjdI d H \}}|d url|W |d ur{|| j |I d H  |du r|| j I d H  W dS W dS |d ur|| j |I d H  |du r|| j I d H  w w  ty } z
d|fW  Y d }~S d }~ww )NFT %s\%sr   r9   )r   r:   r`   r   rE   r;   rT   rU   rV   rW   r=   rX   rY   r<   rZ   r>   r[   r\   r?   r@   rA   r]   rC   r^   rF   rG   rH   )	r   r|   r4   should_closerK   rL   r   newpathrR   r   r   r    create_subdir   sP   
4
	zSMBDirectory.create_subdirc                    s
   t d)Nzdelete subdir not implemented!)rH   )r   r|   r   r   r    delete_subdir  s   zSMBDirectory.delete_subdir   Ndepth
maxentriesfetch_dir_sdfetch_file_sdexclude_dirc              
   C  s  |dkrdS |d8 }d}z|  |2 z3 dH W \}	}
}tdI dH  |
dkr?|du r?|	j|vr?| j|	_|	|I dH \}}|
dkrU|du rU| j|	_|	|I dH \}}|	|
|fV  |d7 }|durg W dS ||kru| ddfV   W dS |
dkr|	j|vr|dur|d|	I dH }|du rq| j|	_|	j|||||||d	2 z3 dH W \}}}|||fV  q6 q6 W dS  ty } zdd|fV  W Y d}~dS d}~ww )
zn
		recursive list files and folders
		Beware this will clear out the lists of files/folders to save memory!
		r   Nr#   dirTfilemaxedF)r   r   r   r   	filter_cb)list_genasynciosleepr   r   rw   list_rrH   )r   r4   r   r   r   r   r   r   ctrobjotyperL   _resrR   tr   r   r    r   	  sX   (zSMBDirectory.list_rr"   c           
   
      s|  zzd}| j du r#d}||  I dH \}}|dur||j | _ | j}t| || j dtjtjB t	j
tjtjB tjdI dH \}}|durK||j| j |tjtjddI dH \}}|durd|fW W |durt|| j |I dH  |du r|| j I dH  S S t|j|jk r|j| j |tjtj|jd dI dH \}}|durd|fW W |dur|| j |I dH  |du r|| j I dH  S S |jdfW W |dur|| j |I dH  |du r|| j I dH  S S  ty }	 z)d|	fW  Y d}	~	W |dur
|| j |I dH  |du r|| j I dH  S S d}	~	ww |dur.|| j |I dH  |du r=|| j I dH  w w )	z&
		Lists all snapshots of the share
		FNTr}   r      )rn   MaxOutputResponse   )r   r:   r`   r   printrE   r;   rY   rT   r>   r[   r@   rA   r]   rC   rD   ioctlCtlCodeFSCTL_SRV_ENUMERATE_SNAPSHOTSIOCTLREQFlagsIS_FSCTLrF   rG   len	SnapShotsNumberOfSnapShotsSnapShotArraySizerH   )
r   r4   r.   r   rK   rL   r1   r   	snapshotsrR   r   r   r    r   ?  sf   
6$
*




zSMBDirectory.snapshotsc              
   C  s  i | _ i | _tj}tj}tjtjB }d}t	j
}| js7||  I dH \}}|dur3| d|fV  dS |j| _|| j| j|||||I dH \}	}|durU| d|fV  dS zz	 tdI dH  || j|	I dH \}
}|durs||
svn|
D ]}|jtj@ r|j}|jdv rqxt }| j|_| jdkrd| j|jf |_n|j|_d| j|jf |_| |_|j|_|j|_|j|_|j|_|j |_!|j"|_#|j|_$|ddfV  qxt% }| j|_d|_| jdkrd| j|jf |_d| j|jf |_n|j|_d| j|jf |_|j|_|j&|_'|j|_|j|_|j|_|j |_!|j"|_#|j|_$|ddfV  qxqYW n, t(yV } z| d|fV  W Y d}~W |	durP|)| j|	I dH  dS dS d}~ww W |	duri|)| j|	I dH  dS dS |	dur{|)| j|	I dH  w w )	z
		Lists all files and folders in the directory, yields the results as they arrive
		directory: SMBDirectory
		DOESN'T fill the SMBDirectory's data
		r   Nr   T.z..r}   r~   r   )*r   r   r;   rT   r>   r[   r@   rA   r]   rC   rD   r   r:   r`   rE   r   r   r   query_directoryr   FILE_ATTRIBUTE_DIRECTORYFileNamer   r   r   r   CreationTimer   LastAccessTimer   LastWriteTimer   
ChangeTimer   AllocationSizer   r   r   	EndOfFilesizerH   rF   r   r4   rM   rN   rO   rQ   rP   rK   rL   r   	fileinfosinfodirnamesubdirr   rR   r   r   r    r   d  s   $


,

0zSMBDirectory.list_genc              
      s  i | _ i | _tj}tj}tjtjB }d}t	j
}| js1||  I dH \}}|dur-||j| _|| j| j|||||I dH \}	}|durKd|fS zz	 || j|	I dH \}
}|dura||
sdn|
D ]}|jtj@ r|j}|jdv rwqft }| j|_| jdkrd| j|jf |_n|j|_d| j|jf |_| |_|j|_|j|_|j|_|j|_|j|_|j |_!|j|_"|| j|j< qft# }| j|_d|_| jdkrd| j|jf |_d| j|jf |_n|j|_d| j|jf |_|j|_|j$|_%|j|_|j|_|j|_|j|_|j |_!|j|_"|| j |j< qfqOW W |	dur*|&| j|	I dH  dS dS  t'yS } zd|fW  Y d}~W |	durN|&| j|	I dH  S S d}~ww |	durd|&| j|	I dH  w w )	zl
		Lists all files and folders in the directory
		directory: SMBDirectory
		fills the SMBDirectory's data
		r   NFTr   r}   r~   r9   )(r   r   r;   rT   r>   r[   r@   rA   r]   rC   rD   r   r:   r`   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rF   rH   r   r   r   r    list  s   $


1


zSMBDirectory.listc                 C   s   d}| j D ]J}|drqt| j | tr&| j | D ]
}|d||f 7 }qqt| j | trD| j | D ]}|d|| j | | f 7 }q3q|d|| j | f 7 }q|S )Nz===== DIRECTORY ===== 
parent_z	%s : %s
)__dict__
startswith
isinstancer   dict)r   r   kitemksr   r   r    __str__  s   

zSMBDirectory.__str__)F)r"   )__name__
__module____qualname__r!   staticmethodstrr*   r   r3   r   r6   rS   r_   r`   boolrf   rh   rj   rw   r{   r   r   intr   r   r   r   r   r   r   r   r   r    r      s2    	+$4
6%URr   r.   c              	      s$  |   drxddlm} || }|du r`| }|4 I dH 2 | I dH \}}|dur1|| }|||j	I dH \}}|durG|	 W d  I dH  dS 1 I dH sYw   Y  dS | }|||j	I dH \}}|durv|dS t
|| }|||j	I dH \}}|dur|dS )z5
	Creates a new directory on the remote SMB server.
	smbr   SMBConnectionFactoryN)lowerr   !aiosmb.commons.connection.factoryr   from_urlget_connectionloginget_directoryr_   r   r   r6   r.   r4   r   factoryr   rL   smbdirr   r   r    	smb_mkdir  s4   
0
r   c              	      s  |   drtddlm} || }|du r^| }|4 I dH 0 | I dH \}}|dur1|| }||I dH \}}|durE|	 W d  I dH  dS 1 I dH sWw   Y  dS | }||I dH \}}|durr|dS t	
|| }||I dH \}}|dur|dS )z+
	Removes a directory from the SMB server
	r   r   r   N)r   r   r   r   r   r   r   r   rj   r   r6   r   r   r   r    	smb_rmdir:  s4   
0
r   Fc           
   	     s   dt f fdd |  drYddlm} || }|du rT| }|4 I dH  | I dH \}}|dur:|| }W d  I dH  n1 I dH sNw   Y  n| }nt 	|| } |||2 z3 dH W \}}}	|||	fV  qe6 dS )zJ
	Enumerates files and subdirectories of a directory from the SMB server
	r   c                   sr   |  |I d H \}}|d u r5| | || |fV  | jD ]} | j| ||2 z	3 d H W }|V  q)6 qd S d S r   )r   rf   rh   r   )r   r4   r   r   rL   r   x_walkr   r    r   \  s   
zsmb_walk.<locals>._walkr   r   r   N)
r   r   r   r   r   r   r   r   r   r6   )
r.   r4   r   r   r   r   rL   r   r   r   r   r   r    smb_walkX  s&   	

(
r   c                     s   d} ddl m} ||  }| I d H \}}|d ur|t| |dd2 z3 d H W \}}}t|j t| t| td q&6 d S )Nz@smb2+ntlm-password://TEST\Administrator:Passw0rd!1@10.10.10.2/C$r   r   T)r   r}   )r   r   r   r   r   r   r   r   )urlr   r4   r   rL   r   r   r   r   r   r    amainx  s    

r   __main__r   ri   )typingr   r   r   datetime
contextlibr   pathlibr   aiosmb.commons.interfaces.filer   aiosmb.wintypes.access_mask#aiosmb.wintypes.fscc.FileAttributesr   -aiosmb.wintypes.fscc.structures.fileinfoclassr	   (aiosmb.protocol.smb2.commands.query_infor
   aiosmb.protocol.smb2.commandsaiosmb.connectionr    aiosmb.commons.connection.targetr   r   r   r   r   r   r   r   runr   r   r   r    <module>   s4         