ethyca-fides 2.71.2b0__py2.py3-none-any.whl → 2.72.0rc0__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.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/METADATA +1 -1
- {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/RECORD +239 -233
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +45 -12
- fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
- 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 +4 -0
- 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/models/detection_discovery/monitor_task.py +1 -0
- fides/api/models/digest/digest_execution.py +11 -1
- fides/api/models/event_audit.py +9 -0
- fides/api/models/messaging_template.py +7 -0
- fides/api/schemas/connection_configuration/connection_config.py +1 -30
- fides/api/schemas/messaging/messaging.py +15 -0
- fides/api/service/connectors/saas/connector_registry_service.py +1 -138
- fides/api/service/deps.py +8 -0
- fides/api/service/messaging/message_dispatch_service.py +38 -1
- 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/masking_util.py +31 -0
- fides/api/util/saas_config_updater.py +66 -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/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/SnBet3d7BrNVkglIl0ajl/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1437-fb699e9d69c3e325.js → 1437-b49af8562f54a625.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/155-dd7bf4b1acc077f6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1817-10b392e1dd9c4673.js → 1817-9e4a1b1897e9bf98.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2040-01d5edb1802d3482.js → 2040-68eb3a5d010c1e97.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2397-40506a386a3a469a.js → 2397-fc4d998dd825ec4d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3377-d0a01db227febac8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3696-259be222ea12392a.js → 3696-19767df579460115.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3700-12cb80d0f957fcc4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/401-3bcfbf738f028868.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-7474c764ea99f1ca.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5258-2d28b2c64acf5de3.js → 5258-f16177770ded638e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5279-21929b12c927b022.js → 5279-c00fe2f02fb0884a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5643-7583c1f8dbd83273.js → 5643-d43eaf754759827a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5783-55c0387508e50f3e.js → 5783-38508f27d73ce33d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-24790943a32f4310.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6315-2d4e86a32fc40458.js → 6315-8e75ebd641e72b64.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6853-cb15625a713b3ef9.js → 6853-a9bf7b1e3efc4890.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-50bacf2850b67baa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7245-0fb0a47c8d09b133.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-f25fce73eeb1f9c6.js → 7476-1ff6e16cd626c709.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7488-df17b592fbeaa1eb.js → 7488-d8dae51cdc7beded.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-e679419d1b9ccb40.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{8011-56031d82d5428981.js → 8011-4712e3cd2f4ac324.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{8373-7f940f5ac9c38b1f.js → 8373-d1e097f06ec2ee69.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9046-31b16a7e872c22be.js → 9046-4833f2609581dba5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9070-72f484137b9e8c01.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9330-cea1bf40f5d27e53.js → 9330-4e0809deb8798d22.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9682-2754256aeae141bb.js → 9682-38892cb66c7f95e3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9899-15530c468d5656a1.js → 9899-c643484881627fb2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9965-2236fd3e20e82310.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-9e869a44215709ed.js → _app-2e4cd4b7602e1bb3.js} +43 -43
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-dba951f9d47e999b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-42d903108bea604f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-f8ecba33126e0c25.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-224e9981280a4dc5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-144f4a5d20e97568.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-69b429a9d30ebaf1.js → projects-567785f8792366e1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-a53ef0161235ee47.js → data-catalog-bfd0c20e75b8b920.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b38ccd2e832e49f3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-98f2ad49cf056476.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-ace848575e688200.js → [monitorId]-ce9c88efaa0e1574.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-53ca31c50c43007f.js → action-center-ba88a4fb3040868b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-f87e4a0f664f4cde.js → activity-fe2bfdf0311bfef8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-db54d01fd8f6df50.js → new-a942e03888533e9d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-55d312af5228e098.js → dataset-cdc0702d27cf8c33.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-488beba62e832660.js → [id]-06012371d6895224.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-4aad5495f9bf81ce.js → new-206e6e6d1fe2410f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-8a2ba955d92d52ee.js → index-c67367086367c633.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-627a239ad9ee583c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-f69b04d3b4cf43b1.js → integrations-95e69be79db496a8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-f57a7e0fa0980ccd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-ffe085b4c4397507.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-6eaa901f9b870009.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-f5bce1ceb0502f04.js → FormikAntFormItem-4de259b097029614.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-90b4ea9f9deca6e2.js → FormikControlled-8b141c7922fa9ac7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-3bdf46d79cc0109f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-fe4ed3ad75151e36.js → [id]-3f0d46ca6f1b519f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-de681c2d022c9e0d.js → storage-8954850d483b26f3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-cd8ba2eef9085377.js → privacy-requests-454ebb8c7af36486.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-9981789c06a174a7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-c298a89b006c2646.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-91efbb5b334823a1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-ea9baf24de35d3b1.js → custom-fields-401ed29bd0c5df46.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-ee33c5de7339d7d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-33448bf0a1d53870.js → locations-787738296ba93cf2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-e93333bb5a79dc53.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c315036f1fc9f90.js → organization-7376fc65cbfa9fb4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-085834d81742e278.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-c6317160d10b8f29.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-cecea5832cb1f3b0.js → taxonomy-ea7e284bc31a4dc2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-726fbc0a34ffba1f.js → [id]-ba3b6d517ef5de22.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-df9b75ab01c1a2ea.js → user-management-ed8df757a8129298.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/80cba63bd8a9a6c7.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/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/data-explorer.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- 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/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- 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/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/messaging-providers/[key].html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers.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/ui-build/static/admin/_next/static/chunks/155-3d03f101c662c054.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3377-4c129258b4c4ea28.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3700-42976bfaad3b91c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-5270e3e23b08ab2b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5185-325e5435a0c7dcb7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-ca31d48a33202761.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-08b59d28d7a2a43b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7245-895bb7c6a6c797bc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-71582de0e818e28f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9070-13f237db78da586d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9965-54037b6c8f36d14b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-1c9cef80deccb15d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-4adeec3bcec05f7b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-4254abef7bb52edd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-8e76cbfaf71fdcb9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-93730a4316c0d980.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-f85f4f8fcf1bfbdb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-3619e454763dba09.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4580f70eb41b6a7d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-c7ba755c2e0e2377.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-f14bfd5890a0e939.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-e4274a4d5d23eea9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-520ba5ae02f47bda.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-764b6ce8e030d4a1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-da78452b3c41b29e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-6442e761ecb5c65a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-6f61d886aa6f5ce7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-776258bad0941a7d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-8067e12227210f48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-277ea1f34c3714cf.js +0 -1
- fides/ui-build/static/admin/_next/static/css/372d6a236c84613f.css +0 -1
- fides/ui-build/static/admin/_next/static/zmEQMSpOBih8kmA1t-EWO/_buildManifest.js +0 -1
- {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{zmEQMSpOBih8kmA1t-EWO → SnBet3d7BrNVkglIl0ajl}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1099-27b2d4e59a569b38.js → 1099-0b3dedca0b088f1a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1115-8fb5000847f73ec7.js → 1115-a124adb312fb2699.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-edfdffa353a611e4.js → 2921-d3e9c85cdd7c27ef.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3772-aa7beafe5df5e656.js → 3772-f110cd525aead279.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3923-fa1d71afc7dc9e6e.js → 3923-ae843be719d73ef4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4817-5f9b9c9bafe888f1.js → 4817-1ec683be64664576.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{549-c3b4c51f45a84a52.js → 549-9892a4d85bcbf7a2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7773-98d34d188ae0a694.js → 7773-fcd7875cd98f5f39.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{796-7944f684f8945506.js → 796-f3fc016814418a8b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9826-e71887e2c4283249.js → 9826-cbfbfc79b6841f08.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-2014144a1a0fa64f.js → 404-aa3982e4f51705df.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-4f3ba02774f27795.js → manual-a37865aa5cf14ea2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-f7bdc2da53137ffd.js → add-vendors-611f37b6e9031263.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-a27b220fe76bdc8e.js → configure-21123d6de9094ca2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-542fd4a4322122f1.js → [id]-5e5eae30956fea95.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-d31d1c233e94dc1f.js → [id]-13e4cc79e134b563.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ea057e6217993f9.js → new-ba8ee9f3b86763c3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-eb557180eded0abd.js → properties-1585e94b122004f3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-c64589e53338e59a.js → consent-35925fa8990ec083.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-8cd4d1d6ba000333.js → [projectUrn]-ca7f388ecd1601df.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-8c7103ebf01d6e6a.js → resources-c3a69a1d0d38cea7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-ae7a4c1c4eabc0d4.js → datamap-7e3e7bf39b111f66.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-179e5d09ccff50c1.js → [...subfieldNames]-a3f64d75bdfe8936.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-59466e5e238c59d0.js → [collectionName]-9fe2facc2f232fde.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-36d90c8c39fb0d1c.js → [datasetId]-fd69a9c224af3746.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-496ec7ecca8259dc.js → datastore-connection-5efe1b59a50befd8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-d6eed2dc5d27f625.js → [id]-ab70f1fad73df45f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-c7b43fa365f4be10.js → add-template-0f2238b930e6acd8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-d6043ae8dae6ef7d.js → FormikField-25d78a1dbaf785ed.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-b46f432b51421fae.js → table-migration-fc3e49b5ee4a4d23.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-04ebf2fb6fc4358a.js → configure-948e71f3cfbe304e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-f75a407d78857ab3.js → [id]-180bb94838bca304.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-975ff605e1dbc09c.js → add-property-719bbd424816ef58.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-e7fdf3a9a3e8c267.js → properties-ca707af08bca687a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-44d06e280990854d.js → domain-records-e57ee1a08caacb1b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-11148b182370fd83.js → email-templates-3fce669766a3d183.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-4a18d8135c0dbf2a.js → [key]-ad748b76b1cc69ba.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-41957281b8ec26b1.js → new-d962d09f6156484c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-00917525c9245a90.js → privacy-requests-bf97b87395719636.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-5d924b2f1f926b88.js → regulations-2c938cdf5915ff39.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-1a902922759cae76.js → [id]-62015f01f64578b2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-789f5ee80227c57b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{webpack-118fb4723d13c14f.js → webpack-119be8f042eb6b8b.js} +0 -0
fides/_version.py
CHANGED
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-10-
|
|
11
|
+
"date": "2025-10-09T10:22:06-0400",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.
|
|
14
|
+
"full-revisionid": "575604a24ea4839fcb584f4d7fc920dd0471d024",
|
|
15
|
+
"version": "2.72.0rc0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -17,19 +17,52 @@ depends_on = None
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def upgrade():
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
op.execute("ALTER TYPE executionlogstatus ADD VALUE 'polling'")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def downgrade():
|
|
24
|
+
# Remove any records that have the 'polling' enum value before dropping it
|
|
25
|
+
# Fallback to 'paused' (awaiting_processing) for backward compatibility
|
|
26
|
+
|
|
27
|
+
op.execute("UPDATE requesttask SET status = 'paused' WHERE status = 'polling'")
|
|
28
|
+
op.execute("UPDATE executionlog SET status = 'paused' WHERE status = 'polling'")
|
|
29
|
+
op.execute(
|
|
30
|
+
"UPDATE digest_task_execution SET status = 'paused' WHERE status = 'polling'"
|
|
31
|
+
)
|
|
32
|
+
op.execute("UPDATE monitortask SET status = 'paused' WHERE status = 'polling'")
|
|
33
|
+
op.execute(
|
|
34
|
+
"UPDATE monitortaskexecutionlog SET status = 'paused' WHERE status = 'polling'"
|
|
27
35
|
)
|
|
28
36
|
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
# Recreate the enum without the 'polling' value
|
|
38
|
+
op.execute("ALTER TYPE executionlogstatus RENAME TO executionlogstatus_old")
|
|
39
|
+
op.execute(
|
|
40
|
+
"CREATE TYPE executionlogstatus AS ENUM ("
|
|
41
|
+
"'in_processing', 'pending', 'complete', 'error', 'paused', 'retrying', 'skipped'"
|
|
42
|
+
")"
|
|
43
|
+
)
|
|
31
44
|
|
|
45
|
+
# Update all tables that use the enum type
|
|
46
|
+
op.execute(
|
|
47
|
+
"ALTER TABLE requesttask ALTER COLUMN status TYPE executionlogstatus USING "
|
|
48
|
+
"status::text::executionlogstatus"
|
|
49
|
+
)
|
|
50
|
+
op.execute(
|
|
51
|
+
"ALTER TABLE executionlog ALTER COLUMN status TYPE executionlogstatus USING "
|
|
52
|
+
"status::text::executionlogstatus"
|
|
53
|
+
)
|
|
54
|
+
op.execute(
|
|
55
|
+
"ALTER TABLE digest_task_execution ALTER COLUMN status TYPE executionlogstatus USING "
|
|
56
|
+
"status::text::executionlogstatus"
|
|
57
|
+
)
|
|
58
|
+
op.execute(
|
|
59
|
+
"ALTER TABLE monitortask ALTER COLUMN status TYPE executionlogstatus USING "
|
|
60
|
+
"status::text::executionlogstatus"
|
|
61
|
+
)
|
|
62
|
+
op.execute(
|
|
63
|
+
"ALTER TABLE monitortaskexecutionlog ALTER COLUMN status TYPE executionlogstatus USING "
|
|
64
|
+
"status::text::executionlogstatus"
|
|
65
|
+
)
|
|
32
66
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
pass
|
|
67
|
+
# Drop the old enum type
|
|
68
|
+
op.execute("DROP TYPE executionlogstatus_old")
|
|
@@ -24,6 +24,7 @@ from starlette.status import (
|
|
|
24
24
|
from fides.api.api import deps
|
|
25
25
|
from fides.api.models.connection_oauth_credentials import OAuthConfig
|
|
26
26
|
from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
|
|
27
|
+
from fides.api.models.event_audit import EventAuditType
|
|
27
28
|
from fides.api.oauth.utils import verify_oauth_client
|
|
28
29
|
from fides.api.schemas.connection_configuration import connection_secrets_schemas
|
|
29
30
|
from fides.api.schemas.connection_configuration.connection_config import (
|
|
@@ -40,13 +41,14 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
|
|
|
40
41
|
)
|
|
41
42
|
from fides.api.schemas.connection_configuration.enums.system_type import SystemType
|
|
42
43
|
from fides.api.schemas.connection_configuration.enums.test_status import TestStatus
|
|
44
|
+
from fides.api.service.deps import get_connection_service
|
|
43
45
|
from fides.api.util.api_router import APIRouter
|
|
44
46
|
from fides.api.util.connection_util import (
|
|
45
47
|
connection_status,
|
|
46
48
|
delete_connection_config,
|
|
47
49
|
get_connection_config_or_error,
|
|
48
50
|
patch_connection_configs,
|
|
49
|
-
|
|
51
|
+
update_connection_secrets,
|
|
50
52
|
)
|
|
51
53
|
from fides.common.api.scope_registry import (
|
|
52
54
|
CONNECTION_CREATE_OR_UPDATE,
|
|
@@ -61,6 +63,8 @@ from fides.common.api.v1.urn_registry import (
|
|
|
61
63
|
CONNECTIONS,
|
|
62
64
|
V1_URL_PREFIX,
|
|
63
65
|
)
|
|
66
|
+
from fides.service.connection.connection_service import ConnectionService
|
|
67
|
+
from fides.service.event_audit_service import EventAuditService
|
|
64
68
|
|
|
65
69
|
router = APIRouter(tags=["Connections"], prefix=V1_URL_PREFIX)
|
|
66
70
|
|
|
@@ -220,28 +224,6 @@ def delete_connection(
|
|
|
220
224
|
delete_connection_config(db, connection_key)
|
|
221
225
|
|
|
222
226
|
|
|
223
|
-
def validate_and_update_secrets(
|
|
224
|
-
connection_key: FidesKey,
|
|
225
|
-
connection_config: ConnectionConfig,
|
|
226
|
-
db: Session,
|
|
227
|
-
unvalidated_secrets: connection_secrets_schemas,
|
|
228
|
-
verify: Optional[bool],
|
|
229
|
-
) -> TestStatusMessage:
|
|
230
|
-
connection_config.secrets = validate_secrets(
|
|
231
|
-
db, unvalidated_secrets, connection_config
|
|
232
|
-
).model_dump(mode="json")
|
|
233
|
-
# Save validated secrets, regardless of whether they've been verified.
|
|
234
|
-
logger.info("Updating connection config secrets for '{}'", connection_key)
|
|
235
|
-
connection_config.save(db=db)
|
|
236
|
-
|
|
237
|
-
msg = f"Secrets updated for ConnectionConfig with key: {connection_key}."
|
|
238
|
-
|
|
239
|
-
if verify:
|
|
240
|
-
return connection_status(connection_config, msg, db)
|
|
241
|
-
|
|
242
|
-
return TestStatusMessage(msg=msg, test_status=None)
|
|
243
|
-
|
|
244
|
-
|
|
245
227
|
@router.put(
|
|
246
228
|
CONNECTION_SECRETS,
|
|
247
229
|
status_code=HTTP_200_OK,
|
|
@@ -251,7 +233,7 @@ def validate_and_update_secrets(
|
|
|
251
233
|
def put_connection_config_secrets(
|
|
252
234
|
connection_key: FidesKey,
|
|
253
235
|
*,
|
|
254
|
-
|
|
236
|
+
connection_service: ConnectionService = Depends(get_connection_service),
|
|
255
237
|
unvalidated_secrets: connection_secrets_schemas,
|
|
256
238
|
verify: Optional[bool] = True,
|
|
257
239
|
) -> TestStatusMessage:
|
|
@@ -261,10 +243,8 @@ def put_connection_config_secrets(
|
|
|
261
243
|
The specific secrets will be connection-dependent. For example, the components needed to connect to a Postgres DB
|
|
262
244
|
will differ from Dynamo DB.
|
|
263
245
|
"""
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
return validate_and_update_secrets(
|
|
267
|
-
connection_key, connection_config, db, unvalidated_secrets, verify
|
|
246
|
+
return update_connection_secrets(
|
|
247
|
+
connection_service, connection_key, unvalidated_secrets, verify
|
|
268
248
|
)
|
|
269
249
|
|
|
270
250
|
|
|
@@ -277,7 +257,7 @@ def put_connection_config_secrets(
|
|
|
277
257
|
def patch_connection_config_secrets(
|
|
278
258
|
connection_key: FidesKey,
|
|
279
259
|
*,
|
|
280
|
-
|
|
260
|
+
connection_service: ConnectionService = Depends(get_connection_service),
|
|
281
261
|
unvalidated_secrets: connection_secrets_schemas,
|
|
282
262
|
verify: Optional[bool] = True,
|
|
283
263
|
) -> TestStatusMessage:
|
|
@@ -287,22 +267,12 @@ def patch_connection_config_secrets(
|
|
|
287
267
|
The specific secrets will be connection-dependent. For example, the components needed to connect to a Postgres DB
|
|
288
268
|
will differ from Dynamo DB.
|
|
289
269
|
"""
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
if existing_secrets:
|
|
297
|
-
patched_secrets = {**existing_secrets}
|
|
298
|
-
|
|
299
|
-
patched_secrets = {
|
|
300
|
-
**patched_secrets,
|
|
301
|
-
**unvalidated_secrets, # type: ignore[dict-item]
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
return validate_and_update_secrets(
|
|
305
|
-
connection_key, connection_config, db, patched_secrets, verify # type: ignore[arg-type]
|
|
270
|
+
return update_connection_secrets(
|
|
271
|
+
connection_service,
|
|
272
|
+
connection_key,
|
|
273
|
+
unvalidated_secrets,
|
|
274
|
+
verify,
|
|
275
|
+
merge_with_existing=True,
|
|
306
276
|
)
|
|
307
277
|
|
|
308
278
|
|
|
@@ -354,6 +324,16 @@ def put_connection_oauth_config(
|
|
|
354
324
|
)
|
|
355
325
|
connection_config.save(db=db)
|
|
356
326
|
|
|
327
|
+
event_audit_service = EventAuditService(db)
|
|
328
|
+
connection_service = ConnectionService(db, event_audit_service)
|
|
329
|
+
|
|
330
|
+
# Create secrets audit event for OAuth credential changes
|
|
331
|
+
connection_service.create_secrets_audit_event(
|
|
332
|
+
EventAuditType.connection_secrets_updated,
|
|
333
|
+
connection_config,
|
|
334
|
+
oauth_config.model_dump(exclude_unset=True), # The OAuth secrets being updated
|
|
335
|
+
)
|
|
336
|
+
|
|
357
337
|
msg = (
|
|
358
338
|
f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
|
|
359
339
|
)
|
|
@@ -455,6 +435,19 @@ def patch_connection_oauth_config(
|
|
|
455
435
|
detail="Invalid OAuth2 configuration.",
|
|
456
436
|
) from exc
|
|
457
437
|
|
|
438
|
+
# Create audit event for OAuth config update (OAuth credentials are secrets)
|
|
439
|
+
event_audit_service = EventAuditService(db)
|
|
440
|
+
connection_service = ConnectionService(db, event_audit_service)
|
|
441
|
+
|
|
442
|
+
# Create secrets audit event for OAuth credential changes
|
|
443
|
+
connection_service.create_secrets_audit_event(
|
|
444
|
+
EventAuditType.connection_secrets_updated,
|
|
445
|
+
connection_config,
|
|
446
|
+
validated_config.model_dump(
|
|
447
|
+
exclude_unset=True
|
|
448
|
+
), # The OAuth secrets being updated
|
|
449
|
+
)
|
|
450
|
+
|
|
458
451
|
msg = (
|
|
459
452
|
f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
|
|
460
453
|
)
|
|
@@ -3,10 +3,12 @@ from typing import Optional
|
|
|
3
3
|
from zipfile import BadZipFile, ZipFile
|
|
4
4
|
|
|
5
5
|
from fastapi import Body, Depends, HTTPException, Request
|
|
6
|
+
from fastapi.encoders import jsonable_encoder
|
|
6
7
|
from fastapi.params import Security
|
|
7
8
|
from fastapi.responses import JSONResponse
|
|
8
9
|
from fideslang.validation import FidesKey
|
|
9
10
|
from loguru import logger
|
|
11
|
+
from pydantic import ValidationError
|
|
10
12
|
from sqlalchemy.orm import Session
|
|
11
13
|
from starlette.status import (
|
|
12
14
|
HTTP_200_OK,
|
|
@@ -18,9 +20,15 @@ from starlette.status import (
|
|
|
18
20
|
)
|
|
19
21
|
|
|
20
22
|
from fides.api.api import deps
|
|
21
|
-
from fides.api.common_exceptions import
|
|
23
|
+
from fides.api.common_exceptions import (
|
|
24
|
+
FidesopsException,
|
|
25
|
+
KeyOrNameAlreadyExists,
|
|
26
|
+
SaaSConfigNotFoundException,
|
|
27
|
+
)
|
|
28
|
+
from fides.api.common_exceptions import ValidationError as FidesValidationError
|
|
22
29
|
from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
|
|
23
30
|
from fides.api.models.datasetconfig import DatasetConfig
|
|
31
|
+
from fides.api.models.event_audit import EventAuditStatus, EventAuditType
|
|
24
32
|
from fides.api.models.sql_models import System # type: ignore
|
|
25
33
|
from fides.api.oauth.utils import verify_oauth_client
|
|
26
34
|
from fides.api.schemas.connection_configuration.connection_config import (
|
|
@@ -29,7 +37,6 @@ from fides.api.schemas.connection_configuration.connection_config import (
|
|
|
29
37
|
from fides.api.schemas.connection_configuration.saas_config_template_values import (
|
|
30
38
|
SaasConnectionTemplateValues,
|
|
31
39
|
)
|
|
32
|
-
from fides.api.schemas.saas.connector_template import ConnectorTemplate
|
|
33
40
|
from fides.api.schemas.saas.saas_config import (
|
|
34
41
|
SaaSConfig,
|
|
35
42
|
SaaSConfigValidationDetails,
|
|
@@ -42,13 +49,11 @@ from fides.api.service.authentication.authentication_strategy_oauth2_authorizati
|
|
|
42
49
|
OAuth2AuthorizationCodeAuthenticationStrategy,
|
|
43
50
|
)
|
|
44
51
|
from fides.api.service.connectors.saas.connector_registry_service import (
|
|
45
|
-
ConnectorRegistry,
|
|
46
52
|
CustomConnectorTemplateLoader,
|
|
47
|
-
create_connection_config_from_template_no_save,
|
|
48
|
-
upsert_dataset_config_from_template,
|
|
49
53
|
)
|
|
50
54
|
from fides.api.util.api_router import APIRouter
|
|
51
|
-
from fides.api.util.connection_util import
|
|
55
|
+
from fides.api.util.connection_util import validate_secrets_error_message
|
|
56
|
+
from fides.api.util.event_audit_util import generate_connection_audit_event_details
|
|
52
57
|
from fides.common.api.scope_registry import (
|
|
53
58
|
CONNECTION_AUTHORIZE,
|
|
54
59
|
CONNECTOR_TEMPLATE_REGISTER,
|
|
@@ -59,13 +64,17 @@ from fides.common.api.scope_registry import (
|
|
|
59
64
|
)
|
|
60
65
|
from fides.common.api.v1.urn_registry import (
|
|
61
66
|
AUTHORIZE,
|
|
62
|
-
CONNECTION_TYPES,
|
|
63
67
|
REGISTER_CONNECTOR_TEMPLATE,
|
|
64
68
|
SAAS_CONFIG,
|
|
65
69
|
SAAS_CONFIG_VALIDATE,
|
|
66
70
|
SAAS_CONNECTOR_FROM_TEMPLATE,
|
|
67
71
|
V1_URL_PREFIX,
|
|
68
72
|
)
|
|
73
|
+
from fides.service.connection.connection_service import (
|
|
74
|
+
ConnectionService,
|
|
75
|
+
ConnectorTemplateNotFound,
|
|
76
|
+
)
|
|
77
|
+
from fides.service.event_audit_service import EventAuditService
|
|
69
78
|
|
|
70
79
|
router = APIRouter(tags=["SaaS Configs"], prefix=V1_URL_PREFIX)
|
|
71
80
|
|
|
@@ -168,12 +177,29 @@ def patch_saas_config(
|
|
|
168
177
|
Given a SaaS config element, update the corresponding ConnectionConfig object
|
|
169
178
|
or report failure
|
|
170
179
|
"""
|
|
180
|
+
|
|
171
181
|
logger.info(
|
|
172
182
|
"Updating SaaS config '{}' on connection config '{}'",
|
|
173
183
|
saas_config.fides_key,
|
|
174
184
|
connection_config.key,
|
|
175
185
|
)
|
|
176
186
|
connection_config.update_saas_config(db, saas_config=saas_config)
|
|
187
|
+
|
|
188
|
+
# Create audit event for SaaS config update
|
|
189
|
+
event_audit_service = EventAuditService(db)
|
|
190
|
+
event_details, description = generate_connection_audit_event_details(
|
|
191
|
+
EventAuditType.connection_updated,
|
|
192
|
+
connection_config=connection_config,
|
|
193
|
+
)
|
|
194
|
+
event_audit_service.create_event_audit(
|
|
195
|
+
event_type=EventAuditType.connection_updated,
|
|
196
|
+
status=EventAuditStatus.succeeded,
|
|
197
|
+
resource_type="connection_config",
|
|
198
|
+
resource_identifier=connection_config.key,
|
|
199
|
+
description=description,
|
|
200
|
+
event_details=event_details,
|
|
201
|
+
)
|
|
202
|
+
|
|
177
203
|
return connection_config.saas_config # type: ignore
|
|
178
204
|
|
|
179
205
|
|
|
@@ -305,59 +331,45 @@ def instantiate_connection(
|
|
|
305
331
|
Looks up the connector type in the SaaS connector registry and, if all required
|
|
306
332
|
fields are provided, persists the associated connection config and dataset to the database.
|
|
307
333
|
"""
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
status_code=HTTP_404_NOT_FOUND,
|
|
314
|
-
detail=f"SaaS connector type '{saas_connector_type}' is not yet available in Fidesops. For a list of available SaaS connectors, refer to {CONNECTION_TYPES}.",
|
|
334
|
+
event_audit_service = EventAuditService(db)
|
|
335
|
+
connection_service = ConnectionService(db, event_audit_service)
|
|
336
|
+
try:
|
|
337
|
+
connection_config, dataset_config = connection_service.instantiate_connection(
|
|
338
|
+
saas_connector_type, template_values, system
|
|
315
339
|
)
|
|
316
|
-
|
|
317
|
-
if DatasetConfig.filter(
|
|
318
|
-
db=db,
|
|
319
|
-
conditions=(DatasetConfig.fides_key == template_values.instance_key), # type: ignore[arg-type]
|
|
320
|
-
).count():
|
|
340
|
+
except ConnectorTemplateNotFound as exc:
|
|
321
341
|
raise HTTPException(
|
|
322
|
-
status_code=
|
|
323
|
-
detail=f"
|
|
324
|
-
)
|
|
325
|
-
|
|
326
|
-
try:
|
|
327
|
-
connection_config: ConnectionConfig = (
|
|
328
|
-
create_connection_config_from_template_no_save(
|
|
329
|
-
db, connector_template, template_values
|
|
330
|
-
)
|
|
342
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
343
|
+
detail=f"{exc.args[0]}",
|
|
331
344
|
)
|
|
332
345
|
except KeyOrNameAlreadyExists as exc:
|
|
333
346
|
raise HTTPException(
|
|
334
347
|
status_code=HTTP_400_BAD_REQUEST,
|
|
335
348
|
detail=exc.args[0],
|
|
336
349
|
)
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
if system:
|
|
342
|
-
connection_config.system_id = system.id
|
|
343
|
-
connection_config.save(db=db) # Not persisted to db until secrets are validated
|
|
344
|
-
|
|
345
|
-
try:
|
|
346
|
-
dataset_config: DatasetConfig = upsert_dataset_config_from_template(
|
|
347
|
-
db, connection_config, connector_template, template_values
|
|
350
|
+
except SaaSConfigNotFoundException:
|
|
351
|
+
raise HTTPException(
|
|
352
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
353
|
+
detail=validate_secrets_error_message(),
|
|
348
354
|
)
|
|
349
|
-
except
|
|
350
|
-
|
|
355
|
+
except FidesValidationError as e:
|
|
356
|
+
# Check if the exception has the original pydantic errors attached
|
|
357
|
+
raise HTTPException(status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message)
|
|
358
|
+
except ValidationError as e:
|
|
359
|
+
errors = e.errors(include_url=False, include_input=False)
|
|
360
|
+
for err in errors:
|
|
361
|
+
# Additionally, manually remove the context from the error message -
|
|
362
|
+
# this may contain sensitive information
|
|
363
|
+
err.pop("ctx", None)
|
|
364
|
+
raise HTTPException(
|
|
365
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
366
|
+
detail=jsonable_encoder(errors),
|
|
367
|
+
)
|
|
368
|
+
except Exception as exc:
|
|
351
369
|
raise HTTPException(
|
|
352
370
|
status_code=HTTP_500_INTERNAL_SERVER_ERROR,
|
|
353
|
-
detail=f"
|
|
371
|
+
detail=f"{exc.args[0]}",
|
|
354
372
|
)
|
|
355
|
-
logger.info(
|
|
356
|
-
"SaaS Connector and Dataset {} successfully created from '{}' template.",
|
|
357
|
-
template_values.instance_key,
|
|
358
|
-
saas_connector_type,
|
|
359
|
-
)
|
|
360
|
-
|
|
361
373
|
return SaasConnectionTemplateResponse(
|
|
362
374
|
connection=connection_config, dataset=dataset_config.ctl_dataset
|
|
363
375
|
)
|
|
@@ -30,7 +30,7 @@ from fides.api.db.system import (
|
|
|
30
30
|
upsert_system,
|
|
31
31
|
validate_privacy_declarations,
|
|
32
32
|
)
|
|
33
|
-
from fides.api.models.connectionconfig import ConnectionConfig
|
|
33
|
+
from fides.api.models.connectionconfig import ConnectionConfig
|
|
34
34
|
from fides.api.models.fides_user import FidesUser
|
|
35
35
|
from fides.api.models.sql_models import System # type:ignore[attr-defined]
|
|
36
36
|
from fides.api.oauth.roles import APPROVER
|
|
@@ -57,14 +57,12 @@ from fides.api.schemas.system import (
|
|
|
57
57
|
BasicSystemResponse,
|
|
58
58
|
SystemResponse,
|
|
59
59
|
)
|
|
60
|
-
from fides.api.service.deps import get_system_service
|
|
60
|
+
from fides.api.service.deps import get_connection_service, get_system_service
|
|
61
61
|
from fides.api.util.api_router import APIRouter
|
|
62
62
|
from fides.api.util.connection_util import (
|
|
63
|
-
connection_status,
|
|
64
63
|
delete_connection_config,
|
|
65
|
-
get_connection_config_or_error,
|
|
66
64
|
patch_connection_configs,
|
|
67
|
-
|
|
65
|
+
update_connection_secrets,
|
|
68
66
|
)
|
|
69
67
|
from fides.common.api.scope_registry import (
|
|
70
68
|
CONNECTION_CREATE_OR_UPDATE,
|
|
@@ -81,6 +79,7 @@ from fides.common.api.v1.urn_registry import (
|
|
|
81
79
|
SYSTEM_CONNECTIONS,
|
|
82
80
|
V1_URL_PREFIX,
|
|
83
81
|
)
|
|
82
|
+
from fides.service.connection.connection_service import ConnectionService
|
|
84
83
|
from fides.service.system.system_service import SystemService
|
|
85
84
|
|
|
86
85
|
SYSTEM_ROUTER = APIRouter(tags=["System"], prefix=f"{V1_URL_PREFIX}/system")
|
|
@@ -160,6 +159,7 @@ def patch_connection_secrets(
|
|
|
160
159
|
db: Session = Depends(deps.get_db),
|
|
161
160
|
unvalidated_secrets: connection_secrets_schemas,
|
|
162
161
|
verify: Optional[bool] = True,
|
|
162
|
+
connection_service: ConnectionService = Depends(get_connection_service),
|
|
163
163
|
) -> TestStatusMessage:
|
|
164
164
|
"""
|
|
165
165
|
Patch secrets that will be used to connect to a specified connection_type.
|
|
@@ -169,45 +169,13 @@ def patch_connection_secrets(
|
|
|
169
169
|
"""
|
|
170
170
|
|
|
171
171
|
system = get_system(db, fides_key)
|
|
172
|
-
|
|
173
|
-
|
|
172
|
+
return update_connection_secrets(
|
|
173
|
+
connection_service,
|
|
174
|
+
system.connection_configs.key,
|
|
175
|
+
unvalidated_secrets,
|
|
176
|
+
verify,
|
|
177
|
+
merge_with_existing=True,
|
|
174
178
|
)
|
|
175
|
-
# Inserts unchanged sensitive values. The FE does not send masked values sensitive secrets.
|
|
176
|
-
if connection_config.secrets is not None:
|
|
177
|
-
for key, value in connection_config.secrets.items():
|
|
178
|
-
if key not in unvalidated_secrets:
|
|
179
|
-
# unvalidated_secrets is actually a dictionary here. connection_secrets_schemas
|
|
180
|
-
# are just provided for documentation but the data was not parsed up front.
|
|
181
|
-
# That happens below in validate_secrets.
|
|
182
|
-
unvalidated_secrets[key] = value # type: ignore
|
|
183
|
-
else:
|
|
184
|
-
connection_config.secrets = {}
|
|
185
|
-
|
|
186
|
-
validated_secrets = validate_secrets(
|
|
187
|
-
db, unvalidated_secrets, connection_config
|
|
188
|
-
).model_dump(mode="json")
|
|
189
|
-
|
|
190
|
-
for key, value in validated_secrets.items():
|
|
191
|
-
connection_config.secrets[key] = value # type: ignore
|
|
192
|
-
|
|
193
|
-
# Deauthorize an OAuth connection when the secrets are updated. This is necessary because
|
|
194
|
-
# the existing access tokens may not be valid anymore. This only applies to SaaS connection
|
|
195
|
-
# configurations that use the "oauth2_authorization_code" authentication strategy.
|
|
196
|
-
if (
|
|
197
|
-
connection_config.authorized
|
|
198
|
-
and connection_config.connection_type == ConnectionType.saas
|
|
199
|
-
):
|
|
200
|
-
del connection_config.secrets["access_token"]
|
|
201
|
-
|
|
202
|
-
# Save validated secrets, regardless of whether they've been verified.
|
|
203
|
-
logger.info("Updating connection config secrets for '{}'", connection_config.key)
|
|
204
|
-
connection_config.save(db=db)
|
|
205
|
-
|
|
206
|
-
msg = f"Secrets updated for ConnectionConfig with key: {connection_config.key}."
|
|
207
|
-
if verify:
|
|
208
|
-
return connection_status(connection_config, msg, db)
|
|
209
|
-
|
|
210
|
-
return TestStatusMessage(msg=msg, test_status=None)
|
|
211
179
|
|
|
212
180
|
|
|
213
181
|
@SYSTEM_CONNECTIONS_ROUTER.delete(
|
|
@@ -36,7 +36,7 @@ from fides.api.models.fides_user import FidesUser
|
|
|
36
36
|
from fides.api.models.fides_user_invite import FidesUserInvite
|
|
37
37
|
from fides.api.models.fides_user_permissions import FidesUserPermissions
|
|
38
38
|
from fides.api.models.sql_models import System # type: ignore[attr-defined]
|
|
39
|
-
from fides.api.oauth.roles import APPROVER, VIEWER
|
|
39
|
+
from fides.api.oauth.roles import APPROVER, EXTERNAL_RESPONDENT, VIEWER
|
|
40
40
|
from fides.api.oauth.utils import (
|
|
41
41
|
create_temporary_user_for_login_flow,
|
|
42
42
|
extract_payload,
|
|
@@ -608,6 +608,7 @@ def get_users(
|
|
|
608
608
|
db: Session = Depends(get_db),
|
|
609
609
|
params: Params = Depends(),
|
|
610
610
|
username: Optional[str] = None,
|
|
611
|
+
include_external: bool = True,
|
|
611
612
|
client: ClientDetail = Security(verify_user_read_scopes),
|
|
612
613
|
authorization: str = Security(oauth2_scheme),
|
|
613
614
|
) -> AbstractPage[FidesUser]:
|
|
@@ -625,6 +626,12 @@ def get_users(
|
|
|
625
626
|
# User has USER_READ scope, can see all users
|
|
626
627
|
if username:
|
|
627
628
|
query = query.filter(FidesUser.username.ilike(f"%{escape_like(username)}%"))
|
|
629
|
+
|
|
630
|
+
# Filter out external respondents if include_external is False
|
|
631
|
+
if not include_external:
|
|
632
|
+
query = query.join(FidesUserPermissions).filter(
|
|
633
|
+
~FidesUserPermissions.roles.op("@>")([EXTERNAL_RESPONDENT])
|
|
634
|
+
)
|
|
628
635
|
else:
|
|
629
636
|
# User has USER_READ_OWN scope, only show their own data
|
|
630
637
|
query = query.filter(FidesUser.id == client.user_id)
|
fides/api/app_setup.py
CHANGED
|
@@ -39,9 +39,6 @@ from fides.api.oauth.system_manager_oauth_util import (
|
|
|
39
39
|
verify_oauth_client_for_system_from_request_body_cli,
|
|
40
40
|
)
|
|
41
41
|
from fides.api.oauth.utils import get_root_client, verify_oauth_client_prod
|
|
42
|
-
from fides.api.service.connectors.saas.connector_registry_service import (
|
|
43
|
-
update_saas_configs,
|
|
44
|
-
)
|
|
45
42
|
|
|
46
43
|
# pylint: disable=wildcard-import, unused-wildcard-import
|
|
47
44
|
from fides.api.service.saas_request.override_implementations import *
|
|
@@ -55,6 +52,7 @@ from fides.api.util.rate_limit import (
|
|
|
55
52
|
fides_limiter,
|
|
56
53
|
is_rate_limit_enabled,
|
|
57
54
|
)
|
|
55
|
+
from fides.api.util.saas_config_updater import update_saas_configs
|
|
58
56
|
from fides.config import CONFIG
|
|
59
57
|
from fides.config.config_proxy import ConfigProxy
|
|
60
58
|
|
fides/api/common_exceptions.py
CHANGED
|
@@ -406,3 +406,7 @@ class MonitorConfigNotFoundException(BaseException):
|
|
|
406
406
|
|
|
407
407
|
class MissingNamespaceSchemaException(BaseException):
|
|
408
408
|
"""Attempting to use namespace fides_meta without specifying the schema to validate it."""
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
class ConnectionNotFoundException(BaseException):
|
|
412
|
+
"""ConnectionConfig could not be found"""
|
|
@@ -9,6 +9,7 @@ from fides.api.email_templates.template_names import (
|
|
|
9
9
|
CONSENT_REQUEST_VERIFICATION_TEMPLATE,
|
|
10
10
|
EMAIL_ERASURE_REQUEST_FULFILLMENT,
|
|
11
11
|
EXTERNAL_USER_WELCOME,
|
|
12
|
+
MANUAL_TASK_DIGEST,
|
|
12
13
|
PRIVACY_REQUEST_COMPLETE_ACCESS_TEMPLATE,
|
|
13
14
|
PRIVACY_REQUEST_COMPLETE_DELETION_TEMPLATE,
|
|
14
15
|
PRIVACY_REQUEST_ERROR_NOTIFICATION_TEMPLATE,
|
|
@@ -59,6 +60,8 @@ def get_email_template( # pylint: disable=too-many-return-statements, too-many-
|
|
|
59
60
|
return template_env.get_template(USER_INVITE)
|
|
60
61
|
if action_type == MessagingActionType.EXTERNAL_USER_WELCOME:
|
|
61
62
|
return template_env.get_template(EXTERNAL_USER_WELCOME)
|
|
63
|
+
if action_type == MessagingActionType.MANUAL_TASK_DIGEST:
|
|
64
|
+
return template_env.get_template(MANUAL_TASK_DIGEST)
|
|
62
65
|
|
|
63
66
|
logger.error("No corresponding template linked to the {}", action_type)
|
|
64
67
|
raise EmailTemplateUnhandledActionType(
|