ethyca-fides 2.69.1rc0__py2.py3-none-any.whl → 2.76.0rc2__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/METADATA +9 -6
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/RECORD +488 -361
- fides/_version.py +3 -3
- fides/api/alembic/alembic.ini +5 -1
- fides/api/alembic/migrations/env.py +7 -1
- fides/api/alembic/migrations/versions/0eef0016cf06_adding_oauth2_config_for_.py +69 -0
- fides/api/alembic/migrations/versions/303287c70600_migrate_resource_type_from_enum_to_.py +99 -0
- fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
- fides/api/alembic/migrations/versions/3efe14d4469a_adds_new_experience_configs_for_vendor_.py +79 -0
- fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
- fides/api/alembic/migrations/versions/4d8c0fcc5771_adding_default_system_groups.py +78 -0
- fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
- fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
- fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
- fides/api/alembic/migrations/versions/795f46f656c0_migrate_field_type_from_enum_to_string.py +61 -0
- fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
- fides/api/alembic/migrations/versions/918aefc950c9_create_digest_conditional_dependencies.py +125 -0
- fides/api/alembic/migrations/versions/9caf76161e55_make_user_assigned_data_uses_nullable_.py +64 -0
- fides/api/alembic/migrations/versions/9e0dcbf67b9f_add_digest_config.py +84 -0
- fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
- fides/api/alembic/migrations/versions/a8e0c016afd_add_classification_benchmark_table.py +126 -0
- fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
- fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
- fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
- fides/api/alembic/migrations/versions/cd8649be3a2b_add_classifications_and_user_assigned_.py +74 -0
- fides/api/alembic/migrations/versions/e2cda8d6abc3_add_dismissed_in_activity_view_to_.py +29 -0
- fides/api/alembic/migrations/versions/f108fa05c579_adds_optional_duration_field_to_assets.py +28 -0
- fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
- fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
- fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
- fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
- fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
- fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
- fides/api/alembic/migrations/versions/xx_2025_11_07_1709_56fe6fad2d89_add_notice_display_order.py +47 -0
- fides/api/alembic/migrations/versions/xx_2025_11_10_1200_a1b2c3d4e5f6_add_test_datastore_to_connectiontype.py +53 -0
- fides/api/alembic/migrations/versions/xx_2025_11_11_1317_7d82c8fc4c34_store_saas_template_datasets.py +68 -0
- fides/api/alembic/migrations/versions/xx_2025_11_12_1430_b2c3d4e5f6a7_add_default_identity_definitions.py +81 -0
- fides/api/alembic/migrations/versions/xx_2025_11_25_1854_3ff6449c099e_add_index_on_providedidentity_privacy_.py +50 -0
- fides/api/api/v1/api.py +2 -0
- fides/api/api/v1/endpoints/admin.py +39 -0
- fides/api/api/v1/endpoints/connection_endpoints.py +191 -47
- fides/api/api/v1/endpoints/connector_template_endpoints.py +167 -0
- fides/api/api/v1/endpoints/generic_overrides.py +90 -15
- fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
- fides/api/api/v1/endpoints/pre_approval_webhook_endpoints.py +5 -5
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +231 -46
- fides/api/api/v1/endpoints/saas_config_endpoints.py +63 -92
- fides/api/api/v1/endpoints/storage_endpoints.py +5 -1
- fides/api/api/v1/endpoints/system.py +157 -100
- fides/api/api/v1/endpoints/user_endpoints.py +17 -4
- fides/api/app_setup.py +1 -3
- fides/api/common_exceptions.py +8 -0
- fides/api/db/base.py +8 -0
- fides/api/db/crud.py +30 -2
- fides/api/db/database.py +261 -4
- fides/api/db/safe_crud.py +377 -0
- fides/api/db/seed.py +35 -1
- fides/api/email_templates/get_email_template.py +3 -0
- fides/api/email_templates/template_names.py +1 -0
- fides/api/email_templates/templates/external_user_welcome.html +9 -5
- fides/api/email_templates/templates/manual_task_digest.html +316 -0
- fides/api/main.py +2 -0
- fides/api/migrations/post_upgrade_index_creation.py +20 -0
- fides/api/models/asset.py +17 -1
- fides/api/models/attachment.py +1 -0
- fides/api/models/conditional_dependency/__init__.py +0 -0
- fides/api/models/conditional_dependency/conditional_dependency_base.py +311 -0
- fides/api/models/connection_oauth_credentials.py +57 -0
- fides/api/models/connectionconfig.py +11 -1
- fides/api/models/detection_discovery/__init__.py +4 -0
- fides/api/models/detection_discovery/classification_benchmark.py +140 -0
- fides/api/models/detection_discovery/core.py +78 -3
- fides/api/models/detection_discovery/monitor_task.py +3 -1
- fides/api/models/detection_discovery/staged_resource_error.py +25 -0
- fides/api/models/detection_discovery/web_monitor.py +61 -0
- fides/api/models/digest/__init__.py +16 -0
- fides/api/models/digest/conditional_dependencies.py +275 -0
- fides/api/models/digest/digest_config.py +110 -0
- fides/api/models/digest/digest_execution.py +142 -0
- fides/api/models/event_audit.py +85 -0
- fides/api/models/experience_notices.py +6 -1
- fides/api/models/fides_user.py +9 -0
- fides/api/models/identity_definition.py +66 -0
- fides/api/models/location_regulation_selections.py +22 -0
- fides/api/models/manual_task/conditional_dependency.py +29 -87
- fides/api/models/manual_webhook.py +17 -6
- fides/api/models/messaging.py +30 -10
- fides/api/models/messaging_template.py +14 -0
- fides/api/models/policy.py +27 -0
- fides/api/models/privacy_experience.py +41 -0
- fides/api/models/privacy_notice.py +196 -13
- fides/api/models/privacy_preference.py +2 -0
- fides/api/models/privacy_request/duplicate_group.py +84 -0
- fides/api/models/privacy_request/privacy_request.py +154 -8
- fides/api/models/privacy_request/provided_identity.py +22 -1
- fides/api/models/privacy_request/request_task.py +98 -1
- fides/api/models/privacy_request/webhook.py +3 -1
- fides/api/models/saas_template_dataset.py +63 -0
- fides/api/models/sql_models.py +161 -7
- fides/api/models/system_group.py +85 -0
- fides/api/models/taxonomy.py +91 -9
- fides/api/models/v3/__init__.py +0 -0
- fides/api/models/v3/privacy_preferences.py +85 -0
- fides/api/models/worker_task.py +8 -0
- fides/api/oauth/roles.py +4 -0
- fides/api/schemas/application_config.py +32 -1
- fides/api/schemas/connection_configuration/connection_config.py +1 -30
- fides/api/schemas/connection_configuration/connection_oauth_config.py +42 -0
- fides/api/schemas/connection_configuration/connection_secrets_mongodb.py +15 -3
- fides/api/schemas/connection_configuration/connection_secrets_mssql.py +5 -0
- fides/api/schemas/messaging/messaging.py +49 -66
- fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
- fides/api/schemas/messaging/shared_schemas.py +102 -0
- fides/api/schemas/oauth.py +2 -1
- fides/api/schemas/privacy_center_config.py +29 -5
- fides/api/schemas/privacy_request.py +44 -7
- fides/api/schemas/saas/async_polling_configuration.py +81 -0
- fides/api/schemas/saas/connector_template.py +14 -0
- fides/api/schemas/saas/saas_config.py +12 -20
- fides/api/schemas/system.py +8 -0
- fides/api/schemas/taxonomy_extensions.py +8 -0
- fides/api/schemas/user.py +2 -2
- fides/api/service/async_dsr/handlers/__init__.py +0 -0
- fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
- fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
- fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
- fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
- fides/api/service/async_dsr/strategies/__init__.py +0 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +691 -0
- fides/api/service/async_dsr/utils.py +130 -0
- fides/api/service/connectors/base_erasure_email_connector.py +7 -0
- fides/api/service/connectors/bigquery_connector.py +34 -16
- fides/api/service/connectors/fides/fides_client.py +63 -1
- fides/api/service/connectors/http_connector.py +48 -12
- fides/api/service/connectors/microsoft_sql_server_connector.py +6 -1
- fides/api/service/connectors/mongodb_connector.py +74 -9
- fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
- fides/api/service/connectors/saas/connector_registry_service.py +42 -135
- fides/api/service/connectors/saas_connector.py +116 -76
- fides/api/service/connectors/sql_connector.py +14 -4
- fides/api/service/deps.py +25 -2
- fides/api/service/messaging/message_dispatch_service.py +98 -20
- fides/api/service/messaging/messaging_crud_service.py +5 -9
- fides/api/service/privacy_request/attachment_handling.py +9 -2
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +17 -9
- fides/api/service/privacy_request/dsr_package/templates/attachments_index.html +41 -30
- fides/api/service/privacy_request/dsr_package/templates/clickme.html +68 -0
- fides/api/service/privacy_request/dsr_package/templates/dataset_index.html +30 -27
- fides/api/service/privacy_request/duplication_detection.py +439 -0
- fides/api/service/privacy_request/email_batch_service.py +2 -1
- fides/api/service/privacy_request/request_runner_service.py +92 -91
- fides/api/service/privacy_request/request_service.py +74 -90
- fides/api/service/saas_request/saas_request_override_factory.py +71 -1
- fides/api/service/storage/streaming/schemas.py +27 -19
- fides/api/service/storage/streaming/smart_open_client.py +2 -2
- fides/api/service/storage/streaming/smart_open_streaming_storage.py +238 -147
- fides/api/service/storage/util.py +20 -106
- fides/api/service/strategy.py +6 -3
- fides/api/task/conditional_dependencies/privacy_request/__init__.py +0 -0
- fides/api/task/conditional_dependencies/privacy_request/convenience_fields.py +155 -0
- fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py +140 -0
- fides/api/task/conditional_dependencies/privacy_request/schemas.py +212 -0
- fides/api/task/conditional_dependencies/sql_schemas.py +301 -0
- fides/api/task/conditional_dependencies/sql_translator.py +757 -0
- fides/api/task/conditional_dependencies/util.py +111 -0
- fides/api/task/execute_request_tasks.py +34 -13
- fides/api/task/filter_results.py +35 -2
- fides/api/task/graph_runners.py +2 -32
- fides/api/task/graph_task.py +42 -12
- fides/api/task/manual/manual_task_conditional_evaluation.py +33 -28
- fides/api/task/manual/manual_task_graph_task.py +4 -1
- fides/api/task/manual/manual_task_utils.py +68 -26
- fides/api/task/scheduler_utils.py +39 -0
- fides/api/tasks/__init__.py +15 -1
- fides/api/util/cache.py +5 -1
- fides/api/util/connection_util.py +101 -218
- fides/api/util/event_audit_util.py +230 -0
- fides/api/util/filter_utils.py +0 -3
- fides/api/util/fuzzy_search_utils.py +7 -1
- fides/api/util/lock.py +13 -3
- fides/api/util/logger.py +58 -4
- fides/api/util/logger_context_utils.py +3 -1
- fides/api/util/masking_util.py +31 -0
- fides/api/util/memory_watchdog.py +118 -0
- fides/api/util/rate_limit.py +25 -7
- fides/api/util/saas_config_updater.py +76 -0
- fides/api/util/saas_util.py +28 -1
- fides/api/worker/__init__.py +6 -0
- fides/common/api/scope_registry.py +6 -7
- fides/common/api/v1/urn_registry.py +15 -3
- fides/config/__init__.py +11 -2
- fides/config/celery_settings.py +42 -0
- fides/config/config_proxy.py +10 -0
- fides/config/duplicate_detection_settings.py +31 -0
- fides/config/execution_settings.py +6 -6
- fides/config/security_settings.py +4 -1
- fides/config/utils.py +5 -0
- fides/data/language/languages.yml +2 -0
- fides/service/connection/__init__.py +0 -0
- fides/service/connection/connection_service.py +651 -0
- fides/service/dataset/dataset_service.py +39 -0
- fides/service/event_audit_service.py +109 -0
- fides/service/messaging/aws_ses_service.py +2 -4
- fides/service/messaging/messaging_service.py +75 -74
- fides/service/privacy_request/privacy_request_service.py +345 -100
- fides/service/system/__init__.py +0 -0
- fides/service/system/system_service.py +153 -0
- fides/service/taxonomy/handlers/legacy_handler.py +3 -3
- fides/service/taxonomy/taxonomy_service.py +64 -18
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-688fa865621531cc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1115-7fd171dac1eb0e51.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1276.deb10ae2643f8463.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1438-8a33b3834d6e43f3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1821-c1daa160f492aacf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1840-359ee056e4cf6629.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.bef017bc80e2012c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2040-70972e15960d9afe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2121.321b0fd3932164d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2397-3434603a97f3f5d6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2921-49ed0ed897832958.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3150-da5406b80d25fe6d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3377-02bf9780fd383d94.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3655-5e1ba5dd68b5ec48.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3729-31ff8ba51491bf21.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3872-cff30ca0844fe2b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3931-8bedde156fe83564.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/401-582d9970d89deefe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4093-7e47408c28de5375.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4322-f6aeff6880726c83.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4339-04a715ab07122744.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4496-ccbce2459174e0d6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4589-c1d83c6a8dab4d30.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4809-a8f4a108a42f53ed.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4903-19c0bc07a956dfa8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4910-d990773601f794c1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-96423702fba70ced.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-4e308cca01d59367.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-5c3501754bf027ba.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/549-1bdc3e6f3264c020.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5505-43b9c39491b88e08.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5698.2135391a128cc373.js +164 -0
- fides/ui-build/static/admin/_next/static/chunks/5783-016dfcee8e49bf61.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5826-4db99ea4e5077911.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/590-be447cacf12419dd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6084-91badbc6569a0efb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6344-026cb323c1d49926.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6362-ba0e12f2fc4cad94.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6853-882889659769d7b4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6882-bb1b469d7d7f5335.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-0dcf22a9aabe39c5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7170-46db82bb5b55e856.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7218-2ace8c82e3e7eb74.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7245-1cdafb35f289861b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7630-7f75ab7b8df42eb3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7654-2e9a8be02e41769a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8212-348ddd2b6933db70.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5596-bb601cbf40e47a0f.js → 9195-da717d324917b049.js} +3 -3
- fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.9fd9552ef744c717.js → 9676.1f395eeb9cc34968.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9826-1078e46f3ac0b688.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-800be6996aaa999c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-de4b578c904df772.js} +57 -220
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-f12020b82dd4bd1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-a911b7990371704d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-ad585b79953c2753.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-bb263d394ca1c8fa.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-6907c368d8611c44.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-c32f381af358149b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-e74cb5ea87f15b40.js → new-6efb3c069d8b47dd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-1975c529905eea9b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-b05331178928ab52.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-516834e930bb0d0d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-985717f2565f9d9d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-2be773e08498e40c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-850afb74f4192e87.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-b63d1e395d879b86.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-5b28f0f674ea87bd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-676177e2f3c9c2a2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-794906929efb8e1d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-3ccbf7c0d06507b9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-1ea0b24d306b1e67.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-d4861a4a218bb65a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/infrastructure/[monitorId]-66bd265044daf97d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/infrastructure-c9c79fa8576a4f77.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-60cacc3232c2eead.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-437bd64a3016de36.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-8349248c2da970a6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-6919a1d6cadaa46b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-1a50d421897d3da1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-49509414a15e8393.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-1a1bb80b586d0c0f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-49de61df1e8e7fba.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c2719f5cff20c0f8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-dfd71c1e9c458b89.js → [...subfieldNames]-415015aebab60436.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-7cdc42ec5493b83d.js → [collectionName]-5accb09715b5122d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-aebecca1d8ec5f98.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-9551a82ddec9f909.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-72f8fe47beef0f09.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-3a8aa3f633528e88.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-87512616f35ec6da.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-2f1bf4eac7aa55fd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-8d67cd2872cb682a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-7a631df29cd0e31a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-ea3bc43cdaf273de.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-5d8632bba1b81cd4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-92e01822ecde8fb8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-1256cf6d3f6794e0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-0daac00911d27617.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-2d976fe5e8ba0a3a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-7766ba497b863740.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-f2880d2ed4734270.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-669f585c3458faff.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-c79e7724e4bc3899.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-891654e8dc13965c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications-40c8148244c5d347.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-1e86f3e28bd23ed6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-9b7bd8c38f02c091.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-b18a53a940cf9e19.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6d028d7450e77578.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-8399083ee2cd8cc2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-0a910125cdb2b3b8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-acc90b6f7fe915cb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-bbc42026f2685438.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-c08ca6ad21c99799.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-77c2db582f8823bc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-74ccea4868408e3d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-7d9f09bfe9d44dfc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-cd77bc30672bb1fa.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-cc3bd9540132d5ed.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-7ce7d720107ab4b5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-ae789892343c24f5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-13ee1b331ced0846.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-ee4e43692336a330.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-ca51d794abfcbf25.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-ecd1dc5db8e81409.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-df06f7e2f668c540.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-da0c77bd510c6c51.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-950b0c115bf673d8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-7e36cb4756973a9d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-a0e5ed486d24ccf3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-3cdebafb6870d3ad.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-159aad34f1021320.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-dbd1a64090ad0946.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-7d042497a57a3788.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-21f1172e73dfc9f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-e553161e6338ee48.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-efc4af017723e57a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-b152319d67372ee4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-dba8692491f7935e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/webpack-09ca52bc7beb0b43.js +1 -0
- fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
- fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
- fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
- fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/3d66bb57ddcb0978.css +1 -0
- fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1e4be9466578ef1.css +1 -0
- fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
- fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
- fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
- fides/ui-build/static/admin/_next/static/l2vgGUHB04Fi4oEVlVMrc/_buildManifest.js +1 -0
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/infrastructure/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/infrastructure.html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
- fides/ui-build/static/admin/lib/fides.js +3 -3
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/new-privacy-requests.html +1 -0
- fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
- fides/ui-build/static/admin/notifications/digests/new.html +1 -0
- fides/ui-build/static/admin/notifications/digests.html +1 -0
- fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
- fides/ui-build/static/admin/notifications/providers/new.html +1 -0
- fides/ui-build/static/admin/notifications/providers.html +1 -0
- fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
- fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
- fides/ui-build/static/admin/notifications/templates.html +1 -0
- fides/ui-build/static/admin/notifications.html +1 -0
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -0
- fides/ui-build/static/admin/settings/about/alpha.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -0
- fides/ui-build/static/admin/settings/custom-fields/new.html +1 -0
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/api/service/async_dsr/async_dsr_service.py +0 -75
- fides/api/service/privacy_request/dsr_package/templates/welcome.html +0 -66
- fides/ui-build/static/admin/_next/static/OmXHlY9MvjoZH9jDkAytl/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2921-52328140bc420d0f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3550-d04125c828d591a1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3847-230bf61b053bc706.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-ef5194cdb228beb6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3923-bb2417b8dcade7a4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-4af0a912e249d30f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5258-b0de22a8521686ab.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-b17673391117c976.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9826-dbae8dee941a7fac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9951-a88367a129b724ba.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ace203dfacacbdc4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-920fb469e0dda1d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-9dda4de5ec580279.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-0d4844d0b808e6e4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-28b192e2c074b0f3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-2c29ff7a01198f30.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-8eb581024bc0172f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-e1ba213fb666b3f4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-6d133580045abdda.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-927b7e476c4b47d0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-cbe100d50df34285.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4c3c413a2668df53.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-95402b5001c07ef2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-3c6dc2f6e6bae960.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-4a6d4023a7791be8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-76b204c9b98d656f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-bc0e2adf6e0d3ac7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-86ffcc1ad3fa912e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-ec04f595465bdf69.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-41d309754ff0c1de.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-cab1f78cec7808f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-eb6058221403b156.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-48500551fd6a7602.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-6903f42a0412bfa6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-9495e2eb506606c7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-6e15332935f6b538.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-9cec020f89544426.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-678e89d68dbcd94f.js +0 -1
- fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
- fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
- fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
- fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
- fides/ui-build/static/admin/messaging/[id].html +0 -1
- fides/ui-build/static/admin/messaging/add-template.html +0 -1
- fides/ui-build/static/admin/messaging.html +0 -1
- fides/ui-build/static/admin/poc/table-migration.html +0 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-81d1b50585468fb0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/{OmXHlY9MvjoZH9jDkAytl → l2vgGUHB04Fi4oEVlVMrc}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional, Set, Tuple
|
|
2
|
+
|
|
3
|
+
from fideslang.models import System
|
|
4
|
+
from fideslang.validation import FidesKey
|
|
5
|
+
from loguru import logger
|
|
6
|
+
from sqlalchemy.orm import Session
|
|
7
|
+
|
|
8
|
+
from fides.api.common_exceptions import (
|
|
9
|
+
ClientUnsuccessfulException,
|
|
10
|
+
ConnectionException,
|
|
11
|
+
ConnectionNotFoundException,
|
|
12
|
+
KeyOrNameAlreadyExists,
|
|
13
|
+
SaaSConfigNotFoundException,
|
|
14
|
+
)
|
|
15
|
+
from fides.api.models.connectionconfig import (
|
|
16
|
+
ConnectionConfig,
|
|
17
|
+
ConnectionTestStatus,
|
|
18
|
+
ConnectionType,
|
|
19
|
+
)
|
|
20
|
+
from fides.api.models.datasetconfig import DatasetConfig
|
|
21
|
+
from fides.api.models.event_audit import EventAuditStatus, EventAuditType
|
|
22
|
+
from fides.api.models.manual_task import (
|
|
23
|
+
ManualTask,
|
|
24
|
+
ManualTaskParentEntityType,
|
|
25
|
+
ManualTaskType,
|
|
26
|
+
)
|
|
27
|
+
from fides.api.schemas.connection_configuration import (
|
|
28
|
+
connection_secrets_schemas,
|
|
29
|
+
get_connection_secrets_schema,
|
|
30
|
+
)
|
|
31
|
+
from fides.api.schemas.connection_configuration.connection_config import (
|
|
32
|
+
ConnectionConfigurationResponse,
|
|
33
|
+
CreateConnectionConfigurationWithSecrets,
|
|
34
|
+
)
|
|
35
|
+
from fides.api.schemas.connection_configuration.connection_secrets import (
|
|
36
|
+
ConnectionConfigSecretsSchema,
|
|
37
|
+
TestStatusMessage,
|
|
38
|
+
)
|
|
39
|
+
from fides.api.schemas.connection_configuration.connection_secrets_dynamic_erasure_email import (
|
|
40
|
+
validate_dynamic_erasure_email_dataset_references,
|
|
41
|
+
)
|
|
42
|
+
from fides.api.schemas.connection_configuration.connection_secrets_saas import (
|
|
43
|
+
validate_saas_secrets_external_references,
|
|
44
|
+
)
|
|
45
|
+
from fides.api.schemas.connection_configuration.saas_config_template_values import (
|
|
46
|
+
SaasConnectionTemplateValues,
|
|
47
|
+
)
|
|
48
|
+
from fides.api.schemas.saas.connector_template import ConnectorTemplate
|
|
49
|
+
from fides.api.schemas.saas.saas_config import SaaSConfig
|
|
50
|
+
from fides.api.service.connectors import get_connector
|
|
51
|
+
from fides.api.service.connectors.saas.connector_registry_service import (
|
|
52
|
+
ConnectorRegistry,
|
|
53
|
+
)
|
|
54
|
+
from fides.api.util.event_audit_util import (
|
|
55
|
+
generate_connection_audit_event_details,
|
|
56
|
+
generate_connection_secrets_event_details,
|
|
57
|
+
normalize_value,
|
|
58
|
+
)
|
|
59
|
+
from fides.api.util.logger import Pii
|
|
60
|
+
from fides.api.util.saas_util import (
|
|
61
|
+
replace_config_placeholders,
|
|
62
|
+
replace_dataset_placeholders,
|
|
63
|
+
)
|
|
64
|
+
from fides.common.api.v1.urn_registry import CONNECTION_TYPES
|
|
65
|
+
from fides.service.event_audit_service import EventAuditService
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class ConnectorTemplateNotFound(Exception):
|
|
69
|
+
"""Raised when a connector template is not found"""
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _detect_connection_config_changes(
|
|
73
|
+
original_config_dict: Dict[str, Any], new_config_dict: Dict[str, Any]
|
|
74
|
+
) -> Set[str]:
|
|
75
|
+
"""
|
|
76
|
+
Detect which fields have changed between two connection configuration dictionaries.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
original_config_dict: The original configuration dictionary
|
|
80
|
+
new_config_dict: The new configuration dictionary
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Set of field names that have changed
|
|
84
|
+
"""
|
|
85
|
+
# Define fields to exclude from comparison
|
|
86
|
+
excluded_fields = {
|
|
87
|
+
"id",
|
|
88
|
+
"created_at",
|
|
89
|
+
"updated_at",
|
|
90
|
+
"secrets",
|
|
91
|
+
"last_test_timestamp",
|
|
92
|
+
"last_test_succeeded",
|
|
93
|
+
"last_run_timestamp",
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
changed_fields = set()
|
|
97
|
+
# Check all fields that exist in either the original or new config
|
|
98
|
+
all_field_names = set(original_config_dict.keys()) | set(new_config_dict.keys())
|
|
99
|
+
|
|
100
|
+
for field_name in all_field_names:
|
|
101
|
+
if field_name not in excluded_fields:
|
|
102
|
+
old_value = original_config_dict.get(field_name)
|
|
103
|
+
new_value = new_config_dict.get(field_name)
|
|
104
|
+
|
|
105
|
+
# Normalize values for comparison (handle enum objects vs strings, None vs empty strings)
|
|
106
|
+
normalized_old = normalize_value(old_value)
|
|
107
|
+
normalized_new = normalize_value(new_value)
|
|
108
|
+
|
|
109
|
+
if normalized_old != normalized_new:
|
|
110
|
+
changed_fields.add(field_name)
|
|
111
|
+
|
|
112
|
+
return changed_fields
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class ConnectionService:
|
|
116
|
+
def __init__(self, db: Session, event_audit_service: EventAuditService):
|
|
117
|
+
self.db = db
|
|
118
|
+
self.event_audit_service = event_audit_service
|
|
119
|
+
|
|
120
|
+
def get_connection_config(self, connection_key: FidesKey) -> ConnectionConfig:
|
|
121
|
+
connection_config = ConnectionConfig.get_by(
|
|
122
|
+
self.db, field="key", value=connection_key
|
|
123
|
+
)
|
|
124
|
+
if not connection_config:
|
|
125
|
+
raise ConnectionNotFoundException(
|
|
126
|
+
f"No connection config found with key {connection_key}"
|
|
127
|
+
)
|
|
128
|
+
return connection_config
|
|
129
|
+
|
|
130
|
+
def create_connection_audit_event(
|
|
131
|
+
self,
|
|
132
|
+
event_type: EventAuditType,
|
|
133
|
+
connection_config: ConnectionConfig,
|
|
134
|
+
description: Optional[str] = None,
|
|
135
|
+
changed_fields: Optional[set] = None,
|
|
136
|
+
) -> None:
|
|
137
|
+
"""Create an audit event for connection operations."""
|
|
138
|
+
try:
|
|
139
|
+
event_details, generated_description = (
|
|
140
|
+
generate_connection_audit_event_details(
|
|
141
|
+
event_type,
|
|
142
|
+
connection_config=connection_config,
|
|
143
|
+
description=description,
|
|
144
|
+
changed_fields=changed_fields,
|
|
145
|
+
)
|
|
146
|
+
)
|
|
147
|
+
self.event_audit_service.create_event_audit(
|
|
148
|
+
event_type=event_type,
|
|
149
|
+
status=EventAuditStatus.succeeded,
|
|
150
|
+
resource_type="connection_config",
|
|
151
|
+
resource_identifier=connection_config.key,
|
|
152
|
+
description=description or generated_description,
|
|
153
|
+
event_details=event_details,
|
|
154
|
+
)
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.error(
|
|
157
|
+
f"Error creating connection audit event for connection '{connection_config.key}': "
|
|
158
|
+
f"{type(e).__name__}"
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
def create_secrets_audit_event(
|
|
162
|
+
self,
|
|
163
|
+
event_type: EventAuditType,
|
|
164
|
+
connection_config: ConnectionConfig,
|
|
165
|
+
secrets_modified: connection_secrets_schemas,
|
|
166
|
+
) -> None:
|
|
167
|
+
"""Create an audit event for connection secrets operations."""
|
|
168
|
+
try:
|
|
169
|
+
event_details, description = generate_connection_secrets_event_details(
|
|
170
|
+
event_type,
|
|
171
|
+
connection_config=connection_config,
|
|
172
|
+
secrets_modified=secrets_modified, # type: ignore[arg-type]
|
|
173
|
+
)
|
|
174
|
+
self.event_audit_service.create_event_audit(
|
|
175
|
+
event_type=event_type,
|
|
176
|
+
status=EventAuditStatus.succeeded,
|
|
177
|
+
resource_type="connection_config",
|
|
178
|
+
resource_identifier=connection_config.key,
|
|
179
|
+
description=description,
|
|
180
|
+
event_details=event_details,
|
|
181
|
+
)
|
|
182
|
+
except Exception as e:
|
|
183
|
+
logger.error(
|
|
184
|
+
f"Error creating connection secrets audit event for connection '{connection_config.key}': "
|
|
185
|
+
f"{type(e).__name__}"
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
def validate_secrets(
|
|
189
|
+
self,
|
|
190
|
+
request_body: connection_secrets_schemas,
|
|
191
|
+
connection_config: ConnectionConfig,
|
|
192
|
+
) -> ConnectionConfigSecretsSchema:
|
|
193
|
+
"""Validate incoming connection configuration secrets."""
|
|
194
|
+
|
|
195
|
+
connection_type = connection_config.connection_type
|
|
196
|
+
saas_config = connection_config.get_saas_config()
|
|
197
|
+
if connection_type == ConnectionType.saas and saas_config is None:
|
|
198
|
+
raise SaaSConfigNotFoundException(
|
|
199
|
+
"A SaaS config to validate the secrets is unavailable for this connection config"
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
schema = get_connection_secrets_schema(connection_type.value, saas_config) # type: ignore
|
|
203
|
+
logger.info(
|
|
204
|
+
"Validating secrets on connection config with key '{}'",
|
|
205
|
+
connection_config.key,
|
|
206
|
+
)
|
|
207
|
+
connection_secrets = schema.model_validate(request_body)
|
|
208
|
+
|
|
209
|
+
# SaaS secrets with external references must go through extra validation
|
|
210
|
+
if connection_type == ConnectionType.saas:
|
|
211
|
+
validate_saas_secrets_external_references(self.db, schema, connection_secrets) # type: ignore
|
|
212
|
+
|
|
213
|
+
# For dynamic erasure emails we must validate the recipient email address
|
|
214
|
+
if connection_type == ConnectionType.dynamic_erasure_email:
|
|
215
|
+
validate_dynamic_erasure_email_dataset_references(
|
|
216
|
+
self.db, connection_secrets
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
return connection_secrets
|
|
220
|
+
|
|
221
|
+
def connection_status(
|
|
222
|
+
self, connection_config: ConnectionConfig, msg: str
|
|
223
|
+
) -> TestStatusMessage:
|
|
224
|
+
"""Connect, verify with a trivial query or API request, and report the status."""
|
|
225
|
+
|
|
226
|
+
connector = get_connector(connection_config)
|
|
227
|
+
|
|
228
|
+
try:
|
|
229
|
+
status: Optional[ConnectionTestStatus] = connector.test_connection()
|
|
230
|
+
|
|
231
|
+
except (ConnectionException, ClientUnsuccessfulException) as exc:
|
|
232
|
+
logger.warning(
|
|
233
|
+
"Connection test failed on {}: {}",
|
|
234
|
+
connection_config.key,
|
|
235
|
+
Pii(str(exc)),
|
|
236
|
+
)
|
|
237
|
+
connection_config.update_test_status(
|
|
238
|
+
test_status=ConnectionTestStatus.failed, db=self.db
|
|
239
|
+
)
|
|
240
|
+
return TestStatusMessage(
|
|
241
|
+
msg=msg,
|
|
242
|
+
test_status=ConnectionTestStatus.failed,
|
|
243
|
+
failure_reason=str(exc),
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
logger.info("Connection test {} on {}", status.value, connection_config.key) # type: ignore
|
|
247
|
+
connection_config.update_test_status(test_status=status, db=self.db) # type: ignore
|
|
248
|
+
|
|
249
|
+
return TestStatusMessage(
|
|
250
|
+
msg=msg,
|
|
251
|
+
test_status=status,
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
def update_secrets(
|
|
255
|
+
self,
|
|
256
|
+
connection_key: FidesKey,
|
|
257
|
+
unvalidated_secrets: connection_secrets_schemas,
|
|
258
|
+
verify: Optional[bool],
|
|
259
|
+
merge_with_existing: Optional[bool] = False,
|
|
260
|
+
) -> TestStatusMessage:
|
|
261
|
+
|
|
262
|
+
connection_config = self.get_connection_config(connection_key)
|
|
263
|
+
|
|
264
|
+
# Handle merging with existing secrets
|
|
265
|
+
if merge_with_existing and connection_config.secrets:
|
|
266
|
+
# Merge existing secrets with new ones
|
|
267
|
+
merged_secrets = {**connection_config.secrets, **unvalidated_secrets} # type: ignore[dict-item]
|
|
268
|
+
else:
|
|
269
|
+
# For PUT operations or when no existing secrets, use new secrets directly
|
|
270
|
+
merged_secrets = unvalidated_secrets # type: ignore[assignment]
|
|
271
|
+
|
|
272
|
+
connection_config.secrets = self.validate_secrets(
|
|
273
|
+
merged_secrets, connection_config # type: ignore[arg-type]
|
|
274
|
+
).model_dump(mode="json")
|
|
275
|
+
|
|
276
|
+
# Save validated secrets, regardless of whether they've been verified.
|
|
277
|
+
logger.info("Updating connection config secrets for '{}'", connection_key)
|
|
278
|
+
|
|
279
|
+
if (
|
|
280
|
+
connection_config.authorized
|
|
281
|
+
and connection_config.connection_type == ConnectionType.saas # type: ignore[attr-defined]
|
|
282
|
+
):
|
|
283
|
+
# when secrets are updated for an oauth connection the access token is removed since it needs reauthorization
|
|
284
|
+
del connection_config.secrets["access_token"]
|
|
285
|
+
|
|
286
|
+
connection_config.save(db=self.db)
|
|
287
|
+
|
|
288
|
+
# Create audit event for secrets update
|
|
289
|
+
self.create_secrets_audit_event(
|
|
290
|
+
EventAuditType.connection_secrets_updated,
|
|
291
|
+
connection_config,
|
|
292
|
+
unvalidated_secrets, # type: ignore[arg-type]
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
msg = f"Secrets updated for ConnectionConfig with key: {connection_key}."
|
|
296
|
+
|
|
297
|
+
if verify:
|
|
298
|
+
return self.connection_status(connection_config, msg)
|
|
299
|
+
|
|
300
|
+
return TestStatusMessage(msg=msg, test_status=None)
|
|
301
|
+
|
|
302
|
+
def delete_connection_config(self, connection_key: FidesKey) -> None:
|
|
303
|
+
"""Delete a connection configuration and create audit event."""
|
|
304
|
+
connection_config = self.get_connection_config(connection_key)
|
|
305
|
+
|
|
306
|
+
self.create_connection_audit_event(
|
|
307
|
+
EventAuditType.connection_deleted,
|
|
308
|
+
connection_config,
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
connection_config.delete(self.db)
|
|
312
|
+
|
|
313
|
+
def instantiate_connection(
|
|
314
|
+
self,
|
|
315
|
+
saas_connector_type: str,
|
|
316
|
+
template_values: SaasConnectionTemplateValues,
|
|
317
|
+
system: Optional[System] = None,
|
|
318
|
+
) -> Tuple[ConnectionConfig, DatasetConfig]:
|
|
319
|
+
"""
|
|
320
|
+
Creates a SaaS Connector and a SaaS Dataset from a template.
|
|
321
|
+
|
|
322
|
+
Looks up the connector type in the SaaS connector registry and, if all required
|
|
323
|
+
fields are provided, persists the associated connection config and dataset to the database.
|
|
324
|
+
"""
|
|
325
|
+
connector_template: Optional[ConnectorTemplate] = (
|
|
326
|
+
ConnectorRegistry.get_connector_template(saas_connector_type)
|
|
327
|
+
)
|
|
328
|
+
if not connector_template:
|
|
329
|
+
raise ConnectorTemplateNotFound(
|
|
330
|
+
f"SaaS connector type '{saas_connector_type}' is not yet available in Fidesops. For a list of available SaaS connectors, refer to {CONNECTION_TYPES}.",
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
if DatasetConfig.filter(
|
|
334
|
+
db=self.db,
|
|
335
|
+
conditions=(DatasetConfig.fides_key == template_values.instance_key), # type: ignore[arg-type]
|
|
336
|
+
).count():
|
|
337
|
+
raise KeyOrNameAlreadyExists(
|
|
338
|
+
f"SaaS connector instance key '{template_values.instance_key}' already exists.",
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
connection_config: ConnectionConfig = (
|
|
342
|
+
self.create_connection_config_from_template_no_save(
|
|
343
|
+
connector_template, template_values
|
|
344
|
+
)
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
connection_config.secrets = self.validate_secrets(
|
|
348
|
+
template_values.secrets, connection_config
|
|
349
|
+
).model_dump(mode="json")
|
|
350
|
+
if system:
|
|
351
|
+
connection_config.system_id = system.id # type: ignore[attr-defined]
|
|
352
|
+
connection_config.save(
|
|
353
|
+
db=self.db
|
|
354
|
+
) # Not persisted to db until secrets are validated
|
|
355
|
+
|
|
356
|
+
try:
|
|
357
|
+
dataset_config: DatasetConfig = self.upsert_dataset_config_from_template(
|
|
358
|
+
connection_config, connector_template, template_values
|
|
359
|
+
)
|
|
360
|
+
except Exception:
|
|
361
|
+
connection_config.delete(self.db)
|
|
362
|
+
raise Exception(
|
|
363
|
+
f"SaaS Connector could not be created from the '{saas_connector_type}' template at this time."
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
logger.info(
|
|
367
|
+
"SaaS Connector and Dataset {} successfully created from '{}' template.",
|
|
368
|
+
template_values.instance_key,
|
|
369
|
+
saas_connector_type,
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
# Create audit events for connection and secrets creation
|
|
373
|
+
self.create_connection_audit_event(
|
|
374
|
+
EventAuditType.connection_created,
|
|
375
|
+
connection_config,
|
|
376
|
+
)
|
|
377
|
+
self.create_secrets_audit_event(
|
|
378
|
+
EventAuditType.connection_secrets_created,
|
|
379
|
+
connection_config,
|
|
380
|
+
template_values.secrets, # type: ignore[arg-type]
|
|
381
|
+
)
|
|
382
|
+
return connection_config, dataset_config
|
|
383
|
+
|
|
384
|
+
def create_or_update_connection_config(
|
|
385
|
+
self,
|
|
386
|
+
config: CreateConnectionConfigurationWithSecrets,
|
|
387
|
+
system: Optional[System] = None,
|
|
388
|
+
) -> ConnectionConfigurationResponse:
|
|
389
|
+
"""
|
|
390
|
+
Create or update a single connection configuration.
|
|
391
|
+
|
|
392
|
+
This method handles both SaaS and non-SaaS connection types
|
|
393
|
+
"""
|
|
394
|
+
# Retrieve the existing connection config from the database
|
|
395
|
+
existing_connection_config = None
|
|
396
|
+
if config.key:
|
|
397
|
+
existing_connection_config = ConnectionConfig.get_by(
|
|
398
|
+
self.db, field="key", value=config.key
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
# Handle SaaS connections with special template-based creation
|
|
402
|
+
if config.connection_type == "saas" and config.secrets:
|
|
403
|
+
if existing_connection_config:
|
|
404
|
+
# For existing SaaS configs, validate secrets normally
|
|
405
|
+
config.secrets = self.validate_secrets(
|
|
406
|
+
config.secrets, existing_connection_config
|
|
407
|
+
)
|
|
408
|
+
else:
|
|
409
|
+
# For new SaaS configs, create from template
|
|
410
|
+
return self._create_saas_connection_from_template(config, system)
|
|
411
|
+
|
|
412
|
+
# Handle standard connection creation/update flow:
|
|
413
|
+
# - Non-SaaS connections (postgres, mysql, etc.)
|
|
414
|
+
# - Existing SaaS connections (after secret validation above)
|
|
415
|
+
return self._create_or_update_standard_connection(
|
|
416
|
+
config, existing_connection_config, system
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
def _create_saas_connection_from_template(
|
|
420
|
+
self,
|
|
421
|
+
config: CreateConnectionConfigurationWithSecrets,
|
|
422
|
+
system: Optional[System] = None,
|
|
423
|
+
) -> ConnectionConfigurationResponse:
|
|
424
|
+
"""Create a new SaaS connection from a connector template."""
|
|
425
|
+
if not config.saas_connector_type:
|
|
426
|
+
raise ValueError("saas_connector_type is missing")
|
|
427
|
+
|
|
428
|
+
connector_template = ConnectorRegistry.get_connector_template(
|
|
429
|
+
config.saas_connector_type
|
|
430
|
+
)
|
|
431
|
+
if not connector_template:
|
|
432
|
+
raise ConnectorTemplateNotFound(
|
|
433
|
+
f"SaaS connector type '{config.saas_connector_type}' is not yet available in Fides. For a list of available SaaS connectors, refer to {CONNECTION_TYPES}."
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
template_values = SaasConnectionTemplateValues(
|
|
437
|
+
name=config.name,
|
|
438
|
+
key=config.key,
|
|
439
|
+
description=config.description,
|
|
440
|
+
secrets=config.secrets,
|
|
441
|
+
instance_key=config.key,
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
if system:
|
|
445
|
+
connection_config = self.create_connection_config_from_template_no_save(
|
|
446
|
+
connector_template,
|
|
447
|
+
template_values,
|
|
448
|
+
system_id=system.id, # type: ignore[attr-defined]
|
|
449
|
+
)
|
|
450
|
+
else:
|
|
451
|
+
connection_config = self.create_connection_config_from_template_no_save(
|
|
452
|
+
connector_template,
|
|
453
|
+
template_values,
|
|
454
|
+
)
|
|
455
|
+
connection_config.secrets = self.validate_secrets(
|
|
456
|
+
template_values.secrets,
|
|
457
|
+
connection_config,
|
|
458
|
+
).model_dump(mode="json")
|
|
459
|
+
connection_config.save(db=self.db)
|
|
460
|
+
|
|
461
|
+
# Create audit events for connection and secrets creation
|
|
462
|
+
self.create_connection_audit_event(
|
|
463
|
+
EventAuditType.connection_created,
|
|
464
|
+
connection_config,
|
|
465
|
+
)
|
|
466
|
+
self.create_secrets_audit_event(
|
|
467
|
+
EventAuditType.connection_secrets_created,
|
|
468
|
+
connection_config,
|
|
469
|
+
template_values.secrets, # type: ignore[arg-type]
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
return ConnectionConfigurationResponse.model_validate(connection_config)
|
|
473
|
+
|
|
474
|
+
def _create_or_update_standard_connection(
|
|
475
|
+
self,
|
|
476
|
+
config: CreateConnectionConfigurationWithSecrets,
|
|
477
|
+
existing_connection_config: Optional[ConnectionConfig],
|
|
478
|
+
system: Optional[System] = None,
|
|
479
|
+
) -> ConnectionConfigurationResponse:
|
|
480
|
+
"""Create or update a standard (non-template-based) connection configuration."""
|
|
481
|
+
config_dict = config.model_dump(serialize_as_any=True, exclude_unset=True)
|
|
482
|
+
config_dict.pop("saas_connector_type", None)
|
|
483
|
+
|
|
484
|
+
# Store original config dict for change detection
|
|
485
|
+
original_config_dict = None
|
|
486
|
+
if existing_connection_config:
|
|
487
|
+
# Store the original values before merging
|
|
488
|
+
original_config_dict = existing_connection_config.__dict__.copy()
|
|
489
|
+
|
|
490
|
+
# Merge existing config with new values
|
|
491
|
+
config_dict = {
|
|
492
|
+
key: value
|
|
493
|
+
for key, value in {
|
|
494
|
+
**existing_connection_config.__dict__,
|
|
495
|
+
**config.model_dump(serialize_as_any=True, exclude_unset=True),
|
|
496
|
+
}.items()
|
|
497
|
+
if isinstance(value, bool) or value
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
if system:
|
|
501
|
+
config_dict["system_id"] = system.id # type: ignore[attr-defined]
|
|
502
|
+
|
|
503
|
+
connection_config = ConnectionConfig.create_or_update(
|
|
504
|
+
self.db, data=config_dict, check_name=False
|
|
505
|
+
)
|
|
506
|
+
|
|
507
|
+
# Track which connection configuration fields changed (only for updates)
|
|
508
|
+
changed_fields = None
|
|
509
|
+
connection_config_changed = False
|
|
510
|
+
|
|
511
|
+
if original_config_dict:
|
|
512
|
+
# Detect which fields have changed
|
|
513
|
+
changed_fields = _detect_connection_config_changes(
|
|
514
|
+
original_config_dict, config_dict
|
|
515
|
+
)
|
|
516
|
+
connection_config_changed = bool(changed_fields)
|
|
517
|
+
else:
|
|
518
|
+
# For new connections, always create audit event (changed_fields=None means include all)
|
|
519
|
+
connection_config_changed = True
|
|
520
|
+
|
|
521
|
+
# Create audit event for connection operation
|
|
522
|
+
if connection_config_changed:
|
|
523
|
+
connection_event_type = (
|
|
524
|
+
EventAuditType.connection_updated
|
|
525
|
+
if existing_connection_config
|
|
526
|
+
else EventAuditType.connection_created
|
|
527
|
+
)
|
|
528
|
+
self.create_connection_audit_event(
|
|
529
|
+
connection_event_type,
|
|
530
|
+
connection_config,
|
|
531
|
+
changed_fields=changed_fields,
|
|
532
|
+
)
|
|
533
|
+
|
|
534
|
+
# Handle secrets validation and audit events
|
|
535
|
+
if config.secrets:
|
|
536
|
+
secrets_event_type = (
|
|
537
|
+
EventAuditType.connection_secrets_updated
|
|
538
|
+
if existing_connection_config
|
|
539
|
+
else EventAuditType.connection_secrets_created
|
|
540
|
+
)
|
|
541
|
+
self.create_secrets_audit_event(
|
|
542
|
+
secrets_event_type,
|
|
543
|
+
connection_config,
|
|
544
|
+
connection_config.secrets, # type: ignore[arg-type]
|
|
545
|
+
)
|
|
546
|
+
|
|
547
|
+
# Automatically create a ManualTask if this is a manual_task connection
|
|
548
|
+
# and it doesn't already have one
|
|
549
|
+
if (
|
|
550
|
+
connection_config.connection_type == ConnectionType.manual_task
|
|
551
|
+
and not connection_config.manual_task
|
|
552
|
+
):
|
|
553
|
+
ManualTask.create(
|
|
554
|
+
db=self.db,
|
|
555
|
+
data={
|
|
556
|
+
"task_type": ManualTaskType.privacy_request,
|
|
557
|
+
"parent_entity_id": connection_config.id,
|
|
558
|
+
"parent_entity_type": ManualTaskParentEntityType.connection_config,
|
|
559
|
+
},
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
return ConnectionConfigurationResponse.model_validate(connection_config)
|
|
563
|
+
|
|
564
|
+
def update_saas_instance(
|
|
565
|
+
self,
|
|
566
|
+
connection_config: ConnectionConfig,
|
|
567
|
+
template: ConnectorTemplate,
|
|
568
|
+
saas_config_instance: SaaSConfig,
|
|
569
|
+
) -> None:
|
|
570
|
+
"""
|
|
571
|
+
Replace in the DB the existing SaaS instance configuration data
|
|
572
|
+
(SaaSConfig, DatasetConfig) associated with the given ConnectionConfig
|
|
573
|
+
with new instance configuration data based on the given ConnectorTemplate
|
|
574
|
+
"""
|
|
575
|
+
|
|
576
|
+
template_vals = SaasConnectionTemplateValues(
|
|
577
|
+
name=connection_config.name,
|
|
578
|
+
key=connection_config.key,
|
|
579
|
+
description=connection_config.description,
|
|
580
|
+
secrets=connection_config.secrets,
|
|
581
|
+
instance_key=saas_config_instance.fides_key,
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
config_from_template: Dict = replace_config_placeholders(
|
|
585
|
+
template.config, "<instance_fides_key>", template_vals.instance_key
|
|
586
|
+
)
|
|
587
|
+
|
|
588
|
+
connection_config.update_saas_config(
|
|
589
|
+
self.db, SaaSConfig(**config_from_template)
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
# Create audit event for SaaS instance update
|
|
593
|
+
self.create_connection_audit_event(
|
|
594
|
+
EventAuditType.connection_updated,
|
|
595
|
+
connection_config,
|
|
596
|
+
changed_fields={"saas_config"},
|
|
597
|
+
)
|
|
598
|
+
|
|
599
|
+
self.upsert_dataset_config_from_template(
|
|
600
|
+
connection_config, template, template_vals
|
|
601
|
+
)
|
|
602
|
+
|
|
603
|
+
def create_connection_config_from_template_no_save(
|
|
604
|
+
self,
|
|
605
|
+
template: ConnectorTemplate,
|
|
606
|
+
template_values: SaasConnectionTemplateValues,
|
|
607
|
+
system_id: Optional[str] = None,
|
|
608
|
+
) -> ConnectionConfig:
|
|
609
|
+
"""Creates a SaaS connection config from a template without saving it."""
|
|
610
|
+
# Load SaaS config from template and replace every instance of "<instance_fides_key>" with the fides_key
|
|
611
|
+
# the user has chosen
|
|
612
|
+
config_from_template: Dict = replace_config_placeholders(
|
|
613
|
+
template.config, "<instance_fides_key>", template_values.instance_key
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
data = template_values.generate_config_data_from_template(
|
|
617
|
+
config_from_template=config_from_template
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
if system_id:
|
|
621
|
+
data["system_id"] = system_id
|
|
622
|
+
|
|
623
|
+
# Create SaaS ConnectionConfig
|
|
624
|
+
connection_config = ConnectionConfig.create_without_saving(self.db, data=data)
|
|
625
|
+
|
|
626
|
+
return connection_config
|
|
627
|
+
|
|
628
|
+
def upsert_dataset_config_from_template(
|
|
629
|
+
self,
|
|
630
|
+
connection_config: ConnectionConfig,
|
|
631
|
+
template: ConnectorTemplate,
|
|
632
|
+
template_values: SaasConnectionTemplateValues,
|
|
633
|
+
) -> DatasetConfig:
|
|
634
|
+
"""
|
|
635
|
+
Creates a `DatasetConfig` from a template
|
|
636
|
+
and associates it with a ConnectionConfig.
|
|
637
|
+
If the `DatasetConfig` already exists in the db,
|
|
638
|
+
then the existing record is updated.
|
|
639
|
+
"""
|
|
640
|
+
# Load the dataset config from template and replace every instance of "<instance_fides_key>" with the fides_key
|
|
641
|
+
# the user has chosen
|
|
642
|
+
dataset_from_template: Dict = replace_dataset_placeholders(
|
|
643
|
+
template.dataset, "<instance_fides_key>", template_values.instance_key
|
|
644
|
+
)
|
|
645
|
+
data = {
|
|
646
|
+
"connection_config_id": connection_config.id,
|
|
647
|
+
"fides_key": template_values.instance_key,
|
|
648
|
+
"dataset": dataset_from_template, # Currently used for upserting a CTL Dataset
|
|
649
|
+
}
|
|
650
|
+
dataset_config = DatasetConfig.create_or_update(self.db, data=data)
|
|
651
|
+
return dataset_config
|