o
    i#                     @  sL  U 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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mZmZ d	d
l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Z3dbddZ4dcddZ5ddddZ6ded d!Z7dfd#d$Z8dgd&d'Z9dhd)d*Z:eee2e1f Z;d+e<d,< did.d/Z=djd1d2Z>ee+Z?dkd4d5Z@dld8d9ZAdmd<d=ZBdnd?d@ZCdodBdCZDG dDdE dEeZEee,ZFee-ZGdpdGdHZHdqdrdJdKZIdrdLdMZJdNZKdsdPdQZLdtdTdUZMdudYdZZNdvd\d]ZOdwd`daZPdS )x    )annotationsN)urlsafe_b64decode)datetime)AnyDictOptionalType	TypedDictTypeVarUnion)urlparse)HTTPStatusErrorResponse)	BaseModelTypeAdapterValidationError   )API_VERSION_HEADER_NAME!API_VERSIONS_2024_01_01_TIMESTAMP)AuthApiError	AuthErrorAuthInvalidJwtErrorAuthRetryableErrorAuthUnknownErrorAuthWeakPasswordError)AuthOtpResponseAuthResponseGenerateLinkPropertiesGenerateLinkResponseJWKSet	JWTHeader
JWTPayloadLinkIdentityResponseSessionSSOResponseUserUserResponse
TBaseModel)boundmodelType[TBaseModel]contentsUnion[str, bytes]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_jsonAttributeError	parse_raw)r)   r+    r1   S/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/supabase_auth/helpers.pymodel_validate0   s
   r3   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)   r1   r1   r2   r6   ;   
   
r6   strc                 C  r5   )zSCompatibility layer between pydantic 1 and 2 for dumping a model's contents as json)model_dump_jsonr/   jsonr8   r1   r1   r2   r;   E   r9   r;   responser   r   c                 C  sF   zt t| j}|j}W n ty   d }t t| j}Y nw t||dS )N)usersession)r3   r#   contentr>   r   r%   r   )r=   r?   r>   r1   r1   r2   parse_auth_responseO   s   
rA   r   c                 C     t t| jS N)r3   r   r@   r=   r1   r1   r2   parse_auth_otp_responseY      rE   r"   c                 C  rB   rC   )r3   r"   r@   rD   r1   r1   r2   parse_link_identity_response]   rF   rG   r   c                 C  s$   t t| j}t t| j}t||dS )N)
propertiesr>   )r3   r   r@   r%   r   )r=   rH   r>   r1   r1   r2   parse_link_responsea   s   rI   r   
UserParserr&   c                 C  s$   t | j}t|trt|dS |S )N)r>   )rJ   validate_jsonr@   
isinstancer%   r&   )r=   parsedr1   r1   r2   parse_user_responsej   s   rN   r$   c                 C  rB   rC   )r3   r$   r@   rD   r1   r1   r2   parse_sso_responseo   rF   rO   r   c                 C  s(   t | j}t|d dkrtd|S )Nkeysr   zJWKS is empty)JWKSetParserrK   r@   lenr   )r=   jwkr1   r1   r2   
parse_jwksv   s   rT   errorr   c                   s4   g d}d fddt  fdd|D t S )	N)msgmessageerror_descriptionrU   r-   boolc                   s   t  tr	|  v S t | S rC   )rL   r7   hasattr)prop)rU   r1   r2   filter   s   z!get_error_message.<locals>.filterc                 3  s     | ]}|r | V  qd S rC   r1   ).0r[   rU   r\   r1   r2   	<genexpr>   s    z$get_error_message.<locals>.<genexpr>)r-   rY   )nextr:   )rU   propsr1   r^   r2   get_error_message~   s   rb   HTTPStatusError | RuntimeErrorr   c              
   C  s  t | tstt| dS zg d}| jj|v r!tt| | jjW S | j }d }t| j}|rKt	|t
krKt |trK|rKt |dtrK|d}nt |tr_|r_t |dtr_|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 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  code
error_codeweak_passwordreasonsi  )rL   r   r   rb   r=   status_coder<   parse_response_api_versionr   	timestampr   r7   getr:   listrR   r   r   	Exceptionr   )rU   network_error_codesdatare   response_api_versioner1   r1   r2   handle_exception   s   





rr   	base64urlc                 C  s$   | dt |  d   }t|dS )N=   utf-8)rR   r   decoders   base64url_with_paddingr1   r1   r2   str_from_base64url   s   rz   bytesc                 C  s   | dt |  d   }t|S )Nrt   ru   )rR   r   rx   r1   r1   r2   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__r1   r1   r1   r2   r}      s
   
 r}   tokenc              
   C  s   |  d}t|dkrtdzt|d }t|d }t|d }W n tjy5 } ztd|d }~ww tt|t	|||d |d ddS )	N.   zInvalid JWT structurer   r      )r~   r   )r~   r   r   r   )
splitrR   r   r|   binasciiErrorr}   JWTHeaderParserrK   JWTPayloadParser)r   partsr~   r   r   rq   r1   r1   r2   
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 rC   )secretschoice)r]   _charsetr1   r2   r_      s    z)generate_pkce_verifier.<locals>.<genexpr>)
ValueErrorstringascii_lettersdigitsjoinrange)lengthr1   r   r2   generate_pkce_verifier   s   r   c                 C  s.   |  d}t| }t|ddS )z/Generate a code challenge from a PKCE verifier.rv      =)encodehashlibsha256digestbase64urlsafe_b64encoderstriprw   )code_verifierverifier_bytessha256_hashr1   r1   r2   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])$Optional[datetime]c                 C  sP   | j t}|s
d S tt|d u rd S z	t|d}|W S  ty'   Y d S w )Nz%Y-%m-%d)	headersrk   r   researchAPI_VERSION_REGEXr   strptimerm   )r=   api_versiondtr1   r1   r2   ri   
  s   ri   urlrY   c                 C  s   t | jdv S )N>   httphttps)r   scheme)r   r1   r1   r2   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   nowrj   )r   time_nowr1   r1   r2   validate_exp  s   r   valuec                 C  s&   zt |  W dS  ty   Y dS w )NTF)uuidUUIDr   )r   r1   r1   r2   is_valid_uuid'  s   
r   id
str | Nonec                 C  s,   | d u rt dt| st d|  dd S )NzInvalid id, id is NonezInvalid id, 'z' is not a valid uuid)r   r   )r   r1   r1   r2   validate_uuid/  s
   r   )r)   r*   r+   r,   r-   r'   )r)   r   r-   r4   )r)   r   r-   r:   )r=   r   r-   r   )r=   r   r-   r   )r=   r   r-   r"   )r=   r   r-   r   )r=   r   r-   r&   )r=   r   r-   r$   )r=   r   r-   r   )rU   r   r-   r:   )rU   rc   r-   r   )rs   r:   r-   r:   )rs   r:   r-   r{   )r   r:   r-   r}   )r   )r-   r:   )r=   r   r-   r   )r   r:   r-   rY   )r   r   r-   r   )r   r:   r-   rY   )r   r   r-   r   )Q
__future__r   r   r   r   r   r   r   r   r   r   typingr   r   r   r   r	   r
   r   urllib.parser   httpxr   r   pydanticr   r   r   	constantsr   r   errorsr   r   r   r   r   r   typesr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r3   r6   r;   rA   rE   rG   rI   rJ   r   rN   rO   rQ   rT   rb   rr   rz   r|   r}   r   r   r   r   r   r   ri   r   r   r   r   r1   r1   r1   r2   <module>   s\    $ 8














	
<


	



	