§
    éƒtj^  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ  ed
¬¦  «        Zd'd„Zd(d„Zd)d„Zd*d„Ze G d„ d¦  «        ¦   «         Zd+d„Zd,d„Z 	 d-d.d#„Z!d/d%„Z"d0d&„Z#dS )1u;   SaaS user auth â€” password hashing + JWT with org context.é    )ÚannotationsN)Ú	dataclass)Ú	AnnotatedÚAny)ÚDependsÚHeaderÚHTTPExceptionÚstatus)ÚHTTPAuthorizationCredentialsÚ
HTTPBearer)Úcreate_access_tokenÚdecode_token)ÚdbF)Ú
auto_errorÚpasswordÚstrÚreturnc                óÔ   — t          j        d¦  «        }t          j        d|                      ¦   «         |                     ¦   «         d¦  «                             ¦   «         }d|› d|› �S )Né   Úsha256é@ úpbkdf2:ú:)ÚsecretsÚ	token_hexÚhashlibÚpbkdf2_hmacÚencodeÚhex)r   ÚsaltÚdigests      ú-/var/www/html/CA-Chatbot/app/saas/security.pyÚhash_passwordr#      s\   € åÔ˜RÑ Ô €DÝÔ  ¨8¯?ª?Ñ+<Ô+<¸d¿kºk¹m¼mÈWÑUÔU×YÒYÑ[Ô[€FØ$�TÐ$Ð$˜FÐ$Ð$Ð$ó    Úpassword_hashÚboolc                ó˜  — |                      d¦  «        r||                     dd¦  «        \  }}}t          j        d|                      ¦   «         |                     ¦   «         d¦  «                             ¦   «         }t          j        ||¦  «        S 	 ddlm	}  |dgd	¬
¦  «         
                    | |¦  «        S # t          $ r Y dS w xY w)Nr   r   é   r   r   r   )ÚCryptContextÚbcryptÚauto)ÚschemesÚ
deprecatedF)Ú
startswithÚsplitr   r   r   r   ÚhmacÚcompare_digestÚpasslib.contextr)   ÚverifyÚ	Exception)r   r%   Ú_r    r!   Úcheckr)   s          r"   Úverify_passwordr7      sÜ   € Ø×Ò 	Ñ*Ô*ð 2Ø'×-Ò-¨c°1Ñ5Ô5‰ˆˆ4�ÝÔ# H¨h¯oªoÑ.?Ô.?ÀÇÂÁÄÐPWÑXÔX×\Ò\Ñ^Ô^ˆÝÔ" 5¨&Ñ1Ô1Ð1ðØ0Ð0Ð0Ð0Ð0Ð0àˆ| X J¸6ÐBÑBÔB×IÒIÈ(ÐTaÑbÔbÐbøÝð ð ð Øˆuˆuðøøøs   Â'B; Â;
C	ÃC	Úraw_keyc                ór   — t          j        |                      ¦   «         ¦  «                             ¦   «         S ©N)r   r   r   Ú	hexdigest)r8   s    r"   Úhash_api_keyr<   (   s(   € ÝŒ>˜'Ÿ.š.Ñ*Ô*Ñ+Ô+×5Ò5Ñ7Ô7Ð7r$   útuple[str, str, str]c                 óh   — dt          j        d¦  «        › �} | dd…         }| |t          | ¦  «        fS )z Return (full_key, prefix, hash).Úsk_live_é    Nr   )r   Útoken_urlsafer<   )ÚrawÚprefixs     r"   Úgenerate_api_keyrD   ,   s<   € à
0•WÔ*¨2Ñ.Ô.Ð
0Ð
0€CØ��"�ŒX€FØ�� SÑ)Ô)Ð)Ð)r$   c                  ót   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   dS )ÚAuthContextr   Úuser_idÚemailz
str | NoneÚ	full_nameÚorg_idÚorg_nameÚorg_slugÚroleÚkb_modeÚplanÚauth_viaN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r$   r"   rF   rF   3   sm   € € € € € € à€L€L�LØ€J€J�JØÐÐÑØ€K€K�KØ€M€M�MØ€M€M�MØ€I€I�IØ€L€L�LØ€I€I�IØ€M€M�M€M€Mr$   rF   Úuserúdict[str, Any]ÚorgrM   c                óð   — | d         | d         |                       d¦  «        |d         |d         |                      d¦  «        pd||                      d¦  «        pd|                      d	¦  «        pd
ddœ
S )NÚidrH   rI   ÚnameÚslugÚ rN   ÚtenantrO   ÚfreerV   )
ÚsubrH   rI   rJ   rK   rL   rM   rN   rO   Útyp)Úget©rV   rX   rM   s      r"   Ú_user_token_payloadrd   A   s|   € ð �DŒzØ�g”Ø—X’X˜kÑ*Ô*Ø�d”)Ø˜”KØ—G’G˜F‘O”OÐ) rØØ—7’7˜9Ñ%Ô%Ð1¨Ø—’˜‘”Ð) 6Øðð ð r$   c                ó>   — t          t          | ||¦  «        ¦  «        S r:   )r   rd   rc   s      r"   Úissue_user_tokenrf   Q   s   € ÝÕ2°4¸¸dÑCÔCÑDÔDÐDr$   ÚcredentialsúFAnnotated[HTTPAuthorizationCredentials | None, Depends(bearer_scheme)]Ú	x_api_keyú0Annotated[str | None, Header(alias='X-API-Key')]c                óŒ   — |rt          |¦  «        S | rt          | j        ¦  «        S t          t          j        dddi¬¦  «        ‚)z'Require either user JWT or org API key.zAuthentication requiredzWWW-AuthenticateÚBearer)Ústatus_codeÚdetailÚheaders)Ú_auth_from_api_keyÚ_auth_from_jwtrg   r	   r
   ÚHTTP_401_UNAUTHORIZED)rg   ri   s     r"   Úget_auth_contextrs   U   s[   € ð
 ð -Ý! )Ñ,Ô,Ð,Øð 7Ý˜kÔ5Ñ6Ô6Ð6Ý
