ethyca-fides 2.60.1rc0__py2.py3-none-any.whl → 2.60.2b1__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.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/METADATA +1 -1
- {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/RECORD +204 -199
- {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/WHEEL +1 -1
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/d0cbfec0b2dd_add_okta_to_connection_types.py +61 -0
- fides/api/api/deps.py +18 -2
- fides/api/api/v1/endpoints/admin.py +4 -3
- fides/api/app_setup.py +13 -5
- fides/api/db/database.py +11 -14
- fides/api/db/seed.py +88 -85
- fides/api/models/connectionconfig.py +3 -0
- fides/api/schemas/connection_configuration/__init__.py +9 -1
- fides/api/schemas/connection_configuration/connection_secrets_okta.py +28 -0
- fides/api/schemas/connection_configuration/enums/system_type.py +1 -0
- fides/api/service/connectors/__init__.py +2 -0
- fides/api/service/connectors/okta_connector.py +82 -0
- fides/api/service/connectors/website_connector.py +3 -0
- fides/api/task/task_resources.py +3 -0
- fides/api/util/data_category.py +1 -0
- fides/api/util/logger.py +6 -0
- fides/api/util/sqlalchemy_filter.py +30 -0
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/41G5DqvxaeevMKeDa2GHI/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1100-c3d52c9d7d6d0a39.js → 1100-2cf394cd4471259e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1817-64ec6ac3d4a06930.js → 1817-ee8d8da2ea918cb2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1904-00404c45e69d3225.js → 1904-f87496dea2581dc8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2479-064aefb3d187d6a2.js → 2479-d6501f8b9bca3d8b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3503-296468f82b067ec4.js → 3503-9cc9334d3a68f43e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3505-be2b4bf19fc92dd1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3513-a67cbaea856db18b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3702-929a386a64d55f19.js → 3702-95692cf4ec13e698.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3855-3345160a78baa978.js → 3855-d3f97721e4660f01.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3872-d7045d15aafffa12.js → 3872-df1ba49f1a04d709.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{401-1ba7e037992ac460.js → 401-54d252182b3e2ea7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4060-dd7b6e0472703a2e.js → 4060-59e9be4a1470e956.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4121-01c43bbbfc6b8fd1.js → 4121-86ddc6a0c73b7287.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-07b76ecbabb5b27c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5487-fd9b930f4246520a.js → 5487-4883ba29c664eb59.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5826-5f6e7a91e9ff71d1.js → 5826-933b8ee2bb1f2127.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-3cd839e76636a62e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6277-6c465012cef1bd3d.js → 6277-4c913be9a3224d85.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6372-e35fc0a8874fdecf.js → 6372-a91f7f83fd6d2fd2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6853-df71f47693b139d3.js → 6853-69b4ed278f795088.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/69-1c5ef5d9bd62c647.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6954-00d6683243cc75d8.js → 6954-20fef944516137e9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7751-b3af4819eac0bc9c.js → 7751-b18457156beb526c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{79-110e5199495a81c7.js → 79-2bfc1edf2768a8ca.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{8433-2c6947927b1e74f5.js → 8433-8d6487450daa5dcf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{8934-41284e609c329cdd.js → 8934-d721b469d866804f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9327-2be9f27fbce039b0.js → 9327-ff3bcfb81f5b13ff.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9392.9178313b7a01d889.js → 9392.bfca299d4f39a9e0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9572-c3e70eb702e9d879.js → 9572-0d0f7ec92668289c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9676.d1e42fd1d03c4a76.js → 9676.97fdbec9c2a48c68.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9719-8ce33427015f12ae.js → 9719-f411ae7eaf9ca1e8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9767-e8b0b48d602451d8.js → 9767-ef56c202c0aed26e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9951-d8d1174b00f9dac1.js → 9951-6858d7c48b6af193.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9965-023779db7a1b4aa2.js → 9965-5458a5e440196293.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-73e79d3760ef2658.js → 404-599d88e7bb11c133.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-79807dd0b151eaa4.js → _app-e72a874012ab832d.js} +9 -9
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-2edda5eb5412ffb2.js → manual-2b39e3d90b16c88d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-27c3bdcc05a1f18e.js → multiple-aed3ff8f334381ad.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-05ece3100a0c3419.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-3c256e928748177a.js → ant-poc-3a07457432d08020.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-b3d62016149e5aa4.js → add-vendors-c3f11050818ddba3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-790c7c61ff9500f1.js → configure-07b20c42253721ed.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-6641f24adf72b00c.js → [id]-df8bbe621a78f0ff.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-300fd2800c417d0b.js → new-7f38473ce267348a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-f0ba90152c43c742.js → privacy-experience-0bede0bfe68670e8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-669b1039a5f0dcb6.js → [id]-77f44ebc908dfbbc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-e24975eaeedc7c51.js → new-79c27e52c8c8f621.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-90b331a666216e38.js → privacy-notices-71028bda4ba9bcf9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-b9919fa183e9308a.js → properties-4bce89ef8e17866f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-1762ed46d98cebad.js → reporting-bddf1524caf1eb17.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-07bc6a18cbad414a.js → consent-b2ccaff7cb5a7110.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-864af917f60d8f35.js → [projectUrn]-810bd0acfa7ae444.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-45ac2c54f21a57d5.js → projects-e249f80191e95778.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-8e0bc6d01176081a.js → data-catalog-ce3633a6b06e55a9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-a1259aa44bf99194.js → [systemId]-e133a36e8a84f1eb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-a8b44307dfd5c23e.js → [monitorId]-b13d724f5c018dbc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-333964fc8ce20616.js → action-center-84842f32dfe1a457.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-438ab93c6cd5c2a6.js → activity-675069b1fc87e064.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-05144da6383ba6a4.js → datamap-b1b8a9c527c81aa2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-a3311bdf11e5bb1b.js → [...subfieldNames]-4ae24f9f954ea59f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-b584029b66084b2a.js → [collectionName]-294442f48f0b1d80.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-2ababde59fc9efb4.js → [datasetId]-c73892f2cc94bf64.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-0ab5d223bb086360.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-5190a42b4bddac7d.js → dataset-32a74faa36cd0e41.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-63af795429688cac.js → [id]-2b2d8474ff4a7ec3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-fc637b767513d3fb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-92dce084869b6a94.js → datastore-connection-d13440427c446de5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-7220a947bb52c5a8.js → index-d996683a6be4989d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-5a600a16f2ad5fa0.js → [id]-edfa3f23be117915.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-225715668d4cf4c4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-34e5d096311c5aab.js → [id]-d4b136d56734e0b2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-722590a322ea866b.js → add-template-bd5d5c3a62e2e6bc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-77726c8d9ad39a64.js → messaging-ad70e91809840341.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-12037a323158a7be.js → [id]-5690e61a492ecfe7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-df490b611f1360fa.js → messaging-dc057b74178117ee.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-8575fd1d25457b4d.js → storage-2377669c82a0ce70.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-66c6d3725fc1861f.js → configure-2f5d74846a0d2fb6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-ff5856fc531097b2.js → privacy-requests-cd6f3319866992d2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-7f8cc582fc11b46d.js → [id]-dd197054dacf6c99.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-b739361d2b5714db.js → add-property-2b204911aadeef3b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-febd16a18011fd1e.js → properties-1cdb0094c4caf07e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6d046c2bf03ce067.js → datamap-02bf6b4e43e0457d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-95e9953afaad9260.js → about-5320dbda1705cf4c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-0d593a93ef57dbd7.js → [purpose_id]-37b2b8def129b56e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-6af20633b9646c93.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-d6e18187d6412a34.js → custom-fields-42692f8a5fcae0b2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-0392d1bc2b8ec616.js → domain-records-2161d4fd1f3fe54c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-7cbaa712ed7bd146.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-e99dc55a7a48a208.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-38ce7883fd27b61f.js → locations-40bc52b108e6ab44.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-693223a45403713e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-22d97471513e835d.js → regulations-259d0c058065e14d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-371665a915463095.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-69e582763772aec9.js → [id]-54a928ef67fa344f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{systems-d7a63f851cc99583.js → systems-22c29d7ee580c63f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-69d7eaf99cd157eb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-f29f0fbd62e10b6d.js → [id]-7546e00c78835823.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-f2dc8220e4aab9d7.js → user-management-a207e8f745c7e26b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{webpack-32c43a8d709ca5c6.js → webpack-ebb8d3b45b871241.js} +1 -1
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/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/images/connector-logos/okta.svg +7 -0
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +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 -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/chunks/3513-d03549cb201e7938.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-cd91353711218b86.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5835-057c2dec5117817c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-9199898696748d0c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9282-6b14898de61ba6f0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-2c64d0a87784019b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-60a80195eafe9839.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-32ff2757c1fb5a00.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-372906eb228e73b7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-41e6213e69789c1b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-db42cce5ec0ca55b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-297f558258a46f74.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3dc30591cc0a8881.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f408ebdc01892ff0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-244453d6d5413d6c.js +0 -1
- fides/ui-build/static/admin/_next/static/pNwRIyc_W4mC7MPm4ebOC/_buildManifest.js +0 -1
- {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{pNwRIyc_W4mC7MPm4ebOC → 41G5DqvxaeevMKeDa2GHI}/_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-
|
11
|
+
"date": "2025-05-05T14:14:41-0600",
|
12
12
|
"dirty": false,
|
13
13
|
"error": null,
|
14
|
-
"full-revisionid": "
|
15
|
-
"version": "2.60.
|
14
|
+
"full-revisionid": "fbfd80a33a65a68bffaadfdc0b5c93a90f78761c",
|
15
|
+
"version": "2.60.2b1"
|
16
16
|
}
|
17
17
|
''' # END VERSION_JSON
|
18
18
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"""add okta to connection_types
|
2
|
+
|
3
|
+
Revision ID: d0cbfec0b2dd
|
4
|
+
Revises: c9c72b3d550b
|
5
|
+
Create Date: 2025-04-23 15:22:57.920715
|
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 = "d0cbfec0b2dd"
|
15
|
+
down_revision = "c9c72b3d550b"
|
16
|
+
branch_labels = None
|
17
|
+
depends_on = None
|
18
|
+
|
19
|
+
type_to_handle = "okta"
|
20
|
+
|
21
|
+
|
22
|
+
def get_enum_values():
|
23
|
+
conn = op.get_bind()
|
24
|
+
result = conn.execute("SELECT unnest(enum_range(NULL::connectiontype))").fetchall()
|
25
|
+
return [row[0] for row in result]
|
26
|
+
|
27
|
+
|
28
|
+
def upgrade():
|
29
|
+
# add 'okta' to ConnectionType enum
|
30
|
+
enum_values = [f"'{value}'" for value in get_enum_values() + [type_to_handle]]
|
31
|
+
enum_values.sort() # Just to keep it fantastic
|
32
|
+
|
33
|
+
op.execute("ALTER TYPE connectiontype RENAME TO connectiontype_old")
|
34
|
+
op.execute(f"CREATE TYPE connectiontype AS ENUM ({', '.join(set(enum_values))})")
|
35
|
+
op.execute(
|
36
|
+
"""
|
37
|
+
ALTER TABLE connectionconfig ALTER COLUMN connection_type TYPE connectiontype USING
|
38
|
+
connection_type::text::connectiontype
|
39
|
+
"""
|
40
|
+
)
|
41
|
+
op.execute("DROP TYPE connectiontype_old")
|
42
|
+
|
43
|
+
|
44
|
+
def downgrade():
|
45
|
+
# Remove 'okta' from ConnectionType enum
|
46
|
+
enum_values = [f"'{v.strip()}'" for v in get_enum_values() if v != type_to_handle]
|
47
|
+
enum_values.sort() # Just to keep it fantastic
|
48
|
+
|
49
|
+
op.execute(
|
50
|
+
f"DELETE FROM connectionconfig WHERE connection_type IN ('{type_to_handle}')"
|
51
|
+
)
|
52
|
+
op.execute("ALTER TYPE connectiontype RENAME TO connectiontype_old")
|
53
|
+
|
54
|
+
op.execute(f"CREATE TYPE connectiontype AS ENUM ({', '.join(set(enum_values))})")
|
55
|
+
op.execute(
|
56
|
+
"""
|
57
|
+
ALTER TABLE connectionconfig ALTER COLUMN connection_type TYPE connectiontype USING
|
58
|
+
connection_type::text::connectiontype
|
59
|
+
"""
|
60
|
+
)
|
61
|
+
op.execute("DROP TYPE connectiontype_old")
|
fides/api/api/deps.py
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
from contextlib import contextmanager
|
2
|
-
from typing import Generator
|
1
|
+
from contextlib import asynccontextmanager, contextmanager
|
2
|
+
from typing import AsyncGenerator, Generator
|
3
3
|
|
4
4
|
from fastapi import Depends
|
5
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
5
6
|
from sqlalchemy.orm import Session
|
6
7
|
|
7
8
|
from fides.api.common_exceptions import RedisNotConfigured
|
9
|
+
from fides.api.db.ctl_session import async_session
|
8
10
|
from fides.api.db.session import get_db_engine, get_db_session
|
9
11
|
from fides.api.util.cache import get_cache as get_redis_connection
|
10
12
|
from fides.config import CONFIG, FidesConfig
|
@@ -102,3 +104,17 @@ def get_cache() -> Generator:
|
|
102
104
|
"Application redis cache required, but it is currently disabled! Please update your application configuration to enable integration with a Redis cache."
|
103
105
|
)
|
104
106
|
yield get_redis_connection()
|
107
|
+
|
108
|
+
|
109
|
+
@asynccontextmanager
|
110
|
+
async def get_async_autoclose_db_session() -> AsyncGenerator[AsyncSession, None]:
|
111
|
+
"""
|
112
|
+
Return an async database session as an async context manager that automatically closes when the context exits.
|
113
|
+
|
114
|
+
Use this when you need manual control over the async session lifecycle outside of API endpoints.
|
115
|
+
"""
|
116
|
+
session = async_session()
|
117
|
+
try:
|
118
|
+
yield session
|
119
|
+
finally:
|
120
|
+
await session.close()
|
@@ -16,6 +16,7 @@ ADMIN_ROUTER = APIRouter(prefix=API_PREFIX, tags=["Admin"])
|
|
16
16
|
|
17
17
|
class DBActions(str, Enum):
|
18
18
|
"The available path parameters for the `/admin/db/{action}` endpoint."
|
19
|
+
|
19
20
|
upgrade = "upgrade"
|
20
21
|
reset = "reset"
|
21
22
|
downgrade = "downgrade"
|
@@ -29,7 +30,7 @@ class DBActions(str, Enum):
|
|
29
30
|
],
|
30
31
|
status_code=status.HTTP_200_OK,
|
31
32
|
)
|
32
|
-
|
33
|
+
def db_action(action: DBActions, revision: Optional[str] = "head") -> Dict:
|
33
34
|
"""
|
34
35
|
Initiate one of the enumerated DBActions.
|
35
36
|
|
@@ -40,7 +41,7 @@ async def db_action(action: DBActions, revision: Optional[str] = "head") -> Dict
|
|
40
41
|
|
41
42
|
if action == DBActions.downgrade:
|
42
43
|
try:
|
43
|
-
|
44
|
+
migrate_db(database_url=CONFIG.database.sync_database_uri, revision=revision, downgrade=True) # type: ignore[arg-type]
|
44
45
|
action_text = "downgrade"
|
45
46
|
except Exception as e:
|
46
47
|
logger.exception("Database downgrade failed")
|
@@ -68,7 +69,7 @@ async def db_action(action: DBActions, revision: Optional[str] = "head") -> Dict
|
|
68
69
|
|
69
70
|
try:
|
70
71
|
logger.info("Database being configured...")
|
71
|
-
|
72
|
+
configure_db(CONFIG.database.sync_database_uri, revision=revision)
|
72
73
|
except Exception as e:
|
73
74
|
logger.exception("Database configuration failed: {e}")
|
74
75
|
raise HTTPException(
|
fides/api/app_setup.py
CHANGED
@@ -16,7 +16,11 @@ from slowapi.extension import _rate_limit_exceeded_handler # type: ignore
|
|
16
16
|
from slowapi.middleware import SlowAPIMiddleware # type: ignore
|
17
17
|
|
18
18
|
import fides
|
19
|
-
from fides.api.api.deps import
|
19
|
+
from fides.api.api.deps import (
|
20
|
+
get_api_session,
|
21
|
+
get_async_autoclose_db_session,
|
22
|
+
get_autoclose_db_session,
|
23
|
+
)
|
20
24
|
from fides.api.api.v1 import CTL_ROUTER
|
21
25
|
from fides.api.api.v1.api import api_router
|
22
26
|
from fides.api.api.v1.endpoints.admin import ADMIN_ROUTER
|
@@ -24,7 +28,8 @@ from fides.api.api.v1.endpoints.generic_overrides import GENERIC_OVERRIDES_ROUTE
|
|
24
28
|
from fides.api.api.v1.endpoints.health import HEALTH_ROUTER
|
25
29
|
from fides.api.api.v1.exception_handlers import ExceptionHandlers
|
26
30
|
from fides.api.common_exceptions import RedisConnectionError, RedisNotConfigured
|
27
|
-
from fides.api.db
|
31
|
+
from fides.api.db import seed
|
32
|
+
from fides.api.db.database import configure_db, seed_db
|
28
33
|
from fides.api.db.seed import create_or_update_parent_user
|
29
34
|
from fides.api.models.application_config import ApplicationConfig
|
30
35
|
from fides.api.oauth.system_manager_oauth_util import (
|
@@ -165,9 +170,12 @@ async def run_database_startup(app: FastAPI) -> None:
|
|
165
170
|
|
166
171
|
if CONFIG.database.automigrate:
|
167
172
|
try:
|
168
|
-
|
169
|
-
|
170
|
-
|
173
|
+
configure_db(CONFIG.database.sync_database_uri)
|
174
|
+
with get_autoclose_db_session() as session:
|
175
|
+
seed_db(session)
|
176
|
+
if CONFIG.database.load_samples:
|
177
|
+
async with get_async_autoclose_db_session() as async_session:
|
178
|
+
await seed.load_samples(async_session)
|
171
179
|
except Exception as e:
|
172
180
|
logger.error("Error occurred during database configuration: {}", str(e))
|
173
181
|
else:
|
fides/api/db/database.py
CHANGED
@@ -14,8 +14,7 @@ from sqlalchemy_utils.functions import create_database, database_exists
|
|
14
14
|
from sqlalchemy_utils.types.encrypted.encrypted_type import InvalidCiphertextError
|
15
15
|
|
16
16
|
from fides.api.db.base import Base # type: ignore[attr-defined]
|
17
|
-
from fides.api.db.
|
18
|
-
from fides.api.db.seed import load_default_resources, load_samples
|
17
|
+
from fides.api.db.seed import load_default_resources
|
19
18
|
from fides.api.util.errors import get_full_exception_name
|
20
19
|
from fides.core.utils import get_db_engine
|
21
20
|
|
@@ -48,9 +47,8 @@ def downgrade_db(alembic_config: Config, revision: str = "head") -> None:
|
|
48
47
|
command.downgrade(alembic_config, revision)
|
49
48
|
|
50
49
|
|
51
|
-
|
50
|
+
def migrate_db(
|
52
51
|
database_url: str,
|
53
|
-
samples: bool = False,
|
54
52
|
revision: str = "head",
|
55
53
|
downgrade: bool = False,
|
56
54
|
) -> None:
|
@@ -66,11 +64,6 @@ async def migrate_db(
|
|
66
64
|
else:
|
67
65
|
upgrade_db(alembic_config, revision)
|
68
66
|
|
69
|
-
async with async_session() as session:
|
70
|
-
await load_default_resources(session)
|
71
|
-
if samples:
|
72
|
-
await load_samples(session)
|
73
|
-
|
74
67
|
|
75
68
|
def create_db_if_not_exists(database_url: str) -> None:
|
76
69
|
"""
|
@@ -121,13 +114,17 @@ def get_db_health(
|
|
121
114
|
return ("unhealthy", None)
|
122
115
|
|
123
116
|
|
124
|
-
|
125
|
-
|
126
|
-
)
|
127
|
-
|
117
|
+
def seed_db(session: Session) -> None:
|
118
|
+
"""Load default resources into the database, and optionally load samples."""
|
119
|
+
load_default_resources(session)
|
120
|
+
|
121
|
+
|
122
|
+
def configure_db(database_url: str, revision: Optional[str] = "head") -> None:
|
123
|
+
"""Set up the db to be used by the app. Creates db if needed and runs migrations."""
|
128
124
|
try:
|
129
125
|
create_db_if_not_exists(database_url)
|
130
|
-
|
126
|
+
migrate_db(database_url, revision=revision) # type: ignore[arg-type]
|
127
|
+
|
131
128
|
except InvalidCiphertextError as cipher_error:
|
132
129
|
log.error(
|
133
130
|
"Unable to configure database due to a decryption error! Check to ensure your `app_encryption_key` has not changed."
|
fides/api/db/seed.py
CHANGED
@@ -25,6 +25,7 @@ from fides.api.models.fides_user_permissions import FidesUserPermissions
|
|
25
25
|
from fides.api.models.policy import Policy, Rule, RuleTarget
|
26
26
|
from fides.api.models.sql_models import ( # type: ignore[attr-defined]
|
27
27
|
Dataset,
|
28
|
+
Organization,
|
28
29
|
System,
|
29
30
|
sql_model_map,
|
30
31
|
)
|
@@ -44,7 +45,7 @@ from fides.api.util.text import to_snake_case
|
|
44
45
|
from fides.config import CONFIG
|
45
46
|
from fides.service.dataset.dataset_config_service import DatasetConfigService
|
46
47
|
|
47
|
-
from .crud import
|
48
|
+
from .crud import upsert_resources
|
48
49
|
from .samples import (
|
49
50
|
load_sample_connections_from_project,
|
50
51
|
load_sample_resources_from_project,
|
@@ -282,106 +283,41 @@ def load_default_erasure_policy(
|
|
282
283
|
)
|
283
284
|
|
284
285
|
|
285
|
-
def load_default_dsr_policies() -> None:
|
286
|
+
def load_default_dsr_policies(session: Session) -> None:
|
286
287
|
"""
|
287
288
|
Checks whether DSR execution policies exist in the database, and
|
288
289
|
inserts them to target a default set of data categories if not.
|
289
290
|
"""
|
290
|
-
|
291
|
-
client_id = get_client_id(db_session)
|
291
|
+
client_id = get_client_id(session)
|
292
292
|
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
293
|
+
# By default, include all categories *except* those related to a user's
|
294
|
+
# financial, payment, and credentials data. These are typically not
|
295
|
+
# included in access and erasure requests as they are covered by other
|
296
|
+
# compliance programs (e.g. legal, tax, security) and most
|
297
|
+
# organizations need to be extra careful about how these are used -
|
298
|
+
# especially for erasure! Therefore, a safe default for "out of the
|
299
|
+
# box" behaviour is to exclude these
|
300
300
|
|
301
|
-
|
301
|
+
default_data_categories = get_user_data_categories()
|
302
302
|
|
303
|
-
|
304
|
-
|
305
|
-
)
|
306
|
-
|
307
|
-
load_default_access_policy(db_session, client_id, default_data_categories)
|
308
|
-
load_default_erasure_policy(db_session, client_id, default_data_categories)
|
309
|
-
|
310
|
-
log.info("All default policies & rules created")
|
311
|
-
|
312
|
-
|
313
|
-
async def load_default_organization(async_session: AsyncSession) -> None:
|
314
|
-
"""
|
315
|
-
Seed the database with a default organization unless
|
316
|
-
one with a matching name already exists.
|
317
|
-
"""
|
318
|
-
|
319
|
-
log.info("Loading the default organization...")
|
320
|
-
organizations: List[Dict] = list(
|
321
|
-
map(dict, DEFAULT_TAXONOMY.model_dump(mode="json")["organization"])
|
303
|
+
log.debug(
|
304
|
+
f"Preparing to create default rules for the following Data Categories: {default_data_categories} if they do not already exist"
|
322
305
|
)
|
323
306
|
|
324
|
-
|
325
|
-
|
326
|
-
try:
|
327
|
-
existing = await get_resource(
|
328
|
-
sql_model_map["organization"],
|
329
|
-
org["fides_key"],
|
330
|
-
async_session,
|
331
|
-
raise_not_found=False,
|
332
|
-
)
|
333
|
-
if not existing:
|
334
|
-
await create_resource(sql_model_map["organization"], org, async_session)
|
335
|
-
inserted += 1
|
336
|
-
except AlreadyExistsError:
|
337
|
-
pass
|
307
|
+
load_default_access_policy(session, client_id, default_data_categories)
|
308
|
+
load_default_erasure_policy(session, client_id, default_data_categories)
|
338
309
|
|
339
|
-
log.
|
340
|
-
log.debug(f"SKIPPED {len(organizations)-inserted} organization resource(s)")
|
341
|
-
|
342
|
-
|
343
|
-
async def load_default_taxonomy(async_session: AsyncSession) -> None:
|
344
|
-
"""Seed the database with the default taxonomy resources."""
|
345
|
-
|
346
|
-
upsert_resource_types = list(DEFAULT_TAXONOMY.model_fields_set)
|
347
|
-
upsert_resource_types.remove("organization")
|
348
|
-
|
349
|
-
log.info("Loading the default fideslang taxonomy resources...")
|
350
|
-
for resource_type in upsert_resource_types:
|
351
|
-
log.debug(f"Processing {resource_type} resources...")
|
352
|
-
default_resources = DEFAULT_TAXONOMY.model_dump(mode="json")[resource_type]
|
353
|
-
existing_resources = await list_resource(
|
354
|
-
sql_model_map[resource_type], async_session
|
355
|
-
)
|
356
|
-
existing_keys = [item.fides_key for item in existing_resources]
|
357
|
-
resources = [
|
358
|
-
resource
|
359
|
-
for resource in default_resources
|
360
|
-
if resource["fides_key"] not in existing_keys
|
361
|
-
]
|
362
|
-
|
363
|
-
if len(resources) == 0:
|
364
|
-
log.debug(f"No new {resource_type} resources to add from default taxonomy.")
|
365
|
-
continue
|
366
|
-
|
367
|
-
try:
|
368
|
-
await upsert_resources(
|
369
|
-
sql_model_map[resource_type], resources, async_session
|
370
|
-
)
|
371
|
-
except QueryError: # pragma: no cover
|
372
|
-
pass # The create_resource function will log the error
|
373
|
-
else:
|
374
|
-
log.debug(f"UPSERTED {len(resources)} {resource_type} resource(s)")
|
310
|
+
log.info("All default policies & rules created")
|
375
311
|
|
376
312
|
|
377
|
-
|
313
|
+
def load_default_resources(session: Session) -> None:
|
378
314
|
"""
|
379
315
|
Seed the database with default resources that the application
|
380
316
|
expects to be available.
|
381
317
|
"""
|
382
|
-
|
383
|
-
|
384
|
-
load_default_dsr_policies()
|
318
|
+
load_default_organization(session)
|
319
|
+
load_default_taxonomy(session)
|
320
|
+
load_default_dsr_policies(session)
|
385
321
|
|
386
322
|
|
387
323
|
async def load_samples(async_session: AsyncSession) -> None:
|
@@ -549,3 +485,70 @@ async def load_samples(async_session: AsyncSession) -> None:
|
|
549
485
|
|
550
486
|
except QueryError: # pragma: no cover
|
551
487
|
pass # The upsert_resources function will log any error
|
488
|
+
|
489
|
+
|
490
|
+
def load_default_organization(db: Session) -> None:
|
491
|
+
"""
|
492
|
+
Seed the database with a default organization unless
|
493
|
+
one with a matching name already exists.
|
494
|
+
"""
|
495
|
+
log.info("Loading the default organization...")
|
496
|
+
organizations: List[Dict] = list(
|
497
|
+
map(dict, DEFAULT_TAXONOMY.model_dump(mode="json")["organization"])
|
498
|
+
)
|
499
|
+
|
500
|
+
inserted = 0
|
501
|
+
for org in organizations:
|
502
|
+
try:
|
503
|
+
existing = Organization.get_by(
|
504
|
+
db=db, field="fides_key", value=org["fides_key"]
|
505
|
+
)
|
506
|
+
if not existing:
|
507
|
+
Organization.create(db=db, data=org, check_name=False)
|
508
|
+
inserted += 1
|
509
|
+
except AlreadyExistsError:
|
510
|
+
pass
|
511
|
+
|
512
|
+
log.debug(f"INSERTED {inserted} organization resource(s)")
|
513
|
+
log.debug(f"SKIPPED {len(organizations)-inserted} organization resource(s)")
|
514
|
+
|
515
|
+
|
516
|
+
def load_default_taxonomy(db: Session) -> None:
|
517
|
+
"""Synchronous version: Seed the database with the default taxonomy resources."""
|
518
|
+
upsert_resource_types = list(DEFAULT_TAXONOMY.model_fields_set)
|
519
|
+
upsert_resource_types.remove("organization")
|
520
|
+
|
521
|
+
log.info("Loading the default fideslang taxonomy resources...")
|
522
|
+
for resource_type in upsert_resource_types:
|
523
|
+
sql_model = sql_model_map[resource_type]
|
524
|
+
log.debug(f"Processing {resource_type} resources...")
|
525
|
+
default_resources = DEFAULT_TAXONOMY.model_dump(mode="json")[resource_type]
|
526
|
+
|
527
|
+
try:
|
528
|
+
# Fetch existing keys first
|
529
|
+
existing_keys = {item[0] for item in db.query(sql_model.fides_key).all()}
|
530
|
+
except Exception as exc:
|
531
|
+
log.error(f"Error fetching existing keys for {resource_type}: {exc}")
|
532
|
+
continue # Skip this resource type if we can't get existing keys
|
533
|
+
|
534
|
+
# Filter for resources that don't exist
|
535
|
+
resources_to_create = [
|
536
|
+
resource
|
537
|
+
for resource in default_resources
|
538
|
+
if resource["fides_key"] not in existing_keys
|
539
|
+
]
|
540
|
+
|
541
|
+
if not resources_to_create:
|
542
|
+
log.debug(f"No new {resource_type} resources to add from default taxonomy.")
|
543
|
+
continue
|
544
|
+
|
545
|
+
created_count = 0
|
546
|
+
for resource_data in resources_to_create:
|
547
|
+
try:
|
548
|
+
sql_model.create_or_update(db=db, data=resource_data)
|
549
|
+
created_count += 1
|
550
|
+
except Exception:
|
551
|
+
pass
|
552
|
+
|
553
|
+
if created_count > 0:
|
554
|
+
log.debug(f"UPSERTED {created_count} {resource_type} resource(s)")
|
@@ -57,6 +57,7 @@ class ConnectionType(enum.Enum):
|
|
57
57
|
mongodb = "mongodb"
|
58
58
|
mssql = "mssql"
|
59
59
|
mysql = "mysql"
|
60
|
+
okta = "okta"
|
60
61
|
postgres = "postgres"
|
61
62
|
rds_mysql = "rds_mysql"
|
62
63
|
rds_postgres = "rds_postgres"
|
@@ -92,6 +93,7 @@ class ConnectionType(enum.Enum):
|
|
92
93
|
ConnectionType.mongodb.value: "MongoDB",
|
93
94
|
ConnectionType.mssql.value: "Microsoft SQL Server",
|
94
95
|
ConnectionType.mysql.value: "MySQL",
|
96
|
+
ConnectionType.okta.value: "Okta",
|
95
97
|
ConnectionType.postgres.value: "PostgreSQL",
|
96
98
|
ConnectionType.rds_mysql.value: "RDS MySQL",
|
97
99
|
ConnectionType.rds_postgres.value: "RDS Postgres",
|
@@ -135,6 +137,7 @@ class ConnectionType(enum.Enum):
|
|
135
137
|
ConnectionType.mongodb.value: SystemType.database,
|
136
138
|
ConnectionType.mssql.value: SystemType.database,
|
137
139
|
ConnectionType.mysql.value: SystemType.database,
|
140
|
+
ConnectionType.okta.value: SystemType.system,
|
138
141
|
ConnectionType.postgres.value: SystemType.database,
|
139
142
|
ConnectionType.rds_mysql.value: SystemType.database,
|
140
143
|
ConnectionType.rds_postgres.value: SystemType.database,
|
@@ -92,6 +92,12 @@ from fides.api.schemas.connection_configuration.connection_secrets_mysql import
|
|
92
92
|
from fides.api.schemas.connection_configuration.connection_secrets_mysql import (
|
93
93
|
MySQLSchema as MySQLSchema,
|
94
94
|
)
|
95
|
+
from fides.api.schemas.connection_configuration.connection_secrets_okta import (
|
96
|
+
OktaDocsSchema as OktaDocsSchema,
|
97
|
+
)
|
98
|
+
from fides.api.schemas.connection_configuration.connection_secrets_okta import (
|
99
|
+
OktaSchema as OktaSchema,
|
100
|
+
)
|
95
101
|
from fides.api.schemas.connection_configuration.connection_secrets_postgres import (
|
96
102
|
PostgreSQLDocsSchema as PostgreSQLDocsSchema,
|
97
103
|
)
|
@@ -172,6 +178,7 @@ secrets_schemas: Dict[str, Any] = {
|
|
172
178
|
ConnectionType.mariadb.value: MariaDBSchema,
|
173
179
|
ConnectionType.mongodb.value: MongoDBSchema,
|
174
180
|
ConnectionType.mssql.value: MicrosoftSQLServerSchema,
|
181
|
+
ConnectionType.okta.value: OktaSchema,
|
175
182
|
ConnectionType.mysql.value: MySQLSchema,
|
176
183
|
ConnectionType.postgres.value: PostgreSQLSchema,
|
177
184
|
ConnectionType.rds_mysql.value: RDSMySQLSchema,
|
@@ -231,9 +238,10 @@ connection_secrets_schemas = Union[
|
|
231
238
|
MongoDBDocsSchema,
|
232
239
|
MSSQLDocsSchema,
|
233
240
|
MySQLDocsSchema,
|
241
|
+
OktaDocsSchema,
|
242
|
+
PostgreSQLDocsSchema,
|
234
243
|
RDSMySQLDocsSchema,
|
235
244
|
RDSPostgresDocsSchema,
|
236
|
-
PostgreSQLDocsSchema,
|
237
245
|
RedshiftDocsSchema,
|
238
246
|
S3DocsSchema,
|
239
247
|
SaaSSchema,
|
@@ -0,0 +1,28 @@
|
|
1
|
+
from typing import ClassVar, List
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from fides.api.schemas.base_class import NoValidationSchema
|
6
|
+
from fides.api.schemas.connection_configuration.connection_secrets import (
|
7
|
+
ConnectionConfigSecretsSchema,
|
8
|
+
)
|
9
|
+
|
10
|
+
|
11
|
+
class OktaSchema(ConnectionConfigSecretsSchema):
|
12
|
+
"""Schema to validate the secrets needed to connect to Okta"""
|
13
|
+
|
14
|
+
org_url: str = Field(
|
15
|
+
title="Organization URL",
|
16
|
+
description="The URL of your Okta organization (e.g. https://your-org.okta.com)",
|
17
|
+
)
|
18
|
+
api_token: str = Field(
|
19
|
+
title="API Token",
|
20
|
+
description="The API token used to authenticate with Okta",
|
21
|
+
json_schema_extra={"sensitive": True},
|
22
|
+
)
|
23
|
+
|
24
|
+
_required_components: ClassVar[List[str]] = ["org_url", "api_token"]
|
25
|
+
|
26
|
+
|
27
|
+
class OktaDocsSchema(OktaSchema, NoValidationSchema):
|
28
|
+
"""Okta Secrets Schema for API Docs"""
|
@@ -54,6 +54,7 @@ from fides.api.service.connectors.mongodb_connector import (
|
|
54
54
|
from fides.api.service.connectors.mysql_connector import (
|
55
55
|
MySQLConnector as MySQLConnector,
|
56
56
|
)
|
57
|
+
from fides.api.service.connectors.okta_connector import OktaConnector as OktaConnector
|
57
58
|
from fides.api.service.connectors.postgres_connector import (
|
58
59
|
PostgreSQLConnector as PostgreSQLConnector,
|
59
60
|
)
|
@@ -96,6 +97,7 @@ supported_connectors: Dict[str, Any] = {
|
|
96
97
|
ConnectionType.mongodb.value: MongoDBConnector,
|
97
98
|
ConnectionType.mssql.value: MicrosoftSQLServerConnector,
|
98
99
|
ConnectionType.mysql.value: MySQLConnector,
|
100
|
+
ConnectionType.okta.value: OktaConnector,
|
99
101
|
ConnectionType.postgres.value: PostgreSQLConnector,
|
100
102
|
ConnectionType.rds_mysql.value: RDSMySQLConnector,
|
101
103
|
ConnectionType.rds_postgres.value: RDSPostgresConnector,
|
@@ -0,0 +1,82 @@
|
|
1
|
+
from typing import Any, Dict, List, Optional
|
2
|
+
|
3
|
+
from okta.client import Client as OktaClient
|
4
|
+
from okta.exceptions import OktaAPIException
|
5
|
+
|
6
|
+
from fides.api.common_exceptions import ConnectionException
|
7
|
+
from fides.api.graph.execution import ExecutionNode
|
8
|
+
from fides.api.models.connectionconfig import ConnectionTestStatus
|
9
|
+
from fides.api.models.policy import Policy
|
10
|
+
from fides.api.models.privacy_request import PrivacyRequest, RequestTask
|
11
|
+
from fides.api.service.connectors.base_connector import BaseConnector
|
12
|
+
from fides.api.service.connectors.query_configs.query_config import QueryConfig
|
13
|
+
from fides.api.util.collection_util import Row
|
14
|
+
|
15
|
+
|
16
|
+
class OktaConnector(BaseConnector):
|
17
|
+
"""
|
18
|
+
Okta connector for integrating with Okta's API.
|
19
|
+
This connector allows for user management and authentication operations.
|
20
|
+
"""
|
21
|
+
|
22
|
+
@property
|
23
|
+
def dsr_supported(self) -> bool:
|
24
|
+
return False
|
25
|
+
|
26
|
+
def create_client(self) -> OktaClient:
|
27
|
+
"""Creates and returns an Okta client instance"""
|
28
|
+
try:
|
29
|
+
return OktaClient(
|
30
|
+
{
|
31
|
+
"orgUrl": self.configuration.secrets["org_url"],
|
32
|
+
"token": self.configuration.secrets["api_token"],
|
33
|
+
}
|
34
|
+
)
|
35
|
+
except Exception as e:
|
36
|
+
raise ConnectionException(f"Failed to create Okta client: {str(e)}")
|
37
|
+
|
38
|
+
def query_config(self, node: ExecutionNode) -> QueryConfig[Any]:
|
39
|
+
"""Return the query config that corresponds to this connector type"""
|
40
|
+
raise NotImplementedError("Query config not implemented for Okta")
|
41
|
+
|
42
|
+
def test_connection(self) -> Optional[ConnectionTestStatus]:
|
43
|
+
"""
|
44
|
+
Validates the connection to Okta by attempting to list users.
|
45
|
+
"""
|
46
|
+
try:
|
47
|
+
client = self.client()
|
48
|
+
# Try to list applications as a test of the connection
|
49
|
+
client.list_applications()
|
50
|
+
return ConnectionTestStatus.succeeded
|
51
|
+
except OktaAPIException as e:
|
52
|
+
raise ConnectionException(f"Failed to connect to Okta: {str(e)}")
|
53
|
+
except Exception as e:
|
54
|
+
raise ConnectionException(
|
55
|
+
f"Unexpected error testing Okta connection: {str(e)}"
|
56
|
+
)
|
57
|
+
|
58
|
+
def retrieve_data(
|
59
|
+
self,
|
60
|
+
node: ExecutionNode,
|
61
|
+
policy: Policy,
|
62
|
+
privacy_request: PrivacyRequest,
|
63
|
+
request_task: RequestTask,
|
64
|
+
input_data: Dict[str, List[Any]],
|
65
|
+
) -> List[Row]:
|
66
|
+
"""DSR execution not supported for Okta connector"""
|
67
|
+
return []
|
68
|
+
|
69
|
+
def mask_data(
|
70
|
+
self,
|
71
|
+
node: ExecutionNode,
|
72
|
+
policy: Policy,
|
73
|
+
privacy_request: PrivacyRequest,
|
74
|
+
request_task: RequestTask,
|
75
|
+
rows: List[Row],
|
76
|
+
) -> int:
|
77
|
+
"""DSR execution not supported for Okta connector"""
|
78
|
+
return 0
|
79
|
+
|
80
|
+
def close(self) -> None:
|
81
|
+
"""Close any held resources"""
|
82
|
+
# No resources to close for Okta client
|
@@ -20,6 +20,9 @@ class WebsiteConnector(BaseConnector):
|
|
20
20
|
NOTE: No DSR processing is supported for Website connectors.
|
21
21
|
"""
|
22
22
|
|
23
|
+
def dsr_supported(self) -> bool:
|
24
|
+
return False
|
25
|
+
|
23
26
|
def create_client(self) -> Any: # type: ignore
|
24
27
|
"""Returns a client for the website"""
|
25
28
|
|