
    Vj	                    H   d Z ddlmZ 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
 ddlmZmZmZ  ee          Z e
ej                            d e
e                              d                              Zej                            dd	          Zej                            d
e          Zej                            dd          Zej                            dd          dk    Zd3dZd4dZd5dZd6dZd7dZej        d             Z e!                    dg d          d             Z"e!                    d g d          d!             Z#e!                    d"d#d$g          d%             Z$e!                    d&          d'             Z%ed(k    r e             ej                            d)d*          Z& e'ej                            d+d,                    Z( e)d-e& d.e(             e)d/e& d.e( d0e            e*                    e&e(d12           dS dS )8u   
BlackTeam — VIN ruxsat serveri (port 8091).
Ovozli lumen-backend (8090) dan ALOHIDA.

Modul: POST /api/vin/verify  +  /api/vin/data
    )annotationsN)Path)FlaskResponserequestACTIVATION_DBzvins.dbACTIVATION_API_KEYspm8666p1_64_carACTIVATION_API_SECRETACTIVATION_ADMIN_PASSBlackTeam2026ACTIVATION_STRICT_HMAC01returnsqlite3.Connectionc                 Z    t          j        t                    } t           j        | _        | S )N)sqlite3connectDBRowrow_factorycons    5C:\Users\T\Desktop\008sigdet\activation_server\app.pydbr      s    
/"

CkCOJ    Nonec                     t                      5 } |                     d           |                                  d d d            d S # 1 swxY w Y   d S )Nz
            CREATE TABLE IF NOT EXISTS vins (
                vin TEXT PRIMARY KEY,
                status TEXT NOT NULL DEFAULT 'ACTIVE',
                note TEXT DEFAULT '',
                updated_at INTEGER NOT NULL
            )
            )r   executecommitr   s    r   init_dbr"   "   s    	 		
 		
 		
 	

                 s   *AA
A
vinstrc                4   | pd                                                                 } | sdS t                      5 }|                    d| f                                          }d d d            n# 1 swxY w Y   |sdS |d                                         S )N INACTIVEz#SELECT status FROM vins WHERE vin=?status)stripupperr   r    fetchone)r#   r   rows      r   
vin_statusr-   1   s    9"




#
#
%
%C z	 Tkk?#HHQQSST T T T T T T T T T T T T T T zx=   s   *A11A58A5boolc                    t           sdS t          j                            dd          } t          j                            dd          }t          j                            dd          }|t          k    s| r|sdS t          j                    pd}|                                 |z   | |                    dd	
          z                                   fD ]}t                                          t                                          fD ]}t          j
        ||t          j                                                  }t          j        ||                                          r  dS t          j
        ||t          j                                                  }t          j        |                                |                                          r  dS ϐdS )NTzX-Timestampr&   zX-Signature	X-Api-KeyFr   zutf-8ignore)errors)STRICT_HMACr   headersgetAPI_KEYget_dataencodedecode
API_SECREThmacnewhashlibsha256	hexdigestcompare_digestlowerdigesthex)tssigkeybodymsgsecretexpexp2s           r   
check_hmacrL   <   s    t			]B	/	/B
/

mR
0
0C
/

k2
.
.C
g~ R s u$D		d"R$++gh+*O*O%O$W$W$Y$YZ  !((**GNN,<,<= 	 	F(6377AACCC"3		44 ttt8FC88??AAD"488::syy{{;; ttt	 5r   c                    t           j        r]t          j        d          pi } t          | t                    r1dD ].}|                     |          rt          | |                   c S /t          j        d          pd}|                                	                    d          rj	 t          j        |          } t          | t                    r*|                     d          rt          | d                   S n# t          j        $ r Y nw xY wt           j                            d          p t           j                            d          pd                                S )NT)silent)r#   VINVinas_textr&   {r#   )r   is_jsonget_json
isinstancedictr5   r$   r7   r)   
startswithjsonloadsJSONDecodeErrorargsform)datakraws      r   extract_vinra   P   sO    (t,,,2dD!! 	(* ( (88A;; (tAw<<'''(

4
(
(
(
.BC
yy{{c"" 	:c??D$%% ($((5// (4;'''# 	 	 	D	LU##Dw|'7'7'>'>D"KKMMMs   )AC= =DDc                    t           j                            d          rit          dt           j         dt           j         dt           j                            d           dt          j        d          d d	                     d S d S )
Nz/api/vinz[vin]  z key=r0   z body=TrQ      )r   pathrX   printmethodr4   r5   r7    r   r   _logri   b   s    |z** 
;W^ ; ;gl ; ;?&&{33; ;$T2224C48; ;	
 	
 	
 	
 	

 
r   z/api/vin/data)GETPOSTOPTIONS)methodsc                 X   t           j        dk    rt          d          S t           j                            d          r0t           j                            d          t
          k    rddi ddfS t                      sdd	i ddfS t                      } t          |           }d
d| |ddS )Nrl      r(   r0     	Forbiddencodemessager^     Bad signaturer   OKr#   r(   	r   rg   r   r4   r5   r6   rL   ra   r-   r#   sts     r   api_vin_datar}   l   s    ~" $s####;'' FGO,?,?,L,LPW,W FR@@#EE<< JDDcII
--C	CBr**  r   z/api/vin/verifyc                 Z   t           j        dk    rt          d          S t           j                            d          r0t           j                            d          t
          k    rddi ddfS t                      sdd	i ddfS t                      } t          |           }d