ÝÔ0Ø(Ø# XÐ.ðñ ô ð r$   Útokenc                óú  — 	 t          | ¦  «        }n$# t          $ r}t          dd¬¦  «        |‚d }~ww xY w|                     d¦  «        dk    s|                     d¦  «        s*|                     d¦  «        dk    rt          dd¬¦  «        ‚t	          |                     d	¦  «        pd
¦  «        }t	          |                     d¦  «        pd
¦  «        }|r|st          dd¬¦  «        ‚|                     d¦  «        �r|                     d¦  «        �öt          |t	          |                     d¦  «        ¦  «        |                     d¦  «        |t	          |                     d¦  «        pd
¦  «        t	          |                     d¦  «        pd
¦  «        t	          |                     d¦  «        pd¦  «        t	          |                     d¦  «        pd¦  «        t	          |                     d¦  «        pd¦  «        d¬¦
  «
        S ddlm}  |¦   «         5 }|                     d|f¦  «         	                    ¦   «         }|                     d|f¦  «         	                    ¦   «         }|                     d||f¦  «         	                    ¦   «         }	d d d ¦  «         n# 1 swxY w Y   |r|r|	st          dd¬¦  «        ‚t          |¦  «        t          |¦  «        t          |	¦  «        }}}
t          |
d         |
d         |
                     d¦  «        |d         |d         |                     d¦  «        pd
