a
    ތxd3                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZ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 d dlmZ d dlmZmZmZmZ eG dd deZdd Zdd Z dZ!eG dd deZ"dS )    N)datetime	timedelta)SpooledTemporaryFile)ResourceNotFoundError)
BlobClientBlobSasPermissionsBlobServiceClientContentSettingsgenerate_blob_sas)SuspiciousOperation)File)timezone)deconstructible)force_bytes)BaseStorage)
clean_nameget_available_overwrite_name	safe_joinsettingc                       sR   e Zd Zdd Zdd Zdd ZeeeZ fddZ fd	d
Z	dd Z
  ZS )AzureStorageFilec                 C   s.   || _ || _|| _d| _d | _||| _d S )NF)name_mode_storage	_is_dirty_file_get_valid_path_path)selfr   modeZstorage r   W/var/www/html/Ranjet/env/lib/python3.9/site-packages/storages/backends/azure_storage.py__init__   s    zAzureStorageFile.__init__c                 C   s   | j d ur| j S t| jjdtdd d}d| jv s<d| jv rb| jjj| j| jj	d}|j
|dd d| jv rv|d	 || _ | j S )
Nz.AzureStorageFileZFILE_UPLOAD_TEMP_DIR)max_sizesuffixdirratimeout   )max_concurrencyr   )r   r   r   max_memory_sizer   r   clientZdownload_blobr   r(   Zdownload_to_streamseek)r   fileZdownload_streamr   r   r    	_get_file!   s     



zAzureStorageFile._get_filec                 C   s
   || _ d S N)r   )r   valuer   r   r    	_set_file6   s    zAzureStorageFile._set_filec                    s.   d| j vrd| j vrtdt j|i |S )Nr%   r&   z!File was not opened in read mode.)r   AttributeErrorsuperread)r   argskwargs	__class__r   r    r5   ;   s    zAzureStorageFile.readc                    s<   d| j vr&d| j vr&d| j vr&tdd| _t t|S )Nw+r&   z"File was not opened in write mode.T)r   r3   r   r4   writer   )r   contentr8   r   r    r<   @   s    
zAzureStorageFile.writec                 C   sL   | j d u rd S | jr8| j d | j| j| j  d| _| j   d | _ d S )Nr   F)r   r   r-   r   _saver   closer   r   r   r    r?   H   s    

zAzureStorageFile.close)__name__
__module____qualname__r!   r/   r2   propertyr.   r5   r<   r?   __classcell__r   r   r8   r    r      s   
r   c                 C   s>   z
| j jW S  ty   Y n0 z| jW S  ty8   Y n0 d S r0   )r.   content_typer3   )r=   r   r   r    _content_typeS   s    
rG   c                 C   sL   |  d} t| tkr"tdt t| s2td| ddkrHtd| S )Nz./zFile name max len is %dz7File name must contain one or more printable characters/   z0File name must not contain more than 256 slashes)striplen_AZURE_NAME_MAX_LEN
ValueErrorcount)sr   r   r    r   _   s    
r   i   c                       s   e Zd Z fddZdd Zdd Zedd Zed	d
 Zdd Z	edd Z
dd Zdd Zd4ddZef fdd	Zdd Zdd Zdd Zdd Zd d! Zd5d#d$Zd6d%d&Zd'd( Zd)d* Zd+d, Zd7d.d/Zd8d0d1Zd2d3 Z  ZS )9AzureStoragec                    s2   t  jf i | d | _d | _d | _t | _d S r0   )r4   r!   _service_client_client_user_delegation_keyr   utcnow_user_delegation_key_expiry)r   settingsr8   r   r    r!   z   s
    zAzureStorage.__init__c                 C   sv   t dt dt di t dt ddt ddt d	d
