ethyca-fides 2.69.0rc1__py2.py3-none-any.whl → 2.69.0rc3__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.

Potentially problematic release.


This version of ethyca-fides might be problematic. Click here for more details.

Files changed (203) hide show
  1. {ethyca_fides-2.69.0rc1.dist-info → ethyca_fides-2.69.0rc3.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.0rc1.dist-info → ethyca_fides-2.69.0rc3.dist-info}/RECORD +201 -201
  3. fides/_version.py +3 -3
  4. fides/api/api/v1/endpoints/user_endpoints.py +0 -23
  5. fides/api/models/client.py +5 -9
  6. fides/api/models/fides_user.py +2 -1
  7. fides/api/oauth/utils.py +2 -21
  8. fides/api/schemas/saas/connector_template.py +5 -0
  9. fides/api/service/connectors/saas/connector_registry_service.py +7 -0
  10. fides/api/util/connection_type.py +3 -20
  11. fides/api/util/saas_util.py +12 -1
  12. fides/ui-build/static/admin/404.html +1 -1
  13. fides/ui-build/static/admin/_next/static/chunks/4121-bd6f467aacd80f91.js +1 -0
  14. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-36bec04369a1a7c4.js → _app-11b4a4ade9d6979e.js} +9 -9
  15. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-c9c1c02d7e68c4f8.js → privacy-requests-91f578139548652c.js} +1 -1
  16. fides/ui-build/static/admin/_next/static/psdvcOGkJ2TvIpb4oMjqu/_buildManifest.js +1 -0
  17. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  18. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  19. fides/ui-build/static/admin/add-systems.html +1 -1
  20. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  21. fides/ui-build/static/admin/consent/configure.html +1 -1
  22. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  23. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  24. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  25. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  26. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  27. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  28. fides/ui-build/static/admin/consent/properties.html +1 -1
  29. fides/ui-build/static/admin/consent/reporting.html +1 -1
  30. fides/ui-build/static/admin/consent.html +1 -1
  31. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  32. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  33. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  34. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  35. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  36. fides/ui-build/static/admin/data-catalog.html +1 -1
  37. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  38. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  39. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  40. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  41. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  42. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  43. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  44. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  45. fides/ui-build/static/admin/datamap.html +1 -1
  46. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  47. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  48. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  49. fides/ui-build/static/admin/dataset/new.html +1 -1
  50. fides/ui-build/static/admin/dataset.html +1 -1
  51. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  52. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  53. fides/ui-build/static/admin/datastore-connection.html +1 -1
  54. fides/ui-build/static/admin/index.html +1 -1
  55. fides/ui-build/static/admin/integrations/[id].html +1 -1
  56. fides/ui-build/static/admin/integrations.html +1 -1
  57. fides/ui-build/static/admin/login/[provider].html +1 -1
  58. fides/ui-build/static/admin/login.html +1 -1
  59. fides/ui-build/static/admin/messaging/[id].html +1 -1
  60. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  61. fides/ui-build/static/admin/messaging.html +1 -1
  62. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  63. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  64. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  65. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  66. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  67. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  68. fides/ui-build/static/admin/poc/forms.html +1 -1
  69. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  70. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  71. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  72. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  73. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  74. fides/ui-build/static/admin/privacy-requests.html +1 -1
  75. fides/ui-build/static/admin/properties/[id].html +1 -1
  76. fides/ui-build/static/admin/properties/add-property.html +1 -1
  77. fides/ui-build/static/admin/properties.html +1 -1
  78. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  79. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  80. fides/ui-build/static/admin/settings/about.html +1 -1
  81. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  82. fides/ui-build/static/admin/settings/consent.html +1 -1
  83. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  84. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  85. fides/ui-build/static/admin/settings/domains.html +1 -1
  86. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  87. fides/ui-build/static/admin/settings/locations.html +1 -1
  88. fides/ui-build/static/admin/settings/organization.html +1 -1
  89. fides/ui-build/static/admin/settings/regulations.html +1 -1
  90. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  91. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  92. fides/ui-build/static/admin/systems.html +1 -1
  93. fides/ui-build/static/admin/taxonomy.html +1 -1
  94. fides/ui-build/static/admin/user-management/new.html +1 -1
  95. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  96. fides/ui-build/static/admin/user-management.html +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/4121-b04a7859ee8f0b59.js +0 -1
  98. fides/ui-build/static/admin/_next/static/zEliM9juvmcu4yond1mtG/_buildManifest.js +0 -1
  99. {ethyca_fides-2.69.0rc1.dist-info → ethyca_fides-2.69.0rc3.dist-info}/WHEEL +0 -0
  100. {ethyca_fides-2.69.0rc1.dist-info → ethyca_fides-2.69.0rc3.dist-info}/entry_points.txt +0 -0
  101. {ethyca_fides-2.69.0rc1.dist-info → ethyca_fides-2.69.0rc3.dist-info}/licenses/LICENSE +0 -0
  102. {ethyca_fides-2.69.0rc1.dist-info → ethyca_fides-2.69.0rc3.dist-info}/top_level.txt +0 -0
  103. /fides/ui-build/static/admin/_next/static/chunks/{1099-db533dd22b80bca6.js → 1099-c34f76b4da5f3d15.js} +0 -0
  104. /fides/ui-build/static/admin/_next/static/chunks/{1345-6986414ab6ad3389.js → 1345-04e37a66c0d40dc1.js} +0 -0
  105. /fides/ui-build/static/admin/_next/static/chunks/{1817-fcb2fd28034d5070.js → 1817-e6934e258111a961.js} +0 -0
  106. /fides/ui-build/static/admin/_next/static/chunks/{2921-8a63ec72fa8e1bc0.js → 2921-0696287bb8de1f0b.js} +0 -0
  107. /fides/ui-build/static/admin/_next/static/chunks/{3620-1fba74849114e70f.js → 3620-8c0ee3d0b19c342d.js} +0 -0
  108. /fides/ui-build/static/admin/_next/static/chunks/{3729-79255d8b0d22922d.js → 3729-f5f2976904dce90d.js} +0 -0
  109. /fides/ui-build/static/admin/_next/static/chunks/{3847-a868f83c065f54fb.js → 3847-2c0126e6eb54c526.js} +0 -0
  110. /fides/ui-build/static/admin/_next/static/chunks/{3855-3154d56888ac46ed.js → 3855-9dd54ded74f4036b.js} +0 -0
  111. /fides/ui-build/static/admin/_next/static/chunks/{3872-25eec062abd0f847.js → 3872-72ea3eb040366277.js} +0 -0
  112. /fides/ui-build/static/admin/_next/static/chunks/{3923-3be9b867f33e524c.js → 3923-c4f2b03706ddbe39.js} +0 -0
  113. /fides/ui-build/static/admin/_next/static/chunks/{401-029e2ff644cae40c.js → 401-959a15ed18a8abdf.js} +0 -0
  114. /fides/ui-build/static/admin/_next/static/chunks/{4608-99e453c666a7b89a.js → 4608-d101417a3abb4ad6.js} +0 -0
  115. /fides/ui-build/static/admin/_next/static/chunks/{4786-289c505d7d835feb.js → 4786-7aafb744445445b2.js} +0 -0
  116. /fides/ui-build/static/admin/_next/static/chunks/{4808-5b799757d4564807.js → 4808-357ca7ea7bbd24c6.js} +0 -0
  117. /fides/ui-build/static/admin/_next/static/chunks/{4844-a1784e2823ccd0ee.js → 4844-707b20a6c4b127cc.js} +0 -0
  118. /fides/ui-build/static/admin/_next/static/chunks/{5258-45ec38e6c3780f24.js → 5258-7c8d2dcc71b9f51d.js} +0 -0
  119. /fides/ui-build/static/admin/_next/static/chunks/{5487-aad0e8a240a1979b.js → 5487-fd9724519f31caff.js} +0 -0
  120. /fides/ui-build/static/admin/_next/static/chunks/{549-81279a1a816487a7.js → 549-d3bef0990071230c.js} +0 -0
  121. /fides/ui-build/static/admin/_next/static/chunks/{6084-3379ca3c1fc77aa9.js → 6084-487d27d017c45e05.js} +0 -0
  122. /fides/ui-build/static/admin/_next/static/chunks/{6853-04b15a7b02b1fc19.js → 6853-f7ab74e30abbdeaf.js} +0 -0
  123. /fides/ui-build/static/admin/_next/static/chunks/{6954-0f5d6c1757013eb7.js → 6954-b0a7b8ac6db238f8.js} +0 -0
  124. /fides/ui-build/static/admin/_next/static/chunks/{7476-2227e21f574bee70.js → 7476-9a57db910472b48e.js} +0 -0
  125. /fides/ui-build/static/admin/_next/static/chunks/{7630-267de03b93bbae8d.js → 7630-46807321449479c7.js} +0 -0
  126. /fides/ui-build/static/admin/_next/static/chunks/{768-24269f30db223720.js → 768-7eac4b30d7477b0a.js} +0 -0
  127. /fides/ui-build/static/admin/_next/static/chunks/{787-0aa4d9802c976f92.js → 787-79e8e558bd80ece6.js} +0 -0
  128. /fides/ui-build/static/admin/_next/static/chunks/{79-0102f2711b8455cd.js → 79-3e5047415bee9391.js} +0 -0
  129. /fides/ui-build/static/admin/_next/static/chunks/{796-53f0ea567d1da2b9.js → 796-fb2af44165f37ecc.js} +0 -0
  130. /fides/ui-build/static/admin/_next/static/chunks/{8002-98ecd56535cdefa3.js → 8002-c1f66179adabece8.js} +0 -0
  131. /fides/ui-build/static/admin/_next/static/chunks/{9046-a349c22448593f94.js → 9046-058a4d8f0b5e08f9.js} +0 -0
  132. /fides/ui-build/static/admin/_next/static/chunks/{9826-f4755a75d00c1c8c.js → 9826-0d9a7f61c08ed88a.js} +0 -0
  133. /fides/ui-build/static/admin/_next/static/chunks/{9951-07989276d153c848.js → 9951-b954027a046ce553.js} +0 -0
  134. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-fde1f56225d1ef4f.js → 404-9c9efb820bb6b432.js} +0 -0
  135. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-aff671eda846719f.js → manual-20253dd047fb9736.js} +0 -0
  136. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-04894ddffc2a66fc.js → multiple-caadc3c0e86a7bfe.js} +0 -0
  137. /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-e98c4154535bf37d.js → add-systems-169099ff7b305cf5.js} +0 -0
  138. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-b2f80cdb75183bfa.js → add-vendors-acefb9e08c6c4082.js} +0 -0
  139. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-207cabf1b5c453fc.js → configure-558fbb1667473abb.js} +0 -0
  140. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-b3db5610ae7e94fb.js → [id]-b1ff1c9683841815.js} +0 -0
  141. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-3009481bdd479fd7.js → privacy-experience-674906d2d9a0a3a6.js} +0 -0
  142. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-72e3cd6740c5c5de.js → [id]-5b7aa7971f070513.js} +0 -0
  143. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2aa4d13fb26b59ca.js → new-285958a12a66575e.js} +0 -0
  144. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-6b0885a8c871804f.js → privacy-notices-dc56bbdb6dd7a670.js} +0 -0
  145. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-20bc3cf67727dfd3.js → properties-0843757f00eeaaec.js} +0 -0
  146. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-77b491108663a2de.js → reporting-60e3394c887f3d5e.js} +0 -0
  147. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-b3c8efbd960f4e34.js → consent-5cba58ebecb4511f.js} +0 -0
  148. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-fe5f6fb33e34baa7.js → [projectUrn]-0f90cac9f190130c.js} +0 -0
  149. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-3584c90cf3670146.js → projects-f9117645c941342c.js} +0 -0
  150. /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-a6cecf48e4e27645.js → data-catalog-c566640eecc6f3fe.js} +0 -0
  151. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-844abdb5ea7d78af.js → [systemId]-cfb0b1200bc1a2c9.js} +0 -0
  152. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-215d6e2fefc9a5e1.js → [monitorId]-fed8b879c13c2bf3.js} +0 -0
  153. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-7721508cc2a9ab3a.js → action-center-991659e916ad60b1.js} +0 -0
  154. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-6169e49c3787a9bf.js → activity-58a110542d6bcd0f.js} +0 -0
  155. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-e17dd4ffcaa4836d.js → datamap-60e27b673c68bd27.js} +0 -0
  156. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-4af946dc8c6c967f.js → [...subfieldNames]-3f4ba87513e030a2.js} +0 -0
  157. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-a65a8ea3872800e7.js → [collectionName]-a6cd31103deba465.js} +0 -0
  158. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-ccc844caef652a7e.js → [datasetId]-491d2c8dd559d0cb.js} +0 -0
  159. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-3b65c6e9af65ea2e.js → new-2c7b1213b6604d30.js} +0 -0
  160. /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-0566189a0236078d.js → dataset-c8bcd568d3b0ee7f.js} +0 -0
  161. /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-38a7b8826e0abb01.js → [id]-7ed3f05700dc397b.js} +0 -0
  162. /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-c8d2599814eefd35.js → new-95f6d64f84fc6bf3.js} +0 -0
  163. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-00ba79f6b47bd161.js → datastore-connection-9a33a412a5f36960.js} +0 -0
  164. /fides/ui-build/static/admin/_next/static/chunks/pages/{index-053db342725dc127.js → index-1299410f671fac23.js} +0 -0
  165. /fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-3db44d6839e8dbd9.js → [id]-3d24c1510aa4c555.js} +0 -0
  166. /fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-5f34de3c24e67368.js → integrations-0f12d5b658c98c9f.js} +0 -0
  167. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-707b72e959233112.js → [id]-ba232c4b17576ccb.js} +0 -0
  168. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-c68b413f3c9cf318.js → add-template-b97883026fbc5b1e.js} +0 -0
  169. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-d95588f3ef137030.js → messaging-38189c1058aa4acf.js} +0 -0
  170. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-36cac6f4379587ea.js → ant-components-3119bdb3811409bf.js} +0 -0
  171. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-d44606c0cf203b47.js → AntForm-8f9d0434dc3eb8cf.js} +0 -0
  172. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-341b571fd8da4142.js → FormikAntFormItem-a14e51c7f22f3395.js} +0 -0
  173. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-2e99b5eb12982aeb.js → FormikControlled-a40645b57822684d.js} +0 -0
  174. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-c7d62113680196dd.js → FormikField-c55df6527b700701.js} +0 -0
  175. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-89a24591c3d9e7a8.js → forms-292d761616b162a0.js} +0 -0
  176. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-c54bcfb6b0de8a71.js → table-migration-135bcf384b81820a.js} +0 -0
  177. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-71b89f125d817d47.js → [id]-b379873a5771e55b.js} +0 -0
  178. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-4c8e1a7e407d3c7f.js → messaging-a9bb257906dcd7e0.js} +0 -0
  179. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-faf42d1a9cd6a861.js → storage-de0036c74b78e9b7.js} +0 -0
  180. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-3823ee301161be4f.js → configure-70efccbe0732786b.js} +0 -0
  181. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-8973618b9ba28a50.js → [id]-63c6f0193634add5.js} +0 -0
  182. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-b449da44de56fd3f.js → add-property-e76567f0374d5912.js} +0 -0
  183. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-5bb059b7057b5583.js → properties-2050b7dac0413c11.js} +0 -0
  184. /fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6b26740aeb247bc8.js → datamap-83019a6753e14857.js} +0 -0
  185. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-98c1492dca52f4f8.js → alpha-913f8eab62460f31.js} +0 -0
  186. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-d176ec152b70f82d.js → about-2ed1ee6017c0656a.js} +0 -0
  187. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-ea5077aca3d01dfb.js → [purpose_id]-bffd6292e7e0302a.js} +0 -0
  188. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-68b812269e38c8c3.js → consent-e5331508e81222fc.js} +0 -0
  189. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-79cdee37ceb8665f.js → custom-fields-74f0fe9656f4a1f6.js} +0 -0
  190. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-056f36a8a0509006.js → domain-records-a649ca07ce51b0fe.js} +0 -0
  191. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-fea15607939cab70.js → domains-eb675ba600cea2a8.js} +0 -0
  192. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-cce73ddc0012b089.js → email-templates-4db2f42f90867890.js} +0 -0
  193. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-8b0a408ed7e3ff28.js → locations-89b404989b4ea21c.js} +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-a01838a53677d69e.js → organization-eb1ecff37fd85c72.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-43e9cafaeb869069.js → regulations-07d883b5aaec58f2.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-ea1e2483ddf6af6c.js → test-datasets-61ecb7546830c345.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-7856e694b009ded3.js → [id]-e91da49c0681a300.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/pages/{systems-2c6dca19bf0a4f0c.js → systems-44d714017dd87e62.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-ede8ddce10d7d055.js → taxonomy-78c3a5200d362cff.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-af9bf43612c9676c.js → [id]-4f9001870e2b3aff.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-3b7fea8781dc18b5.js → user-management-583a7f0c1bead240.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/{webpack-aa7ff73977a15cb3.js → webpack-b5eb3e1da37616d2.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/{zEliM9juvmcu4yond1mtG → psdvcOGkJ2TvIpb4oMjqu}/_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-08-28T18:28:20-0700",
11
+ "date": "2025-08-29T09:53:24-0700",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "af95d4c10df1e7d85a73f90bdd397b8b92c9096e",
15
- "version": "2.69.0rc1"
14
+ "full-revisionid": "f143c508f26aa8241e7b79378e76ca087c9e8487",
15
+ "version": "2.69.0rc3"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -208,17 +208,6 @@ def update_user_password(
208
208
 
209
209
  current_user.update_password(db=db, new_password=data.new_password)
210
210
 
211
- # Delete the user's associated OAuth client to invalidate all existing sessions
212
- if current_user.client:
213
- try:
214
- current_user.client.delete(db)
215
- except Exception as exc:
216
- logger.exception(
217
- "Unable to delete user client during password reset for user {}: {}",
218
- current_user.id,
219
- exc,
220
- )
221
-
222
211
  logger.info("Updated user with id: '{}'.", current_user.id)
223
212
  return current_user
224
213
 
@@ -247,18 +236,6 @@ def force_update_password(
247
236
  )
248
237
 
249
238
  user.update_password(db=db, new_password=data.new_password)
250
-
251
- # Delete the user's associated OAuth client to invalidate all existing sessions
252
- if user.client:
253
- try:
254
- user.client.delete(db)
255
- except Exception as exc:
256
- logger.exception(
257
- "Unable to delete user client during admin-forced password reset for user {}: {}",
258
- user.id,
259
- exc,
260
- )
261
-
262
239
  logger.info("Updated user with id: '{}'.", user.id)
263
240
  return user
264
241
 
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  from datetime import datetime
5
- from typing import TYPE_CHECKING, Any, Optional
5
+ from typing import Any, Optional
6
6
 
7
7
  from sqlalchemy import ARRAY, Column, ForeignKey, String
8
8
  from sqlalchemy.ext.declarative import declared_attr
@@ -22,12 +22,10 @@ from fides.api.cryptography.schemas.jwt import (
22
22
  JWE_PAYLOAD_SYSTEMS,
23
23
  )
24
24
  from fides.api.db.base_class import Base
25
+ from fides.api.models.fides_user import FidesUser
25
26
  from fides.api.oauth.jwt import generate_jwe
26
27
  from fides.config import FidesConfig
27
28
 
28
- if TYPE_CHECKING:
29
- from fides.api.models.fides_user import FidesUser
30
-
31
29
  DEFAULT_SCOPES: list[str] = []
32
30
  DEFAULT_ROLES: list[str] = []
33
31
  DEFAULT_SYSTEMS: list[str] = []
@@ -50,11 +48,9 @@ class ClientDetail(Base):
50
48
  ARRAY(String), nullable=False, server_default="{}", default=dict
51
49
  )
52
50
  fides_key = Column(String, index=True, unique=True, nullable=True)
53
- user_id = Column(String, ForeignKey("fidesuser.id"), nullable=True, unique=True)
54
-
55
- if TYPE_CHECKING:
56
- # Explicitly annotate the backref relationship for mypy
57
- user: Optional["FidesUser"]
51
+ user_id = Column(
52
+ String, ForeignKey(FidesUser.id_field_path), nullable=True, unique=True
53
+ )
58
54
 
59
55
  @classmethod
60
56
  def create_client_and_secret(
@@ -22,7 +22,7 @@ from fides.api.cryptography.cryptographic_util import (
22
22
  from fides.api.db.base_class import Base
23
23
  from fides.api.models.audit_log import AuditLog
24
24
 
25
- # SystemManager import is handled in base.py to avoid circular imports
25
+ # Intentionally importing SystemManager here to build the FidesUser.systems relationship
26
26
  from fides.api.schemas.user import DisabledReason
27
27
  from fides.config import CONFIG
28
28
 
@@ -32,6 +32,7 @@ if TYPE_CHECKING:
32
32
  FidesUserRespondentEmailVerification,
33
33
  )
34
34
  from fides.api.models.sql_models import System # type: ignore[attr-defined]
35
+ from fides.api.models.system_manager import SystemManager
35
36
 
36
37
 
37
38
  class FidesUser(Base):
fides/api/oauth/utils.py CHANGED
@@ -222,9 +222,7 @@ async def get_current_user(
222
222
  created_at=datetime.utcnow(),
223
223
  )
224
224
 
225
- if client.user is None:
226
- raise AuthorizationError(detail="Client has no associated user")
227
- return client.user
225
+ return client.user # type: ignore[attr-defined]
228
226
 
229
227
 
230
228
  def verify_callback_oauth_policy_pre_webhook(
@@ -369,10 +367,8 @@ def extract_token_and_load_client(
369
367
  logger.debug("Auth token expired.")
370
368
  raise AuthorizationError(detail="Not Authorized for this action")
371
369
 
372
- issued_at_dt = datetime.fromisoformat(issued_at)
373
-
374
370
  if is_token_expired(
375
- issued_at_dt,
371
+ datetime.fromisoformat(issued_at),
376
372
  token_duration_override or CONFIG.security.oauth_access_token_expire_minutes,
377
373
  ):
378
374
  raise AuthorizationError(detail="Not Authorized for this action")
@@ -395,21 +391,6 @@ def extract_token_and_load_client(
395
391
  logger.debug("Auth token belongs to an invalid client_id.")
396
392
  raise AuthorizationError(detail="Not Authorized for this action")
397
393
 
398
- # Invalidate tokens issued prior to the user's most recent password reset.
399
- # This ensures any existing sessions are expired immediately after a password change.
400
- try:
401
- if client.user is not None and client.user.password_reset_at is not None:
402
- password_reset_at = client.user.password_reset_at
403
- if password_reset_at and issued_at_dt < password_reset_at:
404
- logger.debug("Auth token issued before latest password reset.")
405
- raise AuthorizationError(detail="Not Authorized for this action")
406
- except (
407
- Exception
408
- ) as exc: # pragma: no cover - defensive: never block auth on relationship issues
409
- logger.exception(
410
- "Unable to evaluate password reset timestamp for client user: {}", exc
411
- )
412
-
413
394
  # Populate request-scoped context with the authenticated user identifier.
414
395
  # Prefer the linked user_id; fall back to the client id when this is the
415
396
  # special root client (which has no associated FidesUser row).
@@ -4,6 +4,8 @@ from fideslang.models import Dataset
4
4
  from pydantic import BaseModel, field_validator
5
5
 
6
6
  from fides.api.models.datasetconfig import validate_masking_strategy_override
7
+ from fides.api.schemas.enums.connection_category import ConnectionCategory
8
+ from fides.api.schemas.enums.integration_feature import IntegrationFeature
7
9
  from fides.api.schemas.policy import ActionType
8
10
  from fides.api.schemas.saas.saas_config import SaaSConfig
9
11
  from fides.api.util.saas_util import load_config_from_string, load_dataset_from_string
@@ -22,6 +24,9 @@ class ConnectorTemplate(BaseModel):
22
24
  authorization_required: bool
23
25
  user_guide: Optional[str] = None
24
26
  supported_actions: List[ActionType]
27
+ category: Optional[ConnectionCategory] = None
28
+ tags: Optional[List[str]] = None
29
+ enabled_features: Optional[List[IntegrationFeature]] = None
25
30
 
26
31
  @field_validator("config")
27
32
  @classmethod
@@ -26,6 +26,7 @@ from fides.api.service.authentication.authentication_strategy_oauth2_authorizati
26
26
  )
27
27
  from fides.api.util.saas_util import (
28
28
  encode_file_contents,
29
+ extract_display_info_from_config,
29
30
  load_config,
30
31
  load_config_from_string,
31
32
  load_dataset_from_string,
@@ -78,6 +79,8 @@ class FileConnectorTemplateLoader(ConnectorTemplateLoader):
78
79
  == OAuth2AuthorizationCodeAuthenticationStrategy.name
79
80
  )
80
81
 
82
+ display_info = extract_display_info_from_config(config)
83
+
81
84
  try:
82
85
  icon = encode_file_contents(f"data/saas/icon/{connector_type}.svg")
83
86
  except FileNotFoundError:
@@ -100,6 +103,7 @@ class FileConnectorTemplateLoader(ConnectorTemplateLoader):
100
103
  authorization_required=authorization_required,
101
104
  user_guide=config.user_guide,
102
105
  supported_actions=config.supported_actions,
106
+ **display_info,
103
107
  )
104
108
  except Exception:
105
109
  logger.exception("Unable to load {} connector", connector_type)
@@ -165,6 +169,8 @@ class CustomConnectorTemplateLoader(ConnectorTemplateLoader):
165
169
  == OAuth2AuthorizationCodeAuthenticationStrategy.name
166
170
  )
167
171
 
172
+ display_info = extract_display_info_from_config(config)
173
+
168
174
  connector_template = ConnectorTemplate(
169
175
  config=template.config,
170
176
  dataset=template.dataset,
@@ -173,6 +179,7 @@ class CustomConnectorTemplateLoader(ConnectorTemplateLoader):
173
179
  authorization_required=authorization_required,
174
180
  user_guide=config.user_guide,
175
181
  supported_actions=config.supported_actions,
182
+ **display_info,
176
183
  )
177
184
 
178
185
  # register the template in the loader's template dictionary
@@ -230,23 +230,6 @@ def get_saas_connection_types(
230
230
  for item in saas_types:
231
231
  connector_template = ConnectorRegistry.get_connector_template(item)
232
232
  if connector_template is not None:
233
- # Read display info from SAAS config if available
234
- category = None
235
- tags = None
236
- enabled_features = None
237
-
238
- try:
239
- saas_config = SaaSConfig(
240
- **load_config_from_string(connector_template.config)
241
- )
242
- if saas_config.display_info:
243
- category = saas_config.display_info.category
244
- tags = saas_config.display_info.tags
245
- enabled_features = saas_config.display_info.enabled_features
246
- except Exception:
247
- # If config parsing fails, leave display info as None
248
- pass
249
-
250
233
  saas_connection_types.append(
251
234
  ConnectionSystemTypeMap(
252
235
  identifier=item,
@@ -256,9 +239,9 @@ def get_saas_connection_types(
256
239
  authorization_required=connector_template.authorization_required,
257
240
  user_guide=connector_template.user_guide,
258
241
  supported_actions=connector_template.supported_actions,
259
- category=category,
260
- tags=tags,
261
- enabled_features=enabled_features,
242
+ category=connector_template.category,
243
+ tags=connector_template.tags,
244
+ enabled_features=connector_template.enabled_features,
262
245
  )
263
246
  )
264
247
 
@@ -16,7 +16,7 @@ from fides.api.common_exceptions import FidesopsException, ValidationError
16
16
  from fides.api.cryptography.cryptographic_util import bytes_to_b64_str
17
17
  from fides.api.graph.config import Collection, CollectionAddress, Field, GraphDataset
18
18
  from fides.api.models.privacy_request import PrivacyRequest
19
- from fides.api.schemas.saas.saas_config import SaaSRequest
19
+ from fides.api.schemas.saas.saas_config import SaaSConfig, SaaSRequest
20
20
  from fides.api.schemas.saas.shared_schemas import SaaSRequestParams
21
21
  from fides.config import CONFIG
22
22
  from fides.config.helpers import load_file
@@ -126,6 +126,17 @@ def replace_dataset_placeholders(
126
126
  return load_dataset_from_string(yaml_str)
127
127
 
128
128
 
129
+ def extract_display_info_from_config(config: SaaSConfig) -> Dict[str, Any]:
130
+ """Extract display info fields from SaaSConfig for caching in ConnectorTemplate."""
131
+ return {
132
+ "category": config.display_info.category if config.display_info else None,
133
+ "tags": config.display_info.tags if config.display_info else None,
134
+ "enabled_features": (
135
+ config.display_info.enabled_features if config.display_info else None
136
+ ),
137
+ }
138
+
139
+
129
140
  def load_dataset_with_replacement(
130
141
  filename: str, string_to_replace: str, replacement: str
131
142
  ) -> Dict:
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/abf2e162b1cd0e61.css" as="style"/><link rel="stylesheet" href="/_next/static/css/abf2e162b1cd0e61.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-aa7ff73977a15cb3.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-36bec04369a1a7c4.js" defer=""></script><script src="/_next/static/chunks/pages/404-fde1f56225d1ef4f.js" defer=""></script><script src="/_next/static/zEliM9juvmcu4yond1mtG/_buildManifest.js" defer=""></script><script src="/_next/static/zEliM9juvmcu4yond1mtG/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"zEliM9juvmcu4yond1mtG","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/abf2e162b1cd0e61.css" as="style"/><link rel="stylesheet" href="/_next/static/css/abf2e162b1cd0e61.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-b5eb3e1da37616d2.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-11b4a4ade9d6979e.js" defer=""></script><script src="/_next/static/chunks/pages/404-9c9efb820bb6b432.js" defer=""></script><script src="/_next/static/psdvcOGkJ2TvIpb4oMjqu/_buildManifest.js" defer=""></script><script src="/_next/static/psdvcOGkJ2TvIpb4oMjqu/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"psdvcOGkJ2TvIpb4oMjqu","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4121],{44121:function(e,s,a){a.d(s,{Z:function(){return Q}});var t=a(24246),n=a(96306),i=a(91437),l=()=>(0,t.jsxs)(n.xuv,{children:[(0,t.jsx)(n.xuv,{pb:4,fontSize:"18px",fontWeight:"semibold",children:"Role Description"}),(0,t.jsx)(n.gCW,{spacing:4,children:i.K.map(e=>(0,t.jsxs)(n.xuv,{width:"100%",padding:4,borderRadius:"md",backgroundColor:"gray.75",fontSize:"14px",children:[(0,t.jsx)(n.xuv,{fontWeight:"semibold",children:e.label}),(0,t.jsx)(n.xuv,{color:"gray.700",children:e.description})]},e.roleKey))})]}),r=a(16134),d=a(54682),o=a(19904),c=a(34090),h=a(86677),m=a(27378),p=a(812),u=a(46238),x=a(58452),j=a(77830),w=a(46628),g=a(26917),b=a(1315),f=a(95492),y=a(65497);let v=e=>{let{assignedSystems:s,onAssignedSystemChange:a}=e,i=(0,r.C)(y.Ux);if((0,y.d6)(i,{skip:!i}),0===s.length)return null;let l=e=>{a(s.filter(s=>s.fides_key!==e.fides_key))};return(0,t.jsxs)(n.iA_,{size:"sm","data-testid":"assign-systems-delete-table",children:[(0,t.jsx)(n.hrZ,{children:(0,t.jsxs)(n.Tr,{children:[(0,t.jsx)(n.Th,{children:"System"}),(0,t.jsx)(n.Th,{})]})}),(0,t.jsx)(n.p3B,{children:s.map(e=>(0,t.jsxs)(n.Tr,{_hover:{bg:"gray.50"},"data-testid":"row-".concat(e.fides_key),children:[(0,t.jsx)(n.Td,{children:e.name}),(0,t.jsx)(n.Td,{textAlign:"end",children:(0,t.jsx)(n.wpx,{"aria-label":"Unassign system from user",icon:(0,t.jsx)(f.l,{}),onClick:()=>l(e),"data-testid":"unassign-btn"})})]},e.fides_key))})]})};var _=e=>{let{allSystems:s,assignedSystems:a,onChange:i}=e,l=e=>{a.find(s=>s.fides_key===e.fides_key)?i(a.filter(s=>s.fides_key!==e.fides_key)):i([...a,e])};return(0,t.jsx)(n.xuv,{overflowY:"auto",maxHeight:"300px",children:(0,t.jsxs)(n.iA_,{size:"sm","data-testid":"assign-systems-table",maxHeight:"50vh",overflowY:"scroll",children:[(0,t.jsx)(n.hrZ,{position:"sticky",top:0,background:"white",zIndex:1,children:(0,t.jsxs)(n.Tr,{children:[(0,t.jsx)(n.Th,{children:"System"}),(0,t.jsx)(n.Th,{children:"Assign"})]})}),(0,t.jsx)(n.p3B,{children:s.map(e=>{let s=!!a.find(s=>s.fides_key===e.fides_key);return(0,t.jsxs)(n.Tr,{_hover:{bg:"gray.50"},"data-testid":"row-".concat(e.fides_key),children:[(0,t.jsx)(n.Td,{children:e.name}),(0,t.jsx)(n.Td,{children:(0,t.jsx)(n.rAg,{checked:s,onChange:()=>l(e),"data-testid":"assign-switch"})})]},e.fides_key)})})]})})};let C=(e,s)=>{var a,t;return(null===(a=e.name)||void 0===a?void 0:a.toLocaleLowerCase().includes(s.toLocaleLowerCase()))||(null===(t=e.description)||void 0===t?void 0:t.toLocaleLowerCase().includes(s.toLocaleLowerCase()))};var S=e=>{let{isOpen:s,onClose:a,assignedSystems:i,onAssignedSystemChange:l}=e,{data:r}=(0,b.K3)(),[d,o]=(0,m.useState)(""),[c,h]=(0,m.useState)(i),p=async()=>{l(c),a()},u=!r||0===r.length,x=(0,m.useMemo)(()=>r?r.filter(e=>C(e,d)):[],[r,d]),j=(0,m.useMemo)(()=>{let e=new Set(c.map(e=>e.fides_key));return x.every(s=>e.has(s.fides_key))},[x,c]);return(0,t.jsxs)(n.u_l,{isOpen:s,onClose:a,size:"2xl",children:[(0,t.jsx)(n.ZAr,{}),(0,t.jsxs)(n.hzk,{p:8,"data-testid":"confirmation-modal",children:[(0,t.jsxs)(n.xBx,{fontWeight:"medium",display:"flex",justifyContent:"space-between",alignItems:"center",children:[(0,t.jsx)(n.xvT,{children:"Assign systems"}),(0,t.jsxs)(n.j8w,{color:"success",children:["Assigned to ",i.length," systems"]})]}),(0,t.jsx)(n.fef,{"data-testid":"assign-systems-modal-body",children:u?(0,t.jsx)(n.xvT,{children:"No systems found"}):(0,t.jsxs)(n.Kqy,{spacing:4,children:[(0,t.jsxs)(n.kCb,{justifyContent:"space-between",children:[(0,t.jsx)(n.xvT,{fontSize:"sm",flexGrow:1,fontWeight:"medium",children:"Assign systems in your organization to this user"}),(0,t.jsx)(n.xuv,{children:(0,t.jsxs)(n.NIc,{display:"flex",alignItems:"center",children:[(0,t.jsx)(n.lXp,{fontSize:"sm",htmlFor:"assign-all-systems",mb:"0",children:"Assign all systems"}),(0,t.jsx)(n.rAg,{size:"small",id:"assign-all-systems",checked:j,onChange:e=>{e&&r?h(x):h(r?r.filter(e=>!x.includes(e)):[])},"data-testid":"assign-all-systems-toggle"})]})})]}),(0,t.jsx)(g.Z,{value:d,onChange:o,placeholder:"Search for systems","data-testid":"system-search",withIcon:!0}),(0,t.jsx)(_,{allSystems:x,assignedSystems:c,onChange:h})]})}),(0,t.jsx)(n.mzw,{justifyContent:"flex-start",children:(0,t.jsxs)("div",{children:[(0,t.jsx)(n.wpx,{onClick:a,className:"mr-2","data-testid":"cancel-btn",children:"Cancel"}),u?null:(0,t.jsx)(n.wpx,{type:"primary",onClick:p,"data-testid":"confirm-btn",children:"Confirm"})]})})]})]})},k=e=>{let{label:s,roleKey:a,isSelected:i,isDisabled:l,assignedSystems:r,onAssignedSystemChange:o}=e,{setFieldValue:h}=(0,c.u6)(),m=(0,n.qY0)(),p=l?"You do not have sufficient permissions to assign this role.":void 0;return i?(0,t.jsxs)(n.Kqy,{borderRadius:"md",border:"1px solid",borderColor:"gray.200",p:4,backgroundColor:"gray.50","aria-selected":"true",spacing:4,"data-testid":"selected",children:[(0,t.jsxs)(n.kCb,{alignItems:"center",justifyContent:"space-between",children:[(0,t.jsx)(n.xvT,{fontSize:"md",fontWeight:"semibold",children:s}),(0,t.jsx)(n.StI,{})]}),a!==d.A7.APPROVER&&a!==d.A7.RESPONDENT&&a!==d.A7.EXTERNAL_RESPONDENT?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.kCb,{alignItems:"center",children:[(0,t.jsx)(n.xvT,{fontSize:"sm",fontWeight:"semibold",mr:1,children:"Assigned systems"}),(0,t.jsx)(u.b,{label:"Assigned systems refer to those systems that have been specifically allocated to a user for management purposes. Users assigned to a system possess full edit permissions and are listed as the Data Steward for the respective system."})]}),(0,t.jsx)(n.wpx,{disabled:l,title:p,type:"primary",size:"small",onClick:m.onOpen,"data-testid":"assign-systems-btn",children:"Assign systems +"}),(0,t.jsx)(v,{assignedSystems:r,onAssignedSystemChange:o}),m.isOpen?(0,t.jsx)(S,{isOpen:m.isOpen,onClose:m.onClose,assignedSystems:r,onAssignedSystemChange:o}):null]}):null]}):(0,t.jsx)(n.wpx,{onClick:()=>{h("roles",[a])},"data-testid":"role-option-".concat(s),title:p,disabled:l,children:s})};let E={roles:[]};var A=()=>{var e,s;let a=(0,n.pmc)(),l=(0,h.useRouter)(),g=(0,r.C)(y.Ux);(0,y.d6)(g,{skip:!g});let{isOpen:b,onOpen:f,onClose:v}=(0,n.qY0)(),_=(0,r.C)(y.R$),[C,S]=(0,m.useState)(_),[A]=(0,y.G$)();(0,m.useEffect)(()=>{S(_)},[_]);let{data:T,isLoading:P}=(0,y.gU)(null!=g?g:"",{skip:!g}),[R]=(0,y.lD)(),N=!!(null==T?void 0:null===(e=T.roles)||void 0===e?void 0:e.includes(d.A7.EXTERNAL_RESPONDENT)),O=async e=>{if(b&&v(),!g)return;let s=e.roles.includes(d.A7.APPROVER),t=await R({user_id:g,payload:{roles:e.roles}});if((0,p.D4)(t)){a((0,w.Vo)((0,p.e$)(t.error)));return}if(!s){let e=C.map(e=>e.fides_key),s=await A({userId:g,fidesKeys:e});if((0,p.D4)(s)){a((0,w.Vo)((0,p.e$)(s.error)));return}}a((0,w.t5)("Permissions updated"))},I=async e=>{g&&(C.length>0&&e.roles.includes(d.A7.APPROVER)?f():await O(e))},z=(0,o.Tg)([d.Sh.USER_PERMISSION_ASSIGN_OWNERS]);if(!g)return null;if(P)return(0,t.jsx)(n.$jN,{});if(!z&&(null==T?void 0:null===(s=T.roles)||void 0===s?void 0:s.includes(d.A7.OWNER)))return(0,t.jsx)(n.xvT,{"data-testid":"insufficient-access",children:"You do not have sufficient access to change this user's permissions."});let q=(null==T?void 0:T.roles)?{roles:T.roles}:E,U=i.K.filter(e=>N?e.roleKey===d.A7.EXTERNAL_RESPONDENT:e.roleKey!==d.A7.EXTERNAL_RESPONDENT),D=N?"External respondent role cannot be changed":void 0;return(0,t.jsx)(c.J9,{onSubmit:I,initialValues:q,enableReinitialize:!0,children:e=>{let{values:s,isSubmitting:a,dirty:i}=e;return(0,t.jsxs)(c.l0,{children:[(0,t.jsxs)(n.Kqy,{spacing:7,children:[(0,t.jsxs)(n.Kqy,{spacing:3,"data-testid":"role-options",children:[(0,t.jsxs)(n.kCb,{alignItems:"center",children:[(0,t.jsx)(n.xvT,{fontSize:"sm",fontWeight:"semibold",mr:1,children:"User role"}),(0,t.jsx)(u.b,{label:"A user's role in the organization determines what parts of the UI they can access and which functions are available to them."})]}),U.map(e=>{let a=s.roles.indexOf(e.roleKey)>=0,n=e.roleKey===d.A7.OWNER?!z:N;return(0,t.jsx)(k,{isSelected:a,isDisabled:n,assignedSystems:C,onAssignedSystemChange:S,...e},e.roleKey)}),!N&&(0,t.jsx)(n.esZ,{title:"To invite a new External respondent user, create a manual task integration and then click on the 'Manage secure access' button",children:(0,t.jsx)(n.wpx,{disabled:!0,"data-testid":"role-option-External respondent",children:"External respondent"})})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)(n.wpx,{onClick:()=>l.push(j.e3),children:"Cancel"}),(0,t.jsx)(n.esZ,{title:D,children:(0,t.jsx)(n.wpx,{className:"ml-2",type:"primary",htmlType:"submit",loading:a,disabled:!i&&C===_||N,"data-testid":"save-btn",children:"Save"})})]})]}),(0,t.jsx)(x.Z,{isOpen:b,onClose:v,onConfirm:()=>O(s),title:"Change role to Approver",testId:"downgrade-to-approver-confirmation-modal",continueButtonText:"Yes",message:(0,t.jsx)(n.xvT,{children:"Switching to an approver role will remove all assigned systems. Do you wish to proceed?"})})]})}})},T=a(61038),P=a(55484),R=a(25980),N=a(40324),O=a(96006),I=a(7426);let{useGetEmailInviteStatusQuery:z}=a(78780).u.injectEndpoints({endpoints:e=>({getEmailInviteStatus:e.query({query:()=>({url:"/messaging/email-invite/status"}),providesTags:()=>["Email Invite Status"]})})});var q=a(76174),U=a(91317),D=a(31883);let Z=P.Ry().shape({password:O.a.label("Password"),passwordConfirmation:P.Z_().required().oneOf([P.iH("password")],"Passwords must match").label("Password confirmation")}),W={password:"",passwordConfirmation:""},K=e=>{let s=(0,n.qY0)(),a=(0,n.pmc)(),[t]=(0,y.ls)(),i=async n=>{let i=await t({id:e,new_password:n.password});(0,D.D4)(i)?a((0,w.Vo)((0,p.e$)(i.error))):(a((0,w.t5)("Successfully reset user's password. Please inform the user of their new password.")),s.onClose())};return{...s,handleResetPassword:i}};var L=e=>{let{id:s}=e,{handleResetPassword:a,isOpen:i,onClose:l,onOpen:r}=K(s);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.wpx,{onClick:r,"data-testid":"reset-password-btn",children:"Reset password"}),(0,t.jsxs)(n.u_l,{isCentered:!0,isOpen:i,onClose:l,children:[(0,t.jsx)(n.ZAr,{}),(0,t.jsx)(n.hzk,{children:(0,t.jsx)(c.J9,{initialValues:W,validationSchema:Z,onSubmit:a,children:e=>{let{isSubmitting:s,dirty:a,isValid:i}=e;return(0,t.jsxs)(c.l0,{children:[(0,t.jsx)(n.xBx,{children:"Reset Password"}),(0,t.jsx)(n.olH,{}),(0,t.jsx)(n.fef,{children:(0,t.jsxs)(n.Kqy,{direction:"column",spacing:4,children:[(0,t.jsx)(n.xvT,{mb:2,children:"Choose a new password for this user."}),(0,t.jsx)(N.j0,{name:"password",label:"Password",placeholder:"********",type:"password",tooltip:"Password must contain at least 8 characters, 1 number, 1 capital letter, 1 lowercase letter, and at least 1 symbol.",autoComplete:"new-password"}),(0,t.jsx)(N.j0,{name:"passwordConfirmation",label:"Confirm Password",placeholder:"********",type:"password",tooltip:"Must match above password.",autoComplete:"confirm-password"})]})}),(0,t.jsx)(n.mzw,{children:(0,t.jsxs)("div",{className:"w-full gap-2",children:[(0,t.jsx)(n.wpx,{onClick:l,className:"w-1/2",children:"Cancel"}),(0,t.jsx)(n.wpx,{type:"primary",disabled:!a||!i,loading:s,htmlType:"submit",className:"w-1/2","data-testid":"submit-btn",children:"Change Password"})]})})]})}})})]})]})};let V=e=>{let s=(0,n.qY0)(),a=(0,n.pmc)(),[t,i]=(0,m.useState)(""),[l,r]=(0,m.useState)(""),[d,{isLoading:o}]=(0,y.ev)(),c=!!(e&&l&&t),h=async()=>{c&&d({id:e,old_password:t,new_password:l}).unwrap().then(()=>{a((0,w.t5)("Password updated")),s.onClose()})};return{...s,changePasswordValidation:c,handleChange:e=>{"oldPassword"===e.target.name?i(e.target.value):r(e.target.value)},handleChangePassword:h,isLoading:o,newPasswordValue:l,oldPasswordValue:t}};var B=e=>{let{id:s}=e,{changePasswordValidation:a,handleChange:i,handleChangePassword:l,isLoading:r,isOpen:d,newPasswordValue:o,oldPasswordValue:c,onClose:h,onOpen:m}=V(s);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.wpx,{onClick:m,"data-testid":"update-password-btn",children:"Update password"}),(0,t.jsxs)(n.u_l,{isCentered:!0,isOpen:d,onClose:h,children:[(0,t.jsx)(n.ZAr,{}),(0,t.jsxs)(n.hzk,{children:[(0,t.jsx)(n.xBx,{children:"Update Password"}),(0,t.jsx)(n.olH,{}),(0,t.jsx)(n.fef,{pb:6,children:(0,t.jsxs)(n.Kqy,{direction:"column",spacing:"15px",children:[(0,t.jsx)(n.NIc,{children:(0,t.jsx)(n.IIB,{isRequired:!0,name:"oldPassword",onChange:i,placeholder:"Old Password",type:"password",value:c,"data-testid":"input-oldPassword"})}),(0,t.jsx)(n.NIc,{children:(0,t.jsx)(n.IIB,{isRequired:!0,name:"newPassword",onChange:i,placeholder:"New Password",type:"password",value:o,"data-testid":"input-newPassword"})})]})}),(0,t.jsxs)(n.mzw,{children:[(0,t.jsx)(n.wpx,{onClick:h,className:"mr-2 w-1/2",children:"Cancel"}),(0,t.jsx)(n.wpx,{type:"primary",disabled:!a,loading:r,onClick:l,htmlType:"submit",className:"mr-3 w-1/2","data-testid":"submit-btn",children:"Change Password"})]})]})]})]})},Y=()=>{var e;let s=(0,r.C)(y.Ux),a=(0,r.C)(U.dy),i=!!a&&a.id===s,{data:l}=(0,y.gU)(null!=s?s:"",{skip:!s});return(null==l?void 0:null===(e=l.roles)||void 0===e?void 0:e.includes(d.A7.EXTERNAL_RESPONDENT))?null:(0,t.jsx)(n.xuv,{children:s?(0,t.jsxs)(n.Ugi,{children:[i?(0,t.jsx)(B,{id:s}):null,(0,t.jsx)(o.ZP,{scopes:[d.Sh.USER_PASSWORD_RESET],children:(0,t.jsx)(L,{id:s})})]}):null})};let F=(e,s,a,t)=>!e||e&&!s||e&&s&&!0===a&&!!t,$=(e,s,a)=>!!(e&&s&&a),M=(e,s,a,t,n,i)=>!!e&&!s&&F(a,t,n,i),X=(e,s,a,t)=>F(e,s,a,t),H={username:"",first_name:"",email_address:"",last_name:"",password:"",password_login_enabled:!1},G=(e,s,a,t,n)=>P.Ry().shape({username:P.Z_().required().label("Username"),email_address:P.Z_().email().required().label("Email address"),first_name:P.Z_().label("First name"),last_name:P.Z_().label("Last name"),password:P.Z_().when(["password_login_enabled"],{is:i=>M(e,s,a,t,n,i),then:()=>O.a.label("Password"),otherwise:()=>P.Z_().optional().label("Password")}),password_login_enabled:P.O7().label("Allow password login")});var J=e=>{let{onSubmit:s,initialValues:a,canEditNames:i}=e,l=(0,h.useRouter)(),d=(0,n.pmc)(),o=(0,r.T)(),m=(0,n.qY0)(),{data:u}=z(),{data:x}=(0,q.qv)();(0,I.tB)({api_set:!1});let g=(0,r.C)(y.ZC),b=(0,r.C)(I.iR),{plus:v}=(0,R.hz)(),_=(null==u?void 0:u.enabled)||!1,C=(null==b?void 0:b.allow_username_password_login)||!1,S=!g,k=!S&&!i,E=x&&x.length>0||!1,A=$(v,E,C),P=null!=a?a:H;g&&"password_login_enabled"in g&&(P={...P,password_login_enabled:!!g.password_login_enabled});let O=G(S,_,v,E,C),U=async e=>{let a=M(S,_,v,E,C,e.password_login_enabled),t={username:e.username,email_address:e.email_address,first_name:e.first_name,last_name:e.last_name};A&&(t.password_login_enabled=e.password_login_enabled),a&&e.password&&(t.password=e.password);let n=await s(t);if((0,p.D4)(n)){d((0,w.Vo)((0,p.e$)(n.error)));return}d((0,w.t5)("".concat(S?"User created. By default, new users are set to the Viewer role. To change the role, please go to the Permissions tab.":"User updated."))),(null==n?void 0:n.data)&&o((0,y.Vv)(n.data.id))};return(0,t.jsx)(c.J9,{onSubmit:U,initialValues:P,validationSchema:O,"data-testid":"user-form",children:e=>{let{dirty:s,isSubmitting:a,isValid:i,values:r}=e;return(0,t.jsx)(c.l0,{children:(0,t.jsxs)(n.Kqy,{maxW:["xs","xs","100%"],width:"100%",spacing:7,children:[(0,t.jsxs)(n.Kqy,{spacing:6,maxWidth:"55%",children:[(0,t.jsxs)(n.kCb,{children:[(0,t.jsxs)(n.xvT,{display:"flex",alignItems:"center",fontSize:"sm",fontWeight:"semibold",children:["Profile"," ",(null==g?void 0:g.disabled)&&(0,t.jsx)(n.j8w,{color:"success",className:"ml-2","data-testid":"invite-sent-badge",children:"Invite sent"})]}),(0,t.jsx)(n.xuv,{marginLeft:"auto",children:(0,t.jsxs)(n.Ugi,{children:[X(v,E,C||!1,r.password_login_enabled)&&(0,t.jsx)(Y,{"data-testid":"password-management"}),S?null:(0,t.jsxs)(n.xuv,{children:[(0,t.jsx)(n.wpx,{"aria-label":"delete",icon:(0,t.jsx)(f.l,{}),onClick:m.onOpen,"data-testid":"delete-user-btn"}),(0,t.jsx)(T.Z,{user:g,...m})]})]})})]}),(0,t.jsx)(N.j0,{name:"username",label:"Username",variant:"block",placeholder:"Enter new username",disabled:!S,isRequired:!0,"data-testid":"input-username"}),(0,t.jsx)(N.j0,{name:"email_address",label:"Email address",variant:"block",placeholder:"Enter email of user",isRequired:!0,"data-testid":"input-email-address"}),(0,t.jsx)(N.j0,{name:"first_name",label:"First name",variant:"block",placeholder:"Enter first name of user",disabled:k,"data-testid":"input-first-name"}),(0,t.jsx)(N.j0,{name:"last_name",label:"Last name",variant:"block",placeholder:"Enter last name of user",disabled:k,"data-testid":"input-last-name"}),A&&(0,t.jsx)(N.w8,{name:"password_login_enabled",label:"Allow password login",tooltip:"When enabled, user can log in with username and password. When disabled, user must use SSO.",variant:"stacked",isDisabled:!S,"data-testid":"toggle-allow-password-login",size:"default"}),M(S,_,v,E,C,r.password_login_enabled)&&(0,t.jsx)(N.j0,{name:"password",label:"Password",variant:"block",placeholder:"********",type:"password",tooltip:"Password must contain at least 8 characters, 1 number, 1 capital letter, 1 lowercase letter, and at least 1 symbol.",isRequired:!0,"data-testid":"input-password"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)(n.wpx,{onClick:()=>l.push(j.e3),className:"mr-3","data-testid":"cancel-btn",children:"Cancel"}),(0,t.jsx)(n.wpx,{htmlType:"submit",type:"primary",disabled:!s||!i,loading:a,"data-testid":"save-user-btn",children:"Save"})]})]})})}})},Q=e=>{let{onSubmit:s,initialValues:a,...i}=e,c=(0,r.C)(y.Ux);(0,y.Fk)(c,{skip:!c});let h=(0,o.Tg)([d.Sh.USER_PERMISSION_UPDATE]),m=!c||!h,p=[{label:"Profile",key:"profile",children:(0,t.jsx)(J,{onSubmit:s,initialValues:a,...i})},{label:"Permissions",key:"permissions",children:(0,t.jsxs)(n.kCb,{gap:"97px",children:[(0,t.jsx)(n.xuv,{w:{base:"100%",md:"50%",xl:"50%"},children:(0,t.jsx)(A,{})}),(0,t.jsx)(n.xuv,{position:"absolute",top:"96px",right:6,height:"calc(100% + 100px)",overflowY:"scroll",padding:6,w:"35%",borderLeftWidth:"1px",children:(0,t.jsx)(l,{})})]}),disabled:m,forceRender:!m}];return(0,t.jsx)(n.A5g,{items:p})}},31883:function(e,s,a){a.d(s,{Bw:function(){return t.Bw},D4:function(){return t.D4}});var t=a(19043)}}]);