
    }\5j"                       d Z ddlmZ ddlZddlZddlmZmZ ddlmZ dZ	 e
h d      ZdZdd	Zd
 ZddZddZddZddZddZddZddZdddd	 	 	 	 	 	 	 	 	 	 	 	 	 d dZddd	 	 	 	 	 	 	 	 	 	 	 d!dZ G d d      Zy)"z
Per-service progress for scan_details_advance + incremental scan_details.result merge.
Used by scan.py (subprocess) and scan_queue_worker.py.
    )annotationsN)datetimetimezone)Any)httpxnmapzapnuclei	subfindernikto	leakcheck>   r	   r   r   r
   z)Tool not yet implemented in scan pipelinec                 d    t        j                  t        j                        j	                         S N)r   nowr   utc	isoformat     @/home/batmin/projects/scan_shield_v2/scripts/advance_progress.pyutc_nowr      s    <<%//11r   c                     ddl m}  t        j                  j	                  d      xs dj                         }t        j                  j	                  d      xs dj                         }|r|sy  | ||      S )Nr   )create_clientSUPABASE_URL SUPABASE_SERVICE_ROLE_KEY)supabaser   osenvirongetstrip)r   urlkeys      r   
get_clientr#      s[    &::>>.)/R
6
6
8C::>>56<"
C
C
ECcc""r   c                    | r|sy | j                  d      j                  d      j                  d|      j                  d      j	                         }|j
                  xs g }|r|d   S d S )Nscan_details_advancezscan_mode,services,optionsscan_id   r   )tableselecteqlimitexecutedata)clientr&   rrowss       r   load_advance_configr1      sc    +,	,	-	Iw		q	  66<RD47$$r   c                    g }t         D ]G  }| j                  |      }t        |t              s%|j                  d      s7|j	                  |       I |S )Nenabled)CATALOG_ORDERr   
isinstancedictappend)servicestoolsnamesvcs       r   enabled_tools_from_servicesr<   -   sL    E ll4 c4 SWWY%7LL Lr   c                    dddddd}| D ]M  }t        |j                  d      xs d      j                         }||v r||xx   dz  cc<   A|dxx   dz  cc<   O |S )Nr   )criticalhighmediumlowinfoseverityrB   r'   )strr   lower)findingssummaryfsevs       r   build_summaryrJ   6   sl    a1QJG !!%%
#-v.446'>CLALFOq O! Nr   c                T    t        |       }t        |       }i ||||d   |d   z   dS )Nr>   r?   )total_findingstotalcritical_high)rJ   len)rF   rG   rM   s      r   build_report_summaryrP   A   sC    H%GME
 ,wv>	 r   c                D   |j                  |       xs i }|j                  d      xs i }| dk(  r]|j                  d      xs i }t        |t              r8|j                  dd      r&	 t        t	        |j                  d|            |      S | dk(  r`|j                  d      xs i }t        |t              r;|j                  dd      r)	 t        t	        |j                  d|            d	z  |      S | d
k(  r`|j                  d      xs i }t        |t              r;|j                  dd      r)	 t        t	        |j                  d|            d	z  |      S t        ||      S # t
        t        f$ r Y w xY w# t
        t        f$ r Y w xY w# t
        t        f$ r Y Gw xY w)Noptionsr   maxtime_secr3   Tvaluer	   max_duration_min<   r   max_time_min)r   r5   r6   minint	TypeError
ValueError)toolr8   ceilingdefaultr;   optsbags          r   option_timeout_secra   L   s   
,,t

"C779#Dwhh}%+c4 SWWY%=3swww897CC u}hh)*0bc4 SWWY%=3swww89B>HH {hh~&,"c4 SWWY%=3swww89B>HH w  ! z*  z*  z* s6   ($E# 
'E8 /'F #E54E58F
	F
FFc                t    t        | |      }|si S |j                  d      xs i }t        |t              r|S i S )Nr8   )r1   r   r5   r6   )r.   r&   rowr8   s       r   _fetch_servicesrd   g   s=    
fg
.C	wwz"(bH!(D189r9r   c                    | j                  d      j                  |t               d      j                  d|      j	                          y )Nr%   )r8   
updated_atr&   )r(   updater   r*   r,   )r.   r&   r8   s      r   _patch_servicesrh   o   s6    
LL'(//WY7bGWWYr   resultfindings_counterrorc                  | r|sy t        | |      }|j                  |      }t        |t              sdi d}||d<   |dk(  rt	               |d<   |dv rt	               |d<   |||d<   |||d	<   n	|rd
|i|d	<   |||<   t        | ||       y )NT)r3   rR   statusstarted
started_at)	completedfailedcompleted_atrk   rj   rl   )rd   r   r5   r6   r   rh   )	r.   r&   
service_idrn   rj   rk   rl   r8   r;   s	            r   update_serviceru   u   s     vw/H
,,z
"Cc4 2.CM#IL((%iN! .H	 %(HHZFGX.r   )target_namewarningsc               J   i }| r|r| j                  d      j                  d      j                  d|      j                  d      j	                         }|j
                  xs g }|r+t        |d   j                  d      t              r	|d   d   }n@|r>t        |d   j                  d      t              r	 t        j                  |d   d         }t        |j                  d      xs g       }	|	D 
