pycti 6.7.7__tar.gz → 6.7.8__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.

Potentially problematic release.


This version of pycti might be problematic. Click here for more details.

Files changed (91) hide show
  1. {pycti-6.7.7 → pycti-6.7.8}/PKG-INFO +7 -7
  2. {pycti-6.7.7 → pycti-6.7.8}/pycti/__init__.py +1 -1
  3. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/opencti_stix2.py +71 -0
  4. {pycti-6.7.7 → pycti-6.7.8}/pycti.egg-info/PKG-INFO +7 -7
  5. {pycti-6.7.7 → pycti-6.7.8}/pycti.egg-info/requires.txt +6 -6
  6. {pycti-6.7.7 → pycti-6.7.8}/setup.cfg +6 -6
  7. {pycti-6.7.7 → pycti-6.7.8}/LICENSE +0 -0
  8. {pycti-6.7.7 → pycti-6.7.8}/README.md +0 -0
  9. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/__init__.py +0 -0
  10. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_client.py +0 -0
  11. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_connector.py +0 -0
  12. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_draft.py +0 -0
  13. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_internal_file.py +0 -0
  14. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_notification.py +0 -0
  15. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_pir.py +0 -0
  16. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_playbook.py +0 -0
  17. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_public_dashboard.py +0 -0
  18. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_trash.py +0 -0
  19. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_work.py +0 -0
  20. {pycti-6.7.7 → pycti-6.7.8}/pycti/api/opencti_api_workspace.py +0 -0
  21. {pycti-6.7.7 → pycti-6.7.8}/pycti/connector/__init__.py +0 -0
  22. {pycti-6.7.7 → pycti-6.7.8}/pycti/connector/opencti_connector.py +0 -0
  23. {pycti-6.7.7 → pycti-6.7.8}/pycti/connector/opencti_connector_helper.py +0 -0
  24. {pycti-6.7.7 → pycti-6.7.8}/pycti/connector/opencti_metric_handler.py +0 -0
  25. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/__init__.py +0 -0
  26. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/indicator/__init__.py +0 -0
  27. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/indicator/opencti_indicator_properties.py +0 -0
  28. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_attack_pattern.py +0 -0
  29. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_campaign.py +0 -0
  30. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_capability.py +0 -0
  31. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_case_incident.py +0 -0
  32. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_case_rfi.py +0 -0
  33. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_case_rft.py +0 -0
  34. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_channel.py +0 -0
  35. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_course_of_action.py +0 -0
  36. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_data_component.py +0 -0
  37. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_data_source.py +0 -0
  38. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_event.py +0 -0
  39. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_external_reference.py +0 -0
  40. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_feedback.py +0 -0
  41. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_group.py +0 -0
  42. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_grouping.py +0 -0
  43. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_identity.py +0 -0
  44. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_incident.py +0 -0
  45. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_indicator.py +0 -0
  46. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_infrastructure.py +0 -0
  47. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_intrusion_set.py +0 -0
  48. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_kill_chain_phase.py +0 -0
  49. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_label.py +0 -0
  50. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_language.py +0 -0
  51. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_location.py +0 -0
  52. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_malware.py +0 -0
  53. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_malware_analysis.py +0 -0
  54. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_marking_definition.py +0 -0
  55. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_narrative.py +0 -0
  56. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_note.py +0 -0
  57. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_observed_data.py +0 -0
  58. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_opinion.py +0 -0
  59. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_report.py +0 -0
  60. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_role.py +0 -0
  61. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_settings.py +0 -0
  62. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix.py +0 -0
  63. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix_core_object.py +0 -0
  64. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix_core_relationship.py +0 -0
  65. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix_cyber_observable.py +0 -0
  66. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix_domain_object.py +0 -0
  67. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix_nested_ref_relationship.py +0 -0
  68. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix_object_or_stix_relationship.py +0 -0
  69. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_stix_sighting_relationship.py +0 -0
  70. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_task.py +0 -0
  71. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_threat_actor.py +0 -0
  72. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_threat_actor_group.py +0 -0
  73. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_threat_actor_individual.py +0 -0
  74. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_tool.py +0 -0
  75. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_user.py +0 -0
  76. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_vocabulary.py +0 -0
  77. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/opencti_vulnerability.py +0 -0
  78. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/stix_cyber_observable/__init__.py +0 -0
  79. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/stix_cyber_observable/opencti_stix_cyber_observable_deprecated.py +0 -0
  80. {pycti-6.7.7 → pycti-6.7.8}/pycti/entities/stix_cyber_observable/opencti_stix_cyber_observable_properties.py +0 -0
  81. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/__init__.py +0 -0
  82. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/constants.py +0 -0
  83. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/opencti_logger.py +0 -0
  84. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/opencti_stix2_identifier.py +0 -0
  85. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/opencti_stix2_splitter.py +0 -0
  86. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/opencti_stix2_update.py +0 -0
  87. {pycti-6.7.7 → pycti-6.7.8}/pycti/utils/opencti_stix2_utils.py +0 -0
  88. {pycti-6.7.7 → pycti-6.7.8}/pycti.egg-info/SOURCES.txt +0 -0
  89. {pycti-6.7.7 → pycti-6.7.8}/pycti.egg-info/dependency_links.txt +0 -0
  90. {pycti-6.7.7 → pycti-6.7.8}/pycti.egg-info/top_level.txt +0 -0
  91. {pycti-6.7.7 → pycti-6.7.8}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycti
