U
    @6^                     @   sX   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZmZm	Z	 G dd deZ
dS )    N)datetime)	IPNetwork)
SpiderFootSpiderFootPluginSpiderFootEventc                   @   sb   e Zd ZdZdddddZdddd	dZd
ZdZe fddZ	dd Z
dd Zdd Zdd Zd
S )
sfp_censyszRCensys:Investigate,Passive:Search Engines:apikey:Obtain information from Censys.io    Z   )censys_api_key_uidcensys_api_key_secretdelayage_limit_dayszCensys.io API UID.zCensys.io API Secret.z#Delay between requests, in seconds.z<Ignore any records older than this many days. 0 = unlimited.NFc                 C   s4   || _ |  | _t| D ]}|| | j|< qd S )N)sftempStorageresultslistkeysopts)selfsfcuserOptsopt r   5/var/www/spiderfoot.crq.systems/modules/sfp_censys.pysetup,   s    
zsfp_censys.setupc                 C   s
   dddgS )N
IP_ADDRESSINTERNET_NAMENETBLOCK_OWNERr   r   r   r   r   watchedEvents6   s    zsfp_censys.watchedEventsc                 C   s   dddddddgS )NBGP_AS_MEMBERTCP_PORT_OPENOPERATING_SYSTEMWEBSERVER_HTTPHEADERSNETBLOCK_MEMBERGEOINFORAW_RIR_DATAr   r   r   r   r   producedEvents:   s      zsfp_censys.producedEventsc           	   
   C   s  |dkrd}|dkrd}| j d d | j d  }t|d}d	d
| i}| jjd||jddd | j d d|d}t| j d  |d dkr| j	dd d| _
d S |d d kr| jd|  d S zt|d }W n8 tk
r } z| j	dd W Y d S d }~X Y nX |S )Nipzipv4/{0}hostzwebsites/{0}r   :r   zutf-8AuthorizationzBasic %szhttps://censys.io/api/v1/view/replace)errors_fetchtimeoutr   )timeout	useragentheadersr   code)400429500403z^Censys.io API key seems to have been rejected or you have exceeded usage limits for the month.FTcontentzNo Censys.io info found for z.Error processing JSON response from Censys.io.)r   base64	b64encodeencoder   fetchUrlformattimesleeperror
errorStateinfojsonloads	Exception)	r   qry	querytypesecretb64_valr2   resrB   er   r   r   queryA   s8     zsfp_censys.queryc                 C   s  |j }|j}|j}| jrd S | jd| d |  | jd dksP| jd dkrh| jdd d| _d S || jkr| jd	| d
  d S d| j|< t	 }|
drt|D ] }|t| d| jt|< qn
|| |D ]}|  r d S |dkrd}nd}| ||}	|	d krqd|	kr`|	d dkrH| jd|  q| jd|	d  d q| jd tdt|	| j|}
| |
 zt|	ddd}tt| }tt d| jd   }| jd dkr||k r| jd W qd|	krfddd  |	d d!|	d d"|	d d#|	d d$fD }|rftd%|| j|}
| |
 d&|	krtj|	d& dd'}td(|| j|}
| |
 d)|	krt|	d) d* }td+|| j|}
| |
 |	d) d, }td-|| j|}
| |
 d.|	krR|	d. D ]H}d|	krq|	d d/ |d0d  }td1|| j|}
| |
 qd2|	krd3|	d2 kr|	d2 d3 }td4|| j|}
| |
 W q tk
r }
 z&| jd5| d6 t|
 d7 d W 5 d }
~
X Y qX qd S )8NzReceived event, z, from r   r   r   z9You enabled sfp_censys but did not set an API uid/secret!FTz	Skipping z as already mapped.	NETBLOCK_)r   ZNETLBLOCK_OWNERr)   r*   r@   Z
error_typeunknownzCensys returned no data for z%Censys returned an unexpected error: zFound results in Censys.ior'   Z
updated_atz1970-01-01T00:00:00+00:00z%Y-%m-%dT%H:%M:%S+00:00iQ r   r   z#Record found but too old, skipping.locationz, c                 S   s   g | ]}|r|qS r   r   ).0_fr   r   r   
<listcomp>   s      z*sfp_censys.handleEvent.<locals>.<listcomp>cityZprovincepostal_codecountryr&   r2   )ensure_asciir$   Zautonomous_systemasnr!   Zrouted_prefixr%   	protocolsr+   /r"   metadataZos_descriptionr#   z(Error encountered processing record for z ())	eventTypemoduledatarA   r   debugr   r@   r   r   
startswithr   appendstrcheckForStoprL   r   __name__notifyListenersr   strptimegetintr>   mktime	timetuplejoinrC   dumpssplitBaseException)r   event	eventNamesrcModuleName	eventDataqrylistipaddraddrqtyperecrK   
created_dt
created_tsage_limit_tsrO   datpr   r   r   handleEventh   s    









D








zsfp_censys.handleEvent)rd   
__module____qualname____doc__r   optdescsr   rA   dictr   r    r(   rL   r}   r   r   r   r   r      s$   		
'r   )rC   r9   r   r>   netaddrr   sflibr   r   r   r   r   r   r   r   <module>   s   