3
@6^                 @   sP   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mZm	Z	 G dd deZ
dS )    N)
SpiderFootSpiderFootPluginSpiderFootEventc               @   st   e Zd ZdZdddddddd	Zd
ddddddd	ZdZdZdZe	 fddZ
dd Zdd ZdddZdd ZdS )sfp_mnemoniczzMnemonic PassiveDNS:Footprint,Investigate,Passive:Passive DNS::Obtain Passive DNS information from PassiveDNS.mnemonic.no.           TFd   )per_page	max_pagestimeoutmaxageverifycohostsamedomain	maxcohostz#Maximum number of results per page.z,Maximum number of pages of results to fetch.zQuery timeout, in seconds.zOThe maximum age of the data returned, in days, in order to be considered valid.zMVerify co-hosts are valid by checking if they still resolve to the shared IP.z>Treat co-hosted sites on the same target domain as co-hosting?zbStop reporting co-hosted sites after this many are found, as it would likely indicate web hosting.r   Nc             C   sD   || _ | j | _d| _d| _x"t|j D ]}|| | j|< q*W d S )Nr   F)sftempStorageresultscohostcount
errorStatelistkeysopts)selfsfcuserOptsopt r   7/var/www/spiderfoot.crq.systems/modules/sfp_mnemonic.pysetup0   s    
zsfp_mnemonic.setupc             C   s   ddddgS )N
IP_ADDRESSIPV6_ADDRESSINTERNET_NAMEDOMAIN_NAMEr   )r   r   r   r   watchedEvents:   s    zsfp_mnemonic.watchedEventsc             C   s   dddddgS )Nr!   r"   CO_HOSTED_SITEr#   r$   r   )r   r   r   r   producedEvents>   s    zsfp_mnemonic.producedEventsc             C   s  t |t |d}d| d tjj| }| jj|| jd | jd d}tjd |d d krr| jj	d	|  d S yt
j|d }W n, tk
r } z| jjd
 d S d }~X nX |d dkr| jjd d| _d S |d dks| jjd d S d|kr| jj	d	|  d S d|kr,| jj	d	|  d S d|krJ| jj	d	|  d S |d }	|d }
|
 sj|	 r~| jj	d	|  d S | jj	dt |	 d t |
 d  |d S )N)limitoffsetz https://api.mnemonic.no/pdns/v3/?r   
_useragent)r   	useragentg      ?contentzNo results found for zError processing JSON response.ZresponseCodei  z8Error retrieving search results: Resource limit exceededT   z Error retrieving search results.datacountsizez
Retrieved z of z results)strurllibparse	urlencoder   fetchUrlr   timesleepinfojsonloads	Exceptiondebugr   )r   qryr(   r)   paramsurlresr/   er1   r0   r   r   r   queryD   sH    



$zsfp_mnemonic.queryc             C   sp  |j }|j}|j}| jrd S || jkr>| jjd| d  d S d| j|< | jjd| d |  d}t| jd }t| jd }tt	j	 d	 d
| jd   }d}	t
 }
x||| k rH| j rP | jrP | j|||d}|d kr| jjd|  P ||7 }xD|D ]:}d|d ksd|d kr,q|d |k rJ| jjd q|d&krp|d dkrp|
j|d  |d'kr|d dkrq|d dkr| jj|d rtd|d | j|}| j| |d dkr| jj|d rtd|d | j|}| j| |d dkr| j j|d dds2q|
j|d  qW qW xt|
D ]}| j rjd S || jkrzqV|dkr| jd r| jj|| r| jjd| d  |  qV| jd! s,| j j|ddr,td|| j|}| j| | jj|| jd" rVtd|| j|}| j| qV| j| jd# k rVtd$|| j|}| j| |  jd%7  _qVW d S )(Nz	Skipping z as already mapped.TzReceived event, z, from r   r   r   i  i \&r   )r(   r)   zNo passive DNS data found for *rC   %ZlastSeenTimestampzRecord found too old, skipping.r!   rrtypear#   r$   ptranswerZaaaar"   cname)includeParentsr   zHost z no longer resolves to r   _internettldsr   r&      )r!   )r#   r$   )	eventTypemoduler/   r   r   r   r=   intr   r7   r   checkForStoprC   r9   appendvalidIPr   __name__notifyListenersvalidIP6	getTargetmatchesset
validateIPisDomainr   )r   event	eventNamesrcModuleName	eventDatapositionr   r   agelimitr   cohostsr/   revtcor   r   r   handleEvent~   s    






(


zsfp_mnemonic.handleEvent)r   r   )rT   
__module____qualname____doc__r   optdescsr   r   r   dictr    r%   r'   rC   rf   r   r   r   r   r      s.   

:r   )r:   r7   urllib.requestr3   urllib.parseurllib.errorsflibr   r   r   r   r   r   r   r   <module>   s   