|d         |                     d¦  «        pd|                     d¦  «        pdd¬¦
  «
        S ) Né‘  zInvalid or expired token©rm   rn   ra   ÚadminrJ   rV   zUser token requiredr`   r]   zInvalid sessionrH   rK   rI   rL   rM   ÚmemberrN   r^   rO   r_   Újwt©
rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   )Úget_connectionz SELECT * FROM users WHERE id = ?zSELECT * FROM orgs WHERE id = ?z:SELECT * FROM memberships WHERE user_id = ? AND org_id = ?rZ   r[   r\   )r   r4   r	   rb   r   rF   Úapp.databaser|   ÚexecuteÚfetchoneÚdict)rt   ÚpayloadÚexcrG   rJ   r|   ÚconnrV   rX   Ú
membershipÚuser_dÚorg_dÚmem_ds                r"   rq   rq   e   s¼  € ðYÝ˜uÑ%Ô%ˆˆøÝð Yð Yð YÝ¨Ð4NÐOÑOÔOÐUXÐXøøøøðYøøøð ‡{‚{�5ÑÔ˜WÒ$Ð$¨G¯KªK¸Ñ,AÔ,AÐ$à�;Š;�uÑÔ Ò'Ð'Ý¨CÐ8MÐNÑNÔNÐNå�'—+’+˜eÑ$Ô$Ð*¨Ñ+Ô+€GÝ�—’˜XÑ&Ô&Ð,¨"Ñ-Ô-€FØð G˜&ð GÝ¨Ð4EÐFÑFÔFÐFð ‡{‚{�7ÑÔñ 
 §¢¨JÑ 7Ô 7Ð CÝØÝ�g—k’k 'Ñ*Ô*Ñ+Ô+Ø—k’k +Ñ.Ô.ØÝ˜Ÿš ZÑ0Ô0Ð6°BÑ7Ô7Ý˜Ÿš ZÑ0Ô0Ð6°BÑ7Ô7Ý�W—[’[ Ñ(Ô(Ð4¨HÑ5Ô5Ý˜Ÿš IÑ.Ô.Ð:°(Ñ;Ô;Ý�W—[’[ Ñ(Ô(Ð2¨FÑ3Ô3Øð
ñ 
ô 
ð 	
ð ,Ð+Ð+Ð+Ð+Ð+à	ˆÑ	Ô	ð ˜TØ�|Š|Ð>ÀÀ
ÑKÔK×TÒTÑVÔVˆØ�lŠlÐ<¸v¸iÑHÔH×QÒQÑSÔSˆØ—\’\ØHØ�fÐñ
ô 
÷ Š(‰*Œ*ð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð G�sð G *ð GÝ¨Ð4EÐFÑFÔFÐFÝ ™:œ:¥t¨C¡y¤yµ$°zÑ2BÔ2B�5ˆE€FÝØ�t”Ø�WŒoØ—*’*˜[Ñ)Ô)Ø�TŒ{Ø�v”Ø—’˜6Ñ"Ô"Ð( bØ�6Œ]Ø—	’	˜)Ñ$Ô$Ð0¨Ø�YŠY�vÑÔÐ( &Øðñ ô ð s#   ‚ ’
3œ.®3ÈA=J%Ê%J)Ê,J)c                ól  — | d d…         }t          j        |¦  «        }|r(t          j        |d         t	          | ¦  «        ¦  «        st          dd¬¦  «        ‚t          j        |d         ¦  «        }|st          dd¬¦  «        ‚t          j        |d         ¦  «         t          | 	                    d	¦  «        pd
d|d         z   | 	                    d¦  «        |d         |d         | 	                    d¦  «        pdd| 	                    d¦  «        pd| 	                    d¦  «        pdd¬¦
  «
        S )Nr   Úkey_hashrv   zInvalid API keyrw   rJ   zInvalid API key orgrZ   Ú
created_byzapi-keyzapi-key@r\   r[   r]   ÚapirN   r^   rO   r_   Úapi_keyr{   )
Úsaas_dbÚget_api_key_by_prefixr0   r1   r<   r	   Úget_orgÚtouch_api_keyrF   rb   )r8   rC   ÚrowrX   s       r"   rp   rp   Ÿ   s2  € Ø�S�b�SŒ\€FÝ
Ô
'¨Ñ
/Ô
/€CØð G•dÔ)¨#¨j¬/½<ÈÑ;PÔ;PÑQÔQð GÝ¨Ð4EÐFÑFÔFÐFÝ
Œ/˜#˜hœ-Ñ
(Ô
(€CØð KÝ¨Ð4IÐJÑJÔJÐJÝÔ˜#˜dœ)Ñ$Ô$Ð$ÝØ—’˜Ñ%Ô%Ð2¨Ø˜3˜vœ;Ñ&Ø—'’'˜&‘/”/Ø�4ŒyØ�V”Ø—’˜‘”Ð& BØØ—’˜	Ñ"Ô"Ð. hØ�WŠW�V‰_Œ_Ð& Øðñ ô ð r$   )r   r   r   r   )r   r   r%   r   r   r&   )r8   r   r   r   )r   r=   )rV   rW   rX   rW   rM   r   r   rW   )rV   rW   rX   rW   rM   r   r   r   r:   )rg   rh   ri   rj   r   rF   )rt   r   r   rF   )r8   r   r   rF   )$Ú__doc__Ú
__future__r   r   r0   r   Údataclassesr   Útypingr   r   Úfastapir   r   r	   r
   Úfastapi.securityr   r   Úapp.authr   r   Úapp.saasr   r�   Úbearer_schemer#   r7   r<   rD   rF   rd   rf   rs   rq   rp   rU   r$   r"   ú<module>r›      sÝ  ðØ AÐ Aà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eà 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø "Ð "Ð "Ð "Ð "Ð "à�
 eÐ,Ñ,Ô,€ð%ð %ð %ð %ð
ð 
ð 
ð 
ð8ð 8ð 8ð 8ð*ð *ð *ð *ð ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ðð ð ð ð Eð Eð Eð Eð CGðð ð ð ð ð 7ð 7ð 7ð 7ðtð ð ð ð ð r$   