3
- Version: 6.7.7
3
+ Version: 6.7.8
4
4
  Summary: Python API client for OpenCTI.
5
5
  Home-page: https://github.com/OpenCTI-Platform/client-python
6
6
  Author: Filigran
@@ -30,13 +30,13 @@ Requires-Dist: python_json_logger~=3.3.0
30
30
  Requires-Dist: PyYAML~=6.0
31
31
  Requires-Dist: requests~=2.32.3
32
32
  Requires-Dist: setuptools~=80.9.0
33
- Requires-Dist: cachetools~=5.5.0
34
- Requires-Dist: prometheus-client~=0.21.1
35
- Requires-Dist: opentelemetry-api~=1.32.0
36
- Requires-Dist: opentelemetry-sdk~=1.32.0
33
+ Requires-Dist: cachetools~=5.5.2
34
+ Requires-Dist: prometheus-client~=0.22.1
35
+ Requires-Dist: opentelemetry-api~=1.35.0
36
+ Requires-Dist: opentelemetry-sdk~=1.35.0
37
37
  Requires-Dist: deprecation~=2.1.0
38
38
  Requires-Dist: fastapi<0.117.0,>=0.116.1
39
- Requires-Dist: uvicorn[standard]<0.35.0,>=0.33.0
39
+ Requires-Dist: uvicorn[standard]<0.36.0,>=0.35.0
40
40
  Requires-Dist: filigran-sseclient>=1.0.2
41
41
  Requires-Dist: stix2~=3.0.1
42
42
  Provides-Extra: dev
@@ -45,7 +45,7 @@ Requires-Dist: build~=1.2.1; extra == "dev"
45
45
  Requires-Dist: isort~=6.0.0; extra == "dev"
46
46
  Requires-Dist: types-pytz~=2025.2.0.20250326; extra == "dev"
47
47
  Requires-Dist: pre-commit~=4.2.0; extra == "dev"
48
- Requires-Dist: pytest-cases~=3.8.0; extra == "dev"
48
+ Requires-Dist: pytest-cases~=3.9.1; extra == "dev"
49
49
  Requires-Dist: pytest-cov~=6.2.1; extra == "dev"
50
50
  Requires-Dist: pytest_randomly~=3.16.0; extra == "dev"
51
51
  Requires-Dist: pytest~=8.4.1; extra == "dev"
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- __version__ = "6.7.7"
2
+ __version__ = "6.7.8"
3
3
 
4
4
  from .api.opencti_api_client import OpenCTIApiClient
5
5
  from .api.opencti_api_connector import OpenCTIApiConnector
@@ -2511,6 +2511,10 @@ class OpenCTIStix2:
2511
2511
  self.opencti.notification.update_field(
2512
2512
  id=item_id, input=field_patch_without_files
2513
2513
  )
2514
+ elif item["type"] == "user":
2515
+ self.opencti.user.update_field(
2516
+ id=item_id, input=field_patch_without_files
2517
+ )
2514
2518
  else:
2515
2519
  self.opencti.stix_domain_object.update_field(
2516
2520
  id=item_id, input=field_patch_without_files
@@ -2583,6 +2587,65 @@ class OpenCTIStix2:
2583
2587
  item["id"], organization_ids, sharing_direct_container
2584
2588
  )
2585
2589
 
2590
+ def element_add_organizations(self, item):
2591
+ organization_ids = self.opencti.get_attribute_in_extension(
2592
+ "organization_ids", item
2593
+ )
2594
+ if organization_ids is None:
2595
+ organization_ids = item["organization_ids"]
2596
+ if item["type"] == "user":
2597
+ for organization_id in organization_ids:
2598
+ self.opencti.user.add_organization(
2599
+ id=item["id"], organization_id=organization_id
2600
+ )
2601
+ else:
2602
+ raise ValueError(
2603
+ "Add organizations operation not compatible with type",
2604
+ {"type": item["type"]},
2605
+ )
2606
+
2607
+ def element_remove_organizations(self, item):
2608
+ organization_ids = self.opencti.get_attribute_in_extension(
2609
+ "organization_ids", item
2610
+ )
2611
+ if organization_ids is None:
2612
+ organization_ids = item["organization_ids"]
2613
+ if item["type"] == "user":
2614
+ for organization_id in organization_ids:
2615
+ self.opencti.user.delete_organization(
2616
+ id=item["id"], organization_id=organization_id
2617
+ )
2618
+ else:
2619
+ raise ValueError(
2620
+ "Remove organizations operation not compatible with type",
2621
+ {"type": item["type"]},
2622
+ )
2623
+
2624
+ def element_add_groups(self, item):
2625
+ group_ids = self.opencti.get_attribute_in_extension("group_ids", item)
2626
+ if group_ids is None:
2627
+ group_ids = item["group_ids"]
2628
+ if item["type"] == "user":
2629
+ for group_id in group_ids:
2630
+ self.opencti.user.add_membership(id=item["id"], group_id=group_id)
2631
+ else:
2632
+ raise ValueError(
2633
+ "Add groups operation not compatible with type", {"type": item["type"]}
2634
+ )
2635
+
2636
+ def element_remove_groups(self, item):
2637
+ group_ids = self.opencti.get_attribute_in_extension("group_ids", item)
2638
+ if group_ids is None:
2639
+ group_ids = item["group_ids"]
2640
+ if item["type"] == "user":
2641
+ for group_id in group_ids:
2642
+ self.opencti.user.delete_membership(id=item["id"], group_id=group_id)
2643
+ else:
2644
+ raise ValueError(
2645
+ "Remove groups operation not compatible with type",
2646
+ {"type": item["type"]},
2647
+ )
2648
+
2586
2649
  def element_operation_delete(self, item, operation):
2587
2650
  # If data is stix, just use the generic stix function for deletion
2588
2651
  force_delete = operation == "delete_force"
@@ -2665,6 +2728,14 @@ class OpenCTIStix2:
2665
2728
  self.opencti.stix_core_object.ask_enrichments(
2666
2729
  element_id=item["id"], connector_ids=connector_ids
2667
2730
  )
2731
+ elif operation == "add_organizations":
2732
+ self.element_add_organizations(item)
2733
+ elif operation == "remove_organizations":
2734
+ self.element_remove_organizations(item)
2735
+ elif operation == "add_groups":
2736
+ self.element_add_groups(item)
2737
+ elif operation == "remove_groups":
2738
+ self.element_remove_groups(item)
2668
2739
  else:
2669
2740
  raise ValueError(
2670
2741
  "Not supported opencti_operation",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycti
3
- Version: 6.7.7
3
+ Version: 6.7.8
4
4
  Summary: Python API client for OpenCTI.
5
5
  Home-page: https://github.com/OpenCTI-Platform/client-python
6
6
  Author: Filigran
@@ -30,13 +30,13 @@ Requires-Dist: python_json_logger~=3.3.0
30
30
  Requires-Dist: PyYAML~=6.0
31
31
  Requires-Dist: requests~=2.32.3
32
32
  Requires-Dist: setuptools~=80.9.0
33
- Requires-Dist: cachetools~=5.5.0
34
- Requires-Dist: prometheus-client~=0.21.1
35
- Requires-Dist: opentelemetry-api~=1.32.0
36
- Requires-Dist: opentelemetry-sdk~=1.32.0
33
+ Requires-Dist: cachetools~=5.5.2
34
+ Requires-Dist: prometheus-client~=0.22.1
35
+ Requires-Dist: opentelemetry-api~=1.35.0
36
+ Requires-Dist: opentelemetry-sdk~=1.35.0
37
37
  Requires-Dist: deprecation~=2.1.0
38
38
  Requires-Dist: fastapi<0.117.0,>=0.116.1
39
- Requires-Dist: uvicorn[standard]<0.35.0,>=0.33.0
39
+ Requires-Dist: uvicorn[standard]<0.36.0,>=0.35.0
40
40
  Requires-Dist: filigran-sseclient>=1.0.2
41
41
  Requires-Dist: stix2~=3.0.1
42
42
  Provides-Extra: dev
@@ -45,7 +45,7 @@ Requires-Dist: build~=1.2.1; extra == "dev"
45
45
  Requires-Dist: isort~=6.0.0; extra == "dev"
46
46
  Requires-Dist: types-pytz~=2025.2.0.20250326; extra == "dev"
47
47
  Requires-Dist: pre-commit~=4.2.0; extra == "dev"
48
- Requires-Dist: pytest-cases~=3.8.0; extra == "dev"
48
+ Requires-Dist: pytest-cases~=3.9.1; extra == "dev"
49
49
  Requires-Dist: pytest-cov~=6.2.1; extra == "dev"
50
50
  Requires-Dist: pytest_randomly~=3.16.0; extra == "dev"
51
51
  Requires-Dist: pytest~=8.4.1; extra == "dev"
@@ -5,13 +5,13 @@ python_json_logger~=3.3.0
5
5
  PyYAML~=6.0
6
6
  requests~=2.32.3
7
7
  setuptools~=80.9.0
8
- cachetools~=5.5.0
9
- prometheus-client~=0.21.1
10
- opentelemetry-api~=1.32.0
11
- opentelemetry-sdk~=1.32.0
8
+ cachetools~=5.5.2
9
+ prometheus-client~=0.22.1
10
+ opentelemetry-api~=1.35.0
11
+ opentelemetry-sdk~=1.35.0
12
12
  deprecation~=2.1.0
13
13
  fastapi<0.117.0,>=0.116.1
14
- uvicorn[standard]<0.35.0,>=0.33.0
14
+ uvicorn[standard]<0.36.0,>=0.35.0
15
15
  filigran-sseclient>=1.0.2
16
16
  stix2~=3.0.1
17
17
 
@@ -27,7 +27,7 @@ build~=1.2.1
27
27
  isort~=6.0.0
28
28
  types-pytz~=2025.2.0.20250326
29
29
  pre-commit~=4.2.0
30
- pytest-cases~=3.8.0
30
+ pytest-cases~=3.9.1
31
31
  pytest-cov~=6.2.1
32
32
  pytest_randomly~=3.16.0
33
33
  pytest~=8.4.1
@@ -43,13 +43,13 @@ install_requires =
43
43
  PyYAML~=6.0
44
44
  requests~=2.32.3
45
45
  setuptools~=80.9.0
46
- cachetools~=5.5.0
47
- prometheus-client~=0.21.1
48
- opentelemetry-api~=1.32.0
49
- opentelemetry-sdk~=1.32.0
46
+ cachetools~=5.5.2
47
+ prometheus-client~=0.22.1
48
+ opentelemetry-api~=1.35.0
49
+ opentelemetry-sdk~=1.35.0
50
50
  deprecation~=2.1.0
51
51
  fastapi>=0.116.1,<0.117.0
52
- uvicorn[standard]>=0.33.0,<0.35.0
52
+ uvicorn[standard]>=0.35.0,<0.36.0
53
53
  filigran-sseclient>=1.0.2
54
54
  stix2~=3.0.1
55
55
 
@@ -60,7 +60,7 @@ dev =
60
60
  isort~=6.0.0
61
61
  types-pytz~=2025.2.0.20250326
62
62
  pre-commit~=4.2.0
63
- pytest-cases~=3.8.0
63
+ pytest-cases~=3.9.1
64
64
  pytest-cov~=6.2.1
65
65
  pytest_randomly~=3.16.0
66
66
  pytest~=8.4.1
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