U
    @†6^ŸŸ  ã                   @   s¾   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 d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZma d d
lmZ d dlmZ G dd„ dƒZdS )é    N)ÚSecureHeaders)Ú_cperror)Ú
itemgetter)Údeepcopy)ÚTemplateLookup)ÚTemplate)ÚSpiderFootDb)Ú
SpiderFootÚglobalScanStatus)ÚSpiderFootScanner)ÚStringIOc                   @   s  e Zd ZedgdZeƒ Zeƒ ZdZdZ	dd„ Z
dd„ Zdd	„ Zd
d„ Zdadd„Zdbdd„Zde_dcdd„Zde_dddd„Zde_dd„ Zde_dedd„Zde_dfdd„Zde_dd„ Zde_d d!„ Zde_d"d#„ Zde_d$d%„ Zde_d&d'„ Zde_d(d)„ Zde_d*d+„ Zde_d,d-„ Zde_d.d/„ Zde_d0d1„ Zde_d2d3„ Z dgd5d6„Z!de!_dhd7d8„Z"de"_did9d:„Z#de#_d;d<„ Z$de$_d=d>„ Z%de%_d?d@„ Z&de&_dAdB„ Z'de'_dCdD„ Z(de(_dEdF„ Z)de)_djdGdH„Z*de*_dIdJ„ Z+de+_dkdKdL„Z,de,_dldMdN„Z-de-_dmdOdP„Z.de._dQdR„ Z/de/_dSdT„ Z0de0_dUdV„ Z1de1_dndWdX„Z2de2_dodYdZ„Z3de3_dpd[d\„Z4de4_d]d^„ Z5de5_d_d`„ Z6de6_dS )qÚSpiderFootWebUiÚ )ÚdirectoriesNc                 C   sô   t |ƒ| _t| jƒ}t| jƒ}| | ¡ | j¡| _| jd dkrFd}n
| jd }| jd  d¡| _t	j 
| j| jdœ¡ tƒ }t	j 
d| 	¡ dœ¡ td	ƒ td	ƒ td
ƒ tdƒ td| d t| jd ƒ | j ƒ td
ƒ td	ƒ td	ƒ d S )NÚ	__webaddrz0.0.0.0z<IP of this host>Ú	__docrootú/)zerror_page.404zrequest.error_responseT)ztools.response_headers.onztools.response_headers.headersr   z=*************************************************************z; Use SpiderFoot by starting your web browser of choice and z browse to http://ú:Ú	__webport)r   ÚdefaultConfigr   r	   ÚconfigUnserializeÚ	configGetÚconfigÚrstripÚdocrootÚcherrypyÚupdateÚerror_page_404Ú
error_pager   ÚprintÚstr)Úselfr   ÚdbhÚsfÚaddrZsecure_headers© r%   ú*/var/www/spiderfoot.crq.systems/sfwebui.pyÚ__init__%   s2    



þþ$zSpiderFootWebUi.__init__c                 C   s6   dt j_| jd r*tjdt ¡ dt j_ndt j_d S )Niô  Ú_debug)ÚstatusÚ	tracebackz<html><body>Error</body></html>)r   Úresponser)   r   r   Úget_error_pageÚ
format_excÚbody©r!   r%   r%   r&   r   J   s    
zSpiderFootWebUi.error_pagec                 C   s    t d| jd}|jd| j|dS )Núdyn/error.tmpl©ÚfilenameÚlookupz	Not Found)Úmessager   r)   ©r   r3   Úrenderr   )r!   r)   r4   r*   ÚversionÚtemplr%   r%   r&   r   R   s    zSpiderFootWebUi.error_page_404c                 C   sJ   t ƒ }|D ]:}t |d¡}| dd¡}| dd¡ dd¡}| |¡ q
|S )NTú'ú&quot;z&amp;ú&ú")ÚlistÚhtmlÚescapeÚreplaceÚappend)r!   Z	inputListÚretÚitemÚcr%   r%   r&   ÚcleanUserInputW   s    zSpiderFootWebUi.cleanUserInputc                 C   sb  d}|||g  d¡dks,|||g  d ¡dkr0d S | d¡r\| d¡r\|dt|ƒd … }d}| dd¡}|dkr€|dkr€d}d}t| jƒ}|dkr–d n||dkr¤d n||dkr²d n||dkrÀd n|dœ}| |¡}g }|D ]‚}	t 	d	t 
|	d
 ¡¡}
