U
    @6^Q                     @   sX   d dl Z 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                   @   sJ   e Zd ZdZi Zi ZdZe fddZdd Z	dd Z
d	d
 Zdd ZdS )sfp_openstreetmapzOpenStreetMap:Footprint,Investigate,Passive:Real World::Retrieves latitude/longitude coordinates for physical addresses from OpenStreetMap API.Nc                 C   s4   || _ |  | _t| D ]}|| | j|< qd S )N)sftempStorageresultslistkeysopts)selfsfcuserOptsopt r   </var/www/spiderfoot.crq.systems/modules/sfp_openstreetmap.pysetup   s    
zsfp_openstreetmap.setupc                 C   s   dgS )NPHYSICAL_ADDRESSr   r   r   r   r   watchedEvents'   s    zsfp_openstreetmap.watchedEventsc                 C   s   dgS )NPHYSICAL_COORDINATESr   r   r   r   r   producedEvents+   s    z sfp_openstreetmap.producedEventsc              
   C   s   | djddddddd}| jjdtj| | jd	 d
d}|d d krb| jd|  d S zt	
|d }W n< tk
r } z| jdt|  W Y d S d }~X Y nX |S )Nraw_unicode_escapeasciireplace)errorsjson0)qformatZpolygonZaddressdetailsz+https://nominatim.openstreetmap.org/search?_fetchtimeoutr   )timeout	useragentcontentzNo location info found for z Error processing JSON response: )encodedecoder   fetchUrlurllibparse	urlencoder   infor   loads	Exceptiondebugstr)r   qryparamsresdataer   r   r   query0   s$     zsfp_openstreetmap.queryc                 C   s  |j }|j}|j}| jd| d |  || jkrL| jd| d  d S d| j|< |}| drx| jd d S tj	dtj
d	}t|d
|}tj	dtj
d	}t|d
|}| |}td |d kr| jd|  d S | jdtt| d |  |D ]}	z|	d}
|	d}W nB tk
rf } z"| jdt|  W Y qW 5 d }~X Y nX |
r|sxqt|
d t| }| jd|  td|| j|}| | qd S )NzReceived event, z, from z	Skipping z as already mapped.Tzpo boxzSkipping PO BOX addressz.^(c/o|care of|attn:|attention:)\s+[0-9a-z\s\.])flags z&^(Level|Floor|Suite|Room)\s+[0-9a-z]+,   zFound no results for zFound z matches for latlonzFailed to get lat/lon: ,zFound coordinates: r   )	eventTypemoduler2   r   r-   r   lower
startswithrecompile
IGNORECASEsubr4   timesleepr*   r.   lengetBaseExceptionr   __name__notifyListeners)r   event	eventNamesrcModuleName	eventDataaddressZrx1Zrx2r2   locationr8   r9   r3   coordsevtr   r   r   handleEventH   sF    



 
zsfp_openstreetmap.handleEvent)rH   
__module____qualname____doc__r   optdescsr   dictr   r   r   r4   rR   r   r   r   r   r      s   r   )r?   r   rC   urllib.requestr'   urllib.parseurllib.errorsflibr   r   r   r   r   r   r   r   <module>   s
   