
    Th              
          d dl 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 d dlmZ d dlmZ d d	lmZmZmZ d d
lmZmZ  e	dgd          Z ed          ZdededefdZdedefdZ dedededeeef         fdZ!d"de"deedf         fdZ# ee           ee          fdedefdZ$ ee$          fdefd Z% ee%          fdefd!Z&dS )#    )datetime	timedeltatimezone)Union)JWTErrorjwt)CryptContext)DependsHTTPExceptionstatus)OAuth2PasswordBearer)Session)get_db)
SECRET_KEY	ALGORITHMACCESS_TOKEN_EXPIRE_MINUTES)UserUserRolebcryptauto)schemes
deprecatedz
auth/login)tokenUrlplain_passwordhashed_passwordreturnc                 8    t                               | |          S )z"Verify a password against its hash)pwd_contextverify)r   r   s     +/home/runner/workspace/app/services/auth.pyverify_passwordr!      s    no>>>    passwordc                 6    t                               |           S )zHash a password)r   hash)r#   s    r    get_password_hashr&      s    H%%%r"   dbemailc                     |                      t                                        t          j        |k                                              }|sdS t          ||j                  sdS |S )z)Authenticate a user by email and passwordF)queryr   filterr(   firstr!   r   )r'   r(   r#   users       r    authenticate_userr.      s^    88D>>  u!455;;==D u8T%9:: uKr"   Ndataexpires_deltac                 D   |                                  }|r"t          j        t          j                  |z   }n/t          j        t          j                  t          d          z   }|                    d|i           t          j        |t          t                    }|S )zCreate a JWT access token   )minutesexp)	algorithm)copyr   nowr   utcr   updater   encoder   r   )r/   r0   	to_encodeexpireencoded_jwts        r    create_access_tokenr>   #   s    		I Dhl++m;hl++i.C.C.CCeV_%%%*Y
iHHHKr"   tokenc                   K   t          t          j        dddi          }	 t          j        | t
          t          g          }|                    d          }||n# t          $ r |w xY w|	                    t                                        t          j        |k                                              }|||S )z#Get the current user from JWT tokenzCould not validate credentialszWWW-AuthenticateBearer)status_codedetailheaders)
algorithmssub)r   r   HTTP_401_UNAUTHORIZEDr   decoder   r   getr   r*   r   r+   r(   r,   )r?   r'   credentials_exceptionpayloadr(   r-   s         r    get_current_userrL   .   s      )0/#X.  
$*UJI;GGG[[''=''  $ $ $##$ 88D>>  u!455;;==D|##Ks   ;A A+current_userc                 :   K   | j         st          dd          | S )zGet the current active useri  zInactive userrB   rC   )	is_activer   rM   s    r    get_current_active_userrR   B   s+      ! EODDDDr"   c                 f    | j         t          j        k    rt          t          j        d          | S )zRequire admin rolezNot enough permissionsrO   )roler   ADMINr   r   HTTP_403_FORBIDDENrQ   s    r    require_adminrW   H   s:    HN**1+
 
 
 	
 r"   )N)'r   r   r   typingr   joser   r   passlib.contextr	   fastapir
   r   r   fastapi.securityr   sqlalchemy.ormr   app.core.databaser   app.core.configr   r   r   
app.modelsr   r   r   oauth2_schemestrboolr!   r&   r.   dictr>   rL   rR   rW    r"   r    <module>rf      su   2 2 2 2 2 2 2 2 2 2               ( ( ( ( ( ( 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 " " " " " " $ $ $ $ $ $ N N N N N N N N N N % % % % % % % % lH:&AAA %$l;;;?C ?# ?$ ? ? ? ?& & & & & &' #  tTzAR    	 	d 	5D3I 	 	 	 	 )0(>(>ggV\oo  # G    ( 8?w?O7P7P       (/w/F'G'G        r"   