nucliadb-utils 6.2.1.post3165__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.
@@ -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
- ClientType as ClientTypeKbUsage,
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(
@@ -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
- nuclia_user: BaseUser = NucliaUser(username=user)
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: nucliadb_utils
3
- Version: 6.2.1.post3165
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.post3165
27
- Requires-Dist: nucliadb-telemetry>=6.2.1.post3165
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=N__d2Ez3JHJv5asYK5TgUcIkKqcAC8ZTLlnfLhfSneM,5837
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=zT--ECfFNfhL22hhN4IKkPrCaNITKijmufXVoVWm_4c,15233
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=F6dhQWhrWzl3qfAdvrqV08hnFKcvFlU8IWN2lzYX0vg,3628
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.post3165.dist-info/METADATA,sha256=ygiFfmhuQ9oD0bhv3ZAtC2In3ZZEORSKUe3U88Z286g,2172
63
- nucliadb_utils-6.2.1.post3165.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
64
- nucliadb_utils-6.2.1.post3165.dist-info/top_level.txt,sha256=fE3vJtALTfgh7bcAWcNhcfXkNPp_eVVpbKK-2IYua3E,15
65
- nucliadb_utils-6.2.1.post3165.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
66
- nucliadb_utils-6.2.1.post3165.dist-info/RECORD,,
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,,