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               @   sn   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d Zd	S )sfp_whatcmsznWhatCMS:Footprint,Investigate,Passive:Content Analysis:apikey,slow:Check web technology using WhatCMS.org API.    
   )api_keytimeoutdelayzWhatCMS API keyzQuery timeout, in seconds.z#Delay between requests, in seconds.NFc             C   sD   || _ d| _| j | _d| _x"t|j D ]}|| | j|< q*W d S )NZWhatCMSF)sf__dataSource__tempStorageresults
errorStatelistkeysopts)selfsfcuserOptsopt r   6/var/www/spiderfoot.crq.systems/modules/sfp_whatcms.pysetup,   s    
zsfp_whatcms.setupc             C   s   dgS )NDOMAIN_NAMEr   )r   r   r   r   watchedEvents6   s    zsfp_whatcms.watchedEventsc             C   s   ddgS )NRAW_RIR_DATAWEBSERVER_TECHNOLOGYr   )r   r   r   r   producedEvents:   s    zsfp_whatcms.producedEventsc             C   sd   |j djddd| jd d}| jjdtjj| | jd | jd	 d
}tj	| jd  | j
|S )Nraw_unicode_escapeasciireplace)errorsr	   )urlkeyz'https://whatcms.org/APIEndpoint/Detect?r
   
_useragent)r
   	useragentr   )encodedecoder   r   fetchUrlurllibparse	urlencodetimesleepparseApiResponse)r   qryparamsresr   r   r   queryCmsDetect?   s    zsfp_whatcms.queryCmsDetectc             C   sd   |j djddd| jd d}| jjdtjj| | jd | jd	 d
}tj	| jd  | j
|S )Nr    r!   r"   )r#   r	   )r$   r%   z+https://whatcms.org/APIEndpoint/Technology?r
   r&   )r
   r'   r   )r(   r)   r   r   r*   r+   r,   r-   r.   r/   r0   )r   r1   r2   r3   r   r   r   queryCmsTechnologyO   s    zsfp_whatcms.queryCmsTechnologyc             C   s  |d d kr| j jd d S |d dkrH| j jd|d  d d| _d S ytj|d }W n4 tk
r } z| j jdt|  d S d }~X nX |jd	}|d kr| j jd
d d S t|jd}|dkr| j jdd d| _d S |dkr| j jdd d| _d S |dkr&| j jdd d| _d S |dkrH| j jdd d| _d S |dkrj| j jdd d| _d S |dkr| j jdd d| _d S |dkr| j jdd d| _d S |dkr| j jdd d| _d S |dkr| j jd| d d| _d S |S )NcontentzNo response from WhatCMS.orgcode200z#Unexpected reply from WhatCMS.org: FTz Error processing JSON response: resultzAPI error: no results0zAPI error: Server failureZ101zAPI error: Invalid API Key102z4API error: Unauthenticated request. Invalid API key?111zAPI error: Invalid URLZ120zAPI error: Too many requestsZ121z7API error: You have exceeded your monthly request quota123zAAPI error: Account disabled per violation of Terms and Conditions201z API error: CMS or Host not foundz)Unexpected status code from WhatCMS.org: )	r   debugerrorr   jsonloadsBaseExceptionstrget)r   r3   dataer9   r7   r   r   r   r0   ^   sl    








zsfp_whatcms.parseApiResponsec       
      C   sJ  |j }|j}|j}| jrd S | jd dkrB| jjdd d| _d S || jkrPd S d| j|< | jjd| d |  | j	|}|d kr| jjd|  d S |j
d	}|d kr| jjd|  d S td
t|| j|}| j| xh|D ]`}|j
dr2djdd |j
d|j
dgD }	td|	| j|}| j| q| jjd|  qW d S )Nr	   r   z3You enabled sfp_whatcms but did not set an API key!FTzReceived event, z, from zNo web technology found for r   r   name c             S   s   g | ]}|r|qS r   r   ).0_fr   r   r   
<listcomp>   s    z+sfp_whatcms.handleEvent.<locals>.<listcomp>versionr   )	eventTypemodulerF   r   r   r   r@   r   r?   r5   rE   r   rD   __name__notifyListenersjoin)
r   event	eventNamesrcModuleName	eventDatarF   r   evtr9   softwarer   r   r   handleEvent   s:    





$zsfp_whatcms.handleEvent)rP   
__module____qualname____doc__r   optdescsr   r   dictr   r   r   r4   r5   r0   rY   r   r   r   r   r      s    
Gr   )rA   urllib.requestr+   urllib.parseurllib.errorr.   sflibr   r   r   r   r   r   r   r   <module>   s   