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
|
@@ -6,30 +6,17 @@ from fideslang.validation import FidesKey
|
|
|
6
6
|
from loguru import logger
|
|
7
7
|
from pydantic import Field, ValidationError
|
|
8
8
|
from sqlalchemy.orm import Session
|
|
9
|
-
from starlette.status import
|
|
10
|
-
HTTP_400_BAD_REQUEST,
|
|
11
|
-
HTTP_404_NOT_FOUND,
|
|
12
|
-
HTTP_422_UNPROCESSABLE_ENTITY,
|
|
13
|
-
)
|
|
9
|
+
from starlette.status import HTTP_404_NOT_FOUND, HTTP_422_UNPROCESSABLE_ENTITY
|
|
14
10
|
|
|
15
11
|
from fides.api.api import deps
|
|
16
12
|
from fides.api.common_exceptions import (
|
|
17
|
-
|
|
18
|
-
ConnectionException,
|
|
13
|
+
ConnectionNotFoundException,
|
|
19
14
|
KeyOrNameAlreadyExists,
|
|
15
|
+
SaaSConfigNotFoundException,
|
|
20
16
|
)
|
|
21
17
|
from fides.api.common_exceptions import ValidationError as FidesValidationError
|
|
22
|
-
from fides.api.models.connectionconfig import
|
|
23
|
-
ConnectionConfig,
|
|
24
|
-
ConnectionTestStatus,
|
|
25
|
-
ConnectionType,
|
|
26
|
-
)
|
|
18
|
+
from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
|
|
27
19
|
from fides.api.models.datasetconfig import DatasetConfig
|
|
28
|
-
from fides.api.models.manual_task import (
|
|
29
|
-
ManualTask,
|
|
30
|
-
ManualTaskParentEntityType,
|
|
31
|
-
ManualTaskType,
|
|
32
|
-
)
|
|
33
20
|
from fides.api.models.manual_webhook import AccessManualWebhook
|
|
34
21
|
from fides.api.models.privacy_request import PrivacyRequest
|
|
35
22
|
from fides.api.models.sql_models import Dataset as CtlDataset # type: ignore
|
|
@@ -38,7 +25,6 @@ from fides.api.schemas.api import BulkUpdateFailed
|
|
|
38
25
|
from fides.api.schemas.connection_configuration import (
|
|
39
26
|
ConnectionConfigSecretsSchema,
|
|
40
27
|
connection_secrets_schemas,
|
|
41
|
-
get_connection_secrets_schema,
|
|
42
28
|
)
|
|
43
29
|
from fides.api.schemas.connection_configuration.connection_config import (
|
|
44
30
|
BulkPutConnectionConfiguration,
|
|
@@ -48,23 +34,13 @@ from fides.api.schemas.connection_configuration.connection_config import (
|
|
|
48
34
|
from fides.api.schemas.connection_configuration.connection_secrets import (
|
|
49
35
|
TestStatusMessage,
|
|
50
36
|
)
|
|
51
|
-
from fides.api.schemas.connection_configuration.connection_secrets_dynamic_erasure_email import (
|
|
52
|
-
validate_dynamic_erasure_email_dataset_references,
|
|
53
|
-
)
|
|
54
|
-
from fides.api.schemas.connection_configuration.connection_secrets_saas import (
|
|
55
|
-
validate_saas_secrets_external_references,
|
|
56
|
-
)
|
|
57
|
-
from fides.api.schemas.connection_configuration.saas_config_template_values import (
|
|
58
|
-
SaasConnectionTemplateValues,
|
|
59
|
-
)
|
|
60
37
|
from fides.api.schemas.privacy_request import PrivacyRequestStatus
|
|
61
|
-
from fides.api.
|
|
62
|
-
from fides.
|
|
63
|
-
|
|
64
|
-
|
|
38
|
+
from fides.common.api.v1.urn_registry import SAAS_CONFIG
|
|
39
|
+
from fides.service.connection.connection_service import (
|
|
40
|
+
ConnectionService,
|
|
41
|
+
ConnectorTemplateNotFound,
|
|
65
42
|
)
|
|
66
|
-
from fides.
|
|
67
|
-
from fides.common.api.v1.urn_registry import CONNECTION_TYPES, SAAS_CONFIG
|
|
43
|
+
from fides.service.event_audit_service import EventAuditService
|
|
68
44
|
from fides.service.privacy_request.privacy_request_service import queue_privacy_request
|
|
69
45
|
|
|
70
46
|
# pylint: disable=too-many-nested-blocks,too-many-branches,too-many-statements
|
|
@@ -95,7 +71,7 @@ def requeue_requires_input_requests(db: Session) -> None:
|
|
|
95
71
|
)
|
|
96
72
|
|
|
97
73
|
|
|
98
|
-
def
|
|
74
|
+
def validate_secrets_error_message() -> str:
|
|
99
75
|
return f"A SaaS config to validate the secrets is unavailable for this connection config, please add one via {SAAS_CONFIG}"
|
|
100
76
|
|
|
101
77
|
|
|
@@ -106,56 +82,30 @@ def validate_secrets(
|
|
|
106
82
|
) -> ConnectionConfigSecretsSchema:
|
|
107
83
|
"""Validate incoming connection configuration secrets."""
|
|
108
84
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
if connection_type == ConnectionType.saas and saas_config is None:
|
|
112
|
-
raise HTTPException(
|
|
113
|
-
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
114
|
-
detail=_validate_secrets_error_message(),
|
|
115
|
-
)
|
|
85
|
+
event_audit_service = EventAuditService(db)
|
|
86
|
+
connection_service = ConnectionService(db, event_audit_service)
|
|
116
87
|
|
|
117
88
|
try:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
89
|
+
return connection_service.validate_secrets(request_body, connection_config)
|
|
90
|
+
except SaaSConfigNotFoundException:
|
|
91
|
+
raise HTTPException(
|
|
92
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
93
|
+
detail=validate_secrets_error_message(),
|
|
122
94
|
)
|
|
123
|
-
|
|
95
|
+
except FidesValidationError as e:
|
|
96
|
+
# Check if the exception has the original pydantic errors attached
|
|
97
|
+
raise HTTPException(status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message)
|
|
124
98
|
except ValidationError as e:
|
|
125
|
-
# Intentionally excluding the pydantic url, input, and ctx fields from the error response to hide
|
|
126
|
-
# potentially sensitive information
|
|
127
99
|
errors = e.errors(include_url=False, include_input=False)
|
|
128
100
|
for err in errors:
|
|
129
101
|
# Additionally, manually remove the context from the error message -
|
|
130
102
|
# this may contain sensitive information
|
|
131
103
|
err.pop("ctx", None)
|
|
132
|
-
|
|
133
104
|
raise HTTPException(
|
|
134
105
|
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
135
106
|
detail=jsonable_encoder(errors),
|
|
136
107
|
)
|
|
137
108
|
|
|
138
|
-
# SaaS secrets with external references must go through extra validation
|
|
139
|
-
if connection_type == ConnectionType.saas:
|
|
140
|
-
try:
|
|
141
|
-
validate_saas_secrets_external_references(db, schema, connection_secrets) # type: ignore
|
|
142
|
-
|
|
143
|
-
except FidesValidationError as e:
|
|
144
|
-
raise HTTPException(
|
|
145
|
-
status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
# For dynamic erasure emails we must validate the recipient email address
|
|
149
|
-
if connection_type == ConnectionType.dynamic_erasure_email:
|
|
150
|
-
try:
|
|
151
|
-
validate_dynamic_erasure_email_dataset_references(db, connection_secrets)
|
|
152
|
-
except FidesValidationError as e:
|
|
153
|
-
raise HTTPException(
|
|
154
|
-
status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
return connection_secrets
|
|
158
|
-
|
|
159
109
|
|
|
160
110
|
def patch_connection_configs(
|
|
161
111
|
db: Session,
|
|
@@ -166,134 +116,20 @@ def patch_connection_configs(
|
|
|
166
116
|
failed: List[BulkUpdateFailed] = []
|
|
167
117
|
logger.info("Starting bulk upsert for {} connection configuration(s)", len(configs))
|
|
168
118
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if config.key:
|
|
173
|
-
existing_connection_config = ConnectionConfig.get_by(
|
|
174
|
-
db, field="key", value=config.key
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
if config.connection_type == "saas":
|
|
178
|
-
if config.secrets:
|
|
179
|
-
# This is here rather than with the get_connection_config_or_error because
|
|
180
|
-
# it will also throw an HTTPException if validation fails and we don't want
|
|
181
|
-
# to catch it in this case.
|
|
182
|
-
if existing_connection_config:
|
|
183
|
-
config.secrets = validate_secrets(
|
|
184
|
-
db, config.secrets, existing_connection_config
|
|
185
|
-
)
|
|
186
|
-
else:
|
|
187
|
-
if not config.saas_connector_type:
|
|
188
|
-
raise HTTPException(
|
|
189
|
-
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
190
|
-
detail="saas_connector_type is missing",
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
connector_template = ConnectorRegistry.get_connector_template(
|
|
194
|
-
config.saas_connector_type
|
|
195
|
-
)
|
|
196
|
-
if not connector_template:
|
|
197
|
-
raise HTTPException(
|
|
198
|
-
status_code=HTTP_404_NOT_FOUND,
|
|
199
|
-
detail=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}.",
|
|
200
|
-
)
|
|
201
|
-
try:
|
|
202
|
-
template_values = SaasConnectionTemplateValues(
|
|
203
|
-
name=config.name,
|
|
204
|
-
key=config.key,
|
|
205
|
-
description=config.description,
|
|
206
|
-
secrets=config.secrets,
|
|
207
|
-
instance_key=config.key,
|
|
208
|
-
)
|
|
209
|
-
if system:
|
|
210
|
-
connection_config = (
|
|
211
|
-
create_connection_config_from_template_no_save(
|
|
212
|
-
db,
|
|
213
|
-
connector_template,
|
|
214
|
-
template_values,
|
|
215
|
-
system_id=system.id,
|
|
216
|
-
)
|
|
217
|
-
)
|
|
218
|
-
else:
|
|
219
|
-
connection_config = (
|
|
220
|
-
create_connection_config_from_template_no_save(
|
|
221
|
-
db,
|
|
222
|
-
connector_template,
|
|
223
|
-
template_values,
|
|
224
|
-
)
|
|
225
|
-
)
|
|
226
|
-
except KeyOrNameAlreadyExists as exc:
|
|
227
|
-
raise HTTPException(
|
|
228
|
-
status_code=HTTP_400_BAD_REQUEST,
|
|
229
|
-
detail=exc.args[0],
|
|
230
|
-
)
|
|
231
|
-
except ValidationError as e:
|
|
232
|
-
# The "input" potentially contains sensitive info and the Pydantic-specific "url" is not helpful
|
|
233
|
-
errors = e.errors(include_url=False, include_input=False)
|
|
234
|
-
for err in errors:
|
|
235
|
-
# Additionally, manually remove the context from the error message -
|
|
236
|
-
# this may contain sensitive information
|
|
237
|
-
err.pop("ctx", None)
|
|
238
|
-
|
|
239
|
-
raise HTTPException(
|
|
240
|
-
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
241
|
-
detail=jsonable_encoder(errors),
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
connection_config.secrets = validate_secrets(
|
|
245
|
-
db,
|
|
246
|
-
template_values.secrets,
|
|
247
|
-
connection_config,
|
|
248
|
-
).model_dump(mode="json")
|
|
249
|
-
connection_config.save(db=db)
|
|
250
|
-
created_or_updated.append(
|
|
251
|
-
ConnectionConfigurationResponse.model_validate(
|
|
252
|
-
connection_config
|
|
253
|
-
)
|
|
254
|
-
)
|
|
255
|
-
continue
|
|
119
|
+
# Initialize the connection service
|
|
120
|
+
event_audit_service = EventAuditService(db)
|
|
121
|
+
connection_service = ConnectionService(db, event_audit_service)
|
|
256
122
|
|
|
123
|
+
for config in configs:
|
|
257
124
|
orig_data = config.model_dump(serialize_as_any=True, mode="json").copy()
|
|
258
|
-
config_dict = config.model_dump(serialize_as_any=True, exclude_unset=True)
|
|
259
|
-
config_dict.pop("saas_connector_type", None)
|
|
260
|
-
|
|
261
|
-
if existing_connection_config:
|
|
262
|
-
config_dict = {
|
|
263
|
-
key: value
|
|
264
|
-
for key, value in {
|
|
265
|
-
**existing_connection_config.__dict__,
|
|
266
|
-
**config.model_dump(serialize_as_any=True, exclude_unset=True),
|
|
267
|
-
}.items()
|
|
268
|
-
if isinstance(value, bool) or value
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
if system:
|
|
272
|
-
config_dict["system_id"] = system.id
|
|
273
125
|
|
|
274
126
|
try:
|
|
275
|
-
|
|
276
|
-
|
|
127
|
+
# Use the service to handle individual connection config processing
|
|
128
|
+
connection_response = connection_service.create_or_update_connection_config(
|
|
129
|
+
config, system
|
|
277
130
|
)
|
|
131
|
+
created_or_updated.append(connection_response)
|
|
278
132
|
|
|
279
|
-
# Automatically create a ManualTask if this is a connection config of type manual_task
|
|
280
|
-
# and it doesn't already have one
|
|
281
|
-
if (
|
|
282
|
-
connection_config.connection_type == ConnectionType.manual_task
|
|
283
|
-
and not connection_config.manual_task
|
|
284
|
-
):
|
|
285
|
-
ManualTask.create(
|
|
286
|
-
db=db,
|
|
287
|
-
data={
|
|
288
|
-
"task_type": ManualTaskType.privacy_request,
|
|
289
|
-
"parent_entity_id": connection_config.id,
|
|
290
|
-
"parent_entity_type": ManualTaskParentEntityType.connection_config,
|
|
291
|
-
},
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
created_or_updated.append(
|
|
295
|
-
ConnectionConfigurationResponse.model_validate(connection_config)
|
|
296
|
-
)
|
|
297
133
|
except KeyOrNameAlreadyExists as exc:
|
|
298
134
|
logger.warning(
|
|
299
135
|
"Create/update failed for connection config with key '{}': {}",
|
|
@@ -309,6 +145,29 @@ def patch_connection_configs(
|
|
|
309
145
|
data=orig_data,
|
|
310
146
|
)
|
|
311
147
|
)
|
|
148
|
+
except ConnectorTemplateNotFound as exc:
|
|
149
|
+
raise HTTPException(
|
|
150
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
151
|
+
detail=str(exc),
|
|
152
|
+
)
|
|
153
|
+
except ValidationError as e:
|
|
154
|
+
# The "input" potentially contains sensitive info and the Pydantic-specific "url" is not helpful
|
|
155
|
+
errors = e.errors(include_url=False, include_input=False)
|
|
156
|
+
for err in errors:
|
|
157
|
+
# Additionally, manually remove the context from the error message -
|
|
158
|
+
# this may contain sensitive information
|
|
159
|
+
err.pop("ctx", None)
|
|
160
|
+
|
|
161
|
+
raise HTTPException(
|
|
162
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
163
|
+
detail=jsonable_encoder(errors),
|
|
164
|
+
)
|
|
165
|
+
except ValueError as exc:
|
|
166
|
+
# Handle missing saas_connector_type and other validation errors
|
|
167
|
+
raise HTTPException(
|
|
168
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
169
|
+
detail=str(exc),
|
|
170
|
+
)
|
|
312
171
|
except Exception as e:
|
|
313
172
|
logger.warning(
|
|
314
173
|
"Create/update failed for connection config with key '{}'.", config.key
|
|
@@ -327,6 +186,12 @@ def patch_connection_configs(
|
|
|
327
186
|
# Check if possibly disabling a manual webhook here causes us to need to queue affected privacy requests
|
|
328
187
|
requeue_requires_input_requests(db)
|
|
329
188
|
|
|
189
|
+
logger.info(
|
|
190
|
+
"Completed bulk upsert for {} connection configuration(s): {} succeeded, {} failed",
|
|
191
|
+
len(configs),
|
|
192
|
+
len(created_or_updated),
|
|
193
|
+
len(failed),
|
|
194
|
+
)
|
|
330
195
|
return BulkPutConnectionConfiguration(
|
|
331
196
|
succeeded=created_or_updated,
|
|
332
197
|
failed=failed,
|
|
@@ -352,6 +217,12 @@ def delete_connection_config(db: Session, connection_key: FidesKey) -> None:
|
|
|
352
217
|
connection_config = get_connection_config_or_error(db, connection_key)
|
|
353
218
|
connection_type = connection_config.connection_type
|
|
354
219
|
logger.info("Deleting connection config with key '{}'.", connection_key)
|
|
220
|
+
|
|
221
|
+
# Initialize services for audit logging
|
|
222
|
+
event_audit_service = EventAuditService(db)
|
|
223
|
+
connection_service = ConnectionService(db, event_audit_service)
|
|
224
|
+
|
|
225
|
+
# Handle SaaS-specific cleanup
|
|
355
226
|
if connection_config.saas_config:
|
|
356
227
|
saas_dataset_fides_key = connection_config.saas_config.get("fides_key")
|
|
357
228
|
|
|
@@ -369,7 +240,8 @@ def delete_connection_config(db: Session, connection_key: FidesKey) -> None:
|
|
|
369
240
|
)
|
|
370
241
|
saas_dataset.delete(db) # type: ignore[union-attr]
|
|
371
242
|
|
|
372
|
-
|
|
243
|
+
# Use connection service to delete with audit logging
|
|
244
|
+
connection_service.delete_connection_config(connection_key)
|
|
373
245
|
|
|
374
246
|
# Access Manual Webhooks are cascade deleted if their ConnectionConfig is deleted,
|
|
375
247
|
# so we queue any privacy requests that are no longer blocked by webhooks
|
|
@@ -382,30 +254,42 @@ def connection_status(
|
|
|
382
254
|
) -> TestStatusMessage:
|
|
383
255
|
"""Connect, verify with a trivial query or API request, and report the status."""
|
|
384
256
|
|
|
385
|
-
|
|
257
|
+
event_audit_service = EventAuditService(db)
|
|
258
|
+
connection_service = ConnectionService(db, event_audit_service)
|
|
259
|
+
return connection_service.connection_status(connection_config, msg)
|
|
386
260
|
|
|
387
|
-
try:
|
|
388
|
-
status: Optional[ConnectionTestStatus] = connector.test_connection()
|
|
389
261
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
262
|
+
def update_connection_secrets(
|
|
263
|
+
connection_service: ConnectionService,
|
|
264
|
+
connection_key: FidesKey,
|
|
265
|
+
unvalidated_secrets: connection_secrets_schemas,
|
|
266
|
+
verify: Optional[bool],
|
|
267
|
+
merge_with_existing: Optional[bool] = False,
|
|
268
|
+
) -> TestStatusMessage:
|
|
269
|
+
try:
|
|
270
|
+
return connection_service.update_secrets(
|
|
271
|
+
connection_key, unvalidated_secrets, verify, merge_with_existing
|
|
272
|
+
)
|
|
273
|
+
except ConnectionNotFoundException:
|
|
274
|
+
raise HTTPException(
|
|
275
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
276
|
+
detail=f"No connection config found with key {connection_key}",
|
|
395
277
|
)
|
|
396
|
-
|
|
397
|
-
|
|
278
|
+
except SaaSConfigNotFoundException:
|
|
279
|
+
raise HTTPException(
|
|
280
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
281
|
+
detail=validate_secrets_error_message(),
|
|
398
282
|
)
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
283
|
+
except ValidationError as e:
|
|
284
|
+
errors = e.errors(include_url=False, include_input=False)
|
|
285
|
+
for err in errors:
|
|
286
|
+
# Additionally, manually remove the context from the error message -
|
|
287
|
+
# this may contain sensitive information
|
|
288
|
+
err.pop("ctx", None)
|
|
289
|
+
raise HTTPException(
|
|
290
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
291
|
+
detail=jsonable_encoder(errors),
|
|
403
292
|
)
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
return TestStatusMessage(
|
|
409
|
-
msg=msg,
|
|
410
|
-
test_status=status,
|
|
411
|
-
)
|
|
293
|
+
except FidesValidationError as e:
|
|
294
|
+
# Check if the exception has the original pydantic errors attached
|
|
295
|
+
raise HTTPException(status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message)
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import Any, Dict, Optional, Tuple
|
|
4
|
+
|
|
5
|
+
from fides.api.common_exceptions import NoSuchConnectionTypeSecretSchemaError
|
|
6
|
+
from fides.api.models.connectionconfig import ConnectionConfig
|
|
7
|
+
from fides.api.models.event_audit import EventAuditType
|
|
8
|
+
from fides.api.schemas.connection_configuration.connection_oauth_config import (
|
|
9
|
+
OAuthConfigSchema,
|
|
10
|
+
)
|
|
11
|
+
from fides.api.util.connection_type import get_connection_type_secret_schema
|
|
12
|
+
from fides.api.util.masking_util import mask_sensitive_fields
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def normalize_value(value: Any) -> Any:
|
|
16
|
+
"""
|
|
17
|
+
Normalize values for consistent comparison and serialization.
|
|
18
|
+
|
|
19
|
+
- Converts datetime objects to ISO strings
|
|
20
|
+
- Converts enums to their string values
|
|
21
|
+
- Converts lists of enums to lists of string values
|
|
22
|
+
- Treats None and empty strings as equivalent (both become None)
|
|
23
|
+
"""
|
|
24
|
+
# Treat None and empty strings as equivalent
|
|
25
|
+
if value == "" or value is None:
|
|
26
|
+
return None
|
|
27
|
+
if isinstance(value, datetime):
|
|
28
|
+
return value.isoformat()
|
|
29
|
+
if isinstance(value, Enum):
|
|
30
|
+
return value.value
|
|
31
|
+
if (
|
|
32
|
+
isinstance(value, list) and value and hasattr(value[0], "value")
|
|
33
|
+
): # List of enums
|
|
34
|
+
return [item.value for item in value]
|
|
35
|
+
return value
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _get_saas_connector_type(connection_config: ConnectionConfig) -> Optional[str]:
|
|
39
|
+
"""
|
|
40
|
+
Helper function to extract SaaS connector type from connection config.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
connection_config: The connection configuration
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
SaaS connector type if available, None otherwise
|
|
47
|
+
"""
|
|
48
|
+
connection_type = connection_config.connection_type.value # type: ignore[attr-defined]
|
|
49
|
+
if connection_type == "saas" and connection_config.saas_config:
|
|
50
|
+
try:
|
|
51
|
+
saas_config = connection_config.get_saas_config()
|
|
52
|
+
if saas_config:
|
|
53
|
+
return saas_config.type
|
|
54
|
+
except Exception:
|
|
55
|
+
# If SaaS config is invalid, try to get type directly from raw config
|
|
56
|
+
if (
|
|
57
|
+
isinstance(connection_config.saas_config, dict)
|
|
58
|
+
and "type" in connection_config.saas_config
|
|
59
|
+
):
|
|
60
|
+
return connection_config.saas_config["type"]
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _create_connection_event_details(
|
|
65
|
+
connection_config: ConnectionConfig,
|
|
66
|
+
operation_type: str,
|
|
67
|
+
changed_fields: Optional[set] = None,
|
|
68
|
+
) -> Dict[str, Any]:
|
|
69
|
+
"""
|
|
70
|
+
Create standardized event details for connection audit events.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
connection_config: The connection configuration
|
|
74
|
+
operation_type: Type of operation (create, update, delete)
|
|
75
|
+
changed_fields: Set of field names that changed (None means include all fields)
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
Standardized event details dictionary
|
|
79
|
+
"""
|
|
80
|
+
event_details: dict[str, Any] = {
|
|
81
|
+
"operation_type": operation_type,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# Define fields to exclude from audit details
|
|
85
|
+
excluded_fields = {
|
|
86
|
+
"id",
|
|
87
|
+
"created_at",
|
|
88
|
+
"updated_at",
|
|
89
|
+
"secrets",
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Dynamically add connection config fields (only changed fields if specified)
|
|
93
|
+
configuration_changes: dict[str, Any] = {}
|
|
94
|
+
for column in connection_config.__table__.columns:
|
|
95
|
+
field_name = column.name
|
|
96
|
+
if field_name not in excluded_fields:
|
|
97
|
+
# If changed_fields is specified, only include fields that changed
|
|
98
|
+
if changed_fields is not None and field_name not in changed_fields:
|
|
99
|
+
continue
|
|
100
|
+
|
|
101
|
+
value = getattr(connection_config, field_name)
|
|
102
|
+
|
|
103
|
+
configuration_changes[field_name] = normalize_value(value)
|
|
104
|
+
|
|
105
|
+
event_details["configuration_changes"] = configuration_changes
|
|
106
|
+
return event_details
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def generate_connection_audit_event_details(
|
|
110
|
+
event_type: EventAuditType,
|
|
111
|
+
connection_config: ConnectionConfig,
|
|
112
|
+
description: Optional[str] = None,
|
|
113
|
+
changed_fields: Optional[set] = None,
|
|
114
|
+
) -> Tuple[Dict[str, Any], str]:
|
|
115
|
+
"""
|
|
116
|
+
Create an audit event for connection operations.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
event_type: Type of audit event
|
|
120
|
+
connection_config: The connection configuration
|
|
121
|
+
description: Human-readable description
|
|
122
|
+
changed_fields: Set of field names that changed (None means include all fields)
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Created EventAudit instance
|
|
126
|
+
"""
|
|
127
|
+
# Determine operation type from event type
|
|
128
|
+
operation_type = event_type.value.split(".")[
|
|
129
|
+
-1
|
|
130
|
+
] # e.g., "created", "updated", "deleted"
|
|
131
|
+
|
|
132
|
+
# Create standardized event details
|
|
133
|
+
if operation_type == "deleted":
|
|
134
|
+
event_details = {
|
|
135
|
+
"operation_type": operation_type,
|
|
136
|
+
}
|
|
137
|
+
else:
|
|
138
|
+
event_details = _create_connection_event_details(
|
|
139
|
+
connection_config,
|
|
140
|
+
operation_type,
|
|
141
|
+
changed_fields,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# Generate description if not provided
|
|
145
|
+
connection_type = connection_config.connection_type.value # type: ignore[attr-defined]
|
|
146
|
+
connector_type = _get_saas_connector_type(connection_config)
|
|
147
|
+
|
|
148
|
+
description = f"Connection {operation_type}: {connector_type if connector_type else connection_type} connection '{connection_config.key}'"
|
|
149
|
+
|
|
150
|
+
return event_details, description
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def generate_connection_secrets_event_details(
|
|
154
|
+
event_type: EventAuditType,
|
|
155
|
+
connection_config: ConnectionConfig,
|
|
156
|
+
secrets_modified: Dict[str, Any],
|
|
157
|
+
) -> Tuple[Dict[str, Any], str]:
|
|
158
|
+
"""
|
|
159
|
+
Create an audit event for connection secrets operations.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
event_type: Type of audit event (should be a connection.secrets.* event)
|
|
163
|
+
connection_config: The connection configuration
|
|
164
|
+
secrets_modified: Dict of secret field names and values that were modified
|
|
165
|
+
changed_fields: Set of field names that changed (None means include all fields)
|
|
166
|
+
description: Human-readable description
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Created EventAudit instance
|
|
170
|
+
"""
|
|
171
|
+
# Determine operation type from event type
|
|
172
|
+
operation_type = event_type.value.split(".")[
|
|
173
|
+
-1
|
|
174
|
+
] # e.g., "created", "updated", "deleted"
|
|
175
|
+
|
|
176
|
+
# Mask the secrets using the existing masking utility
|
|
177
|
+
saas_config = connection_config.get_saas_config()
|
|
178
|
+
connection_type = connection_config.connection_type.value # type: ignore[attr-defined]
|
|
179
|
+
connection_type = (
|
|
180
|
+
saas_config.type
|
|
181
|
+
if connection_type == "saas" and saas_config
|
|
182
|
+
else connection_type
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# Get the secret schema for this connection type
|
|
186
|
+
try:
|
|
187
|
+
secret_schema = None
|
|
188
|
+
|
|
189
|
+
# For HTTPS connections with OAuth config, check if we should use OAuth schema
|
|
190
|
+
if connection_type == "https" and connection_config.oauth_config:
|
|
191
|
+
# Get OAuth fields dynamically from the schema
|
|
192
|
+
oauth_schema = OAuthConfigSchema.model_json_schema()
|
|
193
|
+
oauth_fields = set(oauth_schema.get("properties", {}).keys())
|
|
194
|
+
secrets_keys = set(secrets_modified.keys())
|
|
195
|
+
|
|
196
|
+
# If we're updating OAuth fields, use OAuth schema
|
|
197
|
+
if secrets_keys.intersection(oauth_fields):
|
|
198
|
+
secret_schema = oauth_schema
|
|
199
|
+
|
|
200
|
+
# If we haven't set a schema yet, use the connection type's secret schema
|
|
201
|
+
if secret_schema is None:
|
|
202
|
+
secret_schema = get_connection_type_secret_schema(
|
|
203
|
+
connection_type=connection_type
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
# Use existing masking function
|
|
207
|
+
masked_secrets = mask_sensitive_fields(secrets_modified, secret_schema)
|
|
208
|
+
except NoSuchConnectionTypeSecretSchemaError:
|
|
209
|
+
# if there is no schema, mask every secret
|
|
210
|
+
masked_secrets = {key: "**********" for key in secrets_modified}
|
|
211
|
+
|
|
212
|
+
# Create event details with masked secret values
|
|
213
|
+
event_details: dict[str, Any] = {
|
|
214
|
+
"secrets": masked_secrets,
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
# Add SaaS connector type if applicable
|
|
218
|
+
connector_type = _get_saas_connector_type(connection_config)
|
|
219
|
+
if connector_type:
|
|
220
|
+
event_details["saas_connector_type"] = connector_type
|
|
221
|
+
|
|
222
|
+
# Generate description
|
|
223
|
+
secret_names = ", ".join(secrets_modified) if secrets_modified else "secrets"
|
|
224
|
+
|
|
225
|
+
if connector_type:
|
|
226
|
+
description = f"Connection secrets {operation_type}: {connector_type} connection '{connection_config.key}' - {secret_names}"
|
|
227
|
+
else:
|
|
228
|
+
description = f"Connection secrets {operation_type}: {connection_type} connection '{connection_config.key}' - {secret_names}"
|
|
229
|
+
|
|
230
|
+
return event_details, description
|
|
@@ -165,7 +165,9 @@ def request_details(
|
|
|
165
165
|
|
|
166
166
|
if response is not None:
|
|
167
167
|
if CONFIG.dev_mode and response.content:
|
|
168
|
-
details[LoggerContextKeys.response.value] = response.content.decode(
|
|
168
|
+
details[LoggerContextKeys.response.value] = response.content.decode(
|
|
169
|
+
"utf-8", errors="replace"
|
|
170
|
+
)
|
|
169
171
|
|
|
170
172
|
details[LoggerContextKeys.status_code.value] = response.status_code
|
|
171
173
|
|