
    ci                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
 d dlmZ  e              ej        dd          Z e ej        dd                    Z e ej        d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defdZddeeef         de	e         de	e         defdZddede	e         de
ee	eeef                  f         fdZdede	e         fdZdS )    N)AnyDictOptionalTuple)load_dotenvDEFAULT_JWT_SECRETzdev-secret-change-meJWT_EXP_SECONDSiQ PASSWORD_HASH_ITERATIONSi rawreturnc                 v    t          j        |                               d                              d          S )N   =ascii)base64urlsafe_b64encoderstripdecode)r   s     D:\Nbitz\app\utility\security.py_b64url_encoder      s/    #C((//55<<WEEE    b64c                 \    dt          |            dz  z  }t          j        | |z             S )N=   )lenr   urlsafe_b64decode)r   paddings     r   _b64url_decoder      s-    c#hhY]#G#C'M222r   plain_passwordc                     t          j        d          }t          j        d|                     d          |t
          d          }d                    t
          t          |          t          |                    S )N   sha256utf-8    dklenzpbkdf2_sha256${}${}${})osurandomhashlibpbkdf2_hmacencoder
   formatr   )r   saltdks      r   hash_passwordr/      sk    :b>>D		X~'<'<W'E'EtMemo	p	p	pB#** tr  r   stored_hashc           	      b   	 |                     dd          \  }}}}|dk    rdS t          |          }t          |          }t          |          }t          j        d|                     d          ||t          |                    }	t          j        |	|          S # t          $ r Y dS w xY w)N$   pbkdf2_sha256Fr"   r#   r%   )
splitintr   r)   r*   r+   r   hmaccompare_digest	Exception)
r   r0   algiterations_ssalt_b64hash_b64
iterationsr-   expectedr.   s
             r   verify_passwordr@   $   s    
0;0A0A#q0I0I-\8X/!!5&&
h''!(++ >+@+@+I+I4Q[cfgocpcpqqq"2x000   uus   !B  A:B   
B.-B.payloadexp_secondssecretc                 t   ddd}t          t          j                              }|||nt          z   }t          |           }||d<   ||d<   |pt                              d          }t          t          j        |d                              d                    }t          t          j        |d                              d                    }	| d	|	                     d
          }
t          j
        ||
t          j                                                  }t          |          }| d	|	 d	| S )NHS256JWT)r:   typiatexpr#   ),:)
separators.r   )r6   timeDEFAULT_JWT_EXP_SECONDSdictr   r+   r   jsondumpsr7   newr)   r"   digest)rA   rB   rC   headernowrI   claimssecret_bytes
header_b64payload_b64signing_input	signaturesig_b64s                r   
create_jwtr^   2   s-   U++F
dikk

C
 7=T
UC']]FF5MF5M0088AAL
6j I I I P PQX Y YZZJ Fz!J!J!J!Q!QRY!Z!Z[[K!11K1188AAM}gnEELLNNIY''G22;22222r   tokenc                 `   	 |                      dd          \  }}}| d|                     d          }|pt                              d          }t          j        ||t
          j                                                  }t          j        |t          |                    sdS t          j        t          |                              d                    }t          t          j                              }	d|v r|	t          |d                   k    rdS d|fS # t          $ r Y dS w xY w)NrM      r   r#   )FNrI   T)r5   r+   r   r7   rS   r)   r"   rT   r8   r   rQ   loadsr   r6   rN   r9   )
r_   rC   rY   rZ   r]   r[   rX   expected_sigrA   rV   s
             r   
verify_jwtrd   C   s(   +0;;sA+>+>(
K%5555<<WEE4"4<<WEExmW^LLSSUU"<1H1HII 	;*^K88??HHII$)++Gc'%.&9&9 9 9;W}   {{s   B$D (A1D D 
D-,D-c                    	 |                      dd          \  }}}t          j        t          |                              d                    }d|v r"t          |                    d                    nd S # t          $ r Y d S w xY w)NrM   ra   r#   rI   )r5   rQ   rb   r   r   r6   getr9   )r_   _rZ   rA   s       r   get_jwt_expirationrh   S   s    !KKQ//;*^K88??HHII*/7*:*:s7;;u%%&&&D   tts   A5A8 8
BB)NN)N)r   r)   r7   rQ   r'   rN   typingr   r   r   r   dotenvr   getenvr   r6   rO   r
   bytesstrr   r   r/   boolr@   r^   rd   rh    r   r   <module>rp      s,       				  - - - - - - - - - - - -       RY35KLL #ibi(95AABB 3yry)CVLLMM F F# F F F F3 3 3 3 3 3
# #    C c d    3 3S#X 3Xc] 3S[\_S` 3lo 3 3 3 3" c 8C= E$QUVY[^V^Q_H`B`<a     c hsm      r   