t |	d ¡}t |	d ¡}| |
|||	d |	d |	d |	d |	d |	d |	d |	d |	d |	d g¡ qÚ|S )Nr   é   r   é   Ú*ú%)Nr   )Úscan_idÚtypeÚvalueÚregexú%Y-%m-%d %H:%M:%Sr   é   é   é   é   é   é
   é   é   é   é   )ÚcountÚ
startswithÚendswithÚlenr@   r   r   ÚsearchÚtimeÚstrftimeÚ	localtimer>   r?   rA   )r!   ÚidÚ	eventTyperL   rM   r"   ÚcriteriaÚdataÚretdataÚrowÚlastseenÚescapeddataÚ
escapedsrcr%   r%   r&   Ú
searchBasec   sJ    ÿ
ü

        þzSpiderFootWebUi.searchBaseÚexcelc              	   C   sî   t | jƒ}| ||¡}tƒ }tj||d}| ddddddg¡ |D ]v}|d d	krVqDt d
t 	|d ¡¡}	t
|d ƒ dd¡ dd¡}
| |	t
|d ƒt
|d ƒt
|d ƒ|d |
g¡ qDdtjjd< dtjjd< dtjjd< | ¡  d¡S )N©ÚdialectÚUpdatedÚTypeÚModuleÚSourceúF/PÚDatarV   ÚROOTrN   r   rG   ú<SFURL>r   ú</SFURL>rF   rO   rW   ú#attachment; filename=SpiderFoot.csvúContent-Dispositionúapplication/csvúContent-Typeúno-cacheÚPragmaúutf-8)r   r   ÚscanResultEventr   ÚcsvÚwriterÚwriterowr^   r_   r`   r    r@   r   r+   ÚheadersÚgetvalueÚencode)r!   ra   rK   rm   r"   rd   ÚfileobjÚparserrf   rg   Ú	datafieldr%   r%   r&   Úscaneventresultexport‹   s    
4z%SpiderFootWebUi.scaneventresultexportTc              
   C   s*  t | jƒ}tƒ }tƒ }| d¡D ] }| |¡||< || |¡ }q tƒ }tj	||d}| 
ddddddd	g¡ |D ]„}	|	d
 dkr„qrt dt |	d ¡¡}
t|	d ƒ dd¡ dd¡}| 
||	d  d |
t|	d
 ƒt|	d ƒt|	d ƒ|	d |g¡ qrdtjjd< dtjjd< dtjjd< | ¡  d¡S )Nú,rl   z	Scan Namern   ro   rp   rq   rr   rs   rV   rt   rN   r   rG   ru   r   rv   é   rF   rO   rW   rw   rx   ry   rz   r{   r|   úUtf-8)r   r   Údictr=   ÚsplitÚscanInstanceGetr~   r   r   r€   r   r^   r_   r`   r    r@   r   r+   r‚   rƒ   r„   )r!   Úidsrm   r"   Úscaninford   ra   r…   r†   rf   rg   r‡   r%   r%   r&   ÚscaneventresultexportmultiŸ   s.    
(
  ÿz*SpiderFootWebUi.scaneventresultexportmultic           
   	   C   sÜ   |   |||¡}tƒ }tj||d}| ddddddg¡ |s@d S |D ]d}|d d	krVqDt|d
 ƒ dd¡ dd¡}	| |d t|d ƒt|d ƒt|d ƒ|d |	g¡ qDdtjj	d< dtjj	d< dtjj	d< | 
¡  d¡S )Nrl   rn   ro   rp   rq   rr   rs   rT   rt   rG   ru   r   rv   r   rF   rO   rU   rw   rx   ry   rz   r{   r|   r‹   )rj   r   r   r€   r   r    r@   r   r+   r‚   rƒ   r„   )
r!   ra   rb   rL   rm   rd   r…   r†   rf   r‡   r%   r%   r&   Úscansearchresultexport¹   s    8z&SpiderFootWebUi.scansearchresultexportc                 C   s  t | jƒ}tƒ }| d¡D ]´}| |¡}|d kr2q|d }| |¡D ]ˆ}t dt |d ¡¡}t	|d ƒ 
dd¡ 
dd¡}	t	|d ƒ}
t	|d	 ƒ}|d
 }|d }|dkr¬qD| |	|||
||||d dœ¡ qDqdtjjd< dtjjd< dtjjd< t |¡ d¡S )Nr‰   r   rN   rG   ru   r   rv   rO   rF   rV   rW   rt   )rd   Ú
event_typeÚmoduleÚsource_dataÚfalse_positiveZ	last_seenÚ	scan_nameZscan_targetz$attachment; filename=SpiderFoot.jsonrx   úapplication/json; charset=utf-8rz   r{   r|   r}   )r   r   r=   r   rŽ   r~   r^   r_   r`   r    r@   rA   r   r+   r‚   ÚjsonÚdumpsr„   )r!   r   r"   r   ra   Úscanr—   rf   rg   Z
event_datar•   Zsource_moduler“   r–   r%   r%   r&   ÚscanexportjsonmultiÍ   s<    

