howler-api 2.10.0.dev255__py3-none-any.whl → 2.13.0.dev344__py3-none-any.whl
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.
Potentially problematic release.
This version of howler-api might be problematic. Click here for more details.
- howler/api/__init__.py +1 -1
- howler/api/v1/auth.py +1 -1
- howler/api/v1/{borealis.py → clue.py} +24 -26
- howler/api/v1/dossier.py +4 -28
- howler/api/v1/hit.py +11 -7
- howler/api/v1/search.py +160 -17
- howler/api/v1/user.py +2 -2
- howler/api/v1/utils/etag.py +43 -5
- howler/api/v1/view.py +26 -34
- howler/app.py +4 -4
- howler/cronjobs/view_cleanup.py +88 -0
- howler/datastore/README.md +0 -2
- howler/datastore/collection.py +109 -132
- howler/datastore/howler_store.py +0 -45
- howler/datastore/store.py +25 -6
- howler/odm/base.py +1 -1
- howler/odm/helper.py +9 -6
- howler/odm/models/config.py +168 -8
- howler/odm/models/howler_data.py +2 -1
- howler/odm/models/lead.py +1 -10
- howler/odm/models/pivot.py +2 -11
- howler/odm/random_data.py +1 -1
- howler/security/__init__.py +2 -2
- howler/services/analytic_service.py +31 -0
- howler/services/config_service.py +2 -2
- howler/services/dossier_service.py +140 -7
- howler/services/hit_service.py +317 -72
- howler/services/lucene_service.py +14 -7
- howler/services/overview_service.py +44 -0
- howler/services/template_service.py +45 -0
- howler/utils/lucene.py +22 -2
- {howler_api-2.10.0.dev255.dist-info → howler_api-2.13.0.dev344.dist-info}/METADATA +5 -5
- {howler_api-2.10.0.dev255.dist-info → howler_api-2.13.0.dev344.dist-info}/RECORD +35 -32
- {howler_api-2.10.0.dev255.dist-info → howler_api-2.13.0.dev344.dist-info}/WHEEL +1 -1
- {howler_api-2.10.0.dev255.dist-info → howler_api-2.13.0.dev344.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from typing import Any, Optional, Union
|
|
2
|
+
|
|
3
|
+
from howler.common.loader import datastore
|
|
4
|
+
from howler.common.logging import get_logger
|
|
5
|
+
from howler.datastore.exceptions import SearchException
|
|
6
|
+
from howler.odm.models.analytic import Analytic
|
|
7
|
+
from howler.odm.models.hit import Hit
|
|
8
|
+
from howler.utils.str_utils import sanitize_lucene_query
|
|
9
|
+
|
|
10
|
+
logger = get_logger(__file__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_matching_templates(
|
|
14
|
+
hits: Union[list[Hit], list[dict[str, Any]]], uname: Optional[str] = None, as_odm: bool = False
|
|
15
|
+
) -> Union[list[dict[str, Any]], list[Analytic]]:
|
|
16
|
+
"""Generate a list of templates matching a given list of analytic names, and optionally a user.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
hits (list[Hit] | list[dict[str, Any]]]: List of hits, each containing analytic information.
|
|
20
|
+
uname (Optional[str], optional): Username to filter templates by owner. Defaults to None.
|
|
21
|
+
as_odm (bool, optional): If True, return results as ODM objects. If False, return as dicts. Defaults to False.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
list[dict[str, Any]] | list[Analytic]: List of matching templates, either as dicts or Analytic ODM objects.
|
|
25
|
+
"""
|
|
26
|
+
if len(hits) < 1:
|
|
27
|
+
return []
|
|
28
|
+
|
|
29
|
+
analytic_names: set[str] = set()
|
|
30
|
+
for hit in hits:
|
|
31
|
+
analytic_names.add(f'"{sanitize_lucene_query(hit["howler"]["analytic"])}"')
|
|
32
|
+
|
|
33
|
+
if len(analytic_names) < 1:
|
|
34
|
+
return []
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
template_candidates = datastore().template.search(
|
|
38
|
+
f"analytic:({' OR '.join(analytic_names)}) AND (type:global OR owner:{uname or '*'})",
|
|
39
|
+
as_obj=as_odm,
|
|
40
|
+
)["items"]
|
|
41
|
+
|
|
42
|
+
return template_candidates
|
|
43
|
+
except SearchException:
|
|
44
|
+
logger.exception("Exception on analytic matching")
|
|
45
|
+
return []
|
howler/utils/lucene.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import ipaddress
|
|
2
|
+
import math
|
|
2
3
|
import re
|
|
3
4
|
import sys
|
|
4
5
|
from datetime import datetime
|
|
@@ -19,6 +20,25 @@ def try_parse_date(date: str) -> Optional[datetime]:
|
|
|
19
20
|
return None
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
def try_parse_number(number: str | int | float) -> Optional[Union[int, float]]:
|
|
24
|
+
"Try and parse a number string into an integer or float type, or infinity. Returns None if string is invalid."
|
|
25
|
+
if isinstance(number, (int, float)):
|
|
26
|
+
return number
|
|
27
|
+
|
|
28
|
+
if number.lower() == "infinity":
|
|
29
|
+
return math.inf
|
|
30
|
+
|
|
31
|
+
try:
|
|
32
|
+
# Check if the value is an integer
|
|
33
|
+
return int(number)
|
|
34
|
+
except ValueError:
|
|
35
|
+
try:
|
|
36
|
+
# Check if the value is a float
|
|
37
|
+
return float(number)
|
|
38
|
+
except ValueError:
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
|
|
22
42
|
def try_parse_ip(ip: str) -> Optional[Union[ipaddress.IPv4Address, ipaddress.IPv6Address]]:
|
|
23
43
|
"Try and parse an ipv4/ipv6 string into a date. Returns None if string is invalid."
|
|
24
44
|
try:
|
|
@@ -50,8 +70,8 @@ def normalize_phrase(value: str, type: Union[Literal["phrase"], Literal["word"]]
|
|
|
50
70
|
return [value, value.lower()]
|
|
51
71
|
|
|
52
72
|
if type == "word":
|
|
53
|
-
value = re.sub(r"[^a-z0-9.,@_:/;()]", "", value.lower())
|
|
73
|
+
value = re.sub(r"[^a-z0-9.,@_:/;()\-]", "", value.lower())
|
|
54
74
|
else:
|
|
55
|
-
value = re.sub(r"[^a-z0-9.,@_:/;() ]", "", value, flags=re.IGNORECASE)
|
|
75
|
+
value = re.sub(r"[^a-z0-9.,@_:/;()\- ]", "", value, flags=re.IGNORECASE)
|
|
56
76
|
|
|
57
77
|
return [value]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: howler-api
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.13.0.dev344
|
|
4
4
|
Summary: Howler - API server
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
|
|
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
21
|
Classifier: Topic :: Software Development :: Libraries
|
|
21
22
|
Requires-Dist: apscheduler (==3.10.4)
|
|
22
23
|
Requires-Dist: authlib (>=1.6.0,<2.0.0)
|
|
@@ -33,7 +34,6 @@ Requires-Dist: gevent (==23.9.1)
|
|
|
33
34
|
Requires-Dist: gunicorn (==23.0.0)
|
|
34
35
|
Requires-Dist: luqum (>=1.0.0,<2.0.0)
|
|
35
36
|
Requires-Dist: mergedeep (>=1.3.4,<2.0.0)
|
|
36
|
-
Requires-Dist: netifaces (==0.11.0)
|
|
37
37
|
Requires-Dist: packaging (<25.0)
|
|
38
38
|
Requires-Dist: passlib (==1.7.4)
|
|
39
39
|
Requires-Dist: prometheus-client (==0.17.1)
|
|
@@ -54,8 +54,8 @@ Requires-Dist: requests (==2.32.4)
|
|
|
54
54
|
Requires-Dist: typing-extensions (>=4.12.2,<5.0.0)
|
|
55
55
|
Requires-Dist: validators (>=0.34.0,<0.35.0)
|
|
56
56
|
Requires-Dist: wsproto (==1.2.0)
|
|
57
|
-
Project-URL: Documentation, https://cybercentrecanada.github.io/howler
|
|
58
|
-
Project-URL: Homepage, https://cybercentrecanada.github.io/howler
|
|
57
|
+
Project-URL: Documentation, https://cybercentrecanada.github.io/howler/developer/backend/
|
|
58
|
+
Project-URL: Homepage, https://cybercentrecanada.github.io/howler/
|
|
59
59
|
Project-URL: Repository, https://github.com/CybercentreCanada/howler-api
|
|
60
60
|
Description-Content-Type: text/markdown
|
|
61
61
|
|
|
@@ -10,28 +10,28 @@ howler/actions/promote.py,sha256=v2lFS4WkOpX47ChbSYbhJKzwAShYE3Fg2UVQ6sbr7Yw,470
|
|
|
10
10
|
howler/actions/remove_from_bundle.py,sha256=Tt9zPZuPrplM8lvCo2sHKORY4U4z3S6RfltXRigDvF4,4251
|
|
11
11
|
howler/actions/remove_label.py,sha256=I6_4KnBgvW6OwP7tNe5LMbaOZfAVf5S9ADijBt7g-9A,3325
|
|
12
12
|
howler/actions/transition.py,sha256=7gGWGY0wKZjp87-BpqfMjImAz-QXHSyDJA3bWq3RTz4,6423
|
|
13
|
-
howler/api/__init__.py,sha256=
|
|
13
|
+
howler/api/__init__.py,sha256=Z-o_fukNO9wBpx9gLNm8OPZwFOP-4xMtY0V1sfdEn8w,8539
|
|
14
14
|
howler/api/base.py,sha256=i--N7f4itJBRNVayDAqOiZYIq9thXwdblRBGfePyP1c,2689
|
|
15
15
|
howler/api/socket.py,sha256=6T_gpyazIbSmA2BheZ-yUWPbdxg9C50az70-rq4o-Rc,3910
|
|
16
16
|
howler/api/v1/__init__.py,sha256=lupGaCMXiiVWJjWrV7AoutAcTvZUrYommD-oUf4SFgU,3857
|
|
17
17
|
howler/api/v1/action.py,sha256=sZFihfJQFmzhg9Gc7o0A73pDZls_s8Xjf3mfzB2Nkr4,11112
|
|
18
18
|
howler/api/v1/analytic.py,sha256=kN7YXSTaXEWusu5DjAC510qlDzAIzsV7j7QjNw1daoY,20146
|
|
19
|
-
howler/api/v1/auth.py,sha256=
|
|
20
|
-
howler/api/v1/
|
|
19
|
+
howler/api/v1/auth.py,sha256=fj0t6COXesgrShZQlP0zZXR12htjYlzLGGMIDsiX8nM,14069
|
|
20
|
+
howler/api/v1/clue.py,sha256=QaXmk9hTIkt7Cp4oAjCZuhtGeOo_C6yeNmhQY-egVsM,3042
|
|
21
21
|
howler/api/v1/configs.py,sha256=cjii7WY1AtTyk56O84_WR-_JVonoXpWCrh2eMEuuGro,1921
|
|
22
|
-
howler/api/v1/dossier.py,sha256=
|
|
22
|
+
howler/api/v1/dossier.py,sha256=8mfuoxAHqT9a_0BHRBO9G33KLJUa9xwcfOImb6ax8mU,5816
|
|
23
23
|
howler/api/v1/help.py,sha256=hqBvzW-DYX-I4Q85dbCQgpHsXyWDXp06a1fE9zhFMH4,823
|
|
24
|
-
howler/api/v1/hit.py,sha256=
|
|
24
|
+
howler/api/v1/hit.py,sha256=HKaI72k7VC0v4QPjE2zcAV6jizvY2ZWEpk1BiAklvgU,34031
|
|
25
25
|
howler/api/v1/notebook.py,sha256=-cahdJ9u1lAB_nheztayHKtXvoPZcj04N8nqQ2U-HLo,2015
|
|
26
26
|
howler/api/v1/overview.py,sha256=e-WiHuMvOPy8Y7xIGnceagdI0_jebqlgDxi6GE6tfaA,4999
|
|
27
|
-
howler/api/v1/search.py,sha256=
|
|
27
|
+
howler/api/v1/search.py,sha256=24r1vaYaxDhddzDR-c5dBdRKyag6aIggvHSWPWudqN8,26372
|
|
28
28
|
howler/api/v1/template.py,sha256=oexzUpAMVdgI6IOXITPx0iEfZIVP-kvlExRdFd6QVdk,5769
|
|
29
29
|
howler/api/v1/tool.py,sha256=6CN5LIXgxaAvxEHE6s4IFtAEhQo_zBLtl6ghbM8whjE,6737
|
|
30
|
-
howler/api/v1/user.py,sha256=
|
|
30
|
+
howler/api/v1/user.py,sha256=YQh6eCAi4bsC_w9eGX0ZgnLoFL4z4efEc1knJsZhj4k,13842
|
|
31
31
|
howler/api/v1/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
|
-
howler/api/v1/utils/etag.py,sha256
|
|
33
|
-
howler/api/v1/view.py,sha256=
|
|
34
|
-
howler/app.py,sha256=
|
|
32
|
+
howler/api/v1/utils/etag.py,sha256=IGB4WUkecHbBt0KKLQFCxCn0mN3T_aSPG0y45l_zT9I,3431
|
|
33
|
+
howler/api/v1/view.py,sha256=VyizfGehsuoPyn7iswGPKCLcbSQoO1ipRsbr91nSDKk,8228
|
|
34
|
+
howler/app.py,sha256=76WSFUM4UKX2UpvDHfgKP8DI3wavLpXGlk2QLHqH1x8,7043
|
|
35
35
|
howler/common/README.md,sha256=lgnrAdgnOADmmfRplhbfYD7jU627nr3zO-fJ6N4Nbcs,6577
|
|
36
36
|
howler/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
37
|
howler/common/classification.py,sha256=AUl33PJX6O9d9XzxHbyyJah2ffD7Q7J2yYqIwz7OqKY,39342
|
|
@@ -51,17 +51,18 @@ howler/config.py,sha256=amwf4FXJ1ZKeooHqPlC_F691tg6Yaj4osKn_ExiUSS0,2128
|
|
|
51
51
|
howler/cronjobs/__init__.py,sha256=GEhNsxPGATumlroMa-g6z5Dt9yy0QT93s3uuNC-GwIM,909
|
|
52
52
|
howler/cronjobs/retention.py,sha256=I-vXXFo2W5eHkJ-xQuywU2-KfM9xqgii9Y99Qd9E-Vk,1777
|
|
53
53
|
howler/cronjobs/rules.py,sha256=ZK3FmLsEF34-3vQzXkc4J6Y0P5-JSawMSnAkH9o-PeE,10406
|
|
54
|
-
howler/
|
|
54
|
+
howler/cronjobs/view_cleanup.py,sha256=ULWLR1uFcRemRgkEDrMqmBamHiE0dgDvu49VK0qDkuw,3076
|
|
55
|
+
howler/datastore/README.md,sha256=ekWl1YJSrHlZpU5PgBkPEzPWjdbTdav6Rd2P0ccIesw,4758
|
|
55
56
|
howler/datastore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
57
|
howler/datastore/bulk.py,sha256=VfolZfiaBD4ZTK3j6IVVVq4GMjVXb5elrsGwwM_nONE,2829
|
|
57
|
-
howler/datastore/collection.py,sha256=
|
|
58
|
+
howler/datastore/collection.py,sha256=psNzGxHncvWFWPb_s6SGq3LBnF31FAwyePnKMZL1VME,90223
|
|
58
59
|
howler/datastore/constants.py,sha256=XjIxE9za_kx6OpvulzpnYcZ9c0GqvIaAKhvonjWRgZo,2387
|
|
59
60
|
howler/datastore/exceptions.py,sha256=yZvQXRI4mR50ltGFHbdZAD4TIbhdKJku6LLTPQ0JZRk,955
|
|
60
|
-
howler/datastore/howler_store.py,sha256=
|
|
61
|
+
howler/datastore/howler_store.py,sha256=kW7FKM-tILcfTmrjSB1yZm-ZnumPS_tiQEZUDaQoDkg,2915
|
|
61
62
|
howler/datastore/migrations/fix_process.py,sha256=J0FxqcXbQ161sgmQ5teyEcPuX7WYB9wqs0CO8m1jk0U,1218
|
|
62
63
|
howler/datastore/operations.py,sha256=5WdJBewXRIG71ZexQcYASv0IYoDi1m9ia8332u5mXSs,3919
|
|
63
64
|
howler/datastore/schemas.py,sha256=kuxqYVWMgqnrdU-ypkDxoSzEtECUrRCKXjU_R5Kg7X4,3158
|
|
64
|
-
howler/datastore/store.py,sha256=
|
|
65
|
+
howler/datastore/store.py,sha256=MzIvZy8deMgpnKR-TKTTcttH6kkYy4EBSYMCh0Q-J0E,7055
|
|
65
66
|
howler/datastore/support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
67
|
howler/datastore/support/build.py,sha256=5cX2Jl9vTgCWa_hiM-7LwxVm3pwHN5k0eiyGzHo11vE,7861
|
|
67
68
|
howler/datastore/support/schemas.py,sha256=kuxqYVWMgqnrdU-ypkDxoSzEtECUrRCKXjU_R5Kg7X4,3158
|
|
@@ -85,9 +86,9 @@ howler/helper/workflow.py,sha256=fsYhjeZo1foM0J8AW3nMjTEJOAnh9R6L0f4ZL12pE4E,480
|
|
|
85
86
|
howler/helper/ws.py,sha256=ONxC7DFYGQKpp0AmrFqQLeIyxOMD4nHk5i6lFyWOtqo,15911
|
|
86
87
|
howler/odm/README.md,sha256=Ihc_DyjVQlLaIOEbPoQNPkum9Ecn8kn37-PMFQsX77s,5645
|
|
87
88
|
howler/odm/__init__.py,sha256=1n6vgBOrFcCHSBFysqgODERvqP7s5DIeJe8N8UeE5pM,44
|
|
88
|
-
howler/odm/base.py,sha256=
|
|
89
|
+
howler/odm/base.py,sha256=UxWDNokfNIuQK-SQz8gjIznhc8lLQe6eJTF_7aIbwqQ,51620
|
|
89
90
|
howler/odm/charter.txt,sha256=-Wgrv7nqugZmeQknJk0_m6klLJStjVbuqKbi_KaDinQ,15277
|
|
90
|
-
howler/odm/helper.py,sha256=
|
|
91
|
+
howler/odm/helper.py,sha256=EELMg3pvE7Kb9VDeKSYJQHiq6uCO2YuS095CPRgWrEM,13927
|
|
91
92
|
howler/odm/howler_enum.py,sha256=JzRK3_adlhvfkoGdMZD1jgOwlneZs8-x7OxGEj3zcpY,768
|
|
92
93
|
howler/odm/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
93
94
|
howler/odm/models/action.py,sha256=V9tgMCg1ewu8mOngTcA6QAPwaR0NIT71VHglpRFYmS4,1235
|
|
@@ -96,7 +97,7 @@ howler/odm/models/assemblyline.py,sha256=_wcTiX3A6bhA2SGlK9tDF0v-uwLpIabXE8j2Fw9
|
|
|
96
97
|
howler/odm/models/aws.py,sha256=pJVadJqubdgT27riCfp7bEKVP4XsMZB0ZUnKAbmCMd0,895
|
|
97
98
|
howler/odm/models/azure.py,sha256=o7MZMMo9jh1SB8xXCajl_YSKP2nnnWsjx_DPT6LnQKg,710
|
|
98
99
|
howler/odm/models/cbs.py,sha256=onUiJOGUxK3iy_-4XkGGwHxFiFq9Td_p59Kum4XaR-w,1366
|
|
99
|
-
howler/odm/models/config.py,sha256=
|
|
100
|
+
howler/odm/models/config.py,sha256=KO_-AdTLL1NPHoEHoKqwHiOYa1kCZ-7YX3IcY9-UAsI,21723
|
|
100
101
|
howler/odm/models/dossier.py,sha256=Ob2qROrG2-DYzmVo2XVe4NJ8HjWGCoRAu2gPo6p9XGU,1244
|
|
101
102
|
howler/odm/models/ecs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
102
103
|
howler/odm/models/ecs/agent.py,sha256=idSooyFCLuQAB7_RyEWTYW4-x9w5a3wpy2ct_-EDRQs,713
|
|
@@ -138,15 +139,15 @@ howler/odm/models/ecs/user_agent.py,sha256=LM4ZjbdEkkF02zZu6Pg7j8JLuAyfliTC6PVAE
|
|
|
138
139
|
howler/odm/models/ecs/vulnerability.py,sha256=iX2TUmCZTJjwyMcOmxiHg-pfoEwX8Wx-h8cxo5QsJmo,1553
|
|
139
140
|
howler/odm/models/gcp.py,sha256=FLwaQVcfFeE5AbIhEB_Ge2UL-HjPdldY04Nrm9Mq7kk,675
|
|
140
141
|
howler/odm/models/hit.py,sha256=kgzk3RzgKGvHdtNG0iMRxCtLPD73-BFFU9A_IxJcOHI,13396
|
|
141
|
-
howler/odm/models/howler_data.py,sha256=
|
|
142
|
-
howler/odm/models/lead.py,sha256=
|
|
142
|
+
howler/odm/models/howler_data.py,sha256=3bzKQ_vSP_rK20S_U4PkXzsmBL1uqSaIOHZmoPuRkS8,12473
|
|
143
|
+
howler/odm/models/lead.py,sha256=lqapGWZ4u22Asib48o7wAzramnFY9EkRybmb4olsyrA,904
|
|
143
144
|
howler/odm/models/localized_label.py,sha256=G7gfQ1cngiI4KprqldHWE1KHkAgK4AG_JsfHxVRdsRs,361
|
|
144
145
|
howler/odm/models/overview.py,sha256=kvZcMYPDlkJEGa0L1jq9pG0RFjLOVudC64-2GTWVu2w,684
|
|
145
|
-
howler/odm/models/pivot.py,sha256=
|
|
146
|
+
howler/odm/models/pivot.py,sha256=ZewcGh91xbE64snZ5Ahz2So1onAqO8U9H4CFe6jBOXs,1405
|
|
146
147
|
howler/odm/models/template.py,sha256=-Tqq_36qD_3nQ4jv13OPeH_EyyERKhc55wT03CU-Kbk,979
|
|
147
148
|
howler/odm/models/user.py,sha256=3V7cLxxHJwWfTsEdZ7-QZT_-PQL7H_RJ3buQ8AraGzQ,3052
|
|
148
149
|
howler/odm/models/view.py,sha256=kmaJOXhR4prki5o0gBirs1dqGcQK3b9ATysL_kNoku0,1308
|
|
149
|
-
howler/odm/random_data.py,sha256=
|
|
150
|
+
howler/odm/random_data.py,sha256=HHXKED3NMWF8fknrOy2JtsDfzuTWcIkK1N-dUlOLZzo,28441
|
|
150
151
|
howler/odm/randomizer.py,sha256=-AG-C-FZEsZQp1bQGWLNIpx6NN6r1DcWtk6nq2Ktfwg,23595
|
|
151
152
|
howler/patched.py,sha256=Br4BGU5raaqjSMDLD7ogb5A8Yn0dzecouh6uWVV2jlQ,77
|
|
152
153
|
howler/plugins/__init__.py,sha256=P5P-t4KgIInOzp4NmIturNIhUbb3jPO81n55Q_b_gM0,841
|
|
@@ -165,20 +166,22 @@ howler/remote/datatypes/queues/named.py,sha256=IypPN0ZnRTlWCZ0Wm6BAyoNCoGlLxUPyG
|
|
|
165
166
|
howler/remote/datatypes/queues/priority.py,sha256=rfIK0nVFtivY82a6Er-1CZMzvYEVGyPcUmYrks1nzfI,7554
|
|
166
167
|
howler/remote/datatypes/set.py,sha256=iJ-QrrkKRhEUyOYmRz21TUTitatvrNyp5aMJwXkCdqc,3538
|
|
167
168
|
howler/remote/datatypes/user_quota_tracker.py,sha256=butA5RlV0XU9y6GtqoEryaJJZq-LAgoDhCJpdbHBFm0,1920
|
|
168
|
-
howler/security/__init__.py,sha256=
|
|
169
|
+
howler/security/__init__.py,sha256=v5gQi5TUA4W4vlU3Adzxw8Tq3gCBzQPSF3F9kLDnZgc,11668
|
|
169
170
|
howler/security/socket.py,sha256=zEyWQh7IMINNpYMynV-PLy_-HQLpgouUvztAKrTHEfU,3714
|
|
170
171
|
howler/security/utils.py,sha256=MweKs9T--Z2w6hZNUfEAik4FsvXPNCskYF1vaQVt6_8,5309
|
|
171
172
|
howler/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
172
173
|
howler/services/action_service.py,sha256=AuNRvZs7sFGUveaoptD8ouzs39jdZJidmsp-fIocZo4,3977
|
|
173
|
-
howler/services/analytic_service.py,sha256=
|
|
174
|
+
howler/services/analytic_service.py,sha256=pOJRCDn6I523XSVLBo49fL70Mz5VDgjJ5CBYhemQeBk,4272
|
|
174
175
|
howler/services/auth_service.py,sha256=TX51z-Fu4i3JvxIdU1JsJ3vzgGPVWNL1lNQJMxKpkZ8,11678
|
|
175
|
-
howler/services/config_service.py,sha256=
|
|
176
|
-
howler/services/dossier_service.py,sha256=
|
|
176
|
+
howler/services/config_service.py,sha256=J5FCttgsHr6kMLGAPIW-8r8aGYwmX4YzsOyBG6yoGGM,4489
|
|
177
|
+
howler/services/dossier_service.py,sha256=5jq7KZMgBNh165rN5pZD_oVuZP-oBsdACHDSV74ps-I,9839
|
|
177
178
|
howler/services/event_service.py,sha256=4PG2iBXjh1V8QnXcbUZSiKJeHs6V9hRWT9SKrzQFIPY,2864
|
|
178
|
-
howler/services/hit_service.py,sha256=
|
|
179
|
+
howler/services/hit_service.py,sha256=VNsEhi6Tcoqkjsw8G71FWBj7xcKwdvET9mITYAKmzsM,32278
|
|
179
180
|
howler/services/jwt_service.py,sha256=O-M3k5wmjUF3GzD4FJC3o-hImKu1v8K5oSuD9zURcf0,5539
|
|
180
|
-
howler/services/lucene_service.py,sha256=
|
|
181
|
+
howler/services/lucene_service.py,sha256=K_tS39hJCXUCfN_zgbIgbfcfM3gaQNheFXrwbV__z_0,12029
|
|
181
182
|
howler/services/notebook_service.py,sha256=_MWllCnuVxt7lCcvWghXnaS926FbvBRE3DrBt--zO7U,3968
|
|
183
|
+
howler/services/overview_service.py,sha256=wDIm7DGjQ6Dvt4dNQ-57jbet8v6oGHxM857VezgHf7M,1539
|
|
184
|
+
howler/services/template_service.py,sha256=pwcHtYNoIkDuaXQ1bSXeDgxETP59PF1YCTwGzHsnXkA,1695
|
|
182
185
|
howler/services/user_service.py,sha256=BWU9X75ofehRBozPrkOFlq5DIFbaPbmqC5-I-1Fv79g,12069
|
|
183
186
|
howler/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
184
187
|
howler/utils/annotations.py,sha256=GLuDbjbXp8esDji3qhQY_uQyOWVqfIdpF_zs2t0IaMI,878
|
|
@@ -186,12 +189,12 @@ howler/utils/chunk.py,sha256=NoVDKzZkO8O92xXk0s0Pny2g7It9BX0PqWbknmnRSFg,895
|
|
|
186
189
|
howler/utils/dict_utils.py,sha256=EA0mq87r0RZP7SmiPZQukx3xXukM6EH2nhtQ6W2GAX4,6408
|
|
187
190
|
howler/utils/isotime.py,sha256=iCGae-3OPS6PxQx76IwOpV_IRYc0wF9ezp61h7MifsY,449
|
|
188
191
|
howler/utils/list_utils.py,sha256=DrpmdV5GJRw0XjoalPhP_368NUzh3L1pJT49ob6LovI,226
|
|
189
|
-
howler/utils/lucene.py,sha256=
|
|
192
|
+
howler/utils/lucene.py,sha256=ldouSi9yoZwDBNAxGTalz81LgCHNtyg2b_mL3xYGr4E,2395
|
|
190
193
|
howler/utils/path.py,sha256=DfOU4i4zSs4wchHoE8iE7aWVLkTxiC_JRGepF2hBYBk,690
|
|
191
194
|
howler/utils/socket_utils.py,sha256=nz1SklC9xBHUSfHyTJjpq3mbozX1GDf01WzdGxfaUII,2212
|
|
192
195
|
howler/utils/str_utils.py,sha256=HE8Hqh2HlOLaj16w0H9zKOyDJLp-f1LQ50y_WeGZaEk,8389
|
|
193
196
|
howler/utils/uid.py,sha256=p9dsqyvZ-lpiAuzZWCPCeEM99kdk0Ly9czf04HNdSuw,1341
|
|
194
|
-
howler_api-2.
|
|
195
|
-
howler_api-2.
|
|
196
|
-
howler_api-2.
|
|
197
|
-
howler_api-2.
|
|
197
|
+
howler_api-2.13.0.dev344.dist-info/METADATA,sha256=58wpeDQGY3EdTebmd9ImKUuDTM0fCxReECnmXr7wm6w,2805
|
|
198
|
+
howler_api-2.13.0.dev344.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
199
|
+
howler_api-2.13.0.dev344.dist-info/entry_points.txt,sha256=Lu9SBGvwe0wczJHmc-RudC24lmQk7tv3ZBXon9RIihg,259
|
|
200
|
+
howler_api-2.13.0.dev344.dist-info/RECORD,,
|
|
File without changes
|