U
    @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   || _ |  | _t | _t | _d| _d| _d| _t	
 | _t| D ]}|| | j|< qHt| j  | _t| j  | _| j dd}|d krd}| j j|dd}|d d kr| j d	| d d
| _d S | j d|d  |d }t|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 5 Q R X d S |d r|d ds|d dr| j d| j|< W 5 Q R X d S zd}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	dt|  d}Y nX |r| jd r||d kr| j	d|d  d  d}|rd|kr|
dd }|d |d ks
|d |d krd}| j || j|< W 5 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   	Skipping z as username not mentioned..r   <")formatr   r)   r#   r!   siteResults
startswithstrBaseExceptiondebugsplit)r.   rB   siter2   ZretnameresfoundZ	firstnamer4   r4   r5   	checkSite]   sb     



$zsfp_accounts.checkSitec           
      C   s   t  }t | _d}d}g }|D ]r}|  r0 d S | jd|d  d |d j|d  |tj	d|d  | j
||fd	 ||   |d
7 }q|rd}t D ]}	|	jdrd}q|sd}td q| jS )NTr   zSpawning thread to check site: rB   z / r?   r@   Zthread_sfp_accounts_)rB   targetargs   Fg      ?)r   dictrP   checkForStopr   r
   rO   appendr   ThreadrY   start	enumeraterB   rQ   timesleep)
r.   rB   siteListretrunningitrV   rX   rtr4   r4   r5   threadSites   s8     
zsfp_accounts.threadSitesc                 C   s  d}t  }t  }| jD ]}|d r*d|kr@| jd|d   q|| jd kr| ||}|d krj|  S t | D ]}|| rv|| qvd}t  }|| |d7 }q|dkr|| jd k r| ||}|d kr|S t | D ]}|| r|| q|S )Nr   validr?   rK   rB   r   r\   )r   r   r   rT   r#   rk   r"   r_   )r.   rB   rh   rW   re   rV   r3   rf   r4   r4   r5   
batchSites   s4    


zsfp_accounts.batchSitesc                    s  |j }|j}|j}t }| jr"d S | jd| d |  |dkrN|dkrNd S |t| j krld| j|< nd S | j	sh| j
dd}|rt  |dD ]}|d	krq | q fd
d| jD | _ndd	fddtdD }| |}	t|	dkrbt  |	D ].}
|
dd }| jd|   | q fdd| jD | _| jd  d| _	|dkr| dd	| ddg}|D ]}|| q|dkr| j|| jd }|| |dkr|dd  }|| |dkr
|| |D ]}d}| jd t krN|| jd krN| j|d  q| jd rz|| jkrz| j|d  q| jd r|| jkr| j|d  q| |}	|	D ] }
td |
| j|}| | q|| jkr||krtd|| j|}| | | j| qd S )!NzReceived event, z, from r:   r   TZsfaccounts_stateH   
 c                    s   g | ]}|d   kr|qS rB   r4   .0ddelsitesr4   r5   
<listcomp>   s      z,sfp_accounts.handleEvent.<locals>.<listcomp>Z$abcdefghijklmnopqrstuvwxyz1234567890c                    s   g | ]}t   qS r4   )randomSystemRandomchoice)rs   x)randpoolr4   r5   rw      s     
   r   z (Category:zDistrusting c                    s   g | ]}|d   kr|qS rq   r4   rr   ru   r4   r5   rw     s      r9    rL   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   rT   r   r"   r   r(   rU   r_   r   joinrangerm   lenr+   lowerreplacedomainKeywordr#   r   r'   r   __name__notifyListenersr   )r.   event	eventNamesrcModuleName	eventDataZusersr   lineZranduserrW   rV   ZsitenamenamesrB   kwuserZadduserevtr4   )rv   r|   r5   handleEvent   s    

 






"
 
zsfp_accounts.handleEvent)r   
__module____qualname____doc__r#   optdescsr   r   r   r]   rP   r   r   r   r!   r6   r<   r>   rY   rk   rm   r   r4   r4   r4   r5   r      sH          8!#r   )	rc   r   r,   rx   sflibr   r   r   r   r4   r4   r4   r5   <module>   s
   