aboutsummaryrefslogtreecommitdiffstats
path: root/test/examples/webscanner_helper/test_mapping.py
diff options
context:
space:
mode:
authoranneborcherding <55282902+anneborcherding@users.noreply.github.com>2020-05-04 10:37:13 +0200
committerGitHub <noreply@github.com>2020-05-04 10:37:13 +0200
commit7fdcbb09e6034ab1f76724965cfdf45f3d775129 (patch)
tree9adaa530173c70d374680a510402b958ad669277 /test/examples/webscanner_helper/test_mapping.py
parentf4aa3ee11c01d5b8f260e57bfd7e084b7767c08e (diff)
downloadmitmproxy-7fdcbb09e6034ab1f76724965cfdf45f3d775129.tar.gz
mitmproxy-7fdcbb09e6034ab1f76724965cfdf45f3d775129.tar.bz2
mitmproxy-7fdcbb09e6034ab1f76724965cfdf45f3d775129.zip
added add-ons that enhance the performance of web application scanners. (#3961)
* added add-ons that enhance the performance of web application scanners. Co-authored-by: weichweich <14820950+weichweich@users.noreply.github.com>
Diffstat (limited to 'test/examples/webscanner_helper/test_mapping.py')
-rw-r--r--test/examples/webscanner_helper/test_mapping.py165
1 files changed, 165 insertions, 0 deletions
diff --git a/test/examples/webscanner_helper/test_mapping.py b/test/examples/webscanner_helper/test_mapping.py
new file mode 100644
index 00000000..e4d519fc
--- /dev/null
+++ b/test/examples/webscanner_helper/test_mapping.py
@@ -0,0 +1,165 @@
+from typing import TextIO, Callable
+from unittest import mock
+from unittest.mock import MagicMock
+
+from mitmproxy.test import tflow
+from mitmproxy.test import tutils
+
+from examples.complex.webscanner_helper.mapping import MappingAddon, MappingAddonConfig
+
+
+class TestConfig:
+
+ def test_config(self):
+ assert MappingAddonConfig.HTML_PARSER == "html.parser"
+
+
+url = "http://10.10.10.10"
+new_content = "My Text"
+mapping_content = f'{{"{url}": {{"body": "{new_content}"}}}}'
+
+
+class TestMappingAddon:
+
+ def test_init(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+ assert "My Text" in str(mapping.mapping_templates._dump())
+
+ def test_load(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+ loader = MagicMock()
+
+ mapping.load(loader)
+ assert 'mapping_file' in str(loader.add_option.call_args_list)
+ assert 'map_persistent' in str(loader.add_option.call_args_list)
+
+ def test_configure(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+ new_filename = "My new filename"
+ updated = {str(mapping.OPT_MAPPING_FILE): new_filename, str(mapping.OPT_MAP_PERSISTENT): True}
+
+ open_mock = mock.mock_open(read_data="{}")
+ with mock.patch("builtins.open", open_mock):
+ mapping.configure(updated)
+ assert new_filename in str(open_mock.mock_calls)
+ assert mapping.filename == new_filename
+ assert mapping.persistent
+
+ def test_response_filtered(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+ f = tflow.tflow(resp=tutils.tresp())
+ test_content = b"Test"
+ f.response.content = test_content
+
+ mapping.response(f)
+ assert f.response.content == test_content
+
+ def test_response(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+ f = tflow.tflow(resp=tutils.tresp())
+ test_content = b"<body> Test </body>"
+ f.response.content = test_content
+ f.request.url = url
+
+ mapping.response(f)
+ assert f.response.content.decode("utf-8") == new_content
+
+ def test_response_content_type(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+ f = tflow.tflow(resp=tutils.tresp())
+ test_content = b"<body> Test </body>"
+ f.response.content = test_content
+ f.request.url = url
+ f.response.headers.add("content-type", "content-type")
+
+ mapping.response(f)
+ assert f.response.content == test_content
+
+ def test_response_not_existing(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+ f = tflow.tflow(resp=tutils.tresp())
+ test_content = b"<title> Test </title>"
+ f.response.content = test_content
+ f.request.url = url
+ mapping.response(f)
+ assert f.response.content == test_content
+
+ def test_persistance_false(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile)
+
+ open_mock = mock.mock_open(read_data="{}")
+ with mock.patch("builtins.open", open_mock):
+ mapping.done()
+ assert len(open_mock.mock_calls) == 0
+
+ def test_persistance_true(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile, persistent=True)
+
+ open_mock = mock.mock_open(read_data="{}")
+ with mock.patch("builtins.open", open_mock):
+ mapping.done()
+ with open(tmpfile, "r") as tfile:
+ results = tfile.read()
+ assert len(open_mock.mock_calls) != 0
+ assert results == mapping_content
+
+ def test_persistance_true_add_content(self, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write(mapping_content)
+ mapping = MappingAddon(tmpfile, persistent=True)
+
+ f = tflow.tflow(resp=tutils.tresp())
+ test_content = b"<title> Test </title>"
+ f.response.content = test_content
+ f.request.url = url
+
+ mapping.response(f)
+ mapping.done()
+ with open(tmpfile, "r") as tfile:
+ results = tfile.read()
+ assert mapping_content in results
+
+ def mock_dump(self, f: TextIO, value_dumper: Callable):
+ assert value_dumper(None) == "None"
+ try:
+ value_dumper("Test")
+ except RuntimeError:
+ assert True
+ else:
+ assert False
+
+ def test_dump(selfself, tmpdir):
+ tmpfile = tmpdir.join("tmpfile")
+ with open(tmpfile, "w") as tfile:
+ tfile.write("{}")
+ mapping = MappingAddon(tmpfile, persistent=True)
+ with mock.patch('examples.complex.webscanner_helper.urldict.URLDict.dump', selfself.mock_dump):
+ mapping.done()