o
    `g                      @  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 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Z-dQddZ.dRddZ/dSddZ0dTd d!Z1dUd#d$Z2dVd&d'Z3dWd)d*Z4dXd,d-Z5dYd/d0Z6dZd2d3Z7dZd4d5Z8d[d9d:Z9d\d<d=Z:d]d?d@Z;d^dBdCZ<dDdE Z=dFZ>d_dIdJZ?d`dLdMZ@dadOdPZAdS )b    )annotationsN)urlsafe_b64decode)datetime)loads)AnyDictOptionalTypeTypeVarcast)urlparse)HTTPStatusErrorResponse)	BaseModel   )API_VERSION_HEADER_NAMEAPI_VERSIONS)AuthApiError	AuthErrorAuthRetryableErrorAuthUnknownErrorAuthWeakPasswordError)	AuthOtpResponseAuthResponseGenerateLinkPropertiesGenerateLinkResponseLinkIdentityResponseSessionSSOResponseUserUserResponse
TBaseModel)boundz3^([a-z0-9_-]{4})*($|[a-z0-9_-]{3}$|[a-z0-9_-]{2}$)$modelType[TBaseModel]returnc                 C  s*   z|  |W S  ty   | | Y S w )zcCompatibility layer between pydantic 1 and 2 for parsing an instance
    of a BaseModel from varied)model_validateAttributeError	parse_obj)r#   contents r*   I/var/www/html/propose/venv/lib/python3.10/site-packages/gotrue/helpers.pyr&   )   s
   r&   r   Dict[str, Any]c                 C  &   z|   W S  ty   |   Y S w )zUCompatibility layer between pydantic 1 and 2 for dumping a model's contents as a dict)
model_dumpr'   dictr#   r*   r*   r+   r.   4   
   
r.   strc                 C  r-   )zSCompatibility layer between pydantic 1 and 2 for dumping a model's contents as json)model_dump_jsonr'   jsonr0   r*   r*   r+   r3   >   r1   r3   datar   r   c                 C  sh   d }d| v rd| v rd| v r| d r| d r| d rt t| }| d| }|r,t t|nd }t||dS )Naccess_tokenrefresh_token
expires_inuser)sessionr9   )r&   r   getr   r   )r5   r:   	user_datar9   r*   r*   r+   parse_auth_responseH   s   
r=   r   c                 C  
   t t| S N)r&   r   r5   r*   r*   r+   parse_auth_otp_responseX      
rA   r   c                 C  r>   r?   )r&   r   r@   r*   r*   r+   parse_link_identity_response\   rB   rC   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)rD   rE   rF   rG   rH   c                   s"   i | ]\}}|t  vr||qS r*   )r.   ).0kv
propertiesr*   r+   
<dictcomp>i   s   " z'parse_link_response.<locals>.<dictcomp>)rM   r9   )r   r;   r&   r   itemsr   )r5   r9   r*   rL   r+   parse_link_response`   s   rP   r    c                 C  s   d| vrd| i} t t| S )Nr9   )r&   r    r@   r*   r*   r+   parse_user_responsen   s   
rQ   r   c                 C  r>   r?   )r&   r   r@   r*   r*   r+   parse_sso_responset   rB   rR   errorc                   s2   g d} fddt  fdd|D t S )N)msgmessageerror_descriptionrS   c                   s   t  tr	|  v S t | S r?   )
isinstancer/   hasattr)proprS   r*   r+   <lambda>z   s   z#get_error_message.<locals>.<lambda>c                 3  s     | ]}|r | V  qd S r?   r*   )rI   rY   rS   filterr*   r+   	<genexpr>}   s    z$get_error_message.<locals>.<genexpr>)nextr2   )rS   propsr*   r\   r+   get_error_messagex   s   ra   c                 C  s   t | tr| dd S d S )N
error_code)rW   r/   r;   rZ   r*   r*   r+   get_error_code   s   rc   	exception	Exceptionboolc                 C  s
   t | tS r?   )rW   r   )rd   r*   r*   r+   looks_like_http_status_error   rB   rg   r   c              
   C  s  t | stt| dS tt| }zg d}|jj|v r%tt||jjW S |j }d }t|j}|rUt	
|tddkrUt|trU|rUt|dtrU|d}nt|tri|rit|dtri|d}|d u rt|tr|rt|dtr|drt|dtrt|drtt||jj|ddW S n|dkrtt||jj|di di W S tt||jjpd	|W S  ty } ztt||W  Y d }~S d }~ww )
Nr   )i  i  i  z
2024-01-01	timestampcoderb   weak_passwordreasonsi  )rg   r   ra   r   r   responsestatus_coder4   parse_response_api_versionr   rh   r   r;   rW   r/   r2   listlenr   r   re   r   )rd   rS   network_error_codesr5   rb   response_api_versioner*   r*   r+   handle_exception   s   




rt   tokenc                 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)splitrp   
ValueErrorr   r   decode)ru   parts	base64urlbase64url_with_paddingr*   r*   r+   decode_jwt_payload   s   
r   @   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 r?   )secretschoice)rI   _charsetr*   r+   r^      s    z)generate_pkce_verifier.<locals>.<genexpr>)r|   stringascii_lettersdigitsjoinrange)lengthr*   r   r+   generate_pkce_verifier   s   r   c                 C  s.   |  d}t| }t|ddS )z/Generate a code challenge from a PKCE verifier.rz      =)encodehashlibsha256digestbase64urlsafe_b64encoderstripr}   )code_verifierverifier_bytes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])$rl   r   c              
   C  sb   | j t}|s
d S tt|d u rd S z	t|d}|W S  ty0 } zW Y d }~d S d }~ww )Nz%Y-%m-%d)	headersr;   r   researchAPI_VERSION_REGEXr   strptimere   )rl   api_versiondtrs   r*   r*   r+   rn      s   rn   urlc                 C  s   t | jdv S )N>   httphttps)r   scheme)r   r*   r*   r+   is_http_url   s   r   valuec                 C  sh   t | tsdS |  } | dr| dd } | ddkrdS | dD ]}tt|tj	s1 dS q$dS )z@Checks if value looks like a JWT, does not do any extra parsing.FzBearer    Nrv      T)
rW   r2   strip
startswithcountr{   r   r   BASE64URL_REGEX
IGNORECASE)r   partr*   r*   r+   is_valid_jwt   s   

r   )r#   r$   r%   r!   )r#   r   r%   r,   )r#   r   r%   r2   )r5   r   r%   r   )r5   r   r%   r   )r5   r   r%   r   )r5   r   r%   r   )r5   r   r%   r    )r5   r   r%   r   )rS   r   r%   r2   )rd   re   r%   rf   )rd   re   r%   r   )ru   r2   r%   r   )r   )rl   r   )r   r2   r%   rf   )r   r2   r%   rf   )B
__future__r   r   r   r   r   r   r   r   r4   r   typingr   r   r   r	   r
   r   urllib.parser   httpxr   r   pydanticr   	constantsr   r   errorsr   r   r   r   r   typesr   r   r   r   r   r   r   r   r    r!   r   r&   r.   r3   r=   rA   rC   rP   rQ   rR   ra   rc   rg   rt   r   r   r   r   rn   r   r   r*   r*   r*   r+   <module>   sL     ,















;
	

