Revision 591c48a6
Added by jahoti about 2 years ago
copyright | ||
---|---|---|
89 | 89 |
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
90 | 90 |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
91 | 91 |
|
92 |
Files: test/gorilla.py |
|
92 |
Files: test/gorilla.py test/misc_constants.py test/world_wide_library.py test/data/pages/*
|
|
93 | 93 |
Copyright: 2021 jahoti <jahoti@tilde.team> |
94 | 94 |
2021 jahoti <jahoti@tilde.team> |
95 | 95 |
License: AGPL-3+ or Alicense-1.0 |
test/data/pages/gotmyowndomain.html | ||
---|---|---|
1 |
<html> |
|
2 |
<head> |
|
3 |
<meta name=charset value="latin1"> |
|
4 |
<title> |
|
5 |
Schrodinger's Document |
|
6 |
</title> |
|
7 |
</head> |
|
8 |
<body> |
|
9 |
A nice, simple page for testing. |
|
10 |
<script> |
|
11 |
document.write('<p><b>Or so you thought...</b></p>'); |
|
12 |
</script> |
|
13 |
</body> |
|
14 |
</html> |
test/data/pages/gotmyowndomain_https.html | ||
---|---|---|
1 |
<html> |
|
2 |
<head> |
|
3 |
<meta name=charset value="latin1"> |
|
4 |
<title> |
|
5 |
Schrodinger's Document |
|
6 |
</title> |
|
7 |
</head> |
|
8 |
<body> |
|
9 |
A nice, simple page for testing (using HTTPS). |
|
10 |
<script> |
|
11 |
document.write('<p><b>Or so you thought...</b></p>'); |
|
12 |
</script> |
|
13 |
</body> |
|
14 |
</html> |
test/init.sh | ||
---|---|---|
7 | 7 |
# Initialize the root certificate for the tests proxy server |
8 | 8 |
# Make sure this is run in the directory where they will be put! |
9 | 9 |
|
10 |
|
|
11 |
if [ -n "$1" ]; then |
|
12 |
cd "$1" |
|
13 |
fi |
|
10 | 14 |
openssl genrsa -out ca.key 2048 |
11 | 15 |
openssl genrsa -out cert.key 2048 |
12 | 16 |
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=Hachette Test" |
test/misc_constants.py | ||
---|---|---|
1 |
# Copyright (C) 2021 jahoti <jahoti@tilde.team> |
|
2 |
# Licensing information is collated in the `copyright` file |
|
3 |
|
|
4 |
""" |
|
5 |
Miscellaneous data that were found useful |
|
6 |
""" |
|
7 |
|
|
8 |
mime_types = { |
|
9 |
"7z": "application/x-7z-compressed", "oga": "audio/ogg", |
|
10 |
"abw": "application/x-abiword", "ogv": "video/ogg", |
|
11 |
"arc": "application/x-freearc", "ogx": "application/ogg", |
|
12 |
"bin": "application/octet-stream", "opus": "audio/opus", |
|
13 |
"bz": "application/x-bzip", "otf": "font/otf", |
|
14 |
"bz2": "application/x-bzip2", "pdf": "application/pdf", |
|
15 |
"css": "text/css", "png": "image/png", |
|
16 |
"csv": "text/csv", "sh": "application/x-sh", |
|
17 |
"gif": "image/gif", "svg": "image/svg+xml", |
|
18 |
"gz": "application/gzip", "tar": "application/x-tar", |
|
19 |
"htm": "text/html", "ts": "video/mp2t", |
|
20 |
"html": "text/html", "ttf": "font/ttf", |
|
21 |
"ico": "image/vnd.microsoft.icon", "txt": "text/plain", |
|
22 |
"js": "text/javascript", "wav": "audio/wav", |
|
23 |
"jpeg": "image/jpeg", "weba": "audio/webm", |
|
24 |
"jpg": "image/jpeg", "webm": "video/webm", |
|
25 |
"json": "application/json", "woff": "font/woff", |
|
26 |
"mjs": "text/javascript", "woff2": "font/woff2", |
|
27 |
"mp3": "audio/mpeg", "xhtml": "application/xhtml+xml", |
|
28 |
"mp4": "video/mp4", "zip": "application/zip", |
|
29 |
"mpeg": "video/mpeg", |
|
30 |
"odp": "application/vnd.oasis.opendocument.presentation", |
|
31 |
"ods": "application/vnd.oasis.opendocument.spreadsheet", |
|
32 |
"odt": "application/vnd.oasis.opendocument.text", |
|
33 |
"xml": "application/xml" # text/xml if readable from casual users |
|
34 |
} |
test/proxy_core.py | ||
---|---|---|
5 | 5 |
""" |
6 | 6 |
The core for a "virtual network" proxy |
7 | 7 |
|
8 |
Be sure to run this inside your intended certificates directory.
|
|
8 |
Be sure to set certdir to your intended certificates directory before running.
|
|
9 | 9 |
""" |
10 | 10 |
|
11 | 11 |
import os, socket, ssl, subprocess, sys, threading, time |
... | ... | |
20 | 20 |
|
21 | 21 |
class ProxyRequestHandler(BaseHTTPRequestHandler): |
22 | 22 |
"""Handles a network request made to the proxy""" |
23 |
certdir = '' |
|
24 |
|
|
25 | 23 |
def log_error(self, format, *args): |
26 | 24 |
# suppress "Request timed out: timeout('timed out',)" |
27 | 25 |
if isinstance(args[0], socket.timeout): |
test/server.py | ||
---|---|---|
1 |
#!/usr/bin/env python3 |
|
2 |
# |
|
1 | 3 |
# Copyright (C) 2021 jahoti <jahoti@tilde.team> |
2 | 4 |
# Licensing information is collated in the `copyright` file |
3 | 5 |
|
... | ... | |
6 | 8 |
wrapping the classes in proxy_core.py |
7 | 9 |
""" |
8 | 10 |
|
9 |
from proxy_core import *
|
|
11 |
import proxy_core
|
|
10 | 12 |
from urllib.parse import parse_qs |
13 |
from misc_constants import * |
|
14 |
from world_wide_library import catalog as internet |
|
11 | 15 |
|
12 |
internet = {} # Add info here later |
|
13 |
mime_types = { |
|
14 |
"7z": "application/x-7z-compressed", "oga": "audio/ogg", |
|
15 |
"abw": "application/x-abiword", "ogv": "video/ogg", |
|
16 |
"arc": "application/x-freearc", "ogx": "application/ogg", |
|
17 |
"bin": "application/octet-stream", "opus": "audio/opus", |
|
18 |
"bz": "application/x-bzip", "otf": "font/otf", |
|
19 |
"bz2": "application/x-bzip2", "pdf": "application/pdf", |
|
20 |
"css": "text/css", "png": "image/png", |
|
21 |
"csv": "text/csv", "sh": "application/x-sh", |
|
22 |
"gif": "image/gif", "svg": "image/svg+xml", |
|
23 |
"gz": "application/gzip", "tar": "application/x-tar", |
|
24 |
"htm": "text/html", "ts": "video/mp2t", |
|
25 |
"html": "text/html", "ttf": "font/ttf", |
|
26 |
"ico": "image/vnd.microsoft.icon", "txt": "text/plain", |
|
27 |
"js": "text/javascript", "wav": "audio/wav", |
|
28 |
"jpeg": "image/jpeg", "weba": "audio/webm", |
|
29 |
"jpg": "image/jpeg", "webm": "video/webm", |
|
30 |
"json": "application/json", "woff": "font/woff", |
|
31 |
"mjs": "text/javascript", "woff2": "font/woff2", |
|
32 |
"mp3": "audio/mpeg", "xhtml": "application/xhtml+xml", |
|
33 |
"mp4": "video/mp4", "zip": "application/zip", |
|
34 |
"mpeg": "video/mpeg", |
|
35 |
"odp": "application/vnd.oasis.opendocument.presentation", |
|
36 |
"ods": "application/vnd.oasis.opendocument.spreadsheet", |
|
37 |
"odt": "application/vnd.oasis.opendocument.text", |
|
38 |
"xml": "application/xml" # text/xml if readable from casual users |
|
39 |
} |
|
40 |
|
|
41 |
class RequestHijacker(ProxyRequestHandler): |
|
42 |
certdir = global_certdir |
|
43 |
|
|
16 |
class RequestHijacker(proxy_core.ProxyRequestHandler): |
|
44 | 17 |
def handle_request(self, req_body): |
45 | 18 |
path_components = self.path.split('?', maxsplit=1) |
46 | 19 |
path = path_components[0] |
... | ... | |
103 | 76 |
|
104 | 77 |
def do_an_internet(certdir, port): |
105 | 78 |
"""Start up the proxy/server""" |
106 |
global global_certdir |
|
107 |
global_certdir = certdir |
|
108 |
|
|
109 |
httpd = ThreadingHTTPServer(('', port), RequestHijacker) |
|
79 |
proxy_core.certdir = certdir |
|
80 |
httpd = proxy_core.ThreadingHTTPServer(('', port), RequestHijacker) |
|
110 | 81 |
httpd.serve_forever() |
82 |
|
|
83 |
if __name__ == '__main__': |
|
84 |
import sys |
|
85 |
def fail(msg, error_code): |
|
86 |
print('Error:', msg) |
|
87 |
print('Usage:', sys.argv[0], '[certificates directory] (port)') |
|
88 |
sys.exit(error_code) |
|
89 |
|
|
90 |
if len(sys.argv) < 2: |
|
91 |
fail('missing required argument "certificates directory".', 1) |
|
92 |
|
|
93 |
certdir = sys.argv[1] |
|
94 |
if not proxy_core.os.path.isdir(certdir): |
|
95 |
fail('selected certificate directory does not exist.', 2) |
|
96 |
|
|
97 |
port = sys.argv[2] if len(sys.argv) > 2 else '1337' |
|
98 |
if not port.isnumeric(): |
|
99 |
fail('port must be an integer.', 3) |
|
100 |
|
|
101 |
do_an_internet(certdir, int(port)) |
test/world_wide_library.py | ||
---|---|---|
1 |
# Copyright (C) 2021 jahoti <jahoti@tilde.team> |
|
2 |
# Licensing information is collated in the `copyright` file |
|
3 |
|
|
4 |
""" |
|
5 |
Our helpful little stand-in for the Internet |
|
6 |
""" |
|
7 |
|
|
8 |
catalog = { |
|
9 |
'http://gotmyowndoma.in': (302, {'location': 'http://gotmyowndoma.in/index.html'}, b''), |
|
10 |
'http://gotmyowndoma.in/': (302, {'location': 'http://gotmyowndoma.in/index.html'}, b''), |
|
11 |
'http://gotmyowndoma.in/index.html': (200, {}, 'data/pages/gotmyowndomain.html'), |
|
12 |
'https://gotmyowndoma.in': (302, {'location': 'https://gotmyowndoma.in/index.html'}, b''), |
|
13 |
'https://gotmyowndoma.in/': (302, {'location': 'https://gotmyowndoma.in/index.html'}, b''), |
|
14 |
'https://gotmyowndoma.in/index.html': (200, {}, 'data/pages/gotmyowndomain_https.html') |
|
15 |
} |
Also available in: Unified diff
Make test suite mildly usable
Allow test/server.py to be run as a command and add some "webpages" for it.