mmisp-lib 0.2.0__tar.gz → 0.4.0__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.
Files changed (131) hide show
  1. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/PKG-INFO +8 -2
  2. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/README.md +3 -0
  3. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/pyproject.toml +9 -2
  4. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/attributes.py +12 -11
  5. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/auth_keys.py +52 -3
  6. mmisp_lib-0.4.0/src/mmisp/api_schemas/authentication.py +89 -0
  7. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/events.py +51 -49
  8. mmisp_lib-0.4.0/src/mmisp/api_schemas/galaxy_clusters.py +64 -0
  9. mmisp_lib-0.4.0/src/mmisp/api_schemas/jobs.py +52 -0
  10. mmisp_lib-0.4.0/src/mmisp/api_schemas/organisations.py +126 -0
  11. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/roles.py +80 -0
  12. mmisp_lib-0.4.0/src/mmisp/api_schemas/servers.py +79 -0
  13. mmisp_lib-0.4.0/src/mmisp/api_schemas/statistics.py +19 -0
  14. mmisp_lib-0.4.0/src/mmisp/api_schemas/users.py +182 -0
  15. mmisp_lib-0.4.0/src/mmisp/commandline_tool/main.py +179 -0
  16. mmisp_lib-0.4.0/src/mmisp/commandline_tool/organisation.py +157 -0
  17. mmisp_lib-0.4.0/src/mmisp/commandline_tool/setup.py +101 -0
  18. mmisp_lib-0.4.0/src/mmisp/commandline_tool/user.py +126 -0
  19. mmisp_lib-0.4.0/src/mmisp/db/additional_properties.py +10 -0
  20. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/all_models.py +2 -0
  21. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/config.py +6 -1
  22. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/database.py +25 -9
  23. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/mixins.py +2 -1
  24. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/attribute.py +81 -3
  25. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/event.py +35 -0
  26. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/galaxy.py +7 -0
  27. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/galaxy_cluster.py +32 -0
  28. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/identity_provider.py +1 -1
  29. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/object.py +14 -0
  30. mmisp_lib-0.4.0/src/mmisp/db/models/organisation.py +57 -0
  31. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/tag.py +4 -0
  32. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/user.py +4 -0
  33. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/user_setting.py +2 -0
  34. mmisp_lib-0.4.0/src/mmisp/lib/attribute_search_filter.py +60 -0
  35. mmisp_lib-0.4.0/src/mmisp/tests/compatibility_helpers.py +56 -0
  36. mmisp_lib-0.4.0/src/mmisp/tests/fixtures.py +787 -0
  37. mmisp_lib-0.4.0/src/mmisp/tests/generators/feed_generator.py +82 -0
  38. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/attribute_generator.py +5 -0
  39. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/auth_key_generator.py +18 -0
  40. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/event_generator.py +16 -0
  41. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/galaxy_generator.py +11 -0
  42. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/identity_provider_generator.py +16 -0
  43. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/noticelist_generator.py +26 -0
  44. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/organisation_generator.py +20 -0
  45. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/role_generator.py +106 -0
  46. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/server_generator.py +27 -0
  47. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/sharing_group_generator.py +16 -0
  48. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/tag_generator.py +15 -0
  49. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/taxonomy_generator.py +40 -0
  50. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/user_generator.py +27 -0
  51. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/user_setting_generator.py +20 -0
  52. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/warninglist_generator.py +31 -0
  53. mmisp_lib-0.4.0/src/mmisp/tests/generators/model_generators/workflow_generator.py +414 -0
  54. mmisp_lib-0.4.0/src/mmisp/tests/generators/object_generator.py +180 -0
  55. mmisp_lib-0.4.0/src/mmisp/tests/generators/sighting_generator.py +47 -0
  56. mmisp_lib-0.4.0/src/mmisp/tests/generators/tag_generator.py +103 -0
  57. mmisp_lib-0.4.0/src/mmisp/tests/generators/taxonomies_generator.py +61 -0
  58. mmisp_lib-0.4.0/src/mmisp/util/py.typed +0 -0
  59. mmisp_lib-0.4.0/src/mmisp/workflows/__init__.py +0 -0
  60. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/workflows/execution.py +5 -3
  61. mmisp_lib-0.4.0/src/mmisp/workflows/py.typed +0 -0
  62. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp_lib.egg-info/PKG-INFO +8 -2
  63. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp_lib.egg-info/SOURCES.txt +38 -1
  64. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp_lib.egg-info/requires.txt +4 -1
  65. mmisp_lib-0.4.0/tests/test_commandline_tool.py +255 -0
  66. mmisp_lib-0.2.0/src/mmisp/api_schemas/authentication.py +0 -38
  67. mmisp_lib-0.2.0/src/mmisp/api_schemas/organisations.py +0 -24
  68. mmisp_lib-0.2.0/src/mmisp/api_schemas/users.py +0 -52
  69. mmisp_lib-0.2.0/src/mmisp/db/models/organisation.py +0 -30
  70. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/LICENSE +0 -0
  71. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/setup.cfg +0 -0
  72. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/__init__.py +0 -0
  73. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/common.py +0 -0
  74. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/feeds.py +0 -0
  75. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/galaxies.py +0 -0
  76. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/logs.py +0 -0
  77. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/noticelists.py +0 -0
  78. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/objects.py +0 -0
  79. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/py.typed +0 -0
  80. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/responses/__init__.py +0 -0
  81. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/responses/check_graph_response.py +0 -0
  82. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/responses/standard_status_response.py +0 -0
  83. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/sharing_groups.py +0 -0
  84. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/sightings.py +0 -0
  85. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/tags.py +0 -0
  86. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/taxonomies.py +0 -0
  87. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/user_settings.py +0 -0
  88. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/warninglists.py +0 -0
  89. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/api_schemas/workflows.py +0 -0
  90. {mmisp_lib-0.2.0/src/mmisp/db → mmisp_lib-0.4.0/src/mmisp/commandline_tool}/__init__.py +0 -0
  91. {mmisp_lib-0.2.0/src/mmisp/db → mmisp_lib-0.4.0/src/mmisp/commandline_tool}/py.typed +0 -0
  92. {mmisp_lib-0.2.0/src/mmisp/db/models → mmisp_lib-0.4.0/src/mmisp/db}/__init__.py +0 -0
  93. {mmisp_lib-0.2.0/src/mmisp/lib → mmisp_lib-0.4.0/src/mmisp/db/models}/__init__.py +0 -0
  94. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/admin_setting.py +0 -0
  95. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/auth_key.py +0 -0
  96. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/feed.py +0 -0
  97. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/log.py +0 -0
  98. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/noticelist.py +0 -0
  99. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/role.py +0 -0
  100. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/server.py +0 -0
  101. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/sharing_group.py +0 -0
  102. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/sighting.py +0 -0
  103. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/taxonomy.py +0 -0
  104. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/warninglist.py +0 -0
  105. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/workflow.py +0 -0
  106. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/models/workflow_blueprint.py +0 -0
  107. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/mypy.py +0 -0
  108. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/db/print_changes.py +0 -0
  109. {mmisp_lib-0.2.0/src/mmisp/lib → mmisp_lib-0.4.0/src/mmisp/db}/py.typed +0 -0
  110. {mmisp_lib-0.2.0/src/mmisp/util → mmisp_lib-0.4.0/src/mmisp/lib}/__init__.py +0 -0
  111. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/lib/actions.py +0 -0
  112. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/lib/attributes.py +0 -0
  113. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/lib/logging.py +0 -0
  114. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/lib/permissions.py +0 -0
  115. {mmisp_lib-0.2.0/src/mmisp/plugins → mmisp_lib-0.4.0/src/mmisp/lib}/py.typed +0 -0
  116. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/lib/uuid.py +0 -0
  117. {mmisp_lib-0.2.0/src/mmisp/util → mmisp_lib-0.4.0/src/mmisp/plugins}/py.typed +0 -0
  118. {mmisp_lib-0.2.0/src/mmisp/workflows → mmisp_lib-0.4.0/src/mmisp/tests}/__init__.py +0 -0
  119. /mmisp_lib-0.2.0/src/mmisp/workflows/py.typed → /mmisp_lib-0.4.0/src/mmisp/util/__init__.py +0 -0
  120. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/util/crypto.py +0 -0
  121. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/util/models.py +0 -0
  122. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/util/partial.py +0 -0
  123. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/util/uuid.py +0 -0
  124. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/workflows/fastapi.py +0 -0
  125. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/workflows/graph.py +0 -0
  126. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/workflows/input.py +0 -0
  127. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/workflows/legacy.py +0 -0
  128. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/workflows/misp_core_format.py +0 -0
  129. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp/workflows/modules.py +0 -0
  130. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp_lib.egg-info/dependency_links.txt +0 -0
  131. {mmisp_lib-0.2.0 → mmisp_lib-0.4.0}/src/mmisp_lib.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mmisp-lib
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Requires-Python: >=3.11.0
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -20,16 +20,19 @@ Requires-Dist: bcrypt==4.1.2
20
20
  Requires-Dist: nanoid==2.0.0
