Ë
    úÃîiÅ  ã                  ó˜   — U d Z ddlmZ 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 i Zded<   d	Zd
Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ux  
services/captcha_service.py â€” CAPTCHA Service
==============================================
Replaces the emoji-based AI captcha with a reliable math CAPTCHA.
Reasons:
  - Emoji grids are ambiguous and frustrating (what counts as a "vehicle"?)
  - OpenAI returns different emoji sets each time â€” hard to verify
  - Math challenges are unambiguous, instant, and work offline

Flow:
  1. GET  /api/auth/captcha/challenge  â†’ server generates math question, stores answer
  2. POST /api/auth/captcha/verify     â†’ candidate submits answer, server checks it
  3. On success â†’ issues a short-lived captcha_token (used in login)
é    )ÚannotationsN)ÚdatetimeÚ	timedeltaÚtimezone)Úsettings)Újson_dbzdict[str, dict]Ú_challengesé
   é   c                 óŒ  — t        j                  g d¢«      } | dk(  rmt        j                  dd«      }t        j                  dd«      }t        j                  ddg«      }|dk(  r	||kD  r||}}|dk(  r||z   n||z
  }d|› d	|› d	|› d
�}n­t        j                  ddg«      }|dk(  r;t        j                  dd«      }t        j                  dd«      }||z  }d|› d|› d
�}nVt        j                  dd«      }t        j                  dd«      }t        j                  dd«      }||z   |z   }d|› d|› d|› d
�}|t        |«      |dœS )zCGenerate a random arithmetic challenge. Returns {question, answer}.)Úeasyr   Úmediumr   é   é   é   Ú+Ú-zWhat is Ú Ú?ÚmulÚchainé	   u    Ã— é   r   é   z + )ÚquestionÚanswerÚ
answer_int)ÚrandomÚchoiceÚrandintÚstr)ÚlevelÚaÚbÚopÚansÚqÚvariantÚcs           úa/Users/priyanka/Documents/Gols_Ai_Dev/public_hub_candidate/people_hub/services/captcha_service.pyÚ_make_math_challenger+   #   sS  € ä�M‰MÒ4Ó5€Eà�‚Ü�N‰N˜1˜bÓ!ˆÜ�N‰N˜1˜bÓ!ˆÜ�]‰]˜C ˜:Ó&ˆØ�Š9˜˜QšØ�aˆqˆAØ˜sšˆq�1Šu¨¨Q©ˆØ�q�c˜˜2˜$˜a ˜s !Ð$‰ô —-‘- ¨Ð 0Ó1ˆØ�eÒÜ—‘˜q !Ó$ˆAÜ—‘˜q !Ó$ˆAØ�a‘%ˆCØ˜1˜#˜T !  AÐ&‰Aô —‘˜q !Ó$ˆAÜ—‘˜q !Ó$ˆAÜ—‘˜q !Ó$ˆAà�a‘%˜!‘)ˆCØ˜1˜#˜S   3 q c¨Ð+ˆAà¤S¨£X¸SÑAÐAó    c                 óÜ   — t        «       } t        j                  d«      }t        j                  t
        j                  «      t        t        ¬«      z   }| d   |dddœt        |<   |d| d   d	œS )
um   
    Generate a new math CAPTCHA challenge.
    Returns the question to the client â€” never the answer.
    é   )Úminutesr   Fr   )r   Ú
expires_atÚusedÚattemptsÚmathr   )Ú
session_idÚchallenge_typer   )
r+   ÚsecretsÚtoken_urlsafer   Únowr   Úutcr   Ú_EXPIRY_MINUTESr	   )Úchallenge_datar4   r0   s      r*   Úcreate_challenger<   C   sq   € ô
 *Ó+€NÜ×&Ñ& rÓ*€JÜ—‘œhŸl™lÓ+¬iÄÔ.PÑP€Jð % XÑ.Ø ØØñ	„K�
