HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/utils/__pycache__/smb.cpython-310.pyc
o

�N�g�,�@s�dZddlZddlZddlZddlZddlZddlZddlm	Z	e�
e�ZzOddl
mZddlmZmZmZddlmZmZmZmZmZmZmZmZmZddlmZmZm Z m!Z!m"Z"m#Z#ddl$m%Z%dd	l&m'Z'e�
d
��(ej)�dZ*Wne+ydZ*YnwGd
d�d�Z,d+dd�Z-d,dd�Z.	d-dd�Z/d-dd�Z0	d-dd�Z1	d-dd�Z2						d.dd �Z3	d-d!d"�Z4	d-d#d$�Z5d-d%d&�Z6	d-d'd(�Z7	d-d)d*�Z8dS)/z;
Utility functions for SMB connections

:depends: impacket
�N)�
MissingSmb)�
Connection)�CreateContextName�SMB2CreateContextRequest�#SMB2CreateQueryMaximalAccessRequest)	�CreateDisposition�
CreateOptions�DirectoryAccessMask�FileAttributes�FileInformationClass�FilePipePrinterAccessMask�ImpersonationLevel�Open�ShareAccess)�AccessAllowedAce�
AccessMask�	AclPacket�	SDControl�	SIDPacket�SMB2CreateSDBuffer)�Session)�TreeConnectZsmbprotocolTFc@s`eZdZddd�Zdd�Zdd�Zedd	��Zd
d�Ze	dd
��Z
edd��Ze	ddd��Z
dS)�SMBProto�cCsTt��}t�|dddtj�ddd}||_t|||dd�}t|||dd�|_dS)Nr�T)Zrequire_signingF)Zrequire_encryption)	�uuidZuuid4�socket�getaddrinfo�IPPROTO_TCP�serverrr�session)�selfr�username�password�portZ
connection_id�addr�
connection�r'�B/opt/saltstack/salt/lib/python3.10/site-packages/salt/utils/smb.py�__init__7s
 zSMBProto.__init__cCs|j��|j��dS�N)r&�connectr �r!r'r'r(r+>s
zSMBProto.connectcCs|jj�d�dS)NT)r r&Z
disconnectr,r'r'r(�closeBszSMBProto.closecCs|jjSr*)r r&r,r'r'r(r&EszSMBProto.connectioncCs4|�d�rd|j�d|��}t|j|�}|��|S)N�$z\\�\)�endswithrrr r+)r!�share�treer'r'r(�tree_connectIs

zSMBProto.tree_connectcCs
|�d�S)Nr/)�lstrip)�filer'r'r(�normalize_filenamePs
zSMBProto.normalize_filenamecCs�|�|�}t�}tj|d<t�|d<t�}|�d�t�}tj	|d<||d<t
�}|g|d<t�}|d�t
j�|�|�t�}tj|d<||d<||g}	t||�}
|
�tjtjtjBtjtjtjBtjtj �}|
S)NZbuffer_nameZbuffer_datazS-1-1-0�mask�sidZacesZcontrol)!r6rrZ(SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUESTrrZfrom_stringrrZGENERIC_ALLrrZset_flagrZ
SELF_RELATIVEZset_daclZSMB2_CREATE_SD_BUFFERr�creater
�
Impersonationr�GENERIC_READ�
GENERIC_WRITEr
�FILE_ATTRIBUTE_NORMALr�FILE_SHARE_READ�FILE_SHARE_WRITErZFILE_OVERWRITE_IFr�FILE_NON_DIRECTORY_FILE)�clsr2r5Zmax_reqZeveryone_sidZaceZaclZsec_descZ	sd_bufferZcreate_contexts�	file_openZ	open_infor'r'r(�	open_fileTs>
�






�
�	zSMBProto.open_fileFcCs>t||�}|r|�tjtjtjBtjt	j
t	jBtj
tj�|Sr*)rr9r
r:r	r;r<r
�FILE_ATTRIBUTE_DIRECTORYrr>r?rZFILE_OPEN_IFr�FILE_DIRECTORY_FILE)r2�namer9�dir_openr'r'r(�open_directoryzs


�zSMBProto.open_directoryN)r)F)�__name__�
__module__�__qualname__r)r+r-�propertyr&r3�staticmethodr6�classmethodrCrHr'r'r'r(r6s



%r�rcCst||||�}|��|Sr*)rr+)�hostr"r#Zclient_namer$�connr'r'r(�_get_conn_smbprotocol�srRcCs"trt�d�t||||d�SdS)z
    Get an SMB connection
    zGet connection smbprotocol)r$F)�HAS_SMBPROTOCOL�log�inforR)rPr"r#r$r'r'r(�get_conn�s
rV�C$cCs�|dur
t|||�}|durdS|�|�}|�d�}d}|D]I}	d�|d|��}
|j||
dd�}|jdtjdd	�|jddd	�g}|j	j
�d
d�|D�|j	j|j
�}
t|
�D]\}}||d|�}qV|d7}qdS)NF�/�r/rT)r9�*��sendcS�g|]}|d�qS�rr'��.0�xr'r'r(�
<listcomp>��z'_mkdirs_smbprotocol.<locals>.<listcomp>)rVr3�split�joinrHZquery_directoryrZFILE_NAMES_INFORMATIONr-r r&�
send_compound�
session_id�tree_connect_id�	enumerate)�pathr1rQrPr"r#r2�comps�pos�comp�cwdrGZcompound_messages�requests�i�request�responser'r'r(�_mkdirs_smbprotocol�s0

���
�rscC� trt||||||d�Std���N�rQrPr"r#�.SMB library required (impacket or smbprotocol))rSrsr�rjr1rQrPr"r#r'r'r(�mkdirs��
�ryc	Csf|dur
t|||�}|durdS|�|�}z|�||�}|�tjj�|�d�W|��dS|��w)NFr)	rVr3rC�write�salt�utilsZstringutils�to_bytesr-)	�contentrjr1rQrPr"r#r2rBr'r'r(�_put_str_smbprotocol�s
r�c	C�"tr
t|||||||d�Std��)z�
    Wrapper around impacket.smbconnection.putFile() that allows a string to be
    uploaded, without first writing it as a local file
    rvrw)rSr�r)rrjr1rQrPr"r#r'r'r(�put_str�s�	r��c

Cs�|dur
t|||�}|durdS|�|�}|�||�}	tjj�|d��/}
zd}	|
�|�}|s0n
|	�||�|t	|�7}q(W|	�
d�n|	�
d�wWd�dS1sUwYdS)NF�rbr)rVr3rCr|r}�filesZfopen�readr{�lenr-)
�
local_pathrjr1rQrPr"r#Z
chunk_sizer2rBZfh_�position�chunkr'r'r(�_put_file_smbprotocol�s&


�"�r�c	Cr�)a;
    Wrapper around impacket.smbconnection.putFile() that allows a file to be
    uploaded

    Example usage:

        import salt.utils.smb
        smb_conn = salt.utils.smb.get_conn('10.0.0.45', 'vagrant', 'vagrant')
        salt.utils.smb.put_file('/root/test.pdf', 'temp\myfiles\test1.pdf', conn=smb_conn)
    rvrw)rSr�r)r�rjr1rQrPr"r#r'r'r(�put_files
�	r�c	Cs�|dur
t|||�}|durdS|�|�}t||�}|jtjtjtjBt	j
tjtj
BtjtjtjBdd�|jddd�g}|jjdd�|D�|jj|jdd�}	g}
t|	�D]\}}||d|�}
|
�|
�qTdS)NFr[cSr]r^r'r_r'r'r(rb3rcz,_delete_file_smbprotocol.<locals>.<listcomp>T)�relatedrY)rVr3rr9r
r:rr;�DELETEr
r=rr>r?r�	FILE_OPENrr@�FILE_DELETE_ON_CLOSEr-r&rfr rgrhri�append)rjr1rQrPr"r#r2rB�delete_msgsro�	responsesrprqrrr'r'r(�_delete_file_smbprotocols8




�	���r�cCrtru)rSr�rrxr'r'r(�delete_file?rzr�c
	Cs�|dur
t|||�}|durdSt�d||�|�|�}t||�}|jtjtj	t
jdtj
tjtjBdd�|jddd�g}|jjdd�|D�|jj|jdd�}	t|	�D]\}
}||
d	|�}qRdS)
NFz3_delete_directory_smbprotocol - share: %s, path: %srr[cSr]r^r'r_r'r'r(rb_rcz1_delete_directory_smbprotocol.<locals>.<listcomp>T)r8�tidr�rY)rVrT�debugr3rr9r
r:r	r�r
rDrr�rrEr�r-r&rfr rgrhri)
rjr1rQrPr"r#r2rGr�Zdelete_reqsrprqrrr'r'r(�_delete_directory_smbprotocolGs6


�	���r�cCrtru)rSr�rrxr'r'r(�delete_directoryis
�r�)rOrOrOrOr)rONNr)rWNNNN)rWNNNNr�)9�__doc__�loggingrrZsalt.utils.filesr|Zsalt.utils.stringutilsZsalt.utils.versionsZsalt.exceptionsr�	getLoggerrIrTZsmbprotocol.connectionrZsmbprotocol.create_contextsrrrZsmbprotocol.openrrr	r
rrr
rrZsmbprotocol.security_descriptorrrrrrrZsmbprotocol.sessionrZsmbprotocol.treer�setLevel�WARNINGrS�ImportErrorrrRrVrsryr�r�r�r�r�r�r�r�r'r'r'r(�<module>s^
, �
T

�
	
�
�
�
�
�
"	
�#