Ë
    jqj 	  ã                   óÆ   — d dl Z d dlZd dl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mZmZ d dlmZ  e j                   e«      Zddedefd	„Zd
ededdfd„Zdededefd„Zy)é    N)ÚdatetimeÚ	timedeltaÚtimezone)ÚSession)Úget_settings)ÚPasswordResetTokenÚUserÚUserRole)Úhash_passwordÚlengthÚreturnc                 ój   ‡— t         j                  Šdj                  ˆfd„t        | «      D «       «      S )NÚ c              3   óH   •K  — | ]  }t        j                  ‰«      –— Œ y ­w)N)ÚsecretsÚchoice)Ú.0Ú_Úalphabets     €ú5/var/www/html/kelly-backend/app/services/email_otp.pyÚ	<genexpr>zgenerate_otp.<locals>.<genexpr>   s   øè ø€ ÐC±]°”7—>‘> (×+±]ùs   ƒ")ÚstringÚdigitsÚjoinÚrange)r   r   s    @r   Úgenerate_otpr      s%   ø€ Ü�}‰}€HØ�7‰7ÓC´U¸6´]ÓCÓCÐCó    Úto_emailÚotpc              ƒ   ó¬  K  — t        «       }|j                  st        j                  d| |«       y dd l}ddlm}m} ddlm	}  |«       }d|d<   |j                  |d<   | |d<   |j                  d	|› d
�«       	 |j                  ||j                  |j                  |j                  xs d |j                  xs d |j                   ¬«      ƒ d {  –—†  y 7 Œ# |$ r7}t        j                  d|«       t        j                  d| |«       Y d }~y d }~w|t"        f$ r7}t        j%                  d| «       t        j                  d| |«       Y d }~y d }~ww xY w­w)Nu5   SMTP not configured â€” password reset OTP for %s: %sr   )ÚSMTPAuthenticationErrorÚSMTPException)ÚEmailMessagezPassword reset OTPÚSubjectÚFromÚTozYour OTP is: z
It expires in 15 minutes.)ÚhostnameÚportÚusernameÚpasswordÚ	start_tlszHSMTP server rejected login (check SMTP_USER / SMTP_PASSWORD in .env): %sz8Password reset OTP for recipient %s (email not sent): %szSMTP send failed for %sz.Password reset OTP for %s (email not sent): %s)r   Ú	smtp_hostÚloggerÚwarningÚ
aiosmtplibÚaiosmtplib.errorsr!   r"   Úemail.messager#   Ú	smtp_fromÚset_contentÚsendÚ	smtp_portÚ	smtp_userÚsmtp_passwordÚsmtp_tlsÚOSErrorÚ	exception)	r   r   Úsettingsr/   r!   r"   r#   ÚmsgÚexcs	            r   Úsend_otp_emailr>      sE  è ø€ Ü‹~€HØ×ÒÜ�‰ÐNÐPXÐZ]Ô^ØãßHÝ*á
‹.€CØ)€Cˆ	�NØ×$Ñ$€Cˆ�KØ€Cˆ�IØ‡O�O�m C 5Ð(CÐDÔEðXØ�o‰oØØ×'Ñ'Ø×#Ñ#Ø×'Ñ'Ò/¨4Ø×+Ñ+Ò3¨tØ×'Ñ'ð ó 
÷ 	
ò 	
ùð #ò 

ä�‰ØVØô	
ô 	�‰ØFØØ÷	
ñ 	
ûð
 œ7Ð#ò XÜ×ÑÐ2°HÔ=Ü�‰ÐGÈÐSV×WÑWûðXüsU   ‚A6EÁ9AC ÃCÃC ÃEÃC ÃEÃ-DÄEÄEÄ-EÅEÅEÅEÚdbÚuserc                 óØ  — | j                  t        «      j                  t        j                  |j                  k(  t        j
                  j                  d«      «      j                  ddi«       t        «       }t        |j                  t        |«      t        j                  t        j                  «      t        d¬«      z   d¬«      }| j                  |«       | j!                  «        |S )zBInvalidate old tokens, create new OTP, return plain OTP for email.FÚusedTé   )Úminutes)Úuser_idÚotp_hashÚ
expires_atrB   )Úqueryr   ÚfilterrE   ÚidrB   Úis_Úupdater   r   r   Únowr   Úutcr   ÚaddÚcommit)r?   r@   r   Úrows       r   Úcreate_password_reset_flowrR   =   s¦   € à‡H�HÔÓ ×'Ñ'Ü×"Ñ" d§g¡gÑ-Ô/A×/FÑ/F×/JÑ/JÈ5Ó/Qóç�fˆf�dˆ^ÔÜ
‹.€CÜ
Ø—‘Ü˜sÓ#Ü—<‘<¤§¡Ó-´	À"Ô0EÑEØô	€Cð ‡F�Fˆ3„KØ‡I�I„KØ€Jr   )é   )Úloggingr   r   r   r   r   Úsqlalchemy.ormr   Ú
app.configr   Ú
app.modelsr   r	   r
   Úapp.securityr   Ú	getLoggerÚ__name__r-   ÚintÚstrr   r>   rR   © r   r   Ú<module>r^      s„   ðÛ Û Û ß 2Ñ 2å "å #ß 9Ñ 9Ý &à	ˆ×	Ñ	˜8Ó	$€ñD˜ð D Só Dð
&X 3ð &X¨Sð &X°Tó &XðR 7ð °$ð ¸3ô r   