t ddt dt ddt dddt dt dt dt dt ddS )NZAZURE_ACCOUNT_NAMEZAZURE_ACCOUNT_KEYZAZURE_OBJECT_PARAMETERSZAZURE_CONTAINERZ	AZURE_SSLTZAZURE_UPLOAD_MAX_CONN   ZAZURE_CONNECTION_TIMEOUT_SECS   ZAZURE_BLOB_MAX_MEMORY_SIZEi    ZAZURE_URL_EXPIRATION_SECSZAZURE_OVERWRITE_FILESFZAZURE_LOCATION zapplication/octet-streamZAZURE_CACHE_CONTROLZAZURE_SAS_TOKENZAZURE_CUSTOM_DOMAINZAZURE_CONNECTION_STRINGZAZURE_TOKEN_CREDENTIAL)account_nameaccount_keyobject_parametersazure_container	azure_sslupload_max_connr(   r+   expiration_secsoverwrite_fileslocationdefault_content_typecache_control	sas_tokencustom_domainconnection_stringtoken_credential)r   r@   r   r   r    get_default_settings   s$    z!AzureStorage.get_default_settingsc                 C   sj   | j d urt| j S | jpd}d| j| j|}d }| jrD| j}n| jrR| j}n| j	r^| j	}t||dS )Nzblob.core.windows.netz
{}://{}.{}
credential)
rg   r   Zfrom_connection_stringrf   formatazure_protocolrZ   r[   re   rh   )r   Zaccount_domainZaccount_urlrk   r   r   r    _get_service_client   s    


z AzureStorage._get_service_clientc                 C   s   | j d u r|  | _ | j S r0   )rQ   rn   r@   r   r   r    service_client   s    

zAzureStorage.service_clientc                 C   s    | j d u r| j| j| _ | j S r0   )rR   ro   Zget_container_clientr]   r@   r   r   r    r,      s
    
zAzureStorage.clientc                 C   sV   | j d u rd S | jd u s"|| jkrPt }|tdd }| jj||d| _|| _| jS )N   )days)Zkey_start_timekey_expiry_time)rh   rS   rU   r   rT   r   ro   get_user_delegation_key)r   expirynowrr   r   r   r    rs      s    
z$AzureStorage.get_user_delegation_keyc                 C   s   | j r
dS dS d S )Nhttpshttp)r^   r@   r   r   r    rm      s    zAzureStorage.azure_protocolc                 C   s2   zt | j|W S  ty,   td| Y n0 d S )Nz Attempted access to '%s' denied.)r   rb   rM   r   r   r   r   r   r    _normalize_name   s    zAzureStorage._normalize_namec                 C   s   t | t|S r0   )r   ry   r   rx   r   r   r    r      s
    zAzureStorage._get_valid_pathrbc                 C   s   t ||| S r0   )r   )r   r   r   r   r   r    _open   s    zAzureStorage._openc                    s&   t |}| jrt||S t ||S )z
        Returns a filename that's free on the target storage system, and
        available for new content to be written to.
        )r   ra   r   r4   get_available_name)r   r   
max_lengthr8   r   r    r|      s    
zAzureStorage.get_available_namec                 C   s:   | j | |}z|  W dS  ty4   Y dS 0 d S )NTF)r,   get_blob_clientr   get_blob_propertiesr   )r   r   blob_clientr   r   r    exists   s    zAzureStorage.existsc                 C   s4   z| j j| || jd W n ty.   Y n0 d S Nr'   )r,   Zdelete_blobr   r(   r   rx   r   r   r    delete   s    
zAzureStorage.deletec                 C   s&   | j | |}|j| jd}|jS r   )r,   r~   r   r   r(   size)r   r   r   
propertiesr   r   r    r      s    zAzureStorage.sizec                 C   sd   t |}| |}| ||}t|tr.|j}|d | jj||t	f i || j
| j| jd |S )Nr   )Zcontent_settingsr*   r(   	overwrite)r   r    _get_content_settings_parameters
isinstancer   r.   r-   r,   Zupload_blobr	   r_   r(   ra   )r   r   r=   Zcleaned_nameparamsr   r   r    r>      s    


