ethyca-fides 2.69.3b0__py2.py3-none-any.whl → 2.69.3b2__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.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/METADATA +1 -1
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/RECORD +267 -239
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
- fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
- fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
- fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
- fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
- fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
- fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
- fides/api/api/v1/endpoints/system.py +140 -55
- fides/api/db/base.py +3 -0
- fides/api/db/seed.py +34 -0
- fides/api/main.py +2 -0
- fides/api/models/asset.py +3 -0
- fides/api/models/detection_discovery/web_monitor.py +61 -0
- fides/api/models/event_audit.py +68 -0
- fides/api/models/messaging.py +30 -10
- fides/api/models/sql_models.py +8 -0
- fides/api/models/system_group.py +85 -0
- fides/api/models/taxonomy.py +16 -4
- fides/api/schemas/application_config.py +4 -1
- fides/api/schemas/messaging/messaging.py +33 -66
- fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
- fides/api/schemas/messaging/shared_schemas.py +102 -0
- fides/api/schemas/saas/saas_config.py +2 -17
- fides/api/schemas/saas/strategy_configuration.py +12 -0
- fides/api/schemas/system.py +8 -0
- fides/api/service/async_dsr/async_dsr_service.py +130 -10
- fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
- fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
- fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
- fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
- fides/api/service/connectors/saas_connector.py +25 -7
- fides/api/service/deps.py +17 -2
- fides/api/service/messaging/message_dispatch_service.py +16 -15
- fides/api/service/messaging/messaging_crud_service.py +5 -9
- fides/api/service/privacy_request/request_runner_service.py +18 -0
- fides/api/service/privacy_request/request_service.py +29 -20
- fides/api/service/strategy.py +6 -3
- fides/api/task/graph_task.py +1 -2
- fides/api/tasks/__init__.py +1 -0
- fides/api/util/filter_utils.py +0 -3
- fides/api/worker/__init__.py +2 -0
- fides/common/api/v1/urn_registry.py +2 -1
- fides/service/event_audit_service.py +115 -0
- fides/service/messaging/aws_ses_service.py +2 -4
- fides/service/system/__init__.py +0 -0
- fides/service/system/system_service.py +138 -0
- fides/service/taxonomy/taxonomy_service.py +49 -3
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/86A8z6OnbTuDYww0DJkX0/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1115-d5a834cdaa717edc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/155-b5e4370b158e5ee3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1817-dc2bba3ca736d39e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1841-2052c3239f2a0a1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2040-3f9c66c56a05b336.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2751-58285ccf50a0ba4b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3377-c5e0cc3de1a5ffd1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3696-fff4f944d7d5ff20.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-8377b3fcbb3d93b0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-4786ccbe7c6f65b0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/409-e1deab19fc7e6d99.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4230-c55d5531697a715c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4608-2fbc3389681f6924.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4786-8d78ec773d171562.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-a219b390ef17ff4b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5309-e994c5195f99b1eb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5783-c62c79e7be21be73.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6084-29cbe703bffdccfe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6416-79eee298a5b3f80f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6780-eeb7775eb21d7a12.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-91a8641cd2784b54.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6882-55dbb142f7c40f53.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-6dfafd38b02d5852.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7476-3da7a490debad8e2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7630-22f9c4b25d6aed29.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7725-b2fa93d747d3d85d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7929-4314e317b1717257.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/796-8e4da90ae82dfebb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8002-78d78545309b2c1c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8373-bd50fa53cbcab2aa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9046-0f92802b0e3382a9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9226-49dbcdb135bf9793.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9826-f316eb1d61cb90b6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-c389c51ca6353035.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-c780470042750062.js} +10 -10
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-fb9434d926ebf0b3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-92034daafd2187a0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-87919c1192e68b1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-ae8a64fffe3f8c66.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-d7d9ff9ed28fa790.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-c985ea8c1a0e0550.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-ddf6ba92355f81de.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-35c0ae9d5b5a940c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-6a196c704f1c6dd7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-06ba907e7d91a724.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-9cee4e222ebb2b60.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-f99af5669b9ab44c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-db7f1a269d3e7fc2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-de957913f9b47daa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-5868591ff1e5f881.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-715064e1c9788e1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-9ae81f5c245b8a01.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-6537c93c69b597c7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-5db26067d921a94a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-9f6a62614d7eb113.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-aed0e6dafc143b97.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-72b9878ea9b91529.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-f36a46381a6c25d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b653fd60e7db989b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5bb96c8684a38bbf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-639046f6c76bc8bd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-6bf117315d909ad1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-1e2fa11f22dbc449.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-c55e3e0e19030f3f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/index-d66ea87b457af21e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-0159fbb2e0440709.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-267d2742fffaebe5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-670b05b03ba11e0a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-482a7256925a6e06.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-331147598052f25c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-28083bfb2dec7b9f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-e02dc4b4b385c86f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-74c2a0ff4c992633.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-7459d56e548925b2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-aed018025b09c045.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-7f2c50044806c094.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-e8cab942d09aa358.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-128f952a49a0e8dc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-cca3d1a26e1269bb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-07e1b9937a169e32.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-3bc799dac8423f50.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-9f36b6c213ae524c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-f8887b2b29aed1b9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-5473558807e94462.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-1065fbefd449719c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3e23d92d789fff99.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-907bfbb71d84646f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-aa1ada4d4ac09759.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-02b0dde03a1ad159.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-4a6ef2509e8cedfc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-16b122b83e57bb8c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-6304dad2c5fab694.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-0a8ec3aa2ed59a33.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-4036b023366b7eec.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.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].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/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.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 -0
- fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -0
- fides/ui-build/static/admin/settings/messaging-providers.html +1 -0
- 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/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5258-e880b606a2293803.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9826-dbae8dee941a7fac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-dfd71c1e9c458b89.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7cdc42ec5493b83d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-5d40db1ce8810e1d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
- fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → 86A8z6OnbTuDYww0DJkX0}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-cdc7a13973f4a0ba.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-db57401384d1de8f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-4e56e924f35317f2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-e4a1f93a7ce944f0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-a4f821c4902f2df8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-96245b63aafc5168.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-4fea66e59bd59de8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-c8038e05f35da8d1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-f3a40101a8f3fd00.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-965af6c1fd01334e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-5afecf141308bfc5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-4352e55f110556b4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-c533120e94e049e3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-b14f5f38b2d711a8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-31d51e3b9227c8d5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-8794a0d2e7554a05.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-90b31073e478c99c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-0a6859a0225b7e00.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-eb0552917907fe21.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-b2a2a084d8cfe22d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-0c944cfa9c6acbff.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-f0f0ea35d0185ae3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{webpack-678e89d68dbcd94f.js → webpack-55e1c55932df2413.js} +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
1
|
from typing import Any, Dict, List, Optional, Set, Union
|
|
3
2
|
|
|
4
3
|
from fideslang.models import FidesCollectionKey, FidesDatasetReference
|
|
@@ -69,7 +68,7 @@ class Strategy(BaseModel):
|
|
|
69
68
|
"""General shape for swappable strategies (ex: auth, processors, pagination, etc.)"""
|
|
70
69
|
|
|
71
70
|
strategy: str
|
|
72
|
-
configuration: Dict[str, Any]
|
|
71
|
+
configuration: Optional[Dict[str, Any]] = None
|
|
73
72
|
|
|
74
73
|
|
|
75
74
|
class ClientConfig(BaseModel):
|
|
@@ -90,20 +89,6 @@ class QueryParam(BaseModel):
|
|
|
90
89
|
value: Union[int, str]
|
|
91
90
|
|
|
92
91
|
|
|
93
|
-
class AsyncStrategy(Enum):
|
|
94
|
-
"""Async strategies: supports callback for now, but could be
|
|
95
|
-
extended to polling as well in the future"""
|
|
96
|
-
|
|
97
|
-
callback = "callback"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
class AsyncConfig(BaseModel):
|
|
101
|
-
"""Async config only has strategy for now, but could be
|
|
102
|
-
extended with other configuration options when we add polling"""
|
|
103
|
-
|
|
104
|
-
strategy: AsyncStrategy
|
|
105
|
-
|
|
106
|
-
|
|
107
92
|
class SaaSRequest(BaseModel):
|
|
108
93
|
"""
|
|
109
94
|
A single request with static or dynamic path, headers, query, and body params.
|
|
@@ -126,7 +111,7 @@ class SaaSRequest(BaseModel):
|
|
|
126
111
|
grouped_inputs: Optional[List[str]] = []
|
|
127
112
|
ignore_errors: Optional[Union[bool, List[int]]] = False
|
|
128
113
|
rate_limit_config: Optional[RateLimitConfig] = None
|
|
129
|
-
async_config: Optional[
|
|
114
|
+
async_config: Optional[Strategy] = None
|
|
130
115
|
skip_missing_param_values: Optional[bool] = (
|
|
131
116
|
False # Skip instead of raising an exception if placeholders can't be populated in body
|
|
132
117
|
)
|
|
@@ -178,3 +178,15 @@ class OAuth2ClientCredentialsConfiguration(OAuth2BaseConfiguration):
|
|
|
178
178
|
"""
|
|
179
179
|
|
|
180
180
|
refresh_request: Optional[SaaSRequest] = Field(exclude=True)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class PollingAsyncDSRConfiguration(StrategyConfiguration):
|
|
184
|
+
"""
|
|
185
|
+
Configuration for polling async DSR requests.
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
status_request: SaaSRequest
|
|
189
|
+
status_path: str
|
|
190
|
+
status_completed_value: Optional[str] = None
|
|
191
|
+
result_request: SaaSRequest
|
|
192
|
+
result_path: str
|
fides/api/schemas/system.py
CHANGED
|
@@ -2,6 +2,7 @@ from datetime import datetime
|
|
|
2
2
|
from typing import Any, Dict, List, Optional, Sequence
|
|
3
3
|
|
|
4
4
|
from fideslang.models import PrivacyDeclaration, System
|
|
5
|
+
from fideslang.validation import FidesKey
|
|
5
6
|
from pydantic import ConfigDict, Field
|
|
6
7
|
from pydantic.main import BaseModel
|
|
7
8
|
|
|
@@ -61,3 +62,10 @@ class SystemHistoryResponse(BaseModel):
|
|
|
61
62
|
after: Dict[str, Any]
|
|
62
63
|
created_at: datetime
|
|
63
64
|
model_config = ConfigDict(from_attributes=True)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class AssignStewardRequest(BaseModel):
|
|
68
|
+
"""Request schema for assigning a data steward to one or more systems."""
|
|
69
|
+
|
|
70
|
+
data_steward: str
|
|
71
|
+
system_keys: List[FidesKey]
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
|
|
1
3
|
from loguru import logger
|
|
2
4
|
from sqlalchemy.orm import Session
|
|
3
5
|
|
|
@@ -5,7 +7,22 @@ from fides.api.common_exceptions import PrivacyRequestError
|
|
|
5
7
|
from fides.api.models.connectionconfig import ConnectionConfig
|
|
6
8
|
from fides.api.models.datasetconfig import DatasetConfig
|
|
7
9
|
from fides.api.models.privacy_request import PrivacyRequest, RequestTask
|
|
10
|
+
from fides.api.models.worker_task import ExecutionLogStatus
|
|
11
|
+
from fides.api.schemas.policy import ActionType
|
|
8
12
|
from fides.api.schemas.privacy_request import PrivacyRequestStatus
|
|
13
|
+
from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
|
|
14
|
+
from fides.api.service.async_dsr.async_dsr_strategy_polling import (
|
|
15
|
+
PollingAsyncDSRStrategy,
|
|
16
|
+
)
|
|
17
|
+
from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
|
|
18
|
+
from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
|
|
19
|
+
from fides.api.service.connectors.saas_connector import SaaSConnector
|
|
20
|
+
from fides.api.task.execute_request_tasks import (
|
|
21
|
+
create_graph_task,
|
|
22
|
+
log_task_queued,
|
|
23
|
+
queue_request_task,
|
|
24
|
+
)
|
|
25
|
+
from fides.api.task.graph_task import GraphTask
|
|
9
26
|
from fides.api.task.task_resources import TaskResources
|
|
10
27
|
|
|
11
28
|
|
|
@@ -16,6 +33,9 @@ def requeue_polling_request(
|
|
|
16
33
|
"""Re-queue a Privacy request that polls async tasks for a given privacy request"""
|
|
17
34
|
# Check that the privacy request is approved or in processing
|
|
18
35
|
privacy_request: PrivacyRequest = async_task.privacy_request
|
|
36
|
+
logger.info(
|
|
37
|
+
f"Privacy request {privacy_request.id} status: {privacy_request.status.value}"
|
|
38
|
+
)
|
|
19
39
|
|
|
20
40
|
if privacy_request.status not in [
|
|
21
41
|
PrivacyRequestStatus.approved,
|
|
@@ -41,16 +61,23 @@ def requeue_polling_request(
|
|
|
41
61
|
async_task,
|
|
42
62
|
db,
|
|
43
63
|
) as resources:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
64
|
+
graph_task: GraphTask = create_graph_task(db, async_task, resources)
|
|
65
|
+
|
|
66
|
+
saas_connector: SaaSConnector = graph_task.connector # type: ignore
|
|
67
|
+
saas_connector.set_privacy_request_state(
|
|
68
|
+
privacy_request,
|
|
69
|
+
graph_task.execution_node,
|
|
70
|
+
async_task,
|
|
71
|
+
)
|
|
72
|
+
query_config: SaaSQueryConfig = saas_connector.query_config(
|
|
73
|
+
graph_task.execution_node
|
|
74
|
+
) # type: ignore
|
|
75
|
+
if async_task.action_type == ActionType.access:
|
|
76
|
+
logger.info(f"Executing read polling requests for {async_task.id}")
|
|
77
|
+
|
|
78
|
+
execute_read_polling_requests(db, async_task, query_config, saas_connector)
|
|
79
|
+
elif async_task.action_type == ActionType.erasure:
|
|
80
|
+
execute_erasure_polling_requests(db, async_task, query_config)
|
|
54
81
|
|
|
55
82
|
|
|
56
83
|
def get_connection_config_from_task(
|
|
@@ -64,6 +91,7 @@ def get_connection_config_from_task(
|
|
|
64
91
|
raise PrivacyRequestError(
|
|
65
92
|
f"DatasetConfig with fides_key {request_task.dataset_name} not found."
|
|
66
93
|
)
|
|
94
|
+
|
|
67
95
|
connection_config = ConnectionConfig.get(
|
|
68
96
|
db=db, object_id=dataset_config.connection_config_id
|
|
69
97
|
)
|
|
@@ -73,3 +101,95 @@ def get_connection_config_from_task(
|
|
|
73
101
|
)
|
|
74
102
|
|
|
75
103
|
return connection_config
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def execute_read_polling_requests(
|
|
107
|
+
db: Session,
|
|
108
|
+
async_task: RequestTask,
|
|
109
|
+
query_config: SaaSQueryConfig,
|
|
110
|
+
connector: SaaSConnector,
|
|
111
|
+
) -> None:
|
|
112
|
+
"""Execute the read polling requests for a given privacy request"""
|
|
113
|
+
read_requests = query_config.get_read_requests_by_identity()
|
|
114
|
+
logger.info(f"Read requests: {read_requests}")
|
|
115
|
+
for read_request in read_requests:
|
|
116
|
+
if read_request.async_config:
|
|
117
|
+
strategy: PollingAsyncDSRStrategy = AsyncDSRStrategy.get_strategy( # type: ignore
|
|
118
|
+
read_request.async_config.strategy,
|
|
119
|
+
read_request.async_config.configuration,
|
|
120
|
+
)
|
|
121
|
+
client: AuthenticatedClient = connector.create_client()
|
|
122
|
+
|
|
123
|
+
# Get missing parameters from available context
|
|
124
|
+
privacy_request: PrivacyRequest = async_task.privacy_request
|
|
125
|
+
secrets: Dict[str, Any] = connector.secrets
|
|
126
|
+
identity_data = {
|
|
127
|
+
**privacy_request.get_persisted_identity().labeled_dict(),
|
|
128
|
+
**privacy_request.get_cached_identity_data(),
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
status = strategy.get_status_request(
|
|
132
|
+
client,
|
|
133
|
+
secrets,
|
|
134
|
+
identity_data,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
if status:
|
|
138
|
+
execute_read_result_request(
|
|
139
|
+
db,
|
|
140
|
+
async_task,
|
|
141
|
+
strategy,
|
|
142
|
+
client,
|
|
143
|
+
secrets,
|
|
144
|
+
identity_data,
|
|
145
|
+
)
|
|
146
|
+
else:
|
|
147
|
+
logger.info(f"Polling request - {async_task.id} still not Ready. ")
|
|
148
|
+
continue
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def execute_read_result_request(
|
|
152
|
+
db: Session,
|
|
153
|
+
async_task: RequestTask,
|
|
154
|
+
strategy: PollingAsyncDSRStrategy,
|
|
155
|
+
client: AuthenticatedClient,
|
|
156
|
+
secrets: Dict[str, Any],
|
|
157
|
+
identity_data: Dict[str, Any],
|
|
158
|
+
) -> None:
|
|
159
|
+
|
|
160
|
+
result = strategy.get_result_request(
|
|
161
|
+
client,
|
|
162
|
+
secrets,
|
|
163
|
+
identity_data,
|
|
164
|
+
)
|
|
165
|
+
logger.info(f"Result: {result}")
|
|
166
|
+
if result:
|
|
167
|
+
# Save updated data back to the request task.
|
|
168
|
+
async_task.access_data = result
|
|
169
|
+
logger.info(
|
|
170
|
+
f"Polling request - {async_task.id} is ready. Added {len(result) if isinstance(result, list) else 1} results"
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
else:
|
|
174
|
+
async_task.access_data = []
|
|
175
|
+
logger.info(
|
|
176
|
+
f"Polling request - {async_task.id} is ready but returned no results"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
async_task.callback_succeeded = (
|
|
180
|
+
True # Setting this task as successful, so it wont loop anymore
|
|
181
|
+
)
|
|
182
|
+
async_task.update_status(db, ExecutionLogStatus.pending)
|
|
183
|
+
async_task.save(db)
|
|
184
|
+
log_task_queued(async_task, "callback")
|
|
185
|
+
queue_request_task(async_task, privacy_request_proceed=True)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def execute_erasure_polling_requests(
|
|
189
|
+
db: Session,
|
|
190
|
+
async_task: RequestTask,
|
|
191
|
+
query_config: SaaSQueryConfig,
|
|
192
|
+
) -> None:
|
|
193
|
+
"""Execute the erasure polling requests for a given privacy request"""
|
|
194
|
+
# TODO: Implement erasure polling logic
|
|
195
|
+
logger.info(f"Erasure polling not yet implemented. Task {async_task.id} passed")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class CallbackAsyncDSRStrategy(AsyncDSRStrategy):
|
|
5
|
+
"""
|
|
6
|
+
Strategy for callback async DSR requests.
|
|
7
|
+
|
|
8
|
+
This strategy has no methods since the callback is handled by the callback endpoint
|
|
9
|
+
we still require the strategy to be defined to notify that the request is awaiting async processing
|
|
10
|
+
and follows the AsyncDSRStrategy interface.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
name = "callback"
|
|
14
|
+
|
|
15
|
+
def __init__(self) -> None:
|
|
16
|
+
pass
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
|
|
4
|
+
from pydantic import ValidationError
|
|
5
|
+
|
|
6
|
+
from fides.api.common_exceptions import NoSuchStrategyException
|
|
7
|
+
from fides.api.common_exceptions import ValidationError as FidesopsValidationError
|
|
8
|
+
from fides.api.schemas.saas.strategy_configuration import StrategyConfiguration
|
|
9
|
+
from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
|
|
10
|
+
from fides.api.service.async_dsr.async_dsr_strategy_callback import (
|
|
11
|
+
CallbackAsyncDSRStrategy,
|
|
12
|
+
)
|
|
13
|
+
from fides.api.service.async_dsr.async_dsr_strategy_polling import (
|
|
14
|
+
PollingAsyncDSRStrategy,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SupportedAsyncDSRStrategies(Enum):
|
|
19
|
+
"""
|
|
20
|
+
The supported async DSR strategies for handling asynchronous data subject requests.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
callback = CallbackAsyncDSRStrategy
|
|
24
|
+
polling = PollingAsyncDSRStrategy
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def __contains__(cls, item: str) -> bool:
|
|
28
|
+
try:
|
|
29
|
+
cls[item]
|
|
30
|
+
except KeyError:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
return True
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def get_strategy(
|
|
37
|
+
strategy_name: str,
|
|
38
|
+
configuration: Dict[str, Any],
|
|
39
|
+
) -> AsyncDSRStrategy:
|
|
40
|
+
"""
|
|
41
|
+
Returns the strategy given the name and configuration.
|
|
42
|
+
Raises NoSuchStrategyException if the strategy does not exist
|
|
43
|
+
"""
|
|
44
|
+
if not SupportedAsyncDSRStrategies.__contains__(strategy_name):
|
|
45
|
+
valid_strategies = ", ".join(get_strategy_names())
|
|
46
|
+
raise NoSuchStrategyException(
|
|
47
|
+
f"Strategy '{strategy_name}' does not exist. Valid strategies are [{valid_strategies}]"
|
|
48
|
+
)
|
|
49
|
+
strategy = SupportedAsyncDSRStrategies[strategy_name].value
|
|
50
|
+
if strategy.configuration_model is None:
|
|
51
|
+
return strategy()
|
|
52
|
+
try:
|
|
53
|
+
strategy_config: StrategyConfiguration = strategy.configuration_model(
|
|
54
|
+
**configuration
|
|
55
|
+
)
|
|
56
|
+
return strategy(configuration=strategy_config)
|
|
57
|
+
except ValidationError as e:
|
|
58
|
+
raise FidesopsValidationError(message=str(e))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def get_strategy_names() -> List[str]:
|
|
62
|
+
"""Returns all supported async DSR strategies"""
|
|
63
|
+
return [s.name for s in SupportedAsyncDSRStrategies]
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
|
|
3
|
+
import pydash
|
|
4
|
+
from requests import Response
|
|
5
|
+
|
|
6
|
+
from fides.api.common_exceptions import PrivacyRequestError
|
|
7
|
+
from fides.api.schemas.saas.strategy_configuration import PollingAsyncDSRConfiguration
|
|
8
|
+
from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
|
|
9
|
+
from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
|
|
10
|
+
from fides.api.util.collection_util import Row
|
|
11
|
+
from fides.api.util.saas_util import map_param_values
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class PollingAsyncDSRStrategy(AsyncDSRStrategy):
|
|
15
|
+
"""
|
|
16
|
+
Strategy for polling async DSR requests.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
name = "polling"
|
|
20
|
+
configuration_model = PollingAsyncDSRConfiguration
|
|
21
|
+
|
|
22
|
+
def __init__(self, configuration: PollingAsyncDSRConfiguration):
|
|
23
|
+
self.status_request = configuration.status_request
|
|
24
|
+
self.status_path = configuration.status_path
|
|
25
|
+
self.status_completed_value = configuration.status_completed_value
|
|
26
|
+
self.result_request = configuration.result_request
|
|
27
|
+
self.result_path = configuration.result_path
|
|
28
|
+
|
|
29
|
+
def get_status_request(
|
|
30
|
+
self,
|
|
31
|
+
client: AuthenticatedClient,
|
|
32
|
+
secrets: Dict[str, Any],
|
|
33
|
+
identity_data: Dict[str, Any],
|
|
34
|
+
) -> bool:
|
|
35
|
+
"""Executes the status requests, and move forward if its true"""
|
|
36
|
+
param_values = secrets.copy()
|
|
37
|
+
param_values.update(identity_data)
|
|
38
|
+
prepared_status_request = map_param_values(
|
|
39
|
+
"status", "polling request", self.status_request, param_values
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
response: Response = client.send(prepared_status_request)
|
|
43
|
+
|
|
44
|
+
if response.ok:
|
|
45
|
+
status_path_value = pydash.get(response.json(), self.status_path)
|
|
46
|
+
# If the status path value is a boolean, return it
|
|
47
|
+
if isinstance(status_path_value, bool):
|
|
48
|
+
return status_path_value
|
|
49
|
+
|
|
50
|
+
# if the status path is a string, check if its the expected string value
|
|
51
|
+
if isinstance(status_path_value, str):
|
|
52
|
+
if status_path_value == self.status_completed_value:
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
return False
|
|
56
|
+
|
|
57
|
+
# if the status path is a list, check if the first element is the expected string value
|
|
58
|
+
if isinstance(status_path_value, list):
|
|
59
|
+
if status_path_value[0] == self.status_completed_value:
|
|
60
|
+
return True
|
|
61
|
+
|
|
62
|
+
return False
|
|
63
|
+
# And if we cant recognize the type, raise an error
|
|
64
|
+
raise PrivacyRequestError(
|
|
65
|
+
f"Status request returned an unexpected value: {status_path_value}"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
raise PrivacyRequestError(
|
|
69
|
+
f"Status request failed with status code {response.status_code}"
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
def get_result_request(
|
|
73
|
+
self,
|
|
74
|
+
client: AuthenticatedClient,
|
|
75
|
+
secrets: Dict[str, Any],
|
|
76
|
+
identity_data: Dict[str, Any],
|
|
77
|
+
) -> List[Row]:
|
|
78
|
+
"""Build request to get the result of the async DSR process"""
|
|
79
|
+
param_values = secrets.copy()
|
|
80
|
+
param_values.update(identity_data)
|
|
81
|
+
prepared_result_request = map_param_values(
|
|
82
|
+
"result",
|
|
83
|
+
"polling request",
|
|
84
|
+
self.result_request,
|
|
85
|
+
param_values, # type: ignore
|
|
86
|
+
)
|
|
87
|
+
response: Response = client.send(prepared_result_request)
|
|
88
|
+
if response.ok:
|
|
89
|
+
result = pydash.get(response.json(), self.result_path)
|
|
90
|
+
return result
|
|
91
|
+
|
|
92
|
+
raise PrivacyRequestError(
|
|
93
|
+
f"Result request failed with status code {response.status_code}"
|
|
94
|
+
)
|
|
@@ -14,12 +14,14 @@ from fides.api.common_exceptions import (
|
|
|
14
14
|
AwaitingAsyncTask,
|
|
15
15
|
FidesopsException,
|
|
16
16
|
PostProcessingException,
|
|
17
|
+
PrivacyRequestError,
|
|
17
18
|
SkippingConsentPropagation,
|
|
18
19
|
)
|
|
19
20
|
from fides.api.graph.execution import ExecutionNode
|
|
20
21
|
from fides.api.models.connectionconfig import ConnectionConfig, ConnectionTestStatus
|
|
21
22
|
from fides.api.models.policy import Policy
|
|
22
23
|
from fides.api.models.privacy_request import PrivacyRequest, RequestTask
|
|
24
|
+
from fides.api.models.privacy_request.request_task import AsyncTaskType
|
|
23
25
|
from fides.api.schemas.consentable_item import (
|
|
24
26
|
ConsentableItem,
|
|
25
27
|
build_consent_item_hierarchy,
|
|
@@ -27,7 +29,6 @@ from fides.api.schemas.consentable_item import (
|
|
|
27
29
|
from fides.api.schemas.limiter.rate_limit_config import RateLimitConfig
|
|
28
30
|
from fides.api.schemas.policy import ActionType
|
|
29
31
|
from fides.api.schemas.saas.saas_config import (
|
|
30
|
-
AsyncStrategy,
|
|
31
32
|
ClientConfig,
|
|
32
33
|
ConsentRequestMap,
|
|
33
34
|
ParamValue,
|
|
@@ -264,17 +265,29 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
264
265
|
input_data[CUSTOM_PRIVACY_REQUEST_FIELDS] = [custom_privacy_request_fields]
|
|
265
266
|
|
|
266
267
|
rows: List[Row] = []
|
|
267
|
-
|
|
268
|
+
awaiting_async_processing: bool = False
|
|
269
|
+
|
|
268
270
|
for read_request in read_requests:
|
|
269
271
|
self.set_saas_request_state(read_request)
|
|
270
272
|
if (
|
|
271
|
-
read_request.async_config
|
|
272
|
-
and read_request.async_config.strategy == AsyncStrategy.callback
|
|
273
|
+
read_request.async_config is not None
|
|
273
274
|
and request_task.id # Only supported in DSR 3.0
|
|
274
275
|
):
|
|
275
276
|
# Asynchronous read request detected. We will exit below and put the
|
|
276
277
|
# Request Task in an "awaiting_processing" status.
|
|
277
|
-
|
|
278
|
+
awaiting_async_processing = True
|
|
279
|
+
|
|
280
|
+
# Validate async strategy with proper enum value checking
|
|
281
|
+
strategy_value = read_request.async_config.strategy
|
|
282
|
+
valid_strategies = [task_type.value for task_type in AsyncTaskType]
|
|
283
|
+
|
|
284
|
+
if strategy_value not in valid_strategies:
|
|
285
|
+
raise PrivacyRequestError(
|
|
286
|
+
f"Invalid async type '{strategy_value}' for request task {request_task.id}. "
|
|
287
|
+
f"Valid types are: {valid_strategies}"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
request_task.async_type = AsyncTaskType(strategy_value)
|
|
278
291
|
|
|
279
292
|
# check all the values specified by param_values are provided in input_data
|
|
280
293
|
if self._missing_dataset_reference_values(
|
|
@@ -332,9 +345,14 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
332
345
|
)
|
|
333
346
|
|
|
334
347
|
self.unset_connector_state()
|
|
335
|
-
if
|
|
348
|
+
if awaiting_async_processing:
|
|
336
349
|
# If a read request was marked to expect async results, original response data here is ignored.
|
|
337
350
|
# We'll instead use the data received in the callback URL later.
|
|
351
|
+
# However for polling async request we want to save the request data for ids that we will use on the pollings status
|
|
352
|
+
if request_task.async_type == AsyncTaskType.polling:
|
|
353
|
+
# Saving the request task access data to use it on the polling status request
|
|
354
|
+
# TODO: Consider if we want to clean up the rows. Currently this is the concern of the GraphTask.
|
|
355
|
+
request_task.access_data = rows
|
|
338
356
|
# Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
|
|
339
357
|
raise AwaitingAsyncTask()
|
|
340
358
|
|
|
@@ -633,7 +651,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
633
651
|
|
|
634
652
|
awaiting_async_callback: bool = bool(
|
|
635
653
|
masking_request.async_config
|
|
636
|
-
and masking_request.async_config.strategy ==
|
|
654
|
+
and masking_request.async_config.strategy == AsyncTaskType.callback.value
|
|
637
655
|
) and bool(
|
|
638
656
|
request_task.id
|
|
639
657
|
) # Only supported in DSR 3.0
|
fides/api/service/deps.py
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
from fastapi import Depends
|
|
2
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
2
3
|
from sqlalchemy.orm import Session
|
|
3
4
|
|
|
4
5
|
from fides.api.api.deps import get_config, get_config_proxy, get_db
|
|
6
|
+
from fides.api.db.ctl_session import get_async_db
|
|
5
7
|
from fides.config import FidesConfig
|
|
6
8
|
from fides.config.config_proxy import ConfigProxy
|
|
7
9
|
from fides.service.dataset.dataset_config_service import DatasetConfigService
|
|
8
10
|
from fides.service.dataset.dataset_service import DatasetService
|
|
11
|
+
from fides.service.event_audit_service import EventAuditService
|
|
9
12
|
from fides.service.messaging.messaging_service import MessagingService
|
|
10
13
|
from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
|
|
14
|
+
from fides.service.system.system_service import SystemService
|
|
11
15
|
from fides.service.taxonomy.taxonomy_service import TaxonomyService
|
|
12
16
|
from fides.service.user.user_service import UserService
|
|
13
17
|
|
|
@@ -44,5 +48,16 @@ def get_user_service(
|
|
|
44
48
|
return UserService(db, config, config_proxy)
|
|
45
49
|
|
|
46
50
|
|
|
47
|
-
def
|
|
48
|
-
return
|
|
51
|
+
def get_event_audit_service(db: Session = Depends(get_db)) -> EventAuditService:
|
|
52
|
+
return EventAuditService(db)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get_taxonomy_service(
|
|
56
|
+
db: Session = Depends(get_db),
|
|
57
|
+
event_audit_service: EventAuditService = Depends(get_event_audit_service),
|
|
58
|
+
) -> TaxonomyService:
|
|
59
|
+
return TaxonomyService(db, event_audit_service)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
|
|
63
|
+
return SystemService(db)
|
|
@@ -44,7 +44,6 @@ from fides.api.service.messaging.messaging_crud_service import (
|
|
|
44
44
|
get_enabled_messaging_template_by_type_and_property,
|
|
45
45
|
)
|
|
46
46
|
from fides.api.tasks import DatabaseTask, celery_app
|
|
47
|
-
from fides.api.util.logger import Pii
|
|
48
47
|
from fides.config import CONFIG
|
|
49
48
|
from fides.config.config_proxy import ConfigProxy
|
|
50
49
|
from fides.service.messaging.aws_ses_service import AWS_SES_Service
|
|
@@ -663,9 +662,9 @@ def _mailgun_dispatcher(
|
|
|
663
662
|
raise MessageDispatchException(
|
|
664
663
|
f"Email failed to send with status code {response.status_code}"
|
|
665
664
|
)
|
|
666
|
-
except Exception as
|
|
667
|
-
logger.error("Email failed to send: {}",
|
|
668
|
-
raise MessageDispatchException(f"Email failed to send due to: {
|
|
665
|
+
except Exception as exc:
|
|
666
|
+
logger.error("Email failed to send: {}", str(exc))
|
|
667
|
+
raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
|
|
669
668
|
|
|
670
669
|
|
|
671
670
|
def _twilio_email_dispatcher(
|
|
@@ -707,14 +706,14 @@ def _twilio_email_dispatcher(
|
|
|
707
706
|
logger.error(
|
|
708
707
|
"Email failed to send: %s: %s",
|
|
709
708
|
response.status_code,
|
|
710
|
-
|
|
709
|
+
str(response.body),
|
|
711
710
|
)
|
|
712
711
|
raise MessageDispatchException(
|
|
713
|
-
f"Email failed to send: {response.status_code}, {
|
|
712
|
+
f"Email failed to send: {response.status_code}, {str(response.body)}"
|
|
714
713
|
)
|
|
715
|
-
except Exception as
|
|
716
|
-
logger.error("Email failed to send: {}",
|
|
717
|
-
raise MessageDispatchException(f"Email failed to send due to: {
|
|
714
|
+
except Exception as exc:
|
|
715
|
+
logger.error("Email failed to send: {}", str(exc))
|
|
716
|
+
raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
|
|
718
717
|
|
|
719
718
|
|
|
720
719
|
def _twilio_sms_dispatcher(
|
|
@@ -753,9 +752,9 @@ def _twilio_sms_dispatcher(
|
|
|
753
752
|
raise MessageDispatchException(
|
|
754
753
|
"Message failed to send. Either sender phone number or messaging service sid must be provided."
|
|
755
754
|
)
|
|
756
|
-
except TwilioRestException as
|
|
757
|
-
logger.error("Twilio SMS failed to send: {}",
|
|
758
|
-
raise MessageDispatchException(f"Twilio SMS failed to send due to: {
|
|
755
|
+
except TwilioRestException as exc:
|
|
756
|
+
logger.error("Twilio SMS failed to send: {}", str(exc))
|
|
757
|
+
raise MessageDispatchException(f"Twilio SMS failed to send due to: {str(exc)}")
|
|
759
758
|
|
|
760
759
|
|
|
761
760
|
def _aws_ses_dispatcher(
|
|
@@ -769,9 +768,11 @@ def _aws_ses_dispatcher(
|
|
|
769
768
|
|
|
770
769
|
try:
|
|
771
770
|
aws_ses_serivce.send_email(to, message.subject, message.body)
|
|
772
|
-
except Exception as
|
|
773
|
-
logger.error("Email failed to send: {}",
|
|
774
|
-
raise MessageDispatchException(
|
|
771
|
+
except Exception as exc:
|
|
772
|
+
logger.error("Email failed to send: {}", str(exc))
|
|
773
|
+
raise MessageDispatchException(
|
|
774
|
+
f"AWS SES email failed to send due to: {str(exc)}"
|
|
775
|
+
)
|
|
775
776
|
|
|
776
777
|
|
|
777
778
|
def _get_template_id_if_exists(
|
|
@@ -25,7 +25,7 @@ from fides.api.schemas.messaging.messaging import (
|
|
|
25
25
|
|
|
26
26
|
def update_messaging_config(
|
|
27
27
|
db: Session, key: FidesKey, config: MessagingConfigRequest
|
|
28
|
-
) ->
|
|
28
|
+
) -> MessagingConfig:
|
|
29
29
|
existing_config_with_key: Optional[MessagingConfig] = MessagingConfig.get_by(
|
|
30
30
|
db=db, field="key", value=key
|
|
31
31
|
)
|
|
@@ -38,7 +38,7 @@ def update_messaging_config(
|
|
|
38
38
|
|
|
39
39
|
def create_or_update_messaging_config(
|
|
40
40
|
db: Session, config: MessagingConfigRequest
|
|
41
|
-
) ->
|
|
41
|
+
) -> MessagingConfig:
|
|
42
42
|
data = {
|
|
43
43
|
"key": config.key,
|
|
44
44
|
"name": config.name,
|
|
@@ -46,16 +46,10 @@ def create_or_update_messaging_config(
|
|
|
46
46
|
}
|
|
47
47
|
if config.details:
|
|
48
48
|
data["details"] = config.details.__dict__ # type: ignore
|
|
49
|
-
|
|
49
|
+
return MessagingConfig.create_or_update(
|
|
50
50
|
db=db,
|
|
51
51
|
data=data,
|
|
52
52
|
)
|
|
53
|
-
return MessagingConfigResponse(
|
|
54
|
-
name=messaging_config.name,
|
|
55
|
-
key=messaging_config.key,
|
|
56
|
-
service_type=messaging_config.service_type.value, # type: ignore
|
|
57
|
-
details=messaging_config.details,
|
|
58
|
-
)
|
|
59
53
|
|
|
60
54
|
|
|
61
55
|
def delete_messaging_config(db: Session, key: FidesKey) -> None:
|
|
@@ -84,6 +78,8 @@ def get_messaging_config_by_key(db: Session, key: FidesKey) -> MessagingConfigRe
|
|
|
84
78
|
key=config.key,
|
|
85
79
|
service_type=config.service_type.value, # type: ignore[attr-defined]
|
|
86
80
|
details=config.details,
|
|
81
|
+
last_test_timestamp=config.last_test_timestamp,
|
|
82
|
+
last_test_succeeded=config.last_test_succeeded,
|
|
87
83
|
)
|
|
88
84
|
|
|
89
85
|
|