o
    /h"$                     @  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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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mZ d
dlm Z 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/m0Z0m1Z1m2Z2 ededZ3d`ddZ4daddZ5dbddZ6dcdd Z7ddd"d#Z8ded%d&Z9dfd(d)Z:dgd+d,Z;dhd.d/Z<did2d3Z=djd5d6Z>djd7d8Z?dkd<d=Z@dld?d@ZAdmdBdCZBdndEdFZCG dGdH dHeZDdodJdKZEdpdMdNZFdOdP ZGdQZHdqdSdTZIdrdVdWZJdsd[d\ZKdtd^d_ZLdS )u    )annotationsN)urlsafe_b64decode)datetime)loads)AnyDictOptionalType	TypedDictTypeVarcast)urlparse)HTTPStatusErrorResponse)	BaseModel   )API_VERSION_HEADER_NAMEAPI_VERSIONSBASE64URL_REGEX)AuthApiError	AuthErrorAuthInvalidJwtErrorAuthRetryableErrorAuthUnknownErrorAuthWeakPasswordError)AuthOtpResponseAuthResponseGenerateLinkPropertiesGenerateLinkResponseJWKSet	JWTHeader
JWTPayloadLinkIdentityResponseSessionSSOResponseUserUserResponse
TBaseModel)bound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 r0   G/var/www/html/govbot/env/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)   r0   r0   r1   r4   8   
   
r4   strc                 C  r3   )zSCompatibility layer between pydantic 1 and 2 for dumping a model's contents as json)model_dump_jsonr-   jsonr6   r0   r0   r1   r9   B   r7   r9   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)sessionr?   )r,   r#   getr%   r   )r;   r@   	user_datar?   r0   r0   r1   parse_auth_responseL   s   
rC   r   c                 C  
   t t| S N)r,   r   r;   r0   r0   r1   parse_auth_otp_response\      
rG   r"   c                 C  rD   rE   )r,   r"   rF   r0   r0   r1   parse_link_identity_response`   rH   rI   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)rJ   rK   rL   rM   rN   c                   s"   i | ]\}}|t  vr||qS r0   )r4   ).0kv
propertiesr0   r1   
<dictcomp>m   s   " z'parse_link_response.<locals>.<dictcomp>)rS   r?   )r   rA   r,   r%   itemsr   )r;   r?   r0   rR   r1   parse_link_responsed   s   rV   r&   c                 C  s   d| vrd| i} t t| S )Nr?   )r,   r&   rF   r0   r0   r1   parse_user_responser   s   
rW   r$   c                 C  rD   rE   )r,   r$   rF   r0   r0   r1   parse_sso_responsex   rH   rX   responser   c                 C  s,   d| vst | d dkrtdd| d iS )Nkeysr   zJWKS is empty)lenr   )rY   r0   r0   r1   
parse_jwks|   s   r\   errorc                   s2   g d} fddt  fdd|D t S )N)msgmessageerror_descriptionr]   c                   s   t  tr	|  v S t | S rE   )
isinstancer5   hasattr)propr]   r0   r1   <lambda>   s   z#get_error_message.<locals>.<lambda>c                 3  s     | ]}|r | V  qd S rE   r0   )rO   rc   r]   filterr0   r1   	<genexpr>   s    z$get_error_message.<locals>.<genexpr>)nextr8   )r]   propsr0   rf   r1   get_error_message   s   rk   c                 C  s   t | tr| dd S d S )N
error_code)ra   r5   rA   rd   r0   r0   r1   get_error_code   s   rm   	exception	Exceptionboolc                 C  s
   t | tS rE   )ra   r   )rn   r0   r0   r1   looks_like_http_status_error   rH   rq   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coderl   weak_passwordreasonsi  )rq   r   rk   r   r   rY   status_coder:   parse_response_api_versionr   rr   r   rA   ra   r5   r8   listr[   r   r   ro   r   )rn   r]   network_error_codesr;   rl   response_api_versioner0   r0   r1   handle_exception   s   




r|   	base64urlc                 C  s$   | dt |  d   }t|dS )N=   utf-8)r[   r   decoder}   base64url_with_paddingr0   r0   r1   str_from_base64url   s   r   bytesc                 C  s   | dt |  d   }t|S )Nr~   r   )r[   r   r   r0   r0   r1   base64url_to_bytes   s   r   c                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )

DecodedJWTr    headerr!   payloadr   	signaturezDict[str, str]rawN)__name__
__module____qualname____annotations__r0   r0   r0   r1   r      s
   
 r   tokenc              	   C  s   |  d}t|dkrtd|D ]}tt|tjstdqttd
i t	t
|d td
i t	t
|d t|d |d |d dd	S )N.   zInvalid JWT structurezJWT not in base64url formatr   r      )r   r   )r   r   r   r   r0   )splitr[   r   rematchr   
IGNORECASEr   r    r   r   r!   r   )r   partspartr0   r0   r1   
decode_jwt   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 rE   )secretschoice)rO   _charsetr0   r1   rh      s    z)generate_pkce_verifier.<locals>.<genexpr>)
ValueErrorstringascii_lettersdigitsjoinrange)lengthr0   r   r1   generate_pkce_verifier   s   r   c                 C  s.   |  d}t| }t|ddS )z/Generate a code challenge from a PKCE verifier.r      =)encodehashlibsha256digestbase64urlsafe_b64encoderstripr   )code_verifierverifier_bytessha256_hashr0   r0   r1   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   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)	headersrA   r   r   searchAPI_VERSION_REGEXr   strptimero   )rY   api_versiondtr{   r0   r0   r1   rw     s   rw   urlc                 C  s   t | jdv S )N>   httphttps)r   scheme)r   r0   r0   r1   is_http_url  s   r   expintNonec                 C  s,   | st dt  }| |krt dd S )NzJWT has no expiration timezJWT has expired)r   r   nowrr   )r   time_nowr0   r0   r1   validate_exp#  s   r   valuec                 C  s&   zt |  W dS  ty   Y dS w )NTF)uuidUUIDr   )r   r0   r0   r1   is_valid_uuid,  s   
r   )r)   r*   r+   r'   )r)   r   r+   r2   )r)   r   r+   r8   )r;   r   r+   r   )r;   r   r+   r   )r;   r   r+   r"   )r;   r   r+   r   )r;   r   r+   r&   )r;   r   r+   r$   )rY   r   r+   r   )r]   r   r+   r8   )rn   ro   r+   rp   )rn   ro   r+   r   )r}   r8   r+   r8   )r}   r8   r+   r   )r   r8   r+   r   )r   )rY   r   )r   r8   r+   rp   )r   r   r+   r   )r   r8   r+   rp   )M
__future__r   r   r   r   r   r   r   r   r   r:   r   typingr   r   r   r	   r
   r   r   urllib.parser   httpxr   r   pydanticr   	constantsr   r   r   errorsr   r   r   r   r   r   typesr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r,   r4   r9   rC   rG   rI   rV   rW   rX   r\   rk   rm   rq   r|   r   r   r   r   r   r   r   rw   r   r   r   r0   r0   r0   r1   <module>   sV    $ 8
















;


	


	