ethyca-fides 2.59.2b3__py2.py3-none-any.whl → 2.59.2rc0__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.59.2b3.dist-info → ethyca_fides-2.59.2rc0.dist-info}/METADATA +2 -2
- {ethyca_fides-2.59.2b3.dist-info → ethyca_fides-2.59.2rc0.dist-info}/RECORD +212 -215
- {ethyca_fides-2.59.2b3.dist-info → ethyca_fides-2.59.2rc0.dist-info}/WHEEL +1 -1
- fides/_version.py +3 -3
- fides/api/api/v1/endpoints/storage_endpoints.py +6 -7
- fides/api/db/system.py +121 -1
- fides/api/models/asset.py +2 -1
- fides/api/models/privacy_notice.py +19 -14
- fides/api/models/sql_models.py +51 -0
- fides/api/schemas/application_config.py +0 -1
- fides/api/schemas/connection_configuration/connection_secrets_datahub.py +3 -3
- fides/api/schemas/connection_configuration/connection_secrets_mysql.py +0 -12
- fides/api/schemas/connection_configuration/connection_secrets_postgres.py +4 -0
- fides/api/schemas/consentable_item.py +8 -5
- fides/api/schemas/messaging/messaging.py +2 -9
- fides/api/schemas/storage/storage.py +4 -40
- fides/api/schemas/storage/storage_secrets_docs_only.py +2 -8
- fides/api/schemas/system.py +2 -1
- fides/api/service/connectors/mysql_connector.py +1 -13
- fides/api/service/connectors/postgres_connector.py +4 -2
- fides/api/service/connectors/saas_connector.py +13 -18
- fides/api/service/saas_request/saas_request_override_factory.py +3 -3
- fides/api/service/storage/storage_authenticator_service.py +16 -39
- fides/api/service/storage/storage_uploader_service.py +1 -25
- fides/api/task/graph_task.py +3 -2
- fides/api/tasks/storage.py +2 -50
- fides/api/util/aws_util.py +17 -28
- fides/api/util/consent_util.py +4 -10
- fides/api/util/storage_util.py +0 -2
- fides/service/messaging/aws_ses_service.py +16 -25
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/P3RkpoojridGfvvbDI91a/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1100-45c0634b4f51d10c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1376-92890c17ce39ca0d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/146-d1820217dc36d46d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1817-90e54de7c706b571.js → 1817-6abbe957a53026d7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1904-e1034674c6eef004.js → 1904-281183a117e26585.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2479-b4f7654c27a15c05.js → 2479-b4f7a1c7c711cb65.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3086-d1ba90bc6ac9174b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3244-3d94bf3393366412.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3702-8a6360b2deef2a87.js → 3702-3d814671c31eaca3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-237afbbea7f54707.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3872-c53d74aebd12cfd3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/401-50974f107c2712fc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4060-52fd85fb1e15a2b8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4121-476f657b03a78965.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4481-288d74a33473cff7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5102-626b9ff42e904276.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5480-1623dbacdf4e6794.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-9a2aecb0ec63d567.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5826-8a035114917033bb.js → 5826-1f4f74bf3b5348e4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-942ce645a4279587.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6372-3d6d19a89e1d7a37.js → 6372-2aee10b79089521a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6395-4224d6d26d1e8bb7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6853-ca5dacd25c9ccb7c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-127745bfdc5bc0b3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7751-3913b8c055f599e5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/79-77cfed02164241ca.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8433-c4c765833ab9cc07.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8934-ffa2b0509bc7a845.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9282-1a48b10b114d01f4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9327-4970d356f7000c0b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9392.9178313b7a01d889.js → 9392.da35a8e778812d91.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9572-2b9b10e146130c85.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.d1e42fd1d03c4a76.js → 9676.f297a1347ac09c56.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-bf415d0daea960cd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9951-a0ba5bccbbbd5f33.js → 9951-66aad0602aadfbe2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-b482dd9e6ba3397d.js → 404-29560aa2e6a60963.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-dc66d9fb6547cb04.js → _app-1ce747bb4aa843da.js} +48 -48
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-58e9256e86916ecd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-892fc00510cddef8.js → multiple-2392e3a101fae073.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a6926f7ec7ad10cf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/ant-poc-404f3c9018952800.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-cc58c1e18966fcfd.js → add-vendors-7dfe37b9f0ff9a3c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-422f4d002822a5ce.js → configure-dba7848b760ba227.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-cd8bb60adf783c4a.js → [id]-78de4bde88e18b0f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-300fd2800c417d0b.js → new-c02b14c50b19bd91.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-7eeeee3769e73f78.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-72dd15bfd87616c9.js → [id]-75c2ed6ba3de48cd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-8bbccdd747f4100c.js → new-487ae57dc7e2ded2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-65091908d6296afc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-55cc394ebc428e59.js → properties-f67fda6a71d0a46b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-7a1976c0d1aca8b6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-ec420ff6cfb82abd.js → consent-75395dfc224cf44b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-b0b976e8dd5e4cd6.js → [projectUrn]-fa65c67ec8c4b5e6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-4ea56a1c3010ba99.js → projects-e76a07ee6ee8d55f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-75989f9732d90793.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-6b3d1fe762c747d8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-61eafb8444bffb76.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-38476c697da53480.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-e7869f658e3017b9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-10f789d4ab2b8927.js → [resourceUrn]-1bcaa606739ea1c5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-f473b2ee1c67be3c.js → detection-22f55dc12354b4c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-2569551ae75ea5a2.js → [resourceUrn]-86111c25dc30ef2b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ad077f30849fdc0a.js → discovery-853be75f08b9ab5c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-4b12c6b141f6cda3.js → datamap-423172d31de8e9c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-da407b63cd3f5276.js → [...subfieldNames]-704553f5329fb9d4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-76205fa5ddc5c3ae.js → [collectionName]-06c19dca941edb14.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-ab7c88da427b6396.js → [datasetId]-eac517f43d5f53a8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-8dba366b1d55a15c.js → new-5aff1d01c6c30ad6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-ee98d1a24a68f13b.js → dataset-f4d57b3432c57112.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-e39d66c8dfdc4c6f.js → [id]-b2b1168d0361baa8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-8f2cfc79022cb6d0.js → new-c804349a417a888b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-0faa9b3c4555e585.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/index-e72904e316ede1b0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-17191a759e167ca8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-88e51c81a380ebad.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-1d18e28fa55a149b.js → [id]-66f5fbadd8455805.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-11bdab1b292c6f89.js → add-template-d441abb1f045940f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-eef56c95b08aa24c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-96350050e842bde5.js → [id]-54ea39f203182c53.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-d889076067104e56.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-3355b4803b2916f3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b8c94b10ab90b061.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-3ac47981f1e2b0aa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-835b7c4dd2240d16.js → [id]-f4fb941df069b7bf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-984851804558be53.js → add-property-bccb6ffab25aa214.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-d2b95b0ebae06804.js → properties-9a7ac623370b7c00.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-fe743440d7eb007b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-4412a7b468b6d4bf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-cdc866af93898716.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-a7dc8113067dff42.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-87df4b6493ca8162.js → domain-records-d9088f5cd9fb2822.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-2f03e981234c40ad.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-cf09ad896c7396a6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-a8cd013bdd3aef75.js → locations-759564ca0ae62840.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-5bcc7a6976e01a56.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-5abb227df116c9c4.js → regulations-2dce4501fca920b3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0b47ff26897c1d9a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-693c726f22ae11c5.js → [id]-dd053a3bf2a9ca6c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-820893393f1516ee.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-8fccd670220dbf60.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-65ef1bdebb679666.js → new-082c3156175f9267.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-28abb07c95f2c7c2.js → [id]-d527d1d1635541df.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-facb8c0128a44cb1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{webpack-cf42f5a0e9af0ace.js → webpack-03e375f6d6b2c71b.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/687135955af5b7e1.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/ant-poc.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/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/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.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/c9c72b3d550b_data_migration_cookie_asset.py +0 -218
- fides/api/service/storage/gcs.py +0 -38
- fides/ui-build/static/admin/_next/static/WiKelYdZvuyhqjL7rLRaz/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1100-0046887f49e9e7c7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3503-2e773a38d4a79c2d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3513-2ee2ff13c15af241.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-7a43acdb1f8de2f5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-53b86dcc7ee3ddec.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-a15fcc78cc272c09.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4060-93514991b84ca46c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4121-01e2b9f905b8ca29.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-c19a0c5e273a3ec7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5487-b6957c5ba835167b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5835-2e2aa29b4a8bf4e6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-4b83cf367b6d82a2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-2f2d89b83a19ee67.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-45e8c48ad0fdf1db.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-6de30beefefac64a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7751-f83e9877478aafcf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-576004c5ee5116f6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8433-234a6feeb457cbb8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8934-e357867355f1f924.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9282-c7f853a8175266bc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9327-0bc418b9b16cc2c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9572-c34e18bd40467909.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9719-d3de30714871f267.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-ee5b0af0e65d3802.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9965-8880affd11242777.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-e16fcedb2215db13.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-cb85a0014fad7c58.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/ant-poc-2bade915860dd327.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-046051bb82ec1c53.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-1f402b7525f78140.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-de9118ec446ce994.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-7efbc1558febf026.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-cdd23dc94e1fbf89.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-94308fff1468b5e6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-920ed6df7e0aa3a5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-7e25ddfe45048b35.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-340e311fa02584dc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-259c1f1281f9b634.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-0fc3ffd11ba163f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-d584110d81e5b395.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-de5efa1ff6d0e9ea.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-e8e9ae8d58acceb2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-a76f1d1a19e61fe8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-6b9a46fef5031a0b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-630db544f2a27167.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-5d1aededc7523146.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-44f96bcf57cd4cbf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-0ba66c149139737a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-943dfe977678edb5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-39d098cbcb33d4f5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-45a8a86266308028.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-272eb2c0b7ffd290.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-aaa200f916ba79d8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-da1b2dd3ec61a08e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-5eccb5fe50f7aaa9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-0611d707ce426ec7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-4eb69d5c6af8581b.js +0 -1
- fides/ui-build/static/admin/_next/static/css/e728309361a9758b.css +0 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +0 -1
- {ethyca_fides-2.59.2b3.dist-info → ethyca_fides-2.59.2rc0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.59.2b3.dist-info → ethyca_fides-2.59.2rc0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.59.2b3.dist-info → ethyca_fides-2.59.2rc0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{WiKelYdZvuyhqjL7rLRaz → P3RkpoojridGfvvbDI91a}/_ssgManifest.js +0 -0
fides/_version.py
CHANGED
@@ -8,11 +8,11 @@ import json
|
|
8
8
|
|
9
9
|
version_json = '''
|
10
10
|
{
|
11
|
-
"date": "2025-04-
|
11
|
+
"date": "2025-04-21T14:22:11-0400",
|
12
12
|
"dirty": false,
|
13
13
|
"error": null,
|
14
|
-
"full-revisionid": "
|
15
|
-
"version": "2.59.
|
14
|
+
"full-revisionid": "5349c2139e880663be7de5d9dcc20d58fabb22ce",
|
15
|
+
"version": "2.59.2rc0"
|
16
16
|
}
|
17
17
|
''' # END VERSION_JSON
|
18
18
|
|
@@ -40,7 +40,6 @@ from fides.api.schemas.storage.storage import (
|
|
40
40
|
FULLY_CONFIGURED_STORAGE_TYPES,
|
41
41
|
AWSAuthMethod,
|
42
42
|
BulkPutStorageConfigResponse,
|
43
|
-
GCSAuthMethod,
|
44
43
|
StorageConfigStatus,
|
45
44
|
StorageConfigStatusMessage,
|
46
45
|
StorageDestination,
|
@@ -220,7 +219,7 @@ def put_config_secrets(
|
|
220
219
|
|
221
220
|
msg = f"Secrets updated for StorageConfig with key: {config_key}."
|
222
221
|
if verify:
|
223
|
-
status = secrets_are_valid(secrets_schema, storage_config)
|
222
|
+
status = secrets_are_valid(secrets_schema, storage_config.type)
|
224
223
|
if status:
|
225
224
|
logger.info(
|
226
225
|
"Storage secrets are valid for config with key '{}'", config_key
|
@@ -419,10 +418,10 @@ def get_storage_status(
|
|
419
418
|
|
420
419
|
|
421
420
|
def _storage_config_requires_secrets(storage_config: StorageConfig) -> bool:
|
422
|
-
return
|
423
|
-
|
424
|
-
|
425
|
-
|
421
|
+
return (
|
422
|
+
storage_config.details.get(StorageDetails.AUTH_METHOD.value, None)
|
423
|
+
== AWSAuthMethod.SECRET_KEYS.value
|
424
|
+
)
|
426
425
|
|
427
426
|
|
428
427
|
@router.put(
|
@@ -534,7 +533,7 @@ def put_default_config_secrets(
|
|
534
533
|
|
535
534
|
msg = f"Secrets updated for default config of storage type: {storage_type.value}."
|
536
535
|
if verify:
|
537
|
-
status = secrets_are_valid(secrets_schema, storage_config)
|
536
|
+
status = secrets_are_valid(secrets_schema, storage_config.type)
|
538
537
|
if status:
|
539
538
|
logger.info(
|
540
539
|
"Storage secrets are valid for default config of storage type '{}'",
|
fides/api/db/system.py
CHANGED
@@ -8,15 +8,19 @@ from typing import Any, Dict, List, Optional, Tuple, Type, Union
|
|
8
8
|
|
9
9
|
from deepdiff import DeepDiff
|
10
10
|
from fastapi import HTTPException
|
11
|
+
from fideslang.models import Cookies as CookieSchema
|
11
12
|
from fideslang.models import System as SystemSchema
|
12
13
|
from fideslang.validation import FidesKey
|
13
14
|
from loguru import logger as log
|
15
|
+
from sqlalchemy import and_, delete, insert, select, update
|
14
16
|
from sqlalchemy.ext.asyncio import AsyncSession
|
15
17
|
from sqlalchemy.orm import Session
|
18
|
+
from sqlalchemy.sql.elements import BinaryExpression
|
16
19
|
from starlette.status import HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND
|
17
20
|
|
18
21
|
from fides.api.db.crud import create_resource, get_resource, update_resource
|
19
22
|
from fides.api.models.sql_models import ( # type: ignore[attr-defined]
|
23
|
+
Cookies,
|
20
24
|
DataCategory,
|
21
25
|
DataSubject,
|
22
26
|
DataUse,
|
@@ -151,6 +155,7 @@ async def upsert_privacy_declarations(
|
|
151
155
|
for privacy_declaration in resource.privacy_declarations:
|
152
156
|
# prepare our 'payload' for either create or update
|
153
157
|
data = privacy_declaration.model_dump(mode="json")
|
158
|
+
privacy_declaration_cookies: List[Dict] = data.pop("cookies", None)
|
154
159
|
data["system_id"] = system.id # include FK back to system
|
155
160
|
|
156
161
|
# if we find matching declaration, remove it from our map
|
@@ -163,11 +168,102 @@ async def upsert_privacy_declarations(
|
|
163
168
|
# otherwise, create a new declaration record
|
164
169
|
declaration = PrivacyDeclaration.create(db, data=data)
|
165
170
|
|
171
|
+
# Upsert cookies for the given privacy declaration
|
172
|
+
await upsert_cookies(
|
173
|
+
db, privacy_declaration_cookies, declaration, system=None
|
174
|
+
)
|
175
|
+
|
166
176
|
# delete any existing privacy declarations that have not been "matched" in the request
|
167
177
|
for existing_declarations in existing_declarations.values():
|
168
178
|
await db.delete(existing_declarations)
|
169
179
|
|
170
180
|
|
181
|
+
async def upsert_cookies(
|
182
|
+
async_session: AsyncSession,
|
183
|
+
cookies: Optional[List[Dict]],
|
184
|
+
privacy_declaration: Optional[PrivacyDeclaration],
|
185
|
+
system: Optional[System],
|
186
|
+
) -> None:
|
187
|
+
"""
|
188
|
+
Upsert cookies for the given system or privacy_declaration. Cookies can be attached at the system-level
|
189
|
+
or the privacy declaration-level.
|
190
|
+
|
191
|
+
Remove any existing cookies that aren't specified here.
|
192
|
+
"""
|
193
|
+
if not (privacy_declaration or system):
|
194
|
+
# Dev-level error
|
195
|
+
raise ValueError(
|
196
|
+
"Either system or privacy declaration must be supplied to upsert cookies"
|
197
|
+
)
|
198
|
+
|
199
|
+
if privacy_declaration and system:
|
200
|
+
# Dev-level error
|
201
|
+
raise ValueError(
|
202
|
+
"Supply either system or privacy declaration, not both, to upsert cookies"
|
203
|
+
)
|
204
|
+
|
205
|
+
parsed_cookies = (
|
206
|
+
[CookieSchema.model_validate(cookie) for cookie in cookies] if cookies else []
|
207
|
+
)
|
208
|
+
|
209
|
+
resource_filter: BinaryExpression = (
|
210
|
+
Cookies.system_id == system.id
|
211
|
+
if system
|
212
|
+
else Cookies.privacy_declaration_id == privacy_declaration.id # type: ignore[union-attr]
|
213
|
+
)
|
214
|
+
|
215
|
+
for cookie_data in parsed_cookies:
|
216
|
+
# Check if cookie exists on the resource
|
217
|
+
result = await async_session.execute(
|
218
|
+
select(Cookies).where(
|
219
|
+
and_(Cookies.name == cookie_data.name, resource_filter)
|
220
|
+
)
|
221
|
+
)
|
222
|
+
row: Optional[Cookies] = result.scalars().first()
|
223
|
+
if row:
|
224
|
+
# Update existing cookie
|
225
|
+
await async_session.execute(
|
226
|
+
update(Cookies)
|
227
|
+
.where(Cookies.id == row.id)
|
228
|
+
.values(cookie_data.model_dump(mode="json"))
|
229
|
+
)
|
230
|
+
|
231
|
+
else:
|
232
|
+
# Insert new cookie
|
233
|
+
await async_session.execute(
|
234
|
+
insert(Cookies).values(
|
235
|
+
{
|
236
|
+
"name": cookie_data.name,
|
237
|
+
"path": cookie_data.path,
|
238
|
+
"domain": cookie_data.domain,
|
239
|
+
"privacy_declaration_id": (
|
240
|
+
privacy_declaration.id if privacy_declaration else None
|
241
|
+
),
|
242
|
+
"system_id": system.id if system else None,
|
243
|
+
}
|
244
|
+
)
|
245
|
+
)
|
246
|
+
|
247
|
+
# Select cookies which are currently on the application resource, but not included in the request
|
248
|
+
delete_result = await async_session.execute(
|
249
|
+
select(Cookies).where(
|
250
|
+
and_(
|
251
|
+
Cookies.name.notin_([cookie.name for cookie in parsed_cookies]),
|
252
|
+
resource_filter,
|
253
|
+
)
|
254
|
+
)
|
255
|
+
)
|
256
|
+
|
257
|
+
# Remove those cookies altogether
|
258
|
+
await async_session.execute(
|
259
|
+
delete(Cookies).where(
|
260
|
+
Cookies.id.in_(
|
261
|
+
[cookie.id for cookie in delete_result.scalars().unique().all()]
|
262
|
+
)
|
263
|
+
)
|
264
|
+
)
|
265
|
+
|
266
|
+
|
171
267
|
async def update_system(
|
172
268
|
resource: SystemSchema, db: AsyncSession, current_user_id: Optional[str] = None
|
173
269
|
) -> Tuple[Dict, bool]:
|
@@ -192,10 +288,18 @@ async def update_system(
|
|
192
288
|
resource, "privacy_declarations"
|
193
289
|
) # remove the attribute on the system since we've already updated declarations
|
194
290
|
|
291
|
+
# Remove system-level cookies from request before updating the system.
|
292
|
+
# Cookies are upserted separately
|
293
|
+
proposed_system_cookies: Optional[List[Cookies]] = resource.cookies
|
294
|
+
delattr(resource, "cookies")
|
295
|
+
|
195
296
|
# perform any updates on the system resource itself
|
196
297
|
updated_system = await update_resource(System, resource.model_dump(), db)
|
197
298
|
|
198
299
|
async with db.begin():
|
300
|
+
await upsert_cookies(
|
301
|
+
db, proposed_system_cookies, privacy_declaration=None, system=updated_system
|
302
|
+
) # Upsert the associated cookies at the System-level
|
199
303
|
|
200
304
|
await db.refresh(updated_system)
|
201
305
|
|
@@ -296,6 +400,10 @@ async def create_system(
|
|
296
400
|
# remove the attribute on the system update since the declarations will be created separately
|
297
401
|
delattr(resource, "privacy_declarations")
|
298
402
|
|
403
|
+
# Remove system-level cookies from request; these will be processed after the system is added
|
404
|
+
proposed_system_cookies: Optional[List[Cookies]] = resource.cookies
|
405
|
+
delattr(resource, "cookies")
|
406
|
+
|
299
407
|
# create the system resource using generic creation
|
300
408
|
# the system must be created before the privacy declarations so that it can be referenced
|
301
409
|
resource_dict = resource.model_dump()
|
@@ -310,15 +418,27 @@ async def create_system(
|
|
310
418
|
privacy_declaration_exception = None
|
311
419
|
try:
|
312
420
|
async with db.begin():
|
421
|
+
await upsert_cookies(
|
422
|
+
db,
|
423
|
+
proposed_system_cookies,
|
424
|
+
privacy_declaration=None,
|
425
|
+
system=created_system,
|
426
|
+
) # Create the associated cookies at the System-level
|
313
427
|
|
314
428
|
# create the specified declarations as records in their own table
|
315
429
|
for privacy_declaration in privacy_declarations:
|
316
430
|
data = privacy_declaration.model_dump(mode="json")
|
317
431
|
data["system_id"] = created_system.id # add FK back to system
|
432
|
+
privacy_declaration_cookies: List[Dict] = data.pop("cookies", [])
|
318
433
|
privacy_declaration = PrivacyDeclaration.create(
|
319
434
|
db, data=data
|
320
435
|
) # create the associated PrivacyDeclaration
|
321
|
-
|
436
|
+
await upsert_cookies(
|
437
|
+
db,
|
438
|
+
privacy_declaration_cookies,
|
439
|
+
privacy_declaration=privacy_declaration,
|
440
|
+
system=None,
|
441
|
+
) # Create the associated cookies on the Privacy Declaration
|
322
442
|
except Exception as e:
|
323
443
|
log.error(
|
324
444
|
f"Error adding privacy declarations, reverting system creation: {str(privacy_declaration_exception)}"
|
fides/api/models/asset.py
CHANGED
@@ -25,7 +25,8 @@ from fides.api.models.sql_models import System # type: ignore[attr-defined]
|
|
25
25
|
|
26
26
|
class Asset(Base):
|
27
27
|
"""
|
28
|
-
Web assets associated with a system
|
28
|
+
Web assets associated with a system. This model will supersede `Cookies` once we have established
|
29
|
+
a migration path and backward compatibility with all `Cookies` related APIs.
|
29
30
|
"""
|
30
31
|
|
31
32
|
# Common attributes
|
@@ -20,9 +20,10 @@ from fides.api.models import (
|
|
20
20
|
dry_update_data,
|
21
21
|
update_if_modified,
|
22
22
|
)
|
23
|
-
from fides.api.models.asset import Asset
|
24
23
|
from fides.api.models.location_regulation_selections import DeprecatedNoticeRegion
|
25
24
|
from fides.api.models.sql_models import ( # type: ignore[attr-defined]
|
25
|
+
Cookies,
|
26
|
+
PrivacyDeclaration,
|
26
27
|
System,
|
27
28
|
get_system_data_uses,
|
28
29
|
)
|
@@ -190,20 +191,24 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
190
191
|
raise Exception("Invalid notice consent mechanism.")
|
191
192
|
|
192
193
|
@property
|
193
|
-
def cookies(self) -> List[
|
194
|
-
"""Return relevant
|
194
|
+
def cookies(self) -> List[Cookies]:
|
195
|
+
"""Return relevant cookie names (via the data use)"""
|
195
196
|
db = Session.object_session(self)
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
197
|
+
return (
|
198
|
+
db.query(Cookies)
|
199
|
+
.join(
|
200
|
+
PrivacyDeclaration,
|
201
|
+
PrivacyDeclaration.id == Cookies.privacy_declaration_id,
|
202
|
+
)
|
203
|
+
.filter(
|
204
|
+
or_(
|
205
|
+
*[
|
206
|
+
PrivacyDeclaration.data_use.like(f"{notice_use}%")
|
207
|
+
for notice_use in self.data_uses
|
208
|
+
]
|
209
|
+
)
|
210
|
+
)
|
211
|
+
).all()
|
207
212
|
|
208
213
|
@property
|
209
214
|
def calculated_systems_applicable(self) -> bool:
|
fides/api/models/sql_models.py
CHANGED
@@ -457,6 +457,10 @@ class System(Base, FidesBase):
|
|
457
457
|
lazy="selectin",
|
458
458
|
)
|
459
459
|
|
460
|
+
cookies = relationship(
|
461
|
+
"Cookies", back_populates="system", lazy="selectin", uselist=True, viewonly=True
|
462
|
+
)
|
463
|
+
|
460
464
|
assets = relationship(
|
461
465
|
"Asset", back_populates="system", lazy="selectin", uselist=True, viewonly=True
|
462
466
|
)
|
@@ -556,6 +560,9 @@ class PrivacyDeclaration(Base):
|
|
556
560
|
system = relationship(
|
557
561
|
System, back_populates="privacy_declarations", lazy="selectin"
|
558
562
|
)
|
563
|
+
cookies = relationship(
|
564
|
+
"Cookies", back_populates="privacy_declaration", lazy="joined", uselist=True
|
565
|
+
)
|
559
566
|
|
560
567
|
@classmethod
|
561
568
|
def create(
|
@@ -859,6 +866,50 @@ class AuditLogResource(Base):
|
|
859
866
|
extra_data = Column(JSON, nullable=True)
|
860
867
|
|
861
868
|
|
869
|
+
class Cookies(Base):
|
870
|
+
"""
|
871
|
+
Stores cookies. Cookies have a FK to system and privacy declaration. If a privacy declaration is deleted,
|
872
|
+
the cookie can still remain linked to the system but unassociated with a data use.
|
873
|
+
"""
|
874
|
+
|
875
|
+
name = Column(String, index=True, nullable=False)
|
876
|
+
path = Column(String)
|
877
|
+
domain = Column(String)
|
878
|
+
|
879
|
+
system_id = Column(
|
880
|
+
String, ForeignKey(System.id_field_path, ondelete="CASCADE"), index=True
|
881
|
+
) # If system is deleted, remove the associated cookies.
|
882
|
+
|
883
|
+
privacy_declaration_id = Column(
|
884
|
+
String,
|
885
|
+
ForeignKey(PrivacyDeclaration.id_field_path, ondelete="CASCADE"),
|
886
|
+
index=True,
|
887
|
+
) # If privacy declaration is deleted, remove the associated cookies.
|
888
|
+
|
889
|
+
system = relationship(
|
890
|
+
"System",
|
891
|
+
back_populates="cookies",
|
892
|
+
cascade="all,delete",
|
893
|
+
uselist=False,
|
894
|
+
lazy="selectin",
|
895
|
+
)
|
896
|
+
|
897
|
+
privacy_declaration = relationship(
|
898
|
+
"PrivacyDeclaration",
|
899
|
+
back_populates="cookies",
|
900
|
+
cascade="all,delete",
|
901
|
+
uselist=False,
|
902
|
+
lazy="joined", # Joined is intentional, instead of selectin
|
903
|
+
)
|
904
|
+
|
905
|
+
__table_args__ = (
|
906
|
+
UniqueConstraint(
|
907
|
+
"name", "privacy_declaration_id", name="_cookie_name_privacy_declaration_uc"
|
908
|
+
),
|
909
|
+
UniqueConstraint("name", "system_id", name="_cookie_name_system_uc"),
|
910
|
+
)
|
911
|
+
|
912
|
+
|
862
913
|
def get_system_data_uses(db: Session, include_parents: bool) -> Set:
|
863
914
|
"""Get data uses across all systems and those data uses' parents if include_parents is True
|
864
915
|
|
@@ -20,11 +20,11 @@ class PeriodicIntegrationFrequency(Enum):
|
|
20
20
|
|
21
21
|
class DatahubSchema(ConnectionConfigSecretsSchema):
|
22
22
|
datahub_server_url: AnyHttpUrlStringRemovesSlash = Field(
|
23
|
-
title="DataHub
|
23
|
+
title="DataHub Server URL",
|
24
24
|
description="The URL of your DataHub server.",
|
25
25
|
)
|
26
26
|
datahub_token: str = Field(
|
27
|
-
title="DataHub
|
27
|
+
title="DataHub Token",
|
28
28
|
description="The token used to authenticate with your DataHub server.",
|
29
29
|
json_schema_extra={"sensitive": True},
|
30
30
|
)
|
@@ -33,7 +33,7 @@ class DatahubSchema(ConnectionConfigSecretsSchema):
|
|
33
33
|
description="The frequency at which the integration should run. Available options are daily, weekly, and monthly.",
|
34
34
|
)
|
35
35
|
glossary_node: str = Field(
|
36
|
-
title="Glossary
|
36
|
+
title="Glossary Node",
|
37
37
|
description="The glossary node name to use on Datahub for Fides Data Categories. (e.g. FidesDataCategories)",
|
38
38
|
)
|
39
39
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
from enum import Enum
|
2
1
|
from typing import ClassVar, List, Optional
|
3
2
|
|
4
3
|
from pydantic import Field
|
@@ -9,12 +8,6 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
|
|
9
8
|
)
|
10
9
|
|
11
10
|
|
12
|
-
class MySQLSSLMode(str, Enum):
|
13
|
-
preferred = "preferred"
|
14
|
-
required = "required"
|
15
|
-
disabled = "disabled"
|
16
|
-
|
17
|
-
|
18
11
|
class MySQLSchema(ConnectionConfigSecretsSchema):
|
19
12
|
"""Schema to validate the secrets needed to connect to a MySQL Database"""
|
20
13
|
|
@@ -47,11 +40,6 @@ class MySQLSchema(ConnectionConfigSecretsSchema):
|
|
47
40
|
title="SSH required",
|
48
41
|
description="Indicates whether an SSH tunnel is required for the connection. Enable this option if your MySQL server is behind a firewall and requires SSH tunneling for remote connections.",
|
49
42
|
)
|
50
|
-
ssl_mode: Optional[MySQLSSLMode] = Field(
|
51
|
-
None, # TODO: support for verify-ca and verify-full
|
52
|
-
title="SSL Mode",
|
53
|
-
description="The SSL mode to use for the connection. Valid values are 'required', 'preferred', and 'disabled'.",
|
54
|
-
)
|
55
43
|
|
56
44
|
_required_components: ClassVar[List[str]] = ["host", "dbname"]
|
57
45
|
|
@@ -46,6 +46,10 @@ class PostgreSQLSchema(ConnectionConfigSecretsSchema):
|
|
46
46
|
title="Schema",
|
47
47
|
description="The default schema to be used for the database connection (defaults to public).",
|
48
48
|
)
|
49
|
+
ssl_mode: Optional[str] = Field(
|
50
|
+
default=None,
|
51
|
+
title="SSL Mode",
|
52
|
+
)
|
49
53
|
|
50
54
|
_required_components: ClassVar[List[str]] = [
|
51
55
|
"host",
|
@@ -3,6 +3,7 @@ from typing import Dict, List, Literal, Optional
|
|
3
3
|
from pydantic import BaseModel, Field
|
4
4
|
|
5
5
|
from fides.api.models.consent_automation import ConsentableItem as ConsentableItemModel
|
6
|
+
from fides.api.models.privacy_notice import UserConsentPreference
|
6
7
|
from fides.api.schemas.base_class import FidesSchema
|
7
8
|
|
8
9
|
|
@@ -84,8 +85,10 @@ class ConsentWebhookResult(BaseModel):
|
|
84
85
|
|
85
86
|
identity_map: Dict[
|
86
87
|
Literal["email", "phone_number", "fides_user_device", "external_id"], str
|
87
|
-
] =
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
)
|
88
|
+
] = {}
|
89
|
+
notice_map: Dict[str, UserConsentPreference] = {}
|
90
|
+
|
91
|
+
@property
|
92
|
+
def success(self) -> bool:
|
93
|
+
"""Returns true if both the identity map and notice map are not empty."""
|
94
|
+
return bool(self.identity_map) and bool(self.notice_map)
|
@@ -286,19 +286,12 @@ class MessagingServiceDetailsTwilioEmail(BaseModel):
|
|
286
286
|
class MessagingServiceDetailsAWS_SES(BaseModel):
|
287
287
|
"""The details required to represent an AWS SES email configuration."""
|
288
288
|
|
289
|
-
email_from:
|
290
|
-
domain:
|
289
|
+
email_from: str
|
290
|
+
domain: str
|
291
291
|
aws_region: str
|
292
292
|
|
293
293
|
model_config = ConfigDict(extra="forbid")
|
294
294
|
|
295
|
-
@model_validator(mode="before")
|
296
|
-
@classmethod
|
297
|
-
def validate_fields(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
298
|
-
if not values.get("domain") and not values.get("email_from"):
|
299
|
-
raise ValueError("Either 'email_from' or 'domain' must be provided.")
|
300
|
-
return values
|
301
|
-
|
302
295
|
|
303
296
|
class MessagingServiceSecrets(Enum):
|
304
297
|
"""Enum for message service secrets"""
|
@@ -61,20 +61,6 @@ class StorageDetailsS3(FileBasedStorageDetails):
|
|
61
61
|
model_config = ConfigDict(use_enum_values=True)
|
62
62
|
|
63
63
|
|
64
|
-
class GCSAuthMethod(str, Enum):
|
65
|
-
ADC = "adc" # Application Default Credentials
|
66
|
-
SERVICE_ACCOUNT_KEYS = "service_account_keys"
|
67
|
-
|
68
|
-
|
69
|
-
class StorageDetailsGCS(FileBasedStorageDetails):
|
70
|
-
"""The details required to represent a Google Cloud Storage bucket."""
|
71
|
-
|
72
|
-
auth_method: GCSAuthMethod
|
73
|
-
bucket: str
|
74
|
-
max_retries: Optional[int] = 0
|
75
|
-
model_config = ConfigDict(use_enum_values=True)
|
76
|
-
|
77
|
-
|
78
64
|
class StorageDetailsLocal(FileBasedStorageDetails):
|
79
65
|
"""The details required to configurate local storage configuration"""
|
80
66
|
|
@@ -85,8 +71,6 @@ class StorageSecrets(Enum):
|
|
85
71
|
# s3-specific
|
86
72
|
AWS_ACCESS_KEY_ID = "aws_access_key_id"
|
87
73
|
AWS_SECRET_ACCESS_KEY = "aws_secret_access_key"
|
88
|
-
REGION_NAME = "region_name"
|
89
|
-
AWS_ASSUME_ROLE = "assume_role_arn"
|
90
74
|
|
91
75
|
|
92
76
|
class StorageSecretsLocal(BaseModel):
|
@@ -96,27 +80,10 @@ class StorageSecretsLocal(BaseModel):
|
|
96
80
|
|
97
81
|
|
98
82
|
class StorageSecretsS3(BaseModel):
|
99
|
-
|
100
|
-
aws_secret_access_key: Optional[str] = None
|
101
|
-
region_name: Optional[str] = None
|
102
|
-
assume_role_arn: Optional[str] = None
|
103
|
-
model_config = ConfigDict(extra="forbid")
|
104
|
-
|
83
|
+
"""The secrets required to connect to an S3 bucket."""
|
105
84
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
type: str = "service_account"
|
110
|
-
project_id: str
|
111
|
-
private_key_id: str
|
112
|
-
private_key: str
|
113
|
-
client_email: str
|
114
|
-
client_id: str
|
115
|
-
auth_uri: str
|
116
|
-
token_uri: str
|
117
|
-
auth_provider_x509_cert_url: str
|
118
|
-
client_x509_cert_url: str
|
119
|
-
universe_domain: str
|
85
|
+
aws_access_key_id: str
|
86
|
+
aws_secret_access_key: str
|
120
87
|
model_config = ConfigDict(extra="forbid")
|
121
88
|
|
122
89
|
|
@@ -132,7 +99,6 @@ class StorageType(Enum):
|
|
132
99
|
|
133
100
|
FULLY_CONFIGURED_STORAGE_TYPES = (
|
134
101
|
StorageType.s3,
|
135
|
-
StorageType.gcs,
|
136
102
|
) # storage types that are considered "fully configured"
|
137
103
|
|
138
104
|
|
@@ -142,7 +108,6 @@ class StorageDestinationBase(BaseModel):
|
|
142
108
|
type: StorageType
|
143
109
|
details: Union[
|
144
110
|
StorageDetailsS3,
|
145
|
-
StorageDetailsGCS,
|
146
111
|
StorageDetailsLocal,
|
147
112
|
] = Field(validate_default=True)
|
148
113
|
format: Optional[ResponseFormat] = ResponseFormat.json.value # type: ignore
|
@@ -180,7 +145,6 @@ class StorageDestinationBase(BaseModel):
|
|
180
145
|
try:
|
181
146
|
schema = {
|
182
147
|
StorageType.s3.value: StorageDetailsS3,
|
183
|
-
StorageType.gcs.value: StorageDetailsGCS,
|
184
148
|
StorageType.local.value: StorageDetailsLocal,
|
185
149
|
}[storage_type]
|
186
150
|
except KeyError:
|
@@ -245,7 +209,7 @@ class BulkPutStorageConfigResponse(BulkResponse):
|
|
245
209
|
failed: List[BulkUpdateFailed] = []
|
246
210
|
|
247
211
|
|
248
|
-
SUPPORTED_STORAGE_SECRETS =
|
212
|
+
SUPPORTED_STORAGE_SECRETS = StorageSecretsS3
|
249
213
|
|
250
214
|
|
251
215
|
class StorageConfigStatus(Enum):
|
@@ -1,15 +1,9 @@
|
|
1
|
-
from typing import Union
|
2
|
-
|
3
1
|
from fides.api.schemas.base_class import NoValidationSchema
|
4
|
-
from fides.api.schemas.storage.storage import
|
2
|
+
from fides.api.schemas.storage.storage import StorageSecretsS3
|
5
3
|
|
6
4
|
|
7
5
|
class StorageSecretsS3Docs(StorageSecretsS3, NoValidationSchema):
|
8
6
|
"""The secrets required to connect to S3, for documentation"""
|
9
7
|
|
10
8
|
|
11
|
-
|
12
|
-
"""The secrets required to connect to Google Cloud Storage, for documentation"""
|
13
|
-
|
14
|
-
|
15
|
-
possible_storage_secrets = Union[StorageSecretsS3Docs, StorageSecretsGCSDocs]
|
9
|
+
possible_storage_secrets = StorageSecretsS3Docs
|
fides/api/schemas/system.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
from datetime import datetime
|
2
2
|
from typing import Any, Dict, List, Optional, Sequence
|
3
3
|
|
4
|
-
from fideslang.models import PrivacyDeclaration, System
|
4
|
+
from fideslang.models import Cookies, PrivacyDeclaration, System
|
5
5
|
from pydantic import ConfigDict, Field
|
6
6
|
from pydantic.main import BaseModel
|
7
7
|
|
@@ -17,6 +17,7 @@ class PrivacyDeclarationResponse(PrivacyDeclaration):
|
|
17
17
|
id: str = Field(
|
18
18
|
description="The database-assigned ID of the privacy declaration on the system. This is meant to be a read-only field, returned only in API responses"
|
19
19
|
)
|
20
|
+
cookies: Optional[List[Cookies]] = []
|
20
21
|
|
21
22
|
|
22
23
|
class BasicSystemResponse(System):
|
@@ -1,11 +1,10 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import List
|
2
2
|
|
3
3
|
from sqlalchemy.engine import Engine, LegacyCursorResult, create_engine # type: ignore
|
4
4
|
|
5
5
|
from fides.api.graph.execution import ExecutionNode
|
6
6
|
from fides.api.schemas.connection_configuration.connection_secrets_mysql import (
|
7
7
|
MySQLSchema,
|
8
|
-
MySQLSSLMode,
|
9
8
|
)
|
10
9
|
from fides.api.service.connectors.query_configs.mysql_query_config import (
|
11
10
|
MySQLQueryConfig,
|
@@ -70,27 +69,16 @@ class MySQLConnector(SQLConnector):
|
|
70
69
|
uri = self.build_ssh_uri(local_address=self.ssh_server.local_bind_address)
|
71
70
|
else:
|
72
71
|
uri = (self.configuration.secrets or {}).get("url") or self.build_uri()
|
73
|
-
connect_args = self.get_connect_args()
|
74
72
|
return create_engine(
|
75
73
|
uri,
|
76
74
|
hide_parameters=self.hide_parameters,
|
77
75
|
echo=not self.hide_parameters,
|
78
|
-
connect_args=connect_args,
|
79
76
|
)
|
80
77
|
|
81
78
|
def query_config(self, node: ExecutionNode) -> SQLQueryConfig:
|
82
79
|
"""Query wrapper corresponding to the input execution_node."""
|
83
80
|
return MySQLQueryConfig(node)
|
84
81
|
|
85
|
-
def get_connect_args(self) -> Dict[str, Dict[str, MySQLSSLMode]]:
|
86
|
-
"""Get connection arguments for the engine"""
|
87
|
-
ssl_mode = self.configuration.secrets.get("ssl_mode", MySQLSSLMode.preferred)
|
88
|
-
return {
|
89
|
-
"ssl": {
|
90
|
-
"mode": ssl_mode,
|
91
|
-
}
|
92
|
-
}
|
93
|
-
|
94
82
|
@staticmethod
|
95
83
|
def cursor_result_to_rows(results: LegacyCursorResult) -> List[Row]:
|
96
84
|
"""
|