nucliadb-utils 6.2.1.post3176__py3-none-any.whl → 6.2.1.post3188__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.
- nucliadb_utils/audit/stream.py +25 -7
- nucliadb_utils/authentication.py +17 -2
- nucliadb_utils/nuclia_usage/utils/kb_usage_report.py +6 -0
- {nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/METADATA +3 -3
- {nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/RECORD +8 -8
- {nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/WHEEL +0 -0
- {nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/top_level.txt +0 -0
- {nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/zip-safe +0 -0
nucliadb_utils/audit/stream.py
CHANGED
@@ -37,15 +37,17 @@ from starlette.types import ASGIApp
|
|
37
37
|
|
38
38
|
from nucliadb_protos.audit_pb2 import AuditField, AuditRequest, ChatContext, ClientType, RetrievedContext
|
39
39
|
from nucliadb_protos.kb_usage_pb2 import (
|
40
|
-
|
41
|
-
|
42
|
-
from nucliadb_protos.kb_usage_pb2 import (
|
40
|
+
ActivityLogMatch,
|
41
|
+
ActivityLogMatchType,
|
43
42
|
KBSource,
|
44
43
|
Search,
|
45
44
|
SearchType,
|
46
45
|
Service,
|
47
46
|
Storage,
|
48
47
|
)
|
48
|
+
from nucliadb_protos.kb_usage_pb2 import (
|
49
|
+
ClientType as ClientTypeKbUsage,
|
50
|
+
)
|
49
51
|
from nucliadb_protos.nodereader_pb2 import SearchRequest
|
50
52
|
from nucliadb_protos.resources_pb2 import FieldID
|
51
53
|
from nucliadb_utils import logger
|
@@ -64,10 +66,10 @@ class RequestContext:
|
|
64
66
|
request_context_var = contextvars.ContextVar[Optional[RequestContext]]("request_context", default=None)
|
65
67
|
|
66
68
|
|
67
|
-
def get_trace_id() -> str:
|
69
|
+
def get_trace_id() -> Optional[str]:
|
68
70
|
span = get_current_span()
|
69
71
|
if span is None:
|
70
|
-
return
|
72
|
+
return None
|
71
73
|
return format_trace_id(span.get_span_context().trace_id)
|
72
74
|
|
73
75
|
|
@@ -88,7 +90,7 @@ class AuditMiddleware(BaseHTTPMiddleware):
|
|
88
90
|
context = RequestContext()
|
89
91
|
token = request_context_var.set(context)
|
90
92
|
context.audit_request.time.FromDatetime(datetime.now(tz=timezone.utc))
|
91
|
-
context.audit_request.trace_id = get_trace_id()
|
93
|
+
context.audit_request.trace_id = get_trace_id() or ""
|
92
94
|
context.path = request.url.path
|
93
95
|
|
94
96
|
if request.url.path.split("/")[-1] in ("ask", "search", "find"):
|
@@ -252,7 +254,7 @@ class StreamAuditStorage(AuditStorage):
|
|
252
254
|
|
253
255
|
# Reports MODIFIED / DELETED / NEW events
|
254
256
|
|
255
|
-
auditrequest.trace_id = get_trace_id()
|
257
|
+
auditrequest.trace_id = get_trace_id() or ""
|
256
258
|
auditrequest.kbid = kbid
|
257
259
|
auditrequest.userid = user or ""
|
258
260
|
auditrequest.rid = rid or ""
|
@@ -270,12 +272,16 @@ class StreamAuditStorage(AuditStorage):
|
|
270
272
|
self.send(auditrequest)
|
271
273
|
|
272
274
|
def report_storage(self, kbid: str, paragraphs: int, fields: int, bytes: int):
|
275
|
+
trace_id = get_trace_id()
|
273
276
|
self.kb_usage_utility.send_kb_usage(
|
274
277
|
service=Service.NUCLIA_DB,
|
275
278
|
account_id=None,
|
276
279
|
kb_id=kbid,
|
277
280
|
kb_source=KBSource.HOSTED,
|
278
281
|
storage=Storage(paragraphs=paragraphs, fields=fields, bytes=bytes),
|
282
|
+
activity_log_match=ActivityLogMatch(id=trace_id, type=ActivityLogMatchType.TRACE_ID)
|
283
|
+
if trace_id
|
284
|
+
else None,
|
279
285
|
)
|
280
286
|
|
281
287
|
def report_resources(
|
@@ -284,12 +290,16 @@ class StreamAuditStorage(AuditStorage):
|
|
284
290
|
kbid: str,
|
285
291
|
resources: int,
|
286
292
|
):
|
293
|
+
trace_id = get_trace_id()
|
287
294
|
self.kb_usage_utility.send_kb_usage(
|
288
295
|
service=Service.NUCLIA_DB,
|
289
296
|
account_id=None,
|
290
297
|
kb_id=kbid,
|
291
298
|
kb_source=KBSource.HOSTED,
|
292
299
|
storage=Storage(resources=resources),
|
300
|
+
activity_log_match=ActivityLogMatch(id=trace_id, type=ActivityLogMatchType.TRACE_ID)
|
301
|
+
if trace_id
|
302
|
+
else None,
|
293
303
|
)
|
294
304
|
|
295
305
|
def visited(
|
@@ -312,12 +322,16 @@ class StreamAuditStorage(AuditStorage):
|
|
312
322
|
auditrequest.type = AuditRequest.VISITED
|
313
323
|
|
314
324
|
def delete_kb(self, kbid: str):
|
325
|
+
trace_id = get_trace_id()
|
315
326
|
self.kb_usage_utility.send_kb_usage(
|
316
327
|
service=Service.NUCLIA_DB,
|
317
328
|
account_id=None,
|
318
329
|
kb_id=kbid,
|
319
330
|
kb_source=KBSource.HOSTED,
|
320
331
|
storage=Storage(paragraphs=0, fields=0, resources=0),
|
332
|
+
activity_log_match=ActivityLogMatch(id=trace_id, type=ActivityLogMatchType.TRACE_ID)
|
333
|
+
if trace_id
|
334
|
+
else None,
|
321
335
|
)
|
322
336
|
|
323
337
|
def search(
|
@@ -348,6 +362,7 @@ class StreamAuditStorage(AuditStorage):
|
|
348
362
|
else:
|
349
363
|
auditrequest.type = AuditRequest.SEARCH
|
350
364
|
|
365
|
+
trace_id = get_trace_id()
|
351
366
|
self.kb_usage_utility.send_kb_usage(
|
352
367
|
service=Service.NUCLIA_DB,
|
353
368
|
account_id=None,
|
@@ -362,6 +377,9 @@ class StreamAuditStorage(AuditStorage):
|
|
362
377
|
num_searches=1,
|
363
378
|
)
|
364
379
|
],
|
380
|
+
activity_log_match=ActivityLogMatch(id=trace_id, type=ActivityLogMatchType.TRACE_ID)
|
381
|
+
if trace_id
|
382
|
+
else None,
|
365
383
|
)
|
366
384
|
|
367
385
|
def chat(
|
nucliadb_utils/authentication.py
CHANGED
@@ -32,8 +32,9 @@ from starlette.websockets import WebSocket
|
|
32
32
|
|
33
33
|
|
34
34
|
class NucliaUser(BaseUser):
|
35
|
-
def __init__(self, username: str) -> None:
|
35
|
+
def __init__(self, username: str, security_groups: Optional[list[str]] = None) -> None:
|
36
36
|
self.username = username
|
37
|
+
self._security_groups = security_groups
|
37
38
|
|
38
39
|
@property
|
39
40
|
def is_authenticated(self) -> bool:
|
@@ -43,6 +44,10 @@ class NucliaUser(BaseUser):
|
|
43
44
|
def display_name(self) -> str:
|
44
45
|
return self.username
|
45
46
|
|
47
|
+
@property
|
48
|
+
def security_groups(self) -> Optional[list[str]]:
|
49
|
+
return self._security_groups
|
50
|
+
|
46
51
|
|
47
52
|
STFUser = NucliaUser
|
48
53
|
|
@@ -52,9 +57,11 @@ class NucliaCloudAuthenticationBackend(AuthenticationBackend):
|
|
52
57
|
self,
|
53
58
|
roles_header: str = "X-NUCLIADB-ROLES",
|
54
59
|
user_header: str = "X-NUCLIADB-USER",
|
60
|
+
security_groups_header: str = "X-NUCLIADB-SECURITY-GROUPS",
|
55
61
|
) -> None:
|
56
62
|
self.roles_header = roles_header
|
57
63
|
self.user_header = user_header
|
64
|
+
self.security_groups_header = security_groups_header
|
58
65
|
|
59
66
|
async def authenticate(self, request: HTTPConnection) -> Optional[Tuple[AuthCredentials, BaseUser]]:
|
60
67
|
if self.roles_header not in request.headers:
|
@@ -66,7 +73,15 @@ class NucliaCloudAuthenticationBackend(AuthenticationBackend):
|
|
66
73
|
|
67
74
|
if self.user_header in request.headers:
|
68
75
|
user = request.headers[self.user_header]
|
69
|
-
|
76
|
+
|
77
|
+
raw_security_groups: Optional[str] = request.headers.get(self.security_groups_header)
|
78
|
+
|
79
|
+
security_groups: Optional[list[str]] = None
|
80
|
+
if raw_security_groups is not None:
|
81
|
+
security_groups = raw_security_groups.split(";")
|
82
|
+
|
83
|
+
nuclia_user: NucliaUser = NucliaUser(username=user, security_groups=security_groups)
|
84
|
+
|
70
85
|
else:
|
71
86
|
nuclia_user = NucliaUser(username="anonymous")
|
72
87
|
|
@@ -27,6 +27,7 @@ from typing import Optional
|
|
27
27
|
from nats.js.client import JetStreamContext
|
28
28
|
|
29
29
|
from nucliadb_protos.kb_usage_pb2 import (
|
30
|
+
ActivityLogMatch,
|
30
31
|
KBSource,
|
31
32
|
KbUsage,
|
32
33
|
Predict,
|
@@ -96,6 +97,7 @@ class KbUsageReportUtility:
|
|
96
97
|
predicts: Iterable[Predict] = (),
|
97
98
|
searches: Iterable[Search] = (),
|
98
99
|
storage: Optional[Storage] = None,
|
100
|
+
activity_log_match: Optional[ActivityLogMatch] = None,
|
99
101
|
):
|
100
102
|
usage = KbUsage()
|
101
103
|
usage.service = service # type: ignore
|
@@ -105,6 +107,10 @@ class KbUsageReportUtility:
|
|
105
107
|
if kb_id is not None:
|
106
108
|
usage.kb_id = kb_id
|
107
109
|
usage.kb_source = kb_source # type: ignore
|
110
|
+
if activity_log_match is not None:
|
111
|
+
if activity_log_match.id:
|
112
|
+
usage.activity_log_match.id = activity_log_match.id
|
113
|
+
usage.activity_log_match.type = activity_log_match.type
|
108
114
|
|
109
115
|
usage.processes.extend(processes)
|
110
116
|
usage.predicts.extend(predicts)
|
{nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: nucliadb_utils
|
3
|
-
Version: 6.2.1.
|
3
|
+
Version: 6.2.1.post3188
|
4
4
|
Home-page: https://nuclia.com
|
5
5
|
License: BSD
|
6
6
|
Classifier: Development Status :: 4 - Beta
|
@@ -23,8 +23,8 @@ Requires-Dist: nats-py[nkeys]>=2.6.0
|
|
23
23
|
Requires-Dist: PyNaCl
|
24
24
|
Requires-Dist: pyjwt>=2.4.0
|
25
25
|
Requires-Dist: mrflagly>=0.2.9
|
26
|
-
Requires-Dist: nucliadb-protos>=6.2.1.
|
27
|
-
Requires-Dist: nucliadb-telemetry>=6.2.1.
|
26
|
+
Requires-Dist: nucliadb-protos>=6.2.1.post3188
|
27
|
+
Requires-Dist: nucliadb-telemetry>=6.2.1.post3188
|
28
28
|
Provides-Extra: cache
|
29
29
|
Requires-Dist: redis>=4.3.4; extra == "cache"
|
30
30
|
Requires-Dist: orjson>=3.6.7; extra == "cache"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
nucliadb_utils/__init__.py,sha256=EvBCH1iTODe-AgXm48aj4kVUt_Std3PeL8QnwimR5wI,895
|
2
2
|
nucliadb_utils/asyncio_utils.py,sha256=h8Y-xpcFFRgNzaiIW0eidz7griAQa7ggbNk34-tAt2c,2888
|
3
|
-
nucliadb_utils/authentication.py,sha256=
|
3
|
+
nucliadb_utils/authentication.py,sha256=5_b323v2ylJaJvM_0coeSQEtnD-p9IGD-6CPA6IXhik,6471
|
4
4
|
nucliadb_utils/const.py,sha256=ai2YJIv0uVOOowhbtSOqcrGMV6UJPjhGhlIRr7ZT8bg,2530
|
5
5
|
nucliadb_utils/debug.py,sha256=Q56Nx9Dp7V2ae3CU2H0ztaZcHTJXdlflPLKLeOPZ170,2436
|
6
6
|
nucliadb_utils/exceptions.py,sha256=y_3wk77WLVUtdo-5FtbBsdSkCtK_DsJkdWb5BoPn3qo,1094
|
@@ -24,7 +24,7 @@ nucliadb_utils/aiopynecone/models.py,sha256=XkNIZx4bxdbVo9zYVn8IRp70q4DWUMWN79yb
|
|
24
24
|
nucliadb_utils/audit/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
|
25
25
|
nucliadb_utils/audit/audit.py,sha256=VDUqcSToEoz5m7iG-4omjTlsBSEJGcp0_xl51idnU3Q,3384
|
26
26
|
nucliadb_utils/audit/basic.py,sha256=pVf1oKp7T_oTDCyt8QbSsfC_uWjF66ooF6rqY-SWSrc,4032
|
27
|
-
nucliadb_utils/audit/stream.py,sha256=
|
27
|
+
nucliadb_utils/audit/stream.py,sha256=AT4OuLTtQ3mID8Geasn6d7qRK8D7MIMUi7GemzU_7mk,16017
|
28
28
|
nucliadb_utils/cache/__init__.py,sha256=itSI7dtTwFP55YMX4iK7JzdMHS5CQVUiB1XzQu4UBh8,833
|
29
29
|
nucliadb_utils/cache/exceptions.py,sha256=Zu-O_-0-yctOEgoDGI92gPzWfBMRrpiAyESA62ld6MA,975
|
30
30
|
nucliadb_utils/cache/nats.py,sha256=-AjCfkFgKVdJUlGR0hT9JDSNkPVFg4S6w9eW-ZIcXPM,7037
|
@@ -38,7 +38,7 @@ nucliadb_utils/fastapi/run.py,sha256=OVuzjfsX_8IdVXKuK-RsIVf2OdP6t8h9DLfEn2P_-KI
|
|
38
38
|
nucliadb_utils/fastapi/versioning.py,sha256=pwiwuesJW1jElUUI3pI5kcxkigfGBvI64IL6QCBEWS8,3805
|
39
39
|
nucliadb_utils/nuclia_usage/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
|
40
40
|
nucliadb_utils/nuclia_usage/utils/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
|
41
|
-
nucliadb_utils/nuclia_usage/utils/kb_usage_report.py,sha256=
|
41
|
+
nucliadb_utils/nuclia_usage/utils/kb_usage_report.py,sha256=6lLuxCCPQVn3dOuZNL5ThPjl2yws-1TJ_7duhQSWkPU,3934
|
42
42
|
nucliadb_utils/storages/__init__.py,sha256=5Qc8AUWiJv9_JbGCBpAn88AIJhwDlm0OPQpg2ZdRL4U,872
|
43
43
|
nucliadb_utils/storages/azure.py,sha256=FK4c_v9AUAwagScm_F1uDmJeQQq7P4jZswiD2trwb4A,16394
|
44
44
|
nucliadb_utils/storages/exceptions.py,sha256=_xUDbfr3XkmUc0xXYZu3DpG1C8TtfmEweRwj9mbRvMU,2507
|
@@ -59,8 +59,8 @@ nucliadb_utils/tests/indexing.py,sha256=YW2QhkhO9Q_8A4kKWJaWSvXvyQ_AiAwY1VylcfVQ
|
|
59
59
|
nucliadb_utils/tests/local.py,sha256=fXIBasrvdaFJM-sw2wk1_oiFzBcm9O10iCyC-OiXwY8,1914
|
60
60
|
nucliadb_utils/tests/nats.py,sha256=RWHjwqq5esuO7OFbP24yYX1cXnpPLcWJwDUdmwCpH28,1897
|
61
61
|
nucliadb_utils/tests/s3.py,sha256=pl-RJFjA4MH6iXkqhsh5g8gDuEhrYu1nPZ-laxlrMlE,3704
|
62
|
-
nucliadb_utils-6.2.1.
|
63
|
-
nucliadb_utils-6.2.1.
|
64
|
-
nucliadb_utils-6.2.1.
|
65
|
-
nucliadb_utils-6.2.1.
|
66
|
-
nucliadb_utils-6.2.1.
|
62
|
+
nucliadb_utils-6.2.1.post3188.dist-info/METADATA,sha256=Nio-K2aVS2RnjP-9R3mCgisc4-uZBqb5Jf1AvRlbzgA,2172
|
63
|
+
nucliadb_utils-6.2.1.post3188.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
64
|
+
nucliadb_utils-6.2.1.post3188.dist-info/top_level.txt,sha256=fE3vJtALTfgh7bcAWcNhcfXkNPp_eVVpbKK-2IYua3E,15
|
65
|
+
nucliadb_utils-6.2.1.post3188.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
66
|
+
nucliadb_utils-6.2.1.post3188.dist-info/RECORD,,
|
File without changes
|
{nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/top_level.txt
RENAMED
File without changes
|
{nucliadb_utils-6.2.1.post3176.dist-info → nucliadb_utils-6.2.1.post3188.dist-info}/zip-safe
RENAMED
File without changes
|