zAzureStorage._savec                 C   s   t  t|d S )N)seconds)r   rT   r   )r   expirer   r   r    
_expire_at  s    zAzureStorage._expire_atNc              	   C   sx   |  |}|d u r| j}d }|rZ| |}| |}t| j| j|| j|tdd|d}|}| j	
|j}tj||djS )NT)r5   )r[   user_delegation_keyZ
permissionrt   rj   )r   r`   r   rs   r
   rZ   r]   r[   r   r,   r~   urlr   Zfrom_blob_url)r   r   r   rk   rt   r   re   Zcontainer_blob_urlr   r   r    r     s&    


zAzureStorage.urlc                 C   sR   i }t |\}}t|p"|p"| j}| j|d< ||d< ||d< || | |S )Nrd   rF   content_encoding)	mimetypes
guess_typerG   rc   rd   updateget_object_parameters)r   r   r=   r   Zguessed_typer   rF   r   r   r    r   -  s    
z-AzureStorage._get_content_settings_parametersc                 C   s
   | j  S )z
        Returns a dictionary that is passed to content settings. Override this
        method to adjust this on a per-object basis to set e.g ContentDisposition.

        By default, returns the value of AZURE_OBJECT_PARAMETERS.
        )r\   copyrx   r   r   r    r   =  s    z"AzureStorage.get_object_parametersc                 C   s\   | j j| || jd}tdds.t|jS t }t	|jrPt
|j|S |j|S )z
        Returns an (aware) datetime object containing the last modified time if
        USE_TZ is True, otherwise returns a naive datetime in the local timezone.
        r'   ZUSE_TZF)r,   r   r   r(   r   r   
make_naiveZlast_modifiedZget_current_timezoneis_naiveZ
make_aware
astimezone)r   r   r   tzr   r   r    get_modified_timeF  s    
zAzureStorage.get_modified_timec                 C   s"   |  |}t|r|S t|S )zBReturns a naive datetime object containing the last modified time.)r   r   r   r   )r   r   mtimer   r   r    modified_timeY  s    

zAzureStorage.modified_timerY   c                 C   s@   |r|  |}|r$|ds$|d7 }dd | jj|| jdD S )z!Return all files for a given pathrH   c                 S   s   g | ]
}|j qS r   )r   ).0Zblobr   r   r    
<listcomp>g  s   z)AzureStorage.list_all.<locals>.<listcomp>)Zname_starts_withr(   )r   endswithr,   Z
list_blobsr(   )r   pathr   r   r    list_all`  s    
zAzureStorage.list_allc                 C   s`   g }t  }| |D ]>}|t|d }d|v rH||ddd  q|| qt||fS )z
        Return directories and files for a given path.
        Leave the path empty to list the root.
        Order of dirs and files is undefined.
        NrH   r)   r   )setr   rK   addsplitappendlist)r   r   filesdirsr   nr   r   r    listdirm  s    zAzureStorage.listdirc                 C   s0   t t| d td }| js,|td8 }|S )NZfooZ_1234567)rL   rK   r   ra   )r   max_lenr   r   r    get_name_max_len}  s    zAzureStorage.get_name_max_len)rz   )N)N)rY   )rY   )rA   rB   rC   r!   ri   rn   rD   ro   r,   rs   rm   ry   r   r{   rL   r|   r   r   r   r>   r   r   r   r   r   r   r   r   r   rE   r   r   r8   r    rP   x   s6   






	

rP   )#r   r   r   tempfiler   Zazure.core.exceptionsr   Zazure.storage.blobr   r   r   r	   r
   Zdjango.core.exceptionsr   Zdjango.core.files.baser   Zdjango.utilsr   Zdjango.utils.deconstructr   Zdjango.utils.encodingr   Zstorages.baser   Zstorages.utilsr   r   r   r   r   rG   r   rL   rP   r   r   r   r    <module>   s$   <