Ë
    ˆuOj›	  ã            
       ó  — d dl Z d dlmZmZ d dlmZmZmZ d dlmZm	Z	m
Z
mZ dedef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edeeef   fd„Zdedeeef   fd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zy)é    N)ÚJWTErrorÚjwt)ÚdatetimeÚ	timedeltaÚtimezone)ÚACCESS_TOKEN_EXPIRE_MINUTESÚ	ALGORITHMÚREFRESH_TOKEN_EXPIRE_DAYSÚ
SECRET_KEYÚpasswordÚreturnc                 óŽ   — t        j                  | j                  d«      t        j                  «       «      j	                  d«      S ©Nzutf-8)ÚbcryptÚhashpwÚencodeÚgensaltÚdecode)r   s    ú8/var/www/html/sergio/sergio-backend/app/core/security.pyÚhash_passwordr      s4   € Ü�=‰=Ø�‰˜Ó Ü�‰Óó÷ �fˆWƒoðó    ÚplainÚhashedc                 ój   — t        j                  | j                  d«      |j                  d«      «      S r   )r   Úcheckpwr   )r   r   s     r   Úverify_passwordr      s+   € Ü�>‰>Ø�‰�WÓØ�‰�gÓóð r   Úexpirec                 óŒ   — | j                   € | j                  t        j                  ¬«      } t	        | j                  «       «      S )z{
    Return expiry as unix timestamp (seconds).

    Frontend integrations prefer numeric timestamps over ISO strings.
    )Útzinfo)r   Úreplacer   ÚutcÚintÚ	timestamp)r   s    r   Ú_format_expiryr$      s6   € ð ‡}�}ÐØ—‘¤x§|¡|�Ó4ˆÜˆv×ÑÓ!Ó"Ð"r   ÚdataÚexpires_deltaÚ
token_typec                 óÒ   — | j                  «       }t        j                  «       |z   }|j                  ||dœ«       t	        j
                  |t        t        ¬«      }|t        |«      fS )N)ÚexpÚtype)Ú	algorithm)	Úcopyr   ÚutcnowÚupdater   r   r   r	   r$   )r%   r&   r'   Ú	to_encoder   Útokens         r   Ú_encode_tokenr1   &   sS   € Ø—	‘	“€IÜ�_‰_Ó Ñ.€FØ×Ñ˜V¨ZÑ8Ô9Ü�J‰J�y¤*¼	ÔB€EØ”. Ó(Ð(Ð(r   c                 ó8   — t        | t        t        ¬«      d«      S )N)ÚminutesÚaccess)r1   r   r   ©r%   s    r   Úcreate_access_tokenr6   .   s   € ÜØÜÔ5Ô6Øóð r   c                 ó8   — t        | t        t        ¬«      d«      S )N)ÚdaysÚrefresh)r1   r   r
   r5   s    r   Úcreate_refresh_tokenr:   6   s   € ÜØÜÔ0Ô1Øóð r   r0   c                 óD   — t        j                  | t        t        g¬«      S )N)Ú
algorithms)r   r   r   r	   )r0   s    r   Údecode_tokenr=   >   s   € Ü�:‰:�eœZ´Y°KÔ@Ð@r   c                 ó\   — t        | «      }|j                  d«      }|dvrt        d«      ‚|S )Nr*   )Nr4   zInvalid access token type©r=   Úgetr   )r0   Úpayloadr'   s      r   Údecode_access_tokenrB   B   s4   € Ü˜5Ó!€GØ—‘˜VÓ$€JØÐ)Ñ)ÜÐ2Ó3Ð3Ø€Nr   c                 óZ   — t        | «      }|j                  d«      dk7  rt        d«      ‚|S )Nr*   r9   zInvalid refresh token typer?   )r0   rA   s     r   Údecode_refresh_tokenrD   J   s.   € Ü˜5Ó!€GØ‡{�{�6Ó˜iÒ'ÜÐ3Ó4Ð4Ø€Nr   c                 óP   — t        | «      \  }}t        | «      \  }}||dœ||dœdœS )zEBuild access + refresh tokens with expiry metadata for API responses.)r0   Úexpires)r4   r9   )r6   r:   )r%   Úaccess_tokenÚaccess_expiresÚrefresh_tokenÚrefresh_expiress        r   Úcreate_token_pairrK   Q   s:   € ä#6°tÓ#<Ñ €L�.Ü%9¸$Ó%?Ñ"€M�?à(°^ÑDØ*°ÑGñð r   )r   Újoser   r   r   r   r   Úapp.core.configr   r	   r
   r   Ústrr   Úboolr   r"   r$   ÚdictÚtupler1   r6   r:   r=   rB   rD   rK   © r   r   Ú<module>rS      s  ðÛ ß ß 2Ñ 2÷ó ð˜Cð  Có ð˜3ð ¨ð °ó ð#˜8ð #¨ó #ð)˜ð )¨Yð )ÀCð )ÈEÐRUÐWZÐRZÉOó )ð˜dð  u¨S°#¨X¡ó ð˜tð ¨¨c°3¨h©ó ðA˜ð A ó Að˜sð  tó ð ð ¨ó ð˜Dð  Tô r   