o
    Ah)                     @   s  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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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Z*e+e,Z-G dd deZ.G dd deZ/G dd deZ0d:de1defdd Z2d!e3d"e
j4d#e1fd$d%Z5ee
j6fd&ed"e
j4fd'd(Z7d&efd)d*Z8ee*fd!e3fd+d,Z9ee9fd-e:d.e1fd/d0Z;dee9fd1e:d.e1fd2d3Z<ee9fd.e1fd4d5Z=G d6d7 d7eZ>G d8d9 d9eZ?dS );    )DependsHTTPExceptionstatusRequest	APIRouter)	BaseModelEmailStr)database)get_database)datetime	timedelta)CryptContextN)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)__name__
__module____qualname__r   __annotations__str r'   r'   4/var/www/html/moveengine/app/v1/dependencies/auth.pyr         
 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(   r*   "   r)   r*   c                   @   s   e Zd ZU eed< dS )	TokenDatar    Nr-   r'   r'   r'   r(   r.   &   s   
 r.   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)r/   r0   	to_encodeexpireencoded_jwtr'   r'   r(   create_access_token*   s   r?   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)r8   decoder:   r;   getr   r   HTTP_401_UNAUTHORIZEDInvalidSignatureErrorCOLLECTION_NAMEfind_oner&   HTTP_404_NOT_FOUND)r@   rA   payloadr    userr'   r'   r(   verify_token5   s   
rV   requestc                 C   s   t | jj|}|| j_| jjS N)rV   stater@   current_user)rW   rA   rU   r'   r'   r(   get_current_userdetailsF   s   r[   c                 C   s   | j jS rX   )rY   rZ   )rW   r'   r'   r(   get_current_userdetails_oldK   s   r\   c                 C   sN   t tjdddid}ztj| ttgd}|d}|d u r|W |S    |)NrG   zWWW-AuthenticateBearer)rI   rJ   headers)rD   rF   )r   r   rO   r8   rM   r:   r;   rN   )r@   credentials_exceptionrT   r    r'   r'   r(   get_current_userN   s   
r`   
account_idrZ   c                 C   s   |d | krt tjdd|S )Nra   zNo access to this account datarH   )r   r   rO   )ra   rZ   r'   r'   r(   get_current_user_within_account_   s   rb   required_rolec                 C   s$   | dd}|| k rtddd|S )Nroler     $Access forbidden. Insufficient role.rH   rN   r   )rc   rZ   	user_roler'   r'   r(   has_permissiong   s   ri   c                 C   s(   d}|  dd}||krtddd| S )Nr   rd   r   re   rf   rH   rg   )rZ   rc   rh   r'   r'   r(   has_superadmin_permissiono   s
   rj   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 )
AuthMiddlewarerW   c                    s@  t d j  jjdr| I d H S t fddtD rM jdkr6 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 r`| I d H S t fddtD r j	d}|std ttjdd|dr|dd  }nttjdd| j_| I d H }|S )NzAUTH TEST ::: z /v1/subscriptions/stripe-webhookc                 3        | ]}  jj|V  qd S rX   path_matches_routeurlpath.0routerW   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)r^   r{   r|   c                 3   rl   rX   rm   rq   rt   r'   r(   rv      rw   c                 3   rl   rX   rm   rq   rt   r'   r(   rv      rw   AuthorizationToken not present in requestz Token is not thererH   Bearer    Access is denied)printcookiesro   rp   
startswithanyr   methodr^   rN   r   r   r   loggererrorr   r   rO   rY   r@   )ru   rW   	call_nextr^   responser@   r'   rt   r(   dispatch   s:   





zAuthMiddleware.dispatchrp   route_patternrB   c                 C   s    | ddd }tt|| S )N*z.*$)replaceboolrematch)rp   r   patternr'   r'   r(   rn      s   z!AuthMiddleware.path_matches_routeN)	r"   r#   r$   r   r   staticmethodr&   r   rn   r'   r'   r'   r(   rk      s    .rk   c                   @   s   e Zd ZdefddZdS )AuthMiddleware_newrW   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   rl   rX   rm   rq   rt   r'   r(   rv      rw   z2AuthMiddleware_new.dispatch_new.<locals>.<genexpr>c                 3   rl   rX   rm   rq   rt   r'   r(   rv      rw   r}   r~   zToken is not thererH   r   r   r   )r   r   r   r^   rN   r   r   r   r   rO   r   rV   r	   get_mongo_dbrY   rZ   )ru   rW   r   r   r@   rU   r'   rt   r(   dispatch_new   s(   
zAuthMiddleware_new.dispatch_newN)r"   r#   r$   r   r   r'   r'   r'   r(   r      s    r   rX   )@fastapir   r   r   r   r   pydanticr   r   app.dbr	   app.db.database_staticr
   r   r   passlib.contextr   r   jwtr8   fastapi.securityr   starlette.middleware.baser   starlette.responsesr   loggingosdotenvr   routesr   r   r   routerpwd_contextenvironrN   r:   r;   r6   rQ   oauth2_scheme	getLoggerr"   r   r   r*   r.   dictr?   r&   MongoDBrV   r   r[   r\   r`   intrb   ri   rj   rk   r   r'   r'   r'   r(   <module>   sJ    

>5