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 rëd }zÁzi| 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‚  �z©d}| 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 z�3 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 r�q| j|	_|	j|||||||d	�2 z3 dH W \}}}|||fV  qŸ6 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zåd}| 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rƒd|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rÆd|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 r‰qxtƒ }| j|_| jdkrŸd| 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rôd| 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r�d| j|jf |_n|j|_d| j|jf |_| |_|j|_|j|_|j|_|j|_|j|_|j |_!|j|_"|| j|j< qft#ƒ }| j|_d|_| jdkrâd| 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         þ