mirror of
https://github.com/soxoj/maigret.git
synced 2026-05-06 22:19:01 +00:00
25026e21ea
* Fix site checks: 4 → ip_reputation, 9 fixed, 16 disabled, 3 dead deleted; clarify ip_reputation tag semantics * Improved test coverage
166 lines
5.7 KiB
Python
166 lines
5.7 KiB
Python
"""Maigret activation test functions"""
|
|
|
|
import json
|
|
import yarl
|
|
|
|
import aiohttp
|
|
import pytest
|
|
from mock import Mock
|
|
|
|
from tests.conftest import LOCAL_SERVER_PORT
|
|
from maigret.activation import ParsingActivator, import_aiohttp_cookies
|
|
|
|
COOKIES_TXT = """# HTTP Cookie File downloaded with cookies.txt by Genuinous @genuinous
|
|
# This file can be used by wget, curl, aria2c and other standard compliant tools.
|
|
# Usage Examples:
|
|
# 1) wget -x --load-cookies cookies.txt "https://xss.is/search/"
|
|
# 2) curl --cookie cookies.txt "https://xss.is/search/"
|
|
# 3) aria2c --load-cookies cookies.txt "https://xss.is/search/"
|
|
#
|
|
xss.is FALSE / TRUE 0 xf_csrf test
|
|
xss.is FALSE / TRUE 1642709308 xf_user tset
|
|
.xss.is TRUE / FALSE 0 muchacho_cache test
|
|
.xss.is TRUE / FALSE 1924905600 132_evc test
|
|
localhost FALSE / FALSE 0 a b
|
|
"""
|
|
|
|
|
|
@pytest.mark.skip("captcha")
|
|
@pytest.mark.slow
|
|
def test_vimeo_activation(default_db):
|
|
vimeo_site = default_db.sites_dict['Vimeo']
|
|
token1 = vimeo_site.headers['Authorization']
|
|
|
|
ParsingActivator.vimeo(vimeo_site, Mock())
|
|
token2 = vimeo_site.headers['Authorization']
|
|
|
|
assert token1 != token2
|
|
|
|
|
|
@pytest.mark.slow
|
|
@pytest.mark.asyncio
|
|
async def test_import_aiohttp_cookies(cookie_test_server):
|
|
cookies_filename = 'cookies_test.txt'
|
|
with open(cookies_filename, 'w') as f:
|
|
f.write(COOKIES_TXT)
|
|
|
|
cookie_jar = import_aiohttp_cookies(cookies_filename)
|
|
url = f'http://localhost:{LOCAL_SERVER_PORT}/cookies'
|
|
|
|
cookies = cookie_jar.filter_cookies(yarl.URL(url))
|
|
assert cookies['a'].value == 'b'
|
|
|
|
async with aiohttp.ClientSession(cookie_jar=cookie_jar) as session:
|
|
async with session.get(url=url) as response:
|
|
result = await response.json()
|
|
print(f"Server response: {result}")
|
|
|
|
assert result == {'cookies': {'a': 'b'}}
|
|
|
|
|
|
# ---- OnlyFans signing tests (pure-compute, no network) ----
|
|
|
|
class _FakeSite:
|
|
"""Minimal stand-in for MaigretSite with the attributes onlyfans() touches."""
|
|
|
|
def __init__(self, headers=None, activation=None):
|
|
self.headers = headers or {}
|
|
self.activation = activation or {
|
|
"static_param": "jLM8LXHU1CGcuCzPMNwWX9osCScVuP4D",
|
|
"checksum_indexes": [28, 3, 16, 32, 25, 24, 23, 0, 26],
|
|
"checksum_constant": -180,
|
|
"format": "57203:{}:{:x}:69cfa6d8",
|
|
"url": "https://onlyfans.com/api2/v2/init",
|
|
}
|
|
|
|
|
|
class _FakeResponse:
|
|
def __init__(self, cookies=None):
|
|
self.cookies = cookies or {}
|
|
|
|
|
|
def test_onlyfans_sets_xbc_when_zero(monkeypatch):
|
|
site = _FakeSite(headers={"x-bc": "0", "cookie": "existing=1"})
|
|
|
|
# Prevent any real network. If _sign path still fires requests.get, fail loudly.
|
|
import maigret.activation as act_mod
|
|
|
|
def boom(*a, **kw): # pragma: no cover - sanity
|
|
raise AssertionError("requests.get should not run when cookie is present")
|
|
|
|
monkeypatch.setattr(act_mod.__dict__.get("requests", None) or __import__("requests"), "get", boom, raising=False)
|
|
|
|
logger = Mock()
|
|
ParsingActivator.onlyfans(site, logger, url="https://onlyfans.com/api2/v2/users/adam")
|
|
|
|
# x-bc must be rewritten to a non-zero hex token
|
|
assert site.headers["x-bc"] != "0"
|
|
assert len(site.headers["x-bc"]) == 40 # 20 bytes → 40 hex chars
|
|
# time / sign headers set for target URL
|
|
assert "time" in site.headers and site.headers["time"].isdigit()
|
|
assert site.headers["sign"].startswith("57203:")
|
|
|
|
|
|
def test_onlyfans_fetches_init_cookie_when_missing(monkeypatch):
|
|
"""When cookie header is absent, init endpoint is called and its cookies stored."""
|
|
site = _FakeSite(headers={"x-bc": "already_set_token", "user-id": "0"})
|
|
|
|
import requests
|
|
|
|
captured = {}
|
|
|
|
def fake_get(url, headers=None, timeout=15):
|
|
captured["url"] = url
|
|
captured["headers"] = dict(headers or {})
|
|
return _FakeResponse(cookies={"sess": "abc123", "csrf": "xyz"})
|
|
|
|
monkeypatch.setattr(requests, "get", fake_get)
|
|
|
|
logger = Mock()
|
|
ParsingActivator.onlyfans(site, logger, url="https://onlyfans.com/api2/v2/users/adam")
|
|
|
|
# init request made
|
|
assert captured["url"] == site.activation["url"]
|
|
# headers passed to init include freshly generated time/sign
|
|
assert "time" in captured["headers"]
|
|
assert captured["headers"]["sign"].startswith("57203:")
|
|
# cookie header populated from response
|
|
assert site.headers["cookie"] == "sess=abc123; csrf=xyz"
|
|
|
|
|
|
def test_onlyfans_signature_is_deterministic_for_same_time(monkeypatch):
|
|
"""Two calls with patched time produce identical signatures."""
|
|
site1 = _FakeSite(headers={"x-bc": "token", "cookie": "c=1"})
|
|
site2 = _FakeSite(headers={"x-bc": "token", "cookie": "c=1"})
|
|
|
|
import maigret.activation
|
|
monkeypatch.setattr(maigret.activation, "_time", __import__("time"), raising=False)
|
|
|
|
fixed = 1_700_000_000.123
|
|
import time as time_mod
|
|
monkeypatch.setattr(time_mod, "time", lambda: fixed)
|
|
|
|
logger = Mock()
|
|
ParsingActivator.onlyfans(site1, logger, url="https://onlyfans.com/api2/v2/users/adam")
|
|
ParsingActivator.onlyfans(site2, logger, url="https://onlyfans.com/api2/v2/users/adam")
|
|
|
|
assert site1.headers["time"] == site2.headers["time"]
|
|
assert site1.headers["sign"] == site2.headers["sign"]
|
|
|
|
|
|
def test_onlyfans_sign_differs_per_path(monkeypatch):
|
|
"""Different target URLs must yield different signatures."""
|
|
site = _FakeSite(headers={"x-bc": "token", "cookie": "c=1"})
|
|
|
|
import time as time_mod
|
|
monkeypatch.setattr(time_mod, "time", lambda: 1_700_000_000.0)
|
|
|
|
logger = Mock()
|
|
ParsingActivator.onlyfans(site, logger, url="https://onlyfans.com/api2/v2/users/adam")
|
|
sig_adam = site.headers["sign"]
|
|
|
|
ParsingActivator.onlyfans(site, logger, url="https://onlyfans.com/api2/v2/users/bob")
|
|
sig_bob = site.headers["sign"]
|
|
|
|
assert sig_adam != sig_bob
|