o
    ̿Siv#                     @   sX  d dl 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 d dlmZmZ d dlZzd dlZeedsCG dd	 d	Ze e_W n	 eyM   Y nw d d
lm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!Z!d dl"m#Z# ddl$m%Z%m&Z&m'Z' e#  e Z(edgddZ)e!j*+dZ,dZ-dZ.dZ/eddZ0e1e2Z3G dd deZ4G dd deZ5G dd deZ6d=d e7d!efd"d#Z8d$e9d%e
j:d&e7fd'd(Z;ee
j<fd)ed%e
j:fd*d+Z=d)efd,d-Z>ee0fd$e9fd.d/Z?ee?fd0e@d1e7fd2d3ZAdee?fd4e@d1e7fd5d6ZBee?fd1e7fd7d8ZCG d9d: d:eZDG d;d< d<eZEdS )>    )DependsHTTPExceptionstatusRequest	APIRouter)	BaseModelEmailStr)database)get_database)datetime	timedeltaN	__about__c                   @   s   e Zd ZeeddZdS )_About__version__0N)__name__
__module____qualname__getattr_bcryptr    r   r   6/var/www/html/Trade-python/app/v1/dependencies/auth.pyr      s    r   )CryptContext)OAuth2PasswordBearer)BaseHTTPMiddleware)Response)load_dotenv   )PROTECTED_ROUTESUNPROTECTED_ROUTESOPEN_CORS_ROUTESbcryptauto)schemes
deprecatedJWT_SECRET_KEYHS256   usersz/auth/login)tokenUrlc                   @   s   e Zd ZU eed< eed< dS )	UserLoginemailpasswordN)r   r   r   r   __annotations__strr   r   r   r   r*   /      
 r*   c                   @   s   e Zd ZU eed< eed< dS )Tokenaccess_token
token_typeNr   r   r   r.   r-   r   r   r   r   r0   3   r/   r0   c                   @   s   e Zd ZU eed< dS )	TokenDatar+   Nr3   r   r   r   r   r4   7   s   
 r4   dataexpires_deltac                 C   sN   |   }|rt | }n	t ttd }|d|i tj|tt	d}|S )N)hoursexp)	algorithm)
copyr   utcnowr   TOKEN_EXPIRE_HOURSupdatepyjwtencode
SECRET_KEY	ALGORITHM)r5   r6   	to_encodeexpireencoded_jwtr   r   r   create_access_token;   s   rE   tokendbreturnc                 C   s   zt j| ttgddid}|d}|d u rttjddW n t jy-   ttjddw |t	 
d|i}t|d	 |d
< |d u rJttjdd|S )N
verify_expT)
algorithmsoptionssubCould not validate credentialsstatus_codedetailz3Could not validate credentials or token has expiredr+   _ididzUser not found)r>   decoder@   rA   getr   r   HTTP_401_UNAUTHORIZEDInvalidSignatureErrorCOLLECTION_NAMEfind_oner.   HTTP_404_NOT_FOUND)rF   rG   payloadr+   userr   r   r   verify_tokenF   s   
r\   requestc                 C   s   t | jj|}|| j_| jjS N)r\   staterF   current_user)r]   rG   r[   r   r   r   get_current_userdetailsW   s   ra   c                 C   s   | j jS r^   )r_   r`   )r]   r   r   r   get_current_userdetails_old\   s   rb   c                 C   sN   t tjdddid}ztj| ttgd}|d}|d u r|W |S    |)NrM   zWWW-AuthenticateBearer)rO   rP   headers)rJ   rL   )r   r   rU   r>   rS   r@   rA   rT   )rF   credentials_exceptionrZ   r+   r   r   r   get_current_user_   s   
rf   
account_idr`   c                 C   s   |d | krt tjdd|S )Nrg   zNo access to this account datarN   )r   r   rU   )rg   r`   r   r   r   get_current_user_within_accountp   s   rh   required_rolec                 C   s$   | dd}|| k rtddd|S )Nroler     $Access forbidden. Insufficient role.rN   rT   r   )ri   r`   	user_roler   r   r   has_permissionx   s   ro   c                 C   s(   d}|  dd}||krtddd| S )Nr   rj   r   rk   rl   rN   rm   )r`   ri   rn   r   r   r   has_superadmin_permission   s
   rp   c                   @   s4   e Zd ZdefddZedededefddZd	S )
AuthMiddlewarer]   c                    sn  t tjr(zt jpi d}t d jj	 j
| W n	 ty'   Y nw t fddtD r` j
dkrI jdddd	d
}t|dS | I d H } jd|jd< d|jd< |S t fddtD ru| I d H }|S t fddtD r jd}|st d ttjdd|r|dr|dd  }nttjdd| j_| I d H }|S )NAuthorizationz=AuthMiddleware request | path=%s method=%s has_auth_cookie=%sc                 3        | ]}  jj|V  qd S r^   path_matches_routeurlpath.0router]   selfr   r   	<genexpr>       z*AuthMiddleware.dispatch.<locals>.<genexpr>OPTIONSOrigintruezPOST, GET, DELETE, PUT, OPTIONSzAuthorization, Content-Type)Access-Control-Allow-Origin Access-Control-Allow-CredentialszAccess-Control-Allow-MethodszAccess-Control-Allow-Headers)rd   r   r   c                 3   rs   r^   rt   rx   r{   r   r   r}      r~   c                 3   rs   r^   rt   rx   r{   r   r   r}      r~   Token not present in requestz Token is not thererN   Bearer    Access is denied)loggerisEnabledForloggingDEBUGboolcookiesrT   debugrv   rw   method	Exceptionanyr    rd   r   r   r   errorr   r   rU   
startswithr_   rF   )r|   r]   	call_nexthas_auth_cookierd   responserF   r   r{   r   dispatch   sD   




zAuthMiddleware.dispatchrw   route_patternrH   c                 C   s    | ddd }tt|| S )N*z.*$)replacer   rematch)rw   r   patternr   r   r   ru      s   z!AuthMiddleware.path_matches_routeN)	r   r   r   r   r   staticmethodr.   r   ru   r   r   r   r   rq      s    4rq   c                   @   s   e Zd ZdefddZdS )AuthMiddleware_newr]   c                    s   t  fddtD r| I d H }|S t  fddtD rg jd}|s6td ttj	dd|rD|
drD|d	d  }nttj	d
dzt|t }| j_W n tyf   ttj	d
dw | I d H }|S )Nc                 3   rs   r^   rt   rx   r{   r   r   r}      r~   z2AuthMiddleware_new.dispatch_new.<locals>.<genexpr>c                 3   rs   r^   rt   rx   r{   r   r   r}      r~   rr   r   zToken is not thererN   r   r   r   )r   r   r   rd   rT   r   r   r   r   rU   r   r\   r	   get_mongo_dbr_   r`   )r|   r]   r   r   rF   r[   r   r{   r   dispatch_new   s(   
zAuthMiddleware_new.dispatch_newN)r   r   r   r   r   r   r   r   r   r      s    r   r^   )Ffastapir   r   r   r   r   pydanticr   r   app.dbr	   app.db.database_staticr
   r   r   r   r!   r   hasattrr   r   r   passlib.contextr   r   jwtr>   fastapi.securityr   starlette.middleware.baser   starlette.responsesr   osdotenvr   routesr   r   r    routerpwd_contextenvironrT   r@   rA   r<   rW   oauth2_scheme	getLoggerr   r   r*   r0   r4   dictrE   r.   MongoDBr\   r   ra   rb   rf   intrh   ro   rp   rq   r   r   r   r   r   <module>   s\    


;