diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index b22df8464c..3a4b2b796a 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: ["3.7", "3.8", "3.9", "3.10"] + python-version: ["3.9", "3.10", "3.11", "3.12"] os: [ubuntu-latest, macos-latest] steps: diff --git a/Docker b/Docker new file mode 100644 index 0000000000..e69de29bb2 diff --git a/classes.png b/classes.png new file mode 100644 index 0000000000..1157df46a8 Binary files /dev/null and b/classes.png differ diff --git a/local_stuff/classes_spiderfoot.png b/local_stuff/classes_spiderfoot.png new file mode 100644 index 0000000000..bcaf83aaf3 Binary files /dev/null and b/local_stuff/classes_spiderfoot.png differ diff --git a/modules/sfp__stor_stdout.py b/modules/sfp__stor_stdout.py index 49d775227f..435d64210b 100644 --- a/modules/sfp__stor_stdout.py +++ b/modules/sfp__stor_stdout.py @@ -55,20 +55,20 @@ def watchedEvents(self): def output(self, event): d = self.opts['_csvdelim'] - if type(event.data) in [list, dict]: + if isinstance(event.data, (list, dict)): data = str(event.data) else: data = event.data - if type(data) != str: + if not isinstance(data, str): data = str(event.data) - if type(event.sourceEvent.data) in [list, dict]: + if isinstance(event.sourceEvent.data, (list, dict)): srcdata = str(event.sourceEvent.data) else: srcdata = event.sourceEvent.data - if type(srcdata) != str: + if not isinstance(srcdata, str): srcdata = str(event.sourceEvent.data) if self.opts['_stripnewline']: diff --git a/modules/sfp_arin.py b/modules/sfp_arin.py index 81b1852ee2..60638faad4 100644 --- a/modules/sfp_arin.py +++ b/modules/sfp_arin.py @@ -143,7 +143,7 @@ def handleEvent(self, event): if "pocRef" in ret['pocs']: ref = list() # Might be a list or a dictionary - if type(ret['pocs']['pocRef']) == dict: + if isinstance(ret['pocs']['pocRef'], dict): ref = [ret['pocs']['pocRef']] else: ref = ret['pocs']['pocRef'] @@ -169,7 +169,7 @@ def handleEvent(self, event): if "pocRef" in ret['pocs']: ref = list() # Might be a list or a dictionary - if type(ret['pocs']['pocRef']) == dict: + if isinstance(ret['pocs']['pocRef'], dict): ref = [ret['pocs']['pocRef']] else: ref = ret['pocs']['pocRef'] diff --git a/modules/sfp_fraudguard.py b/modules/sfp_fraudguard.py index 39efff7828..c0cbac54ea 100644 --- a/modules/sfp_fraudguard.py +++ b/modules/sfp_fraudguard.py @@ -123,10 +123,10 @@ def query(self, qry): fraudguard_url = "https://api.fraudguard.io/ip/" + qry api_key_account = self.opts['fraudguard_api_key_account'] - if type(api_key_account) == str: + if isinstance(api_key_account, str): api_key_account = api_key_account.encode('utf-8') api_key_password = self.opts['fraudguard_api_key_password'] - if type(api_key_password) == str: + if isinstance(api_key_password, str): api_key_password = api_key_password.encode('utf-8') token = base64.b64encode(api_key_account + ':'.encode('utf-8') + api_key_password) headers = { diff --git a/modules/sfp_github.py b/modules/sfp_github.py index 2dd606e57b..8d0403aec6 100644 --- a/modules/sfp_github.py +++ b/modules/sfp_github.py @@ -263,7 +263,7 @@ def handleEvent(self, event): continue for item in repret: - if type(item) != dict: + if not isinstance(item, dict): self.debug("Encountered an unexpected or empty response from Github.") continue diff --git a/modules/sfp_riskiq.py b/modules/sfp_riskiq.py index 3cf7ce924c..8817609e24 100644 --- a/modules/sfp_riskiq.py +++ b/modules/sfp_riskiq.py @@ -112,10 +112,10 @@ def query(self, qry, qtype, opts=dict()): post = '{"field": "email", "query": "' + qry + '"}' api_key_login = self.opts['api_key_login'] - if type(api_key_login) == str: + if isinstance(api_key_login, str): api_key_login = api_key_login.encode('utf-8') api_key_password = self.opts['api_key_password'] - if type(api_key_password) == str: + if isinstance(api_key_password, str): api_key_password = api_key_password.encode('utf-8') cred = base64.b64encode(api_key_login + ":".encode('utf-8') + api_key_password) headers = { diff --git a/modules/sfp_spider.py b/modules/sfp_spider.py index aa6f301226..96b55065b8 100644 --- a/modules/sfp_spider.py +++ b/modules/sfp_spider.py @@ -243,7 +243,7 @@ def linkNotify(self, url: str, parentEvent=None): else: utype = "LINKED_URL_EXTERNAL" - if type(url) != str: + if not isinstance(url, str): url = str(url, "utf-8", errors='replace') event = SpiderFootEvent(utype, url, self.__name__, parentEvent) self.notifyListeners(event) diff --git a/modules/sfp_tldsearch.py b/modules/sfp_tldsearch.py index eaec60a923..783ba75ca9 100644 --- a/modules/sfp_tldsearch.py +++ b/modules/sfp_tldsearch.py @@ -170,7 +170,7 @@ def handleEvent(self, event): # Look through all TLDs for the existence of this target keyword targetList = list() for tld in self.opts['_internettlds']: - if type(tld) != str: + if not isinstance(tld, str): tld = str(tld.strip(), errors='ignore') else: tld = tld.strip() diff --git a/modules/sfp_xforce.py b/modules/sfp_xforce.py index 4e4aefc4a4..0ea3a0c961 100644 --- a/modules/sfp_xforce.py +++ b/modules/sfp_xforce.py @@ -134,10 +134,10 @@ def query(self, qry, querytype): xforce_url = "https://api.xforce.ibmcloud.com" api_key = self.opts['xforce_api_key'] - if type(api_key) == str: + if isinstance(api_key, str): api_key = api_key.encode('utf-8') api_key_password = self.opts['xforce_api_key_password'] - if type(api_key_password) == str: + if isinstance(api_key_password, str): api_key_password = api_key_password.encode('utf-8') token = base64.b64encode(api_key + ":".encode('utf-8') + api_key_password) headers = { diff --git a/packages.dot b/packages.dot new file mode 100644 index 0000000000..5072335198 --- /dev/null +++ b/packages.dot @@ -0,0 +1,447 @@ +digraph "packages" { +rankdir=BT +charset="utf-8" +"test" [color="black", label=, shape="box", style="solid"]; +"test.conftest" [color="black", label=, shape="box", style="solid"]; +"test.integration" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp__stor_db" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp__stor_stdout" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_abstractapi" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_abusech" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_abuseipdb" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_abusix" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_accounts" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_adblock" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_adguard_dns" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ahmia" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_alienvault" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_alienvaultiprep" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_apple_itunes" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_archiveorg" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_arin" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_azureblobstorage" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_bgpview" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_binaryedge" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_bingsearch" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_bingsharedip" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_bitcoinabuse" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_bitcoinwhoswho" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_blockchain" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_blocklistde" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_botscout" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_botvrij" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_builtwith" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_c99" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_callername" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_censys" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_certspotter" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_cinsscore" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_circllu" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_citadel" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_cleanbrowsing" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_cleantalk" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_clearbit" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_cloudflaredns" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_coinblocker" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_commoncrawl" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_comodo" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_crobat_api" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_crossref" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_crt" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_crxcavator" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_customfeed" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_cybercrimetracker" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_debounce" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dehashed" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_digitaloceanspace" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dns_for_family" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnsbrute" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnscommonsrv" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnsdb" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnsdumpster" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnsgrep" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnsneighbor" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnsraw" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnsresolve" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dnszonexfer" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_dronebl" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_duckduckgo" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_email" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_emailcrawlr" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_emailformat" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_emailrep" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_emergingthreats" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_etherscan" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_filemeta" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_flickr" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_focsec" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_fortinet" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_fraudguard" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_fsecure_riddler" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_fullcontact" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_fullhunt" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_github" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_gleif" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_google_tag_manager" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_googlemaps" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_googleobjectstorage" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_googlesafebrowsing" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_googlesearch" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_gravatar" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_grayhatwarfare" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_greensnow" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_grep_app" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_greynoise" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_h1nobbdde" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_hackertarget" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_haveibeenpwned" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_honeypot" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_hosting" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_hostio" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_hunter" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_hybrid_analysis" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_iknowwhatyoudownload" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_intelx" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ipapico" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ipapicom" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ipinfo" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ipqualityscore" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ipregistry" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ipstack" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_isc" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_jsonwhoiscom" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_junkfiles" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_keybase" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_koodous" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_leakix" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_maltiverse" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_malwarepatrol" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_metadefender" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_mnemonic" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_multiproxy" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_myspace" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_nameapi" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_networksdb" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_neutrinoapi" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_numverify" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_onioncity" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_onionsearchengine" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_onyphe" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_openbugbounty" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_opencorporates" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_opendns" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_opennic" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_openphish" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_openstreetmap" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_pageinfo" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_pastebin" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_pgp" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_phishstats" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_phishtank" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_portscan_tcp" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_projectdiscovery" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_psbdmp" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_pulsedive" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_punkspider" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_quad9" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_reversewhois" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_ripe" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_riskiq" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_robtex" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_s3bucket" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_searchcode" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_securitytrails" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_seon" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_shodan" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_similar" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_skymem" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_slideshare" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_snov" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_sociallinks" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_socialprofiles" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_sorbs" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_spamcop" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_spamhaus" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_spider" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_spur" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_spyonweb" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_sslcert" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_stackoverflow" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_stevenblack_hosts" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_subdomain_takeover" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_sublist3r" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_surbl" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_talosintel" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_textmagic" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_threatcrowd" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_threatfox" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_threatminer" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_tldsearch" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_torch" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_torexits" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_trashpanda" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_trumail" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_twilio" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_twitter" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_uceprotect" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_urlscan" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_venmo" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_viewdns" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_virustotal" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_voipbl" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_vxvault" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_webserver" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_whatcms" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_whois" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_whoisology" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_whoxy" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_wigle" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_wikileaks" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_wikipediaedits" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_xforce" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_yandexdns" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_zetalytics" [color="black", label=, shape="box", style="solid"]; +"test.integration.modules.test_sfp_zoneh" [color="black", label=, shape="box", style="solid"]; +"test.integration.test_sf" [color="black", label=, shape="box", style="solid"]; +"test.integration.test_sfcli" [color="black", label=, shape="box", style="solid"]; +"test.integration.test_sfwebui" [color="black", label=, shape="box", style="solid"]; +"test.unit" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp__stor_db" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp__stor_stdout" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_abstractapi" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_abusech" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_abuseipdb" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_abusix" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_accounts" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_adblock" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_adguard_dns" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ahmia" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_alienvault" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_alienvaultiprep" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_apple_itunes" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_archiveorg" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_arin" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_azureblobstorage" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_base64" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_bgpview" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_binaryedge" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_bingsearch" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_bingsharedip" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_binstring" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_bitcoin" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_bitcoinabuse" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_bitcoinwhoswho" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_blockchain" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_blocklistde" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_botscout" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_botvrij" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_builtwith" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_c99" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_callername" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_censys" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_certspotter" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_cinsscore" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_circllu" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_citadel" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_cleanbrowsing" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_cleantalk" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_clearbit" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_cloudflaredns" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_coinblocker" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_commoncrawl" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_comodo" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_company" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_cookie" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_countryname" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_creditcard" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_crobat_api" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_crossref" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_crt" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_crxcavator" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_customfeed" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_cybercrimetracker" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_debounce" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dehashed" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_digitaloceanspace" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dns_for_family" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnsbrute" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnscommonsrv" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnsdb" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnsdumpster" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnsgrep" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnsneighbor" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnsraw" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnsresolve" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dnszonexfer" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_dronebl" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_duckduckgo" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_email" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_emailcrawlr" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_emailformat" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_emailrep" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_emergingthreats" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_errors" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ethereum" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_etherscan" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_filemeta" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_flickr" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_focsec" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_fortinet" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_fraudguard" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_fsecure_riddler" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_fullcontact" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_fullhunt" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_github" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_gleif" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_google_tag_manager" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_googlemaps" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_googleobjectstorage" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_googlesafebrowsing" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_googlesearch" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_gravatar" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_grayhatwarfare" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_greensnow" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_grep_app" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_greynoise" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_h1nobbdde" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_hackertarget" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_hashes" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_haveibeenpwned" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_honeypot" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_hosting" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_hostio" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_hunter" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_hybrid_analysis" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_iban" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_iknowwhatyoudownload" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_intelx" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_intfiles" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ipapico" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ipapicom" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ipinfo" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ipqualityscore" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ipregistry" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ipstack" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_isc" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_jsonwhoiscom" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_junkfiles" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_keybase" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_koodous" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_leakix" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_maltiverse" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_malwarepatrol" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_metadefender" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_mnemonic" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_multiproxy" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_myspace" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_nameapi" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_names" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_networksdb" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_neutrinoapi" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_numverify" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_onioncity" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_onionsearchengine" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_onyphe" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_openbugbounty" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_opencorporates" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_opendns" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_opennic" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_openphish" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_openstreetmap" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_pageinfo" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_pastebin" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_pgp" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_phishstats" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_phishtank" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_phone" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_portscan_tcp" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_projectdiscovery" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_psbdmp" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_pulsedive" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_punkspider" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_quad9" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_reversewhois" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_ripe" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_riskiq" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_robtex" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_s3bucket" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_searchcode" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_securitytrails" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_seon" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_shodan" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_similar" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_skymem" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_slideshare" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_snov" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_social" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_sociallinks" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_socialprofiles" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_sorbs" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_spamcop" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_spamhaus" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_spider" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_spur" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_spyonweb" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_sslcert" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_stackoverflow" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_stevenblack_hosts" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_strangeheaders" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_subdomain_takeover" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_sublist3r" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_surbl" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_talosintel" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_template" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_textmagic" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_threatcrowd" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_threatfox" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_threatminer" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tldsearch" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_cmseek" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_dnstwist" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_nbtscan" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_nmap" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_nuclei" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_onesixtyone" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_retirejs" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_snallygaster" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_testsslsh" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_trufflehog" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_wafw00f" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_wappalyzer" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_tool_whatweb" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_torch" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_torexits" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_trashpanda" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_trumail" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_twilio" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_twitter" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_uceprotect" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_urlscan" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_venmo" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_viewdns" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_virustotal" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_voipbl" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_vxvault" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_webanalytics" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_webframework" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_webserver" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_whatcms" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_whois" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_whoisology" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_whoxy" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_wigle" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_wikileaks" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_wikipediaedits" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_xforce" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_yandexdns" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_zetalytics" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_zonefiles" [color="black", label=, shape="box", style="solid"]; +"test.unit.modules.test_sfp_zoneh" [color="black", label=, shape="box", style="solid"]; +"test.unit.test_modules" [color="black", label=, shape="box", style="solid"]; +"test.unit.test_spiderfoot" [color="black", label=, shape="box", style="solid"]; +"test.unit.test_spiderfootcli" [color="black", label=, shape="box", style="solid"]; +"test.unit.test_spiderfootscanner" [color="black", label=, shape="box", style="solid"]; +"test.unit.test_spiderfootwebui" [color="black", label=, shape="box", style="solid"]; +} diff --git a/packages.png b/packages.png new file mode 100644 index 0000000000..affde2676a Binary files /dev/null and b/packages.png differ diff --git a/requirements.txt b/requirements.txt index 408acec90b..0218a0c9b8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ adblockparser>=0.7,<1 dnspython>=2.3.0,<3 ExifRead>=2.3.2,<3 -CherryPy>=18.8.0,<19 +CherryPy>=18.10.0,<19 cherrypy-cors>=1.6,<2 Mako>=1.2.4,<2 beautifulsoup4>=4.11.2,<5 -lxml>=4.9.2,<5 +lxml==5.3.0,<6 netaddr>=0.8.0,<1 pysocks>=1.7.1,<2 requests>=2.28.2,<3 diff --git a/sf.py b/sf.py index b16f2df939..e4e80d810e 100644 --- a/sf.py +++ b/sf.py @@ -62,7 +62,7 @@ def main() -> None: '_internettlds': 'https://publicsuffix.org/list/effective_tld_names.dat', '_internettlds_cache': 72, '_genericusers': ",".join(SpiderFootHelpers.usernamesFromWordlists(['generic-usernames'])), - '__database': f"{SpiderFootHelpers.dataPath()}/spiderfoot.db", + '__database': f"{SpiderFootHelpers.dataPath()}spiderfoot.db", '__modules__': None, # List of modules. Will be set after start-up. '__correlationrules__': None, # List of correlation rules. Will be set after start-up. '_socks1type': '', diff --git a/sfcli.py b/sfcli.py index 7341ab3f1b..452d6c5e04 100755 --- a/sfcli.py +++ b/sfcli.py @@ -232,7 +232,7 @@ def pretty(self, data, titlemap=None): out = list() # Get the column titles maxsize = dict() - if type(data[0]) == dict: + if isinstance(data[0], dict): cols = list(data[0].keys()) else: # for lists, use the index numbers as titles @@ -250,12 +250,12 @@ def pretty(self, data, titlemap=None): # Find the maximum column sizes for r in data: for i, c in enumerate(r): - if type(r) == list: + if isinstance(r, list): # we have list index cn = str(i) - if type(c) == int: + if isinstance(c, int): v = str(c) - if type(c) == str: + if isinstance(c, str): v = c else: # we have a dict key @@ -1246,7 +1246,7 @@ def do_set(self, line): self.dprint(f"{k} = {c}", plain=True) for k in sorted(serverconfig.keys()): - if type(serverconfig[k]) == list: + if isinstance(serverconfig[k], list): serverconfig[k] = ','.join(serverconfig[k]) if not cfg: output.append({'opt': k, 'val': str(serverconfig[k])}) @@ -1270,7 +1270,7 @@ def do_set(self, line): for k in serverconfig: if k == cfg: serverconfig[k] = val - if type(val) == str: + if isinstance(val, str): if val.lower() == "true": serverconfig[k] = "1" if val.lower() == "false": @@ -1284,18 +1284,18 @@ def do_set(self, line): # Sanitize the data before sending it to the server for k in serverconfig: optstr = ":".join(k.split(".")[1:]) - if type(serverconfig[k]) == bool: + if isinstance(serverconfig[k], bool): if serverconfig[k]: confdata[optstr] = "1" else: confdata[optstr] = "0" - if type(serverconfig[k]) == list: + if isinstance(serverconfig[k], list): # If set by the user, it must already be a # string, not a list confdata[optstr] = ','.join(serverconfig[k]) - if type(serverconfig[k]) == int: + if isinstance(serverconfig[k], int): confdata[optstr] = str(serverconfig[k]) - if type(serverconfig[k]) == str: + if isinstance(serverconfig[k], str): confdata[optstr] = serverconfig[k] self.ddprint(str(confdata)) diff --git a/sflib.py b/sflib.py index 4b459910fd..f1658e4eb4 100644 --- a/sflib.py +++ b/sflib.py @@ -179,16 +179,17 @@ def optValueToData(self, val: str) -> str: return val - def error(self, message: str) -> None: + def error(self, message: str, exc_info=False) -> None: """Print and log an error message Args: message (str): error message + exc_info (Exception): Additional exception information for logging. """ if not self.opts['__logging']: return - self.log.error(message, extra={'scanId': self._scanId}) + self.log.error(message, extra={'scanId': self._scanId}, exc_info=exc_info) def fatal(self, error: str) -> None: """Print an error message and stacktrace then exit. @@ -224,18 +225,19 @@ def info(self, message: str) -> None: self.log.info(f"{message}", extra={'scanId': self._scanId}) - def debug(self, message: str) -> None: + def debug(self, message: str, exc_info=False) -> None: """Log and print a debug message. Args: message (str): debug message + exc_info (Exception): Additional exception information for logging. """ if not self.opts['_debug']: return if not self.opts['__logging']: return - self.log.debug(f"{message}", extra={'scanId': self._scanId}) + self.log.debug(f"{message}", extra={'scanId': self._scanId}, exc_info=exc_info) def hashstring(self, string: str) -> str: """Returns a SHA256 hash of the specified input. diff --git a/spiderfoot/correlation.py b/spiderfoot/correlation.py index 8b812fb150..b66eaa0013 100644 --- a/spiderfoot/correlation.py +++ b/spiderfoot/correlation.py @@ -165,7 +165,7 @@ def build_db_criteria(self, matchrule: dict) -> dict: criterias['eventType'] = list() if matchrule['method'] == 'regex': - if type(matchrule['value']) != list: + if not isinstance(matchrule['value'], list): regexps = [matchrule['value']] else: regexps = matchrule['value'] @@ -176,7 +176,7 @@ def build_db_criteria(self, matchrule: dict) -> dict: criterias['eventType'].append(t[1]) if matchrule['method'] == 'exact': - if type(matchrule['value']) != list: + if not isinstance(matchrule['value'], list): matches = [matchrule['value']] else: matches = matchrule['value'] diff --git a/spiderfoot/event.py b/spiderfoot/event.py index 5e96d0e60e..da47caae3b 100644 --- a/spiderfoot/event.py +++ b/spiderfoot/event.py @@ -224,7 +224,7 @@ def module(self, module: str) -> None: ValueError: module value was invalid """ if not isinstance(module, str): - raise TypeError(f"module is {type(module )}; expected str()") + raise TypeError(f"module is {type(module)}; expected str()") if not module and self.eventType != "ROOT": raise ValueError("module is empty") diff --git a/test/conftest.py b/test/conftest.py index e3708c0a4a..91d5f5de30 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -14,7 +14,7 @@ def default_options(request): '_internettlds': 'https://publicsuffix.org/list/effective_tld_names.dat', '_internettlds_cache': 72, '_genericusers': ",".join(SpiderFootHelpers.usernamesFromWordlists(['generic-usernames'])), - '__database': f"{SpiderFootHelpers.dataPath()}/spiderfoot.test.db", # note: test database file + '__database': f"{SpiderFootHelpers.dataPath()}spiderfoot.test.db", # note: test database file '__modules__': None, # List of modules. Will be set after start-up. '__correlationrules__': None, # List of correlation rules. Will be set after start-up. '_socks1type': '', diff --git a/test/requirements.txt b/test/requirements.txt index 9d983a2829..2685e39d5f 100644 --- a/test/requirements.txt +++ b/test/requirements.txt @@ -1,7 +1,7 @@ -r ../requirements.txt darglint==1.8.1 dlint==0.14.0 -flake8==5.0.4 +flake8==7.1.1 flake8-annotations==2.9.1 flake8-blind-except==0.2.1 flake8-bugbear==23.2.13 @@ -14,5 +14,5 @@ pytest==7.2.1 pytest-cov==4.0.0 pytest-mock==3.10.0 pytest-xdist==3.2.0 -pycodestyle==2.9.0 +pycodestyle==2.12.1 responses==0.22.0