ethyca-fides 2.59.2rc1__py2.py3-none-any.whl → 2.60.0rc0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ethyca_fides-2.59.2rc1.dist-info → ethyca_fides-2.60.0rc0.dist-info}/METADATA +2 -2
- {ethyca_fides-2.59.2rc1.dist-info → ethyca_fides-2.60.0rc0.dist-info}/RECORD +210 -206
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/c9c72b3d550b_data_migration_cookie_asset.py +218 -0
- fides/api/api/v1/endpoints/storage_endpoints.py +7 -6
- fides/api/db/system.py +1 -121
- fides/api/models/asset.py +1 -2
- fides/api/models/privacy_notice.py +14 -19
- fides/api/models/sql_models.py +0 -51
- fides/api/schemas/application_config.py +1 -0
- fides/api/schemas/connection_configuration/connection_secrets_datahub.py +3 -3
- fides/api/schemas/connection_configuration/connection_secrets_website.py +4 -2
- fides/api/schemas/messaging/messaging.py +9 -2
- fides/api/schemas/storage/storage.py +40 -4
- fides/api/schemas/storage/storage_secrets_docs_only.py +8 -2
- fides/api/schemas/system.py +1 -2
- fides/api/service/storage/gcs.py +38 -0
- fides/api/service/storage/storage_authenticator_service.py +39 -16
- fides/api/service/storage/storage_uploader_service.py +25 -1
- fides/api/tasks/storage.py +50 -2
- fides/api/util/aws_util.py +28 -17
- fides/api/util/storage_util.py +2 -0
- fides/service/messaging/aws_ses_service.py +25 -16
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/Evya6_CtQ_6H8rU12NB5C/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1100-c3d52c9d7d6d0a39.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1817-3d9a78857dd5a9f4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1904-281183a117e26585.js → 1904-00404c45e69d3225.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2479-b4f7a1c7c711cb65.js → 2479-064aefb3d187d6a2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3503-296468f82b067ec4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3513-d03549cb201e7938.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3702-3d814671c31eaca3.js → 3702-929a386a64d55f19.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-3345160a78baa978.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3872-d7045d15aafffa12.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/401-1ba7e037992ac460.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4060-dd7b6e0472703a2e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4121-01c43bbbfc6b8fd1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4481-cd91353711218b86.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-fd9b930f4246520a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5826-1f4f74bf3b5348e4.js → 5826-5f6e7a91e9ff71d1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5835-057c2dec5117817c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5973-6f53799483424513.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6277-b4885ac291c35484.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6372-2aee10b79089521a.js → 6372-e35fc0a8874fdecf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-df71f47693b139d3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-00d6683243cc75d8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7751-b3af4819eac0bc9c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/79-110e5199495a81c7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8433-2c6947927b1e74f5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8934-41284e609c329cdd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9282-6b14898de61ba6f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9327-2be9f27fbce039b0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9392.da35a8e778812d91.js → 9392.9178313b7a01d889.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9572-c3e70eb702e9d879.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.f297a1347ac09c56.js → 9676.d1e42fd1d03c4a76.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9719-8ce33427015f12ae.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9767-e8b0b48d602451d8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9951-66aad0602aadfbe2.js → 9951-d8d1174b00f9dac1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9965-dac854cdf6141611.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-29560aa2e6a60963.js → 404-73e79d3760ef2658.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-13a604eb8d39dffc.js → _app-854abc8128542e40.js} +48 -48
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-2edda5eb5412ffb2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2392e3a101fae073.js → multiple-27c3bdcc05a1f18e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-2c64d0a87784019b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/ant-poc-3c256e928748177a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7dfe37b9f0ff9a3c.js → add-vendors-b3d62016149e5aa4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-dba7848b760ba227.js → configure-790c7c61ff9500f1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-6641f24adf72b00c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-c02b14c50b19bd91.js → new-300fd2800c417d0b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-f0ba90152c43c742.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-75c2ed6ba3de48cd.js → [id]-669b1039a5f0dcb6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-487ae57dc7e2ded2.js → new-e24975eaeedc7c51.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-90b331a666216e38.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-f67fda6a71d0a46b.js → properties-b9919fa183e9308a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-1762ed46d98cebad.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-75395dfc224cf44b.js → consent-07bc6a18cbad414a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-fa65c67ec8c4b5e6.js → [projectUrn]-864af917f60d8f35.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-e76a07ee6ee8d55f.js → projects-45ac2c54f21a57d5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-8e0bc6d01176081a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-a1259aa44bf99194.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a8b44307dfd5c23e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-333964fc8ce20616.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-438ab93c6cd5c2a6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-1bcaa606739ea1c5.js → [resourceUrn]-10f789d4ab2b8927.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-22f55dc12354b4c6.js → detection-f473b2ee1c67be3c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-86111c25dc30ef2b.js → [resourceUrn]-2569551ae75ea5a2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-853be75f08b9ab5c.js → discovery-ad077f30849fdc0a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-423172d31de8e9c6.js → datamap-05144da6383ba6a4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-704553f5329fb9d4.js → [...subfieldNames]-a3311bdf11e5bb1b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-06c19dca941edb14.js → [collectionName]-b584029b66084b2a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-eac517f43d5f53a8.js → [datasetId]-2ababde59fc9efb4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-60a80195eafe9839.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-f4d57b3432c57112.js → dataset-5190a42b4bddac7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-b2b1168d0361baa8.js → [id]-63af795429688cac.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-c804349a417a888b.js → new-32ff2757c1fb5a00.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-92dce084869b6a94.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/index-7220a947bb52c5a8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-5a600a16f2ad5fa0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-372906eb228e73b7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-66f5fbadd8455805.js → [id]-34e5d096311c5aab.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-d441abb1f045940f.js → add-template-722590a322ea866b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-77726c8d9ad39a64.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-54ea39f203182c53.js → [id]-12037a323158a7be.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-df490b611f1360fa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-8575fd1d25457b4d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-66c6d3725fc1861f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-ff5856fc531097b2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-f4fb941df069b7bf.js → [id]-7f8cc582fc11b46d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-bccb6ffab25aa214.js → add-property-b739361d2b5714db.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-9a7ac623370b7c00.js → properties-febd16a18011fd1e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-6d046c2bf03ce067.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-95e9953afaad9260.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-0d593a93ef57dbd7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-8483a13c5217f295.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-d6e18187d6412a34.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-d9088f5cd9fb2822.js → domain-records-0392d1bc2b8ec616.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-db42cce5ec0ca55b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-297f558258a46f74.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-759564ca0ae62840.js → locations-38ce7883fd27b61f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3dc30591cc0a8881.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-2dce4501fca920b3.js → regulations-22d97471513e835d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f408ebdc01892ff0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-69e582763772aec9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-d7a63f851cc99583.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-244453d6d5413d6c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-082c3156175f9267.js → new-65ef1bdebb679666.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-d527d1d1635541df.js → [id]-f29f0fbd62e10b6d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-f2dc8220e4aab9d7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{webpack-03e375f6d6b2c71b.js → webpack-32c43a8d709ca5c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/a063d3d67fe688f6.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-preview.js +1 -0
- 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/[configuration_id]/[purpose_id].html +1 -0
- 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/chunks/1100-45c0634b4f51d10c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1376-92890c17ce39ca0d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/146-d1820217dc36d46d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-6abbe957a53026d7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3086-d1ba90bc6ac9174b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3244-3d94bf3393366412.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-237afbbea7f54707.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-c53d74aebd12cfd3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-50974f107c2712fc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4060-52fd85fb1e15a2b8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4121-476f657b03a78965.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-288d74a33473cff7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5102-626b9ff42e904276.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5480-1623dbacdf4e6794.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5487-9a2aecb0ec63d567.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-ae645d0f2db4d579.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6395-4224d6d26d1e8bb7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-ca5dacd25c9ccb7c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-127745bfdc5bc0b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7751-3913b8c055f599e5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-77cfed02164241ca.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8433-c4c765833ab9cc07.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8934-ffa2b0509bc7a845.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9282-1a48b10b114d01f4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9327-4970d356f7000c0b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9572-2b9b10e146130c85.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-bf415d0daea960cd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-58e9256e86916ecd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a6926f7ec7ad10cf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/ant-poc-404f3c9018952800.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-78de4bde88e18b0f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-7eeeee3769e73f78.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-65091908d6296afc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-7a1976c0d1aca8b6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-75989f9732d90793.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-6b3d1fe762c747d8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-61eafb8444bffb76.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-38476c697da53480.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-e7869f658e3017b9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5aff1d01c6c30ad6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-0faa9b3c4555e585.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-e72904e316ede1b0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-17191a759e167ca8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-88e51c81a380ebad.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-eef56c95b08aa24c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-d889076067104e56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-3355b4803b2916f3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b8c94b10ab90b061.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-3ac47981f1e2b0aa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-fe743440d7eb007b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-4412a7b468b6d4bf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-cdc866af93898716.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-a7dc8113067dff42.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-2f03e981234c40ad.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-cf09ad896c7396a6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-5bcc7a6976e01a56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0b47ff26897c1d9a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-dd053a3bf2a9ca6c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-820893393f1516ee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-8fccd670220dbf60.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-facb8c0128a44cb1.js +0 -1
- fides/ui-build/static/admin/_next/static/css/687135955af5b7e1.css +0 -1
- fides/ui-build/static/admin/_next/static/oEiv2CthgHT2QEn0X5ZRN/_buildManifest.js +0 -1
- {ethyca_fides-2.59.2rc1.dist-info → ethyca_fides-2.60.0rc0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.59.2rc1.dist-info → ethyca_fides-2.60.0rc0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.59.2rc1.dist-info → ethyca_fides-2.60.0rc0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.59.2rc1.dist-info → ethyca_fides-2.60.0rc0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{oEiv2CthgHT2QEn0X5ZRN → Evya6_CtQ_6H8rU12NB5C}/_ssgManifest.js +0 -0
@@ -61,6 +61,20 @@ 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
|
+
|
64
78
|
class StorageDetailsLocal(FileBasedStorageDetails):
|
65
79
|
"""The details required to configurate local storage configuration"""
|
66
80
|
|
@@ -71,6 +85,8 @@ class StorageSecrets(Enum):
|
|
71
85
|
# s3-specific
|
72
86
|
AWS_ACCESS_KEY_ID = "aws_access_key_id"
|
73
87
|
AWS_SECRET_ACCESS_KEY = "aws_secret_access_key"
|
88
|
+
REGION_NAME = "region_name"
|
89
|
+
AWS_ASSUME_ROLE = "assume_role_arn"
|
74
90
|
|
75
91
|
|
76
92
|
class StorageSecretsLocal(BaseModel):
|
@@ -80,10 +96,27 @@ class StorageSecretsLocal(BaseModel):
|
|
80
96
|
|
81
97
|
|
82
98
|
class StorageSecretsS3(BaseModel):
|
83
|
-
|
99
|
+
aws_access_key_id: Optional[str] = None
|
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
|
+
|
84
105
|
|
85
|
-
|
86
|
-
|
106
|
+
class StorageSecretsGCS(BaseModel):
|
107
|
+
"""The secrets required to connect to a Google Cloud Storage bucket."""
|
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
|
87
120
|
model_config = ConfigDict(extra="forbid")
|
88
121
|
|
89
122
|
|
@@ -99,6 +132,7 @@ class StorageType(Enum):
|
|
99
132
|
|
100
133
|
FULLY_CONFIGURED_STORAGE_TYPES = (
|
101
134
|
StorageType.s3,
|
135
|
+
StorageType.gcs,
|
102
136
|
) # storage types that are considered "fully configured"
|
103
137
|
|
104
138
|
|
@@ -108,6 +142,7 @@ class StorageDestinationBase(BaseModel):
|
|
108
142
|
type: StorageType
|
109
143
|
details: Union[
|
110
144
|
StorageDetailsS3,
|
145
|
+
StorageDetailsGCS,
|
111
146
|
StorageDetailsLocal,
|
112
147
|
] = Field(validate_default=True)
|
113
148
|
format: Optional[ResponseFormat] = ResponseFormat.json.value # type: ignore
|
@@ -145,6 +180,7 @@ class StorageDestinationBase(BaseModel):
|
|
145
180
|
try:
|
146
181
|
schema = {
|
147
182
|
StorageType.s3.value: StorageDetailsS3,
|
183
|
+
StorageType.gcs.value: StorageDetailsGCS,
|
148
184
|
StorageType.local.value: StorageDetailsLocal,
|
149
185
|
}[storage_type]
|
150
186
|
except KeyError:
|
@@ -209,7 +245,7 @@ class BulkPutStorageConfigResponse(BulkResponse):
|
|
209
245
|
failed: List[BulkUpdateFailed] = []
|
210
246
|
|
211
247
|
|
212
|
-
SUPPORTED_STORAGE_SECRETS = StorageSecretsS3
|
248
|
+
SUPPORTED_STORAGE_SECRETS = Union[StorageSecretsS3, StorageSecretsGCS]
|
213
249
|
|
214
250
|
|
215
251
|
class StorageConfigStatus(Enum):
|
@@ -1,9 +1,15 @@
|
|
1
|
+
from typing import Union
|
2
|
+
|
1
3
|
from fides.api.schemas.base_class import NoValidationSchema
|
2
|
-
from fides.api.schemas.storage.storage import StorageSecretsS3
|
4
|
+
from fides.api.schemas.storage.storage import StorageSecretsGCS, StorageSecretsS3
|
3
5
|
|
4
6
|
|
5
7
|
class StorageSecretsS3Docs(StorageSecretsS3, NoValidationSchema):
|
6
8
|
"""The secrets required to connect to S3, for documentation"""
|
7
9
|
|
8
10
|
|
9
|
-
|
11
|
+
class StorageSecretsGCSDocs(StorageSecretsGCS, NoValidationSchema):
|
12
|
+
"""The secrets required to connect to Google Cloud Storage, for documentation"""
|
13
|
+
|
14
|
+
|
15
|
+
possible_storage_secrets = Union[StorageSecretsS3Docs, StorageSecretsGCSDocs]
|
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
|
4
|
+
from fideslang.models import PrivacyDeclaration, System
|
5
5
|
from pydantic import ConfigDict, Field
|
6
6
|
from pydantic.main import BaseModel
|
7
7
|
|
@@ -17,7 +17,6 @@ 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]] = []
|
21
20
|
|
22
21
|
|
23
22
|
class BasicSystemResponse(System):
|
@@ -0,0 +1,38 @@
|
|
1
|
+
from typing import Dict, Optional
|
2
|
+
|
3
|
+
from google.cloud.storage import Client # type: ignore
|
4
|
+
from google.oauth2 import service_account
|
5
|
+
from loguru import logger
|
6
|
+
|
7
|
+
from fides.api.common_exceptions import StorageUploadError
|
8
|
+
from fides.api.schemas.storage.storage import GCSAuthMethod
|
9
|
+
|
10
|
+
|
11
|
+
def get_gcs_client(
|
12
|
+
auth_method: str,
|
13
|
+
storage_secrets: Optional[Dict],
|
14
|
+
) -> Client:
|
15
|
+
"""
|
16
|
+
Abstraction to retrieve a GCS client using secrets.
|
17
|
+
"""
|
18
|
+
if auth_method == GCSAuthMethod.ADC.value:
|
19
|
+
storage_client = Client()
|
20
|
+
|
21
|
+
elif auth_method == GCSAuthMethod.SERVICE_ACCOUNT_KEYS.value:
|
22
|
+
if not storage_secrets:
|
23
|
+
err_msg = "Storage secrets not found for Google Cloud Storage."
|
24
|
+
logger.warning(err_msg)
|
25
|
+
raise StorageUploadError(err_msg)
|
26
|
+
|
27
|
+
credentials = service_account.Credentials.from_service_account_info(
|
28
|
+
dict(storage_secrets)
|
29
|
+
)
|
30
|
+
storage_client = Client(credentials=credentials)
|
31
|
+
|
32
|
+
else:
|
33
|
+
logger.error("Google Cloud Storage auth method not supported: {}", auth_method)
|
34
|
+
raise ValueError(
|
35
|
+
f"Google Cloud Storage auth method not supported: {auth_method}"
|
36
|
+
)
|
37
|
+
|
38
|
+
return storage_client
|
@@ -1,7 +1,12 @@
|
|
1
|
-
from typing import Any
|
1
|
+
from typing import Any
|
2
2
|
|
3
3
|
from botocore.exceptions import ClientError
|
4
|
+
from google.auth.exceptions import GoogleAuthError
|
5
|
+
from google.auth.transport.requests import Request
|
6
|
+
from google.oauth2 import service_account
|
7
|
+
from loguru import logger
|
4
8
|
|
9
|
+
from fides.api.models.storage import StorageConfig
|
5
10
|
from fides.api.schemas.storage.storage import (
|
6
11
|
SUPPORTED_STORAGE_SECRETS,
|
7
12
|
AWSAuthMethod,
|
@@ -13,32 +18,50 @@ from fides.api.util.aws_util import get_aws_session
|
|
13
18
|
|
14
19
|
def secrets_are_valid(
|
15
20
|
secrets: SUPPORTED_STORAGE_SECRETS,
|
16
|
-
|
21
|
+
storage_config: StorageConfig,
|
17
22
|
) -> bool:
|
18
23
|
"""Authenticates upload destination with appropriate upload method"""
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
)
|
27
|
-
uploader: Any = _get_authenticator_from_config(storage_type)
|
28
|
-
return uploader(secrets)
|
29
|
-
|
30
|
-
|
31
|
-
def _s3_authenticator(secrets: Dict[StorageSecrets, Any]) -> bool:
|
24
|
+
uploader: Any = _get_authenticator_from_config(storage_config.type) # type: ignore
|
25
|
+
return uploader(storage_config, secrets)
|
26
|
+
|
27
|
+
|
28
|
+
def _s3_authenticator(
|
29
|
+
config: StorageConfig, secrets: dict[StorageSecrets, Any]
|
30
|
+
) -> bool:
|
32
31
|
"""Authenticates secrets for s3, returns true if secrets are valid"""
|
33
32
|
try:
|
34
|
-
get_aws_session(AWSAuthMethod.SECRET_KEYS.value, secrets.model_dump(mode="json")) # type: ignore
|
33
|
+
get_aws_session(config.details["auth_method"] or AWSAuthMethod.SECRET_KEYS.value, secrets.model_dump(mode="json")) # type: ignore
|
35
34
|
return True
|
36
35
|
except ClientError:
|
37
36
|
return False
|
38
37
|
|
39
38
|
|
39
|
+
def _gcs_authenticator(storage_config: StorageConfig, secrets: dict) -> bool:
|
40
|
+
"""Autenticates secrets for Google Cloud Storage, returns true if secrets are valid"""
|
41
|
+
try:
|
42
|
+
credentials = service_account.Credentials.from_service_account_info(
|
43
|
+
dict(secrets),
|
44
|
+
scopes=["https://www.googleapis.com/auth/devstorage.read_only"],
|
45
|
+
)
|
46
|
+
# To validate the credentials, it is necessary to make a request to Google Cloud API
|
47
|
+
credentials.refresh(Request())
|
48
|
+
return True
|
49
|
+
|
50
|
+
except GoogleAuthError as auth_error:
|
51
|
+
logger.warning(
|
52
|
+
"Google authentication error trying to authenticate GCS secrets: {}",
|
53
|
+
auth_error,
|
54
|
+
)
|
55
|
+
return False
|
56
|
+
|
57
|
+
except Exception as e:
|
58
|
+
logger.warning("Unexpected error authenticating GCS secrets: {}", e)
|
59
|
+
return False
|
60
|
+
|
61
|
+
|
40
62
|
def _get_authenticator_from_config(storage_type: StorageType) -> Any:
|
41
63
|
"""Determines which uploader method to use based on storage type"""
|
42
64
|
return {
|
43
65
|
StorageType.s3.value: _s3_authenticator,
|
66
|
+
StorageType.gcs.value: _gcs_authenticator,
|
44
67
|
}[storage_type.value]
|
@@ -14,7 +14,7 @@ from fides.api.schemas.storage.storage import (
|
|
14
14
|
StorageDetails,
|
15
15
|
StorageType,
|
16
16
|
)
|
17
|
-
from fides.api.tasks.storage import upload_to_local, upload_to_s3
|
17
|
+
from fides.api.tasks.storage import upload_to_gcs, upload_to_local, upload_to_s3
|
18
18
|
|
19
19
|
|
20
20
|
def upload(
|
@@ -78,6 +78,7 @@ def _get_uploader_from_config_type(storage_type: StorageType) -> Any:
|
|
78
78
|
return {
|
79
79
|
StorageType.s3.value: _s3_uploader,
|
80
80
|
StorageType.local.value: _local_uploader,
|
81
|
+
StorageType.gcs.value: _gcs_uploader,
|
81
82
|
}[storage_type.value]
|
82
83
|
|
83
84
|
|
@@ -106,6 +107,29 @@ def _s3_uploader(
|
|
106
107
|
)
|
107
108
|
|
108
109
|
|
110
|
+
def _gcs_uploader(
|
111
|
+
_: Session,
|
112
|
+
config: StorageConfig,
|
113
|
+
data: Dict,
|
114
|
+
privacy_request: PrivacyRequest,
|
115
|
+
) -> str:
|
116
|
+
"""Constructs necessary info needed for Google Cloud Storage before calling upload"""
|
117
|
+
file_key: str = _construct_file_key(privacy_request.id, config)
|
118
|
+
|
119
|
+
bucket_name = config.details[StorageDetails.BUCKET.value]
|
120
|
+
auth_method = config.details[StorageDetails.AUTH_METHOD.value]
|
121
|
+
|
122
|
+
return upload_to_gcs(
|
123
|
+
config.secrets,
|
124
|
+
data,
|
125
|
+
bucket_name,
|
126
|
+
file_key,
|
127
|
+
config.format.value, # type: ignore
|
128
|
+
privacy_request,
|
129
|
+
auth_method,
|
130
|
+
)
|
131
|
+
|
132
|
+
|
109
133
|
def _local_uploader(
|
110
134
|
_: Session,
|
111
135
|
config: StorageConfig,
|
fides/api/tasks/storage.py
CHANGED
@@ -16,6 +16,7 @@ from fides.api.schemas.storage.storage import ResponseFormat, StorageSecrets
|
|
16
16
|
from fides.api.service.privacy_request.dsr_package.dsr_report_builder import (
|
17
17
|
DsrReportBuilder,
|
18
18
|
)
|
19
|
+
from fides.api.service.storage.gcs import get_gcs_client
|
19
20
|
from fides.api.service.storage.s3 import (
|
20
21
|
create_presigned_url_for_s3,
|
21
22
|
generic_upload_to_s3,
|
@@ -64,7 +65,7 @@ def encrypt_access_request_results(data: Union[str, bytes], request_id: str) ->
|
|
64
65
|
def write_to_in_memory_buffer(
|
65
66
|
resp_format: str, data: Dict[str, Any], privacy_request: PrivacyRequest
|
66
67
|
) -> BytesIO:
|
67
|
-
"""Write JSON/CSV data to in-memory file-like object to be passed to S3. Encrypt data if encryption key/nonce
|
68
|
+
"""Write JSON/CSV data to in-memory file-like object to be passed to S3 or GCS. Encrypt data if encryption key/nonce
|
68
69
|
has been cached for the given privacy request id
|
69
70
|
|
70
71
|
:param resp_format: str, should be one of ResponseFormat
|
@@ -130,7 +131,11 @@ def upload_to_s3( # pylint: disable=R0913
|
|
130
131
|
raise ValueError("Privacy request must be provided")
|
131
132
|
|
132
133
|
try:
|
133
|
-
s3_client = get_s3_client(
|
134
|
+
s3_client = get_s3_client(
|
135
|
+
auth_method,
|
136
|
+
storage_secrets,
|
137
|
+
assume_role_arn=CONFIG.credentials["storage"].get("aws_s3_assume_role_arn"),
|
138
|
+
)
|
134
139
|
|
135
140
|
# handles file chunking
|
136
141
|
try:
|
@@ -157,6 +162,49 @@ def upload_to_s3( # pylint: disable=R0913
|
|
157
162
|
raise ValueError(f"The parameters you provided are incorrect: {e}")
|
158
163
|
|
159
164
|
|
165
|
+
def upload_to_gcs(
|
166
|
+
storage_secrets: Dict,
|
167
|
+
data: Dict,
|
168
|
+
bucket_name: str,
|
169
|
+
file_key: str,
|
170
|
+
resp_format: str,
|
171
|
+
privacy_request: PrivacyRequest,
|
172
|
+
auth_method: str,
|
173
|
+
) -> str:
|
174
|
+
"""Uploads access request data to a Google Cloud Storage bucket"""
|
175
|
+
logger.info("Starting Google Cloud Storage upload of {}", file_key)
|
176
|
+
|
177
|
+
try:
|
178
|
+
storage_client = get_gcs_client(auth_method, storage_secrets)
|
179
|
+
bucket = storage_client.bucket(bucket_name)
|
180
|
+
|
181
|
+
blob = bucket.blob(file_key)
|
182
|
+
in_memory_file = write_to_in_memory_buffer(resp_format, data, privacy_request)
|
183
|
+
content_type = {
|
184
|
+
ResponseFormat.json.value: "application/json",
|
185
|
+
ResponseFormat.csv.value: "application/zip",
|
186
|
+
ResponseFormat.html.value: "application/zip",
|
187
|
+
}
|
188
|
+
blob.upload_from_string(
|
189
|
+
in_memory_file.getvalue(), content_type=content_type[resp_format]
|
190
|
+
)
|
191
|
+
|
192
|
+
logger.info("File {} uploaded to {}", file_key, blob.public_url)
|
193
|
+
|
194
|
+
presigned_url = blob.generate_signed_url(
|
195
|
+
version="v4",
|
196
|
+
expiration=CONFIG.security.subject_request_download_link_ttl_seconds,
|
197
|
+
method="GET",
|
198
|
+
)
|
199
|
+
return presigned_url
|
200
|
+
except Exception as e:
|
201
|
+
logger.error(
|
202
|
+
"Encountered error while uploading and generating link for Google Cloud Storage object: {}",
|
203
|
+
e,
|
204
|
+
)
|
205
|
+
raise e
|
206
|
+
|
207
|
+
|
160
208
|
def upload_to_local(
|
161
209
|
data: Dict,
|
162
210
|
file_key: str,
|
fides/api/util/aws_util.py
CHANGED
@@ -22,6 +22,10 @@ def get_aws_session(
|
|
22
22
|
if storage_secrets is None:
|
23
23
|
# set to an empty dict to allow for more dynamic code downstream
|
24
24
|
storage_secrets = {}
|
25
|
+
|
26
|
+
stored_region_name = storage_secrets.get("region_name") # type: ignore
|
27
|
+
stored_assume_role_arn: Optional[str] = storage_secrets.get("assume_role_arn") # type: ignore
|
28
|
+
|
25
29
|
if auth_method == AWSAuthMethod.SECRET_KEYS.value:
|
26
30
|
if not storage_secrets:
|
27
31
|
err_msg = "Storage secrets not found for S3 storage."
|
@@ -33,12 +37,10 @@ def get_aws_session(
|
|
33
37
|
aws_secret_access_key=storage_secrets[
|
34
38
|
StorageSecrets.AWS_SECRET_ACCESS_KEY.value # type: ignore
|
35
39
|
],
|
36
|
-
region_name=
|
40
|
+
region_name=stored_region_name,
|
37
41
|
)
|
38
42
|
elif auth_method == AWSAuthMethod.AUTOMATIC.value:
|
39
|
-
session = Session(
|
40
|
-
region_name=storage_secrets.get("region_name"), # type: ignore
|
41
|
-
)
|
43
|
+
session = Session(region_name=stored_region_name)
|
42
44
|
logger.info("Successfully created automatic session")
|
43
45
|
else:
|
44
46
|
logger.error("AWS auth method not supported: {}", auth_method)
|
@@ -48,20 +50,13 @@ def get_aws_session(
|
|
48
50
|
sts_client = session.client("sts")
|
49
51
|
sts_client.get_caller_identity()
|
50
52
|
|
51
|
-
|
53
|
+
target_assume_role_arn = assume_role_arn or stored_assume_role_arn
|
54
|
+
if target_assume_role_arn:
|
52
55
|
try:
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
logger.info(
|
58
|
-
f"Assumed role {assume_role_arn} and got temporary credentials."
|
59
|
-
)
|
60
|
-
return Session(
|
61
|
-
aws_access_key_id=temp_credentials["AccessKeyId"],
|
62
|
-
aws_secret_access_key=temp_credentials["SecretAccessKey"],
|
63
|
-
aws_session_token=temp_credentials["SessionToken"],
|
64
|
-
region_name=storage_secrets.get("region_name"), # type: ignore
|
56
|
+
return get_assumed_role_session(
|
57
|
+
target_assume_role_arn,
|
58
|
+
sts_client,
|
59
|
+
stored_region_name,
|
65
60
|
)
|
66
61
|
except ClientError as error:
|
67
62
|
logger.exception(
|
@@ -72,6 +67,22 @@ def get_aws_session(
|
|
72
67
|
return session
|
73
68
|
|
74
69
|
|
70
|
+
def get_assumed_role_session(
|
71
|
+
assume_role_arn: str, sts_client: Any, region_name: Optional[str] = None
|
72
|
+
) -> Session:
|
73
|
+
response = sts_client.assume_role(
|
74
|
+
RoleArn=assume_role_arn, RoleSessionName="FidesAssumeRoleSession"
|
75
|
+
)
|
76
|
+
temp_credentials = response["Credentials"]
|
77
|
+
logger.info(f"Assumed role {assume_role_arn} and got temporary credentials.")
|
78
|
+
return Session(
|
79
|
+
aws_access_key_id=temp_credentials["AccessKeyId"],
|
80
|
+
aws_secret_access_key=temp_credentials["SecretAccessKey"],
|
81
|
+
aws_session_token=temp_credentials["SessionToken"],
|
82
|
+
region_name=region_name,
|
83
|
+
)
|
84
|
+
|
85
|
+
|
75
86
|
def get_s3_client(
|
76
87
|
auth_method: str,
|
77
88
|
storage_secrets: Optional[Dict[StorageSecrets, Any]],
|
fides/api/util/storage_util.py
CHANGED
@@ -6,6 +6,7 @@ from pydantic import ValidationError
|
|
6
6
|
|
7
7
|
from fides.api.schemas.storage.storage import (
|
8
8
|
SUPPORTED_STORAGE_SECRETS,
|
9
|
+
StorageSecretsGCS,
|
9
10
|
StorageSecretsS3,
|
10
11
|
StorageType,
|
11
12
|
)
|
@@ -31,6 +32,7 @@ def get_schema_for_secrets(
|
|
31
32
|
try:
|
32
33
|
schema = {
|
33
34
|
StorageType.s3: StorageSecretsS3,
|
35
|
+
StorageType.gcs: StorageSecretsGCS,
|
34
36
|
}[storage_type]
|
35
37
|
except KeyError:
|
36
38
|
raise ValueError(
|
@@ -97,27 +97,29 @@ class AWS_SES_Service:
|
|
97
97
|
|
98
98
|
def validate_email_and_domain_status(self) -> None:
|
99
99
|
"""
|
100
|
-
Validate that the email
|
100
|
+
Validate that either the email or domain (or both) are verified in SES.
|
101
101
|
"""
|
102
102
|
email = self.messaging_config_details.email_from
|
103
103
|
domain = self.messaging_config_details.domain
|
104
|
+
identities = list(filter(None, (email, domain)))
|
105
|
+
|
106
|
+
# Defensive code just in case, there should always be email_from or domain
|
107
|
+
if not identities:
|
108
|
+
raise AWS_SESException(
|
109
|
+
"No identity (email_from or domain) configured for SES validation."
|
110
|
+
)
|
104
111
|
|
105
112
|
ses_client = self.get_ses_client()
|
106
113
|
response = ses_client.get_identity_verification_attributes(
|
107
|
-
Identities=
|
108
|
-
)
|
109
|
-
email_status = (
|
110
|
-
response["VerificationAttributes"].get(email, {}).get("VerificationStatus")
|
111
|
-
)
|
112
|
-
domain_status = (
|
113
|
-
response["VerificationAttributes"].get(domain, {}).get("VerificationStatus")
|
114
|
+
Identities=identities
|
114
115
|
)
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
116
|
+
attributes = response.get("VerificationAttributes", {})
|
117
|
+
|
118
|
+
for identity in identities:
|
119
|
+
status = attributes.get(identity, {}).get("VerificationStatus")
|
120
|
+
if status != "Success":
|
121
|
+
logger.error(f"{identity} is not verified in SES.")
|
122
|
+
raise AWS_SESException(f"{identity} is not verified in SES.")
|
121
123
|
|
122
124
|
def send_email(
|
123
125
|
self,
|
@@ -127,13 +129,20 @@ class AWS_SES_Service:
|
|
127
129
|
) -> None:
|
128
130
|
"""
|
129
131
|
Send an email using AWS SES.
|
130
|
-
|
132
|
+
Either `email_from` or `domain` must be verified in SES.
|
131
133
|
"""
|
132
134
|
self.validate_email_and_domain_status()
|
133
135
|
ses_client = self.get_ses_client()
|
134
136
|
|
137
|
+
from_address = self.messaging_config_details.email_from
|
138
|
+
if not from_address:
|
139
|
+
# If there is no email_from, there is a domain, and the domain was verified against SES.
|
140
|
+
# When you verify a domain identity, you can send email from any subdomain or email address of the
|
141
|
+
# verified domain without having to verify each one individually.
|
142
|
+
from_address = f"noreply@{self.messaging_config_details.domain}"
|
143
|
+
|
135
144
|
ses_client.send_email(
|
136
|
-
Source=
|
145
|
+
Source=from_address,
|
137
146
|
Destination={"ToAddresses": [to.strip()]},
|
138
147
|
Message={
|
139
148
|
"Subject": {"Data": subject},
|
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/a063d3d67fe688f6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/a063d3d67fe688f6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-32c43a8d709ca5c6.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-854abc8128542e40.js" defer=""></script><script src="/_next/static/chunks/pages/404-73e79d3760ef2658.js" defer=""></script><script src="/_next/static/Evya6_CtQ_6H8rU12NB5C/_buildManifest.js" defer=""></script><script src="/_next/static/Evya6_CtQ_6H8rU12NB5C/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"Evya6_CtQ_6H8rU12NB5C","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -0,0 +1 @@
|
|
1
|
+
self.__BUILD_MANIFEST=function(s,t,e,a,c,n,i,d,o,r,u,g,p,f,j,b,k,h,m,y,l,v,I,_,U,w,q,x,N,B,F,z,A,D,E,L,M,S,T,C,P,G,H,J,K,O){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":[U,"static/chunks/pages/index-7220a947bb52c5a8.js"],"/404":["static/chunks/pages/404-73e79d3760ef2658.js"],"/_error":["static/chunks/pages/_error-bede3a8288930dcf.js"],"/add-systems":[U,"static/chunks/pages/add-systems-2c64d0a87784019b.js"],"/add-systems/manual":[s,t,a,c,n,j,e,r,b,m,w,i,"static/chunks/pages/add-systems/manual-2edda5eb5412ffb2.js"],"/add-systems/multiple":[s,t,e,r,y,q,"static/chunks/pages/add-systems/multiple-27c3bdcc05a1f18e.js"],"/ant-poc":["static/chunks/pages/ant-poc-3c256e928748177a.js"],"/consent":["static/chunks/pages/consent-07bc6a18cbad414a.js"],"/consent/configure":[s,t,e,r,y,"static/chunks/pages/consent/configure-790c7c61ff9500f1.js"],"/consent/configure/add-vendors":[s,t,e,r,y,q,"static/chunks/pages/consent/configure/add-vendors-b3d62016149e5aa4.js"],"/consent/privacy-experience":[s,t,j,e,x,"static/chunks/pages/consent/privacy-experience-f0ba90152c43c742.js"],"/consent/privacy-experience/new":[a,c,g,N,d,k,B,"static/chunks/pages/consent/privacy-experience/new-300fd2800c417d0b.js"],"/consent/privacy-experience/[id]":[a,c,g,N,d,k,B,"static/chunks/pages/consent/privacy-experience/[id]-6641f24adf72b00c.js"],"/consent/privacy-notices":[s,t,e,x,"static/chunks/pages/consent/privacy-notices-90b331a666216e38.js"],"/consent/privacy-notices/new":[a,c,g,F,d,k,z,"static/chunks/pages/consent/privacy-notices/new-e24975eaeedc7c51.js"],"/consent/privacy-notices/[id]":[a,c,g,F,d,k,z,"static/chunks/pages/consent/privacy-notices/[id]-669b1039a5f0dcb6.js"],"/consent/properties":[s,t,e,A,"static/chunks/pages/consent/properties-b9919fa183e9308a.js"],"/consent/reporting":[s,t,a,e,"static/chunks/pages/consent/reporting-1762ed46d98cebad.js"],"/data-catalog":[s,t,a,c,n,e,"static/css/95ac327e5d70148d.css","static/chunks/pages/data-catalog-8e0bc6d01176081a.js"],"/data-catalog/[systemId]/projects":[s,t,a,c,n,e,p,l,i,"static/chunks/pages/data-catalog/[systemId]/projects-45ac2c54f21a57d5.js"],"/data-catalog/[systemId]/projects/[projectUrn]":[s,t,e,D,"static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-864af917f60d8f35.js"],"/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]":[s,t,a,c,n,e,p,l,E,i,"static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-ac033a16f043e6f9.js"],"/data-catalog/[systemId]/resources":[s,t,e,D,"static/chunks/pages/data-catalog/[systemId]/resources-305555b74c357bf2.js"],"/data-catalog/[systemId]/resources/[resourceUrn]":[s,t,a,c,n,e,p,l,E,i,"static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-71e26d262afcaea5.js"],"/data-discovery/action-center":[s,t,e,"static/chunks/pages/data-discovery/action-center-333964fc8ce20616.js"],"/data-discovery/action-center/[monitorId]":[s,t,a,c,n,e,o,"static/chunks/pages/data-discovery/action-center/[monitorId]-a8b44307dfd5c23e.js"],"/data-discovery/action-center/[monitorId]/[systemId]":[s,t,a,c,n,e,o,r,m,i,"static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-a1259aa44bf99194.js"],"/data-discovery/activity":[s,t,e,"static/chunks/pages/data-discovery/activity-438ab93c6cd5c2a6.js"],"/data-discovery/detection":[s,t,e,o,h,L,"static/chunks/pages/data-discovery/detection-f473b2ee1c67be3c.js"],"/data-discovery/detection/[resourceUrn]":[s,t,e,o,h,L,"static/chunks/pages/data-discovery/detection/[resourceUrn]-10f789d4ab2b8927.js"],"/data-discovery/discovery":[s,t,a,c,n,e,o,p,h,M,i,"static/chunks/pages/data-discovery/discovery-ad077f30849fdc0a.js"],"/data-discovery/discovery/[resourceUrn]":[s,t,a,c,n,e,o,p,h,M,i,"static/chunks/pages/data-discovery/discovery/[resourceUrn]-2569551ae75ea5a2.js"],"/datamap":[s,t,"static/chunks/255-7db55b0e3a0f9dea.js",e,b,S,"static/chunks/pages/datamap-05144da6383ba6a4.js"],"/dataset":[s,t,u,e,f,"static/chunks/pages/dataset-5190a42b4bddac7d.js"],"/dataset/new":[u,f,"static/chunks/pages/dataset/new-60a80195eafe9839.js"],"/dataset/[datasetId]":[s,t,"static/chunks/9729-fcf6ff4e3534e4a8.js",e,v,"static/chunks/pages/dataset/[datasetId]-2ababde59fc9efb4.js"],"/dataset/[datasetId]/[collectionName]":[s,t,a,c,n,I,e,v,i,"static/chunks/pages/dataset/[datasetId]/[collectionName]-b584029b66084b2a.js"],"/dataset/[datasetId]/[collectionName]/[...subfieldNames]":[s,t,a,c,n,I,e,v,i,"static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-a3311bdf11e5bb1b.js"],"/datastore-connection":["static/css/5f393dea1c0d031c.css","static/chunks/pages/datastore-connection-92dce084869b6a94.js"],"/datastore-connection/new":[u,j,f,T,"static/chunks/pages/datastore-connection/new-32ff2757c1fb5a00.js"],"/datastore-connection/[id]":[u,f,T,"static/chunks/pages/datastore-connection/[id]-63af795429688cac.js"],"/fides-js-docs":["static/chunks/2fbcc6de-a6c61724c327e9fa.js","static/chunks/e3251fe7-5777b5d778e6fffa.js",a,c,n,u,I,C,"static/css/ab65b8cc3144bfc8.css","static/chunks/905-8ab919e7b274ed50.js","static/chunks/pages/fides-js-docs-80b241bf6cddb72e.js"],"/integrations":[a,c,n,"static/chunks/6834-dcda0a8ed484775e.js",P,"static/chunks/pages/integrations-372906eb228e73b7.js"],"/integrations/[id]":[s,t,a,c,n,e,P,"static/css/92c81f666644c594.css","static/chunks/pages/integrations/[id]-5a600a16f2ad5fa0.js"],"/login":["static/chunks/pages/login-0cb0eb44bf2dd24c.js"],"/login/[provider]":["static/chunks/pages/login/[provider]-c58beef131c3a82d.js"],"/messaging":[s,t,a,c,n,e,"static/chunks/pages/messaging-77726c8d9ad39a64.js"],"/messaging/add-template":[d,G,"static/chunks/pages/messaging/add-template-722590a322ea866b.js"],"/messaging/[id]":[d,G,"static/chunks/pages/messaging/[id]-34e5d096311c5aab.js"],"/privacy-requests":[s,t,e,H,"static/chunks/pages/privacy-requests-ff5856fc531097b2.js"],"/privacy-requests/configure":["static/chunks/pages/privacy-requests/configure-66c6d3725fc1861f.js"],"/privacy-requests/configure/messaging":["static/chunks/pages/privacy-requests/configure/messaging-df490b611f1360fa.js"],"/privacy-requests/configure/storage":["static/chunks/pages/privacy-requests/configure/storage-8575fd1d25457b4d.js"],"/privacy-requests/[id]":[a,c,n,H,"static/css/b89fc4b36b501cf6.css","static/chunks/pages/privacy-requests/[id]-12037a323158a7be.js"],"/properties":[s,t,e,A,"static/chunks/pages/properties-febd16a18011fd1e.js"],"/properties/add-property":[d,J,"static/chunks/pages/properties/add-property-b739361d2b5714db.js"],"/properties/[id]":[d,J,"static/chunks/pages/properties/[id]-7f8cc582fc11b46d.js"],"/reporting/datamap":[s,t,a,c,n,C,e,b,S,"static/chunks/pages/reporting/datamap-6d046c2bf03ce067.js"],"/settings/about":["static/chunks/pages/settings/about-95e9953afaad9260.js"],"/settings/consent":["static/chunks/pages/settings/consent-8483a13c5217f295.js"],"/settings/consent/[configuration_id]/[purpose_id]":[s,t,e,"static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-0d593a93ef57dbd7.js"],"/settings/custom-fields":[s,t,e,"static/chunks/pages/settings/custom-fields-d6e18187d6412a34.js"],"/settings/domain-records":[s,t,e,"static/chunks/pages/settings/domain-records-0392d1bc2b8ec616.js"],"/settings/domains":["static/chunks/pages/settings/domains-db42cce5ec0ca55b.js"],"/settings/email-templates":["static/chunks/pages/settings/email-templates-297f558258a46f74.js"],"/settings/locations":[s,K,"static/chunks/pages/settings/locations-38ce7883fd27b61f.js"],"/settings/organization":["static/chunks/pages/settings/organization-3dc30591cc0a8881.js"],"/settings/regulations":[s,K,"static/chunks/pages/settings/regulations-22d97471513e835d.js"],"/systems":[s,t,e,"static/chunks/pages/systems-d7a63f851cc99583.js"],"/systems/configure/[id]":[s,t,a,c,n,j,e,o,r,b,m,w,i,"static/chunks/pages/systems/configure/[id]-69e582763772aec9.js"],"/systems/configure/[id]/test-datasets":[u,f,"static/chunks/pages/systems/configure/[id]/test-datasets-f408ebdc01892ff0.js"],"/taxonomy":["static/chunks/678d4732-50255cc09048e643.js",a,c,n,g,"static/chunks/570-c99f07161bd339cd.js","static/css/34a7eb08b86ddb57.css","static/chunks/pages/taxonomy-244453d6d5413d6c.js"],"/user-management":[_,"static/chunks/pages/user-management-f2dc8220e4aab9d7.js"],"/user-management/new":[_,O,"static/chunks/pages/user-management/new-65ef1bdebb679666.js"],"/user-management/profile/[id]":[_,O,"static/chunks/pages/user-management/profile/[id]-f29f0fbd62e10b6d.js"],sortedPages:["/","/404","/_app","/_error","/add-systems","/add-systems/manual","/add-systems/multiple","/ant-poc","/consent","/consent/configure","/consent/configure/add-vendors","/consent/privacy-experience","/consent/privacy-experience/new","/consent/privacy-experience/[id]","/consent/privacy-notices","/consent/privacy-notices/new","/consent/privacy-notices/[id]","/consent/properties","/consent/reporting","/data-catalog","/data-catalog/[systemId]/projects","/data-catalog/[systemId]/projects/[projectUrn]","/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]","/data-catalog/[systemId]/resources","/data-catalog/[systemId]/resources/[resourceUrn]","/data-discovery/action-center","/data-discovery/action-center/[monitorId]","/data-discovery/action-center/[monitorId]/[systemId]","/data-discovery/activity","/data-discovery/detection","/data-discovery/detection/[resourceUrn]","/data-discovery/discovery","/data-discovery/discovery/[resourceUrn]","/datamap","/dataset","/dataset/new","/dataset/[datasetId]","/dataset/[datasetId]/[collectionName]","/dataset/[datasetId]/[collectionName]/[...subfieldNames]","/datastore-connection","/datastore-connection/new","/datastore-connection/[id]","/fides-js-docs","/integrations","/integrations/[id]","/login","/login/[provider]","/messaging","/messaging/add-template","/messaging/[id]","/privacy-requests","/privacy-requests/configure","/privacy-requests/configure/messaging","/privacy-requests/configure/storage","/privacy-requests/[id]","/properties","/properties/add-property","/properties/[id]","/reporting/datamap","/settings/about","/settings/consent","/settings/consent/[configuration_id]/[purpose_id]","/settings/custom-fields","/settings/domain-records","/settings/domains","/settings/email-templates","/settings/locations","/settings/organization","/settings/regulations","/systems","/systems/configure/[id]","/systems/configure/[id]/test-datasets","/taxonomy","/user-management","/user-management/new","/user-management/profile/[id]"]}}("static/chunks/c78d26b1-88a3e1bacb2a03c2.js","static/chunks/6060-cb1ab5be7067bf7b.js","static/chunks/4481-cd91353711218b86.js","static/chunks/2858-0b44609b6be7850b.js","static/chunks/2866-a73888c17a195cbe.js","static/chunks/9278-9b1b5970f0702668.js","static/css/d2d4e9a6923e6730.css","static/chunks/9282-6b14898de61ba6f0.js","static/chunks/9719-8ce33427015f12ae.js","static/chunks/401-1ba7e037992ac460.js","static/chunks/6527-0eed08abe252a918.js","static/chunks/4294-5b3aa9d605217915.js","static/chunks/6372-e35fc0a8874fdecf.js","static/chunks/9327-2be9f27fbce039b0.js","static/chunks/5277-e8a036319456127f.js","static/chunks/9951-d8d1174b00f9dac1.js","static/chunks/6277-b4885ac291c35484.js","static/chunks/3702-929a386a64d55f19.js","static/chunks/3503-296468f82b067ec4.js","static/chunks/8934-41284e609c329cdd.js","static/chunks/7751-b3af4819eac0bc9c.js","static/chunks/5487-fd9b930f4246520a.js","static/chunks/8702-d1c8296f9f6afc10.js","static/chunks/3513-d03549cb201e7938.js","static/css/972dc7eef106ee7c.css","static/chunks/9965-dac854cdf6141611.js","static/chunks/5826-5f6e7a91e9ff71d1.js","static/chunks/6853-df71f47693b139d3.js","static/chunks/9014-eeae6f581158e645.js","static/chunks/1817-3d9a78857dd5a9f4.js","static/chunks/3615-5e2d062d684b8fa1.js","static/chunks/6954-00d6683243cc75d8.js","static/chunks/79-110e5199495a81c7.js","static/chunks/3872-d7045d15aafffa12.js","static/chunks/3855-3345160a78baa978.js","static/chunks/2479-064aefb3d187d6a2.js","static/chunks/1904-00404c45e69d3225.js","static/chunks/9572-c3e70eb702e9d879.js","static/chunks/9767-e8b0b48d602451d8.js","static/chunks/9187-851756440f79cd75.js","static/chunks/5973-6f53799483424513.js","static/chunks/1100-c3d52c9d7d6d0a39.js","static/chunks/8433-2c6947927b1e74f5.js","static/chunks/4060-dd7b6e0472703a2e.js","static/chunks/5835-057c2dec5117817c.js","static/chunks/4121-01c43bbbfc6b8fd1.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
@@ -0,0 +1 @@
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1100],{58754:function(e,t,n){var r=n(24246),i=n(91922),s=n(70788);t.Z=e=>{let{heading:t,breadcrumbItems:n,isSticky:a=!0,children:l,rightContent:o,style:u,...c}=e;return(0,r.jsxs)("div",{...c,style:a?{position:"sticky",top:"-24px",paddingTop:"24px",paddingBottom:"24px",paddingLeft:"40px",marginLeft:"-40px",paddingRight:"40px",marginRight:"-40px",marginTop:"-24px",left:0,zIndex:20,backgroundColor:"white",...u}:{paddingBottom:"24px",...u},children:[(0,r.jsxs)(i.jqI,{justify:"space-between",children:["string"==typeof t?(0,r.jsx)(i.lQT,{className:n||l?"pb-4":void 0,level:1,"data-testid":"page-heading",children:t}):t,o&&(0,r.jsx)("div",{"data-testid":"page-header-right-content",children:o})]}),!!n&&(0,r.jsx)(s.m,{className:l?"pb-4":void 0,items:n,"data-testid":"page-breadcrumb"}),l]})}},10342:function(e,t,n){var r=n(24246),i=n(91922),s=n(46238);t.Z=e=>{let{title:t,tooltip:n,children:a,...l}=e;return(0,r.jsxs)(i.xuv,{borderRadius:"md",border:"1px solid",borderColor:"gray.200",...l,children:[(0,r.jsxs)(i.X6q,{as:"h3",fontSize:"sm",fontWeight:"semibold",color:"gray.700",py:4,px:6,backgroundColor:"gray.50",borderRadius:"md",textAlign:"left",children:[t,n?(0,r.jsx)(i.xvT,{as:"span",mx:1,children:(0,r.jsx)(s.b,{label:n})}):void 0]}),(0,r.jsx)(i.Kqy,{p:6,spacing:6,children:a})]})}},70788:function(e,t,n){n.d(t,{m:function(){return u}});var r=n(24246),i=n(91922),s=n(79894),a=n.n(s),l=n(27378);let{Text:o}=i.AntTypography,u=e=>{let{items:t,...n}=e,s=(0,l.useMemo)(()=>null==t?void 0:t.map((e,n)=>{let s=n===t.length-1,l={...e},u=l.onClick&&!l.href;return("string"==typeof l.title&&(l.title=(0,r.jsx)(o,{style:{color:"inherit",maxWidth:s?void 0:400},ellipsis:!s,children:l.title})),u)?l.title=(0,r.jsx)(i.wpx,{type:"text",size:"small",icon:l.icon,onClick:l.onClick,className:"ant-breadcrumb-link -mt-px px-1 text-inherit",children:l.title}):(l.icon&&(l.title=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"anticon align-text-bottom",children:l.icon}),l.title]})),l.href&&l.title&&(l.title=(0,r.jsx)(a(),{href:l.href,className:"ant-breadcrumb-link",children:l.title}),delete l.href)),l}),[t]);return(0,r.jsx)(i.zrq,{items:s,...n})}},67810:function(e,t,n){n.d(t,{Z:function(){return s}}),(r=i||(i={})).PRIVACY_REQUEST_REVIEW_APPROVE="privacy_request_review_approve",r.PRIVACY_REQUEST_REVIEW_DENY="privacy_request_review_deny",r.PRIVACY_REQUEST_RECEIPT="privacy_request_receipt",r.PRIVACY_REQUEST_COMPLETE_ACCESS="privacy_request_complete_access",r.PRIVACY_REQUEST_COMPLETE_DELETION="privacy_request_complete_deletion",r.SUBJECT_IDENTITY_VERIFICATION="subject_identity_verification";var r,i,s={[i.PRIVACY_REQUEST_COMPLETE_ACCESS]:"Access request completed",[i.PRIVACY_REQUEST_COMPLETE_DELETION]:"Erasure request completed",[i.PRIVACY_REQUEST_RECEIPT]:"Privacy request received",[i.PRIVACY_REQUEST_REVIEW_APPROVE]:"Privacy request approved",[i.PRIVACY_REQUEST_REVIEW_DENY]:"Privacy request denied",[i.SUBJECT_IDENTITY_VERIFICATION]:"Subject identity verification"}},20149:function(e,t,n){var r=n(24246),i=n(77830),s=n(91922),a=n(34090),l=n(86677),o=n(16134),u=n(10342),c=n(40324),d=n(51472),p=n(67810),m=n(64826);let g=()=>{var e;let t=(0,o.C)(m.Zp),n=(0,o.C)(m.G1);(0,m.gz)({page:t,size:n});let i=(0,o.C)(m.YO),{values:s,setFieldValue:l}=(0,a.u6)();return(0,r.jsx)(d.Z,{label:"Associated properties",addButtonLabel:"Add property",idField:"id",nameField:"name",allItems:i.map(e=>({id:e.id,name:e.name})),values:null!==(e=s.properties)&&void 0!==e?e:[],setValues:e=>l("properties",e),draggable:!0,maxHeight:100,baseTestId:"property"})};t.Z=e=>{let{template:t,handleSubmit:n,handleDelete:o}=e,d=(0,l.useRouter)(),m=()=>{d.push(i.q)},f={type:t.type,content:t.content,properties:t.properties||[],is_enabled:t.is_enabled,id:t.id||""};return(0,r.jsx)(a.J9,{enableReinitialize:!0,initialValues:f,onSubmit:n,children:e=>{let{dirty:t,isValid:n,isSubmitting:i}=e;return(0,r.jsxs)(a.l0,{style:{paddingTop:"12px",paddingBottom:"12px"},children:[(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsxs)(u.Z,{title:"".concat(p.Z[f.type]),children:[(0,r.jsx)(c.j0,{isRequired:!0,label:"Email subject",name:"content.subject",variant:"stacked"}),(0,r.jsx)(c.Ks,{isRequired:!0,label:"Message body",name:"content.body",value:"test",variant:"stacked",resize:!0}),(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsx)(g,{})}),(0,r.jsx)(c.w8,{name:"is_enabled",label:"Enable message",variant:"switchFirst"})]})}),(0,r.jsxs)(s.kCb,{justifyContent:"space-between",width:"100%",paddingTop:2,children:[f.id&&o&&(0,r.jsx)(s.wpx,{"data-testid":"delete-template-button",loading:!1,className:"mr-3",onClick:o,children:"Delete"}),(0,r.jsxs)(s.kCb,{justifyContent:"right",width:"100%",paddingTop:2,children:[(0,r.jsx)(s.wpx,{loading:!1,className:"mr-3",onClick:m,children:"Cancel"}),(0,r.jsx)(s.wpx,{htmlType:"submit",type:"primary",disabled:i||!t||!n,loading:i,"data-testid":"submit-btn",children:"Save"})]})]})]})}})}},5058:function(e,t,n){n.d(t,{Vw:function(){return s},ms:function(){return r},pS:function(){return i},vm:function(){return a}});let{useGetSummaryMessagingTemplatesQuery:r,usePutMessagingTemplateByIdMutation:i,useCreateMessagingTemplateByTypeMutation:s,usePatchMessagingTemplateByIdMutation:a}=n(78780).u.injectEndpoints({endpoints:e=>({getSummaryMessagingTemplates:e.query({query:e=>({method:"GET",url:"plus/messaging/templates/summary",params:e}),providesTags:()=>["Property-Specific Messaging Templates"]}),putMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PUT",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),patchMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PATCH",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),createMessagingTemplateByType:e.mutation({query:e=>{let{templateType:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"POST",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},47466:function(e,t,n){n.d(t,{KC:function(){return a},ew:function(){return l},gQ:function(){return s},jM:function(){return r},lE:function(){return i}});let{useGetMessagingTemplatesQuery:r,useUpdateMessagingTemplatesMutation:i,useGetMessagingTemplateByIdQuery:s,useGetMessagingTemplateDefaultQuery:a,useDeleteMessagingTemplateByIdMutation:l}=n(78780).u.injectEndpoints({endpoints:e=>({getMessagingTemplates:e.query({query:()=>({url:"messaging/templates"}),providesTags:()=>["Messaging Templates"]}),updateMessagingTemplates:e.mutation({query:e=>({url:"messaging/templates",method:"PUT",body:e}),invalidatesTags:()=>["Messaging Templates"]}),getMessagingTemplateById:e.query({query:e=>({url:"/messaging/templates/".concat(e)}),providesTags:()=>["Property-Specific Messaging Templates"]}),getMessagingTemplateDefault:e.query({query:e=>({url:"/messaging/templates/default/".concat(e)})}),deleteMessagingTemplateById:e.mutation({query:e=>({url:"/messaging/templates/".concat(e),method:"DELETE"}),invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},31883:function(e,t,n){n.d(t,{Bw:function(){return r.Bw},D4:function(){return r.D4}});var r=n(19043)},11055:function(e,t,n){n.d(t,{M:function(){return d}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),l=n(18397),o=n(42308),u=n(25431),c=n(39556);let d=(0,s.forwardRef)(function({children:e,as:t="ul",axis:n="y",onReorder:d,values:g,...f},y){let h=(0,o.h)(()=>l.E[t]),x=[],E=(0,s.useRef)(!1);return(0,i.k)(!!g,"Reorder.Group must be provided a values prop"),(0,s.useEffect)(()=>{E.current=!1}),(0,r.jsx)(h,{...f,ref:y,ignoreStrict:!0,children:(0,r.jsx)(a.Y.Provider,{value:{axis:n,registerItem:(e,t)=>{let r=x.findIndex(t=>e===t.value);-1!==r?x[r].layout=t[n]:x.push({value:e,layout:t[n]}),x.sort(m)},updateOrder:(e,t,n)=>{if(E.current)return;let r=function(e,t,n,r){if(!r)return e;let i=e.findIndex(e=>e.value===t);if(-1===i)return e;let s=r>0?1:-1,a=e[i+s];if(!a)return e;let l=e[i],o=a.layout,d=(0,c.t)(o.min,o.max,.5);return 1===s&&l.layout.max+n>d||-1===s&&l.layout.min+n<d?(0,u.uo)(e,i,i+s):e}(x,e,t,n);x!==r&&(E.current=!0,d(r.map(p).filter(e=>-1!==g.indexOf(e))))}},children:e})})});function p(e){return e.value}function m(e,t){return e.layout.min-t.layout.min}},7078:function(e,t,n){n.d(t,{e:function(){return T}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),l=n(18397),o=n(42308),u=n(69222),c=n(67412);function d(e){let t=(0,o.h)(()=>(0,u.BX)(e)),{isStatic:n}=(0,s.useContext)(c._);if(n){let[,n]=(0,s.useState)(e);(0,s.useEffect)(()=>t.on("change",n),[])}return t}var p=n(13998);let m=e=>e&&"object"==typeof e&&e.mix,g=e=>m(e)?e.mix:void 0;var f=n(64306),y=n(95984);function h(e,t){let n=d(t()),r=()=>n.set(t());return r(),(0,f.L)(()=>{let t=()=>y.Wi.preRender(r,!1,!0),n=e.map(e=>e.on("change",t));return()=>{n.forEach(e=>e()),(0,y.Pn)(r)}}),n}function x(e,t){let n=(0,o.h)(()=>[]);return h(e,()=>{n.length=0;let r=e.length;for(let t=0;t<r;t++)n[t]=e[t].get();return t(n)})}var E=n(3522);function v(e,t=0){return(0,E.i)(e)?e:d(t)}let T=(0,s.forwardRef)(function({children:e,style:t={},value:n,as:c="li",onDrag:d,layout:m=!0,...f},y){let E=(0,o.h)(()=>l.E[c]),T=(0,s.useContext)(a.Y),b={x:v(t.x),y:v(t.y)},_=function(e,t,n,r){if("function"==typeof e)return function(e){u.S1.current=[],e();let t=h(u.S1.current,e);return u.S1.current=void 0,t}(e);let i="function"==typeof t?t:function(...e){let t=!Array.isArray(e[0]),n=t?0:-1,r=e[0+n],i=e[1+n],s=e[2+n],a=e[3+n],l=(0,p.s)(i,s,{mixer:g(s[0]),...a});return t?l(r):l}(t,void 0,void 0);return Array.isArray(e)?x(e,i):x([e],([e])=>i(e))}([b.x,b.y],([e,t])=>e||t?1:"unset");(0,i.k)(!!T,"Reorder.Item must be a child of Reorder.Group");let{axis:C,registerItem:j,updateOrder:R}=T;return(0,r.jsx)(E,{drag:C,...f,dragSnapToOrigin:!0,style:{...t,x:b.x,y:b.y,zIndex:_},layout:m,onDrag:(e,t)=>{let{velocity:r}=t;r[C]&&R(n,b[C].get(),r[C]),d&&d(e,t)},onLayoutMeasure:e=>j(n,e),ref:y,ignoreStrict:!0,children:e})})},40976:function(e,t,n){n.d(t,{Y:function(){return r}});let r=(0,n(27378).createContext)(null)},47397:function(e,t,n){n.d(t,{o:function(){return a}});var r=n(42308);class i{constructor(){this.componentControls=new Set}subscribe(e){return this.componentControls.add(e),()=>this.componentControls.delete(e)}start(e,t){this.componentControls.forEach(n=>{n.start(e.nativeEvent||e,t)})}}let s=()=>new i;function a(){return(0,r.h)(s)}},76649:function(e,t,n){n.d(t,{Ln:function(){return r}});let r=(e,t)=>s(e,t),i=Symbol("SOME"),s=(e,t)=>"string"==typeof e?e===typeof t:Array.isArray(e)?i in e?e.some(e=>s(e,t)):!!Array.isArray(t)&&(0===e.length||t.every(t=>e.some(e=>s(e,t)))):"object"==typeof t&&null!==t&&Object.entries(e).every(([e,n])=>s(n,t[e]));class a{static narrow(e){return new a(t=>r(e,t))}constructor(e){this.NF=void 0,this.NF=e}satisfied(e){return this.NF(e)}build(e){return e}and(e){let t=this.NF,n=e instanceof a?e.NF:e instanceof Function?e:t=>r(e,t);return new a(e=>t(e)&&n(e))}}new a(e=>!0)}}]);
|