
    	]j                         d Z 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  ej"                  e      Z	 ddZdd	Z G d
 de      Z G d de      Z ed      Zd Zy)zThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)urlparse)ClientError)get_env)settings)
TLDExtractc                    | xs t        d      } |xs t        d      }|xs t        d      }t        j                  d|  d|r|d d dz   nd  d|        t        j                  | ||	      }d
|xs t        d      xs di}|xs t        d      }|r||d<    |j
                  ddt        j                  j                  d      i|} |j                  ddt        j                  j                  d      i|}||fS )NAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKENz(Create boto3 session with access key id=z, secret key=   z...z, session token=)aws_access_key_idaws_secret_access_keyaws_session_tokenregion_name	S3_regionz	us-east-1S3_ENDPOINTendpoint_urlconfigs3v4)signature_version)s3)	r   loggerdebugboto3SessionclientsessionConfigresource)	r   r   r   r   s3_endpointr   r   r   r   s	            K/root/env/lib/python3.12/site-packages/label_studio/io_storages/s3/utils.pyget_client_and_resourcer"      s1    *IW5H-I1UW=T5U)IW5H-I
LL*+ ,;P+BQ/%7VZ[ \*+	- mm+3+G
 {Qgk.BQkRH7!7K#. W^^d)=)=PV)=)Wd[cdFwhU]]-A-ATZ-A-[h_ghH8    c                 L   t        | d      }|j                  }|j                  j                  d      }|s^|j	                  ||      }|d   d   d   }d|z   d	z   t        j                  |d
   j                               j                  d      z   }	|	S 	 ||d}
t        j                  |      \  }}|r||
d<   |j                  d|
|      }t        j                  dj                  ||              |S # t        $ r$}t        j!                  d|        | cY d }~S d }~ww xY w)NF)allow_fragments/BucketKeyResponseMetadataHTTPHeaderszcontent-typezdata:z;base64,Bodyzutf-8ResponseContentType
get_object)ClientMethodParams	ExpiresInz1Presigned URL {presigned_url} generated for {url})presigned_urlurlz&Can't generate presigned URL. Reason: )r   netlocpathlstripr.   base64	b64encodereaddecode	mimetypes
guess_typegenerate_presigned_urlr   r   formatr   warning)r3   r   presign
expires_inrbucket_namekeyobjectcontent_type
object_b64params_r2   excs                 r!   resolve_s3_urlrK   -   s5   e,A((K
&&--
C ""+3"?01-@P|+j86;K;KFSYNL_L_La;b;i;ijq;rr
'4 $..s3a,8F()55<X^jt5u
 	HOO^kqtOuv  ?uEF
s   8C6 6	D#?DD#D#c                   F    e Zd Ze	 	 	 	 	 	 ddedefd       Zedd       Zy)AWSNr3   rC   c	                     |t        |||||      \  }}	|j                  ||      }
t        |
      }|j                  dd       |j                  dd       |S )a  
        Get blob metadata by url
        :param url: Object key
        :param bucket_name: AWS bucket name
        :param client: AWS client for batch processing
        :param account_key: Azure account key
        :return: Object metadata dict("name": "value")
        N)r   r   r   r   r    r'   r,   r*   )r"   r.   dictpop)clsr3   rC   r   r   r   r   r   r    rI   rE   metadatas               r!   get_blob_metadatazAWS.get_blob_metadataO   sh    ( >/"3&;"3''IFA ""+3"?<VT"'.r#   c                    |j                         \  }}|rt        j                  |      }t        j                  |      }|j
                  rNd|j
                  j                  d      dz   i}|j                  sd|d<    |j                  j                  di |}n|j                  }|j                  t        j                        j                         }t        |      D ]i  \  }	}
|
j                  }|j!                  d      rt"        j%                  |dz          <|s?|j'                  |      sQt"        j%                  |dz           y y)	a7  
        Validate pattern against S3 Storage
        :param storage: S3 Storage instance
        :param pattern: Pattern to validate
        :param glob_pattern: If True, pattern is a glob pattern, otherwise it is a regex pattern
        :return: Message if pattern is not valid, empty string otherwise
        Prefixr&   	Delimiterz" is skipped because it is a folderz matches file pattern z3No objects found matching the provided glob pattern )get_client_and_bucketfnmatch	translaterecompileprefixrstriprecursive_scanobjectsfilter	page_sizer   )CLOUD_STORAGE_CHECK_FOR_RECORDS_PAGE_SIZEall	enumeraterD   endswithr   r   match)rQ   storagepatternglob_patternr   bucketregexlist_kwargsbucket_iterindexobjrD   s               r!   validate_patternzAWS.validate_patternr   s    !668''0G

7#>>#W^^%:%:3%?#%EFK))+.K(/&..//>+>K ..K!++H,^,^_cce#K0 	JE3''C||C S#GGHS)S#::;	 Er#   )NNNNNN)T)__name__
__module____qualname__classmethodstrrS   rr   rX   r#   r!   rM   rM   N   sQ    
 "      D  E  Er#   rM   c                       e Zd Zy)S3StorageErrorN)rs   rt   ru   rX   r#   r!   ry   ry      s    r#   ry   rX   )suffix_list_urlsc                       fd}|S )z
    For S3 storages - if s3_endpoint is not on a known domain, catch exception and
    raise a new one with the previous context suppressed. See also: https://peps.python.org/pep-0409/
    c                    	  | g|i |S # t         $ r}| j                  rt        j                  t	        | j                              j
                  j                         x}t        j                  D cg c]  }|j                          nc c}w c}vr*t        j                  d| d       t        d| d      d |d }~ww xY w)Nz'Exception from unrecognized S3 domain: T)exc_infoz<Debugging info is not available for s3 endpoints on domain: zg. Please contact your Label Studio devops team if you require detailed error reporting for this domain.)	Exceptionr    	extractorextract_urllibr   registered_domainlowerr   S3_TRUSTED_STORAGE_DOMAINSr   errorry   )selfargskwargsedomaintrusted_domainfuncs         r!   wrapperz,catch_and_reraise_from_none.<locals>.wrapper   s    	.t.v.. 
	#228D<L<L3MN``ffhhCKCfCfgn**,gg%h FqcJUYZ$RSYRZ [| | 
 
	s!    	C	AC7B6CC	rX   )r   r   s   ` r!   catch_and_reraise_from_noner      s     Nr#   )NNNNN)Ti  )__doc__r7   rZ   loggingr;   r\   urllib.parser   r   botocore.exceptionsr   core.utils.paramsr   django.confr   
tldextractr   	getLoggerrs   r   r"   rK   rE   rM   r~   ry   r   r   rX   r#   r!   <module>r      s}        	 !  + %   !			8	$ os4BEE& EEP	Y 	 +	r#   