
    ]jd4                         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e             Zd Zd Z dZ!e G d de             Z"y)    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                   R     e Zd Zd Zd Zd Z eee      Z fdZ fdZ	d Z
 xZS )AzureStorageFilec                 v    || _         || _        || _        d| _        d | _        |j                  |      | _        y )NF)name_mode_storage	_is_dirty_file_get_valid_path_path)selfr   modestorages       I/root/env/lib/python3.12/site-packages/storages/backends/azure_storage.py__init__zAzureStorageFile.__init__   s7    	

,,T2
    c                    | j                   | j                   S t        | j                  j                  dt	        dd             }d| j
                  v sd| j
                  v rX| j                  j                  j                  | j                  | j                  j                        }|j                  |d       d| j
                  v r|j                  d	       || _         | j                   S )
Nz.AzureStorageFileFILE_UPLOAD_TEMP_DIR)max_sizesuffixdirratimeout   )max_concurrencyr   )r   r   r   max_memory_sizer   r   clientdownload_blobr   r.   download_to_streamseek)r    filedownload_streams      r#   	_get_filezAzureStorageFile._get_file!   s    ::!::#]]22&.57
 $**tzz 1 #mm22@@

DMM$9$9 A ;O..tQ.G$**IIaL
zzr%   c                     || _         y N)r   )r    values     r#   	_set_filezAzureStorageFile._set_file6   s	    
r%   c                 p    d| j                   vrd| j                   vrt        d      t        |   |i |S )Nr+   r,   z!File was not opened in read mode.)r   AttributeErrorsuperread)r    argskwargs	__class__s      r#   r@   zAzureStorageFile.read;   s:    djj S

%: !DEEw|T,V,,r%   c                     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   r>   r   r?   writer   )r    contentrC   s     r#   rG   zAzureStorageFile.write@   sN    tzz!4::%4::% !EFFw}[122r%   c                    | j                   y | j                  rR| j                   j                  d       | j                  j	                  | j
                  | j                          d| _        | j                   j                          d | _         y )Nr   F)r   r   r5   r   _saver   closer    s    r#   rK   zAzureStorageFile.closeH   s`    ::>>JJOOAMM		4::6"DN


r%   )__name__
__module____qualname__r$   r8   r<   propertyr6   r@   rG   rK   __classcell__rC   s   @r#   r   r      s/    3* Iy)D-
3r%   r   c                     	 | j                   j                  S # t        $ r Y nw xY w	 | j                  S # t        $ r Y y w xY wr:   )r6   content_typer>   )rH   s    r#   _content_typerU   S   sO    ||((( ### s    	$$4 	A A c                     | j                  d      } t        |       t        kD  rt        dt        z        t        |       st        d      | j	                  d      dkD  rt        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)ss    r#   r   r   _   sx     	
A
1v##%(;;= 	=q6#$ 	$ 	wws|c$% 	% Hr%   i   c                        e Zd Z fdZd Zd Zed        Zed        Zd Z	ed        Z
d Zd	 Zdd
Zef fd	Zd Zd Zd Zd Zd ZddZddZd Zd Zd ZddZddZd Z xZS )AzureStoragec                     t        |   di | d | _        d | _        d | _        t        j                         | _        y )N )r?   r$   _service_client_client_user_delegation_keyr   utcnow_user_delegation_key_expiry)r    settingsrC   s     r#   r$   zAzureStorage.__init__z   s9    $8$#$(!+3??+<(r%   c                    i dt        d      dt        d      dt        di       dt        d      d	t        d
d      dt        dd      dt        dd      dt        dd      dt        d      dt        dd      dt        dd      dddt        d       d!t        d"      d#t        d$      d%t        d&      d't        d(      S ))Naccount_nameAZURE_ACCOUNT_NAMEaccount_keyAZURE_ACCOUNT_KEYobject_parametersAZURE_OBJECT_PARAMETERSazure_containerAZURE_CONTAINER	azure_ssl	AZURE_SSLTupload_max_connAZURE_UPLOAD_MAX_CONN   r.   AZURE_CONNECTION_TIMEOUT_SECS   r1   AZURE_BLOB_MAX_MEMORY_SIZEi    expiration_secsAZURE_URL_EXPIRATION_SECSoverwrite_filesAZURE_OVERWRITE_FILESFlocationAZURE_LOCATION default_content_typezapplication/octet-streamcache_controlAZURE_CACHE_CONTROL	sas_tokenAZURE_SAS_TOKENcustom_domainAZURE_CUSTOM_DOMAINconnection_stringAZURE_CONNECTION_STRINGtoken_credentialAZURE_TOKEN_CREDENTIAL)r   rL   s    r#   get_default_settingsz!AzureStorage.get_default_settings   sB   
G$89
7#67
  )BB!G
 w'89	

 d3
 w'>B
 w>C
 w'C[Q
 w'BC
 w'>F
  0"5
 #$>
 W%:;
 !23
 W%:;
   )B!C!
