o
    {l~i/  ã                   @   s®   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m	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZ eG d	d
„ d
eeƒƒZG dd„ de	ƒZdS )é    N)Úurljoin)ÚFile)Údeconstructible)ÚClosingContextManager)ÚBaseStorage)Úis_seekable©Úsettingc                       s¤   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zed	d
„ ƒZdd„ Z	d%dd„Z
dd„ Zd&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‡  ZS )'ÚSFTPStoragec                    sr   t ƒ jdi |¤Ž | j| _| j| _| j| _| j| _	| j
| _| j| _| j| _| j| _| j| _| j| _d | _d | _d S )N© )ÚsuperÚ__init__ÚhostÚ_hostÚparamsÚ_paramsÚinteractiveÚ_interactiveÚ	file_modeÚ
_file_modeÚdir_modeÚ	_dir_modeÚuidÚ_uidÚgidÚ_gidÚknown_host_fileÚ_known_host_fileÚ	root_pathÚ
_root_pathÚbase_urlÚ	_base_urlÚ_sshÚ_sftp)ÚselfÚsettings©Ú	__class__r   úd/var/www/newdalilibackend/backend/venv/lib/python3.10/site-packages/storages/backends/sftpstorage.pyr      s   
zSFTPStorage.__init__c                 C   sH   t dƒt di ƒt ddƒt dƒt dƒt dƒt dƒt d	ƒt d
dƒt dƒdœ
S )NÚSFTP_STORAGE_HOSTÚSFTP_STORAGE_PARAMSÚSFTP_STORAGE_INTERACTIVEFÚSFTP_STORAGE_FILE_MODEÚSFTP_STORAGE_DIR_MODEÚSFTP_STORAGE_UIDÚSFTP_STORAGE_GIDÚSFTP_KNOWN_HOST_FILEÚSFTP_STORAGE_ROOTÚ Ú	MEDIA_URL)
r   r   r   r   r   r   r   r   r   r    r   ©r$   r   r   r(   Úget_default_settings)   s   öz SFTPStorage.get_default_settingsc              
   C   sü   t  ¡ | _| jptj tj ddd¡¡}tj |¡r | j 	|¡ | j 
t  ¡ ¡ z| jj| jfi | j¤Ž W n8 t jyn } z+| jr_d| jvr_d| jvrSt ¡ | jd< t ¡ | jd< |  ¡  nt  |¡‚W Y d }~nd }~ww | j ¡ r|| j ¡ | _d S d S )Nú~z.sshÚknown_hostsÚpasswordÚusername)ÚparamikoÚ	SSHClientr"   r   ÚosÚpathÚ
expanduserÚjoinÚexistsÚload_host_keysÚset_missing_host_key_policyÚAutoAddPolicyÚconnectr   r   ÚAuthenticationExceptionr   ÚgetpassÚgetuserÚ_connectÚget_transportÚ	open_sftpr#   )r$   r   Úer   r   r(   rH   7   s,   
ÿ


