o
    Žõ±j‘  ã                   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dl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mZ dd„ Zd$d
d„ZG dd„ dƒZG dd„ dƒZG dd„ dƒZd%dee dededededepmededefdd„Zdd „ Zd!d"„ Zed#kr‡eƒ  dS dS )&é    N)Úlogger)ÚPureWindowsPath)ÚList)ÚSMBConnectionFactory)ÚSMBFilec                 C   s¼   i dd“dd“dd“dd“dd“d	d
“dd
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“}t  d|  ¡ t j¡}|sHtd| › �ƒ‚| ¡ \}}t|ƒ}| ¡ }t|||  ƒS )NÚBé   ÚKé   ÚKBÚMé   ÚMBÚGi   @ÚGBÚTl        ÚTBÚPl           ÚPBÚEl            ÚEBÚZl            ÚZBÚYl               ÚYBz#^\s*([\d\.]+)\s*([KMGTPEZY]?B?)\s*$zInvalid size format: )	ÚreÚmatchÚstripÚ
IGNORECASEÚ
ValueErrorÚgroupsÚfloatÚupperÚint)Úsize_strÚunitsr   ÚnumberÚunit© r(   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/examples/smbdownloader.pyÚconvert_size   sT   ÿþýüûúùø	÷
öõôóòñðïr*   éÿ   c                 C   sN   |   dd¡  dd¡}t dd|¡}t dd|¡}t|ƒ|kr%|| d … }|S )Nú\Ú_ú/z[<>:"/\\|?*]z\s+)Úreplacer   ÚsubÚlen)Úunc_pathÚ
max_lengthÚfilenamer(   r(   r)   Úflatten_unc_path_to_filename4   s   r5   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚFileTargetGenc                 C   ó
   || _ d S ©N)r4   )Úselfr4   r(   r(   r)   Ú__init__F   ó   
zFileTargetGen.__init__c              
   Ã   sº   �zEd}t | jdƒ�0}|D ]%}| ¡ }|dkrq| tt ¡ ƒ|f¡I d H  t d¡I d H  |d7 }qW d   ƒ n1 s=w   Y  |d fW S  t	y\ } z
||fW  Y d }~S d }~ww )Nr   ÚrÚ r   )
Úopenr4   r   ÚputÚstrÚuuidÚuuid4ÚasyncioÚsleepÚ	Exception)r:   Útarget_qÚcntÚfÚlineÚer(   r(   r)   ÚrunI   s$   €
úÿ
€ÿzFileTargetGen.runN©Ú__name__Ú
__module__Ú__qualname__r;   rL   r(   r(   r(   r)   r7   E   ó    r7   c                   @   r6   )ÚListTargetGenc                 C   r8   r9   )Útargets)r:   rS   r(   r(   r)   r;   Y   r<   zListTargetGen.__init__c              
   Ã   s†   �z+d}| j D ] }|d7 }| ¡ }| tt ¡ ƒ|f¡I d H  t d¡I d H  q|d fW S  tyB } z
||fW  Y d }~S d }~ww )Nr   r   )	rS   r   r@   rA   rB   rC   rD   rE   rF   )r:   rG   rH   ÚtargetrK   r(   r(   r)   rL   \   s   €

€ÿzListTargetGen.runNrM   r(   r(   r(   r)   rR   X   rQ   rR   c                   @   s4   e Zd Zddd„Zdefdd„Zd	d
„ Zdd„ ZdS )ÚSMBDownloaderFTr   c                 C   sb   t  |¡| _g | _i | _d | _d| _dtj ¡  	d¡ | _
d | _|| _|| _|| _|| _|| _d S )Nr   zsmbget_errors_%s.txtz%Y%m%d_%H%M%S)r   Úfrom_urlÚsmb_mgrÚtarget_gensÚ_SMBDownloader__skip_targetsÚtask_qÚ_SMBDownloader__total_targetsÚdatetimeÚnowÚstrftimeÚ_SMBDownloader__error_filenameÚtarget_gen_taskÚshow_progressÚ
flat_namesÚ	max_fsizeÚstore_errorsÚsilent)r:   Úsmb_urlra   rb   rc   rd   re   r(   r(   r)   r;   k   s   
zSMBDownloader.__init__Úexcc                 C   s†   d|t |ƒf }|d t |j¡¡7 }| jdu r#| jdu r!t|ƒ d S t| j	dƒ�}| 
|d ¡ W d   ƒ d S 1 s<w   Y  d S )NzTarget: %s
Error: %s
r>   FÚaz
)rA   ÚjoinÚ	tracebackÚ	format_tbÚ__traceback__rd   re   Úprintr?   r_   Úwrite)r:   Útarget_addressrT   rg   ÚerrorstrrI   r(   r(   r)   Ú__write_errory   s   

"ÿzSMBDownloader.__write_errorc                 Ã   s\   �| j D ]'}| | j¡I d H \}}|  j|7  _|d ur"td| ƒ | j d ¡I d H  qd S )NzTarget gen error! %s)rX   rL   rZ   r[   rm   r@   )r:   Ú
target_genÚtotalÚerrr(   r(   r)   Ú__target_gen†   s   €
ûzSMBDownloader.__target_genc              
   Ã   s†  ��z)t  ¡ | _t  |  ¡ ¡| _	 | j ¡ I d H }|d u r W dS |\}}t|ƒj}| j	du r6t