" (@ A#
 	
r%   c                    | j                   t        j                  | j                         S | j                  xs dj	                  | j
                        }dj	                  | j                  |      }d }| j                  r| j
                  | j                  d}n1| j                  r| j                  }n| j                  r| j                  }t        ||      S )Nz{}.blob.core.windows.netz{}://{})rj   rl   
credential)
r   r	   from_connection_stringr   formatrj   azure_protocolrl   r   r   )r    account_domainaccount_urlr   s       r#   _get_service_clientz AzureStorage._get_service_client   s    !!-$;;D<R<RSS++ 
/I/P/P0
  &&t':':NK
 $ 1 1#//J ^^J""..J DDr%   c                 \    | j                   | j                         | _         | j                   S r:   )rc   r   rL   s    r#   service_clientzAzureStorage.service_client   s+    '#'#;#;#=D ###r%   c                     | j                   *| j                  j                  | j                        | _         | j                   S r:   )rd   r   get_container_clientrp   rL   s    r#   r2   zAzureStorage.client   s9    <<..CC$$DL ||r%   c                    | j                   y | j                  || j                  kD  rLt        j                         }|t        d      z   }| j                  j                  ||      | _        || _        | j                  S )N   )days)key_start_timekey_expiry_time)r   re   rg   r   rf   r   r   get_user_delegation_key)r    expirynowr   s       r#   r   z$AzureStorage.get_user_delegation_key   s       (
 %%-888//#C!I1$55O(,(;(;(S(S"O )T )D% 0?D,(((r%   c                     | j                   ryy)Nhttpshttp)rr   rL   s    r#   r   zAzureStorage.azure_protocol   s    >>r%   c                 f    	 t        | j                  |      S # t        $ r t        d|z        w xY w)Nz Attempted access to '%s' denied.)r   r~   r\   r   r    r   s     r#   _normalize_namezAzureStorage._normalize_name   s;    	QT]]D11 	Q%&H4&OPP	Qs    0c                 H    t        | j                  t        |                  S r:   )r   r   r   r   s     r#   r   zAzureStorage._get_valid_path   s%      4 "# 	#r%   c                     t        |||       S r:   )r   )r    r   r!   s      r#   _openzAzureStorage._open   s    dD11r%   c                 j    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   r|   r   r?   get_available_name)r    r   
max_lengthrC   s      r#   r   zAzureStorage.get_available_name   s7    
 $/jAAw)$
;;r%   c                     | j                   j                  | j                  |            }	 |j                          y# t        $ r Y yw xY w)NTF)r2   get_blob_clientr   get_blob_propertiesr   )r    r   blob_clients      r#   existszAzureStorage.exists   sG    kk11$2F2Ft2LM	++-$ 		s   = 	A	A	c                     	 | j                   j                  | j                  |      | j                         y # t        $ r Y y w xY wNr-   )r2   delete_blobr   r.   r   r   s     r#   deletezAzureStorage.delete   sG    	KK##$$T* $ & % 		s   69 	AAc                     | j                   j                  | j                  |            }|j                  | j                        }|j
                  S r   )r2   r   r   r   r.   size)r    r   r   
propertiess       r#   r   zAzureStorage.size   sB    kk11$2F2Ft2LM 44T\\4J
r%   c           	      L   t        |      }| j                  |      }| j                  ||      }t        |t              r|j
                  }|j                  d       | j                  j                  ||t        di || j                  | j                  | j                         |S )Nr   )content_settingsr0   r.   	overwriterb   )r   r    _get_content_settings_parameters
