Revision 3611dd6a
Added by koszko over 1 year ago
| Makefile.in | ||
|---|---|---|
| 1 | 1 |
# This file is part of Haketilo |
| 2 | 2 |
# |
| 3 |
# Copyright (C) 2021, jahoti
|
|
| 4 |
# Copyright (C) 2021, Wojtek Kosior |
|
| 3 |
# Copyright (C) 2021 jahoti |
|
| 4 |
# Copyright (C) 2021, 2022 Wojtek Kosior
|
|
| 5 | 5 |
# |
| 6 | 6 |
# This program is free software: you can redistribute it and/or modify |
| 7 | 7 |
# it under the terms of the CC0 1.0 Universal License as published by |
| ... | ... | |
| 76 | 76 |
test-environment: test/certs/rootCA.pem test/certs/site.key |
| 77 | 77 |
python3 -m test |
| 78 | 78 |
|
| 79 |
test-environment-with-haketilo: test/certs/rootCA.pem test/certs/site.key \ |
|
| 80 |
$(default_target)-build.zip |
|
| 81 |
python3 -m test --load-haketilo |
|
| 82 |
|
|
| 79 | 83 |
# helper targets |
| 80 | 84 |
clean mostlyclean: |
| 81 | 85 |
rm -rf mozilla-unpacked chromium-unpacked haketilo-$(version) |
| test/__main__.py | ||
|---|---|---|
| 36 | 36 |
from .server import do_an_internet |
| 37 | 37 |
from .misc_constants import * |
| 38 | 38 |
from .profiles import firefox_safe_mode |
| 39 |
from .extension_crafting import get_extension_base_url |
|
| 39 | 40 |
|
| 40 | 41 |
def fail(msg, error_code): |
| 41 | 42 |
print('Error:', msg)
|
| 42 |
print('Usage:', sys.argv[0], '[certificates_directory] [proxy_port]')
|
|
| 43 |
print('Usage:', sys.argv[0], '[--load-haketilo]', '[certificates_directory] [proxy_port]')
|
|
| 43 | 44 |
sys.exit(error_code) |
| 44 | 45 |
|
| 45 |
certdir = Path(sys.argv[1]).resolve() if len(sys.argv) > 1 else default_cert_dir |
|
| 46 |
load_haketilo = False |
|
| 47 |
argv_idx = 1 |
|
| 48 |
if len(sys.argv) > argv_idx and sys.argv[argv_idx] == '--load-haketilo': |
|
| 49 |
load_haketilo = True |
|
| 50 |
argv_idx += 1 |
|
| 51 |
|
|
| 52 |
certdir = Path(sys.argv[argv_idx]).resolve() if len(sys.argv) > argv_idx \ |
|
| 53 |
else default_cert_dir |
|
| 54 |
|
|
| 46 | 55 |
if not certdir.is_dir(): |
| 47 | 56 |
fail('selected certificate directory does not exist.', 2)
|
| 48 | 57 |
|
| 49 |
port = sys.argv[2] if len(sys.argv) > 2 else str(default_proxy_port) |
|
| 58 |
argv_idx += 1 |
|
| 59 |
|
|
| 60 |
port = sys.argv[argv_idx] if len(sys.argv) > argv_idx \ |
|
| 61 |
else str(default_proxy_port) |
|
| 62 |
|
|
| 50 | 63 |
if not port.isnumeric(): |
| 51 | 64 |
fail('port must be an integer.', 3)
|
| 52 | 65 |
|
| 53 | 66 |
httpd = do_an_internet(certdir, int(port)) |
| 54 | 67 |
driver = firefox_safe_mode(proxy_port=int(port)) |
| 55 | 68 |
|
| 69 |
if load_haketilo: |
|
| 70 |
driver.install_addon(str(here.parent / 'mozilla-build.zip'), temporary=True) |
|
| 71 |
driver.get(get_extension_base_url(driver) + 'html/settings.html') |
|
| 72 |
|
|
| 56 | 73 |
print("You can now control the browser through 'driver' object")
|
| 57 | 74 |
|
| 58 | 75 |
# Here we enable readline-enhanced editing: |
| test/extension_crafting.py | ||
|---|---|---|
| 6 | 6 |
|
| 7 | 7 |
# This file is part of Haketilo. |
| 8 | 8 |
# |
| 9 |
# Copyright (C) 2021 Wojtek Kosior <koszko@koszko.org> |
|
| 9 |
# Copyright (C) 2021, 2022 Wojtek Kosior <koszko@koszko.org>
|
|
| 10 | 10 |
# |
| 11 | 11 |
# This program is free software: you can redistribute it and/or modify |
| 12 | 12 |
# it under the terms of the GNU General Public License as published by |
| ... | ... | |
| 27 | 27 |
|
| 28 | 28 |
import json |
| 29 | 29 |
import zipfile |
| 30 |
import re |
|
| 31 |
import shutil |
|
| 32 |
import subprocess |
|
| 33 |
|
|
| 30 | 34 |
from pathlib import Path |
| 31 | 35 |
from uuid import uuid4 |
| 32 | 36 |
from tempfile import TemporaryDirectory |
| 33 |
import shutil |
|
| 34 |
import subprocess |
|
| 37 |
|
|
| 38 |
from selenium.webdriver.support.ui import WebDriverWait |
|
| 39 |
from selenium.common.exceptions import NoSuchElementException |
|
| 35 | 40 |
|
| 36 | 41 |
from .misc_constants import * |
| 37 | 42 |
|
| ... | ... | |
| 170 | 175 |
html.add_to_xpi(xpi) |
| 171 | 176 |
|
| 172 | 177 |
return destination_path |
| 178 |
|
|
| 179 |
extract_base_url_re = re.compile(r'^(.*)manifest.json$') |
|
| 180 |
|
|
| 181 |
def get_extension_base_url(driver): |
|
| 182 |
""" |
|
| 183 |
Extension's internall UUID is not directly exposed in Selenium. Instead, we |
|
| 184 |
can navigate to about:debugging and inspect the manifest URL present there |
|
| 185 |
to get the base url like: |
|
| 186 |
moz-extension://b225c78f-d108-4caa-8406-f38b37d8dee5/ |
|
| 187 |
which can then be used to navigate to extension-bundled pages. |
|
| 188 |
""" |
|
| 189 |
# For newer Firefoxes |
|
| 190 |
driver.get('about:debugging#/runtime/this-firefox')
|
|
| 191 |
|
|
| 192 |
def get_manifest_link_newer_ff(driver): |
|
| 193 |
try: |
|
| 194 |
return driver.find_element_by_class_name('qa-manifest-url')
|
|
| 195 |
except NoSuchElementException: |
|
| 196 |
pass |
|
| 197 |
|
|
| 198 |
try: |
|
| 199 |
details = driver.find_element_by_class_name('error-page-details')
|
|
| 200 |
except NoSuchElementException: |
|
| 201 |
return False |
|
| 202 |
|
|
| 203 |
if '#/runtime/this-firefox' in details.text: |
|
| 204 |
return "not_newer_ff" |
|
| 205 |
|
|
| 206 |
manifest_link = WebDriverWait(driver, 10).until(get_manifest_link_newer_ff) |
|
| 207 |
|
|
| 208 |
if manifest_link == "not_newer_ff": |
|
| 209 |
driver.get("about:debugging#addons")
|
|
| 210 |
driver.implicitly_wait(10) |
|
| 211 |
manifest_link = driver.find_element_by_class_name('manifest-url')
|
|
| 212 |
driver.implicitly_wait(0) |
|
| 213 |
|
|
| 214 |
manifest_url = manifest_link.get_attribute('href')
|
|
| 215 |
return extract_base_url_re.match(manifest_url).group(1) |
|
| test/test_integration.py | ||
|---|---|---|
| 18 | 18 |
# CC0 1.0 Universal License for more details. |
| 19 | 19 |
|
| 20 | 20 |
import pytest |
| 21 |
import re |
|
| 22 | 21 |
|
| 23 |
from selenium.webdriver.support.ui import WebDriverWait |
|
| 24 |
from selenium.common.exceptions import NoSuchElementException |
|
| 25 |
|
|
| 26 |
extract_base_url_re = re.compile(r'^(.*)manifest.json$') |
|
| 27 |
|
|
| 28 |
def get_extension_base_url(driver): |
|
| 29 |
""" |
|
| 30 |
Extension's internall UUID is not directly exposed in Selenium. Instead, we |
|
| 31 |
can navigate to about:debugging and inspect the manifest URL present there |
|
| 32 |
to get the base url like: |
|
| 33 |
moz-extension://b225c78f-d108-4caa-8406-f38b37d8dee5/ |
|
| 34 |
which can then be used to navigate to extension-bundled pages. |
|
| 35 |
""" |
|
| 36 |
driver.implicitly_wait(10) |
|
| 37 |
try: |
|
| 38 |
# For newer Firefoxes |
|
| 39 |
driver.get('about:debugging#/runtime/this-firefox')
|
|
| 40 |
manifest_link = driver.find_element_by_class_name('qa-manifest-url')
|
|
| 41 |
except NoSuchElementException: |
|
| 42 |
driver.get("about:debugging#addons")
|
|
| 43 |
manifest_link = driver.find_element_by_class_name('manifest-url')
|
|
| 44 |
driver.implicitly_wait(0) |
|
| 45 |
|
|
| 46 |
manifest_url = manifest_link.get_attribute('href')
|
|
| 47 |
return extract_base_url_re.match(manifest_url).group(1) |
|
| 22 |
from .extension_crafting import get_extension_base_url |
|
| 48 | 23 |
|
| 49 | 24 |
@pytest.mark.usefixtures('haketilo')
|
| 50 | 25 |
def test_integration(driver): |
Also available in: Unified diff
facilitate running test environment with Haketilo loaded into browser