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               @   sf   e Zd ZdZddddZ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d Zd	S )	sfp_wiglezxWigle.net:Footprint,Investigate,Passive:Secondary Networks:apikey:Query wigle.net to identify nearby WiFi access points. Z365z0.01)api_key_encoded
days_limitvariancez-Wigle.net base64-encoded API name/token pair.z+Maximum age of data to be considered valid.zHow tightly to bound queries against the latitude/longitude box extracted from idenified addresses. This value must be between 0.001 and 0.2.NFc             C   s>   || _ | j | _d| _x"t|j D ]}|| | j|< q$W d S )NF)sftempStorageresults
errorStatelistkeysopts)selfsfcuserOptsopt r   4/var/www/spiderfoot.crq.systems/modules/sfp_wigle.pysetup*   s
    
zsfp_wigle.setupc             C   s   dgS )NZPHYSICAL_ADDRESSr   )r   r   r   r   watchedEvents6   s    zsfp_wigle.watchedEventsc             C   s   dgS )NWIFI_ACCESS_POINTr   )r   r   r   r   producedEvents:   s    zsfp_wigle.producedEventsc             C   s   dt jjd|jdddi }dd| jd  d	}| jj|d
d|d}|d dks\|d  r`d S d|d kr~| jjdd d S y6tj	|d }t
|jdg dkrd S |d d d S  tk
r } z| jjdt| d d S d }~X nX d S )Nz-https://api.wigle.net/api/v2/network/geocode?Zaddresscodezutf-8replace)errorszapplication/jsonzBasic r   )AcceptAuthorization   r   )timeout	useragentheaderscode404contentztoo many queriesz*Wigle.net query limit reached for the day.Fr   r   Zboundingboxz/Error processing JSON response from Wigle.net: )urllibparse	urlencodeencoder   r
   fetchUrlerrorjsonloadslenget	Exceptionstr)r   qryurlhdrsresinfoer   r   r   	getcoords=   s&    

zsfp_wigle.getcoordsc             C   s  d$t |d  d t |d  d t |d  d t |d	  d
 | jd  }| jd dkrtjj tjt| jd d }|jd}|d| 7 }dd| jd  d}| jj|dd|d}|d dks|d  rd S d|d kr| jj	dd d S t
 }yttj|d }t|jdg dkr"d S xF|d D ]:}	d |	d |	d  gkr,|j|	d d! |	d   d"  q,W |S  tk
r }
 z| jj	d#t |
 d d S d }
~
X nX d S )%Nz;https://api.wigle.net/api/v2/network/search?onlymine=false&z
latrange1=r   z&latrange2=   z&longrange1=   z&longrange2=   z%&freenet=false&paynet=false&variance=r	   r   0)daysz%Y%m%dz
&lastupdt=zapplication/jsonzBasic r   )r   r   r   r   )r    r!   r"   r#   r$   r%   ztoo many queriesz*Wigle.net query limit reached for the day.Fr   ZssidZnetidz
 (Net ID: )z/Error processing JSON response from Wigle.net: zEhttps://api.wigle.net/api/v2/network/search?onlymine=false&latrange1=)r1   r   datetimenow	timedeltaintstrftimer
   r*   r+   r   r,   r-   r.   r/   appendr0   )r   coordsr3   dtZ	date_calcr4   r5   retr6   rr7   r   r   r   getnetworksV   s4    N 


$zsfp_wigle.getnetworksc       	      C   s   |j }|j}|j}| jrd S | jd dkrB| jjdd d| _d S | jjd| d |  || jkr|| jjd| d	  d S d| j|< | j	|}|s| jjd
d d S | j
|}|s| jjdd d S x&|D ]}td|| j|}| j| qW d S )Nr   r   z1You enabled sfp_wigle but did not set an API key!FTzReceived event, z, from z	Skipping z as already mapped.z4Couldn't get coordinates for address from Wigle.net.z5Couldn't get networks for coordinates from Wigle.net.r   )	eventTypemoduledatar   r   r
   r+   debugr   r8   rI   r   __name__notifyListeners)	r   event	eventNamesrcModuleName	eventDatarE   netsnr7   r   r   r   handleEvent}   s2    




zsfp_wigle.handleEvent)rN   
__module____qualname____doc__r   optdescsr   r   dictr   r   r   r8   rI   rV   r   r   r   r   r      s   'r   )r,   r?   urllib.requestr&   urllib.parseurllib.errorsflibr   r   r   r   r   r   r   r   <module>   s   