U
    #i                     @  s   d dl m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mZ d dl	m
Z
 d dlmZmZmZmZmZmZ d dlmZmZ d dlmZ d	d
lmZmZ d	dlmZmZmZmZmZ d	dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ededZ*dddddZ+dddddZ,dddddZ-dddddZ.dddd d!Z/dd"dd#d$Z0dd%dd&d'Z1dd(dd)d*Z2dd+dd,d-Z3ddd.d/d0Z4ddd.d1d2Z5d3d4d5d6d7Z6d3d8d5d9d:Z7ddd;d<d=Z8dHd?d@Z9dAdB Z:dCZ;dDdEdFdGZ<dS )I    )annotationsN)urlsafe_b64decode)datetime)loads)AnyDictTypeTypeVarUnioncast)HTTPStatusErrorResponse)	BaseModel   )API_VERSION_HEADER_NAMEAPI_VERSIONS)AuthApiError	AuthErrorAuthRetryableErrorAuthUnknownErrorAuthWeakPasswordError)	AuthOtpResponseAuthResponseGenerateLinkPropertiesGenerateLinkResponseLinkIdentityResponseSessionSSOResponseUserUserResponse
TBaseModel)boundzType[TBaseModel])modelreturnc                 C  s0   z|  |W S  tk
r*   | | Y S X dS )zcCompatibility layer between pydantic 1 and 2 for parsing an instance
    of a BaseModel from variedN)model_validateAttributeErrorZ	parse_obj)r"   contents r'   2/tmp/pip-unpacked-wheel-b8wmx3ip/gotrue/helpers.pyr$   '   s    r$   r   zDict[str, Any]c                 C  s,   z
|   W S  tk
r&   |   Y S X dS )zUCompatibility layer between pydantic 1 and 2 for dumping a model's contents as a dictN)
model_dumpr%   dictr"   r'   r'   r(   r)   2   s    
r)   strc                 C  s,   z
|   W S  tk
r&   |   Y S X dS )zSCompatibility layer between pydantic 1 and 2 for dumping a model's contents as jsonN)model_dump_jsonr%   jsonr+   r'   r'   r(   r-   <   s    
r-   r   r   )datar#   c                 C  sh   d }d| kr>d| kr>d| kr>| d r>| d r>| d r>t t| }| d| }|rXt t|nd }t||dS )NZaccess_tokenZrefresh_tokenZ
expires_inuser)sessionr0   )r$   r   getr   r   )r/   r1   	user_datar0   r'   r'   r(   parse_auth_responseF   s"    
r4   r   c                 C  s
   t t| S N)r$   r   r/   r'   r'   r(   parse_auth_otp_responseV   s    r7   r   c                 C  s
   t t| S r5   )r$   r   r6   r'   r'   r(   parse_link_identity_responseZ   s    r8   r   c                   sX   t | d| d| d| d| dd tt fdd|  D }t |d	S )
Naction_link	email_otphashed_tokenredirect_toverification_type)r9   r:   r;   r<   r=   c                   s"   i | ]\}}|t  kr||qS r'   )r)   ).0kv
propertiesr'   r(   
<dictcomp>g   s       z'parse_link_response.<locals>.<dictcomp>)rB   r0   )r   r2   r$   r   itemsr   )r/   r0   r'   rA   r(   parse_link_response^   s     rE   r   c                 C  s   d| krd| i} t t| S )Nr0   )r$   r   r6   r'   r'   r(   parse_user_responsel   s    rF   r   c                 C  s
   t t| S r5   )r$   r   r6   r'   r'   r(   parse_sso_responser   s    rG   )errorr#   c                   s6   ddddg} fddt  fdd|D t S )	NmsgmessageZerror_descriptionrH   c                   s   t  tr|  kS t | S r5   )
isinstancer*   hasattr)proprH   r'   r(   <lambda>x   s    z#get_error_message.<locals>.<lambda>c                 3  s   | ]}|r | V  qd S r5   r'   )r>   rM   rH   filterr'   r(   	<genexpr>{   s      z$get_error_message.<locals>.<genexpr>)nextr,   )rH   propsr'   rP   r(   get_error_messagev   s    rU   c                 C  s   t | tr| dd S d S )N
error_code)rK   r*   r2   rN   r'   r'   r(   get_error_code~   s    rW   	Exceptionbool)	exceptionr#   c                 C  s
   t | tS r5   )rK   r   )rZ   r'   r'   r(   looks_like_http_status_error   s    r[   r   c              
   C  s  t | stt| dS tt| }z~dddg}|jj|krNtt||jjW S |j }d }t|j}|rt	
|tddkrt|tr|rt|dtr|d}n(t|tr|rt|dtr|d}|d krVt|tr|rt|d	tr|d	rt|d	trt|d	rtt||jj|d	d
W S n0|d	krtt||jj|d	i d
i W S tt||jjpd|W S  tk
r } ztt|| W Y S d }~X Y nX d S )Nr   i  i  i  z
2024-01-01	timestampcoderV   Zweak_passwordZreasonsi  )r[   r   rU   r   r   responsestatus_coder.   parse_response_api_versionr   r\   r   r2   rK   r*   r,   listlenr   r   rX   r   )rZ   rH   Znetwork_error_codesr/   rV   Zresponse_api_versioner'   r'   r(   handle_exception   s    

 




rd   )tokenr#   c                 C  sN   |  d}t|dkrtd|d }|dt| d   }tt|dS )N.   z%JWT is not valid: not a JWT structurer   =   utf-8)splitrb   
ValueErrorr   r   decode)re   partsZ	base64urlZbase64url_with_paddingr'   r'   r(   decode_jwt_payload   s    
ro   @   c                   sD   | dk s| dkrt dtjtj d  d fddt| D S )z8Generate a random PKCE verifier of the specified length.+      z:PKCE verifier length must be between 43 and 128 charactersz-._~ c                 3  s   | ]}t  V  qd S r5   )secretschoice)r>   _charsetr'   r(   rR      s     z)generate_pkce_verifier.<locals>.<genexpr>)rl   stringascii_lettersdigitsjoinrange)lengthr'   rw   r(   generate_pkce_verifier   s    r   c                 C  s.   |  d}t| }t|ddS )z/Generate a code challenge from a PKCE verifier.rj      =)encodehashlibsha256digestbase64urlsafe_b64encoderstriprm   )Zcode_verifierZverifier_bytesZsha256_hashr'   r'   r(   generate_pkce_challenge   s    
r   z9^2[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$r   )r^   c              
   C  sh   | j t}|sd S tt|d kr(d S zt|d}|W S  tk
rb } z
W Y d S d }~X Y nX d S )Nz%Y-%m-%d)	headersr2   r   researchAPI_VERSION_REGEXr   strptimerX   )r^   api_versiondtrc   r'   r'   r(   r`      s    r`   )rp   )=
__future__r   r   r   r   rt   ry   r   r   r.   r   typingr   r   r   r	   r
   r   Zhttpxr   r   Zpydanticr   	constantsr   r   errorsr   r   r   r   r   typesr   r   r   r   r   r   r   r   r   r    r$   r)   r-   r4   r7   r8   rE   rF   rG   rU   rW   r[   rd   ro   r   r   r   r`   r'   r'   r'   r(   <module>   sB    ,

;
	