ethyca-fides 2.62.1b3__py2.py3-none-any.whl → 2.62.1rc1__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ethyca_fides-2.62.1b3.dist-info → ethyca_fides-2.62.1rc1.dist-info}/METADATA +1 -2
- {ethyca_fides-2.62.1b3.dist-info → ethyca_fides-2.62.1rc1.dist-info}/RECORD +229 -233
- fides/_version.py +3 -3
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +2 -2
- fides/api/db/base.py +0 -3
- fides/api/main.py +1 -0
- fides/api/models/attachment.py +10 -117
- fides/api/models/audit_log.py +3 -0
- fides/api/models/detection_discovery.py +1 -66
- fides/api/models/fides_user.py +4 -51
- fides/api/models/fides_user_permissions.py +7 -25
- fides/api/models/privacy_request/privacy_request.py +1 -40
- fides/api/oauth/roles.py +0 -19
- fides/api/service/connectors/query_configs/saas_query_config.py +8 -3
- fides/api/service/connectors/saas_connector.py +4 -7
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +2 -4
- fides/api/service/privacy_request/request_runner_service.py +18 -47
- fides/api/service/storage/s3.py +15 -40
- fides/api/tasks/storage.py +5 -6
- fides/api/util/storage_util.py +8 -14
- fides/common/api/scope_registry.py +0 -6
- fides/config/config_proxy.py +1 -0
- fides/config/execution_settings.py +4 -0
- fides/service/error_handling/__init__.py +0 -0
- fides/service/error_handling/error_handler.py +202 -0
- fides/service/messaging/aws_ses_service.py +5 -1
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/W6B1Xt1795h6VsbJCzmnd/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1327-92a38135ee8d55ec.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1817-721fdeb29c07c6be.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1904-7e5354990377a849.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{2310-6a5fb2f76f7b6491.js → 2310-0d63c66c2685e83c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3119-e441b14cdab4320e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3426-e49cb4766324b2dd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3513-293b1e54699cf3e7.js → 3513-87b54d931698986f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/355-e4340980d72b4faa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3872-99da5bb6140ff810.js → 3872-6b828cb00fb2ce93.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/4060-9593a3f98e600487.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4121-5c3af879cdd8b3be.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4481-8398edf74aabb8ea.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4723-4c3c7a375e998c15.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-e000d07844eccf7e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5487-218e4847b8250fbb.js → 5487-62955c11bab63734.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5626-1b636798faad78e1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5683-44966a05fa5ad566.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5826-ce34f25ac2eeb807.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5973-56d90405c3616068.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6277-c35c8cc806f7571f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6853-0cee00c9da26a40e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6954-04030a21a0c8cf5a.js → 6954-d02d474ba30756b2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/79-e5884e6878fc1bbb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7980-e17dda2f50ec76b8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9494-d1fd4fb83c3d4836.js → 9494-0df032fe6ee531a5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-74320abc2e9a4550.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-f1add6386651ca3d.js → _app-814e3d1cb7005cd4.js} +69 -69
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-1292fd216f2839c7.js → manual-7d789458fb296270.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2ffc37614e9d1fa9.js → multiple-90320455052466cd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a69f8946466471aa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-c8033d6560635046.js → add-vendors-bcc515a765c0119d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-49b9f1b56262dfdc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-fd71fb440dbe60e4.js → privacy-experience-5ef03041a530b0e2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-12f3ba4609bc2ba5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-5960170d492acb03.js → properties-ffa15d7ff64a9f05.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-b959d61c2a3682b3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-18e3faf7963962e4.js → [resourceUrn]-7ddf45ffd49533b0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-a10a0f3e6592f350.js → [projectUrn]-ecf23116a845188a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-6971531bb09dff3a.js → projects-79f8e613827c55c1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-7320524a47104798.js → [resourceUrn]-ed213bc1b7041aa2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-51d99174c8006eb5.js → resources-1f033ca5a0702018.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-4dbc71d8be9765f3.js → data-catalog-e950d41b75f86c85.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-84ead584a88ab662.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-90f1975f559fff3e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-4b820a3173f35504.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-db3853a09933097a.js → activity-beedbc38ee2b0094.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-4c526db0c30c488a.js → [resourceUrn]-f38b3ef885a29ea6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-6f27dbb7c8edc69d.js → detection-29fd0d5a73f13a00.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-562d2b8ae90dd1f0.js → [resourceUrn]-9a80241f1028c470.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-fe7f51502eda57c9.js → discovery-c58333981b1522c9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-3aaa99709d83a1f6.js → datamap-2d6f95b2769a0936.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-c08363922838022a.js → [...subfieldNames]-3536ae978741b659.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-f12df2140e309dfb.js → [collectionName]-8b5afe14cf42a4ac.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-3f564c8d6cfb03d4.js → [datasetId]-b8dca4298b5bb085.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-1e26702b1a7e0e12.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-1f0c4e2e5d0b5bf6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-b078218865a8fd28.js → [id]-ebf54ea9874c59ae.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-c39e8e2269883796.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-9db81467fa254996.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-2e6ba5382358fcf8.js → index-868b60407eae35da.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-ebc41649161f7fb9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-b89b9f68ccc69c1b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-71166bf207804754.js → messaging-5f41afae411cd8a4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-928430cd40c35ef2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-07ef58b04404479d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-595ed9f6ca438020.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-b3384299166bcd1e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-4a5e8ec41574c6b5.js → properties-f00530710b699afd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-6a6016708efb5f4f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-ba15c12c89ee10f8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-0f2daeec241bd1a2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-0401208a3128fa4d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-92e8246170b492b5.js → domain-records-0daa256958675a23.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-4fbab6716326060d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-b235f961f9ca39a6.js → organization-9404a6b0b2951992.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-99cd1a12ae0373b0.js → test-datasets-48be14ad09ed4133.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-01006a55ac873135.js → [id]-b03403fed4dd8805.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{systems-45990d85a4c5739b.js → systems-ae591953b24e2fc9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-913efe5371344de6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-dc11ba29dbd4708b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-c0b2113b44f46112.js +1 -0
- fides/ui-build/static/admin/_next/static/css/b89fc4b36b501cf6.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{1b227ba7eabbfe2f.css → c0c2eb63ad3e7390.css} +1 -1
- 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].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/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 +2 -2
- fides/ui-build/static/admin/lib/fides.js +2 -2
- 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/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.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.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.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/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/alembic/migrations/versions/2263583b0e44_add_shared_monitor_config.py +0 -82
- fides/api/alembic/migrations/versions/440a5b9a3493_add_fides_user_respondent_email_.py +0 -80
- fides/api/models/fides_user_respondent_email_verification.py +0 -112
- fides/ui-build/static/admin/_next/static/D-B-G-FV05_6iwXWBGS0J/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1327-da0303f70d12fb20.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-d2543e460cec0dcb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1904-25e5d4f1b8146fb3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3119-b5e40d8d24af1e79.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3426-77fccf2c9a5e10cd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3923-c6dcaeaa3267f254.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-a882199f6c94a4dc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4060-c657e58514e91e91.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4121-ec1d8faa3cf5783c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-9357e3930d35073b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5258-49e73e5998c01254.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5683-3d5c4194b1b1493e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-d776c0029db45971.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-db781b6c1dde3c84.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-348fe2ba132b400c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7553-0f3e9e7eaf1a8b62.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-d877d3bde220da44.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-7424eb6391142ccd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7980-041df432c4d3a68b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-f8ea7d0127f81294.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9965-92f4a28823a5e623.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-0234733a90ed5127.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-2ba21b95aa3bb15e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-5a63fc903408412e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-80bd51f8217edae4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-67ddc090cf949af4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-07ff657ee49e5742.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-dbc8c95c22b9f2aa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-157b00d23b651d12.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-9d29dd6cf109891d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b01f89d250ff52af.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-9fc15228581786e6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-43abc599f0768331.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-d69c9f1007e76046.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-fec150afcfeb3fb5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-2862630f0e9e484b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-35e58b5ed6b12b2b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-bb02092af39446da.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-6baa485385ce0678.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-707551df97d5eebd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-e4df123bef1ff2b1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-2fd6b0ff9b6741fc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-3a829c53d5d723d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-4194ce716b81480d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-ec739e169cd5eafe.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-603c2bdbd8dc00ca.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-592e497369673e1a.js +0 -1
- fides/ui-build/static/admin/_next/static/css/5ded47c57dae5baf.css +0 -1
- fides/ui-build/static/admin/poc/table-migration.html +0 -1
- {ethyca_fides-2.62.1b3.dist-info → ethyca_fides-2.62.1rc1.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.62.1b3.dist-info → ethyca_fides-2.62.1rc1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.62.1b3.dist-info → ethyca_fides-2.62.1rc1.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.62.1b3.dist-info → ethyca_fides-2.62.1rc1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{D-B-G-FV05_6iwXWBGS0J → W6B1Xt1795h6VsbJCzmnd}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1099-b652e6f9a0cd778b.js → 1099-98458e8e9ff67508.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1100-e19e94b0a6486255.js → 1100-4106d99f5e1ebd75.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-771dc5d9e95dc6b4.js → 2921-ca04a0476e2e56c5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3505-313087fc1744a0ca.js → 3505-e58b93f9c1cbdcad.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{69-ef4c11c574b4e6dd.js → 69-dc52e39d26a4ad14.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{8433-755359b501d32eaa.js → 8433-a77c2cd1c1a6887e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{8499-06ab15acbfec037c.js → 8499-34a34015c91fc38b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9327-b691be8352e31b58.js → 9327-a25347d72bfbe680.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-e868487119cd14fc.js → 404-c00773c4c6e930af.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-94391554a7607c5b.js → [id]-d4137bb7fdc1ac6e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-596dd2a35b455f21.js → [id]-a5a95ac63b1ce206.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-fa7f0d2639e12a5a.js → new-946ce1a2aa1500d4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-dd2a0e3b536b8b42.js → consent-7797e367dd946a18.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-111b07344f1ee9e4.js → [id]-22812f08e81bd4f3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-c41f368fb6b35de4.js → add-template-ca22869201847ccc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-3dabaf6828acb2cb.js → ant-components-173bd3ad45ea61c6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-784081c774042249.js → AntForm-4dfe984ad80927cd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-63905f2382f158cd.js → FormikAntFormItem-f790e1ea5cbc26c0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-43f6eab28eae7b56.js → FormikControlled-af9e682ec620e990.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-e4a07abc908fc9b5.js → FormikField-6ce407101daa6000.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-71a3bfb94280fc49.js → forms-9ee8cf14a93eaa4a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-42213855a0a8c209.js → configure-25a3add8e7982e43.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-d547a1da0b74f00f.js → [id]-081f13526443e0a6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-a7de6f8409a76358.js → add-property-17fb474e458b63e7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-704fc28e61b17247.js → about-177919b4ccf8f660.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-f0e9ee8756a65540.js → domains-26810d1ffedcd156.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-a4771098466af1ed.js → email-templates-eb78b645d0c1d4ea.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-8cff97fe57f42ed3.js → regulations-0a3aa951ef4a44ba.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-b124cc24b930c9e1.js → new-69176abe09cf9b52.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{webpack-3a61b934ba2fb620.js → webpack-abd3efcb23c0bb03.js} +0 -0
@@ -530,15 +530,11 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
530
530
|
|
531
531
|
session = Session.object_session(privacy_request)
|
532
532
|
masking_request = query_config.get_masking_request(session)
|
533
|
-
rows_updated = 0
|
534
|
-
|
535
533
|
if not masking_request:
|
536
|
-
|
537
|
-
"
|
538
|
-
|
539
|
-
self.saas_config.fides_key, # type: ignore
|
534
|
+
raise Exception(
|
535
|
+
f"Either no masking request configured or no valid masking request for {node.address.collection}. "
|
536
|
+
f"Check that MASKING_STRICT env var is appropriately set"
|
540
537
|
)
|
541
|
-
return rows_updated
|
542
538
|
|
543
539
|
self.set_saas_request_state(masking_request)
|
544
540
|
|
@@ -569,6 +565,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
569
565
|
cast(Optional[List[PostProcessorStrategy]], masking_request.postprocessors),
|
570
566
|
)
|
571
567
|
|
568
|
+
rows_updated = 0
|
572
569
|
client = self.create_client()
|
573
570
|
for row in rows:
|
574
571
|
try:
|
@@ -11,7 +11,7 @@ from jinja2 import Environment, FileSystemLoader
|
|
11
11
|
|
12
12
|
from fides.api.models.privacy_request import PrivacyRequest
|
13
13
|
from fides.api.schemas.policy import ActionType
|
14
|
-
from fides.api.util.storage_util import
|
14
|
+
from fides.api.util.storage_util import storage_json_encoder
|
15
15
|
|
16
16
|
DSR_DIRECTORY = Path(__file__).parent.resolve()
|
17
17
|
|
@@ -41,9 +41,7 @@ class DsrReportBuilder:
|
|
41
41
|
|
42
42
|
# Jinja template environment initialization
|
43
43
|
def pretty_print(value: str, indent: int = 4) -> str:
|
44
|
-
return json.dumps(
|
45
|
-
value, indent=indent, default=StorageJSONEncoder().default
|
46
|
-
)
|
44
|
+
return json.dumps(value, indent=indent, default=storage_json_encoder)
|
47
45
|
|
48
46
|
jinja2.filters.FILTERS["pretty_print"] = pretty_print
|
49
47
|
self.template_loader = Environment(
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import time
|
2
1
|
from datetime import datetime, timedelta
|
3
2
|
from typing import Any, Dict, List, Optional, Set, Tuple
|
4
3
|
|
@@ -68,7 +67,6 @@ from fides.api.tasks import DatabaseTask, celery_app
|
|
68
67
|
from fides.api.tasks.scheduled.scheduler import scheduler
|
69
68
|
from fides.api.util.collection_util import Row
|
70
69
|
from fides.api.util.logger import Pii, _log_exception, _log_warning
|
71
|
-
from fides.api.util.logger_context_utils import LoggerContextKeys, log_context
|
72
70
|
from fides.common.api.v1.urn_registry import (
|
73
71
|
PRIVACY_REQUEST_TRANSFER_TO_PARENT,
|
74
72
|
V1_URL_PREFIX,
|
@@ -202,11 +200,6 @@ def run_webhooks_and_report_status(
|
|
202
200
|
return True
|
203
201
|
|
204
202
|
|
205
|
-
@log_context(
|
206
|
-
capture_args={
|
207
|
-
"privacy_request_id": LoggerContextKeys.privacy_request_id,
|
208
|
-
}
|
209
|
-
)
|
210
203
|
def upload_access_results( # pylint: disable=R0912
|
211
204
|
session: Session,
|
212
205
|
policy: Policy,
|
@@ -217,7 +210,6 @@ def upload_access_results( # pylint: disable=R0912
|
|
217
210
|
fides_connector_datasets: Set[str],
|
218
211
|
) -> List[str]:
|
219
212
|
"""Process the data uploads after the access portion of the privacy request has completed"""
|
220
|
-
start_time = time.time()
|
221
213
|
download_urls: List[str] = []
|
222
214
|
if not access_result:
|
223
215
|
logger.info("No results returned for access request")
|
@@ -259,30 +251,12 @@ def upload_access_results( # pylint: disable=R0912
|
|
259
251
|
)
|
260
252
|
if download_url:
|
261
253
|
download_urls.append(download_url)
|
262
|
-
privacy_request.add_success_execution_log(
|
263
|
-
session,
|
264
|
-
connection_key=None,
|
265
|
-
dataset_name="Access Package Upload",
|
266
|
-
collection_name=None,
|
267
|
-
message="Access Package Upload successful for privacy request.",
|
268
|
-
action_type=ActionType.access,
|
269
|
-
)
|
270
|
-
logger.bind(
|
271
|
-
time_taken=time.time() - start_time,
|
272
|
-
).info("Access Package Upload successful for privacy request.")
|
273
254
|
except common_exceptions.StorageUploadError as exc:
|
274
|
-
logger.
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
privacy_request.add_error_execution_log(
|
280
|
-
session,
|
281
|
-
connection_key=None,
|
282
|
-
dataset_name="Access Package Upload",
|
283
|
-
collection_name=None,
|
284
|
-
message="Access Package Upload failed for privacy request.",
|
285
|
-
action_type=ActionType.access,
|
255
|
+
logger.error(
|
256
|
+
"Error uploading subject access data for rule {} on policy {}: {}",
|
257
|
+
rule.key,
|
258
|
+
policy.key,
|
259
|
+
Pii(str(exc)),
|
286
260
|
)
|
287
261
|
privacy_request.status = PrivacyRequestStatus.error
|
288
262
|
# Save the results we uploaded to the user for later retrieval
|
@@ -622,22 +596,19 @@ def run_privacy_request(
|
|
622
596
|
# If dev mode, log traceback
|
623
597
|
_log_exception(e, CONFIG.dev_mode)
|
624
598
|
return
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
privacy_request.status = PrivacyRequestStatus.complete
|
639
|
-
logger.info("Privacy request run completed.")
|
640
|
-
privacy_request.save(db=session)
|
599
|
+
privacy_request.finished_processing_at = datetime.utcnow()
|
600
|
+
AuditLog.create(
|
601
|
+
db=session,
|
602
|
+
data={
|
603
|
+
"user_id": "system",
|
604
|
+
"privacy_request_id": privacy_request.id,
|
605
|
+
"action": AuditLogAction.finished,
|
606
|
+
"message": "",
|
607
|
+
},
|
608
|
+
)
|
609
|
+
privacy_request.status = PrivacyRequestStatus.complete
|
610
|
+
logger.info("Privacy request run completed.")
|
611
|
+
privacy_request.save(db=session)
|
641
612
|
|
642
613
|
|
643
614
|
def initiate_privacy_request_completion_email(
|
fides/api/service/storage/s3.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from typing import IO, Any, Dict, Tuple
|
3
|
+
from typing import IO, Any, Dict, Tuple
|
4
4
|
|
5
5
|
from boto3.s3.transfer import TransferConfig
|
6
6
|
from botocore.exceptions import ClientError, ParamValidationError
|
@@ -129,38 +129,25 @@ def generic_retrieve_from_s3(
|
|
129
129
|
bucket_name: str,
|
130
130
|
file_key: str,
|
131
131
|
auth_method: str,
|
132
|
-
|
133
|
-
) -> Tuple[int, Union[str, bytes]]:
|
132
|
+
) -> Tuple[int, AnyHttpUrlString]:
|
134
133
|
"""
|
135
|
-
Retrieves
|
136
|
-
|
137
|
-
Args:
|
138
|
-
storage_secrets: Dictionary containing S3 credentials
|
139
|
-
bucket_name: Name of the S3 bucket
|
140
|
-
file_key: Key of the file in the bucket
|
141
|
-
auth_method: Authentication method to use
|
142
|
-
get_content: If True, returns the actual content instead of a presigned URL
|
134
|
+
Retrieves file metadata and generates a presigned URL for downloading an S3 object.
|
143
135
|
|
144
|
-
|
145
|
-
|
136
|
+
:param storage_secrets: S3 storage secrets
|
137
|
+
:param bucket_name: Name of the S3 bucket
|
138
|
+
:param file_key: Key of the file in the bucket
|
139
|
+
:param auth_method: Authentication method for S3
|
140
|
+
:return: Tuple containing (file_size, presigned_url)
|
146
141
|
"""
|
147
142
|
logger.info("Retrieving S3 object: {}", file_key)
|
148
|
-
s3_client = get_s3_client(auth_method, storage_secrets)
|
149
143
|
|
144
|
+
s3_client = maybe_get_s3_client(auth_method, storage_secrets)
|
150
145
|
try:
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
# Get presigned URL
|
158
|
-
presigned_url = create_presigned_url_for_s3(s3_client, bucket_name, file_key)
|
159
|
-
# Get file size
|
160
|
-
response = s3_client.head_object(Bucket=bucket_name, Key=file_key)
|
161
|
-
return int(response["ContentLength"]), str(presigned_url)
|
162
|
-
except ClientError as e:
|
163
|
-
logger.error(f"Error retrieving file from S3: {e}")
|
146
|
+
get_allowed_file_type_or_raise(file_key)
|
147
|
+
file_size = get_file_size(s3_client, bucket_name, file_key)
|
148
|
+
return file_size, create_presigned_url_for_s3(s3_client, bucket_name, file_key)
|
149
|
+
except Exception as e:
|
150
|
+
logger.error("Encountered error while retrieving S3 object: {}", e)
|
164
151
|
raise e
|
165
152
|
|
166
153
|
|
@@ -171,8 +158,7 @@ def generic_delete_from_s3(
|
|
171
158
|
auth_method: str,
|
172
159
|
) -> None:
|
173
160
|
"""
|
174
|
-
Deletes arbitrary data from s3
|
175
|
-
If file_key ends with a '/', deletes all objects with that prefix.
|
161
|
+
Deletes arbitrary data from s3
|
176
162
|
|
177
163
|
:param storage_secrets: S3 storage secrets
|
178
164
|
:param bucket_name: Name of the S3 bucket
|
@@ -183,17 +169,6 @@ def generic_delete_from_s3(
|
|
183
169
|
|
184
170
|
s3_client = maybe_get_s3_client(auth_method, storage_secrets)
|
185
171
|
try:
|
186
|
-
# If the file_key ends with a '/', it's a folder prefix
|
187
|
-
if file_key.endswith("/"):
|
188
|
-
# List all objects with the prefix, handling pagination
|
189
|
-
paginator = s3_client.get_paginator("list_objects_v2")
|
190
|
-
for page in paginator.paginate(Bucket=bucket_name, Prefix=file_key):
|
191
|
-
if "Contents" in page:
|
192
|
-
for obj in page["Contents"]:
|
193
|
-
s3_client.delete_object(Bucket=bucket_name, Key=obj["Key"])
|
194
|
-
return
|
195
|
-
|
196
|
-
# Delete single object
|
197
172
|
s3_client.delete_object(Bucket=bucket_name, Key=file_key)
|
198
173
|
except Exception as e:
|
199
174
|
logger.error("Encountered error while deleting s3 object: {}", e)
|
fides/api/tasks/storage.py
CHANGED
@@ -11,7 +11,6 @@ from botocore.exceptions import ClientError, ParamValidationError
|
|
11
11
|
from fideslang.validation import AnyHttpUrlString
|
12
12
|
from loguru import logger
|
13
13
|
|
14
|
-
from fides.api.common_exceptions import StorageUploadError
|
15
14
|
from fides.api.cryptography.cryptographic_util import bytes_to_b64_str
|
16
15
|
from fides.api.schemas.storage.storage import ResponseFormat, StorageSecrets
|
17
16
|
from fides.api.service.privacy_request.dsr_package.dsr_report_builder import (
|
@@ -31,7 +30,7 @@ from fides.api.util.cache import get_cache, get_encryption_cache_key
|
|
31
30
|
from fides.api.util.encryption.aes_gcm_encryption_scheme import (
|
32
31
|
encrypt_to_bytes_verify_secrets_length,
|
33
32
|
)
|
34
|
-
from fides.api.util.storage_util import
|
33
|
+
from fides.api.util.storage_util import storage_json_encoder
|
35
34
|
from fides.config import CONFIG
|
36
35
|
|
37
36
|
if TYPE_CHECKING:
|
@@ -76,7 +75,7 @@ def write_to_in_memory_buffer(
|
|
76
75
|
logger.debug("Writing data to in-memory buffer")
|
77
76
|
|
78
77
|
if resp_format == ResponseFormat.json.value:
|
79
|
-
json_str = json.dumps(data, indent=2, default=
|
78
|
+
json_str = json.dumps(data, indent=2, default=storage_json_encoder)
|
80
79
|
return BytesIO(
|
81
80
|
encrypt_access_request_results(json_str, privacy_request.id).encode(
|
82
81
|
CONFIG.security.encoding
|
@@ -161,9 +160,9 @@ def upload_to_s3( # pylint: disable=R0913
|
|
161
160
|
logger.error(
|
162
161
|
"Encountered error while uploading and generating link for s3 object: {}", e
|
163
162
|
)
|
164
|
-
raise
|
163
|
+
raise e
|
165
164
|
except ParamValidationError as e:
|
166
|
-
raise
|
165
|
+
raise ValueError(f"The parameters you provided are incorrect: {e}")
|
167
166
|
|
168
167
|
|
169
168
|
def upload_to_gcs(
|
@@ -206,7 +205,7 @@ def upload_to_gcs(
|
|
206
205
|
"Encountered error while uploading and generating link for Google Cloud Storage object: {}",
|
207
206
|
e,
|
208
207
|
)
|
209
|
-
raise
|
208
|
+
raise e
|
210
209
|
|
211
210
|
|
212
211
|
def upload_to_local(
|
fides/api/util/storage_util.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
from datetime import datetime
|
2
|
-
from typing import Any, Union
|
2
|
+
from typing import Any, Dict, Union
|
3
3
|
|
4
4
|
from bson import ObjectId
|
5
5
|
from pydantic import ValidationError
|
@@ -11,7 +11,6 @@ from fides.api.schemas.storage.storage import (
|
|
11
11
|
StorageType,
|
12
12
|
)
|
13
13
|
from fides.api.schemas.storage.storage_secrets_docs_only import possible_storage_secrets
|
14
|
-
from fides.api.util.custom_json_encoder import CustomJSONEncoder
|
15
14
|
|
16
15
|
|
17
16
|
def get_schema_for_secrets(
|
@@ -49,15 +48,10 @@ def get_schema_for_secrets(
|
|
49
48
|
raise ValueError(errors)
|
50
49
|
|
51
50
|
|
52
|
-
|
53
|
-
"""
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
if isinstance(o, datetime):
|
60
|
-
return o.strftime("%Y-%m-%dT%H:%M:%S")
|
61
|
-
if isinstance(o, ObjectId):
|
62
|
-
return {"$oid": str(o)}
|
63
|
-
return super().default(o)
|
51
|
+
def storage_json_encoder(field: Any) -> Union[str, Dict[str, str]]:
|
52
|
+
"""Specify str format for datetime objects"""
|
53
|
+
if isinstance(field, datetime):
|
54
|
+
return field.strftime("%Y-%m-%dT%H:%M:%S")
|
55
|
+
if isinstance(field, ObjectId):
|
56
|
+
return {"$oid": str(field)}
|
57
|
+
return field
|
@@ -37,7 +37,6 @@ EXEC = "exec"
|
|
37
37
|
FIDES_TAXONOMY = "fides_taxonomy"
|
38
38
|
GENERATE = "generate"
|
39
39
|
INSTANTIATE = "instantiate"
|
40
|
-
MANUAL_STEPS = "manual-steps"
|
41
40
|
MASKING = "masking"
|
42
41
|
MESSAGING = "messaging"
|
43
42
|
ORGANIZATION = "organization"
|
@@ -52,7 +51,6 @@ PRIVACY_REQUEST_NOTIFICATIONS = "privacy-request-notifications"
|
|
52
51
|
READ = "read"
|
53
52
|
REGISTER = "register"
|
54
53
|
RESET = "reset"
|
55
|
-
RESPOND = "respond"
|
56
54
|
RESUME = "resume"
|
57
55
|
REVIEW = "review"
|
58
56
|
RULE = "rule"
|
@@ -176,8 +174,6 @@ PRIVACY_PREFERENCE_HISTORY_READ = f"{PRIVACY_PREFERENCE_HISTORY}:{READ}"
|
|
176
174
|
PRIVACY_REQUEST_CALLBACK_RESUME = f"{PRIVACY_REQUEST}:{RESUME}" # User has permission to restart a paused privacy request
|
177
175
|
PRIVACY_REQUEST_CREATE = f"{PRIVACY_REQUEST}:{CREATE}"
|
178
176
|
PRIVACY_REQUEST_DELETE = f"{PRIVACY_REQUEST}:{DELETE}"
|
179
|
-
PRIVACY_REQUEST_MANUAL_STEPS_REVIEW = f"{PRIVACY_REQUEST}:{MANUAL_STEPS}:{REVIEW}"
|
180
|
-
PRIVACY_REQUEST_MANUAL_STEPS_RESPOND = f"{PRIVACY_REQUEST}:{MANUAL_STEPS}:{RESPOND}"
|
181
177
|
PRIVACY_REQUEST_NOTIFICATIONS_CREATE_OR_UPDATE = (
|
182
178
|
f"{PRIVACY_REQUEST_NOTIFICATIONS}:{CREATE_OR_UPDATE}"
|
183
179
|
)
|
@@ -316,8 +312,6 @@ SCOPE_DOCS = {
|
|
316
312
|
PRIVACY_REQUEST_CALLBACK_RESUME: "Restart paused privacy requests",
|
317
313
|
PRIVACY_REQUEST_READ_ACCESS_RESULTS: "Download access data for the privacy request",
|
318
314
|
PRIVACY_REQUEST_DELETE: "Remove privacy requests",
|
319
|
-
PRIVACY_REQUEST_MANUAL_STEPS_RESPOND: "Respond to manual steps for the privacy request",
|
320
|
-
PRIVACY_REQUEST_MANUAL_STEPS_REVIEW: "Review manual steps for the privacy request",
|
321
315
|
PRIVACY_REQUEST_NOTIFICATIONS_CREATE_OR_UPDATE: "",
|
322
316
|
PRIVACY_REQUEST_NOTIFICATIONS_READ: "",
|
323
317
|
PRIVACY_REQUEST_READ: "View privacy requests",
|
fides/config/config_proxy.py
CHANGED
@@ -106,6 +106,7 @@ class ExecutionSettingsProxy(ConfigProxyBase):
|
|
106
106
|
subject_identity_verification_required: bool
|
107
107
|
disable_consent_identity_verification: bool
|
108
108
|
require_manual_request_approval: bool
|
109
|
+
masking_strict: bool
|
109
110
|
|
110
111
|
def __getattribute__(self, name: str) -> Any:
|
111
112
|
"""
|
@@ -11,6 +11,10 @@ ENV_PREFIX = "FIDES__EXECUTION__"
|
|
11
11
|
class ExecutionSettings(FidesSettings):
|
12
12
|
"""Configuration settings for DSR execution."""
|
13
13
|
|
14
|
+
masking_strict: bool = Field(
|
15
|
+
default=True,
|
16
|
+
description="If set to True, only use UPDATE requests to mask data. If False, Fides will use any defined DELETE or GDPR DELETE endpoints to remove PII, which may extend beyond the specific data categories that configured in your execution policy.",
|
17
|
+
)
|
14
18
|
privacy_request_delay_timeout: int = Field(
|
15
19
|
default=3600,
|
16
20
|
description="The amount of time to wait for actions which delay privacy requests (e.g., pre- and post-processing webhooks).",
|
File without changes
|
@@ -0,0 +1,202 @@
|
|
1
|
+
from functools import wraps
|
2
|
+
from typing import Any, Callable, Optional, TypeVar
|
3
|
+
|
4
|
+
from fastapi import HTTPException
|
5
|
+
from loguru import logger
|
6
|
+
from starlette.status import HTTP_400_BAD_REQUEST, HTTP_422_UNPROCESSABLE_ENTITY
|
7
|
+
|
8
|
+
T = TypeVar("T")
|
9
|
+
|
10
|
+
|
11
|
+
class ErrorHandler:
|
12
|
+
"""Utility class for handling errors consistently throughout the application.
|
13
|
+
|
14
|
+
Usage Examples:
|
15
|
+
-----------------------------------------------------------------------------
|
16
|
+
|
17
|
+
1. Basic Validation:
|
18
|
+
```python
|
19
|
+
from fastapi import FastAPI
|
20
|
+
from fides.service.error_handling.error_handler import ErrorHandler
|
21
|
+
|
22
|
+
app = FastAPI()
|
23
|
+
|
24
|
+
@app.post("/users")
|
25
|
+
def create_user(age: int):
|
26
|
+
# Simple validation
|
27
|
+
ErrorHandler.validate(age >= 18, "User must be 18 or older")
|
28
|
+
return {"message": "User created"}
|
29
|
+
|
30
|
+
@app.get("/items/{item_id}")
|
31
|
+
def get_item(item_id: str):
|
32
|
+
# Direct error raising
|
33
|
+
if not item_id:
|
34
|
+
ErrorHandler.raise_error("Item ID is required", status_code=400)
|
35
|
+
return {"item_id": item_id}
|
36
|
+
```
|
37
|
+
|
38
|
+
2. Exception Handling Decorator:
|
39
|
+
```python
|
40
|
+
@app.post("/orders")
|
41
|
+
@ErrorHandler.handle_exceptions("Failed to create order")
|
42
|
+
def create_order(order_data: dict):
|
43
|
+
if not order_data.get("items"):
|
44
|
+
raise ValueError("Order must contain items")
|
45
|
+
# Process order...
|
46
|
+
return {"message": "Order created"}
|
47
|
+
|
48
|
+
@app.get("/products/{product_id}")
|
49
|
+
@ErrorHandler.handle_exceptions("Failed to fetch product", status_code=404)
|
50
|
+
def get_product(product_id: str):
|
51
|
+
product = database.get_product(product_id)
|
52
|
+
if not product:
|
53
|
+
raise ValueError("Product not found")
|
54
|
+
return product
|
55
|
+
```
|
56
|
+
|
57
|
+
3. Complex Validation:
|
58
|
+
```python
|
59
|
+
@app.post("/payments")
|
60
|
+
@ErrorHandler.handle_exceptions("Payment processing failed")
|
61
|
+
def process_payment(payment: dict):
|
62
|
+
# Validate amount
|
63
|
+
ErrorHandler.validate(
|
64
|
+
payment.get("amount", 0) > 0,
|
65
|
+
"Payment amount must be positive",
|
66
|
+
HTTP_400_BAD_REQUEST
|
67
|
+
)
|
68
|
+
|
69
|
+
# Validate currency
|
70
|
+
ErrorHandler.validate(
|
71
|
+
payment.get("currency") in ["USD", "EUR"],
|
72
|
+
"Invalid currency",
|
73
|
+
HTTP_400_BAD_REQUEST,
|
74
|
+
"Unsupported currency provided" # Optional log message
|
75
|
+
)
|
76
|
+
|
77
|
+
# Custom error for insufficient funds
|
78
|
+
if payment.get("amount", 0) > get_balance():
|
79
|
+
ErrorHandler.raise_error(
|
80
|
+
"Insufficient funds",
|
81
|
+
status_code=HTTP_400_BAD_REQUEST,
|
82
|
+
log_message="User attempted payment exceeding balance"
|
83
|
+
)
|
84
|
+
|
85
|
+
return {"status": "payment processed"}
|
86
|
+
```
|
87
|
+
|
88
|
+
4. Error Logging:
|
89
|
+
```python
|
90
|
+
@app.post("/imports")
|
91
|
+
@ErrorHandler.handle_exceptions("Import failed")
|
92
|
+
def import_data(data: dict):
|
93
|
+
try:
|
94
|
+
process_import(data)
|
95
|
+
except Exception as e:
|
96
|
+
# Log error with custom message before raising
|
97
|
+
ErrorHandler.raise_error(
|
98
|
+
"Import failed: invalid format",
|
99
|
+
status_code=400,
|
100
|
+
log_message=f"Import failed with error: {str(e)}"
|
101
|
+
)
|
102
|
+
return {"status": "import complete"}
|
103
|
+
```
|
104
|
+
|
105
|
+
Key Features:
|
106
|
+
- Simple validation with custom error messages
|
107
|
+
- Consistent error handling across endpoints
|
108
|
+
- Built-in error logging
|
109
|
+
- HTTP status code customization
|
110
|
+
- Exception handling decorator for common patterns
|
111
|
+
"""
|
112
|
+
|
113
|
+
@staticmethod
|
114
|
+
def raise_error(
|
115
|
+
detail: str,
|
116
|
+
status_code: int = HTTP_422_UNPROCESSABLE_ENTITY,
|
117
|
+
log_message: Optional[str] = None,
|
118
|
+
) -> None:
|
119
|
+
"""Raise an HTTPException with consistent logging.
|
120
|
+
|
121
|
+
Args:
|
122
|
+
detail: Error message to include in the HTTPException
|
123
|
+
status_code: HTTP status code to use (default: 422)
|
124
|
+
log_message: Optional message to log before raising the exception
|
125
|
+
|
126
|
+
Raises:
|
127
|
+
HTTPException: Always raised with the provided details
|
128
|
+
"""
|
129
|
+
if log_message:
|
130
|
+
logger.error(log_message)
|
131
|
+
raise HTTPException(status_code=status_code, detail=detail)
|
132
|
+
|
133
|
+
@staticmethod
|
134
|
+
def validate(
|
135
|
+
condition: bool,
|
136
|
+
detail: str,
|
137
|
+
status_code: int = HTTP_400_BAD_REQUEST,
|
138
|
+
log_message: Optional[str] = None,
|
139
|
+
) -> None:
|
140
|
+
"""Validate a condition and raise an error if it's False.
|
141
|
+
|
142
|
+
Args:
|
143
|
+
condition: The condition to check
|
144
|
+
detail: Error message if condition is False
|
145
|
+
status_code: HTTP status code to use if condition is False
|
146
|
+
log_message: Optional message to log before raising the exception
|
147
|
+
|
148
|
+
Raises:
|
149
|
+
HTTPException: If the condition is False
|
150
|
+
"""
|
151
|
+
if not condition:
|
152
|
+
ErrorHandler.raise_error(detail, status_code, log_message)
|
153
|
+
|
154
|
+
@classmethod
|
155
|
+
def handle_exceptions(
|
156
|
+
cls, error_message: str, status_code: int = HTTP_422_UNPROCESSABLE_ENTITY
|
157
|
+
) -> Callable[[Callable[..., T]], Callable[..., T]]:
|
158
|
+
"""Decorator to handle exceptions consistently.
|
159
|
+
|
160
|
+
Args:
|
161
|
+
error_message: Base error message to use
|
162
|
+
status_code: HTTP status code to use for unexpected errors
|
163
|
+
|
164
|
+
Returns:
|
165
|
+
Callable: The decorated function that handles exceptions
|
166
|
+
|
167
|
+
Note:
|
168
|
+
This decorator will catch specific exceptions and convert them to HTTPExceptions.
|
169
|
+
HTTPExceptions are re-raised as is, while other exceptions are wrapped with
|
170
|
+
additional context.
|
171
|
+
"""
|
172
|
+
|
173
|
+
def decorator(func: Callable[..., T]) -> Callable[..., T]:
|
174
|
+
@wraps(func)
|
175
|
+
def wrapper(*args: Any, **kwargs: Any) -> Optional[T]:
|
176
|
+
try:
|
177
|
+
return func(*args, **kwargs)
|
178
|
+
except HTTPException:
|
179
|
+
# Re-raise HTTP exceptions without modification
|
180
|
+
raise
|
181
|
+
except (ValueError, TypeError, AttributeError, KeyError) as e:
|
182
|
+
# Handle common validation and data access errors
|
183
|
+
cls.raise_error(
|
184
|
+
f"{error_message}: {str(e)}",
|
185
|
+
status_code,
|
186
|
+
f"{error_message}: {e}",
|
187
|
+
)
|
188
|
+
except Exception as e: # pylint: disable=broad-except
|
189
|
+
# Log unexpected errors with full context but present a sanitized message
|
190
|
+
logger.error(
|
191
|
+
f"Unexpected error in {func.__name__}: {str(e)}", exc_info=True
|
192
|
+
)
|
193
|
+
cls.raise_error(
|
194
|
+
f"{error_message}: An unexpected error occurred",
|
195
|
+
status_code,
|
196
|
+
f"{error_message}: Unexpected {type(e).__name__}",
|
197
|
+
)
|
198
|
+
return None # This line is never reached but satisfies the return type checker
|
199
|
+
|
200
|
+
return wrapper # type: ignore[return-value]
|
201
|
+
|
202
|
+
return decorator
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from typing import Any, Optional
|
2
2
|
|
3
|
+
from fides.api.models.property import CONFIG
|
3
4
|
from loguru import logger
|
4
5
|
|
5
6
|
from fides.api.models.messaging import MessagingConfig
|
@@ -86,7 +87,10 @@ class AWS_SES_Service:
|
|
86
87
|
aws_session = get_aws_session(
|
87
88
|
auth_method=self.messaging_config_secrets.auth_method.value,
|
88
89
|
storage_secrets=storage_secrets, # type: ignore[arg-type]
|
89
|
-
assume_role_arn=
|
90
|
+
assume_role_arn=CONFIG.credentials.get("notifications", {}).get(
|
91
|
+
"aws_ses_assume_role_arn"
|
92
|
+
)
|
93
|
+
or self.messaging_config_secrets.aws_assume_role_arn,
|
90
94
|
)
|
91
95
|
aws_ses_client = aws_session.client(
|
92
96
|
"ses", region_name=self.messaging_config_details.aws_region
|
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-814e3d1cb7005cd4.js" defer=""></script><script src="/_next/static/chunks/pages/404-c00773c4c6e930af.js" defer=""></script><script src="/_next/static/W6B1Xt1795h6VsbJCzmnd/_buildManifest.js" defer=""></script><script src="/_next/static/W6B1Xt1795h6VsbJCzmnd/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"W6B1Xt1795h6VsbJCzmnd","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|