Compare commits
15 Commits
improvements
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e2a4f6b66 | |||
| 2b985b57ad | |||
| ed0865363f | |||
| 43a354b235 | |||
| aa5c3b0010 | |||
| 2df7c61be8 | |||
| 61aae782ee | |||
| 6eaec5cccd | |||
| dca64e35d3 | |||
| 2e2248a8a6 | |||
| a9960ff9a4 | |||
| d731f715bf | |||
| 271608fb22 | |||
| 32fde9bfc6 | |||
| 4656d95702 |
@@ -20,6 +20,7 @@ jobs:
|
|||||||
# Checkout the base branch but fetch all history to avoid a second fetch call
|
# Checkout the base branch but fetch all history to avoid a second fetch call
|
||||||
ref: ${{ github.base_ref }}
|
ref: ${{ github.base_ref }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
@@ -90,11 +91,11 @@ jobs:
|
|||||||
# --- The rest of the steps below are unchanged ---
|
# --- The rest of the steps below are unchanged ---
|
||||||
|
|
||||||
- name: Validate modified targets
|
- name: Validate modified targets
|
||||||
if: steps.discover-modified.outputs.changed_targets != ''
|
env:
|
||||||
continue-on-error: true
|
CHANGED_TARGETS: ${{ steps.discover-modified.outputs.changed_targets }}
|
||||||
run: |
|
run: |
|
||||||
poetry run pytest -q --tb no -rA -m validate_targets -n 20 \
|
poetry run pytest -q --tb no -rA -m validate_targets -n 20 \
|
||||||
--chunked-sites "${{ steps.discover-modified.outputs.changed_targets }}" \
|
--chunked-sites "$CHANGED_TARGETS" \
|
||||||
--junitxml=validation_results.xml
|
--junitxml=validation_results.xml
|
||||||
|
|
||||||
- name: Prepare validation summary
|
- name: Prepare validation summary
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ source = "init"
|
|||||||
|
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "sherlock-project"
|
name = "sherlock-project"
|
||||||
version = "0.16.0"
|
version = "0.16.1"
|
||||||
description = "Hunt down social media accounts by username across social networks"
|
description = "Hunt down social media accounts by username across social networks"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
authors = [
|
authors = [
|
||||||
|
|||||||
@@ -159,6 +159,7 @@
|
|||||||
"errorType": "status_code",
|
"errorType": "status_code",
|
||||||
"url": "https://www.artstation.com/{}",
|
"url": "https://www.artstation.com/{}",
|
||||||
"urlMain": "https://www.artstation.com/",
|
"urlMain": "https://www.artstation.com/",
|
||||||
|
"urlProbe": "https://www.artstation.com/users/{}.json",
|
||||||
"username_claimed": "Blue"
|
"username_claimed": "Blue"
|
||||||
},
|
},
|
||||||
"Asciinema": {
|
"Asciinema": {
|
||||||
@@ -404,6 +405,13 @@
|
|||||||
"urlMain": "https://carbonmade.com/",
|
"urlMain": "https://carbonmade.com/",
|
||||||
"username_claimed": "jenny"
|
"username_claimed": "jenny"
|
||||||
},
|
},
|
||||||
|
"Carrd": {
|
||||||
|
"errorType": "status_code",
|
||||||
|
"regexCheck": "^[a-zA-Z0-9_-]{3,50}$",
|
||||||
|
"url": "https://{}.carrd.co/",
|
||||||
|
"urlMain": "https://carrd.co/",
|
||||||
|
"username_claimed": "blue"
|
||||||
|
},
|
||||||
"Career.habr": {
|
"Career.habr": {
|
||||||
"errorMsg": "<h1>\u041e\u0448\u0438\u0431\u043a\u0430 404</h1>",
|
"errorMsg": "<h1>\u041e\u0448\u0438\u0431\u043a\u0430 404</h1>",
|
||||||
"errorType": "message",
|
"errorType": "message",
|
||||||
@@ -602,10 +610,9 @@
|
|||||||
"username_claimed": "blue"
|
"username_claimed": "blue"
|
||||||
},
|
},
|
||||||
"Cracked Forum": {
|
"Cracked Forum": {
|
||||||
"errorMsg": "The member you specified is either invalid or doesn't exist",
|
"errorType": "status_code",
|
||||||
"errorType": "message",
|
"url": "https://cracked.ax/{}",
|
||||||
"url": "https://cracked.sh/{}",
|
"urlMain": "https://cracked.ax/",
|
||||||
"urlMain": "https://cracked.sh/",
|
|
||||||
"username_claimed": "Blue"
|
"username_claimed": "Blue"
|
||||||
},
|
},
|
||||||
"Credly": {
|
"Credly": {
|
||||||
@@ -952,7 +959,8 @@
|
|||||||
"username_claimed": "blue"
|
"username_claimed": "blue"
|
||||||
},
|
},
|
||||||
"GeeksforGeeks": {
|
"GeeksforGeeks": {
|
||||||
"errorType": "status_code",
|
"errorMsg": "false | GeeksforGeeks Profile",
|
||||||
|
"errorType": "message",
|
||||||
"url": "https://auth.geeksforgeeks.org/user/{}",
|
"url": "https://auth.geeksforgeeks.org/user/{}",
|
||||||
"urlMain": "https://www.geeksforgeeks.org/",
|
"urlMain": "https://www.geeksforgeeks.org/",
|
||||||
"username_claimed": "adam"
|
"username_claimed": "adam"
|
||||||
@@ -1526,7 +1534,8 @@
|
|||||||
"username_claimed": "lottiefiles"
|
"username_claimed": "lottiefiles"
|
||||||
},
|
},
|
||||||
"LushStories": {
|
"LushStories": {
|
||||||
"errorType": "status_code",
|
"errorType": "response_url",
|
||||||
|
"errorUrl": "https://www.lushstories.com/login",
|
||||||
"isNSFW": true,
|
"isNSFW": true,
|
||||||
"url": "https://www.lushstories.com/profile/{}",
|
"url": "https://www.lushstories.com/profile/{}",
|
||||||
"urlMain": "https://www.lushstories.com/",
|
"urlMain": "https://www.lushstories.com/",
|
||||||
@@ -2279,6 +2288,13 @@
|
|||||||
"urlMain": "https://sourceforge.net/",
|
"urlMain": "https://sourceforge.net/",
|
||||||
"username_claimed": "blue"
|
"username_claimed": "blue"
|
||||||
},
|
},
|
||||||
|
"SpaceHey": {
|
||||||
|
"errorType": "message",
|
||||||
|
"errorMsg": "Not Found (Error 404) | SpaceHey",
|
||||||
|
"url": "https://spacehey.com/{}",
|
||||||
|
"urlMain": "https://spacehey.com/",
|
||||||
|
"username_claimed": "blue"
|
||||||
|
},
|
||||||
"SoylentNews": {
|
"SoylentNews": {
|
||||||
"errorMsg": "The user you requested does not exist, no matter how much you wish this might be the case.",
|
"errorMsg": "The user you requested does not exist, no matter how much you wish this might be the case.",
|
||||||
"errorType": "message",
|
"errorType": "message",
|
||||||
@@ -2376,6 +2392,13 @@
|
|||||||
"urlMain": "https://www.strava.com/",
|
"urlMain": "https://www.strava.com/",
|
||||||
"username_claimed": "blue"
|
"username_claimed": "blue"
|
||||||
},
|
},
|
||||||
|
"Substack": {
|
||||||
|
"errorType": "status_code",
|
||||||
|
"regexCheck": "^[a-zA-Z0-9][a-zA-Z0-9_-]{1,60}$",
|
||||||
|
"url": "https://{}.substack.com/",
|
||||||
|
"urlMain": "https://substack.com/",
|
||||||
|
"username_claimed": "green"
|
||||||
|
},
|
||||||
"SublimeForum": {
|
"SublimeForum": {
|
||||||
"errorType": "status_code",
|
"errorType": "status_code",
|
||||||
"url": "https://forum.sublimetext.com/u/{}",
|
"url": "https://forum.sublimetext.com/u/{}",
|
||||||
@@ -2827,8 +2850,10 @@
|
|||||||
},
|
},
|
||||||
"akniga": {
|
"akniga": {
|
||||||
"errorType": "status_code",
|
"errorType": "status_code",
|
||||||
|
"errorCode": 404,
|
||||||
|
"request_method": "GET",
|
||||||
"url": "https://akniga.org/profile/{}",
|
"url": "https://akniga.org/profile/{}",
|
||||||
"urlMain": "https://akniga.org/profile/blue/",
|
"urlMain": "https://akniga.org/",
|
||||||
"username_claimed": "blue"
|
"username_claimed": "blue"
|
||||||
},
|
},
|
||||||
"authorSTREAM": {
|
"authorSTREAM": {
|
||||||
|
|||||||
@@ -136,6 +136,9 @@ def get_response(request_future, error_type, social_network):
|
|||||||
except requests.exceptions.RequestException as err:
|
except requests.exceptions.RequestException as err:
|
||||||
error_context = "Unknown Error"
|
error_context = "Unknown Error"
|
||||||
exception_text = str(err)
|
exception_text = str(err)
|
||||||
|
except UnicodeError as err:
|
||||||
|
error_context = "Encoding Error"
|
||||||
|
exception_text = str(err)
|
||||||
|
|
||||||
return response, error_context, exception_text
|
return response, error_context, exception_text
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
"""Tests for handling usernames with special/unicode characters."""
|
||||||
|
|
||||||
|
from concurrent.futures import Future
|
||||||
|
|
||||||
|
from sherlock_project.sherlock import get_response
|
||||||
|
|
||||||
|
|
||||||
|
def _make_future_with_exception(exc):
|
||||||
|
"""Create a Future that raises the given exception."""
|
||||||
|
future = Future()
|
||||||
|
future.set_exception(exc)
|
||||||
|
return future
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_response_handles_unicode_decode_error():
|
||||||
|
"""Regression test for issue #2730.
|
||||||
|
|
||||||
|
Usernames with special characters (e.g. 'Émile') can trigger a
|
||||||
|
UnicodeDecodeError inside the requests library during redirect
|
||||||
|
handling. This must not crash the program.
|
||||||
|
"""
|
||||||
|
future = _make_future_with_exception(
|
||||||
|
UnicodeDecodeError("utf-8", b"\xe9", 0, 1, "invalid continuation byte")
|
||||||
|
)
|
||||||
|
response, error_context, exception_text = get_response(
|
||||||
|
request_future=future,
|
||||||
|
error_type=["status_code"],
|
||||||
|
social_network="TestSite",
|
||||||
|
)
|
||||||
|
assert response is None
|
||||||
|
assert error_context == "Encoding Error"
|
||||||
|
assert "utf-8" in exception_text
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_response_handles_unicode_encode_error():
|
||||||
|
"""UnicodeEncodeError should also be caught (subclass of UnicodeError)."""
|
||||||
|
future = _make_future_with_exception(
|
||||||
|
UnicodeEncodeError("ascii", "É", 0, 1, "ordinal not in range(128)")
|
||||||
|
)
|
||||||
|
response, error_context, exception_text = get_response(
|
||||||
|
request_future=future,
|
||||||
|
error_type=["status_code"],
|
||||||
|
social_network="TestSite",
|
||||||
|
)
|
||||||
|
assert response is None
|
||||||
|
assert error_context == "Encoding Error"
|
||||||
|
assert "ascii" in exception_text
|
||||||
+3
-3
@@ -4,7 +4,7 @@ from sherlock_interactives import Interactives
|
|||||||
from sherlock_interactives import InteractivesSubprocessError
|
from sherlock_interactives import InteractivesSubprocessError
|
||||||
|
|
||||||
def test_remove_nsfw(sites_obj):
|
def test_remove_nsfw(sites_obj):
|
||||||
nsfw_target: str = 'Pornhub'
|
nsfw_target: str = 'Xvideos'
|
||||||
assert nsfw_target in {site.name: site.information for site in sites_obj}
|
assert nsfw_target in {site.name: site.information for site in sites_obj}
|
||||||
sites_obj.remove_nsfw_sites()
|
sites_obj.remove_nsfw_sites()
|
||||||
assert nsfw_target not in {site.name: site.information for site in sites_obj}
|
assert nsfw_target not in {site.name: site.information for site in sites_obj}
|
||||||
@@ -12,8 +12,8 @@ def test_remove_nsfw(sites_obj):
|
|||||||
|
|
||||||
# Parametrized sites should *not* include Motherless, which is acting as the control
|
# Parametrized sites should *not* include Motherless, which is acting as the control
|
||||||
@pytest.mark.parametrize('nsfwsites', [
|
@pytest.mark.parametrize('nsfwsites', [
|
||||||
['Pornhub'],
|
['Xvideos'],
|
||||||
['Pornhub', 'Xvideos'],
|
['Xvideos', 'Erome'],
|
||||||
])
|
])
|
||||||
def test_nsfw_explicit_selection(sites_obj, nsfwsites):
|
def test_nsfw_explicit_selection(sites_obj, nsfwsites):
|
||||||
for site in nsfwsites:
|
for site in nsfwsites:
|
||||||
|
|||||||
Reference in New Issue
Block a user