ethyca-fides 2.56.2rc3__py2.py3-none-any.whl → 2.56.3b1__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.56.2rc3.dist-info → ethyca_fides-2.56.3b1.dist-info}/METADATA +1 -3
- {ethyca_fides-2.56.2rc3.dist-info → ethyca_fides-2.56.3b1.dist-info}/RECORD +231 -226
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/1152c1717849_fix_monitorexecution_started_default.py +57 -0
- fides/api/alembic/migrations/versions/3c58001ad310_add_messages_to_monitor_execution.py +32 -0
- fides/api/alembic/migrations/versions/bd875a8b5d96_add_attachments_and_.py +96 -0
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +2 -14
- fides/api/custom_types.py +24 -1
- fides/api/db/base.py +1 -0
- fides/api/graph/node_filters.py +112 -5
- fides/api/graph/traversal.py +34 -4
- fides/api/models/attachment.py +153 -0
- fides/api/models/audit_log.py +3 -0
- fides/api/models/detection_discovery.py +11 -2
- fides/api/models/privacy_request.py +26 -3
- fides/api/task/create_request_tasks.py +27 -9
- fides/api/task/deprecated_graph_task.py +28 -10
- fides/api/task/graph_task.py +84 -43
- fides/api/util/consent_util.py +20 -5
- fides/api/util/logger.py +19 -1
- fides/config/execution_settings.py +1 -1
- fides/config/security_settings.py +7 -13
- fides/data/sample_project/sample_connections/sample_connections.yml +29 -29
- fides/service/dataset/dataset_config_service.py +4 -2
- fides/service/privacy_request/privacy_request_service.py +32 -14
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/LOp6RUpN795nyhXOv95wz/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1150-73440d7b319558e8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2201-abd6092e6df98c26.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5728-7be08c654c024baa.js → 2397-7177ecf4ebe68feb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{255-69ac1bcb5a52b022.js → 255-bf1797f78249d090.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3005-137ef60b77c71ce1.js → 3005-373de16453ed7eea.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3086-be6b52546c3efc90.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3320-87c75df57a47487e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5318-1bfde23609ea3718.js → 3627-fb83adac32c128e6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3662-420d9807c30008ab.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3855-5c7b11871f59e0e0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{4456-67c8d5b2d96dea1d.js → 3872-f3d5054bdc584eaa.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{8141-55187bd207f5ea9e.js → 3949-9888699e2ac564c4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4294-3e67d7ef3d390c2f.js → 4294-5b3aa9d605217915.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-ca8d2c75d634b6bc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4723-81d28e5be5c7b6d7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5246-9fc6af1a6499e0a4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-3a650be9142cf914.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5480-f5bec5e881f72f8d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-d96e1abc93f92631.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5826-16e497af363a0cbc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5908-532dfbc9d930f635.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5960-8895f51b30c35798.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{618f8807-5792121b4eda076b.js → 618f8807-d15c33d1d6c8b961.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-b55810d66362f56e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6315-dee79f6861c94d2d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6362-8f79e403fdc2404a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5632-b98308c17b9cd230.js → 6372-f1b54f3cb4888660.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6834-5082b5702e80b531.js → 6834-dcda0a8ed484775e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-cacea421af3bfc26.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-6eb480eb132239c3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7044-9dc90893067f38ae.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7495-a61f0c9fcb458664.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7548-b3992b0c7fb852c9.js → 7751-25e0c1307988ffd7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/79-ba88d0cf4c65aaa2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5973-c0b74d6cf14833cb.js → 7980-2597c279c30fbcda.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/8433-969280d321d1c3a2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8499-07507004e8275df2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{8837-2b785a4e5bad4813.js → 8837-cf26e5ca1ae5aaf5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-80f1ea44f89fe32c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9255-2b1bafefb091a640.js → 9255-336a890ada321f89.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9282-1a5a2f6f4d9ed586.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{2800.40212c25719a2351.js → 9392.97b2e3327dceb7c9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9676.f4d5977a5f148797.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9999-f2e40d5b13343220.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/main-app-2650f704701c6a7b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/main-ce7f38a12ea8c223.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/404-1087258931760074.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-8021f4b202818ba2.js → _app-3c1a7742661d3a9e.js} +14 -14
- fides/ui-build/static/admin/_next/static/chunks/pages/{_error-c91b5eabd7ac9382.js → _error-bede3a8288930dcf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-d7f60624cbc12217.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-17b38b57adc62ed2.js → multiple-18b0b521255289a3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-136bcbd20ac59bf5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/ant-poc-b3b4d0a98450ffd1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7469901adf64d0e2.js → add-vendors-64f83e9a2b777bf3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-e11ace4f273ebb47.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-fdbafb5a47a6a28c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/new-fc4635c6eea7165f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-35e9df60b21e21a6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-a2713f5a7a2c45e5.js → [id]-bdc686761a0d2d60.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b67c3c8c25e7051b.js → new-8618ab5fa45cd074.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-da37afbe5ec81339.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-c57b209feef7c2da.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-97fea4ac45093cbd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-a3233ad24a82465a.js → consent-24bef021ee71e36c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-6cbd79481199812d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-46b9790da2fec05a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-1f965b9c496071d1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-e7833c1c606081a9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-6563b9d6f77d0690.js → resources-bed368d048ea6883.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-942d68a88b321067.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-00526324583139ab.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-8e6f4b1b5b89aff0.js → [monitorId]-f0ab51d0d5f995de.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-a6a9bbfac5ca8d0b.js → action-center-2220c30c3863b5a5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-1d7936f05d23097f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-c575c057b35b958e.js → [resourceUrn]-68122dbf449a11b4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-c1d2018f3ab3e39c.js → detection-0ceaf3c555e84714.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/[resourceUrn]-22c27fe0f898ad2a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery-8f2b102e19b0b8f2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-9cd0c40bef77b120.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-ab9bc1a3640547db.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-17ec8385bb1fa6d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e14c1c07658f8a10.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-fc00dbeb18a7b731.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-295756e1fd640b59.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-a6e793e9a8ed00a9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-7d314bb7238af067.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-b8eaa9b9d3832b30.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/index-c9fa68dc0fa42c81.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-20489bceb7b068b8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-21c9902e7b098b39.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/login/{[provider]-cac9584cefa85a09.js → [provider]-c58beef131c3a82d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{login-e55849091751c65a.js → login-0cb0eb44bf2dd24c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-6b032de0a6c2c400.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-c0d6ae68ff7979c6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-910372bec245ba5d.js → messaging-f263e6bacf0f2d19.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-c685d19a131d6960.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-b96ee3fea3920fcf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-1b0f9469cb65abfc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-e0ca944878ef12e8.js → configure-4bad69cd42c9722c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-eebd2f4ead19cfd6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e780943ac4ce5bf1.js → [id]-b4c808a8a0287d11.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-5a701477b006a63b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties-9a1899dfe052023e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-a3fa3ad77730a03b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-bfe2495fb54933ee.js → about-d073be113e9ca7b0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4769f55b138073f7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-744e7bbc200557e7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-c5cd5fb578de9515.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-775f55b3f80cd452.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-39c7ae3602ac69b2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-45e33ba111f8f8b0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-14def4ca3cc9cda5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-94975aeab348528e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-21f26c0dc4d09e9f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-c6396feeefca887b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-c320df35d51dc537.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-181ea5b0ac975239.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/new-d6717378b42982d5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-622e16a17a11c096.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-aa872b21bb835d34.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{webpack-c51aa6524c2716b8.js → webpack-4df2ba5ee2d40f0a.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/15fb7d4837a1de34.css +1 -0
- fides/ui-build/static/admin/_next/static/css/bd5a72c010fa9c14.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/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-tcf.js +3 -3
- 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/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/ui-build/static/admin/_next/static/_A05_bEFykI6pEGrDmq4n/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1241-5f9673b3a7fd9469.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1288-84c330c47e031622.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1827-db04b6d4756e3a25.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2017-99f489b3e0279798.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2025-b6a78063b47b0607.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2163-9631ae84deb6560b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2556-1d0c02e14299bf23.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2973-2d9d761cc3aeda1d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3163-5fe20dd3d43cef46.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3309-db63287718ef9694.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3528-30fc61a98d99a66b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3990-146beccde8afea98.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4321-1bf69f1e83baf995.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4981-8d81ec3b6031f0f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/53-eb32dc5d8571cb7b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6182-1949666cc9179015.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/637-3f7f3e47e69e75fe.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6546-aa6826fdd0356505.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7080-051d67719049e77a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7269-aaa4ad906c8bf8f7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7528.dff66491009d309b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7636-b2dadd026c1fe754.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7871-0a9b00bc8760d091.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7996-23e83b8ca562a06c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8001-3fdc7b543233f717.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8540-a7c91bdbe1bb48fb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8986-c24a626d90c8be1d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9659-478f2eaaf48a8943.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9822-88b7435d5868e1ef.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/main-6880a3888740c515.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/main-app-de538a24cbd2733c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/404-5c601b7b9c17b770.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-2bfb79fc5d16caa4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-4e54aefa8b7f554f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/ant-poc-6048ddeee842c93b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-833ab451ff99ba12.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-b796be4c70e08aa0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/new-35bc7b42751bb78a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-089a73cd8a34dbec.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cfe92d1c2e95d917.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-059c82d3b8ccdaf6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-54c762b6fe38c20e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-e1bd1bdd2c310ecc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-c9032d9e0c1dfe1a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-62087de19ac179b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-c7614c7742e41151.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-9b33b5875445751e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-c299a8bd5e1c1def.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a9a864cb621d65c6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/[resourceUrn]-9ae2adfc68b95d78.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery-a617ddfa3dfdab23.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a0e22b9ce8f5332.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-3e506baace396803.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-6bb9fbe3d41c3127.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-a358b344095573a9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-b328f9aab79dd734.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-3c0b2ccfa442b79d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-102772521ee4a69a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-754926e02c1e0ab0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-1e81b412b5837755.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-aa7b15f51ccbdf8b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-2436e6c6406e5f4f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-b6c0f9648f6fa298.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-d1e96f12c1a12d4d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-3ff3a7c3c76a208e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7b13b42d1b23f93b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-6971c7e98c00390a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-71386e3e260a9220.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-be0c167fa1565e38.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-fc660bc2a3641cd3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties-1a35fd97f2510989.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-b9fe3f3bb16a14eb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-7eec113882c35c3f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-aaf29e3dd2c7e955.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-8b7e71fe1307c5a3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-0b9e78e671540cef.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-eb04e1584d98edb3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-195f7ddfc3768ece.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-22cb683d203ea7fb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-3eede241c9df1476.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-54d7c6fcc4c79635.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-8271db0c80e6e154.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-7d81df09a0b4eb23.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-7abe76200e4519d8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/new-a59a02634d672703.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-269b17114579510b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-f7e75911c071a20e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js +0 -1
- fides/ui-build/static/admin/_next/static/css/918de8c66b18ce6b.css +0 -1
- {ethyca_fides-2.56.2rc3.dist-info → ethyca_fides-2.56.3b1.dist-info}/LICENSE +0 -0
- {ethyca_fides-2.56.2rc3.dist-info → ethyca_fides-2.56.3b1.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.56.2rc3.dist-info → ethyca_fides-2.56.3b1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.56.2rc3.dist-info → ethyca_fides-2.56.3b1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{_A05_bEFykI6pEGrDmq4n → LOp6RUpN795nyhXOv95wz}/_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-03-
|
|
11
|
+
"date": "2025-03-11T11:05:57-0400",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.56.
|
|
14
|
+
"full-revisionid": "26fed9fd3dc9101fa08d947da4153d60449f316c",
|
|
15
|
+
"version": "2.56.3b1"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""fix monitorexecution.started default
|
|
2
|
+
|
|
3
|
+
Revision ID: 1152c1717849
|
|
4
|
+
Revises: 3c58001ad310
|
|
5
|
+
Create Date: 2025-03-10 16:04:57.104689
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
from sqlalchemy.dialects import postgresql
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "1152c1717849"
|
|
15
|
+
down_revision = "3c58001ad310"
|
|
16
|
+
branch_labels = None
|
|
17
|
+
depends_on = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade():
|
|
21
|
+
# Set the new server default
|
|
22
|
+
# And set the datetime to be timezone aware
|
|
23
|
+
op.alter_column(
|
|
24
|
+
"monitorexecution",
|
|
25
|
+
"started",
|
|
26
|
+
existing_type=sa.DateTime(),
|
|
27
|
+
type_=sa.DateTime(timezone=True),
|
|
28
|
+
server_default=sa.text("now()"),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# Set the datetime to be timezone aware
|
|
32
|
+
op.alter_column(
|
|
33
|
+
"monitorexecution",
|
|
34
|
+
"completed",
|
|
35
|
+
existing_type=sa.DateTime(),
|
|
36
|
+
type_=sa.DateTime(timezone=True),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def downgrade():
|
|
41
|
+
# Remove the server default
|
|
42
|
+
# And set the datetime to not be timezone aware
|
|
43
|
+
op.alter_column(
|
|
44
|
+
"monitorexecution",
|
|
45
|
+
"started",
|
|
46
|
+
server_default=None,
|
|
47
|
+
existing_type=sa.DateTime(timezone=True),
|
|
48
|
+
type_=sa.DateTime(),
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# Set the datetime to not be timezone aware
|
|
52
|
+
op.alter_column(
|
|
53
|
+
"monitorexecution",
|
|
54
|
+
"completed",
|
|
55
|
+
existing_type=sa.DateTime(timezone=True),
|
|
56
|
+
type_=sa.DateTime(),
|
|
57
|
+
)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""add errors to monitor execution
|
|
2
|
+
|
|
3
|
+
Revision ID: 3c58001ad310
|
|
4
|
+
Revises: bd875a8b5d96
|
|
5
|
+
Create Date: 2025-02-27 20:45:38.462604
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
|
|
12
|
+
# revision identifiers, used by Alembic.
|
|
13
|
+
revision = "3c58001ad310"
|
|
14
|
+
down_revision = "bd875a8b5d96"
|
|
15
|
+
branch_labels = None
|
|
16
|
+
depends_on = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upgrade() -> None:
|
|
20
|
+
op.add_column(
|
|
21
|
+
"monitorexecution",
|
|
22
|
+
sa.Column(
|
|
23
|
+
"messages",
|
|
24
|
+
sa.ARRAY(sa.String()),
|
|
25
|
+
nullable=False,
|
|
26
|
+
server_default="{}",
|
|
27
|
+
),
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def downgrade() -> None:
|
|
32
|
+
op.drop_column("monitorexecution", "messages")
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Add Attachment and AttachmentReference tables
|
|
2
|
+
|
|
3
|
+
Revision ID: bd875a8b5d96
|
|
4
|
+
Revises: 82883b0df5e4
|
|
5
|
+
Create Date: 2025-02-19 14:09:07.124680
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
from sqlalchemy.dialects import postgresql
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "bd875a8b5d96"
|
|
15
|
+
down_revision = "82883b0df5e4"
|
|
16
|
+
branch_labels = None
|
|
17
|
+
depends_on = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade():
|
|
21
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
22
|
+
# create attachment table
|
|
23
|
+
op.create_table(
|
|
24
|
+
"attachment",
|
|
25
|
+
sa.Column("id", sa.String(length=255), nullable=False),
|
|
26
|
+
sa.Column("user_id", sa.String(), nullable=True),
|
|
27
|
+
sa.Column("file_name", sa.String(), nullable=False),
|
|
28
|
+
sa.Column("attachment_type", sa.String(), nullable=False),
|
|
29
|
+
sa.Column("storage_key", sa.String(), nullable=False),
|
|
30
|
+
sa.Column(
|
|
31
|
+
"created_at",
|
|
32
|
+
sa.DateTime(timezone=True),
|
|
33
|
+
server_default=sa.text("now()"),
|
|
34
|
+
nullable=False,
|
|
35
|
+
),
|
|
36
|
+
sa.Column(
|
|
37
|
+
"updated_at",
|
|
38
|
+
sa.DateTime(timezone=True),
|
|
39
|
+
server_default=sa.text("now()"),
|
|
40
|
+
nullable=True,
|
|
41
|
+
),
|
|
42
|
+
sa.ForeignKeyConstraint(
|
|
43
|
+
["user_id"],
|
|
44
|
+
["fidesuser.id"],
|
|
45
|
+
ondelete="SET NULL",
|
|
46
|
+
),
|
|
47
|
+
sa.PrimaryKeyConstraint("id"),
|
|
48
|
+
)
|
|
49
|
+
op.create_index(op.f("ix_attachment_id"), "attachment", ["id"], unique=False)
|
|
50
|
+
|
|
51
|
+
# create attachment_reference table
|
|
52
|
+
op.create_table(
|
|
53
|
+
"attachment_reference",
|
|
54
|
+
sa.Column("id", sa.String(length=255), nullable=False),
|
|
55
|
+
sa.Column(
|
|
56
|
+
"created_at",
|
|
57
|
+
sa.DateTime(timezone=True),
|
|
58
|
+
server_default=sa.text("now()"),
|
|
59
|
+
nullable=False,
|
|
60
|
+
),
|
|
61
|
+
sa.Column(
|
|
62
|
+
"updated_at",
|
|
63
|
+
sa.DateTime(timezone=True),
|
|
64
|
+
server_default=sa.text("now()"),
|
|
65
|
+
nullable=True,
|
|
66
|
+
),
|
|
67
|
+
sa.Column("attachment_id", sa.String(), nullable=False),
|
|
68
|
+
sa.Column("reference_id", sa.String(), nullable=False),
|
|
69
|
+
sa.Column("reference_type", sa.String(), nullable=False),
|
|
70
|
+
sa.ForeignKeyConstraint(
|
|
71
|
+
["attachment_id"],
|
|
72
|
+
["attachment.id"],
|
|
73
|
+
),
|
|
74
|
+
sa.PrimaryKeyConstraint("id"),
|
|
75
|
+
)
|
|
76
|
+
op.create_index(
|
|
77
|
+
op.f("ix_attachment_reference_id"),
|
|
78
|
+
"attachment_reference",
|
|
79
|
+
["id"],
|
|
80
|
+
unique=False,
|
|
81
|
+
)
|
|
82
|
+
op.create_unique_constraint(
|
|
83
|
+
"_attachment_reference_uc",
|
|
84
|
+
"attachment_reference",
|
|
85
|
+
["attachment_id", "reference_id"],
|
|
86
|
+
)
|
|
87
|
+
# ### end Alembic commands ###
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def downgrade():
|
|
91
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
92
|
+
op.drop_index(op.f("ix_attachment_reference_id"), table_name="attachment_reference")
|
|
93
|
+
op.drop_table("attachment_reference")
|
|
94
|
+
op.drop_index(op.f("ix_attachment_id"), table_name="attachment")
|
|
95
|
+
op.drop_table("attachment")
|
|
96
|
+
# ### end Alembic commands ###
|
|
@@ -174,7 +174,7 @@ from fides.service.privacy_request.privacy_request_service import (
|
|
|
174
174
|
PrivacyRequestService,
|
|
175
175
|
_process_privacy_request_restart,
|
|
176
176
|
_requeue_privacy_request,
|
|
177
|
-
|
|
177
|
+
handle_approval,
|
|
178
178
|
queue_privacy_request,
|
|
179
179
|
)
|
|
180
180
|
|
|
@@ -1310,19 +1310,7 @@ def verify_identification_code(
|
|
|
1310
1310
|
|
|
1311
1311
|
logger.info("Identity verified for {}.", privacy_request.id)
|
|
1312
1312
|
|
|
1313
|
-
|
|
1314
|
-
_trigger_pre_approval_webhooks(db, privacy_request)
|
|
1315
|
-
else:
|
|
1316
|
-
AuditLog.create(
|
|
1317
|
-
db=db,
|
|
1318
|
-
data={
|
|
1319
|
-
"user_id": "system",
|
|
1320
|
-
"privacy_request_id": privacy_request.id,
|
|
1321
|
-
"action": AuditLogAction.approved,
|
|
1322
|
-
"message": "",
|
|
1323
|
-
},
|
|
1324
|
-
)
|
|
1325
|
-
queue_privacy_request(privacy_request.id)
|
|
1313
|
+
handle_approval(db, config_proxy, privacy_request)
|
|
1326
1314
|
|
|
1327
1315
|
return privacy_request # type: ignore[return-value]
|
|
1328
1316
|
|
fides/api/custom_types.py
CHANGED
|
@@ -116,6 +116,23 @@ def validate_path_of_url(value: AnyUrl) -> str:
|
|
|
116
116
|
|
|
117
117
|
We perform the basic URL validation, but also prevent URLs with paths,
|
|
118
118
|
as paths are not part of an origin.
|
|
119
|
+
|
|
120
|
+
As this is meant to be used as a validator _after_ the AnyUrl validator,
|
|
121
|
+
we implicitly disallow `*` to be specified as an origin value, since it is
|
|
122
|
+
rejected by the AnyUrl validator.
|
|
123
|
+
|
|
124
|
+
Note that `*` _is_ considered a valid origin value
|
|
125
|
+
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin),
|
|
126
|
+
but we specifically disallow it to be set on the `cors_origins` security setting
|
|
127
|
+
in our application. This is because non-owner users (contributors)
|
|
128
|
+
are able to edit the `cors_origins` security setting (via API), and we do not
|
|
129
|
+
want to allow them to set a wildcard origin.
|
|
130
|
+
|
|
131
|
+
Instead, `.*` can be set via the `cors_origin_regex` security setting
|
|
132
|
+
to effectively allow all origins. This is roughly equivalent to setting
|
|
133
|
+
`"*"` as a `cors_origin`, but there is a slight behavioral difference:
|
|
134
|
+
the `Access-Control-Allow-Origin` in the response will be set to the
|
|
135
|
+
`Access-Control-Allow-Origin` specified in the request rather than `"*"`.
|
|
119
136
|
"""
|
|
120
137
|
if value.path and value.path != "/":
|
|
121
138
|
raise ValueError("URL origin values cannot contain a path.")
|
|
@@ -125,7 +142,13 @@ def validate_path_of_url(value: AnyUrl) -> str:
|
|
|
125
142
|
return str(value).rstrip("/")
|
|
126
143
|
|
|
127
144
|
|
|
128
|
-
|
|
145
|
+
# This custom type is used to validate HTTP origins, e.g. CORS origins
|
|
146
|
+
# used in SecuritySettings. See docstring for `validate_path_of_url`
|
|
147
|
+
# for more details.
|
|
148
|
+
URLOriginString = Annotated[
|
|
149
|
+
AnyUrl,
|
|
150
|
+
AfterValidator(validate_path_of_url),
|
|
151
|
+
]
|
|
129
152
|
|
|
130
153
|
|
|
131
154
|
def validate_css_str(value: str) -> str:
|
fides/api/db/base.py
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
from fides.api.db.base_class import Base
|
|
5
5
|
from fides.api.models.application_config import ApplicationConfig
|
|
6
6
|
from fides.api.models.asset import Asset
|
|
7
|
+
from fides.api.models.attachment import Attachment, AttachmentReference
|
|
7
8
|
from fides.api.models.audit_log import AuditLog
|
|
8
9
|
from fides.api.models.authentication_request import AuthenticationRequest
|
|
9
10
|
from fides.api.models.client import ClientDetail
|
fides/api/graph/node_filters.py
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
|
-
from
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set
|
|
2
3
|
|
|
4
|
+
from fides.api.common_exceptions import TraversalError, UnreachableNodesError
|
|
5
|
+
from fides.api.graph.graph import DatasetGraph
|
|
3
6
|
from fides.api.models.policy import Policy
|
|
7
|
+
from fides.api.util.logger import suppress_logging
|
|
4
8
|
|
|
5
9
|
if TYPE_CHECKING:
|
|
6
10
|
from fides.api.graph.traversal import TraversalNode
|
|
7
11
|
|
|
8
12
|
|
|
9
|
-
class NodeFilter(
|
|
10
|
-
"""
|
|
13
|
+
class NodeFilter(ABC):
|
|
14
|
+
"""Abstract base class for node filters that determine if nodes should be excluded from traversal"""
|
|
11
15
|
|
|
16
|
+
def __init__(self) -> None:
|
|
17
|
+
self.skipped_nodes: Dict[str, str] = {}
|
|
18
|
+
|
|
19
|
+
@abstractmethod
|
|
12
20
|
def exclude_node(self, node: "TraversalNode") -> bool:
|
|
13
21
|
"""Returns True if the node should be excluded from traversal requirements"""
|
|
14
22
|
|
|
15
23
|
|
|
16
|
-
class CustomRequestFieldFilter:
|
|
24
|
+
class CustomRequestFieldFilter(NodeFilter):
|
|
17
25
|
"""
|
|
18
26
|
Remove nodes that have custom request fields, since we don't care if these are reachable or not.
|
|
19
27
|
They will be used independently by the Dynamic Email Erasure Connector.
|
|
@@ -26,16 +34,115 @@ class CustomRequestFieldFilter:
|
|
|
26
34
|
return bool(node.node.collection.custom_request_fields())
|
|
27
35
|
|
|
28
36
|
|
|
29
|
-
class PolicyDataCategoryFilter:
|
|
37
|
+
class PolicyDataCategoryFilter(NodeFilter):
|
|
30
38
|
"""
|
|
31
39
|
If a policy is provided, we will allow collections without relevant
|
|
32
40
|
data categories to remain unreachable without raising any exceptions.
|
|
33
41
|
"""
|
|
34
42
|
|
|
35
43
|
def __init__(self, policy: Optional[Policy]):
|
|
44
|
+
super().__init__()
|
|
36
45
|
self.policy = policy
|
|
37
46
|
|
|
38
47
|
def exclude_node(self, node: "TraversalNode") -> bool:
|
|
39
48
|
if not self.policy:
|
|
40
49
|
return False
|
|
41
50
|
return not self.policy.applies_to(node)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class OptionalIdentityFilter(NodeFilter):
|
|
54
|
+
|
|
55
|
+
def __init__(self, graph: DatasetGraph, identities: Dict[str, Any]):
|
|
56
|
+
"""
|
|
57
|
+
Filter that excludes nodes that are reachable by an optional identity.
|
|
58
|
+
This prevents traversal errors for nodes that would be reachable if the required identities were provided.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
super().__init__()
|
|
62
|
+
self.graph = graph
|
|
63
|
+
self.identities = identities
|
|
64
|
+
self.skipped_nodes: Dict[str, str] = {}
|
|
65
|
+
|
|
66
|
+
# Pre-compute which nodes are reachable with each identity
|
|
67
|
+
self.reachable_by_identity: Dict[str, Set[str]] = {}
|
|
68
|
+
|
|
69
|
+
# Get all collection addresses as strings
|
|
70
|
+
all_collection_addresses = {str(addr) for addr in graph.nodes.keys()}
|
|
71
|
+
|
|
72
|
+
# Test reachability with each possible identity seed
|
|
73
|
+
for identity_key in graph.identity_keys.values():
|
|
74
|
+
self._compute_reachable_nodes(identity_key, all_collection_addresses)
|
|
75
|
+
|
|
76
|
+
def exclude_node(self, node: "TraversalNode") -> bool:
|
|
77
|
+
"""
|
|
78
|
+
Exclude nodes that are reachable by any identity, provided or optional.
|
|
79
|
+
Nodes (collections) not reachable by any identities should not be excluded and still be considered an error.
|
|
80
|
+
"""
|
|
81
|
+
node_address = str(node.address)
|
|
82
|
+
|
|
83
|
+
# Check if node is reachable by any provided identity
|
|
84
|
+
for identity_key in self.identities:
|
|
85
|
+
if node_address in self.reachable_by_identity.get(identity_key, set()):
|
|
86
|
+
return True
|
|
87
|
+
|
|
88
|
+
# Find all optional identities that can reach this node
|
|
89
|
+
reaching_identities = []
|
|
90
|
+
for identity_key, reachable_nodes in self.reachable_by_identity.items():
|
|
91
|
+
if identity_key not in self.identities and node_address in reachable_nodes:
|
|
92
|
+
reaching_identities.append(identity_key)
|
|
93
|
+
|
|
94
|
+
# If any optional identities can reach this node, record them and exclude
|
|
95
|
+
if reaching_identities:
|
|
96
|
+
self.skipped_nodes[node_address] = self._format_skip_message(
|
|
97
|
+
node.address.value, reaching_identities
|
|
98
|
+
)
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
# Node isn't reachable by any identity, don't exclude it (will be an error)
|
|
102
|
+
return False
|
|
103
|
+
|
|
104
|
+
def _compute_reachable_nodes(
|
|
105
|
+
self, identity_key: str, all_addresses: Set[str]
|
|
106
|
+
) -> None:
|
|
107
|
+
"""Helper method to compute which nodes are reachable with a given identity key"""
|
|
108
|
+
|
|
109
|
+
from fides.api.graph.traversal import BaseTraversal
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
# Create a traversal object with just this identity
|
|
113
|
+
with suppress_logging():
|
|
114
|
+
# Suppress the logs since we don't want to flood the logs
|
|
115
|
+
# with traversal info for each identity we want to evaluate
|
|
116
|
+
BaseTraversal(self.graph, {identity_key: "dummy_value"})
|
|
117
|
+
|
|
118
|
+
# If successful, all nodes are reachable
|
|
119
|
+
self.reachable_by_identity[identity_key] = all_addresses
|
|
120
|
+
except UnreachableNodesError as exc:
|
|
121
|
+
# Get reachable nodes by removing unreachable ones from all nodes
|
|
122
|
+
unreachable = set(exc.errors)
|
|
123
|
+
self.reachable_by_identity[identity_key] = all_addresses - unreachable
|
|
124
|
+
except TraversalError:
|
|
125
|
+
# If traversal fails for other reasons, no nodes are reachable
|
|
126
|
+
self.reachable_by_identity[identity_key] = set()
|
|
127
|
+
|
|
128
|
+
def _format_skip_message(
|
|
129
|
+
self, node_address: str, reaching_identities: List[str]
|
|
130
|
+
) -> str:
|
|
131
|
+
"""
|
|
132
|
+
Format the skip message with proper grammar based on identity counts.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
# Format lists of quoted identities
|
|
136
|
+
reachable_ids_str = ", ".join(f'"{id}"' for id in reaching_identities)
|
|
137
|
+
provided_ids = list(self.identities.keys())
|
|
138
|
+
provided_ids_str = ", ".join(f'"{id}"' for id in provided_ids)
|
|
139
|
+
|
|
140
|
+
# Determine singular/plural forms based on counts
|
|
141
|
+
reachable_term = "identity" if len(reaching_identities) == 1 else "identities"
|
|
142
|
+
provided_term = "identity" if len(provided_ids) == 1 else "identities"
|
|
143
|
+
was_were = "was" if len(provided_ids) == 1 else "were"
|
|
144
|
+
|
|
145
|
+
return (
|
|
146
|
+
f'Skipping the "{node_address}" collection, it is reachable by the {reachable_ids_str} '
|
|
147
|
+
f"{reachable_term} but only the {provided_ids_str} {provided_term} {was_were} provided"
|
|
148
|
+
)
|
fides/api/graph/traversal.py
CHANGED
|
@@ -28,6 +28,7 @@ from fides.api.graph.graph import DatasetGraph, Edge, Node
|
|
|
28
28
|
from fides.api.graph.node_filters import (
|
|
29
29
|
CustomRequestFieldFilter,
|
|
30
30
|
NodeFilter,
|
|
31
|
+
OptionalIdentityFilter,
|
|
31
32
|
PolicyDataCategoryFilter,
|
|
32
33
|
)
|
|
33
34
|
from fides.api.models.policy import Policy
|
|
@@ -64,7 +65,7 @@ def artificial_traversal_node(address: CollectionAddress) -> TraversalNode:
|
|
|
64
65
|
return TraversalNode(node)
|
|
65
66
|
|
|
66
67
|
|
|
67
|
-
class
|
|
68
|
+
class BaseTraversal:
|
|
68
69
|
"""Handling for a single reified traversal of a graph based on input (seed) data."""
|
|
69
70
|
|
|
70
71
|
def extract_seed_field_addresses(
|
|
@@ -83,6 +84,7 @@ class Traversal:
|
|
|
83
84
|
self,
|
|
84
85
|
graph: DatasetGraph,
|
|
85
86
|
data: Dict[str, Any],
|
|
87
|
+
*,
|
|
86
88
|
policy: Optional[Policy] = None,
|
|
87
89
|
node_filters: Optional[List[NodeFilter]] = None,
|
|
88
90
|
):
|
|
@@ -93,9 +95,6 @@ class Traversal:
|
|
|
93
95
|
# Node filters are used to allow unreachable nodes to be ignored
|
|
94
96
|
# if they don't apply to the given scenario
|
|
95
97
|
self.node_filters = node_filters or []
|
|
96
|
-
self.node_filters.append(CustomRequestFieldFilter())
|
|
97
|
-
if policy:
|
|
98
|
-
self.node_filters.append(PolicyDataCategoryFilter(policy))
|
|
99
98
|
|
|
100
99
|
self.traversal_node_dict = {k: TraversalNode(v) for k, v in graph.nodes.items()}
|
|
101
100
|
self.edges: Set[Edge] = graph.edges.copy()
|
|
@@ -289,6 +288,37 @@ class Traversal:
|
|
|
289
288
|
logger.debug("Found {} end nodes: {}", len(end_nodes), end_nodes)
|
|
290
289
|
return end_nodes
|
|
291
290
|
|
|
291
|
+
@property
|
|
292
|
+
def skipped_nodes(self) -> Dict[str, str]:
|
|
293
|
+
"""
|
|
294
|
+
Returns a dictionary of node addresses to skip reasons from all node filters.
|
|
295
|
+
"""
|
|
296
|
+
result = {}
|
|
297
|
+
for node_filter in self.node_filters:
|
|
298
|
+
result.update(node_filter.skipped_nodes)
|
|
299
|
+
return result
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
class Traversal(BaseTraversal):
|
|
303
|
+
"""Handling for a single reified traversal of a graph based on input (seed) data."""
|
|
304
|
+
|
|
305
|
+
def __init__(
|
|
306
|
+
self,
|
|
307
|
+
graph: DatasetGraph,
|
|
308
|
+
data: Dict[str, Any],
|
|
309
|
+
*,
|
|
310
|
+
policy: Optional[Policy] = None,
|
|
311
|
+
node_filters: Optional[List[NodeFilter]] = None,
|
|
312
|
+
):
|
|
313
|
+
filters = node_filters or []
|
|
314
|
+
|
|
315
|
+
filters.append(CustomRequestFieldFilter())
|
|
316
|
+
filters.append(OptionalIdentityFilter(graph, data))
|
|
317
|
+
if policy:
|
|
318
|
+
filters.append(PolicyDataCategoryFilter(policy))
|
|
319
|
+
|
|
320
|
+
super().__init__(graph, data, policy=policy, node_filters=filters)
|
|
321
|
+
|
|
292
322
|
|
|
293
323
|
def log_traversal_error_and_update_privacy_request(
|
|
294
324
|
privacy_request: PrivacyRequest, session: Session, err: TraversalError
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
from enum import Enum as EnumType
|
|
2
|
+
from typing import Any, Optional
|
|
3
|
+
|
|
4
|
+
from sqlalchemy import Column
|
|
5
|
+
from sqlalchemy import Enum as EnumColumn
|
|
6
|
+
from sqlalchemy import ForeignKey, String, UniqueConstraint
|
|
7
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
8
|
+
from sqlalchemy.orm import Session, relationship
|
|
9
|
+
|
|
10
|
+
from fides.api.db.base_class import Base
|
|
11
|
+
from fides.api.models.fides_user import FidesUser # pylint: disable=unused-import
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class AttachmentType(str, EnumType):
|
|
15
|
+
"""
|
|
16
|
+
Enum for attachment types. Indicates attachment usage.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
internal_use_only = "internal_use_only"
|
|
20
|
+
include_with_access_package = "include_with_access_package"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AttachmentReferenceType(str, EnumType):
|
|
24
|
+
"""
|
|
25
|
+
Enum for attachment reference types. Indicates where attachment is referenced.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
manual_step = "manual_step"
|
|
29
|
+
privacy_request = "privacy_request"
|
|
30
|
+
comment = "comment"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class AttachmentReference(Base):
|
|
34
|
+
"""
|
|
35
|
+
Stores information about an Attachment and any other element which may reference that attachment.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
@declared_attr
|
|
39
|
+
def __tablename__(cls) -> str:
|
|
40
|
+
"""Overriding base class method to set the table name."""
|
|
41
|
+
return "attachment_reference"
|
|
42
|
+
|
|
43
|
+
attachment_id = Column(String, ForeignKey("attachment.id"), nullable=False)
|
|
44
|
+
reference_id = Column(String, nullable=False)
|
|
45
|
+
reference_type = Column(EnumColumn(AttachmentReferenceType), nullable=False)
|
|
46
|
+
|
|
47
|
+
__table_args__ = (
|
|
48
|
+
UniqueConstraint(
|
|
49
|
+
"attachment_id", "reference_id", name="_attachment_reference_uc"
|
|
50
|
+
),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
attachment = relationship(
|
|
54
|
+
"Attachment",
|
|
55
|
+
back_populates="references",
|
|
56
|
+
uselist=False,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def create(
|
|
61
|
+
cls, db: Session, *, data: dict[str, Any], check_name: bool = False
|
|
62
|
+
) -> "AttachmentReference":
|
|
63
|
+
"""Creates a new attachment reference record in the database."""
|
|
64
|
+
return super().create(db=db, data=data, check_name=check_name)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class Attachment(Base):
|
|
68
|
+
"""
|
|
69
|
+
Stores information about an Attachment.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
user_id = Column(
|
|
73
|
+
String, ForeignKey("fidesuser.id", ondelete="SET NULL"), nullable=True
|
|
74
|
+
)
|
|
75
|
+
file_name = Column(String, nullable=False)
|
|
76
|
+
attachment_type = Column(EnumColumn(AttachmentType), nullable=False)
|
|
77
|
+
storage_key = Column(String, nullable=False)
|
|
78
|
+
|
|
79
|
+
user = relationship(
|
|
80
|
+
"FidesUser",
|
|
81
|
+
backref="attachments",
|
|
82
|
+
lazy="selectin",
|
|
83
|
+
uselist=False,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
references = relationship(
|
|
87
|
+
"AttachmentReference",
|
|
88
|
+
back_populates="attachment",
|
|
89
|
+
cascade="all, delete",
|
|
90
|
+
uselist=True,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
async def upload_attachment_to_s3(self, attachment: bytes) -> None:
|
|
94
|
+
"""Upload an attachment to S3 to the storage_url."""
|
|
95
|
+
raise NotImplementedError("This method is not yet implemented")
|
|
96
|
+
# AuditLog.create(
|
|
97
|
+
# db=db,
|
|
98
|
+
# data={
|
|
99
|
+
# "user_id": "system",
|
|
100
|
+
# "privacy_request_id": privacy_request.id,
|
|
101
|
+
# "action": AuditLogAction.attachment_uploaded,
|
|
102
|
+
# "message": "",
|
|
103
|
+
# },
|
|
104
|
+
# )
|
|
105
|
+
|
|
106
|
+
async def retrieve_attachment_from_s3(self) -> bytes:
|
|
107
|
+
"""Retrieve an attachment from S3."""
|
|
108
|
+
raise NotImplementedError("This method is not yet implemented")
|
|
109
|
+
# AuditLog.create(
|
|
110
|
+
# db=db,
|
|
111
|
+
# data={
|
|
112
|
+
# "user_id": "system",
|
|
113
|
+
# "privacy_request_id": privacy_request.id,
|
|
114
|
+
# "action": AuditLogAction.attachment_retrieved,
|
|
115
|
+
# "message": "",
|
|
116
|
+
# },
|
|
117
|
+
# )
|
|
118
|
+
|
|
119
|
+
async def delete_attachment_from_s3(self) -> None:
|
|
120
|
+
"""Delete an attachment from S3."""
|
|
121
|
+
raise NotImplementedError("This method is not yet implemented")
|
|
122
|
+
# AuditLog.create(
|
|
123
|
+
# db=db,
|
|
124
|
+
# data={
|
|
125
|
+
# "user_id": "system",
|
|
126
|
+
# "privacy_request_id": privacy_request.id,
|
|
127
|
+
# "action": AuditLogAction.attachment_deleted,
|
|
128
|
+
# "message": "",
|
|
129
|
+
# },
|
|
130
|
+
# )
|
|
131
|
+
|
|
132
|
+
@classmethod
|
|
133
|
+
def create(
|
|
134
|
+
cls,
|
|
135
|
+
db: Session,
|
|
136
|
+
*,
|
|
137
|
+
data: dict[str, Any],
|
|
138
|
+
check_name: bool = False,
|
|
139
|
+
attachment: Optional[
|
|
140
|
+
bytes
|
|
141
|
+
] = None, # This will not be optional once the upload method is implemented.
|
|
142
|
+
) -> "Attachment":
|
|
143
|
+
"""Creates a new attachment record in the database and uploads the attachment to S3."""
|
|
144
|
+
# attachment_record.upload_attachment_to_s3(db, attachment)
|
|
145
|
+
# log.info(f"Uploaded attachment {attachment_record.id} to S3")
|
|
146
|
+
return super().create(db=db, data=data, check_name=check_name)
|
|
147
|
+
|
|
148
|
+
def delete(self, db: Session) -> None:
|
|
149
|
+
"""Deletes an attachment record from the database and deletes the attachment from S3."""
|
|
150
|
+
# attachment_record = cls.get(db, id)
|
|
151
|
+
# attachment_record.delete_attachment_from_s3(db)
|
|
152
|
+
# log.info(f"Deleted attachment {attachment_record.id} from S3")
|
|
153
|
+
super().delete(db=db)
|
fides/api/models/audit_log.py
CHANGED
|
@@ -11,6 +11,9 @@ class AuditLogAction(str, EnumType):
|
|
|
11
11
|
"""Enum for audit log actions, reflecting what a user did."""
|
|
12
12
|
|
|
13
13
|
approved = "approved"
|
|
14
|
+
attachment_uploaded = "attachment_uploaded"
|
|
15
|
+
attachment_deleted = "attachment_deleted"
|
|
16
|
+
attachment_retrieved = "attachment_retrieved"
|
|
14
17
|
denied = "denied"
|
|
15
18
|
email_sent = "email_sent"
|
|
16
19
|
finished = "finished"
|