21
21
  Requires-Dist: cryptography==42.0.5
22
22
  Requires-Dist: jinja2~=3.1.4
23
+ Requires-Dist: fire
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: ruff>=0.3.7; extra == "dev"
25
26
  Requires-Dist: mypy==1.8.0; extra == "dev"
26
27
  Requires-Dist: pre-commit==3.6.0; extra == "dev"
27
28
  Requires-Dist: pytest==8.0.0; extra == "dev"
28
29
  Requires-Dist: pytest-test-groups; extra == "dev"
29
- Requires-Dist: pytest-asyncio==0.23.5.post1; extra == "dev"
30
+ Requires-Dist: pytest-asyncio==0.21.2; extra == "dev"
30
31
  Requires-Dist: pytest-cov==4.1.0; extra == "dev"
31
32
  Requires-Dist: respx==0.20.2; extra == "dev"
32
33
  Requires-Dist: mysql-connector-python==8.3.0; extra == "dev"
34
+ Requires-Dist: icecream; extra == "dev"
35
+ Requires-Dist: asyncio; extra == "dev"
33
36
 
34
37
  # Modern MISP - API
35
38
 
@@ -47,6 +50,9 @@ Create a file called `.env` and copy the contents of `.env.example` into it. Fin
47
50
 
48
51
  You should now be able to access the api on `localhost:4000`.
