domaintools-api-test-upload 2.8.0__tar.gz → 2.8.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/PKG-INFO +1 -1
- domaintools_api_test_upload-2.8.1/VERSION +1 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/_version.py +1 -1
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/base_results.py +12 -7
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/PKG-INFO +1 -1
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_api.py +28 -0
- domaintools_api_test_upload-2.8.0/VERSION +0 -1
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/LICENSE +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/README.md +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/__init__.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/api.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/__init__.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/api.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/__init__.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/accounts.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/detects.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/domains.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/feeds.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/ips.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/iris.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/constants.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/main.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/utils.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/constants.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/decorators.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/docstring_patcher.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/exceptions.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/filters.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/request_validator.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/results.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/specs/iris-openapi.yaml +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/utils.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/SOURCES.txt +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/dependency_links.txt +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/entry_points.txt +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/requires.txt +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/top_level.txt +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_async/__init__.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/pyproject.toml +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/setup.cfg +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/setup.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_async.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_cli.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_decorators.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_docstring_patcher.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_filters.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_request_validator.py +0 -0
- {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_utils.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.8.1
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/base_results.py
RENAMED
|
@@ -25,7 +25,6 @@ from domaintools.exceptions import (
|
|
|
25
25
|
RequestUriTooLongException,
|
|
26
26
|
)
|
|
27
27
|
|
|
28
|
-
|
|
29
28
|
try: # pragma: no cover
|
|
30
29
|
from collections.abc import MutableMapping, MutableSequence
|
|
31
30
|
except ImportError: # pragma: no cover
|
|
@@ -111,7 +110,9 @@ class Results(MutableMapping, MutableSequence):
|
|
|
111
110
|
if self.product == "iris-investigate" and "irisql" in self.kwargs:
|
|
112
111
|
irisql_query = self.kwargs["irisql"]
|
|
113
112
|
auth_keys = {"api_username", "timestamp", "signature", "api_key"}
|
|
114
|
-
query_params = {
|
|
113
|
+
query_params = {
|
|
114
|
+
k: v for k, v in self.kwargs.items() if k != "irisql" and k not in auth_keys
|
|
115
|
+
}
|
|
115
116
|
query_params.update(self.api.extra_request_params)
|
|
116
117
|
return session.post(
|
|
117
118
|
url=self.url,
|
|
@@ -164,13 +165,13 @@ class Results(MutableMapping, MutableSequence):
|
|
|
164
165
|
self._data = results.json()
|
|
165
166
|
else:
|
|
166
167
|
self._data = results.text
|
|
167
|
-
|
|
168
168
|
self.check_limit_exceeded()
|
|
169
169
|
|
|
170
170
|
return self._data
|
|
171
171
|
|
|
172
172
|
def check_limit_exceeded(self):
|
|
173
173
|
limit_exceeded, reason = False, ""
|
|
174
|
+
|
|
174
175
|
if isinstance(self._data, dict) and (
|
|
175
176
|
"response" in self._data
|
|
176
177
|
and "limit_exceeded" in self._data["response"]
|
|
@@ -178,7 +179,13 @@ class Results(MutableMapping, MutableSequence):
|
|
|
178
179
|
):
|
|
179
180
|
limit_exceeded, reason = True, self._data["response"]["message"]
|
|
180
181
|
elif "response" in self._data and "limit_exceeded" in self._data:
|
|
181
|
-
|
|
182
|
+
# check for xml format, and return the actual error message
|
|
183
|
+
if self.kwargs.get("format") == "xml" and isinstance(self._data, str):
|
|
184
|
+
if re.search(r"<limit_exceeded>1</limit_exceeded>", self._data):
|
|
185
|
+
msg = re.search(r"<message>(.*?)</message>", self._data)
|
|
186
|
+
limit_exceeded, reason = True, msg.group(1) if msg else ""
|
|
187
|
+
else:
|
|
188
|
+
limit_exceeded = True
|
|
182
189
|
|
|
183
190
|
if limit_exceeded:
|
|
184
191
|
raise ServiceException(503, f"Limit Exceeded {reason}")
|
|
@@ -354,9 +361,7 @@ class Results(MutableMapping, MutableSequence):
|
|
|
354
361
|
)
|
|
355
362
|
|
|
356
363
|
def as_list(self):
|
|
357
|
-
return "\n".join(
|
|
358
|
-
[json.dumps(item, indent=4, separators=(",", ": ")) for item in self._items()]
|
|
359
|
-
)
|
|
364
|
+
return "\n".join([json.dumps(item, indent=4, separators=(",", ": ")) for item in self._items()])
|
|
360
365
|
|
|
361
366
|
def __str__(self):
|
|
362
367
|
return str(
|
|
@@ -602,6 +602,34 @@ def test_limit_exceeded():
|
|
|
602
602
|
response.response()
|
|
603
603
|
|
|
604
604
|
|
|
605
|
+
def test_limit_exceeded_xml():
|
|
606
|
+
xml_response = """<response>
|
|
607
|
+
<error>
|
|
608
|
+
<code>413</code>
|
|
609
|
+
<message>Maximum 10000 returned - you may need to refine your query.</message>
|
|
610
|
+
</error>
|
|
611
|
+
<limit_exceeded>1</limit_exceeded>
|
|
612
|
+
<has_more_results>1</has_more_results>
|
|
613
|
+
<message>Maximum 10000 returned - you may need to refine your query.</message>
|
|
614
|
+
<missing_domains/>
|
|
615
|
+
</response>"""
|
|
616
|
+
|
|
617
|
+
mock_response = MagicMock()
|
|
618
|
+
mock_response.status_code = 200
|
|
619
|
+
mock_response.text = xml_response
|
|
620
|
+
|
|
621
|
+
with patch("domaintools.base_results.Client") as mock_client:
|
|
622
|
+
mock_session = MagicMock()
|
|
623
|
+
mock_client.return_value.__enter__.return_value = mock_session
|
|
624
|
+
mock_session.post.return_value = mock_response
|
|
625
|
+
|
|
626
|
+
with pytest.raises(exceptions.ServiceException) as exc_info:
|
|
627
|
+
result = api.iris_investigate(ip="8.8.8.8", format="xml")
|
|
628
|
+
result.data()
|
|
629
|
+
|
|
630
|
+
assert "Maximum 10000 returned" in str(exc_info.value)
|
|
631
|
+
|
|
632
|
+
|
|
605
633
|
@vcr.use_cassette
|
|
606
634
|
def test_newly_observed_domains_feed():
|
|
607
635
|
results = feeds_api.nod(after="-60", top=5)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.8.0
|
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/__init__.py
RENAMED
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/api.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/constants.py
RENAMED
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/main.py
RENAMED
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/utils.py
RENAMED
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/constants.py
RENAMED
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/decorators.py
RENAMED
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/exceptions.py
RENAMED
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/filters.py
RENAMED
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/results.py
RENAMED
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_decorators.py
RENAMED
|
File without changes
|
|
File without changes
|
{domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_filters.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|