mmisp-lib 0.10.0__tar.gz → 0.11.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 (180) hide show
  1. {mmisp_lib-0.10.0/src/mmisp_lib.egg-info → mmisp_lib-0.11.0}/PKG-INFO +1 -1
  2. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/pyproject.toml +1 -1
  3. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/attribute_common.py +12 -1
  4. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/attributes.py +20 -3
  5. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/events.py +15 -10
  6. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/galaxies.py +26 -5
  7. mmisp_lib-0.11.0/src/mmisp/api_schemas/galaxy_clusters.py +232 -0
  8. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/galaxy_common.py +38 -2
  9. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/object_templates.py +13 -8
  10. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/objects.py +3 -3
  11. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/organisations.py +22 -9
  12. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/server.py +6 -6
  13. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/servers.py +36 -10
  14. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/shadow_attribute.py +7 -7
  15. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/sharing_groups.py +3 -3
  16. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/sightings.py +1 -1
  17. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/taxonomies.py +22 -9
  18. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/users.py +1 -1
  19. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/setup.py +1 -0
  20. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/all_models.py +0 -1
  21. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/database.py +3 -1
  22. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/attribute.py +3 -3
  23. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/blocklist.py +4 -3
  24. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/event.py +3 -2
  25. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/galaxy.py +1 -1
  26. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/galaxy_cluster.py +2 -2
  27. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/object.py +2 -2
  28. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/sharing_group.py +4 -4
  29. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/sighting.py +2 -1
  30. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/types.py +0 -2
  31. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/attributes.py +34 -3
  32. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/distribution.py +1 -0
  33. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/galaxy_clusters.py +3 -1
  34. mmisp_lib-0.11.0/src/mmisp/lib/tags.py +38 -0
  35. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/loader.py +0 -2
  36. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/compatibility_helpers.py +4 -0
  37. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/fixtures.py +171 -57
  38. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/attribute_generator.py +13 -8
  39. mmisp_lib-0.11.0/src/mmisp/tests/generators/event_generator.py +30 -0
  40. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/feed_generator.py +4 -0
  41. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/attribute_generator.py +12 -0
  42. mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/event_blocklist_generator.py +10 -0
  43. mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/galaxy_cluster_blocklist_generator.py +10 -0
  44. mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/org_blocklist_generator.py +9 -0
  45. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/shadow_attribute_generator.py +5 -3
  46. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/sharing_group_generator.py +1 -0
  47. mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/threat_level_generator.py +10 -0
  48. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/graph.py +2 -1
  49. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0/src/mmisp_lib.egg-info}/PKG-INFO +1 -1
  50. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/SOURCES.txt +6 -0
  51. mmisp_lib-0.10.0/src/mmisp/api_schemas/galaxy_clusters.py +0 -135
  52. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/LICENSE +0 -0
  53. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/README.md +0 -0
  54. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/setup.cfg +0 -0
  55. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/__init__.py +0 -0
  56. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/auth_keys.py +0 -0
  57. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/authentication.py +0 -0
  58. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/common.py +0 -0
  59. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/feeds.py +0 -0
  60. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/jobs.py +0 -0
  61. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/logs.py +0 -0
  62. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/noticelists.py +0 -0
  63. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/py.typed +0 -0
  64. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/responses/__init__.py +0 -0
  65. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/responses/check_graph_response.py +0 -0
  66. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/responses/standard_status_response.py +0 -0
  67. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/roles.py +0 -0
  68. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/statistics.py +0 -0
  69. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/tags.py +0 -0
  70. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/user_settings.py +0 -0
  71. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/warninglists.py +0 -0
  72. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/worker.py +0 -0
  73. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/workflows.py +0 -0
  74. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/__init__.py +0 -0
  75. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/main.py +0 -0
  76. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/organisation.py +0 -0
  77. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/py.typed +0 -0
  78. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/user.py +0 -0
  79. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/__init__.py +0 -0
  80. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/additional_properties.py +0 -0
  81. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/config.py +0 -0
  82. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/lib.py +0 -0
  83. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/list_json_type.py +0 -0
  84. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/mixins.py +0 -0
  85. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/__init__.py +0 -0
  86. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/admin_setting.py +0 -0
  87. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/auth_key.py +0 -0
  88. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/correlation.py +0 -0
  89. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/feed.py +0 -0
  90. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/identity_provider.py +0 -0
  91. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/log.py +0 -0
  92. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/noticelist.py +0 -0
  93. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/organisation.py +0 -0
  94. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/post.py +0 -0
  95. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/role.py +0 -0
  96. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/server.py +0 -0
  97. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/shadow_attribute.py +0 -0
  98. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/tag.py +0 -0
  99. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/tasks.py +0 -0
  100. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/taxonomy.py +0 -0
  101. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/threat_level.py +0 -0
  102. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/user.py +0 -0
  103. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/user_setting.py +0 -0
  104. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/warninglist.py +0 -0
  105. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/workflow.py +0 -0
  106. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/models/workflow_blueprint.py +0 -0
  107. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/mypy.py +0 -0
  108. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/object_json_type.py +0 -0
  109. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/print_changes.py +0 -0
  110. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/py.typed +0 -0
  111. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/db/uuid_type.py +0 -0
  112. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/__init__.py +0 -0
  113. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/actions.py +0 -0
  114. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/attribute_search_filter.py +0 -0
  115. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/fallbacks.py +0 -0
  116. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/galaxies.py +0 -0
  117. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/logger.py +0 -0
  118. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/permissions.py +0 -0
  119. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/py.typed +0 -0
  120. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/serialisation_helper.py +0 -0
  121. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/settings.py +0 -0
  122. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/standard_roles.py +0 -0
  123. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/standard_threat_levels.py +0 -0
  124. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/lib/uuid.py +0 -0
  125. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/__init__.py +0 -0
  126. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/enrichment/__init__.py +0 -0
  127. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/enrichment/data.py +0 -0
  128. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/exceptions.py +0 -0
  129. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/factory.py +0 -0
  130. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/models/__init__.py +0 -0
  131. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/models/attribute.py +0 -0
  132. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/protocols.py +0 -0
  133. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/py.typed +0 -0
  134. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/plugins/types.py +0 -0
  135. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/__init__.py +0 -0
  136. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/auth_key_generator.py +0 -0
  137. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/correlation_exclusions_generator.py +0 -0
  138. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/correlation_value_generator.py +0 -0
  139. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/default_correlation_generator.py +0 -0
  140. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/galaxy_generator.py +0 -0
  141. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/identity_provider_generator.py +0 -0
  142. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/noticelist_generator.py +0 -0
  143. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/object_generator.py +0 -0
  144. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/organisation_generator.py +0 -0
  145. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/over_correlating_value_generator.py +0 -0
  146. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/post_generator.py +0 -0
  147. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/role_generator.py +0 -0
  148. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/server_generator.py +0 -0
  149. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/sighting_generator.py +0 -0
  150. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/tag_generator.py +0 -0
  151. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/taxonomy_generator.py +0 -0
  152. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/user_generator.py +0 -0
  153. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/user_setting_generator.py +0 -0
  154. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/warninglist_generator.py +0 -0
  155. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/workflow_generator.py +0 -0
  156. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/object_generator.py +0 -0
  157. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/sighting_generator.py +0 -0
  158. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/tag_generator.py +0 -0
  159. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/taxonomies_generator.py +0 -0
  160. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/tests/maps.py +0 -0
  161. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/util/__init__.py +0 -0
  162. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/util/async_download.py +0 -0
  163. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/util/crypto.py +0 -0
  164. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/util/github.py +0 -0
  165. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/util/partial.py +0 -0
  166. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/util/py.typed +0 -0
  167. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/util/uuid.py +0 -0
  168. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/__init__.py +0 -0
  169. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/execution.py +0 -0
  170. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/fastapi.py +0 -0
  171. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/input.py +0 -0
  172. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/legacy.py +0 -0
  173. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/misp_core_format.py +0 -0
  174. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/modules.py +0 -0
  175. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp/workflows/py.typed +0 -0
  176. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/dependency_links.txt +0 -0
  177. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/entry_points.txt +0 -0
  178. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/requires.txt +0 -0
  179. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/top_level.txt +0 -0
  180. {mmisp_lib-0.10.0 → mmisp_lib-0.11.0}/tests/test_commandline_tool.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mmisp-lib