49
52
 
53
+ To use the commandline tool run `python .\src\mmisp\commandline_tool\main.py --h` from the base directory to view all commands. For detailed information of all commands: `python .\src\mmisp\commandline_tool\main.py --help`.
54
+ For setting up the DB use the commandline tool option for setup and then create your user account. In case you have not created a new organisation yet, please add your account to the setup basic organisation: ghost_org.
55
+
50
56
  Run tests using `make test` (local database container required running) or `make test/lite`.
51
57
 
52
58
  ## Setting up your IDE
@@ -14,6 +14,9 @@ Create a file called `.env` and copy the contents of `.env.example` into it. Fin
14
14
 
15
15
  You should now be able to access the api on `localhost:4000`.
16
16
 
17
+ To use the commandline tool run `python .\src\mmisp\commandline_tool\main.py --h` from the base directory to view all commands. For detailed information of all commands: `python .\src\mmisp\commandline_tool\main.py --help`.
18
+ For setting up the DB use the commandline tool option for setup and then create your user account. In case you have not created a new organisation yet, please add your account to the setup basic organisation: ghost_org.
19
+
17
20
  Run tests using `make test` (local database container required running) or `make test/lite`.
18
21
 
19
22
  ## Setting up your IDE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mmisp-lib"
3
- version = "0.2.0"
3
+ version = "0.4.0"
4
4
  description = ""
5
5
  authors = []
6
6
  readme = "README.md"
@@ -24,6 +24,7 @@ dependencies = [
24
24
  "nanoid==2.0.0",
25
25
  "cryptography==42.0.5",
26
26
  "jinja2~=3.1.4",
27
+ "fire",
27
28
  ]
