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                   @   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   s@   || _ d| _|  | _d| _t| D ]}|| | j|< q(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   | djddd| jd d}| jjdtj| | jd | jd	 d
}t	| jd  | 
|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   | djddd| jd d}| jjdtj| | jd | jd	 d
}t	| jd  | 
|S )Nr!   r"   r#   r$   r	   r&   z+https://whatcms.org/APIEndpoint/Technology?r
   r)   r*   r   r,   r6   r   r   r   queryCmsTechnologyO   s    zsfp_whatcms.queryCmsTechnologyc              
   C   s  |d d kr| j d d S |d dkrH| j d|d  d d| _d S zt|d }W n< tk
r } z| j dt|  W Y d S d }~X Y nX |d	}|d kr| j d
d d S t|d}|dkr| j dd d| _d S |dkr| j dd d| _d S |dkr.| j dd d| _d S |dkrP| j dd d| _d S |dkrr| j dd d| _d S |dkr| j dd d| _d S |dkr| j dd d| _d S |dkr| j dd d| _d S |dkr| 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   r9   dataer?   r=   r   r   r   r5   ^   sl    








zsfp_whatcms.parseApiResponsec           
      C   sF  |j }|j}|j}| jrd S | jd dkrB| jdd d| _d S || jkrPd S d| j|< | jd| d |  | 	|}|d kr| jd|  d S |
d	}|d kr| jd|  d S td
t|| j|}| | |D ]`}|
dr0ddd |
d|
dfD }	td|	| j|}| | q| jd|  qd 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modulerL   r   r   r   rF   r   rE   r;   rK   r   rJ   __name__notifyListenersjoin)
r   event	eventNamesrcModuleName	eventDatarL   r   evtr?   softwarer   r   r   handleEvent   s:    




$zsfp_whatcms.handleEvent)rV   
__module____qualname____doc__r   optdescsr   r   dictr   r   r    r:   r;   r5   r_   r   r   r   r   r      s$   
Gr   )rG   urllib.requestr0   urllib.parseurllib.errorr3   sflibr   r   r   r   r   r   r   r   <module>   s   