øz#SpiderFootWebUi.scanexportjsonmultiÚ0c                 C   s‚   t | jƒ}t| jƒ}|j|dd}| |¡}|d }|dkrpdtjjd< dtjjd< d	tjjd
< | |gd|¡S | 	|g|¡S d S )NT©ÚfilterFprG   r   ú$attachment; filename=SpiderFoot.gexfrx   úapplication/gexfrz   r{   r|   úSpiderFoot Export)
r   r   r	   r~   rŽ   r   r+   r‚   ÚbuildGraphGexfÚbuildGraphJson)r!   ra   Úgexfr"   r#   rd   r›   Úrootr%   r%   r&   Úscanviz÷   s    


zSpiderFootWebUi.scanvizÚ1c                 C   s˜   t | jƒ}t| jƒ}tƒ }tƒ }| d¡D ]*}||j|dd }| | |¡d ¡ q*|dkrdtj	j
d< dtj	j
d	< d
tj	j
d< | |d|¡S d S d S )Nr‰   Trž   rG   r   r    rx   r¡   rz   r{   r|   r¢   )r   r   r	   r=   r   r~   rA   rŽ   r   r+   r‚   r£   )r!   r   r¥   r"   r#   rd   Úrootsra   r%   r%   r&   Úscanvizmulti  s    

