ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.74.0rc1__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.
Potentially problematic release.
This version of ethyca-fides might be problematic. Click here for more details.
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/METADATA +3 -2
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/RECORD +377 -327
- 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/4bfbeff34611_add_polling_status.py +68 -0
- fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
- fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
- fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
- fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
- fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -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/api/v1/endpoints/connection_endpoints.py +38 -45
- fides/api/api/v1/endpoints/generic_overrides.py +75 -6
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +60 -6
- fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
- fides/api/api/v1/endpoints/system.py +11 -43
- fides/api/api/v1/endpoints/user_endpoints.py +8 -1
- fides/api/app_setup.py +1 -3
- fides/api/common_exceptions.py +8 -0
- fides/api/db/base.py +2 -0
- fides/api/db/database.py +257 -2
- fides/api/email_templates/get_email_template.py +3 -0
- fides/api/email_templates/template_names.py +1 -0
- fides/api/email_templates/templates/manual_task_digest.html +316 -0
- fides/api/main.py +2 -2
- fides/api/models/attachment.py +1 -0
- fides/api/models/detection_discovery/__init__.py +2 -0
- fides/api/models/detection_discovery/core.py +10 -0
- fides/api/models/detection_discovery/monitor_task.py +1 -0
- fides/api/models/detection_discovery/staged_resource_error.py +25 -0
- fides/api/models/digest/__init__.py +2 -0
- fides/api/models/digest/digest_config.py +10 -1
- fides/api/models/digest/digest_execution.py +142 -0
- fides/api/models/event_audit.py +17 -0
- fides/api/models/identity_definition.py +65 -0
- fides/api/models/messaging_template.py +7 -0
- fides/api/models/privacy_experience.py +11 -0
- 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 +56 -8
- fides/api/models/privacy_request/request_task.py +98 -1
- fides/api/models/sql_models.py +3 -0
- fides/api/models/taxonomy.py +14 -4
- 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/schemas/application_config.py +28 -0
- fides/api/schemas/connection_configuration/connection_config.py +1 -30
- fides/api/schemas/messaging/messaging.py +15 -0
- fides/api/schemas/privacy_request.py +17 -3
- fides/api/schemas/saas/async_polling_configuration.py +81 -0
- fides/api/schemas/saas/saas_config.py +10 -3
- fides/api/schemas/saas/strategy_configuration.py +0 -12
- fides/api/schemas/taxonomy_extensions.py +8 -0
- 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 +686 -0
- fides/api/service/async_dsr/utils.py +130 -0
- fides/api/service/connectors/bigquery_connector.py +34 -16
- fides/api/service/connectors/fides/fides_client.py +63 -1
- fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
- fides/api/service/connectors/saas/connector_registry_service.py +1 -138
- fides/api/service/connectors/saas_connector.py +116 -94
- fides/api/service/connectors/sql_connector.py +14 -4
- fides/api/service/deps.py +8 -0
- fides/api/service/messaging/message_dispatch_service.py +38 -1
- fides/api/service/privacy_request/attachment_handling.py +9 -2
- fides/api/service/privacy_request/duplication_detection.py +424 -0
- fides/api/service/privacy_request/request_runner_service.py +46 -84
- fides/api/service/privacy_request/request_service.py +47 -74
- fides/api/service/saas_request/saas_request_override_factory.py +71 -1
- fides/api/task/execute_request_tasks.py +17 -9
- fides/api/task/filter_results.py +35 -2
- fides/api/task/graph_task.py +37 -8
- fides/api/tasks/__init__.py +0 -1
- fides/api/util/connection_util.py +99 -215
- fides/api/util/event_audit_util.py +230 -0
- 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/saas_config_updater.py +66 -0
- fides/api/util/saas_util.py +28 -1
- fides/common/api/scope_registry.py +0 -7
- fides/common/api/v1/urn_registry.py +2 -0
- fides/config/__init__.py +10 -1
- 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 +7 -3
- 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/event_audit_service.py +16 -22
- fides/service/privacy_request/privacy_request_service.py +162 -43
- fides/service/taxonomy/handlers/legacy_handler.py +3 -3
- fides/service/taxonomy/taxonomy_service.py +15 -15
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/FZTEUgamBvOhgPWce135w/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-0da062111df309bf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-508b16628e8eb225.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1840-5bbe6d878ed73fb4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.afe8cad52f904fcf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-fe1a06d82c0413f1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2397-40b8db1cb2f23e2a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2921-b10bbc3a9104933b.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-eb5cd82b3ee6ab0c.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-93ecd09f1cb9dbef.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-6db05a35ae806825.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-44255a63d6d80ff5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/401-fe8db8b5d8f600de.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/4277-13bcf4516326d474.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4496-bed72bd5639075be.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4817-d29f40d4ce729f37.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-b2ac9fecc00b67e7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-4672eae0656430f9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-8dedd1ca94fbba54.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/549-6e2442db533a711e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5643-55d758444a8d7162.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5724-1e40975cefa405f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-6055edba275155ca.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-82e2df433fe5ba85.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6344-3e21444374f8059f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6362-12e3fd23130ccf15.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6372-a8d0f08dac1ebd0e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6780-3db5133c1f4c6f1e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6853-1adbdf6418ec3d62.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-aa0c60ee1092be8e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7059-12be23a345a94c1e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7079-6e6efc3396ff1ebb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7218-d297a4a06f924b09.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7245-686665c197b58e68.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-a43c046c24de37cc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-c654c61ba98d8c74.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7654-716cf37a020b3d11.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-e83ace3c6ab99ac7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/8212-b9e8295ca883c9f8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8939-4925751c57c51f87.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9046-e4daf28840a69fd6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-550bd50d538c5f79.js} +3 -3
- fides/ui-build/static/admin/_next/static/chunks/9330-e519adec48222d45.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9341-bfc0e59bcc56c604.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.7d029a5383595b69.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9682-da69ac5d06f281da.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-657652d55936a8c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9965-56c5e4fc9cd3b3a5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-d079b8bf35250874.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-e64fd8510033a27c.js} +63 -63
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ddd9d7d40847fc28.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-b4d18c1f4d414f5f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d451bc8932330141.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-c24663cd5dec57db.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-d93418688bd258eb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-9b1f2b1c06968166.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-115a085e5d42de45.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d9b7b311195df29e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-3de34624829cbce8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-dc95e7ed278d1a29.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cdfc9bb19f47c709.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-0b995b01dc4dbd1f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-e3ad3a55624e302a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-b37ed76849330edd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-dd82729296dee5c5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-49e5477eb1a11b92.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-dfc1ead4a12c9ffa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-8442eb219958ac7e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-feda358d1801c18d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d16acb6fc07aad46.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-c51a1e98c45d231a.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/website/[monitorId]/[systemId]-bcfe38eebca30f8c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-f66d0655897c4400.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-6f1e012cd641da19.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-581d6248fcf98d17.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-ddc1c1641e1e9430.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-2b48f7e524743b2b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-862b67418600251e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-0ffec855f5df262c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a030ab8c2e2b0db.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-6cb66f649b8ca4bf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-0b008dad90b00aaa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-5566edf9a9d1be2d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4ca1f485b6e9e02.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-85dee7e81dc4bafb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-e905e018a2cab35d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-912723bc86299b1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f1f0affc18327033.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-b74d1e8608ae5b5d.js → index-692d27dbe9392c9f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-1b94e2d769a182b2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adfe6c5ac5b703d0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-f9be7080ebbb7445.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-caaa8602a1d449b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-9b106b1d2d93985b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-6a1ded8cdde836c4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-f94e3accf9507ebf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-5e83220ff1f2a250.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-a03cbd698a23e5b3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-3cde574b3c8447c0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-0448bb4ae8536c58.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-1621a4b87c432117.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications-4ea28f6b1dd63642.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-e02516d9fd314528.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-fec08bea801b4918.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d911e5fbf5a4a888.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-91b1adcac6a57b2d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-de309d8813b1ebfb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-f2943c1309062284.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-03eda417711ae909.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1fe486f3af832c80.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-ea6f78fa8b2d3f6c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-bda7b474493e7128.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-2c0ec8fed16c20ae.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-30d298a47e85709f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-438084cca0d0f10d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-17fd44d98f5bd5b6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-baf77d34a3b3bece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-8c80391025ca7339.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7c19810858b708cc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee8820fe0fa14c77.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{[id]-bd1042a0e9be6aff.js → [id]-8eb862182f19a6c2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{new-469ad83c8cfa1290.js → new-37c29ef618e9fe3c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-1db425150dcb1b6b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-e334b43fa5c5b1e6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-9d18eb5c38d85522.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-cb937ed7c4b1e5a8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-835281251f0785cd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-7fd050c92866938c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-59ea66130fca0d05.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-b0fe1051d908f366.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f108bf5015144d2f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-0e7c7228d01290ea.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-adc13b542e10a37d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-23dd250da26511c5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-aed30fb22ae7c9ec.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-6b88ca3e02ee67c9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-6f97ebe373e7ef6b.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/4861ca3e088f2d05.css +1 -0
- fides/ui-build/static/admin/_next/static/css/65ae906f224cd8ae.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1800714b486e230.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/d5701118537cbdd2.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/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/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/poc/table-migration.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 -1
- fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
- 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 -195
- fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
- fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
- fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
- fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
- fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.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-66f65496c3a09316.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.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-83cb70e80cbe41ba.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-ffe4e8436e1eceb9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5185-51eaa78e3ed6bfb7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5643-10a36584c399526c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-7004a8c420b1ca02.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-4b24e1731c1cc3b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-d0d3a0fe3f95e971.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.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/pages/add-systems/manual-4ec03eed67572861.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-2ca59996860a33c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-92182be6603c2842.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-ab54b19609bff325.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-e8d2140787045acd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-e3f93462a08251bf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-b5f7d6afdecd013d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-248ad9f65a872442.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-aedb66a62042b10a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-018df38b7cd77fdb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6ca9099d03aab817.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0f2c90786ea005a4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-200b51a725f8b2d1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-f3e6e74e0efb005c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a3275554ffe8e640.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-77239269acc2d31a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-8bf1821722b082e9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-2deb6becece69d46.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.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/295d729ea1b11885.css +0 -1
- fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.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/settings/messaging-providers/[key].html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers/new.html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers.html +0 -1
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → FZTEUgamBvOhgPWce135w}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-7dce2916cc589c54.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
|
|
@@ -29,32 +29,26 @@ class EventAuditService:
|
|
|
29
29
|
"""Create a new audit event record."""
|
|
30
30
|
|
|
31
31
|
# Uses the passed in user_id or falls back to the authenticated user via get_user_id()
|
|
32
|
+
data = {
|
|
33
|
+
"event_type": event_type,
|
|
34
|
+
"status": status,
|
|
35
|
+
"user_id": user_id or get_user_id(),
|
|
36
|
+
"resource_type": resource_type,
|
|
37
|
+
"resource_identifier": resource_identifier,
|
|
38
|
+
"description": description,
|
|
39
|
+
"event_details": event_details,
|
|
40
|
+
}
|
|
32
41
|
event_audit = EventAudit.create(
|
|
33
42
|
db=self.db,
|
|
34
|
-
data=
|
|
35
|
-
"event_type": event_type,
|
|
36
|
-
"status": status,
|
|
37
|
-
"user_id": user_id or get_user_id(),
|
|
38
|
-
"resource_type": resource_type,
|
|
39
|
-
"resource_identifier": resource_identifier,
|
|
40
|
-
"description": description,
|
|
41
|
-
"event_details": event_details,
|
|
42
|
-
},
|
|
43
|
+
data=data,
|
|
43
44
|
)
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
)
|
|
52
|
-
else:
|
|
53
|
-
logger.debug(
|
|
54
|
-
"Created event audit: {} for resource: {}",
|
|
55
|
-
event_type,
|
|
56
|
-
resource_type,
|
|
57
|
-
)
|
|
46
|
+
msg_payload = {**data}
|
|
47
|
+
msg_payload.pop("event_type")
|
|
48
|
+
msg_payload["status"] = status.value
|
|
49
|
+
msg = f"Created event audit {event_type} for resource: {resource_type}. {msg_payload}"
|
|
50
|
+
|
|
51
|
+
logger.info(msg)
|
|
58
52
|
|
|
59
53
|
return event_audit
|
|
60
54
|
|