
    Ci              	          d 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	 ddl
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 ddlmZ ddlmZ ddlmZ  e	dgd      Z e       Z G d de      Z e       Z de!de!de"fdZ#de!de!fdZ$d'de%dee   de!fdZ&de!de%fdZ' ee       ee      dfd ed!ed"e"defd#Z( ee       ee      fd ed!edefd$Z) ee        ee      fd ee   d!edee   fd%Z* ee       ee      fd ed!edefd&Z+y)(uE   
Utilitaires de sécurité pour l'authentification et l'autorisation
    )datetime	timedelta)Optional)JWTErrorjwt)CryptContext)DependsHTTPExceptionstatus)
HTTPBearerHTTPAuthorizationCredentials)Request)Session)settings)get_db)User)Partnerbcryptauto)schemes
deprecatedc                   .     e Zd Zdedee   f fdZ xZS )OptionalHTTPBearerrequestreturnc                 ^   K   	 t         |   |       d {   S 7 # t        $ r Y y w xY wwN)super__call__r
   )selfr   	__class__s     9/home/www/lebenam.kofcorporation.com/app/core/security.pyr   zOptionalHTTPBearer.__call__   s3     	)'2222 		s(   -  - 	*-*-)__name__
__module____qualname__r   r   r   r   __classcell__)r!   s   @r"   r   r      s!    g (;W2X      r   plain_passwordhashed_passwordr   c                 .    t         j                  | |      S )u.   Vérifie si le mot de passe correspond au hash)pwd_contextverify)r(   r)   s     r"   verify_passwordr-      s    no>>r'   passwordc                 ,    t         j                  |       S )u"   Génère le hash d'un mot de passe)r+   hash)r.   s    r"   get_password_hashr1   "   s    H%%r'   Ndataexpires_deltac                 F   | j                         }|rt        j                         |z   }n/t        j                         t        t        j
                        z   }|j                  d|i       t        j                  |t        j                  t        j                        }|S )u   Crée un token JWT)minutesexp)	algorithm)copyr   utcnowr   r   ACCESS_TOKEN_EXPIRE_MINUTESupdater   encode
SECRET_KEY	ALGORITHM)r2   r3   	to_encodeexpireencoded_jwts        r"   create_access_tokenrB   &   ss    		I"]2"Yx7[7[%\\eV_%**Y(;(;xGYGYZKr'   tokenc                     	 t        j                  | t        j                  t        j                  g      }|S # t
        $ r t        t        j                  d      w xY w)u   Décode un token JWT)
algorithmsCould not validate credentialsstatus_codedetail)	r   decoder   r=   r>   r   r
   r   HTTP_401_UNAUTHORIZED)rC   payloads     r"   decode_tokenrM   2   sU    
**UH$7$7XEWEWDXY 
443
 	

s	   69 %ATcredentialsdb	checkTypec                    K   | j                   }t        |      }|j                  d      }|j                  d      }t        d|       |&t        d       t	        t
        j                  d      |dk(  r+|dk7  r&t        d	       t	        t
        j                  d      |j                  t              j                  t        j                  |k(        j                         }||j                  st	        t
        j                  d
      |S w)u/   Récupère l'utilisateur actuellement connectésubtypeu?   🚀 ~ file: security.py ~ line 75 ~ get_current_user ~ user_idzuser_id not foundrF   rG   Tuserzis not userzUser not found or inactive)rN   rM   getprintr
   r   rK   queryr   filteridfirst	is_active)rN   rO   rP   rC   rL   user_id	user_typerT   s           r"   get_current_userr^   =   s      ##E5!G;;u%G[[(I	
KWU!"443
 	

 DY&0m443
 	

 88D>  G!34::<D|4>>44/
 	

 Ks   DDc                   K   | j                   }t        |      }|j                  d      }|j                  d      }||dk7  rt        t        j
                  d      |j                  t              j                  t        j                  |k(        j                         }||j                  st        t        j
                  d      |S w)u/   Récupère le partenaire actuellement connectérR   rS   partnerrF   rG   zPartner not found or inactive)rN   rM   rU   r
   r   rK   rW   r   rX   rY   rZ   r[   )rN   rO   rC   rL   
partner_idr]   r`   s          r"   get_current_partnerrb   b   s     
 ##E5!Gkk%(J[[(IY)3443
 	

 hhw&&wzzZ'?@FFHGg//442
 	

 Ns   C
Cc                 Z  K   | sy| j                   }	 t        |      }|j                  d      }|j                  d      }||dk7  ry|j	                  t
              j                  t
        j                  |k(        j                         }||j                  sy|S # t        $ r Y yw xY ww)uR   Récupère l'utilisateur actuellement connecté, ou None si non connecté/invalideNrR   rS   rT   )
rN   rM   r
   rU   rW   r   rX   rY   rZ   r[   )rN   rO   rC   rL   r\   r]   rT   s          r"   get_optional_userrd   |   s     
 ##Eu% ;;u%G[[(I)v-88D>  G!34::<D|4>>K  s(   B+B A>B+	B(%B+'B((B+c                    K   t        | |d       d{   }|j                  st        t        j                  d      |S 7 -w)u2   Récupère l'administrateur actuellement connectéFNzNot enough permissionsrG   )r^   is_adminr
   r   HTTP_403_FORBIDDEN)rN   rO   rT   s      r"   get_current_adminrh      sE     
 "+r599D==11+
 	

 K :s   AA.Ar   ),__doc__r   r   typingr   joser   r   passlib.contextr   fastapir	   r
   r   fastapi.securityr   r   starlette.requestsr   sqlalchemy.ormr   app.core.configr   app.db.sessionr   app.models.userr   app.models.partnerr   r+   securityr   optional_securitystrboolr-   r1   dictrB   rM   r^   rb   rd   rh    r'   r"   <module>r{      s   )   ( 2 2 E & " $ !   &H:&A<  '( ?C ?# ?$ ?& & &
d 
8I3F 
RU 
	
 	
 	
 180A&/#-## # 
	#L 180A&/- 6 ;BBS:T&/67 d^6 180A&/- 
r'   