zSpiderFootWebUi.scanvizmultic           
      C   sZ  t ƒ }t| jƒ}| |¡|d< t ƒ |d< t|d  ¡ ƒD ]ˆ}d|kr\| jd | |d |< q8| d¡\}}|t| jd  ¡ ƒkr‚q8|t| jd | d  ¡ ƒkr¢q8| jd | d | |d |< q8| |¡}|sÚt 	g ¡S |d dkrþt
 d	t
 |d ¡¡}nd
}|d dkr(t
 d	t
 |d ¡¡}	nd
}	|d |d |d ||	|d g|d< t 	|¡S )Nr   Z
configdescr   Ú__globaloptdescs__Ú__modules__ÚoptdescsrF   r   rN   úNot yetrV   rG   rO   rP   Úmeta)rŒ   r   r   ÚscanConfigGetr=   Úkeysr   rŽ   r™   rš   r^   r_   r`   )
r!   ra   rB   r"   ÚkeyÚmodNameZmodOptr¯   ÚstartedÚfinishedr%   r%   r&   Úscanopts  s0    

 

$zSpiderFootWebUi.scanoptsc                 C   s   t | jƒ}tƒ }tƒ }t|ƒ}t|ƒ}| |¡}| |¡}|d }	|d }
d }t|ƒdkrd|  	d¡S |d  
d¡}d|kr„| d¡ | |
¡}|d kršd}|dkrª|
 ¡ }
| |	¡}t|	|
|||||ƒ}| ¡  t |¡d kròtdƒ t d¡ qÐtd	| jd
}|j|t|	ƒ| jt |¡ddS )Nr   rG   ú Something went wrong internally.Ú_modulesenabledr‰   Úsfp__stor_stdoutÚ
HUMAN_NAMEú,[info] Waiting for the scan to initialize...údyn/scaninfo.tmplr1   ÚSCANLIST©ra   Únamer   r)   Úpageid)r   r   rŒ   r=   r	   r   rŽ   r°   r\   Úerrorr   ÚremoveÚ
targetTypeÚlowerÚgenScanInstanceGUIDr   Ústartr
   Ú	getStatusr   r^   Úsleepr   r3   r6   r    r   )r!   ra   ÚcfgÚmodoptsÚmodlistr#   r"   ÚinfoÚ
scanconfigÚscannameÚ
scantargetrÃ   ÚnewIdÚtr8   r%   r%   r&   Ú	rerunscanB  sF    







  ÿ ÿzSpiderFootWebUi.rerunscanc              	   C   s$  t | jƒ}tƒ }tƒ }t|ƒ}t|ƒ}| d¡D ]Ò}| |¡}| |¡}	|d }
|d }d }t	|	ƒdkrv|  
d¡  S |	d  d¡}d|kr–| d¡ | |¡}|d kr¶|  
d¡  S | |
¡}t|
| ¡ |||||ƒ}| ¡  t |¡d kr0tdƒ t d¡ qàq0td	| jd
}|jd| jddS )Nr‰   r   rG   r·   r¸   r¹   úrInvalid target type. Could not recognize it as a human name, IP address, IP subnet, ASN, domain name or host name.r»   údyn/scanlist.tmplr1   Tr½   )Z
rerunscansr   rÀ   )r   r   rŒ   r=   r	   r   r   rŽ   r°   r\   rÁ   rÂ   rÃ   rÅ   r   rÄ   rÆ   r
   rÇ   r   r^   rÈ   r   r3   r6   r   )r!   r   rÉ   rÊ   rË   r#   r"   ra   rÌ   rÍ   rÎ   rÏ   rÃ   rÐ   rÑ   r8   r%   r%   r&   Úrerunscanmultip  s6    





zSpiderFootWebUi.rerunscanmultic              	   C   s@   t | jƒ}| ¡ }td| jd}|jd|| j| jd ddddS )Núdyn/newscan.tmplr1   ÚNEWSCANr¬   r   )rÀ   Útypesr   ÚmodulesrÎ   ÚselectedmodsrÏ   )r   r   Ú
eventTypesr   r3   r6   r   )r!   r"   rØ   r8   r%   r%   r&   Únewscan  s    
  þzSpiderFootWebUi.newscanc              	   C   sÌ   t | jƒ}t| jƒ}| ¡ }| |¡}| |¡}|d }|d }d }	|dks`|dks`t|ƒdkrj|  d¡S | |¡}	|	d krˆd| d }|d  	d¡}
t
d| jd	}|jd
|| j| jd |
t|ƒt|ƒdS )Nr   rG   r   r·   r:   r¸   r‰   rÖ   r1   r×   r¬   )rÀ   rØ   r   rÙ   rÚ   rÎ   rÏ   )r	   r   r   rÛ   rŽ   r°   r\   rÁ   rÃ   r   r   r3   r6   r   r    )r!   ra   r#   r"   rØ   rÌ   rÍ   rÎ   rÏ   rÃ   rË   r8   r%   r%   r&   Ú	clonescan©  s*    





 ýzSpiderFootWebUi.clonescanc                 C   s   t d| jd}|jd| jdS )NrÔ   r1   r½   )rÀ   r   r5   ©r!   r8   r%   r%   r&   ÚindexÆ  s    zSpiderFootWebUi.indexc                 C   sZ   t | jƒ}| |¡}|d kr&|  d¡S td| jdd}|j|t |d ¡|d | j	ddS )	NúScan ID not found.r¼   r}   )r2   r3   Zinput_encodingr   rP   r½   )ra   r¿   r)   r   rÀ   )
r   r   rŽ   rÁ   r   r3   r6   r>   r?   r   )r!   ra   r"   Úresr8   r%   r%   r&   r   Î  s    


ÿzSpiderFootWebUi.scaninfoc                 C   s8   t d| jd}t ¡  dd¡| _|j| jd| j| jdS )Núdyn/opts.tmplr1   r   éÿàõÚSETTINGS)ÚoptsrÀ   Útokenr   )	r   r3   ÚrandomÚSystemRandomÚrandintræ   r6   r   r   rÞ   r%   r%   r&   rå   Û  s    zSpiderFootWebUi.optsc                 C   sž   t | jƒ}| | j¡}d}t|ƒD ]^}d|ks"| d¡r:q"|s\||d t|| ƒ d 7 }q"||kr"||d t|| ƒ d 7 }q"dtjjd< dtjjd	< |S )
Nr   z:_Ú_ú=Ú
z%attachment; filename="SpiderFoot.cfg"rx   z
text/plainrz   )	r	   r   ÚconfigSerializeÚsortedrZ   r    r   r+   r‚   )r!   Úpatternr#   ÚconfÚcontentÚoptr%   r%   r&   Ú
optsexportã  s    
zSpiderFootWebUi.optsexportc                 C   sÊ   t ƒ }t ¡  dd¡| _| jD ]”}| d¡r |dkrt| jd  ¡ ƒD ]V}t| jd | d  ¡ ƒD ]6}| d¡rtqd| jd | d | |d| d | < qdqFq| j| |d	| < qt	 
d
| j|dœg¡S )Nr   rã   Ú__r¬   rå   rê   zmodule.Ú.zglobal.ÚSUCCESS)ræ   rd   )rŒ   rç   rè   ré   ræ   r   rZ   rî   r±   r™   rš   )r!   rB   rò   ÚmodÚmor%   r%   r&   Úoptsrawö  s    


*zSpiderFootWebUi.optsrawc                 C   s   t d| jd}|j|| jdS )Nr0   r1   )r4   r   r5   )r!   r4   r8   r%   r%   r&   rÁ     s    zSpiderFootWebUi.errorFc                 C   s    t | jƒ}| |¡}|d kr8|s*|  d¡S t ddg¡S |d k	rj| |¡ |sZt d¡‚qœt ddg¡S n2t	d| j
d}|j|t|d ƒtƒ tƒ d	| jd
S d S )Nrà   ÚERRORr   rö   r   údyn/scandelete.tmplr1   r   r½   )ra   r¿   Únamesr   rÀ   r   )r   r   rŽ   rÁ   r™   rš   ÚscanInstanceDeleter   ÚHTTPRedirectr   r3   r6   r    r=   r   )r!   ra   ÚconfirmÚrawr"   rá   r8   r%   r%   r&   Ú
scandelete  s$    



  þzSpiderFootWebUi.scandeletec                 C   sÒ   t | jƒ}tƒ }| d¡D ]X}| |¡}| t|d ƒ¡ |d krX|  d| d ¡  S |d dkr|  d¡  S q|d k	r¢| d¡D ]}| |¡ q†t	 
d¡‚n,td	| jd
}|jd d | d¡|d| jdS d S )Nr‰   r   zScan ID not found (ú).rP   )ÚRUNNINGÚSTARTINGÚSTARTEDz You cannot delete running scans.r   rû   r1   r½   )ra   r¿   r   rü   rÀ   r   )r   r   r=   r   rŽ   rA   r    rÁ   rý   r   rþ   r   r3   r6   r   )r!   r   rÿ   r"   rü   ra   rá   r8   r%   r%   r&   Úscandeletemulti%  s$    

 ÿzSpiderFootWebUi.scandeletemultic              
   C   s  t |ƒt | jƒkr*|  dt | jƒ d ¡S |rò|jrò|j ¡ }t|ƒtkrT| d¡}z`tƒ }| 	d¡D ]@}d|krtqf| 
