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.
Files changed (220) hide show
  1. {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/RECORD +204 -199
  3. {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/WHEEL +1 -1
  4. fides/_version.py +3 -3
  5. fides/api/alembic/migrations/versions/d0cbfec0b2dd_add_okta_to_connection_types.py +61 -0
  6. fides/api/api/deps.py +18 -2
  7. fides/api/api/v1/endpoints/admin.py +4 -3
  8. fides/api/app_setup.py +13 -5
  9. fides/api/db/database.py +11 -14
  10. fides/api/db/seed.py +88 -85
  11. fides/api/models/connectionconfig.py +3 -0
  12. fides/api/schemas/connection_configuration/__init__.py +9 -1
  13. fides/api/schemas/connection_configuration/connection_secrets_okta.py +28 -0
  14. fides/api/schemas/connection_configuration/enums/system_type.py +1 -0
  15. fides/api/service/connectors/__init__.py +2 -0
  16. fides/api/service/connectors/okta_connector.py +82 -0
  17. fides/api/service/connectors/website_connector.py +3 -0
  18. fides/api/task/task_resources.py +3 -0
  19. fides/api/util/data_category.py +1 -0
  20. fides/api/util/logger.py +6 -0
  21. fides/api/util/sqlalchemy_filter.py +30 -0
  22. fides/ui-build/static/admin/404.html +1 -1
  23. fides/ui-build/static/admin/_next/static/41G5DqvxaeevMKeDa2GHI/_buildManifest.js +1 -0
  24. fides/ui-build/static/admin/_next/static/chunks/{1100-c3d52c9d7d6d0a39.js → 1100-2cf394cd4471259e.js} +1 -1
  25. fides/ui-build/static/admin/_next/static/chunks/{1817-64ec6ac3d4a06930.js → 1817-ee8d8da2ea918cb2.js} +1 -1
  26. fides/ui-build/static/admin/_next/static/chunks/{1904-00404c45e69d3225.js → 1904-f87496dea2581dc8.js} +1 -1
  27. fides/ui-build/static/admin/_next/static/chunks/{2479-064aefb3d187d6a2.js → 2479-d6501f8b9bca3d8b.js} +1 -1
  28. fides/ui-build/static/admin/_next/static/chunks/{3503-296468f82b067ec4.js → 3503-9cc9334d3a68f43e.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/3505-be2b4bf19fc92dd1.js +1 -0
  30. fides/ui-build/static/admin/_next/static/chunks/3513-a67cbaea856db18b.js +1 -0
  31. fides/ui-build/static/admin/_next/static/chunks/{3702-929a386a64d55f19.js → 3702-95692cf4ec13e698.js} +1 -1
  32. fides/ui-build/static/admin/_next/static/chunks/{3855-3345160a78baa978.js → 3855-d3f97721e4660f01.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{3872-d7045d15aafffa12.js → 3872-df1ba49f1a04d709.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/{401-1ba7e037992ac460.js → 401-54d252182b3e2ea7.js} +1 -1
  35. fides/ui-build/static/admin/_next/static/chunks/{4060-dd7b6e0472703a2e.js → 4060-59e9be4a1470e956.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/{4121-01c43bbbfc6b8fd1.js → 4121-86ddc6a0c73b7287.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/4481-07b76ecbabb5b27c.js +1 -0
  38. fides/ui-build/static/admin/_next/static/chunks/{5487-fd9b930f4246520a.js → 5487-4883ba29c664eb59.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{5826-5f6e7a91e9ff71d1.js → 5826-933b8ee2bb1f2127.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/5973-3cd839e76636a62e.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/{6277-6c465012cef1bd3d.js → 6277-4c913be9a3224d85.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{6372-e35fc0a8874fdecf.js → 6372-a91f7f83fd6d2fd2.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{6853-df71f47693b139d3.js → 6853-69b4ed278f795088.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/69-1c5ef5d9bd62c647.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/{6954-00d6683243cc75d8.js → 6954-20fef944516137e9.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{7751-b3af4819eac0bc9c.js → 7751-b18457156beb526c.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/{79-110e5199495a81c7.js → 79-2bfc1edf2768a8ca.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/{8433-2c6947927b1e74f5.js → 8433-8d6487450daa5dcf.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/{8934-41284e609c329cdd.js → 8934-d721b469d866804f.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/{9327-2be9f27fbce039b0.js → 9327-ff3bcfb81f5b13ff.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{9392.9178313b7a01d889.js → 9392.bfca299d4f39a9e0.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/{9572-c3e70eb702e9d879.js → 9572-0d0f7ec92668289c.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/{9676.d1e42fd1d03c4a76.js → 9676.97fdbec9c2a48c68.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/{9719-8ce33427015f12ae.js → 9719-f411ae7eaf9ca1e8.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/{9767-e8b0b48d602451d8.js → 9767-ef56c202c0aed26e.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/{9951-d8d1174b00f9dac1.js → 9951-6858d7c48b6af193.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/{9965-023779db7a1b4aa2.js → 9965-5458a5e440196293.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/pages/{404-73e79d3760ef2658.js → 404-599d88e7bb11c133.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-79807dd0b151eaa4.js → _app-e72a874012ab832d.js} +9 -9
  60. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-2edda5eb5412ffb2.js → manual-2b39e3d90b16c88d.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-27c3bdcc05a1f18e.js → multiple-aed3ff8f334381ad.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-05ece3100a0c3419.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-3c256e928748177a.js → ant-poc-3a07457432d08020.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-b3d62016149e5aa4.js → add-vendors-c3f11050818ddba3.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-790c7c61ff9500f1.js → configure-07b20c42253721ed.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-6641f24adf72b00c.js → [id]-df8bbe621a78f0ff.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-300fd2800c417d0b.js → new-7f38473ce267348a.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-f0ba90152c43c742.js → privacy-experience-0bede0bfe68670e8.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-669b1039a5f0dcb6.js → [id]-77f44ebc908dfbbc.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-e24975eaeedc7c51.js → new-79c27e52c8c8f621.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-90b331a666216e38.js → privacy-notices-71028bda4ba9bcf9.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-b9919fa183e9308a.js → properties-4bce89ef8e17866f.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-1762ed46d98cebad.js → reporting-bddf1524caf1eb17.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-07bc6a18cbad414a.js → consent-b2ccaff7cb5a7110.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-864af917f60d8f35.js → [projectUrn]-810bd0acfa7ae444.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-45ac2c54f21a57d5.js → projects-e249f80191e95778.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-8e0bc6d01176081a.js → data-catalog-ce3633a6b06e55a9.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-a1259aa44bf99194.js → [systemId]-e133a36e8a84f1eb.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-a8b44307dfd5c23e.js → [monitorId]-b13d724f5c018dbc.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-333964fc8ce20616.js → action-center-84842f32dfe1a457.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-438ab93c6cd5c2a6.js → activity-675069b1fc87e064.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-05144da6383ba6a4.js → datamap-b1b8a9c527c81aa2.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-a3311bdf11e5bb1b.js → [...subfieldNames]-4ae24f9f954ea59f.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-b584029b66084b2a.js → [collectionName]-294442f48f0b1d80.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-2ababde59fc9efb4.js → [datasetId]-c73892f2cc94bf64.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-0ab5d223bb086360.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-5190a42b4bddac7d.js → dataset-32a74faa36cd0e41.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-63af795429688cac.js → [id]-2b2d8474ff4a7ec3.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-fc637b767513d3fb.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-92dce084869b6a94.js → datastore-connection-d13440427c446de5.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/{index-7220a947bb52c5a8.js → index-d996683a6be4989d.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-5a600a16f2ad5fa0.js → [id]-edfa3f23be117915.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-225715668d4cf4c4.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-34e5d096311c5aab.js → [id]-d4b136d56734e0b2.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-722590a322ea866b.js → add-template-bd5d5c3a62e2e6bc.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-77726c8d9ad39a64.js → messaging-ad70e91809840341.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-12037a323158a7be.js → [id]-5690e61a492ecfe7.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-df490b611f1360fa.js → messaging-dc057b74178117ee.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-8575fd1d25457b4d.js → storage-2377669c82a0ce70.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-66c6d3725fc1861f.js → configure-2f5d74846a0d2fb6.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-ff5856fc531097b2.js → privacy-requests-cd6f3319866992d2.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-7f8cc582fc11b46d.js → [id]-dd197054dacf6c99.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-b739361d2b5714db.js → add-property-2b204911aadeef3b.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-febd16a18011fd1e.js → properties-1cdb0094c4caf07e.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6d046c2bf03ce067.js → datamap-02bf6b4e43e0457d.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-95e9953afaad9260.js → about-5320dbda1705cf4c.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-0d593a93ef57dbd7.js → [purpose_id]-37b2b8def129b56e.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-6af20633b9646c93.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-d6e18187d6412a34.js → custom-fields-42692f8a5fcae0b2.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-0392d1bc2b8ec616.js → domain-records-2161d4fd1f3fe54c.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-7cbaa712ed7bd146.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-e99dc55a7a48a208.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-38ce7883fd27b61f.js → locations-40bc52b108e6ab44.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-693223a45403713e.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-22d97471513e835d.js → regulations-259d0c058065e14d.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-371665a915463095.js +1 -0
  117. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-69e582763772aec9.js → [id]-54a928ef67fa344f.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-d7a63f851cc99583.js → systems-22c29d7ee580c63f.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-69d7eaf99cd157eb.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-f29f0fbd62e10b6d.js → [id]-7546e00c78835823.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-f2dc8220e4aab9d7.js → user-management-a207e8f745c7e26b.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/{webpack-32c43a8d709ca5c6.js → webpack-ebb8d3b45b871241.js} +1 -1
  123. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  124. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  125. fides/ui-build/static/admin/add-systems.html +1 -1
  126. fides/ui-build/static/admin/ant-poc.html +1 -1
  127. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  128. fides/ui-build/static/admin/consent/configure.html +1 -1
  129. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  130. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  131. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  132. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  133. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  134. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  135. fides/ui-build/static/admin/consent/properties.html +1 -1
  136. fides/ui-build/static/admin/consent/reporting.html +1 -1
  137. fides/ui-build/static/admin/consent.html +1 -1
  138. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  139. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  140. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  141. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  142. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  143. fides/ui-build/static/admin/data-catalog.html +1 -1
  144. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  145. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  146. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  147. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  148. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  149. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  150. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  151. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  152. fides/ui-build/static/admin/datamap.html +1 -1
  153. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  154. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  155. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  156. fides/ui-build/static/admin/dataset/new.html +1 -1
  157. fides/ui-build/static/admin/dataset.html +1 -1
  158. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  159. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  160. fides/ui-build/static/admin/datastore-connection.html +1 -1
  161. fides/ui-build/static/admin/images/connector-logos/okta.svg +7 -0
  162. fides/ui-build/static/admin/index.html +1 -1
  163. fides/ui-build/static/admin/integrations/[id].html +1 -1
  164. fides/ui-build/static/admin/integrations.html +1 -1
  165. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  166. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  167. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  168. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  169. fides/ui-build/static/admin/lib/fides.js +2 -2
  170. fides/ui-build/static/admin/login/[provider].html +1 -1
  171. fides/ui-build/static/admin/login.html +1 -1
  172. fides/ui-build/static/admin/messaging/[id].html +1 -1
  173. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  174. fides/ui-build/static/admin/messaging.html +1 -1
  175. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  176. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  177. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  178. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  179. fides/ui-build/static/admin/privacy-requests.html +1 -1
  180. fides/ui-build/static/admin/properties/[id].html +1 -1
  181. fides/ui-build/static/admin/properties/add-property.html +1 -1
  182. fides/ui-build/static/admin/properties.html +1 -1
  183. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  184. fides/ui-build/static/admin/settings/about.html +1 -1
  185. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  186. fides/ui-build/static/admin/settings/consent.html +1 -1
  187. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  188. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  189. fides/ui-build/static/admin/settings/domains.html +1 -1
  190. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  191. fides/ui-build/static/admin/settings/locations.html +1 -1
  192. fides/ui-build/static/admin/settings/organization.html +1 -1
  193. fides/ui-build/static/admin/settings/regulations.html +1 -1
  194. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  195. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  196. fides/ui-build/static/admin/systems.html +1 -1
  197. fides/ui-build/static/admin/taxonomy.html +1 -1
  198. fides/ui-build/static/admin/user-management/new.html +1 -1
  199. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  200. fides/ui-build/static/admin/user-management.html +1 -1
  201. fides/ui-build/static/admin/_next/static/chunks/3513-d03549cb201e7938.js +0 -1
  202. fides/ui-build/static/admin/_next/static/chunks/4481-cd91353711218b86.js +0 -1
  203. fides/ui-build/static/admin/_next/static/chunks/5835-057c2dec5117817c.js +0 -1
  204. fides/ui-build/static/admin/_next/static/chunks/5973-9199898696748d0c.js +0 -1
  205. fides/ui-build/static/admin/_next/static/chunks/9282-6b14898de61ba6f0.js +0 -1
  206. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-2c64d0a87784019b.js +0 -1
  207. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-60a80195eafe9839.js +0 -1
  208. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-32ff2757c1fb5a00.js +0 -1
  209. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-372906eb228e73b7.js +0 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-41e6213e69789c1b.js +0 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-db42cce5ec0ca55b.js +0 -1
  212. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-297f558258a46f74.js +0 -1
  213. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3dc30591cc0a8881.js +0 -1
  214. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f408ebdc01892ff0.js +0 -1
  215. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-244453d6d5413d6c.js +0 -1
  216. fides/ui-build/static/admin/_next/static/pNwRIyc_W4mC7MPm4ebOC/_buildManifest.js +0 -1
  217. {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/entry_points.txt +0 -0
  218. {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/licenses/LICENSE +0 -0
  219. {ethyca_fides-2.60.1rc0.dist-info → ethyca_fides-2.60.2b1.dist-info}/top_level.txt +0 -0
  220. /fides/ui-build/static/admin/_next/static/{pNwRIyc_W4mC7MPm4ebOC → 41G5DqvxaeevMKeDa2GHI}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-04-29T17:04:59-0400",
11
+ "date": "2025-05-05T14:14:41-0600",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "6329ae1259afa234d4bb308672fb20cf5295f9c6",
15
- "version": "2.60.1rc0"
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
- async def db_action(action: DBActions, revision: Optional[str] = "head") -> Dict:
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
- await migrate_db(database_url=CONFIG.database.sync_database_uri, revision=revision, downgrade=True) # type: ignore[arg-type]
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
- await configure_db(CONFIG.database.sync_database_uri, revision=revision)
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 get_api_session
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.database import configure_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
- await configure_db(
169
- CONFIG.database.sync_database_uri, samples=CONFIG.database.load_samples
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.ctl_session import async_session
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
- async def migrate_db(
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
- async def configure_db(
125
- database_url: str, samples: bool = False, revision: Optional[str] = "head"
126
- ) -> None:
127
- """Set up the db to be used by the app."""
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
- await migrate_db(database_url, samples=samples, revision=revision) # type: ignore[arg-type]
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 create_resource, get_resource, list_resource, upsert_resources
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
- with sync_session() as db_session: # type: ignore[attr-defined]
291
- client_id = get_client_id(db_session)
291
+ client_id = get_client_id(session)
292
292
 
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
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
- default_data_categories = get_user_data_categories()
301
+ default_data_categories = get_user_data_categories()
302
302
 
303
- log.debug(
304
- f"Preparing to create default rules for the following Data Categories: {default_data_categories} if they do not already exist"
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
- inserted = 0
325
- for org in organizations:
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.debug(f"INSERTED {inserted} organization resource(s)")
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
- async def load_default_resources(async_session: AsyncSession) -> None:
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
- await load_default_organization(async_session)
383
- await load_default_taxonomy(async_session)
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"""
@@ -7,4 +7,5 @@ class SystemType(Enum):
7
7
  email = "email"
8
8
  manual = "manual"
9
9
  saas = "saas"
10
+ system = "system"
10
11
  website = "website"
@@ -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