ch c]  }
t        j                  |
dt                }}
|D ]E  }
t        j                  |
dt              }||vs$|	j                  |
       |j!                  |       G |t#               t%        |	      t'        |	      |	d	}|r||d
<   |r||d<   |j                  d      r|d   |d<   | rU|rS| j                  d      j)                  |t+        |	      t#               d      j                  d|      j	                          |S # t        j                  $ r i }Y Kw xY wc c}
w )zDMerge findings into scan_details.result and return full result dict.scan_detailsrj   idr'   r   rF   T)	sort_keysr^   )target	scan_daterL   rG   rF   rv   rw   )rj   report_summaryrf   )r(   r)   r*   r+   r,   r-   r5   r   r6   rD   jsonloadsJSONDecodeErrorlistdumpsr7   addr   rO   rJ   rg   rP   )r.   r&   rF   r|   rv   rw   existingr/   r0   merged_findingsrH   seenr"   rj   s                 r   merge_scan_resultr      s    H'LL(//9<<T7KQQRST\\^vv|JtAw{{84d;Awx(HjaX!6<::d1gh&78 8<<
39r:O@OP1DJJqD#6PDP jjdC8d?""1%HHSM	 Yo. 1#F  +}%z||D~t'^$++ "6"G%i	
 "T7
GGIMC ''  Qs   6H 3#H HHc                  n    e Zd ZdZdddZddZddZddZddZdddd	 	 	 	 	 	 	 	 	 	 	 	 	 dd	Z	dd
Z
y)ScanProgresszJHook scan.py tool lifecycle to scan_details_advance + scan_details.result.Nc                   |xs dj                         xs d | _        | j                  r
t               nd | _        |xs i | _        | j                  j                  d      xs i | _        | j                  r_| j                  sR| j                  rEt        | j                  | j                        }|r"|| _        |j                  d      xs i | _        y y y y y )Nr   r8   )r    r&   r#   r.   advance_configr   r8   r1   )selfr&   r   rc   s       r   __init__zScanProgress.__init__   s    2,,.6$&*lljl,2"1155jAGR<<$++%dkk4<<@C&)# #
 3 9r  3><r   c                v    t        | j                  xr# | j                  xr t        | j                              S r   )boolr&   r8   r<   r   s    r   has_advancezScanProgress.has_advance   s,    DLLaT]]a7RSWS`S`7abbr   c                N    | j                         sy t        | j                        S r   )r   r<   r8   r   s    r   enabled_toolszScanProgress.enabled_tools   s     !*4==99r   c                b    | j                   rt        || j                   ||      S t        ||      S r   )r8   ra   rX   )r   r\   r]   r^   s       r   tool_timeoutzScanProgress.tool_timeout   s+    ==%dDMM7GLL7G$$r   c                |    | j                   r0| j                  r#t        | j                   | j                  |d       y y y )Nro   )r.   r&   ru   r   r\   s     r   on_startzScanProgress.on_start   s,    ;;4<<4;;dIF (;r   )rv   rw   rl   c          
        | j                   r}| j                  rp|rdnd}|t        |      d}|r||d<   t        | j                   | j                  |||t        |      |       t	        | j                   | j                  ||||       y y y )Nrr   rq   )rF   countrl   ri   )r|   rv   rw   )r.   r&   rO   ru   r   )	r   r\   rF   r|   rv   rw   rl   rn   slice_results	            r   on_completezScanProgress.on_complete   s     ;;4<<!&XKF(03x=IL(-W%#"8} '! (;r   c           	         | j                   r<| j                  r0t        | j                   | j                  |ddt        idt               t	        d| dt         d       y )	Nrr   rl   r   ri   z[!] z: T)flush)r.   r&   ru   STUB_MSGprintr   s     r   mark_unimplementedzScanProgress.mark_unimplemented  sR    ;;4<<*  	TF"XJ't4r   r   )r&   
str | Noner   dict | None)returnr   )r   list[str] | None)r\   rD   r]   rY   r^   rY   r   rY   )r\   rD   r   None)r\   rD   rF   
list[dict]r|   rD   rv   r   rw   r   rl   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r      sz    T	:c:
%
G #'%)  
    #  
B5r   r   )r   rD   )r&   rD   r   r   )r8   r6   r   z	list[str])rF   r   r   zdict[str, int])rF   r   r   zdict[str, Any])
r\   rD   r8   r6   r]   rY   r^   rY   r   rY   )r&   rD   r   r6   )r&   rD   r8   r6   r   r   )r&   rD   rt   rD   rn   rD   rj   r   rk   z
int | Nonerl   r   r   r   )r&   rD   rF   r   r|   rD   rv   r   rw   r   r   r6   )r   
__future__r   r   r   r   r   typingr   r4   	frozensetIMPLEMENTEDr   r   r#   r1   r<   rJ   rP   ra   rd   rh   ru   r   r   r   r   r   <module>r      s   #  	 ' U:;62#%!6:' !%// / 	/ / / / 
/J #!%44 4
 4 4 4 
4nK5 K5r   