pull/134/head
commit
6441005784
@ -0,0 +1,25 @@
|
|||||||
|
group: travis_latest
|
||||||
|
language: python
|
||||||
|
cache: pip
|
||||||
|
matrix:
|
||||||
|
allow_failures:
|
||||||
|
- python: nightly
|
||||||
|
include:
|
||||||
|
- python: 3.6
|
||||||
|
- python: 3.7
|
||||||
|
dist: xenial # required for Python >= 3.7 (travis-ci/travis-ci#9069)
|
||||||
|
- python: nightly
|
||||||
|
dist: xenial
|
||||||
|
install:
|
||||||
|
- pip install -r requirements.txt
|
||||||
|
- pip install flake8
|
||||||
|
before_script:
|
||||||
|
# stop the build if there are Python syntax errors or undefined names
|
||||||
|
- flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics
|
||||||
|
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
||||||
|
- flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
||||||
|
script:
|
||||||
|
- python3 -m unittest tests.all --buffer --verbose
|
||||||
|
notifications:
|
||||||
|
on_success: change
|
||||||
|
on_failure: change # `always` will be the setting once code changes slow down
|
@ -1,11 +1,51 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# install python3 if not exist
|
# Determine which is the default package manager
|
||||||
sudo apt-get install python3
|
APT=$(which apt)
|
||||||
|
PACMAN=$(which pacman)
|
||||||
|
DNF=$(which dnf)
|
||||||
|
YUM=$(which yum)
|
||||||
|
ZYPPER=$(which zypper)
|
||||||
|
|
||||||
|
# install python3 and pip3 if not exist
|
||||||
|
if [ ${#APT} -gt 0 ]; then
|
||||||
|
sudo apt-get install python3
|
||||||
|
sudo apt-get install python3-pip
|
||||||
|
elif [ ${#PACMAN} -gt 0 ]; then
|
||||||
|
sudo pacman -S python3
|
||||||
|
sudo pacman -S python3-pip
|
||||||
|
elif [ ${#DNF} -gt 0 ]; then
|
||||||
|
sudo dnf install python3
|
||||||
|
sudo dnf install python3-pip
|
||||||
|
elif [ ${#YUM} -gt 0 ]; then
|
||||||
|
sudo yum install python3
|
||||||
|
sudo yum install python3-pip
|
||||||
|
elif [ ${#ZYPPER} -gt 0 ]; then
|
||||||
|
sudo zypper install python3
|
||||||
|
sudo zypper install python3-pip
|
||||||
|
else
|
||||||
|
echo "Unknown package manager. Download one of the following:"
|
||||||
|
echo " apt, pacman, dnf, yum or zypper"
|
||||||
|
echo ""
|
||||||
|
echo "or use README.md for instructions."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# install the all the necessery packages and requirements
|
# install the all the necessery packages and requirements
|
||||||
sudo apt-get install python3-pip
|
echo ''
|
||||||
sudo pip3 install --upgrade setuptools
|
echo ''
|
||||||
sudo pip3 install -r requirements.txt
|
while true; do
|
||||||
|
echo 'Do you want dependencies to be installed globally (or locally) [Y/n]?'
|
||||||
|
read ans
|
||||||
|
if [[ ${#ans} -eq 0 || $ans = "Y" || $ans = "y" ]]; then
|
||||||
|
sudo pip3 install --upgrade setuptools
|
||||||
|
sudo pip3 install -r requirements.txt
|
||||||
|
elif [[ $ans = "N" || $ans = "n" ]]; then
|
||||||
|
sudo pip3 install --user --upgrade setuptools
|
||||||
|
sudo pip3 install --user -r requirements.txt
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ ${#ans} -eq 0 || $ans = "Y" || $ans = "y" || $ans = "N" || $ans = "n" ]] && break;
|
||||||
|
done
|
||||||
|
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
"""Sherlock Tests
|
||||||
|
|
||||||
|
This package contains various submodules used to run tests.
|
||||||
|
"""
|
@ -0,0 +1,94 @@
|
|||||||
|
"""Sherlock Tests
|
||||||
|
|
||||||
|
This module contains various tests.
|
||||||
|
"""
|
||||||
|
from tests.base import SherlockBaseTest
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
class SherlockDetectTests(SherlockBaseTest):
|
||||||
|
def test_detect_true(self):
|
||||||
|
"""Test Username Existence Detection.
|
||||||
|
|
||||||
|
This test ensures that the mechanism of ensuring that a Username
|
||||||
|
exists works properly.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
self -- This object.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
N/A.
|
||||||
|
Will trigger an assert if Usernames which are known to exist are
|
||||||
|
not detected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.username_check(['jack'], ['Twitter'], exist_check=True)
|
||||||
|
#self.username_check(['dfox'], ['devRant'], exist_check=True)
|
||||||
|
self.username_check(['blue'], ['Pinterest'], exist_check=True)
|
||||||
|
self.username_check(['kevin'], ['Instagram'], exist_check=True)
|
||||||
|
self.username_check(['zuck'], ['Facebook'], exist_check=True)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def test_detect_false_via_message(self):
|
||||||
|
"""Test Username Does Not Exist (Via Message).
|
||||||
|
|
||||||
|
This test ensures that the "message" detection mechanism of
|
||||||
|
ensuring that a Username does *not* exist works properly.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
self -- This object.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
N/A.
|
||||||
|
Will trigger an assert if detection mechanism did not work as expected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.username_check(['jackkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk'],
|
||||||
|
['Instagram'],
|
||||||
|
exist_check=False
|
||||||
|
)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def test_detect_false_via_status_code(self):
|
||||||
|
"""Test Username Does Not Exist (Via Status Code).
|
||||||
|
|
||||||
|
This test ensures that the "status code" detection mechanism of
|
||||||
|
ensuring that a Username does *not* exist works properly.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
self -- This object.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
N/A.
|
||||||
|
Will trigger an assert if detection mechanism did not work as expected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.username_check(['jackkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk'],
|
||||||
|
['Facebook'],
|
||||||
|
exist_check=False
|
||||||
|
)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def test_detect_false_via_response_url(self):
|
||||||
|
"""Test Username Does Not Exist (Via Response URL).
|
||||||
|
|
||||||
|
This test ensures that the "response URL" detection mechanism of
|
||||||
|
ensuring that a Username does *not* exist works properly.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
self -- This object.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
N/A.
|
||||||
|
Will trigger an assert if detection mechanism did not work as expected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.username_check(['jackkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk'],
|
||||||
|
['Pinterest'],
|
||||||
|
exist_check=False
|
||||||
|
)
|
||||||
|
|
||||||
|
return
|
@ -0,0 +1,107 @@
|
|||||||
|
"""Sherlock Base Tests
|
||||||
|
|
||||||
|
This module contains various utilities for running tests.
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import unittest
|
||||||
|
import sherlock
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
|
||||||
|
class SherlockBaseTest(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
"""Sherlock Base Test Setup.
|
||||||
|
|
||||||
|
Does common setup tasks for base Sherlock tests.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
self -- This object.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
N/A.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#This ignores the ResourceWarning from an unclosed SSLSocket.
|
||||||
|
#TODO: Figure out how to fix the code so this is not needed.
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
|
||||||
|
# Load the data file with all site information.
|
||||||
|
data_file_path = os.path.join(os.path.dirname(os.path.realpath(sherlock.__file__)), "data.json")
|
||||||
|
with open(data_file_path, "r", encoding="utf-8") as raw:
|
||||||
|
self.site_data_all = json.load(raw)
|
||||||
|
|
||||||
|
self.verbose=False
|
||||||
|
self.tor=False
|
||||||
|
self.unique_tor=False
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def site_data_filter(self, site_list):
|
||||||
|
"""Filter Site Data.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
self -- This object.
|
||||||
|
site_list -- List of strings corresponding to sites which
|
||||||
|
should be filtered.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
Dictionary containing sub-set of site data specified by 'site_list'.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Create new dictionary that has filtered site data based on input.
|
||||||
|
# Note that any site specified which is not understood will generate
|
||||||
|
# an error.
|
||||||
|
site_data = {}
|
||||||
|
for site in site_list:
|
||||||
|
with self.subTest(f"Checking test vector Site '{site}' "
|
||||||
|
f"exists in total site data."
|
||||||
|
):
|
||||||
|
site_data[site] = self.site_data_all[site]
|
||||||
|
|
||||||
|
return site_data
|
||||||
|
|
||||||
|
def username_check(self, username_list, site_list, exist_check=True):
|
||||||
|
"""Username Exist Check.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
self -- This object.
|
||||||
|
username_list -- List of strings corresponding to usernames
|
||||||
|
which should exist on *all* of the sites.
|
||||||
|
site_list -- List of strings corresponding to sites which
|
||||||
|
should be filtered.
|
||||||
|
exist_check -- Boolean which indicates if this should be
|
||||||
|
a check for Username existence,
|
||||||
|
or non-existence.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
N/A.
|
||||||
|
Will trigger an assert if Username does not have the expected
|
||||||
|
existence state.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#Filter all site data down to just what is needed for this test.
|
||||||
|
site_data = self.site_data_filter(site_list)
|
||||||
|
|
||||||
|
if exist_check:
|
||||||
|
check_type_text = "exists"
|
||||||
|
exist_result_desired = "yes"
|
||||||
|
else:
|
||||||
|
check_type_text = "does not exist"
|
||||||
|
exist_result_desired = "no"
|
||||||
|
|
||||||
|
for username in username_list:
|
||||||
|
results = sherlock.sherlock(username,
|
||||||
|
site_data,
|
||||||
|
verbose=self.verbose,
|
||||||
|
tor=self.tor,
|
||||||
|
unique_tor=self.unique_tor
|
||||||
|
)
|
||||||
|
for site, result in results.items():
|
||||||
|
with self.subTest(f"Checking Username '{username}' "
|
||||||
|
f"{check_type_text} on Site '{site}'"
|
||||||
|
):
|
||||||
|
self.assertEqual(result['exists'], exist_result_desired)
|
||||||
|
|
||||||
|
return
|
Loading…
Reference in new issue