28
29
 
29
30
 
@@ -34,10 +35,12 @@ dev = [
34
35
  "pre-commit==3.6.0",
35
36
  "pytest==8.0.0",
36
37
  "pytest-test-groups",
37
- "pytest-asyncio==0.23.5.post1",
38
+ "pytest-asyncio==0.21.2",
38
39
  "pytest-cov==4.1.0",
39
40
  "respx==0.20.2",
40
41
  "mysql-connector-python==8.3.0",
42
+ "icecream",
43
+ "asyncio",
41
44
  ]
42
45
 
43
46
  [tool.setuptools.package-data]
@@ -58,6 +61,10 @@ unsafe-fixes = true
58
61
  select = ["E", "F", "W", "I", "ICN", "ANN"]
59
62
  ignore = ["ANN002", "ANN003", "ANN401"]
60
63
 
64
+ [tool.ruff.lint.per-file-ignores]
65
+ "tests/**" = ["ANN001", "ANN201", "ANN202", "S101"]
66
+ "src/mmisp/tests/**" = ["ANN001", "ANN201", "ANN202", "S101"]
67
+
61
68
  [tool.coverage.run]
62
69
  concurrency = ["greenlet", "thread"]
63
70
  include = [
@@ -34,6 +34,7 @@ class SearchAttributesEvent(BaseModel):
34
34
  info: str
35
35
  orgc_id: str
36
36
  uuid: str
37
+ publish_timestamp: int
37
38
 
38
39
 
39
40
  class SearchAttributesAttributesDetails(BaseModel):
@@ -56,7 +57,7 @@ class SearchAttributesAttributesDetails(BaseModel):
56
57
  last_seen: str | None = None
57
58
  Event: SearchAttributesEvent | None = None
58
59
  Object: SearchAttributesObject | None = None
59
- Tag: list[GetAttributeTag] = []
60
+ Tag: list[GetAttributeTag] | None = None
60
61
 
61
62
 
62
63
  class SearchAttributesAttributes(BaseModel):
@@ -86,10 +87,7 @@ class SearchAttributesModelOverrides(BaseModel):
86
87
  base_score_config: SearchAttributesModelOverridesBaseScoreConfig
87
88
 
88
89
 
89
- class SearchAttributesBody(BaseModel):
90
- returnFormat: str = "json"
91
- page: int | None = None
92
- limit: int | None = None
90
+ class RestSearchFilter(BaseModel):
93
91
  value: str | None = None
94
92
  value1: str | None = None
95
93
  value2: str | None = None
@@ -101,15 +99,21 @@ class SearchAttributesBody(BaseModel):
101
99
  to: str | None = None
102
100
  last: int | None = None
103
101
  eventid: str | None = None
102
+ published: bool | None = None
103
+ to_ids: bool | None = None
104
+ deleted: bool | None = None
105
+
106
+
107
+ class SearchAttributesBody(RestSearchFilter):
108
+ returnFormat: str = "json"
109
+ page: int | None = None
110
+ limit: int | None = None
104
111
  with_attachments: Annotated[bool | None, Field(alias="withAttachments")] = None
105
112
  uuid: str | None = None
106
113
  publish_timestamp: str | None = None
107
- published: bool | None = None
108
114
  timestamp: str | None = None
109
115
  attribute_timestamp: str | None = None
110
116
  enforce_warninglist: Annotated[bool | None, Field(alias="enforceWarninglist")]
111
- to_ids: bool | None = None
112
- deleted: bool | None = None
113
117
  event_timestamp: str | None = None
114
118
  threat_level_id: str | None = None
115
119
  eventinfo: str | None = None
@@ -134,9 +138,6 @@ class SearchAttributesBody(BaseModel):
134
138
  include_full_model: Annotated[bool | None, Field(alias="includeFullModel")] = None
135
139
  exclude_decayed: Annotated[bool | None, Field(alias="excludeDecayed")] = None
136
140
 
137
- class Config:
138
- orm_mode = True
139
-
140
141
 
141
142
  class RestoreAttributeResponse(BaseModel):
142
143
  id: str
@@ -1,6 +1,7 @@
1
1
  from datetime import datetime
2
+ from typing import List, Self, Union
2
3
 
3
- from pydantic import BaseModel, PositiveInt, conint
4
+ from pydantic import BaseModel, PositiveInt, conint, validator
4
5
 
5
6
 
6
7
  class SearchGetAuthKeysResponseItemUser(BaseModel):
@@ -41,6 +42,21 @@ class SearchGetAuthKeysResponseItemAuthKey(BaseModel):
41
42
  unique_ips: list[str] | None = []
42
43
 
43
44
 
45
+ class SearchGetAuthKeysResponseAuthKey(BaseModel):
46
+ id: str
47
+ uuid: str
48
+ authkey_start: str
49
+ authkey_end: str
50
+ created: str
51
+ expiration: str
52
+ read_only: bool
53
+ user_id: str
54
+ comment: str | None
55
+ allowed_ips: list[str] | None = None
56
+ unique_ips: list[str] | None = []
57
+ last_used: str | None = None
58
+
59
+
44
60
  class SearchGetAuthKeysResponseItem(BaseModel):
45
61
  AuthKey: SearchGetAuthKeysResponseItemAuthKey
46
62
  User: SearchGetAuthKeysResponseItemUser
@@ -49,6 +65,14 @@ class SearchGetAuthKeysResponseItem(BaseModel):
49
65
  orm_mode = True
50
66
 
51
67
 
68
+ class SearchGetAuthKeysResponse(BaseModel):
69
+ AuthKey: SearchGetAuthKeysResponseAuthKey
70
+ User: SearchGetAuthKeysResponseItemUser
71
+
72
+ class Config:
73
+ orm_mode = True
74
+
75
+
52
76
  class SearchAuthKeyBody(BaseModel):
53
77
  page: PositiveInt = 1
54
78
  limit: conint(gt=0, lt=500) = 25 # type: ignore
@@ -78,6 +102,20 @@ class EditAuthKeyResponseAuthKey(BaseModel):
78
102
  allowed_ips: str | None = None
79
103
 
80
104
 
105
+ class EditAuthKeyResponseCompleteAuthKey(BaseModel):
106
+ id: str
107
+ uuid: str
108
+ authkey_start: str
109
+ authkey_end: str
110
+ created: str
111
+ expiration: str
112
+ read_only: bool
113
+ user_id: str
114
+ comment: str
115
+ allowed_ips: str | None = None
116
+ unique_ips: list[str] | None = None
117
+
118
+
81
119
  class EditAuthKeyResponseUser(BaseModel):
82
120
  id: str
83
121
  org_id: str
@@ -88,11 +126,22 @@ class EditAuthKeyResponse(BaseModel):
88
126
  User: EditAuthKeyResponseUser
89
127
 
90
128
 
129
+ class EditAuthKeyResponseCompl(BaseModel):
130
+ AuthKey: EditAuthKeyResponseCompleteAuthKey
131
+ User: EditAuthKeyResponseUser
132
+
133
+
91
134
  class EditAuthKeyBody(BaseModel):
92
135
  read_only: bool | None = None
93
136
  comment: str | None = None
94
- allowed_ips: list[str] | None = None
95
- expiration: int | None = None
137
+ allowed_ips: Union[str, List[str]] | None = None
138
+ expiration: str | None = None
139
+
140
+ @validator("allowed_ips", pre=True)
141
+ def ensure_list(cls: Self, v: str | List[str]) -> List[str]:
142
+ if isinstance(v, str):
143
+ return [v]
144
+ return v
96
145
 
97
146
 
98
147
  class AddAuthKeyResponseAuthKey(BaseModel):
@@ -0,0 +1,89 @@
1
+ from enum import Enum
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class TokenResponse(BaseModel):
7
+ token: str
8
+
9
+
10
+ class ChangeLoginInfoResponse(BaseModel):
11
+ successful: bool
12
+
13
+
14
+ class IdentityProviderBody(BaseModel):
15
+ name: str
16
+ org_id: str
17
+ active: bool
18
+ base_url: str
19
+ client_id: str
20
+ client_secret: str
21
+ scope: str | None = None
22
+
23
+
24
+ class IdentityProviderCallbackBody(BaseModel):
25
+ code: str
26
+ redirect_uri: str
27
+
28
+
29
+ class IdentityProviderEditBody(BaseModel):
30
+ name: str | None = None
31
+ org_id: str | None = None
32
+ active: bool | None = None
33
+ base_url: str | None = None
34
+ client_id: str | None = None
35
+ client_secret: str | None = None
36
+ scope: str | None = None
37
+
38
+
39
+ class GetIdentityProviderResponse(BaseModel):
40
+ id: str
41
+ name: str
42
+ org_id: str
43
+ active: bool
44
+ base_url: str
45
+ client_id: str
46
+ client_secret: str
47
+ scope: str | None = None
48
+
49
+
50
+ class IdentityProviderInfo(BaseModel):
51
+ id: str
52
+ name: str
53
+ url: str | None = None
54
+
55
+ class Config:
56
+ orm_mode = True
57
+
58
+
59
+ class LoginType(Enum):
60
+ PASSWORD = "password"
61
+ IDENTITY_PROVIDER = "idp"
62
+
63
+
64
+ class StartLoginBody(BaseModel):
65
+ email: str
66
+
67
+
68
+ class PasswordLoginBody(BaseModel):
69
+ email: str
70
+ password: str
71
+
72
+
73
+ class SetPasswordBody(BaseModel):
74
+ password: str
75
+
76
+
77
+ class ChangePasswordBody(BaseModel):
78
+ email: str
79
+ password: str
80
+ oldPassword: str | None = None
81
+
82
+
83
+ class ExchangeTokenLoginBody(BaseModel):
84
+ exchangeToken: str
85
+
86
+
87
+ class StartLoginResponse(BaseModel):
88
+ loginType: LoginType
89
+ identityProviders: list[IdentityProviderInfo] = []
@@ -1,3 +1,5 @@
1
+ from datetime import datetime
2
+
1
3
  from pydantic import BaseModel, PositiveInt, conint
2
4
 
3
5
  from mmisp.api_schemas.organisations import Organisation
@@ -23,6 +25,46 @@ class AddEditGetEventGalaxyClusterMeta(BaseModel):
23
25
  kill_chain: str | None = None
24
26
 
25
27
 
28
+ class FreeTextImportWorkerData(BaseModel):
29
+ data: str
30
+
31
+
32
+ class FreeTextImportWorkerUser(BaseModel):
33
+ user_id: int
34
+
35
+
36
+ class FreeTextImportWorkerBody(BaseModel):
37
+ user: FreeTextImportWorkerUser
38
+ data: FreeTextImportWorkerData
39
+
40
+ class Config:
41
+ orm_mode = True
42
+
43
+
44
+ class AddAttributeViaFreeTextImportEventResponse(BaseModel):
45
+ comment: str | None = None
46
+ value: str
47
+ original_value: str
48
+ to_ids: str
49
+ type: str
50
+ category: str
51
+ distribution: str
52
+
53
+ class Config:
54
+ orm_mode = True
55
+
56
+
57
+ class AddAttributeViaFreeTextImportEventAttributes(BaseModel):
58
+ value: str
59
+
60
+
61
+ class AddAttributeViaFreeTextImportEventBody(BaseModel):
62
+ Attribute: AddAttributeViaFreeTextImportEventAttributes
63
+
64
+ class Config:
65
+ orm_mode = True
66
+
67
+
26
68
  class GetAllEventsGalaxyCluster(BaseModel):
27
69
  id: str
28
70
  uuid: str
@@ -49,7 +91,7 @@ class GetAllEventsGalaxyCluster(BaseModel):
49
91
  meta: AddEditGetEventGalaxyClusterMeta | None = None
50
92
  tag_id: str
51
93
  local: bool | None = None
52
- relationship_type: str | None = None
94
+ relationship_type: bool | str | None = None
53
95
 
54
96
 
55
97
  class AddEditGetEventGalaxyClusterRelationTag(BaseModel):
@@ -109,7 +151,7 @@ class AddEditGetEventGalaxyCluster(BaseModel):
109
151
  attribute_tag_id: str | None = None
110
152
  event_tag_id: str | None = None
111
153
  local: bool | None = None
112
- relationship_type: str = ""
154
+ relationship_type: bool | str = ""
113
155
 
114
156
 
115
157
  class AddEditGetEventGalaxy(BaseModel):
@@ -130,7 +172,7 @@ class AddEditGetEventGalaxy(BaseModel):
130
172
  class AddEditGetEventOrg(BaseModel):
131
173
  id: str
132
174
  name: str
133
- uuid: str
175
+ uuid: str | None = None
134
176
  local: bool | None = None
135
177
 
136
178
 
@@ -146,7 +188,7 @@ class AddEditGetEventTag(BaseModel):
146
188
  is_custom_galaxy: bool
147
189
  local_only: bool
148
190
  local: bool
149
- relationship_type: str | None = None
191
+ relationship_type: bool | str | None = None
150
192
 
151
193
 
152
194
  class AddEditGetEventAttribute(BaseModel):
@@ -248,13 +290,13 @@ class AddEditGetEventResponse(BaseModel):
248
290
  Event: AddEditGetEventDetails
249
291
 
250
292
  class Config:
251
- orm_mode = True
293
+ json_encoders = {datetime: lambda v: v.strftime("%Y-%m-%d %H:%M:%S")}
252
294
 
253
295
 
254
296
  class GetAllEventsOrg(BaseModel):
255
297
  id: str
256
298
  name: str
257
- uuid: str
299
+ uuid: str | None = None
258
300
 
259
301
 
260
302
  class UnpublishEventResponse(BaseModel):
@@ -416,8 +458,8 @@ class GetAllEventsEventTag(BaseModel):
416
458
  event_id: str
417
459
  tag_id: str
418
460
  local: bool
419
- relationship_type: str
420
- Tag: GetAllEventsEventTagTag
461
+ relationship_type: bool | str | None = None
462
+ Tag: GetAllEventsEventTagTag | None = None
421
463
 
422
464
 
423
465
  class GetAllEventsResponse(BaseModel):
@@ -440,7 +482,7 @@ class GetAllEventsResponse(BaseModel):
440
482
  sighting_timestamp: str
441
483
  disable_correlation: bool
442
484
  extends_uuid: str
443
- event_creator_email: str # omitted
485
+ event_creator_email: str | None = None # omitted
444
486
  protected: str | None = None
445
487
  Org: GetAllEventsOrg
446
488
  Orgc: GetAllEventsOrg
@@ -451,22 +493,6 @@ class GetAllEventsResponse(BaseModel):
451
493
  orm_mode = True
452
494
 
453
495
 
454
- class FreeTextImportWorkerData(BaseModel):
455
- data: str
456
-
457
-
458
- class FreeTextImportWorkerUser(BaseModel):
459
- user_id: int
460
-
461
-
462
- class FreeTextImportWorkerBody(BaseModel):
463
- user: FreeTextImportWorkerUser
464
- data: FreeTextImportWorkerData
465
-
466
- class Config:
467
- orm_mode = True
468
-
469
-
470
496
  class EditEventBody(BaseModel):
471
497
  info: str | None = None
472
498
  org_id: str | None = None
@@ -546,30 +572,6 @@ class AddEventTag(BaseModel):
546
572
  name: str
547
573
 
548
574
 
549
- class AddAttributeViaFreeTextImportEventResponse(BaseModel):
550
- comment: str | None = None
551
- value: str
552
- original_value: str
553
- to_ids: str
554
- type: str
555
- category: str
556
- distribution: str
557
-
558
- class Config:
559
- orm_mode = True
560
-
561
-
562
- class AddAttributeViaFreeTextImportEventAttributes(BaseModel):
563
- value: str
564
-
565
-
566
- class AddAttributeViaFreeTextImportEventBody(BaseModel):
567
- Attribute: AddAttributeViaFreeTextImportEventAttributes
568
-
569
- class Config:
570
- orm_mode = True
571
-
572
-
573
575
  class AddEditGetEventRelatedEventAttributesOrg(BaseModel):
574
576
  id: str
575
577
  name: str
@@ -0,0 +1,64 @@
1
+ from pydantic import BaseModel
2
+
3
+ from mmisp.api_schemas.events.add_edit_get_event_response import AddEditGetEventGalaxyClusterRelation
4
+ from mmisp.api_schemas.events.get_all_events_response import GetAllEventsGalaxyClusterGalaxy
5
+ from mmisp.api_schemas.galaxies import ExportGalaxyGalaxyElement, GetAllSearchGalaxiesAttributes
6
+ from mmisp.api_schemas.organisations import GetOrganisationResponse
7
+ from mmisp.api_schemas.organisations.organisation import Organisation
8
+
9
+
10
+ class GetGalaxyClusterResponse(BaseModel):
11
+ id: str | None = None
12
+ uuid: str | None = None
13
+ collection_uuid: str
14
+ type: str
15
+ value: str
16
+ tag_name: str
17
+ description: str
18
+ galaxy_id: str
19
+ source: str
20
+ authors: list[str]
21
+ version: str
22
+ distribution: str
23
+ sharing_group_id: str
24
+ org_id: str
25
+ orgc_id: str
26
+ default: bool
27
+ locked: bool
28
+ extends_uuid: str
29
+ extends_version: str
30
+ published: bool
31
+ deleted: bool
32
+ Galaxy: GetAllSearchGalaxiesAttributes
33
+ GalaxyElement: list[ExportGalaxyGalaxyElement]
34
+ Org: GetOrganisationResponse
35
+ Orgc: GetOrganisationResponse
36
+
37
+
38
+ class ExportGalaxyClusterResponse(BaseModel):
39
+ id: str
40
+ uuid: str
41
+ collection_uuid: str
42
+ type: str
43
+ value: str
44
+ tag_name: str
45
+ description: str
46
+ galaxy_id: str
47
+ source: str
48
+ authors: list[str]
49
+ version: str
50
+ distribution: str
51
+ sharing_group_id: str
52
+ org_id: str
53
+ orgc_id: str
54
+ default: bool
55
+ locked: bool
56
+ extends_uuid: str
57
+ extends_version: str
58
+ published: bool
59
+ deleted: bool
60
+ GalaxyElement: list[ExportGalaxyGalaxyElement]
61
+ Galaxy: GetAllEventsGalaxyClusterGalaxy
62
+ GalaxyClusterRelation: list[AddEditGetEventGalaxyClusterRelation] = []
63
+ Org: Organisation
64
+ Orgc: Organisation
@@ -0,0 +1,52 @@
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class FreeTextProcessID(BaseModel):
5
+ id: str
6
+
7
+
8
+ class FreeTextImportWorkerData(BaseModel):
9
+ data: str
10
+
11
+
12
+ class FreeTextImportWorkerUser(BaseModel):
13
+ user_id: int
14
+
15
+
16
+ class FreeTextImportWorkerBody(BaseModel):
17
+ user: FreeTextImportWorkerUser
18
+ data: FreeTextImportWorkerData
19
+
20
+ class Config:
21
+ orm_mode = True
22
+
23
+
24
+ class AddAttributeViaFreeTextImportEventResponse(BaseModel):
25
+ event_id: str
26
+ value: str
27
+ original_value: str
28
+ to_ids: str
29
+ type: str
30
+ category: str
31
+ distribution: str
32
+
33
+ class Config:
34
+ orm_mode = True
35
+
36
+
37
+ class AddAttributeViaFreeTextImportEventBody(BaseModel):
38
+ value: str
39
+ returnMetaAttributes: bool
40
+
41
+ class Config:
42
+ orm_mode = True
43
+
44
+
45
+ class AttributeType(BaseModel):
46
+ types: list[str]
47
+ default_type: str
48
+ value: str
49
+
50
+
51
+ class ProcessFreeTextResponse(BaseModel):
52
+ attributes: list[AttributeType]