¡  	d¡}t|ƒdkr–d|d< |d ||d < qft |¡}W n< tk
rð } z|  d	t |ƒ d
 ¡ W Y ¢S d }~X Y nX zžt| jƒ}	|dkr|	 ¡  t| jƒ| _npt |¡}
tƒ }t|
 ¡ ƒD ]}|  |
| g¡d ||< q:t| jƒ}t| jƒ}| ||¡| _|	 | | j¡¡ W n: tk
rÊ } z|  dt |ƒ ¡ W Y ¢S d }~X Y nX td| jd}t  ¡  !dd¡| _|j"| jdd| j#| jdS )NúInvalid token (r  r}   rì   rë   rG   r   r   z?Failed to parse input file. Was it generated from SpiderFoot? (ú)ÚRESETú.Processing one or more of your inputs failed: râ   r1   rã   rä   T)rå   rÀ   Úupdatedr   ræ   )$r    ræ   rÁ   ÚfileÚreadrK   ÚbytesÚdecoderŒ   r   Ústripr\   r™   rš   ÚBaseExceptionr   r   ÚconfigClearr   r   Úloadsr=   r±   rE   r	   r   Ú	configSetrí   Ú	Exceptionr   r3   rç   rè   ré   r6   r   )r!   Úalloptsræ   Z
configFileÚcontentsÚtmpÚlineÚlÚer"   ÚuseroptsÚ	cleanoptsrò   Úcurrentoptsr#   r8   r%   r%   r&   Úsavesettings>  sP    

,




( ÿzSpiderFootWebUi.savesettingsc           
   
   C   s  t |ƒt | jƒkr.t ddt | jƒ d g¡S zšt| jƒ}|dkrX| ¡  t| jƒ| _nnt 	|¡}t
