U
    @6^                     @   sh   d dl Z d dlmZ d dlZd dlm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)datetime)	IPNetwork)
SpiderFootSpiderFootPluginSpiderFootEventc                   @   sn   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e fddZ	dd Z
dd Zdd Zdd ZdS )sfp_pulsedivez`Pulsedive:Investigate,Passive:Reputation Systems:apikey:Obtain information from Pulsedive's API.       T   )api_keydelayage_limit_daysnetblocklookupmaxnetblocksubnetlookup	maxsubnetzPulsedive API Key.z#Delay between requests, in seconds.z<Ignore any records older than this many days. 0 = unlimited.zLook up all IPs on netblocks deemed to be owned by your target for possible blacklisted hosts on the same target subdomain/domain?zyIf looking up owned netblocks, the maximum netblock size to look up all IPs within (CIDR value, 24 = /24, 16 = /16, etc.)zKLook up all IPs on subnets which your target is a part of for blacklisting?zsIf looking up subnets, the maximum subnet size to look up all the IPs within (CIDR value, 24 = /24, 16 = /16, etc.)NFc                 C   s4   || _ |  | _t| D ]}|| | j|< qd S )N)sftempStorageresultslistkeysopts)selfsfcuserOptsopt r   8/var/www/spiderfoot.crq.systems/modules/sfp_pulsedive.pysetup4   s    
zsfp_pulsedive.setupc                 C   s   dddddgS )N
IP_ADDRESSAFFILIATE_IPADDRINTERNET_NAMENETBLOCK_OWNERNETBLOCK_MEMBERr   r   r   r   r   watchedEvents?   s     zsfp_pulsedive.watchedEventsc                 C   s   dddddgS )NMALICIOUS_INTERNET_NAMEMALICIOUS_IPADDRMALICIOUS_AFFILIATE_IPADDRMALICIOUS_NETBLOCKTCP_PORT_OPENr   r%   r   r   r   producedEventsD   s
     zsfp_pulsedive.producedEventsc              
   C   s   | djddd| jd d}dtj| }| jj|dd	d
}t	| jd  |d dkrv| j
dd d| _d S |d d krd S zt|d }W n6 tk
r } z| j
dd W Y d S d }~X Y nX |S )Nraw_unicode_escapeasciireplace)errorsr   )	indicatorkeyz#https://pulsedive.com/api/info.php?r
   r   )timeout	useragentr   code403z^Pulsedive API key seems to have been rejected or you have exceeded usage limits for the month.FTcontentz.Error processing JSON response from Pulsedive.)encodedecoder   urllibparse	urlencoder   fetchUrltimesleeperror
errorStatejsonloads	Exception)r   qryparamsurlresinfoer   r   r   queryJ   s$    zsfp_pulsedive.queryc                 C   s  |j }|j}|j}| jrd S | jd| d |  | jd dkrZ| jdd d| _d S || jkr|| jd| d	  d S d| j|< |d
kr| jd sd S t	|j
| jd k r| jdtt	|j
 d t| jd   d S |dkr>| jd sd S t	|j
| jd k r>| jdtt	|j
 d t| jd   d S t }|dr~t	|D ]"}|t| d| jt|< qXn
|| |D ]}|  r d S |dks|drd}|dkrd}|dkrd}| |}	|	d krq|	d}
|
r>|
d}|r>|D ](}td|d | | j|}| | q|	d}|sRq| jd |D ]}|}t|	d}|d |d!d 7 }|d"|d#d d$ 7 }|r|d%| d& 7 }|d'd}zht|d(}tt| }tt d)| jd*   }| jd* d+kr.||k r.| jd, W qbW n0 tk
r` } z| jd- W 5 d }~X Y nX t||| j|}| | qbqd S ).NzReceived event, z, from r   r   z5You enabled sfp_pulsedive but did not set an API key!FTz	Skipping z as already mapped.r#   r   r   z$Network size bigger than permitted: z > r$   r   r   	NETBLOCK_r    r(   r!   r)   r"   r'   
attributesportr+   :threatszFound threat info in PulsediveZiidz
 - namez (category)z-
<SFURL>https://pulsedive.com/indicator/?iid=z</SFURL>Zstamp_linkedz%Y-%m-%d %H:%M:%SiQ r   r   z#Record found but too old, skipping.z7Couldn't parse date from Pulsedive so assuming it's OK.)	eventTypemoduledatarA   r   debugr   r@   r   r   	prefixlenstrr   
startswithappendcheckForStoprK   getr   __name__notifyListenersr   strptimeintr>   mktime	timetupleBaseException)r   event	eventNamesrcModuleName	eventDataqrylistipaddraddrevtTyperecrM   portsprJ   rP   resultdescrtidcreated
created_dt
created_tsage_limit_tsr   r   r   handleEventf   s    
















zsfp_pulsedive.handleEvent)r^   
__module____qualname____doc__r   optdescsr   rA   dictr   r&   r,   rK   rw   r   r   r   r   r      s0   r   )rB   r   r>   netaddrr   urllib.requestr:   urllib.parseurllib.errorsflibr   r   r   r   r   r   r   r   <module>   s   