d||f ƒ}| dd¡ d¡d }|| jv rGq| j |¡}|4 I d H šÌ | ¡ I d H \}}|d urm|| j|< |  |||¡ t |¡}	|	 |d¡I d H \}}|d ur“|  |||¡ 	 W d   ƒI d H  q|	j| jkr¯| jd	u r¤td
| ƒ 	 W d   ƒI d H  q| jdu rÂtjd| |	jdddd�}
n| jd	u rÍtd| ƒ t|dƒ�:}|	 ¡ 2 z,3 d H W \}}|d urë|  |||¡ q×|d u rñ n| |¡ | jdu �r|
 t|ƒ¡ q×6 W d   ƒ n	1 �sw   Y  W d   ƒI d H  n1 I d H �s&w   Y  q t�yB } z
d	|fW  Y d }~S d }~ww )NT)TNz%s_%sz\\r>   r,   r   r=   FzFile %s is too large, skipping!zDownloading %sr   r
   )Údescrs   r'   Ú
unit_scaleÚunit_divisorÚwb) rD   ÚQueuerZ   Úcreate_taskÚ_SMBDownloader__target_genr`   Úgetr   Únamerb   r5   r/   ÚsplitrY   rW   Úcreate_connection_newtargetÚloginÚ_SMBDownloader__write_errorr   Úfrom_uncpathr?   Úsizerc   re   rm   ra   ÚtqdmÚread_chunkedrn   Úupdater1   rF   )r:   ÚtÚtidrT   Ú	file_namero   Ú
connectionr-   rt   ÚsmbfileÚpbarrI   ÚdatarK   r(   r(   r)   rL   Ž   sp   €





ö
ñ


€ö€ ÿ*éñ4€ÿzSMBDownloader.runN)FTr   FF)rN   rO   rP   r;   rF   r‚   r|   rL   r(   r(   r(   r)   rU   j   s
    
rU   FTr   rS   Ú
from_stdinÚverbosera   rb   rc   rd   re   c	                 Ã   s  �|dkrt  tj¡ |dkr"t  d¡ t ¡  d¡ tjtjd� t|ƒ}t	| |||||d�}	g }
t
|ƒdkrF|du rF|	j ttjƒ¡ n"|D ]}zt|dƒ}| ¡  |	j t|ƒ¡ W qH   |
 |¡ Y qHt
|
ƒdkrv|	j t|
ƒ¡ t
|	jƒdkrƒtdƒ d S |	 ¡ I d H S )	Nr   é   T)Úlevel)ra   rb   rc   rd   re   r   r=   z#[-] No suitable targets were found!)r   ÚsetLevelÚloggingÚDEBUGrD   Úget_event_loopÚ	set_debugÚbasicConfigr*   rU   r1   rX   ÚappendrR   ÚsysÚstdinr?   Úcloser7   rm   rL   )rf   rS   r�   r�   ra   rb   rc   rd   re   ÚsmbgetÚnotfilerT   rI   r(   r(   r)   ÚsmbdownloaderÊ   s2   €

rŸ   c               
   Ã   s  �dd l } | jdd�}|jddddd� |jdd	d
dd� |jddd
dd� |jdd
dd� |jdd
dd� |jdd
dd� |jdtddd� |jddd� |jdddd � | ¡ }t|j|j|j|j	|j
|j |j|j|jƒ	I d H \}}|d ur„td!| ƒ t d"¡ t d¡ d S )#Nr   zSMB File downloader)Údescriptionz-vz	--verboseÚcount)ÚactionÚdefaultz-sz--stdinÚ
store_truezRead targets from stdin)r¢   Úhelpz-ez--store-errorszStore errors in a filez--silentzDo not show any outputz--no-flat-namesznDo not flatten file names. This will keep the original file name, but will overwrite files with the same name.z
--progresszShow progressz
--max-sizeÚ1Mz;Maximum length of the flattened file name. Default is 1 MB.)Útyper£   r¥   ÚurlzdConnection URL base, target can be set to anything. Example: "smb2+ntlm-password://TEST\victim@test")r¥   rS   Ú*z1UNC paths of file eg. \\HOST\SHARE\file_or_folder)Únargsr¥   z[-] Error! %sr   )ÚargparseÚArgumentParserÚadd_argumentrA   Ú
parse_argsrŸ   r¨   rS   r›   r�   ÚprogressÚno_flat_namesÚmax_sizerd   re   rm   rš   Úexit)r«   ÚparserÚargsr-   rt   r(   r(   r)   Úamainì   s$   €6
rµ   c                   C   s   t  tƒ ¡ d S r9   )rD   rL   rµ   r(   r(   r(   r)   Úmain  s   r¶   Ú__main__)r+   )r   FTr   FF)r”   r…   r\   rj   r   rš   Úaiosmbr   rB   rD   Úpathlibr   Útypingr   Ú!aiosmb.commons.connection.factoryr   Úaiosmb.commons.interfaces.filer   r*   r5   r7   rR   rU   rA   Úboolr#   rŸ   rµ   r¶   rN   r(   r(   r(   r)   Ú<module>   s0   
#4`"
ÿ