U
    @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   s@   || _ |  | _d| _d| _t| D ]}|| | j|< q(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d | jd d}td |d d krr| j	d	|  d S zt
|d }W n4 tk
r } z| jd
 W Y d S d }~X Y nX |d dkr| jd d| _d S |d dks| jd d S d|kr| j	d	|  d S d|kr4| j	d	|  d S d|krR| j	d	|  d S |d }	|d }
|
rn|	s| j	d	|  d S | 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resr1   er3   r2   r   r   r   queryD   sJ    



$zsfp_mnemonic.queryc                 C   sd  |j }|j}|j}| jrd S || jkr>| jd| d  d S d| j|< | jd| d |  d}t| jd }t| jd }tt		 d	 d
| jd   }d}	t
 }
||| k rD|  rqD| jr̐qD| j|||d}|d kr| jd|  qD||7 }|D ]:}d|d ksd|d kr*q|d |k rH| jd q|dkrn|d dkrn|
|d  |dkr|d dkrq|d dkr| j|d rtd|d | j|}| | |d dkr| j|d rtd|d | j|}| | |d dkr|  j|d dds0q|
|d  qqt|
D ]}|  rb d S || jkrrqL|dkr| jd r| j||s| jd| d  |  qL| jd! s"|  j|ddr"td"|| j|}| | | j|| jd# rLtd$|| j|}| | qL| j| jd% k rLtd&|| j|}| | |  jd'7  _qLd S )(Nz	Skipping z as already mapped.TzReceived event, z, from r   r   r   i  i \&r   r)   zNo passive DNS data found for *rE   %ZlastSeenTimestampzRecord found too old, skipping.)r!   rrtypea)r#   r$   ptranswerr!   Zaaaar"   cname)includeParentsr   zHost z no longer resolves to r   r#   _internettldsr$   r   r'      )	eventTypemoduler1   r   r   r   r?   intr   r9   r   checkForStoprE   r;   appendvalidIPr   __name__notifyListenersvalidIP6	getTargetmatchesset
validateIPisDomainr   )r   event	eventNamesrcModuleName	eventDatapositionr   r   agelimitr   cohostsr1   revtcor   r   r   handleEvent~   s    







&


zsfp_mnemonic.handleEvent)r   r   )rV   
__module____qualname____doc__r   optdescsr   r   r   dictr    r&   r(   rE   rh   r   r   r   r   r      s2   


:r   )r<   r9   urllib.requestr5   urllib.parseurllib.errorsflibr   r   r   r   r   r   r   r   <module>   s   