ƒ }t| ¡ ƒD ]}|  || g¡d ||< qtt| jƒ}t| jƒ}| ||¡| _| | | j¡¡ W n> tk
r }	 zt ddt |	ƒ g¡ W Y ¢S d }	~	X Y nX t ddg¡S )	Nrú   r  r  r	  r   r
  rö   r   )r    ræ   r™   rš   r   r   r  r   r   r  rŒ   r=   r±   rE   r	   r   r  rí   r  )
r!   r  ræ   r"   r  r  rò   r  r#   r  r%   r%   r&   Úsavesettingsraws  s$    



,zSpiderFootWebUi.savesettingsrawc                 C   sæ   t | jƒ}|dkr t ddg¡S t |¡}|s<t ddg¡S | |¡}|d dkr`t ddg¡S |d	kr | ||¡}|D ]&}t|d
 ƒdkrxt ddg¡  S qx| ||¡}	||	 }
| 	||
|¡}|sÔt ddg¡S t ddg¡S d S )N)r   r¨   rú   z$No FP flag set or not set correctly.zNo IDs supplied.rP   )ÚABORTEDÚFINISHEDzERROR-FAILEDÚWARNINGz>Scan must be in a finished state when setting False Positives.r   rX   r¨   zZYou cannot unset an element as False Positive if a parent element is still False Positive.zException encountered.rö   r   )
r   r   r™   rš   r  rŽ   ÚscanElementSourcesDirectr    ÚscanElementChildrenAllÚscanResultsUpdateFP)r!   ra   Z	resultidsÚfpr"   r   r)   rd   rf   ÚchildsZallIdsrB   r%   r%   r&   Úresultsetfp’  s,    


ÿzSpiderFootWebUi.resultsetfpc                 C   sR   t | jƒ}| ¡ }tƒ }|D ]}| |d |d g¡ qt|tdƒd}t |¡S )NrG   r   )r²   )	r   r   rÛ   r=   rA   rî   r   r™   rš   )r!   r"   rØ   rB   Úrr%   r%   r&   Ú
eventtypes¸  s    
zSpiderFootWebUi.eventtypesc                 C   s\   t | jd  ¡ ƒ}| ¡  t ƒ }|D ],}d|kr2q$| || jd | d dœ¡ q$t |¡S )Nr¬   rô   Údescr)r¿   r,  )r=   r   r±   ÚsortrA   r™   rš   )r!   ZmodinforB   Úmr%   r%   r&   rÙ   Ç  s     zSpiderFootWebUi.modulesc                 C   s   t  d| jd g¡S )Nrö   Ú__version__)r™   rš   r   r/   r%   r%   r&   ÚpingÔ  s    zSpiderFootWebUi.pingc              
   C   s’   d }t | jƒ}dtjjd< | ¡  d¡s6t ddg¡S z|j	 
|¡}| ¡ }W n8 tk
r† } zt dt|ƒg¡ W Y ¢S d }~X Y nX t |¡S )Nr˜   rz   Úselectrú   z2Non-SELECTs are unpredictable and not recommended.)r   r   r   r+   r‚   rÄ   rZ   r™   rš   r"   ÚexecuteÚfetchallr  r    )r!   Úqueryrd   r"   rB   r  r%   r%   r&   r4  Ú  s    
(zSpiderFootWebUi.queryc                 C   s¾  t | jƒ}tƒ }tƒ }	t|ƒ}
d }|  ||g¡\}}|dksD|dkr`|sR|  d¡S t ddg¡S |dkr”|dkr”|dkr”|s†|  d¡S t ddg¡S |dkr®| 	dd¡ 
d¡}	t|	ƒdkrX|dkrX| 	dd¡ 
d¡}|
 |¡}	t |	ƒ}t |ƒ}t|ƒdkrX|
 |¡D ]<}|
 |g¡}|D ]$}||	kr|	 |¡ | |¡ qq
t |ƒ}tƒ }qòt|	ƒdkr®|dkr®| jd	 D ]2}|d
ks || jd	 | d krz|	 |¡ qzd|	krÂ|	 d¡ |	 ¡  |
 |¡}|d krü|sî|  d¡S t ddg¡S d|	kr|	 d¡ |
 |¡}|dkr2| 	dd¡}n| ¡ }t|||||	||ƒ}| ¡  t |¡d kr|tdƒ t d¡ qV|s¬td| jd}|j||| jt |¡ddS t d|g¡S d S )Nr   zForm incomplete.rú   zIncorrect usage.Zmodule_r‰   r   Útype_r¬   ÚallÚcatsÚsfp__stor_dbrÓ   zUnrecognised target type.r¹   )rº   ÚUSERNAMEr<   r»   rG   r¼   r1   r½   r¾   rö   )r   r   rŒ   r=   r	   rE   rÁ   r™   rš   r@   r   r\   ÚmodulesProducingÚeventsToModulesrA   r-  rÃ   rÂ   rÅ   rÄ   r   rÆ   r
   rÇ   r   r^   rÈ   r   r3   r6   r   )r!   rÎ   rÏ   Z
