3
@6^7,                 @   sH   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               @   s   e Zd ZdZdddddddd	d
dddddgddddddZddddddZdZe Ze	 Z
e Z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_accountszAccounts:Footprint,Passive:Social Media:slow:Look for possible associated accounts on nearly 200 websites like Ebay, Slashdot, reddit, etc.rootZabuseZsysadmZsysadminZnocZsupportZadmincontacthelpZflametestinfoZsalesZ
hostmasterT2   )genericignorenamedictignoreworddictmusthavenameuserfromemail_maxthreadsz>Generic internal accounts to not bother looking up externally.z_Don't bother looking up names that are just stand-alone first names (too many false positives).z<Don't bother looking up names that appear in the dictionary.zkThe username must be mentioned on the social media page to consider it valid (helps avoid false positives).zExtract usernames from e-mail addresses at all? If disabled this can reduce false positives for common usernames but for highly unique usernames it would result in missed accounts.)r   r   r   r   r   NFc             C   s   || _ | j | _t | _t | _d| _d| _d| _t	j
 | _x"t|j D ]}|| | j|< qJW t| j j | _t| j j | _| j jdd}|d krd}| j j|dd}|d d kr| j jd	| d d
| _d S | j jd|d  |d }tj|d | _d S )NFzSocial MediaZ
sfaccounts0   zWhttps://raw.githubusercontent.com/WebBreacher/WhatsMyName/master/web_accounts_list.jsonr   )	useragentcontentzUnable to fetch Tsites)sftempStorageresultslistcommonNamesreportedUsers
errorStatedistrustedChecked__dataSource__	threadingLocklockkeysoptsset	dictnames	dictwordswordscacheGetfetchUrlerrorcachePutjsonloadsr   )selfsfcuserOptsoptr   urldata r4   7/var/www/spiderfoot.crq.systems/modules/sfp_accounts.pysetup4   s.    

zsfp_accounts.setupc             C   s   ddddgS )N	EMAILADDRDOMAIN_NAME
HUMAN_NAMEUSERNAMEr4   )r.   r4   r4   r5   watchedEventsT   s    zsfp_accounts.watchedEventsc             C   s   ddgS )Nr:   ACCOUNT_EXTERNAL_OWNEDr4   )r.   r4   r4   r5   producedEventsZ   s    zsfp_accounts.producedEventsc              C   s.  d|krd S |d j |d}|d d |d  d | d }| jj|| jd | jd	 d
d}|d s| j d| j|< W d Q R X d S |d r|d jds|d jdr| j d| j|< W d Q R X d S yd}t|d |d< |d r|d |d krd
}|d r|d |d krd}|d r:|d |d kr:d
}|d rZ|d |d krZd}W n. tk
r   | jj	dt|  d}Y nX |r| jd r||d kr| jj	d|d  d  d}|rd|kr|j
dd }|d |d ks
|d |d krd}| j || j|< W d Q R X d S )N	check_uri)accountnamez (Category: categoryz	)
<SFURL>z</SFURL>_fetchtimeout
_useragentT)timeoutr   noLogr   Fcode45Zaccount_existence_codeZaccount_missing_codeZaccount_existence_stringZaccount_missing_stringzError parsing configuration: r   z	Skipping z as username not mentioned..r   <")formatr   r)   r#   r!   siteResults
startswithstrBaseExceptiondebugsplit)r.   r@   siter2   ZretnameresfoundZ	firstnamer4   r4   r5   	checkSite]   sV     



$zsfp_accounts.checkSitec       
      C   s   t  }t | _d}d}g }xx|D ]p}| j r0d S | jjd|d  d |d j|d  |jtj	d|d  | j
||fd	 || j  |d
7 }q W x@|rd}x tj D ]}	|	jjdrd}qW |sd}tjd qW | jS )NTr   zSpawning thread to check site: r@   z / r>   )r?   Zthread_sfp_accounts_)r@   targetargs   Fg      ?)r   dictrM   checkForStopr   r
   rL   appendr   ThreadrV   start	enumerater@   rN   timesleep)
r.   r@   siteListretrunningitrS   rU   rtr4   r4   r5   threadSites   s.    
"zsfp_accounts.threadSitesc             C   s  d}t  }t  }x| jD ]}|d  s.d|krD| jjd|d   q|| jd kr| j||}|d krj|S x&t |j D ]}|| rx|j| qxW d}t  }|j| |d7 }qW |dko|| jd k r
| j||}|d kr|S x&t |j D ]}|| r|j| qW |S )Nr   validr>   z	Skipping r@   r   rY   )r   r   r   rQ   r#   rh   r"   r\   )r.   r@   re   rT   rb   rS   r3   rc   r4   r4   r5   
batchSites   s4    
zsfp_accounts.batchSitesc                s0  |j }|j}|j}t }| jr"d S | jjd| d |  |dkrN|dkrNd S |t| jj krld| j|< nd S | j	sp| jj
dd}|rt  x&|jdD ]}|d	krq j| qW  fd
d| jD | _ndd	jfddtdD }| j|}	t|	dkrjt  x6|	D ].}
|
jdd }| jjd|   j| qW  fdd| jD | _| jjd  d| _	|dkr|j jdd	|j jddg}x|D ]}|j| qW |dkr| jj|| jd }|j| |dkr|jdd j }|j| |dkr|j| x|D ]}d}| jd t kr^|| jd kr^| jj|d  q| jd r|| jkr| jj|d  q| jd r|| jkr| jj|d  q| j|}	x(|	D ] }
td |
| j|}| j| qW || jkr||krtd|| j|}| j| | jj| qW d S )!NzReceived event, z, from r:   r   TZsfaccounts_stateH   
 c                s   g | ]}|d   kr|qS )r@   r4   ).0d)delsitesr4   r5   
<listcomp>   s    z,sfp_accounts.handleEvent.<locals>.<listcomp>Z$abcdefghijklmnopqrstuvwxyz1234567890c                s   g | ]}t j j qS r4   )randomSystemRandomchoice)rn   x)randpoolr4   r5   rq      s    
   r   z (Category:zDistrusting c                s   g | ]}|d   kr|qS )r@   r4   )rn   ro   )rp   r4   r5   rq     s    r9    rI   r8   _internettldsr7   @r   z% is a generic account name, skipping.r   z+ is found in our name dictionary, skipping.r   z+ is found in our word dictionary, skipping.r<   )	eventTypemoduler3   r   r   r   rQ   r   r"   r   r(   rR   r\   r   joinrangerj   lenr+   lowerreplacedomainKeywordr#   r   r'   r   __name__notifyListenersr   )r.   event	eventNamesrcModuleName	eventDataZusersr   lineZranduserrT   rS   Zsitenamenamesr@   kwuserZadduserevtr4   )rp   rv   r5   handleEvent   s    


 






"



zsfp_accounts.handleEvent)r   
__module____qualname____doc__r#   optdescsr   r   r   rZ   rM   r   r   r   r!   r6   r;   r=   rV   rh   rj   r   r4   r4   r4   r5   r      s6    8!#r   )	r`   r   r,   rr   sflibr   r   r   r   r4   r4   r4   r5   <module>   s
   