
    XSh1              
          d dl m Z mZmZ d dlmZ d dl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  ej        d          Zes ed          dZd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)UnionN)JWTErrorjwt)CryptContext)DependsHTTPExceptionstatus)OAuth2PasswordBearer)Session)get_db)UserSESSION_SECRETzGSESSION_SECRET environment variable is required for production securityHS256   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/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!   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   encode
SECRET_KEY	ALGORITHM)r.   r/   	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_userrM   5   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rC   rD   )	is_activer   )rN   s    r   get_current_active_userrR   I   s+      ! EODDDDr!   c                 h    ddl m} | j        |j        k    rt	          t
          j        d          | S )zRequire admin roler   )UserRolezNot enough permissionsrP   )modelsrT   roleADMINr   r   HTTP_403_FORBIDDEN)rN   rT   s     r   require_adminrY   O   sL    HN**1+
 
 
 	
 r!   )N)(r   r   r   typingr   osjoser   r   passlib.contextr	   fastapir
   r   r   fastapi.securityr   sqlalchemy.ormr   databaser   rU   r   getenvr:   
ValueErrorr;   ACCESS_TOKEN_EXPIRE_MINUTESr   oauth2_schemestrboolr    r%   r-   dictr?   rM   rR   rY    r!   r   <module>rj      s   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 " " " " " "             RY'((
 `
*^
_
__	   lH:&AAA %$l;;;?C ?# ?$ ? ? ? ?& & & & & &' #  tTzAR    	 	d 	5D3I 	 	 	 	 )0(>(>ggV\oo  # G    ( 8?w?O7P7P       (/w/F'G'G        r!   