Ñð %Ø Ø(¨Ñ4ñð r,   c                óB   — t         j                  | d«       t        «       S )zs
    Generate a fresh challenge, invalidating the old one.
    Called when the user clicks the Refresh button.
    N)r	   Úpopr<   )r4   s    r*   Úrefresh_challenger?   [   s   € ô ‡O�O�J Ô%ÜÓÐr,   c                ó¦  — t        j                  t        j                  «      }t        j                  «       D ��cg c]  \  }}||d   kD  sŒ|‘Œ }}}|D ]  }t        j                  |d«       Œ t        j                  | «      }|sdddddœS ||d   kD  rt        j                  | d«       dddddœS |d   rddd	ddœS |j                  d
d«      dz   |d
<   |d
   t        kD  rt        j                  | d«       dddddœS t        |xs d«      j                  «       j                  «       }t        |d   «      j                  «       j                  «       }||k7  rt        |d
   z
  }	ddd|	› d�ddœS d|d<   t        j                  d«      }
t        j                  t         j"                  |
| dt        j$                  «       dœ«       d|
dddœS c c}}w )zU
    Verify the candidate's math answer.
    Returns {verified, token, message}.
    r0   NFzCChallenge expired or not found. Please click Refresh and try again.T)ÚverifiedÚtokenÚmessageÚrefreshz6Challenge expired. Please click Refresh for a new one.r1   z>This challenge was already used. Please refresh for a new one.r2   r   r   z6Too many attempts. Please refresh for a new challenge.Ú r   zIncorrect answer. z attempt(s) remaining.é    )Úcaptcha_tokenr4   rA   Ú
created_atu   Verification successful âœ“)r   r8   r   r9   r	   Úitemsr>   ÚgetÚ_MAX_ATTEMPTSr!   ÚstripÚlowerr6   r7   ÚdbÚinsertr   ÚSESSIONS_FILEÚnow_iso)r4   r   r8   ÚkÚvÚexpiredÚ	challengeÚ	submittedÚcorrectÚ	remainingrB   s              r*   Úverify_challengerY   e   s  € ô �,‰,”x—|‘|Ó
$€CÜ(×.Ñ.Ô0ÔJÑ0‘T�Q˜°C¸!¸L¹/Ó4IŠqÐ0€GÑJÛˆÜ�‰˜˜4Õ ð ô —‘ 
Ó+€IÙàØØ]Øñ	
ð 	
ð ˆY�|Ñ$Ò$Ü�‰˜
 DÔ)àØØPØñ	
ð 	
ð �ÒàØØXØñ	
ð 	
ð &ŸM™M¨*°aÓ8¸1Ñ<€IˆjÑà�Ñœ}Ò,Ü�‰˜
 DÔ)àØØPØñ	
ð 	
ô �F’L˜bÓ!×'Ñ'Ó)×/Ñ/Ó1€IÜ�I˜hÑ'Ó(×.Ñ.Ó0×6Ñ6Ó8€Gà�GÒÜ! I¨jÑ$9Ñ9ˆ	àØØ,¨Y¨KÐ7MÐNØñ	
ð 	
ð €IˆfÑÜ×!Ñ! "Ó%€Eä‡I�IŒh×$Ñ$ØØ#ØÜŸ™›ñ	'ô ð ØØ1Øñ	ð ùóE Ks   »GÁGc                óV   — t        j                  t        j                  | d¬«      }|duS )z;Check a captcha_token issued after successful verification.T)rG   rA   N)rN   Úfind_oner   rP   )rB   Úrecords     r*   Úvalidate_captcha_tokenr]   ¶   s%   € ä�[‰[œ×/Ñ/¸uÈtÔT€FØ˜ÐÐr,   )ÚreturnÚdict)r4   r!   r^   r_   )r4   r!   r   r!   r^   r_   )rB   r!   r^   Úbool)Ú__doc__Ú
__future__r   r6   r   Úoperatorr   r   r   Úconfigr   Úutilsr   rN   r	   Ú__annotations__r:   rK   r+   r<   r?   rY   r]   © r,   r*   Ú<module>rh      sW   ðòõ #Û Û Û ß 2Ñ 2Ý Ý ð  "€ˆ_Ó !à€Ø€óBó@ó0óNôbr,   