d| |d|dS )Nrl   ro   rp   r0   rq   rr   rs   rv   rw   r   rx   ry   )rt   ru   r^   r(   rz   r{   s     r   api_vin_verifyr   }   s    ~" $s####;'' FGO,?,?,L,LPW,W FR@@#EE<< JDDcII
--C	CB r**	  r   z/activation-adminrj   rk   c                    d} d}t           j        dk    r,t           j                            d          t          k    rd} n t           j                            d          }t           j                            d          pd                                                                }|dk    r|rt                      5 }|                    d|d	t           j                            d
          pdt          t          j
                              f           |                                 d d d            n# 1 swxY w Y   | d}n|dk    r|rt                      5 }|                    d|dt           j                            d
          pdt          t          j
                              f           |                                 d d d            n# 1 swxY w Y   | d}n^|dk    rX|rVt                      5 }|                    d|f           |                                 d d d            n# 1 swxY w Y   | d}g }t                      5 }|                    d                                          }d d d            n# 1 swxY w Y   d                    d |D                       pd}|rd| dnd}| rd|  dnd}d| d| d| dS )Nr&   rk   passwordzParol noto'g'riactionr#   allowzGINSERT OR REPLACE INTO vins(vin,status,note,updated_at) VALUES(?,?,?,?)ACTIVEnoteu    — ACTIVE (ruxsat berildi)denyr'   u    — INACTIVE (rad)deletezDELETE FROM vins WHERE vin=?z o'chirildizGSELECT vin, status, note, updated_at FROM vins ORDER BY updated_at DESCc              3  V   K   | ]$}d |d          d|d          d|d         pd dV  %dS )z<tr><td>r#   z	</td><td>r(   r   r&   z
</td></tr>Nrh   ).0rs     r   	<genexpr>zadmin.<locals>.<genexpr>   sb         	X1U8WWakWWAfIOWWW     r   z)<tr><td colspan=3>Ro'yxat bo'sh</td></tr>z<p class='ok'>z</p>z<p class='er'>u  <!DOCTYPE html>
<html><head><meta charset='utf-8'><title>VIN ruxsat</title>
<style>body{font-family:sans-serif;max-width:720px;margin:2rem auto}
table{border-collapse:collapse;width:100%}td,th{border:1px solid #ccc;padding:8px}
.ok{color:green}.er{color:red}</style></head>
<body>
<h1>BlackTeam — VIN ruxsat</h1>
<p>Mijoz Telegramdan VIN yuboradi — <b>Ruxsat berish</b> bosing.</p>

a	  
<form method='post'>
<label>Admin parol: <input name='password' type='password'></label><br><br>
<label>VIN: <input name='vin' size='24' placeholder='LDP45G965SD166717'></label><br><br>
<label>Izoh: <input name='note' size='40'></label><br><br>
<button name='action' value='allow'>Ruxsat berish (ACTIVE)</button>
<button name='action' value='deny'>Rad etish (INACTIVE)</button>
<button name='action' value='delete'>O&apos;chirish</button>
</form>
<h2>Ro'yxat</h2>
<table><tr><th>VIN</th><th>Status</th><th>Izoh</th></tr>z</table>
</body></html>)r   rg   r]   r5   
ADMIN_PASSr)   r*   r   r    inttimer!   fetchalljoin)	errrH   r   r#   r   rows	rows_htmlmsg_htmlerr_htmls	            r   adminr      s   
C
C~ *<J'':5 	*#CC\%%h//F<##E**0b7799??AAC  *S *TT !SKKah(8(8(@(@(FBDIKKHXHXY   JJLLL! ! ! ! ! ! ! ! ! ! ! ! ! ! ! :::6! *c *TT !SKKaj',*:*:6*B*B*Hb#dikkJZJZ[   JJLLL! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1118# * *TT !SKK >GGGJJLLL! ! ! ! ! ! ! ! ! ! ! ! ! ! ! )))D	 {{U
 

(** 	                      5 
5  .18)))))bH-08)))))bH 
  
 & :C'   sJ   <A,D44D8;D8A,GGG:,H22H69H6(JJ
J
z/healthc                     ddddS )NT
activationi  )okserviceportrh   rh   r   r   healthr      s    <>>>r   __main__ACTIVATION_HOSTz	127.0.0.1ACTIVATION_PORT8091zActivation API http://:zAdmin http://z/activation-admin  parol: F)hostr   debug)r   r   )r   r   )r#   r$   r   r$   )r   r.   )r   r$   )+__doc__
__future__r   r=   r;   rY   osr   r   pathlibr   flaskr   r   r   __name__APPenvironr5   __file__	with_namer   r6   r:   r   r3   r   r"   r-   rL   ra   before_requestri   router}   r   r   r   r   r   r   rf   runrh   r   r   <module>r      s5    # " " " " "    				         * * * * * * * * * *eHoo	T"*..$$x..*B*B9*M*M
N
NOO
*..-/A
B
BZ^^3W==
Z^^3_EE
jnn5s;;sB      ! ! ! !   (N N N N$ 
 
 
 ?$>$>$>??  @?  &@&@&@AA  BA$ 88= = 98=@ 9? ? ? z /GIII:>>+[99D3rz~~/8899D	E
04
0
0$
0
0111	E
M$
M
M
M
M
M
MNNNGGDG...../ /r   