3
- Version: 0.10.0
3
+ Version: 0.11.0
4
4
  Requires-Python: >=3.11.0
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mmisp-lib"
3
- version = "0.10.0"
3
+ version = "0.11.0"
4
4
  description = ""
5
5
  authors = []
6
6
  readme = "README.md"
@@ -2,10 +2,11 @@ from datetime import datetime
2
2
  from typing import Any, Self, Type
3
3
  from uuid import UUID
4
4
 
5
- from pydantic import BaseModel, field_serializer, field_validator
5
+ from pydantic import BaseModel, field_serializer, field_validator, model_validator
6
6
 
7
7
  from mmisp.lib.attributes import (
8
8
  AttributeCategories,
9
+ AttributeType,
9
10
  literal_valid_attribute_types,
10
11
  )
11
12
  from mmisp.lib.distribution import AttributeDistributionLevels
@@ -46,3 +47,13 @@ class CommonAttribute(BaseModel):
46
47
  if value == "":
47
48
  return None
48
49
  return value
50
+
51
+ @model_validator(mode="after")
52
+ def check_type_value(self: Self) -> Self:
53
+ # get validator from attribute type
54
+ at = AttributeType.map_dbkey_attributetype[self.type]
55
+ validator = at.validator
56
+ if not validator(self.value):
57
+ raise ValueError(f"{self.value} is not compatible with attribute type {self.type}")
58
+
59
+ return self
@@ -6,6 +6,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_valid
6
6
  from mmisp.api_schemas.attribute_common import CommonAttribute
