mmisp-lib 0.10.1__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.
- {mmisp_lib-0.10.1/src/mmisp_lib.egg-info → mmisp_lib-0.11.0}/PKG-INFO +1 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/pyproject.toml +1 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/attribute_common.py +12 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/attributes.py +20 -3
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/events.py +15 -10
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/galaxies.py +26 -5
- mmisp_lib-0.11.0/src/mmisp/api_schemas/galaxy_clusters.py +232 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/galaxy_common.py +38 -2
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/object_templates.py +13 -8
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/objects.py +3 -3
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/organisations.py +22 -9
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/server.py +6 -6
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/servers.py +36 -10
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/shadow_attribute.py +7 -7
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/sharing_groups.py +3 -3
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/sightings.py +1 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/taxonomies.py +22 -9
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/users.py +1 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/setup.py +1 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/all_models.py +0 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/database.py +3 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/attribute.py +3 -3
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/blocklist.py +4 -3
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/event.py +3 -2
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/galaxy.py +1 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/galaxy_cluster.py +2 -2
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/object.py +2 -2
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/sharing_group.py +4 -4
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/sighting.py +2 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/attributes.py +29 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/distribution.py +1 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/galaxy_clusters.py +3 -1
- mmisp_lib-0.11.0/src/mmisp/lib/tags.py +38 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/compatibility_helpers.py +4 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/fixtures.py +171 -57
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/attribute_generator.py +13 -8
- mmisp_lib-0.11.0/src/mmisp/tests/generators/event_generator.py +30 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/feed_generator.py +4 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/attribute_generator.py +12 -0
- mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/event_blocklist_generator.py +10 -0
- mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/galaxy_cluster_blocklist_generator.py +10 -0
- mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/org_blocklist_generator.py +9 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/shadow_attribute_generator.py +5 -3
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/sharing_group_generator.py +1 -0
- mmisp_lib-0.11.0/src/mmisp/tests/generators/model_generators/threat_level_generator.py +10 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/graph.py +2 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0/src/mmisp_lib.egg-info}/PKG-INFO +1 -1
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/SOURCES.txt +6 -0
- mmisp_lib-0.10.1/src/mmisp/api_schemas/galaxy_clusters.py +0 -135
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/LICENSE +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/README.md +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/setup.cfg +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/auth_keys.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/authentication.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/common.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/feeds.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/jobs.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/logs.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/noticelists.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/py.typed +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/responses/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/responses/check_graph_response.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/responses/standard_status_response.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/roles.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/statistics.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/tags.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/user_settings.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/warninglists.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/worker.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/api_schemas/workflows.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/main.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/organisation.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/py.typed +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/commandline_tool/user.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/additional_properties.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/config.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/lib.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/list_json_type.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/mixins.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/admin_setting.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/auth_key.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/correlation.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/feed.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/identity_provider.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/log.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/noticelist.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/organisation.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/post.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/role.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/server.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/shadow_attribute.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/tag.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/tasks.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/taxonomy.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/threat_level.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/user.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/user_setting.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/warninglist.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/workflow.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/models/workflow_blueprint.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/mypy.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/object_json_type.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/print_changes.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/py.typed +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/types.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/db/uuid_type.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/actions.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/attribute_search_filter.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/fallbacks.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/galaxies.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/logger.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/permissions.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/py.typed +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/serialisation_helper.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/settings.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/standard_roles.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/standard_threat_levels.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/lib/uuid.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/enrichment/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/enrichment/data.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/exceptions.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/factory.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/loader.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/models/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/models/attribute.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/protocols.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/py.typed +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/plugins/types.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/auth_key_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/correlation_exclusions_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/correlation_value_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/default_correlation_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/galaxy_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/identity_provider_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/noticelist_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/object_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/organisation_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/over_correlating_value_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/post_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/role_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/server_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/sighting_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/tag_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/taxonomy_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/user_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/user_setting_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/warninglist_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/model_generators/workflow_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/object_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/sighting_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/tag_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/generators/taxonomies_generator.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/tests/maps.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/util/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/util/async_download.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/util/crypto.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/util/github.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/util/partial.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/util/py.typed +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/util/uuid.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/__init__.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/execution.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/fastapi.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/input.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/legacy.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/misp_core_format.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/modules.py +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp/workflows/py.typed +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/dependency_links.txt +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/entry_points.txt +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/requires.txt +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/src/mmisp_lib.egg-info/top_level.txt +0 -0
- {mmisp_lib-0.10.1 → mmisp_lib-0.11.0}/tests/test_commandline_tool.py +0 -0
@@ -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
|
389
|
-
|
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:
|
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:
|
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
|
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:
|
95
|
+
Galaxy: RestSearchGalaxyBody
|
75
96
|
model_config = ConfigDict(from_attributes=True)
|
76
97
|
|
77
98
|
|
78
99
|
class GetGalaxyResponse(BaseModel):
|
79
|
-
Galaxy:
|
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:
|
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:
|
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
|
-
|
13
|
-
|
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:
|
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 =
|
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 =
|
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:
|
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
|
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:
|
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
|
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
|
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
|
|