þ€ø
ÿzSFTPStorage._connectc                 C   s   | j d u rd S | j  ¡  d S ©N)r"   Úcloser4   r   r   r(   rM   U   s   
zSFTPStorage.closec                 C   s"   | j r
| j ¡  ¡ s|  ¡  | j S )zLazy SFTP connection)r#   r"   rI   Ú	is_activerH   r4   r   r   r(   ÚsftpZ   s   zSFTPStorage.sftpc                 C   s   t  | j|¡S rL   )Ú	posixpathr?   r   ©r$   Únamer   r   r(   Ú_remote_patha   s   zSFTPStorage._remote_pathÚrbc                 C   s   t || |ƒS rL   )ÚSFTPStorageFile)r$   rR   Úmoder   r   r(   Ú_opend   s   zSFTPStorage._openc                 C   s   |   |¡}| j |d¡S )NrT   )rS   rO   Úopen©r$   rR   Úremote_pathr   r   r(   Ú_readg   ó   
zSFTPStorage._readNc                 C   sD   |du s|du r| j  |¡}|p|j}|p|j}| j  |||¡ dS )z$Set uid and/or gid for file at path.N)rO   ÚstatÚst_uidÚst_gidÚchown)r$   r=   r   r   Úattrr   r   r(   Ú_chownk   s
   

zSFTPStorage._chownc                 C   sl   t  |¡}|  |¡s|  |¡ | j |¡ | jdur"| j || j¡ | js(| j	r4| j
|| j| j	d dS dS )zJCreate directory, recursing up to create parent dirs if
        necessary.N©r   r   )rP   Údirnamer@   Ú_mkdirrO   Úmkdirr   Úchmodr   r   rb   )r$   r=   Úparentr   r   r(   re   u   s   



ÿzSFTPStorage._mkdirc                 C   sŠ   t |ƒr| dtj¡ |  |¡}t |¡}|  |¡s|  |¡ | j	 
||¡ | jdur3| j	 || j¡ | js9| jrC| j|| j| jd |S )zSave file via SFTP.r   Nrc   )r   Úseekr<   ÚSEEK_SETrS   rP   rd   r@   re   rO   Úputfor   rg   r   r   rb   )r$   rR   Úcontentr=   rd   r   r   r(   Ú_saveƒ   s   




zSFTPStorage._savec                 C   s.   z| j  |  |¡¡ W d S  ty   Y d S w rL   )rO   ÚremoverS   ÚOSErrorrQ   r   r   r(   Údelete•   s
   ÿzSFTPStorage.deletec                 C   s.   z| j  |  |¡¡ W dS  ty   Y dS w )NTF)rO   r]   rS   ÚFileNotFoundErrorrQ   r   r   r(   r@   ›   s   ÿzSFTPStorage.existsc                 C   s    |j d urt |j ¡tjkS dS ©NF)Úst_moder]   ÚS_IFMTÚS_IFDIR)r$   Úitemr   r   r(   Ú_isdir_attr¢   s   
zSFTPStorage._isdir_attrc                 C   sR   |   |¡}g g }}| j |¡D ]}|  |¡r| |j¡ q| |j¡ q||fS rL   )rS   rO   Úlistdir_attrrw   ÚappendÚfilename)r$   r=   rZ   ÚdirsÚfilesrv   r   r   r(   Úlistdir©   s   


zSFTPStorage.listdirc                 C   s   |   |¡}| j |¡jS rL   )rS   rO   r]   Úst_sizerY   r   r   r(   Úsize³   r\   zSFTPStorage.sizec                 C   s&   | j d u r	tdƒ‚t| j |ƒ dd¡S )Nz&This file is not accessible via a URL.ú\ú/)r!   Ú
ValueErrorr   ÚreplacerQ   r   r   r(   Úurl·   s   
zSFTPStorage.url)rT   )NN)Ú__name__Ú
__module__Ú__qualname__r   r5   rH   rM   ÚpropertyrO   rS   rW   r[   rb   re   rm   rp   r@   rw   r}   r   r„   Ú__classcell__r   r   r&   r(   r
      s&    




r
   c                   @   sD   e Zd Zdd„ Zedd„ ƒZddd„Zdd	„ Zdd
d„Zdd„ Z	dS )rU   c                 C   s,   || _ || _t ¡ | _|| _d| _d| _d S rr   )rR   rV   ÚioÚBytesIOÚfileÚ_storageÚ_is_readÚ	_is_dirty)r$   rR   ÚstoragerV   r   r   r(   r   ¾   s   

zSFTPStorageFile.__init__c                 C   s    t | dƒs| j | j¡| _| jS )NÚ_size)Úhasattrr   r   rR   r‘   r4   r   r   r(   r   Æ   s   
zSFTPStorageFile.sizeNc                 C   s(   | j s| j | j¡| _d| _ | j |¡S )NT)rŽ   r   r[   rR   rŒ   Úread)r$   Ú	num_bytesr   r   r(   r“   Ì   s   zSFTPStorageFile.readc                 C   s.   d| j vr	tdƒ‚t |¡| _d| _d| _d S )NÚwz%File was opened for read-only access.T)rV   ÚAttributeErrorrŠ   r‹   rŒ   r   rŽ   )r$   rl   r   r   r(   ÚwriteÓ   s
   

zSFTPStorageFile.writec                 C   sL   | j s
|  d¡ d S | jr"| j | j¡r"| j | j|p| j¡| _d S tdƒ‚)Nr   zThe file cannot be reopened.)	Úclosedri   rR   r   r@   rW   rV   rŒ   r‚   )r$   rV   r   r   r(   rX   Ú   s
   zSFTPStorageFile.openc                 C   s$   | j r| j | j| ¡ | j ¡  d S rL   )r   r   rm   rR   rŒ   rM   r4   r   r   r(   rM   â   s   zSFTPStorageFile.closerL   )
r…   r†   r‡   r   rˆ   r   r“   r—   rX   rM   r   r   r   r(   rU   ½   s    


rU   )rF   rŠ   r<   rP   r]   Úurllib.parser   r:   Údjango.core.files.baser   Údjango.utils.deconstructr   Úparamiko.utilr   Ústorages.baser   Ústorages.utilsr   r	   r
   rU   r   r   r   r(   Ú<module>   s"    %