7
7
  from mmisp.lib.attributes import (
8
8
  AttributeCategories,
9
+ AttributeType,
9
10
  default_category,
10
11
  inverted_categories,
11
12
  literal_valid_attribute_types,
@@ -34,6 +35,7 @@ class SearchAttributesEvent(BaseModel):
34
35
  id: int
35
36
  org_id: int
36
37
  distribution: EventDistributionLevels
38
+ user_id: int
37
39
  info: str
38
40
  orgc_id: int
39
41
  uuid: str
@@ -385,8 +387,13 @@ class AddAttributeBody(BaseModel):
385
387
 
386
388
  @model_validator(mode="after")
387
389
  def ensure_value_or_value1_is_set(self: Self) -> Self:
388
- if self.value is None and self.value1 is None:
389
- raise ValueError("value or value1 has to be set")
390
+ if self.value is None:
391
+ if self.value1 is None:
392
+ raise ValueError("value or value1 has to be set")
393
+ if self.value2 is not None:
394
+ self.value = f"{self.value1}|{self.value2}"
395
+ else:
396
+ self.value = f"{self.value1}"
390
397
  return self
391
398
 
392
399
  @field_serializer("timestamp")
@@ -395,13 +402,23 @@ class AddAttributeBody(BaseModel):
395
402
  return None
396
403
  return int(timestamp.timestamp())
397
404
 
398
- @field_validator("first_seen", mode="before")
405
+ @field_validator("first_seen", "value", "value1", "value2", mode="before")
399
406
  @classmethod
400
407
  def empty_string_to_none(cls: Type[Self], value: Any) -> Any:
401
408
  if value == "":
402
409
  return None
403
410
  return value
404
411
 
412
+ @model_validator(mode="after")
413
+ def check_type_value(self: Self) -> Self:
414
+ # get validator from attribute type
415
+ at = AttributeType.map_dbkey_attributetype[self.type]
416
+ validator = at.validator
417
+ if not validator(self.value):
418
+ raise ValueError(f"{self.value} is not compatible with attribute type {self.type}")
419
+
420
+ return self
421
+
405
422
 
406
423
  GetAttributeStatisticsTypesResponseAttrs = {x: Field(default=None) for x in mapper_val_safe_clsname.keys()}
407
424
  GetAttributeStatisticsTypesResponseAttrs["__annotations__"] = {
@@ -9,7 +9,7 @@ from mmisp.api_schemas.attribute_common import CommonAttribute
9
9
  from mmisp.api_schemas.galaxy_common import CommonGalaxy, CommonGalaxyCluster, GalaxyClusterMeta
10
10
  from mmisp.api_schemas.organisations import Organisation
11
11
  from mmisp.api_schemas.sharing_groups import EventSharingGroupResponse, MinimalSharingGroup
12
- from mmisp.lib.distribution import AttributeDistributionLevels
12
+ from mmisp.lib.distribution import AttributeDistributionLevels, EventDistributionLevels
13
13
 
14
14
 
15
15
  class GetAllEventsGalaxyClusterGalaxy(CommonGalaxy):
@@ -24,7 +24,7 @@ class AddEditGetEventGalaxyClusterRelationTag(BaseModel):
24
24
  org_id: int
25
25
  user_id: int
26
26
  hide_tag: bool
27
- numerical_value: str
27
+ numerical_value: int
28
28
  is_galaxy: bool
29
29
  is_custom_galaxy: bool
30
30
  local_only: bool
@@ -52,6 +52,8 @@ class GetAllEventsGalaxyCluster(CommonGalaxyCluster):
52
52
 
53
53
 
54
54
  class AddEditGetEventGalaxyCluster(CommonGalaxyCluster):
55
+ meta: dict[str, list]
56
+
55
57
  GalaxyClusterRelation: list[AddEditGetEventGalaxyClusterRelation] = []
56
58
  Org: Organisation | None = None
57
59
  Orgc: Organisation | None = None
@@ -206,7 +208,7 @@ class AddEditGetEventRelatedEvent(BaseModel):
206
208
 
207
209
 
208
210
  class AddEditGetEventDetails(BaseModel):
209
- id: int
211
+ id: int | None = None
210
212
  orgc_id: int
211
213
  org_id: int
212
214
  date: str
@@ -216,18 +218,18 @@ class AddEditGetEventDetails(BaseModel):
216
218
  uuid: str
217
219
  attribute_count: int
218
220
  analysis: str | int
219
- timestamp: datetime
220
- distribution: AttributeDistributionLevels
221
+ timestamp: datetime | None = None
222
+ distribution: EventDistributionLevels
221
223
  proposal_email_lock: bool
222
224
  locked: bool
223
- publish_timestamp: datetime
225
+ publish_timestamp: datetime | None = None
224
226
  sharing_group_id: int | None = None
225
227
  disable_correlation: bool
226
- extends_uuid: str
228
+ extends_uuid: str | None = None
227
229
  protected: bool | None = None
228
230
  event_creator_email: str | None = None
229
- Org: AddEditGetEventOrg
230
- Orgc: AddEditGetEventOrg
231
+ Org: AddEditGetEventOrg | None = None
232
+ Orgc: AddEditGetEventOrg | None = None
231
233
  Attribute: list[AddEditGetEventAttribute] = []
232
234
  ShadowAttribute: list[AddEditGetEventShadowAttribute] = []
233
235
  RelatedEvent: list[AddEditGetEventRelatedEvent] = []
@@ -239,7 +241,9 @@ class AddEditGetEventDetails(BaseModel):
239
241
  sharing_group: EventSharingGroupResponse | None = Field(alias="SharingGroup", default=None)
240
242
 
241
243
  @field_serializer("timestamp", "publish_timestamp")
242
- def serialize_timestamp(self: Self, timestamp: datetime, _: Any) -> int:
244
+ def serialize_timestamp(self: Self, timestamp: datetime | None, _: Any) -> int | None:
245
+ if timestamp is None:
246
+ return None
243
247
  return int(timestamp.timestamp())
244
248
 
245
249
 
@@ -391,6 +395,7 @@ class IndexEventsBody(BaseModel):
391
395
  hasproposal: str | None = None
392
396
  timestamp: datetime | None = None
393
397
  publish_timestamp: datetime | None = None
398
+ published: bool | None = None
394
399
  searchDatefrom: str | None = None
395
400
  searchDateuntil: str | None = None
396
401
 
@@ -1,3 +1,4 @@
1
+ from datetime import datetime
1
2
  from typing import Any, Literal
2
3
  from uuid import UUID
3
4
 
@@ -5,7 +6,7 @@ from pydantic import BaseModel, ConfigDict, Field
5
6
 
6
7
  from mmisp.api_schemas.common import TagAttributesResponse
7
8
  from mmisp.api_schemas.events import AddEditGetEventGalaxyClusterRelation, GetAllEventsGalaxyClusterGalaxy
8
- from mmisp.api_schemas.galaxy_common import CommonGalaxy, CommonGalaxyCluster, GetAllSearchGalaxiesAttributes
9
+ from mmisp.api_schemas.galaxy_common import CommonGalaxy, CommonGalaxyCluster
9
10
  from mmisp.api_schemas.organisations import Organisation
10
11
  from mmisp.lib.distribution import GalaxyDistributionLevels
11
12
 
@@ -25,6 +26,26 @@ class ImportGalaxy(BaseModel):
25
26
  orgc_id: Literal[0] = 0
26
27
 
27
28
 
29
+ class RestSearchGalaxyBody(BaseModel):
30
+ id: int
31
+ uuid: UUID | None = None
32
+ name: str | None = None
33
+ type: str | None = None
34
+ description: str | None = None
35
+ version: str | None = None
36
+ icon: str | None = None
37
+ namespace: str | None = None
38
+ enabled: bool = False
39
+ enable: bool | None = None
40
+ local_only: bool | None = None
41
+ default: bool | None = None
42
+ org_id: int | None = None
43
+ orgc_id: int | None = None
44
+ created: datetime | None = None
45
+ modified: datetime | None = None
46
+ distribution: GalaxyDistributionLevels | None = None
47
+
48
+
28
49
  class SearchGalaxiesBody(BaseModel):
29
50
  id: int | None = None
30
51
  uuid: str | None = None
@@ -71,12 +92,12 @@ class ImportGalaxyBody(BaseModel):
71
92
 
72
93
 
73
94
  class GetAllSearchGalaxiesResponse(BaseModel):
74
- Galaxy: GetAllSearchGalaxiesAttributes
95
+ Galaxy: RestSearchGalaxyBody
75
96
  model_config = ConfigDict(from_attributes=True)
76
97
 
77
98
 
78
99
  class GetGalaxyResponse(BaseModel):
79
- Galaxy: GetAllSearchGalaxiesAttributes
100
+ Galaxy: RestSearchGalaxyBody
80
101
  GalaxyCluster: list[GetGalaxyClusterResponse]
81
102
  model_config = ConfigDict(from_attributes=True)
82
103
 
@@ -107,7 +128,7 @@ class ExportGalaxyClusterResponse(BaseModel):
107
128
  default: bool
108
129
  locked: bool
109
130
  extends_uuid: str
110
- extends_version: int
131
+ extends_version: int | None
111
132
  published: bool
112
133
  deleted: bool
113
134
  GalaxyElement: list[ExportGalaxyGalaxyElement]
@@ -150,7 +171,7 @@ class GalaxyClustersViewResponse(BaseModel):
150
171
  default: bool
151
172
  locked: bool
152
173
  extends_uuid: str
153
- extends_version: int
174
+ extends_version: int | None
154
175
  published: bool
155
176
  deleted: bool
156
177
  GalaxyElement: list[ExportGalaxyGalaxyElement]
@@ -0,0 +1,232 @@
1
+ from typing import Literal, Optional
2
+ from uuid import UUID
3
+
4
+ from pydantic import BaseModel, ConfigDict, Field
5
+
6
+ from mmisp.api_schemas.common import NoneTag, TagAttributesResponse
7
+ from mmisp.api_schemas.events import AddEditGetEventGalaxyClusterRelation, GetAllEventsGalaxyClusterGalaxy
8
+ from mmisp.api_schemas.galaxies import ExportGalaxyGalaxyElement, RestSearchGalaxyBody
9
+ from mmisp.api_schemas.galaxy_common import (
10
+ ShortCommonGalaxy,
11
+ ShortCommonGalaxyCluster,
12
+ )
13
+ from mmisp.api_schemas.organisations import GetOrganisationElement
14
+ from mmisp.lib.distribution import DistributionLevels, GalaxyDistributionLevels
15
+
16
+
17
+ class IndexGalaxyCluster(BaseModel):
18
+ Galaxy: ShortCommonGalaxy
19
+ GalaxyCluster: ShortCommonGalaxyCluster
20
+
21
+
22
+ class ImportGalaxyClusterValueMeta(BaseModel):
23
+ model_config = ConfigDict(extra="allow")
24
+
25
+ type: list[str] | None = None
26
+ complexity: str | None = None
27
+ effectiveness: str | None = None
28
+ country: str | None = None
29
+ possible_issues: str | None = None
30
+ colour: str | None = None
31
+ motive: str | None = None
32
+ impact: str | None = None
33
+ refs: list[str] | None = None
34
+ synonyms: list[str] | None = None
35
+ status: str | None = None
36
+ date: str | None = None
37
+ encryption: str | None = None
38
+ extensions: list[str] | None = None
39
+ ransomnotes: list[str] | None = None
40
+ official_refs: list[str] | None = Field(None, validation_alias="official-refs")
41
+
42
+
43
+ class ImportGalaxyClusterValueRelated(BaseModel):
44
+ dest_uuid: UUID = Field(validation_alias="dest-uuid")
45
+ type: str
46
+
47
+
48
+ class ImportGalaxyClusterValue(BaseModel):
49
+ value: str
50
+ uuid: UUID
51
+ related: list[ImportGalaxyClusterValueRelated] | None = None
52
+ description: str = ""
53
+ revoked: bool | None = None
54
+ meta: ImportGalaxyClusterValueMeta | None = None
55
+
56
+
57
+ class ImportGalaxyCluster(BaseModel):
58
+ description: str
59
+ type: str
60
+ version: int
61
+ name: str
62
+ uuid: UUID
63
+ values: list[ImportGalaxyClusterValue]
64
+ authors: list[str]
65
+ source: str
66
+ category: str
67
+
68
+ distribution: Literal[3] = 3
69
+
70
+
71
+ class GetGalaxyClusterResponse(BaseModel):
72
+ id: int | None = None
73
+ uuid: str | None = None
74
+ collection_uuid: str
75
+ type: str
76
+ value: str
77
+ tag_name: str
78
+ description: str
79
+ galaxy_id: int
80
+ source: str
81
+ authors: list[str]
82
+ version: int
83
+ distribution: GalaxyDistributionLevels
84
+ sharing_group_id: int | None
85
+ org_id: int
86
+ orgc_id: int
87
+ default: bool
88
+ locked: bool
89
+ extends_uuid: Literal[""] | UUID | None
90
+ extends_version: int | None
91
+ published: bool
92
+ deleted: bool
93
+ RelationshipInbound: list[str] = Field(default_factory=list)
94
+ TargetingClusterRelation: list[str] = Field(default_factory=list)
95
+ GalaxyElement: list[ExportGalaxyGalaxyElement]
96
+ Galaxy: GetAllEventsGalaxyClusterGalaxy | None = None
97
+ GalaxyClusterRelation: list[AddEditGetEventGalaxyClusterRelation] = []
98
+ Org: GetOrganisationElement | None = None
99
+ Orgc: GetOrganisationElement | None = None
100
+
101
+
102
+ class GalaxyClusterResponse(BaseModel):
103
+ GalaxyCluster: GetGalaxyClusterResponse
104
+ Tag: NoneTag | TagAttributesResponse = Field(default_factory=NoneTag)
105
+
106
+
107
+ class AddGalaxyElement(BaseModel):
108
+ key: str
109
+ value: str
110
+
111
+
112
+ class AddUpdateGalaxyElement(BaseModel):
113
+ id: int | None = None
114
+ galaxy_cluster_id: int | None = None
115
+ key: str
116
+ value: str
117
+
118
+
119
+ class AddGalaxyClusterRequest(BaseModel):
120
+ uuid: str | None = None
121
+ value: str
122
+ description: str
123
+ source: str
124
+ authors: list[str]
125
+ org_id: int | None = None
126
+ orgc_id: int | None = None
127
+ distribution: DistributionLevels
128
+ locked: bool = False
129
+ GalaxyElement: list[AddGalaxyElement]
130
+
131
+
132
+ class PutGalaxyClusterRequest(BaseModel):
133
+ id: int | None = None
134
+ uuid: str | None = None
135
+ collection_uuid: UUID | Literal[""] | None = None
136
+ type: str | None = None
137
+ value: str | None = None
138
+ tag_name: str | None = None
139
+ description: str | None = None
140
+ galaxy_id: int | None = None
141
+ source: str | None = None
142
+ authors: list[str] | None = None
143
+ version: int | None = None
144
+ distribution: DistributionLevels
145
+ sharing_group_id: int | None = None
146
+ org_id: int | None = None
147
+ orgc_id: int | None = None
148
+ default: bool | None = None
149
+ locked: bool | None = None
150
+ extends_uuid: str | None = None
151
+ extends_version: str | None = None
152
+ published: bool | None = None
153
+ deleted: bool | None = None
154
+ GalaxyElement: list[AddUpdateGalaxyElement] | None = None
155
+
156
+
157
+ class AddGalaxyClusterResponse(BaseModel):
158
+ pass
159
+
160
+
161
+ class GalaxyClusterRelation(BaseModel):
162
+ id: int
163
+ galaxy_cluster_id: int
164
+ referenced_galaxy_cluster_id: int
165
+ referenced_galaxy_cluster_uuid: str
166
+ referenced_galaxy_cluster_type: str
167
+ galaxy_cluster_uuid: str
168
+ distribution: str
169
+ sharing_group_id: int | None = None
170
+ default: bool
171
+
172
+
173
+ _GalaxyClusterRelation = GalaxyClusterRelation
174
+
175
+
176
+ class SearchGalaxyClusterGalaxyClustersDetails(BaseModel):
177
+ # if minimal is set, only uuid, version and Galaxy is returned
178
+
179
+ id: int | None = None
180
+ uuid: str
181
+ collection_uuid: str | None = None
182
+ type: str | None = None
183
+ value: str | None = None
184
+ tag_name: str | None = None
185
+ description: str | None = None
186
+ galaxy_id: int | None = None
187
+ source: str | None = None
188
+ authors: list[str] | None = None
189
+ version: str | int
190
+ distribution: str | int | None = None
191
+ sharing_group_id: int | None = None
192
+ org_id: int | None = None
193
+ orgc_id: int | None = None
194
+ default: bool | None = None
195
+ locked: bool | None = None
196
+ extends_uuid: str | None = None
197
+ extends_version: str | None = None
198
+ published: bool | None = None
199
+ deleted: bool | None = None
200
+ GalaxyElement: Optional[list[ExportGalaxyGalaxyElement]] = None
201
+ Galaxy: RestSearchGalaxyBody
202
+ GalaxyClusterRelation: list[_GalaxyClusterRelation] | None = None
203
+ Org: GetOrganisationElement | None = None
204
+ Orgc: GetOrganisationElement | None = None
205
+
206
+
207
+ class SearchGalaxyClusterGalaxyClusters(BaseModel):
208
+ GalaxyCluster: SearchGalaxyClusterGalaxyClustersDetails
209
+
210
+
211
+ class GalaxyClusterSearchResponse(BaseModel):
212
+ response: list[SearchGalaxyClusterGalaxyClusters]
213
+
214
+
215
+ class GalaxyClusterSearchBody(BaseModel):
216
+ limit: int | None = None
217
+ page: int | None = None
218
+ id: list[int] | None = None
219
+ uuid: list[str] | None = None
220
+ galaxy_id: int | None = None
221
+ galaxy_uuid: str | None = None
222
+ published: bool | None = None
223
+ value: str | None = None
224
+ extends_uuid: str | None = None
225
+ extends_version: str | None = None
226
+ version: int | None = None
227
+ distribution: int | None = None
228
+ org_id: int | None = None
229
+ orgc_id: int | None = None
230
+ tag_name: str | None = None
231
+ custom: bool | None = None # not sure if bool
232
+ minimal: bool | None = None
@@ -7,6 +7,42 @@ from pydantic import BaseModel, Field, field_serializer
7
7
  from mmisp.lib.distribution import GalaxyDistributionLevels
8
8
 
9
9
 
10
+ class ShortCommonGalaxy(BaseModel):
11
+ id: int
12
+ uuid: UUID
13
+ name: str
14
+ type: str
15
+ description: str
16
+ version: str | int
17
+ namespace: str
18
+ kill_chain_order: str | None = None
19
+ default: bool
20
+
21
+
22
+ class ShortCommonGalaxyCluster(BaseModel):
23
+ id: int
24
+ uuid: UUID
25
+ collection_uuid: UUID | Literal[""]
26
+ type: str
27
+ value: str
28
+ tag_name: str
29
+ description: str
30
+ galaxy_id: int
31
+ source: str
32
+ authors: list[str]
33
+ version: str | int
34
+ distribution: GalaxyDistributionLevels | None = None
35
+ sharing_group_id: int | None = None
36
+ org_id: int
37
+ orgc_id: int
38
+ default: bool | None = None
39
+ locked: bool | None = None
40
+ extends_uuid: UUID | Literal[""] | None = None
41
+ extends_version: str | int | None = None
42
+ published: bool | None = None
43
+ deleted: bool | None = None
44
+
45
+
10
46
  class CommonGalaxy(BaseModel):
11
47
  id: int
12
48
  uuid: UUID
@@ -42,7 +78,7 @@ class GalaxyClusterMeta(BaseModel):
42
78
  class CommonGalaxyCluster(BaseModel):
43
79
  id: int
44
80
  uuid: UUID
45
- collection_uuid: UUID | Literal[""]
81
+ collection_uuid: Literal[""] | UUID
46
82
  type: str
47
83
  value: str
48
84
  tag_name: str
@@ -57,7 +93,7 @@ class CommonGalaxyCluster(BaseModel):
57
93
  orgc_id: int
58
94
  default: bool | None = None
59
95
  locked: bool | None = None
60
- extends_uuid: UUID | Literal[""] | None = None
96
+ extends_uuid: Literal[""] | UUID | None = None
61
97
  extends_version: str | int | None = None
62
98
  published: bool | None = None
63
99
  deleted: bool | None = None
@@ -2,21 +2,26 @@ from uuid import UUID
2
2
 
3
3
  from pydantic import BaseModel, ConfigDict, Field
4
4
 
5
+ from mmisp.lib.attributes import (
6
+ AttributeCategories,
7
+ literal_valid_attribute_types,
8
+ )
9
+
5
10
 
6
11
  class CommonObjectTemplateElement(BaseModel):
7
12
  ui_priority: int = Field(..., alias="ui-priority")
8
- categories: list
9
- sane_default: list
10
- values_list: list
11
13
  description: str
12
- disable_correlation: bool | None
13
- multiple: bool
14
+ categories: list[AttributeCategories] = []
15
+ sane_default: list[str] = []
16
+ values_list: list[str] = []
17
+ disable_correlation: bool | None = None
18
+ multiple: bool = False
14
19
 
15
20
 
16
21
  class ImportObjectTemplateElement(CommonObjectTemplateElement):
17
- misp_attribute: str = Field(..., alias="misp-attribute")
18
- recommended: bool
19
- to_ids: bool
22
+ misp_attribute: literal_valid_attribute_types = Field(..., alias="misp-attribute")
23
+ recommended: bool = False
24
+ to_ids: bool = True
20
25
 
21
26
 
22
27
  class ObjectTemplatesRequirements(BaseModel):
@@ -108,12 +108,12 @@ class ObjectSearchResponse(BaseModel):
108
108
 
109
109
 
110
110
  class ObjectCreateBody(BaseModel):
111
- name: str = Field(min_length=1)
111
+ name: str | None = None
112
112
  meta_category: str | None = None
113
113
  description: str | None = None
114
114
  distribution: AttributeDistributionLevels | None = None
115
- sharing_group_id: int
116
- comment: str = Field(min_length=1)
115
+ sharing_group_id: int = 0
116
+ comment: str = ""
117
117
  deleted: bool | None = None
118
118
  first_seen: int | None = None
119
119
  last_seen: int | None = None
@@ -1,7 +1,8 @@
1
1
  from datetime import datetime
2
- from typing import Self
2
+ from typing import Any, Literal, Self, Type
3
+ from uuid import UUID
3
4
 
4
- from pydantic import BaseModel, field_serializer
5
+ from pydantic import BaseModel, field_serializer, field_validator
5
6
 
6
7
 
7
8
  class BaseOrganisation(BaseModel):
@@ -10,7 +11,7 @@ class BaseOrganisation(BaseModel):
10
11
  nationality: str | None = None
11
12
  sector: str | None = None
12
13
  type: str | None = None
13
- uuid: str | None = None
14
+ uuid: UUID | None = None
14
15
 
15
16
 
16
17
  class Organisation(BaseOrganisation):
@@ -29,13 +30,13 @@ class Organisation(BaseOrganisation):
29
30
  return value.strftime("%Y-%m-%d %H:%M:%S")
30
31
 
31
32
 
32
- class GetOrganisationResponse(BaseModel):
33
+ class GetOrganisationElement(BaseModel):
33
34
  id: int
34
35
  name: str
35
36
  nationality: str | None = None
36
37
  sector: str | None = None
37
38
  type: str | None = None
38
- uuid: str | None = None
39
+ uuid: UUID | Literal["0"] | None = None
39
40
  # the fallback GENERIC_MISP_ORGANISATION doesn't have this property
40
41
  # str is needed because its returned as string
41
42
  date_created: datetime | None = None
@@ -44,7 +45,7 @@ class GetOrganisationResponse(BaseModel):
44
45
  created_by: int
45
46
  contacts: str | None = None
46
47
  local: bool
47
- restricted_to_domain: list | str | None = None
48
+ restricted_to_domain: list[str] | None = None
48
49
  landingpage: str | None = None
49
50
 
50
51
  @field_serializer("date_created", "date_modified")
@@ -53,8 +54,19 @@ class GetOrganisationResponse(BaseModel):
53
54
  return ""
54
55
  return value.strftime("%Y-%m-%d %H:%M:%S")
55
56
 
57
+ @field_validator("restricted_to_domain", mode="before")
58
+ @classmethod
59
+ def ensure_list(cls: Type[Self], v: Any) -> Any:
60
+ if not isinstance(v, list):
61
+ return [v]
62
+ return v
63
+
56
64
 
57
- class GetAllOrganisationsOrganisation(GetOrganisationResponse):
65
+ class GetOrganisationResponse(BaseModel):
66
+ Organisation: GetOrganisationElement
67
+
68
+
69
+ class GetAllOrganisationsOrganisation(GetOrganisationElement):
58
70
  user_count: int
59
71
  created_by_email: str
60
72
 
@@ -95,7 +107,8 @@ class OrganisationUsersResponse(BaseModel):
95
107
 
96
108
 
97
109
  class AddOrganisation(BaseModel):
98
- id: int
110
+ id: int | None = None
111
+ uuid: UUID | None = None
99
112
  name: str
100
113
  description: str | None = None
101
114
  type: str
@@ -105,7 +118,7 @@ class AddOrganisation(BaseModel):
105
118
  contacts: str | None = None
106
119
  local: bool
107
120
  """organisation gains access to the local instance, otherwise treated as external"""
108
- restricted_to_domain: list[str] | None = None
121
+ restricted_to_domain: list[str] | str | None = None
109
122
  landingpage: str | None = None
110
123
 
111
124