isinstancer   r6   r5   r2   upload_blobr
   rt   r.   r|   )r    r   rH   cleaned_nameparamss        r#   rJ   zAzureStorage._save  s    !$'##D)66tWE gt$llGQ,6v6 00LL** 	  	, r%   c                 D    t        j                         t        |      z   S )N)seconds)r   rf   r   )r    expires     r#   
_expire_atzAzureStorage._expire_at  s     9V#<<<r%   c                    | j                  |      }|xs i }|| j                  }d }|r_| j                  |      }| j                  |      }t	        | j
                  | j                  |f| j                  |t        d      |d|}|}| j                  j                  |      j                  }	t        j                  |	|      j                  S )NT)r@   )rl   user_delegation_key
permissionr   r   )r   rz   r   r   r   rj   rp   rl   r   r2   r   urlr   from_blob_url)
r    r   r   
parametersr   r   r   r   r   container_blob_urls
             r#   r   zAzureStorage.url  s    ##D)!r>))F
__V,F"&">">v"F)!!$$	 !,,$7-48	 	I #J![[88>BB''(:zRVVVr%   c                     i }t        j                  |      \  }}t        |      xs |xs | j                  }| j                  |d<   ||d<   ||d<   |j                  | j                  |             |S )Nr   rT   content_encoding)	mimetypes
guess_typerU   r   r   updateget_object_parameters)r    r   rH   r   guessed_typer   rT   s          r#   r   z-AzureStorage._get_content_settings_parameters4  s    )2)=)=d)C&&'" &&%% 	
 #'"4"4!-~%5!"d0067r%   c                 6    | j                   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.
        )rn   copyr   s     r#   r   z"AzureStorage.get_object_parametersD  s     %%**,,r%   c                    | j                   j                  | j                  |      | j                        }t	        dd      st        j                  |j                        S t        j                         }t        j                  |j                        r t        j                  |j                  |      S |j                  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-   USE_TZF)r2   r   r   r.   r   r   
make_naivelast_modifiedget_current_timezoneis_naive
make_aware
astimezone)r    r   r   tzs       r#   get_modified_timezAzureStorage.get_modified_timeM  s    
 [[44  &LL 5 "
 x'&&z'?'?@@**,Z556&&z'?'?DD ''22266r%   c                 |    | j                  |      }t        j                  |      r|S t        j                  |      S )zBReturns a naive datetime object containing the last modified time.)r   r   r   r   )r    r   mtimes      r#   modified_timezAzureStorage.modified_time`  s6    &&t,U#L""5))r%   c                     |r| j                  |      }|r|j                  d      s|dz  }| j                  j                  || j                        D cg c]  }|j
                   c}S c c}w )z!Return all files for a given pathrW   )name_starts_withr.   )r   endswithr2   
list_blobsr.   r   )r    pathblobs      r#   list_allzAzureStorage.list_allg  sp    ''-Dc*CKD ..!% / &' II' 	' 's   A+c                     g }t               }| j                  |      D ]J  }|t        |      d }d|v r%|j                  |j	                  dd      d          :|j                  |       L 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.
        NrW   r/   r   )setr   rZ   addsplitappendlist)r    r   filesdirsr   ns         r#   listdirzAzureStorage.listdirt  sv     uMM$' 	 DSYZ Aaxa+,Q	  Dz5  r%   c                     t         t        | j                  d            z
  t        d      z
  }| j                  s|t        d      z  }|S )Nfoo_1234567)r[   rZ   r   r|   )r    max_lens     r#   get_name_max_lenzAzureStorage.get_name_max_len  sA    %D,@,@,G(HH3u:U##s:&Gr%   )rb)NNr:   )r   )rM   rN   rO   r$   r   r   rP   r   r2   r   r   r   r   r   r[   r   r   r   r   rJ   r   r   r   r   r   r   r   r   r   rQ   rR   s   @r#   r`   r`   x   s    =
*E* $ $
  )*  Q#2 3F <
&=W4 -7&*'! r%   r`   )#r   r   r   tempfiler   azure.core.exceptionsr   azure.storage.blobr   r   r	   r
   r   django.core.exceptionsr   django.core.files.baser   django.utilsr   django.utils.deconstructr   django.utils.encodingr   storages.baser   storages.utilsr   r   r   r   r   rU   r   r[   r`   rb   r%   r#   <module>r     s     ( ) 7  7 ' ! 4 - % 
 9t 9 9x	,   O; O Or%   