a
    ތxd                     @   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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 eG dd	 d	eZG d
d de
ZdS )    N)datetime)urljoin)File)deconstructible)BaseStoragesettingc                       s   e Zd Z f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d#d$ Zd%d& Z  ZS ))SFTPStoragec                    sl   t  jf i | | j| _| j| _| j| _| j| _	| j
| _| j| _| j| _| j| _| j| _| j| _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_sftp)selfsettings	__class__ U/var/www/html/Ranjet/env/lib/python3.9/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 )NZSFTP_STORAGE_HOSTZSFTP_STORAGE_PARAMSZSFTP_STORAGE_INTERACTIVEFZSFTP_STORAGE_FILE_MODEZSFTP_STORAGE_DIR_MODEZSFTP_STORAGE_UIDZSFTP_STORAGE_GIDZSFTP_KNOWN_HOST_FILEZSFTP_STORAGE_ROOT Z	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 np t jy } zV| jrd| jvrd| jvrt | jd< t | jd< |   n
t |W Y d }~n
d }~0 0 | j r| j | _d S )N~z.sshZknown_hostspasswordusername)paramikoZ	SSHClient_sshr   ospath
expanduserjoinexistsZload_host_keysZset_missing_host_key_policyZAutoAddPolicyconnectr   r   ZAuthenticationExceptionr   getpassgetuser_connectget_transportZ	open_sftpr!   )r"   r   er&   r&   r'   r8   5   s$    


 
zSFTPStorage._connectc                 C   s"   | j r| j  s|   | j S )zLazy SFTP connection)r!   r/   r9   	is_activer8   r)   r&   r&   r'   sftpS   s    zSFTPStorage.sftpc                 C   s   t | j|S r
   )	posixpathr3   r   r"   namer&   r&   r'   _remote_pathZ   s    zSFTPStorage._remote_pathrbc                 C   s   t || |S r
   )SFTPStorageFile)r"   r?   moder&   r&   r'   _open]   s    zSFTPStorage._openc                 C   s   |  |}| j|dS )NrA   )r@   r<   openr"   r?   remote_pathr&   r&   r'   _read`   s    
zSFTPStorage._readNc                 C   sD   |du s|du r0| j |}|p$|j}|p.|j}| j ||| dS )z$Set uid and/or gid for file at path.N)r<   statst_uidst_gidchown)r"   r1   r   r   attrr&   r&   r'   _chownd   s
    

zSFTPStorage._chownc                 C   sh   t |}| |s| | | j| | jdurD| j|| j | jsP| j	rd| j
|| j| j	d dS )zJCreate directory, recursing up to create parent dirs if
        necessary.Nr   r   )r=   dirnamer4   _mkdirr<   mkdirr   chmodr   r   rN   )r"   r1   parentr&   r&   r'   rQ   n   s    



zSFTPStorage._mkdirc                 C   s   |   | |}t|}| |s0| | | j |d}||j	  |
  | jdurp| j|| j | js|| jr| j|| j| jd |S )zSave file via SFTP.wbNrO   )rE   r@   r=   rP   r4   rQ   r<   writefilereadcloser   rS   r   r   rN   )r"   r?   contentr1   rP   fr&   r&   r'   _save|   s    




zSFTPStorage._savec                 C   s.   z| j | | W n ty(   Y n0 d S r
   )r<   remover@   OSErrorr>   r&   r&   r'   delete   s    zSFTPStorage.deletec                 C   s2   z| j | | W dS  ty,   Y dS 0 d S )NTF)r<   rI   r@   r^   r>   r&   r&   r'   r4      s
    zSFTPStorage.existsc                 C   s$   |j d urt|j tjkS dS d S NF)st_moderI   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 r
   )r@   r<   Zlistdir_attrre   appendfilename)r"   r1   rG   dirsfilesrd   r&   r&   r'   listdir   s    


zSFTPStorage.listdirc                 C   s   |  |}| j|jS r
   )r@   r<   rI   st_sizerF   r&   r&   r'   size   s    
zSFTPStorage.sizec                 C   s"   |  |}| j|j}t|S r
   )r@   r<   rI   st_atimer   fromtimestampr"   r?   rG   utimer&   r&   r'   accessed_time   s    
zSFTPStorage.accessed_timec                 C   s"   |  |}| j|j}t|S r
   )r@   r<   rI   st_mtimer   rn   ro   r&   r&   r'   modified_time   s    
zSFTPStorage.modified_timec                 C   s&   | j d u rtdt| j |ddS )Nz&This file is not accessible via a URL.\/)r    
ValueErrorr   replacer>   r&   r&   r'   url   s    
zSFTPStorage.url)rA   )NN)__name__
__module____qualname__r   r*   r8   propertyr<   r@   rD   rH   rN   rQ   r\   r_   r4   re   rj   rl   rq   rs   rx   __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 )rB   c                 C   s,   || _ || _t | _|| _d| _d| _d S r`   )r?   rC   ioBytesIOrW   _storage_is_read	_is_dirty)r"   r?   ZstoragerC   r&   r&   r'   r      s    
zSFTPStorageFile.__init__c                 C   s    t | ds| j| j| _| jS )N_size)hasattrr   rl   r?   r   r)   r&   r&   r'   rl      s    
zSFTPStorageFile.sizeNc                 C   s(   | j s| j| j| _d| _ | j|S )NT)r   r   rH   r?   rW   rX   )r"   	num_bytesr&   r&   r'   rX      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)rC   AttributeErrorr~   r   rW   r   r   )r"   rZ   r&   r&   r'   rV      s
    
zSFTPStorageFile.writec                 C   sL   | j s| d n6| jr@| j| jr@| j| j|p8| j| _ntdd S )Nr   zThe file cannot be reopened.)	closedseekr?   r   r4   rD   rC   rW   rv   )r"   rC   r&   r&   r'   rE      s
    zSFTPStorageFile.openc                 C   s$   | j r| j| j|  | j  d S r
   )r   r   r\   r?   rW   rY   r)   r&   r&   r'   rY      s    zSFTPStorageFile.close)N)N)
ry   rz   r{   r   r|   rl   rX   rV   rE   rY   r&   r&   r&   r'   rB      s   


rB   )r6   r~   r0   r=   rI   r   urllib.parser   r.   Zdjango.core.files.baser   Zdjango.utils.deconstructr   Zstorages.baser   Zstorages.utilsr   r	   rB   r&   r&   r&   r'   <module>   s    *