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                   @   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:   || _ |  | _d| _t| D ]}|| | j|< q"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d|jdddi }dd| jd  d	}| jj|d
d|d}|d dksZ|d s^d S d|d kr|| jdd d S z:t	|d }t
|dg dkrW d S |d d d W S  tk
r } z | jdt| d W Y d S d }~X Y nX d S )Nz-https://api.wigle.net/api/v2/network/geocode?Zaddresscodezutf-8replace)errorsapplication/jsonBasic r   AcceptAuthorization   r   timeout	useragentheaderscode404contenttoo many queries*Wigle.net query limit reached for the day.Fr   r   Zboundingbox/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 tjt| jd d }|d}|d| 7 }dd| jd  d}| jj|dd|d}|d dks|d sd S d|d kr| j	dd d S t
 }ztt|d }t|dg dkr"W d S |d D ]:}	d |	d |	d fkr*||	d d  |	d  d!  q*|W S  tk
r }
 z | j	d"t |
 d W Y d S d }
~
X Y nX d S )#NzEhttps://api.wigle.net/api/v2/network/search?onlymine=false&latrange1=r   z&latrange2=   z&longrange1=   z&longrange2=   z%&freenet=false&paynet=false&variance=r	   r   0)daysz%Y%m%dz
&lastupdt=r   r   r   r    r#   r   r$   r(   r)   r*   r+   r,   Fr   ZssidZnetidz
 (Net ID: )r-   )r9   r   datetimenow	timedeltaintstrftimer
   r2   r3   r   r4   r5   r6   r7   appendr8   )r   coordsr;   dtZ	date_calcr<   r=   retr>   rr?   r   r   r   getnetworksV   s^    



 

 "zsfp_wigle.getnetworksc           	      C   s   |j }|j}|j}| jrd S | jd dkrB| jdd d| _d S | jd| d |  || jkr|| jd| d	  d S d| j|< | 	|}|s| jd
d d S | 
|}|s| jdd d S |D ]}td|| j|}| | qd 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
   r3   debugr   r@   rQ   r   __name__notifyListeners)	r   event	eventNamesrcModuleName	eventDatarM   netsnr?   r   r   r   handleEvent}   s2    



zsfp_wigle.handleEvent)rV   
__module____qualname____doc__r   optdescsr   r   dictr   r   r   r@   rQ   r^   r   r   r   r   r      s"   
'r   )r4   rG   urllib.requestr.   urllib.parseurllib.errorsflibr   r   r   r   r   r   r   r   <module>   s   