
    g                        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      Z,dZ-d%dZ.d&dZ/d'dZ0d(dZ1d)dZ2d*dZ3d+dZ4d,dZ5d-dZ6d.dZ7d.dZ8d/dZ9d0dZ:d1dZ;d2dZ<d  Z=d!Z>d3d"Z?d4d#Z@d5d$ZAy)6    )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}$)$c                f    	 | j                  |      S # t        $ r | j                  |      cY S w xY w)zcCompatibility layer between pydantic 1 and 2 for parsing an instance
    of a BaseModel from varied)model_validateAttributeError	parse_obj)modelcontentss     C/var/www/openai/venv/lib/python3.12/site-packages/gotrue/helpers.pyr%   r%   )   s6    )##H-- )x(()s    00c                b    	 | j                         S # t        $ r | j                         cY S w xY w)zUCompatibility layer between pydantic 1 and 2 for dumping a model's contents as a dict)
model_dumpr&   dictr(   s    r*   r,   r,   4   s1    !! zz|    ..c                b    	 | j                         S # t        $ r | j                         cY S w xY w)zSCompatibility layer between pydantic 1 and 2 for dumping a model's contents as json)model_dump_jsonr&   jsonr.   s    r*   r1   r1   >   s1    $$&& zz|r/   c                    d }d| v r'd| v r#d| v r| d   r| d   r| d   rt        t        |       }| j                  d|       }|rt        t        |      nd }t	        ||      S )Naccess_tokenrefresh_token
expires_inuser)sessionr7   )r%   r   getr    r   )datar8   	user_datar7   s       r*   parse_auth_responser<   H   sp    !%G$t#D  ! $/&I.7>$	*TDd33    c                "    t        t        |       S N)r%   r   r:   s    r*   parse_auth_otp_responserA   X   s    /400r=   c                "    t        t        |       S r?   )r%   r   r@   s    r*   parse_link_identity_responserC   \   s    .55r=   c                ^   t        | j                  d      | j                  d      | j                  d      | j                  d      | j                  d            }t        t        | j	                         D ci c]  \  }}|t        |      vs|| c}}      }t        ||      S c c}}w )Naction_link	email_otphashed_tokenredirect_toverification_type)rE   rF   rG   rH   rI   )
propertiesr7   )r   r9   r%   r    itemsr,   r   )r:   rJ   kvr7   s        r*   parse_link_responserN   `   s    'HH]+((;'XXn-HH]+((#67J 

P1J9O0Oq!tPD  :DAA Qs   9B)B)c                2    d| vrd| i} t        t        |       S )Nr7   )r%   r!   r@   s    r*   parse_user_responserP   n   s     T~,--r=   c                "    t        t        |       S r?   )r%   r   r@   s    r*   parse_sso_responserR   t   s    +t,,r=   c                V     g d} fdt         fd|D        t                     S )N)msgmessageerror_descriptionerrorc                D    t        t              r| v S t        |       S r?   )
isinstancer-   hasattr)proprW   s    r*   <lambda>z#get_error_message.<locals>.<lambda>z   s"    #E40JgeT6JJr=   c              3  :   K   | ]  } |      s|     y wr?    ).0r[   rW   filters     r*   	<genexpr>z$get_error_message.<locals>.<genexpr>}   s     ?&,ts   
)nextstr)rW   propsr`   s   ` @r*   get_error_messagere   x   s(    <EF ??ULLr=   c                J    t        | t              r| j                  dd       S d S )N
error_code)rY   r-   r9   )rW   s    r*   get_error_coderh      s!    ,6ud,C599\4(MMr=   c                "    t        | t              S r?   )rY   r   )	exceptions    r*   looks_like_http_status_errorrk      s    i11r=   c                   t        |       st        t        |       d      S t        t        |       }	 g d}|j
                  j                  |v r)t        t        |      |j
                  j                        S |j
                  j                         }d }t        |j
                        }|r}t        j                  |      t        j                  d      j                  d      k\  rCt        |t              r3|r1t        |j                  d      t              r|j                  d      }nBt        |t              r2|r0t        |j                  d      t              r|j                  d      }|t        |t              r|r t        |j                  d      t              r|j                  d      rt        |j                  d      t               rt#        |j                  d            rt%        t        |      |j
                  j                  |j                  d      j                  d            S |dk(  rJt%        t        |      |j
                  j                  |j                  di       j                  di             S t'        t        |      |j
                  j                  xs d	|      S # t(        $ r}t+        t        |      |      cY d }~S d }~ww xY w)
Nr   )i  i  i  z
2024-01-01	timestampcoderg   weak_passwordreasonsi  )rk   r   re   r   r   responsestatus_coder2   parse_response_api_versionr   rm   r   r9   rY   r-   rc   listlenr   r   	Exceptionr   )rj   rW   network_error_codesr:   rg   response_api_versiones          r*   handle_exceptionrz      sD   '	2!"3I">BB),E4=->>%%)<<%!%(%..*D*D  ~~""$
9%..I !""#78-11+>?4&488F+S1&)JtT"t
488L;QSV0W,/J4&txx8$?HH_-txx8$?12,%d+NN..HH_-11)< 
 ?*(!$'**"-11)R@  d#NN&&-#
 	

  = 1% 8!<<=s2   AJ- 7F8J- 0AJ- ?-J- -	K6K
KKc                    | j                  d      }t        |      dk7  rt        d      |d   }|dt        |       dz  z  z   }t        t	        |      j                  d            S )N.   z%JWT is not valid: not a JWT structurer   =   utf-8)splitru   
ValueErrorr   r   decode)tokenparts	base64urlbase64url_with_paddings       r*   decode_jwt_payloadr      sj    KKE
5zQ@AAaI 'Y!0C)DD"#9:AA'JKKr=   c                    | dk  s| dkD  rt        d      t        j                  t        j                  z   dz   dj	                  f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  H   K   | ]  }t        j                          y wr?   )secretschoice)r_   _charsets     r*   ra   z)generate_pkce_verifier.<locals>.<genexpr>   s     BMq7>>'*Ms   ")r   stringascii_lettersdigitsjoinrange)lengthr   s    @r*   generate_pkce_verifierr      sP    {fslUVV ""V]]2V;G77BE&MBBBr=   c                    | j                  d      }t        j                  |      j                         }t	        j
                  |      j                  d      j                  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_hashs      r*   generate_pkce_challenger      sR     #))'2N..0779K##K077=DDWMMr=   z9^2[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$c                    | j                   j                  t              }|sy t        j                  t
        |      y 	 t        j                  |d      }|S # t        $ r
}Y d }~y d }~ww xY w)Nz%Y-%m-%d)	headersr9   r   researchAPI_VERSION_REGEXr   strptimerv   )rq   api_versiondtry   s       r*   rs   rs      sc    ""&&'>?K	yy"K08{J7	 s   A 	A*%A*c                0    t        |       j                  dv S )N>   httphttps)r   scheme)urls    r*   is_http_urlr      s    C=#444r=   c                   t        | t              sy| j                         } | j                  d      r| dd } | j	                  d      dk7  ry| j                  d      D ]-  }t        j                  t        |t        j                        r- y y)z@Checks if value looks like a JWT, does not do any extra parsing.FzBearer    Nr|      T)
rY   rc   strip
startswithcountr   r   r   BASE64URL_REGEX
IGNORECASE)valueparts     r*   is_valid_jwtr      s|    eS! KKME 	"ab	 {{31C yy$> ! r=   )r(   zType[TBaseModel]returnr"   )r(   r   r   zDict[str, Any])r(   r   r   rc   )r:   r   r   r   )r:   r   r   r   )r:   r   r   r   )r:   r   r   r   )r:   r   r   r!   )r:   r   r   r   )rW   r   r   rc   )rj   rv   r   bool)rj   rv   r   r   )r   rc   r   r   )@   )rq   r   )r   rc   r   r   )r   rc   r   r   )B
__future__r   r   r   r   r   r   r   r   r2   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,   r1   r<   rA   rC   rN   rP   rR   re   rh   rk   rz   r   r   r   r   rs   r   r   r^   r=   r*   <module>r      s    "   	   $   ; ; ! +  < 
 
 
 \3
H)4 16B.-MN28=vLCN Q  5r=   