modulelistZtypelistZusecaseÚclirÉ   rÊ   rË   r#   rÃ   ZtypesxÚnewmodsÚ	newmodcpyÚetypeÚxmodsr÷   ÚscanIdrÑ   r8   r%   r%   r&   Ú	startscanî  s€    





"









  ÿ ÿzSpiderFootWebUi.startscanc           	      C   s"  t | jƒ}tƒ }| d¡D ]ä}d}| |¡}|d krB|  d¡  S t|d ƒ}t |¡dksh|d dkr†| 	d| d | d	 ¡ d
}|sºt |¡dks¤|d dkrº| 	d| d ¡ d
}|sît |¡d krî| 	d| d d | d ¡ d
}|st 
|d¡ qtd| jd}|jdd
|| jdS )Nr‰   FzInvalid scan ID specified.r   r"  rP   zScan 'z2' is in a finished state. <a href='/scandelete?id=z4&confirm=1'>Maybe you want to delete it instead?</a>Tr!  z' is already aborted.z.' is not actually running. A data consistency z=error for this scan probably exists. <a href='/scandelete?id=ú(&confirm=1'>Click here to delete it.</a>úABORT-REQUESTEDrÔ   r1   r½   )rÀ   ÚstoppedscanÚerrorsr   )r   r   r=   r   rŽ   rÁ   r    r
   rÇ   rA   Ú	setStatusr   r3   r6   r   )	r!   r   r"   rÁ   ra   ZerrStater   rÎ   r8   r%   r%   r&   ÚstopscanmultiN  sD    

ÿÿÿþþ ÿzSpiderFootWebUi.stopscanmultic                 C   s  t | jƒ}| |¡}|d kr8|s*|  d¡S t ddg¡S t |¡d krj|s\|  d| d ¡S t ddg¡S t |¡dkr”|s†|  d¡S t ddg¡S t |¡d	ksÐ|sÂ|  d
t |¡ d d ¡S t ddg¡S t |d¡ |st	d| j
d}|jdd| jtƒ dS t ddg¡S d S )NzInvalid scan ID.rú   zsThat scan is not actually running. A data consistency error for this scan probably exists. <a href='/scandelete?id=rC  z"Scan doesn't appear to be running.r!  zThe scan is already aborted.zScan already aborted.r  z,The running scan is currently in the state 'z%', please try again later or restart z SpiderFoot.z&Scan in an invalid state for stopping.rD  rÔ   r1   r½   T)rÀ   rE  r   rF  rö   r   )r   r   rŽ   rÁ   r™   rš   r
   rÇ   rG  r   r3   r6   r   r=   )r!   ra   r<  r"   r   r8   r%   r%   r&   Ústopscanv  sB    


þþ
ÿÿþzSpiderFootWebUi.stopscanc           
   
   C   sv   t | jƒ}| ||||¡}g }|D ]H}t dt |d d ¡¡}	| |	|d |d t |d ¡|d g¡ q"t	 
|¡S )NrN   r   éè  rG   rO   rF   rV   )r   r   ÚscanLogsr^   r_   r`   rA   r>   r?   r™   rš   )
r!   ra   ÚlimitZrowIdÚreverser"   rd   re   rf   Ú	generatedr%   r%   r&   Úscanlog¦  s    
,zSpiderFootWebUi.scanlogc              
   C   sj   t | jƒ}| ||¡}g }|D ]@}t dt |d d ¡¡}| ||d t t	|d ƒ¡g¡ qt
 |¡S )NrN   r   rJ  rG   rO   )r   r   Ú
scanErrorsr^   r_   r`   rA   r>   r?   r    r™   rš   )r!   ra   rL  r"   rd   re   rf   rN  r%   r%   r&   Ú
scanerrors²  s    
ÿzSpiderFootWebUi.scanerrorsc                 C   s¾   t | jƒ}| ¡ }g }|D ]˜}t dt |d ¡¡}|d dkrXt dt |d ¡¡}nd}|d dkr€t dt |d ¡¡}nd}| |d |d |d ||||d	 |d
 g¡ qt |¡S )NrN   rF   rV   r   r®   rP   rG   rO   rQ   rR   )	r   r   ÚscanInstanceListr^   r_   r`   rA   r™   rš   )r!   r"   rd   re   rf   Úcreatedr´   rµ   r%   r%   r&   Úscanlist¿  s    
0zSpiderFootWebUi.scanlistc                 C   s|   t | jƒ}| |¡}t dt |d ¡¡}t dt |d ¡¡}t dt |d ¡¡}|d |d ||||d g}t |¡S )NrN   rO   rF   rV   r   rG   rP   )r   r   rŽ   r^   r_   r`   r™   rš   )r!   ra   r"   rd   rS  r´   Úendedre   r%   r%   r&   Ú
scanstatusÔ  s    

zSpiderFootWebUi.scanstatusc              	   C   sv   t | jƒ}| ||¡}g }|D ]L}|d dkr0qt dt |d ¡¡}| |d |d ||d |d g¡ qt |¡S )Nr   rt   rN   rO   rG   rF   rV   )	r   r   ÚscanResultSummaryr^   r_   r`   rA   r™   rš   )r!   ra   Úbyr"   rd   re   rf   rg   r%   r%   r&   Úscansummaryá  s    
&zSpiderFootWebUi.scansummaryc                 C   s¦   t | jƒ}| |||¡}g }|D ]v}t dt |d ¡¡}t |d ¡}	t |d ¡}
| ||	|
|d |d |d |d |d	 |d
 |d |d g¡ q t	j
|ddS )NrN   r   rG   rO   rF   rP   rQ   rR   rS   rW   rX   rV   F©Úensure_ascii)r   r   r~   r^   r_   r`   r>   r?   rA   r™   rš   )r!   ra   rb   Úfilterfpr"   rd   re   rf   rg   rh   ri   r%   r%   r&   Úscaneventresultsï  s$    

      þz SpiderFootWebUi.scaneventresultsc           	      C   sZ   t | jƒ}| |||¡}g }|D ]*}t |d ¡}| ||d |d g¡ q tj|ddS )Nr   rG   rO   FrZ  )r   r   ÚscanResultEventUniquer>   r?   rA   r™   rš   )	r!   ra   rb   r\  r"   rd   re   rf   Úescapedr%   r%   r&   Úscaneventresultsuniqueÿ  s    
z&SpiderFootWebUi.scaneventresultsuniquec                 C   s   |   |||¡}tj|ddS ©NFrZ  )rj   r™   rš   )r!   ra   rb   rL   re   r%   r%   r&   r]     s    zSpiderFootWebUi.searchc                 C   s"   t | jƒ}| |¡}tj|ddS ra  )r   r   ÚscanResultHistoryr™   rš   )r!   ra   r"   rd   r%   r%   r&   Úscanhistory  s    

zSpiderFootWebUi.scanhistoryc           	      C   sl   t | jƒ}t| jƒ}tƒ }tƒ }| ||¡}| ||¡\}}|d= tƒ }| |¡|d< ||d< tj|ddS )Nrt   Útreerd   FrZ  )	r	   r   r   rŒ   r~   ÚscanElementSourcesAllÚdataParentChildToTreer™   rš   )	r!   ra   rb   r#   r"   ÚpcÚdatamapZleafSetre   r%   r%   r&   Úscanelementtypediscovery  s    

z(SpiderFootWebUi.scanelementtypediscovery)NNN)rk   )rk   )NNrk   )r   )r¨   )NF)N)N)N)N)NNN)N)F)F)NNN)7Ú__name__Ú
__module__Ú__qualname__r   r3   rŒ   r   r   ræ   r   r'   r   r   rE   rj   rˆ   Úexposedr‘   r’   rœ   r§   rª   r¶   rÒ   rÕ   rÜ   rÝ   rß   r   rå   ró   rù   rÁ   r  r  r  r   r)  r+  rÙ   r0  r4  rB  rH  rI  rO  rQ  rT  rV  rY  r]  r`  r]   rc  ri  r%   r%   r%   r&   r      s®   %
(


'

",)



2#

[$
)
	




	
r   )r™   r   r>   r   r^   rç   Úsecurer   r   Úoperatorr   Úcopyr   Zmako.lookupr   Zmako.templater   Úsfdbr   Úsflibr	   r
   Úsfscanr   Úior   r   r%   r%   r%   r&   Ú<module>   s    