ethyca-fides 2.71.2b0__py2.py3-none-any.whl → 2.72.0rc0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (271) hide show
  1. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/RECORD +239 -233
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +45 -12
  5. fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
  6. fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
  7. fides/api/api/v1/endpoints/system.py +11 -43
  8. fides/api/api/v1/endpoints/user_endpoints.py +8 -1
  9. fides/api/app_setup.py +1 -3
  10. fides/api/common_exceptions.py +4 -0
  11. fides/api/email_templates/get_email_template.py +3 -0
  12. fides/api/email_templates/template_names.py +1 -0
  13. fides/api/email_templates/templates/manual_task_digest.html +316 -0
  14. fides/api/models/detection_discovery/monitor_task.py +1 -0
  15. fides/api/models/digest/digest_execution.py +11 -1
  16. fides/api/models/event_audit.py +9 -0
  17. fides/api/models/messaging_template.py +7 -0
  18. fides/api/schemas/connection_configuration/connection_config.py +1 -30
  19. fides/api/schemas/messaging/messaging.py +15 -0
  20. fides/api/service/connectors/saas/connector_registry_service.py +1 -138
  21. fides/api/service/deps.py +8 -0
  22. fides/api/service/messaging/message_dispatch_service.py +38 -1
  23. fides/api/tasks/__init__.py +0 -1
  24. fides/api/util/connection_util.py +99 -215
  25. fides/api/util/event_audit_util.py +230 -0
  26. fides/api/util/masking_util.py +31 -0
  27. fides/api/util/saas_config_updater.py +66 -0
  28. fides/service/connection/__init__.py +0 -0
  29. fides/service/connection/connection_service.py +651 -0
  30. fides/service/event_audit_service.py +16 -22
  31. fides/ui-build/static/admin/404.html +1 -1
  32. fides/ui-build/static/admin/_next/static/SnBet3d7BrNVkglIl0ajl/_buildManifest.js +1 -0
  33. fides/ui-build/static/admin/_next/static/chunks/{1437-fb699e9d69c3e325.js → 1437-b49af8562f54a625.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/155-dd7bf4b1acc077f6.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/{1817-10b392e1dd9c4673.js → 1817-9e4a1b1897e9bf98.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/{2040-01d5edb1802d3482.js → 2040-68eb3a5d010c1e97.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{2397-40506a386a3a469a.js → 2397-fc4d998dd825ec4d.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/3377-d0a01db227febac8.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/{3696-259be222ea12392a.js → 3696-19767df579460115.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/3700-12cb80d0f957fcc4.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/401-3bcfbf738f028868.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/5185-7474c764ea99f1ca.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/{5258-2d28b2c64acf5de3.js → 5258-f16177770ded638e.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{5279-21929b12c927b022.js → 5279-c00fe2f02fb0884a.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{5643-7583c1f8dbd83273.js → 5643-d43eaf754759827a.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{5783-55c0387508e50f3e.js → 5783-38508f27d73ce33d.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/6277-24790943a32f4310.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/{6315-2d4e86a32fc40458.js → 6315-8e75ebd641e72b64.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/{6853-cb15625a713b3ef9.js → 6853-a9bf7b1e3efc4890.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/6954-50bacf2850b67baa.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/7245-0fb0a47c8d09b133.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/{7476-f25fce73eeb1f9c6.js → 7476-1ff6e16cd626c709.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/{7488-df17b592fbeaa1eb.js → 7488-d8dae51cdc7beded.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/7630-e679419d1b9ccb40.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/{8011-56031d82d5428981.js → 8011-4712e3cd2f4ac324.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/{8373-7f940f5ac9c38b1f.js → 8373-d1e097f06ec2ee69.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/{9046-31b16a7e872c22be.js → 9046-4833f2609581dba5.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/9070-72f484137b9e8c01.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/{9330-cea1bf40f5d27e53.js → 9330-4e0809deb8798d22.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/{9682-2754256aeae141bb.js → 9682-38892cb66c7f95e3.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/{9899-15530c468d5656a1.js → 9899-c643484881627fb2.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/9965-2236fd3e20e82310.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-9e869a44215709ed.js → _app-2e4cd4b7602e1bb3.js} +43 -43
  64. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-dba951f9d47e999b.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-42d903108bea604f.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-f8ecba33126e0c25.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-224e9981280a4dc5.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-144f4a5d20e97568.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-69b429a9d30ebaf1.js → projects-567785f8792366e1.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-a53ef0161235ee47.js → data-catalog-bfd0c20e75b8b920.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b38ccd2e832e49f3.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-98f2ad49cf056476.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-ace848575e688200.js → [monitorId]-ce9c88efaa0e1574.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-53ca31c50c43007f.js → action-center-ba88a4fb3040868b.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-f87e4a0f664f4cde.js → activity-fe2bfdf0311bfef8.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-db54d01fd8f6df50.js → new-a942e03888533e9d.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-55d312af5228e098.js → dataset-cdc0702d27cf8c33.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-488beba62e832660.js → [id]-06012371d6895224.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-4aad5495f9bf81ce.js → new-206e6e6d1fe2410f.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/{index-8a2ba955d92d52ee.js → index-c67367086367c633.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-627a239ad9ee583c.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-f69b04d3b4cf43b1.js → integrations-95e69be79db496a8.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-f57a7e0fa0980ccd.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-ffe085b4c4397507.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-6eaa901f9b870009.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-f5bce1ceb0502f04.js → FormikAntFormItem-4de259b097029614.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-90b4ea9f9deca6e2.js → FormikControlled-8b141c7922fa9ac7.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-3bdf46d79cc0109f.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-fe4ed3ad75151e36.js → [id]-3f0d46ca6f1b519f.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-de681c2d022c9e0d.js → storage-8954850d483b26f3.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-cd8ba2eef9085377.js → privacy-requests-454ebb8c7af36486.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-9981789c06a174a7.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-c298a89b006c2646.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-91efbb5b334823a1.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-ea9baf24de35d3b1.js → custom-fields-401ed29bd0c5df46.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-ee33c5de7339d7d4.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-33448bf0a1d53870.js → locations-787738296ba93cf2.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-e93333bb5a79dc53.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c315036f1fc9f90.js → organization-7376fc65cbfa9fb4.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-085834d81742e278.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/systems-c6317160d10b8f29.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-cecea5832cb1f3b0.js → taxonomy-ea7e284bc31a4dc2.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-726fbc0a34ffba1f.js → [id]-ba3b6d517ef5de22.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-df9b75ab01c1a2ea.js → user-management-ed8df757a8129298.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/css/80cba63bd8a9a6c7.css +1 -0
  106. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  107. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  108. fides/ui-build/static/admin/add-systems.html +1 -1
  109. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  110. fides/ui-build/static/admin/consent/configure.html +1 -1
  111. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  112. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  113. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  114. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  115. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  116. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  117. fides/ui-build/static/admin/consent/properties.html +1 -1
  118. fides/ui-build/static/admin/consent/reporting.html +1 -1
  119. fides/ui-build/static/admin/consent.html +1 -1
  120. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  121. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  122. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  123. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  124. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  125. fides/ui-build/static/admin/data-catalog.html +1 -1
  126. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  127. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/data-explorer.html +1 -1
  128. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  129. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  130. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  131. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  132. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  133. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  134. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  135. fides/ui-build/static/admin/datamap.html +1 -1
  136. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  137. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  138. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  139. fides/ui-build/static/admin/dataset/new.html +1 -1
  140. fides/ui-build/static/admin/dataset.html +1 -1
  141. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  142. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  143. fides/ui-build/static/admin/datastore-connection.html +1 -1
  144. fides/ui-build/static/admin/index.html +1 -1
  145. fides/ui-build/static/admin/integrations/[id].html +1 -1
  146. fides/ui-build/static/admin/integrations.html +1 -1
  147. fides/ui-build/static/admin/login/[provider].html +1 -1
  148. fides/ui-build/static/admin/login.html +1 -1
  149. fides/ui-build/static/admin/messaging/[id].html +1 -1
  150. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  151. fides/ui-build/static/admin/messaging.html +1 -1
  152. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  153. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  154. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  155. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  156. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  157. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  158. fides/ui-build/static/admin/poc/forms.html +1 -1
  159. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  160. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  161. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  162. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  163. fides/ui-build/static/admin/privacy-requests.html +1 -1
  164. fides/ui-build/static/admin/properties/[id].html +1 -1
  165. fides/ui-build/static/admin/properties/add-property.html +1 -1
  166. fides/ui-build/static/admin/properties.html +1 -1
  167. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  168. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  169. fides/ui-build/static/admin/settings/about.html +1 -1
  170. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  171. fides/ui-build/static/admin/settings/consent.html +1 -1
  172. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  173. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  174. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  175. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  176. fides/ui-build/static/admin/settings/domains.html +1 -1
  177. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  178. fides/ui-build/static/admin/settings/locations.html +1 -1
  179. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
  180. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
  181. fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
  182. fides/ui-build/static/admin/settings/organization.html +1 -1
  183. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  184. fides/ui-build/static/admin/settings/regulations.html +1 -1
  185. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  186. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  187. fides/ui-build/static/admin/systems.html +1 -1
  188. fides/ui-build/static/admin/taxonomy.html +1 -1
  189. fides/ui-build/static/admin/user-management/new.html +1 -1
  190. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  191. fides/ui-build/static/admin/user-management.html +1 -1
  192. fides/ui-build/static/admin/_next/static/chunks/155-3d03f101c662c054.js +0 -1
  193. fides/ui-build/static/admin/_next/static/chunks/3377-4c129258b4c4ea28.js +0 -1
  194. fides/ui-build/static/admin/_next/static/chunks/3700-42976bfaad3b91c9.js +0 -1
  195. fides/ui-build/static/admin/_next/static/chunks/401-5270e3e23b08ab2b.js +0 -1
  196. fides/ui-build/static/admin/_next/static/chunks/5185-325e5435a0c7dcb7.js +0 -1
  197. fides/ui-build/static/admin/_next/static/chunks/6277-ca31d48a33202761.js +0 -1
  198. fides/ui-build/static/admin/_next/static/chunks/6954-08b59d28d7a2a43b.js +0 -1
  199. fides/ui-build/static/admin/_next/static/chunks/7245-895bb7c6a6c797bc.js +0 -1
  200. fides/ui-build/static/admin/_next/static/chunks/7630-71582de0e818e28f.js +0 -1
  201. fides/ui-build/static/admin/_next/static/chunks/9070-13f237db78da586d.js +0 -1
  202. fides/ui-build/static/admin/_next/static/chunks/9965-54037b6c8f36d14b.js +0 -1
  203. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-1c9cef80deccb15d.js +0 -1
  204. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-4adeec3bcec05f7b.js +0 -1
  205. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-4254abef7bb52edd.js +0 -1
  206. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-8e76cbfaf71fdcb9.js +0 -1
  207. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-93730a4316c0d980.js +0 -1
  208. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-f85f4f8fcf1bfbdb.js +0 -1
  209. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-3619e454763dba09.js +0 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4580f70eb41b6a7d.js +0 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-c7ba755c2e0e2377.js +0 -1
  212. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-f14bfd5890a0e939.js +0 -1
  213. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-e4274a4d5d23eea9.js +0 -1
  214. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-520ba5ae02f47bda.js +0 -1
  215. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-764b6ce8e030d4a1.js +0 -1
  216. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-da78452b3c41b29e.js +0 -1
  217. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-6442e761ecb5c65a.js +0 -1
  218. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-6f61d886aa6f5ce7.js +0 -1
  219. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-776258bad0941a7d.js +0 -1
  220. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-8067e12227210f48.js +0 -1
  221. fides/ui-build/static/admin/_next/static/chunks/pages/systems-277ea1f34c3714cf.js +0 -1
  222. fides/ui-build/static/admin/_next/static/css/372d6a236c84613f.css +0 -1
  223. fides/ui-build/static/admin/_next/static/zmEQMSpOBih8kmA1t-EWO/_buildManifest.js +0 -1
  224. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/WHEEL +0 -0
  225. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/entry_points.txt +0 -0
  226. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/licenses/LICENSE +0 -0
  227. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/top_level.txt +0 -0
  228. /fides/ui-build/static/admin/_next/static/{zmEQMSpOBih8kmA1t-EWO → SnBet3d7BrNVkglIl0ajl}/_ssgManifest.js +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/{1099-27b2d4e59a569b38.js → 1099-0b3dedca0b088f1a.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/{1115-8fb5000847f73ec7.js → 1115-a124adb312fb2699.js} +0 -0
  231. /fides/ui-build/static/admin/_next/static/chunks/{2921-edfdffa353a611e4.js → 2921-d3e9c85cdd7c27ef.js} +0 -0
  232. /fides/ui-build/static/admin/_next/static/chunks/{3772-aa7beafe5df5e656.js → 3772-f110cd525aead279.js} +0 -0
  233. /fides/ui-build/static/admin/_next/static/chunks/{3923-fa1d71afc7dc9e6e.js → 3923-ae843be719d73ef4.js} +0 -0
  234. /fides/ui-build/static/admin/_next/static/chunks/{4817-5f9b9c9bafe888f1.js → 4817-1ec683be64664576.js} +0 -0
  235. /fides/ui-build/static/admin/_next/static/chunks/{549-c3b4c51f45a84a52.js → 549-9892a4d85bcbf7a2.js} +0 -0
  236. /fides/ui-build/static/admin/_next/static/chunks/{7773-98d34d188ae0a694.js → 7773-fcd7875cd98f5f39.js} +0 -0
  237. /fides/ui-build/static/admin/_next/static/chunks/{796-7944f684f8945506.js → 796-f3fc016814418a8b.js} +0 -0
  238. /fides/ui-build/static/admin/_next/static/chunks/{9826-e71887e2c4283249.js → 9826-cbfbfc79b6841f08.js} +0 -0
  239. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-2014144a1a0fa64f.js → 404-aa3982e4f51705df.js} +0 -0
  240. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-4f3ba02774f27795.js → manual-a37865aa5cf14ea2.js} +0 -0
  241. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-f7bdc2da53137ffd.js → add-vendors-611f37b6e9031263.js} +0 -0
  242. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-a27b220fe76bdc8e.js → configure-21123d6de9094ca2.js} +0 -0
  243. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-542fd4a4322122f1.js → [id]-5e5eae30956fea95.js} +0 -0
  244. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-d31d1c233e94dc1f.js → [id]-13e4cc79e134b563.js} +0 -0
  245. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ea057e6217993f9.js → new-ba8ee9f3b86763c3.js} +0 -0
  246. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-eb557180eded0abd.js → properties-1585e94b122004f3.js} +0 -0
  247. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-c64589e53338e59a.js → consent-35925fa8990ec083.js} +0 -0
  248. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-8cd4d1d6ba000333.js → [projectUrn]-ca7f388ecd1601df.js} +0 -0
  249. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-8c7103ebf01d6e6a.js → resources-c3a69a1d0d38cea7.js} +0 -0
  250. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-ae7a4c1c4eabc0d4.js → datamap-7e3e7bf39b111f66.js} +0 -0
  251. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-179e5d09ccff50c1.js → [...subfieldNames]-a3f64d75bdfe8936.js} +0 -0
  252. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-59466e5e238c59d0.js → [collectionName]-9fe2facc2f232fde.js} +0 -0
  253. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-36d90c8c39fb0d1c.js → [datasetId]-fd69a9c224af3746.js} +0 -0
  254. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-496ec7ecca8259dc.js → datastore-connection-5efe1b59a50befd8.js} +0 -0
  255. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-d6eed2dc5d27f625.js → [id]-ab70f1fad73df45f.js} +0 -0
  256. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-c7b43fa365f4be10.js → add-template-0f2238b930e6acd8.js} +0 -0
  257. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-d6043ae8dae6ef7d.js → FormikField-25d78a1dbaf785ed.js} +0 -0
  258. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-b46f432b51421fae.js → table-migration-fc3e49b5ee4a4d23.js} +0 -0
  259. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-04ebf2fb6fc4358a.js → configure-948e71f3cfbe304e.js} +0 -0
  260. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-f75a407d78857ab3.js → [id]-180bb94838bca304.js} +0 -0
  261. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-975ff605e1dbc09c.js → add-property-719bbd424816ef58.js} +0 -0
  262. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-e7fdf3a9a3e8c267.js → properties-ca707af08bca687a.js} +0 -0
  263. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-44d06e280990854d.js → domain-records-e57ee1a08caacb1b.js} +0 -0
  264. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-11148b182370fd83.js → email-templates-3fce669766a3d183.js} +0 -0
  265. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-4a18d8135c0dbf2a.js → [key]-ad748b76b1cc69ba.js} +0 -0
  266. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-41957281b8ec26b1.js → new-d962d09f6156484c.js} +0 -0
  267. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-00917525c9245a90.js → privacy-requests-bf97b87395719636.js} +0 -0
  268. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-5d924b2f1f926b88.js → regulations-2c938cdf5915ff39.js} +0 -0
  269. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-1a902922759cae76.js → [id]-62015f01f64578b2.js} +0 -0
  270. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-789f5ee80227c57b.js} +0 -0
  271. /fides/ui-build/static/admin/_next/static/chunks/{webpack-118fb4723d13c14f.js → webpack-119be8f042eb6b8b.js} +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-10-03T09:34:20-0700",
11
+ "date": "2025-10-09T10:22:06-0400",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "521a48a9c7dbc813d08cf2053f318328912e86b6",
15
- "version": "2.71.2b0"
14
+ "full-revisionid": "575604a24ea4839fcb584f4d7fc920dd0471d024",
15
+ "version": "2.72.0rc0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -17,19 +17,52 @@ depends_on = None
17
17
 
18
18
 
19
19
  def upgrade():
20
- # Check if value already exists
21
- connection = op.get_bind()
22
- result = connection.execute(
23
- sa.text(
24
- "SELECT 1 FROM pg_enum WHERE enumlabel = 'polling' "
25
- "AND enumtypid = (SELECT oid FROM pg_type WHERE typname = 'executionlogstatus')"
26
- )
20
+ op.execute("ALTER TYPE executionlogstatus ADD VALUE 'polling'")
21
+
22
+
23
+ def downgrade():
24
+ # Remove any records that have the 'polling' enum value before dropping it
25
+ # Fallback to 'paused' (awaiting_processing) for backward compatibility
26
+
27
+ op.execute("UPDATE requesttask SET status = 'paused' WHERE status = 'polling'")
28
+ op.execute("UPDATE executionlog SET status = 'paused' WHERE status = 'polling'")
29
+ op.execute(
30
+ "UPDATE digest_task_execution SET status = 'paused' WHERE status = 'polling'"
31
+ )
32
+ op.execute("UPDATE monitortask SET status = 'paused' WHERE status = 'polling'")
33
+ op.execute(
34
+ "UPDATE monitortaskexecutionlog SET status = 'paused' WHERE status = 'polling'"
27
35
  )
28
36
 
29
- if not result.fetchone():
30
- op.execute("ALTER TYPE executionlogstatus ADD VALUE 'polling'")
37
+ # Recreate the enum without the 'polling' value
38
+ op.execute("ALTER TYPE executionlogstatus RENAME TO executionlogstatus_old")
39
+ op.execute(
40
+ "CREATE TYPE executionlogstatus AS ENUM ("
41
+ "'in_processing', 'pending', 'complete', 'error', 'paused', 'retrying', 'skipped'"
42
+ ")"
43
+ )
31
44
 
45
+ # Update all tables that use the enum type
46
+ op.execute(
47
+ "ALTER TABLE requesttask ALTER COLUMN status TYPE executionlogstatus USING "
48
+ "status::text::executionlogstatus"
49
+ )
50
+ op.execute(
51
+ "ALTER TABLE executionlog ALTER COLUMN status TYPE executionlogstatus USING "
52
+ "status::text::executionlogstatus"
53
+ )
54
+ op.execute(
55
+ "ALTER TABLE digest_task_execution ALTER COLUMN status TYPE executionlogstatus USING "
56
+ "status::text::executionlogstatus"
57
+ )
58
+ op.execute(
59
+ "ALTER TABLE monitortask ALTER COLUMN status TYPE executionlogstatus USING "
60
+ "status::text::executionlogstatus"
61
+ )
62
+ op.execute(
63
+ "ALTER TABLE monitortaskexecutionlog ALTER COLUMN status TYPE executionlogstatus USING "
64
+ "status::text::executionlogstatus"
65
+ )
32
66
 
33
- def downgrade():
34
- # The 'polling' value will remain in the enum but won't be used by older app versions
35
- pass
67
+ # Drop the old enum type
68
+ op.execute("DROP TYPE executionlogstatus_old")
@@ -24,6 +24,7 @@ from starlette.status import (
24
24
  from fides.api.api import deps
25
25
  from fides.api.models.connection_oauth_credentials import OAuthConfig
26
26
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
27
+ from fides.api.models.event_audit import EventAuditType
27
28
  from fides.api.oauth.utils import verify_oauth_client
28
29
  from fides.api.schemas.connection_configuration import connection_secrets_schemas
29
30
  from fides.api.schemas.connection_configuration.connection_config import (
@@ -40,13 +41,14 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
40
41
  )
41
42
  from fides.api.schemas.connection_configuration.enums.system_type import SystemType
42
43
  from fides.api.schemas.connection_configuration.enums.test_status import TestStatus
44
+ from fides.api.service.deps import get_connection_service
43
45
  from fides.api.util.api_router import APIRouter
44
46
  from fides.api.util.connection_util import (
45
47
  connection_status,
46
48
  delete_connection_config,
47
49
  get_connection_config_or_error,
48
50
  patch_connection_configs,
49
- validate_secrets,
51
+ update_connection_secrets,
50
52
  )
51
53
  from fides.common.api.scope_registry import (
52
54
  CONNECTION_CREATE_OR_UPDATE,
@@ -61,6 +63,8 @@ from fides.common.api.v1.urn_registry import (
61
63
  CONNECTIONS,
62
64
  V1_URL_PREFIX,
63
65
  )
66
+ from fides.service.connection.connection_service import ConnectionService
67
+ from fides.service.event_audit_service import EventAuditService
64
68
 
65
69
  router = APIRouter(tags=["Connections"], prefix=V1_URL_PREFIX)
66
70
 
@@ -220,28 +224,6 @@ def delete_connection(
220
224
  delete_connection_config(db, connection_key)
221
225
 
222
226
 
223
- def validate_and_update_secrets(
224
- connection_key: FidesKey,
225
- connection_config: ConnectionConfig,
226
- db: Session,
227
- unvalidated_secrets: connection_secrets_schemas,
228
- verify: Optional[bool],
229
- ) -> TestStatusMessage:
230
- connection_config.secrets = validate_secrets(
231
- db, unvalidated_secrets, connection_config
232
- ).model_dump(mode="json")
233
- # Save validated secrets, regardless of whether they've been verified.
234
- logger.info("Updating connection config secrets for '{}'", connection_key)
235
- connection_config.save(db=db)
236
-
237
- msg = f"Secrets updated for ConnectionConfig with key: {connection_key}."
238
-
239
- if verify:
240
- return connection_status(connection_config, msg, db)
241
-
242
- return TestStatusMessage(msg=msg, test_status=None)
243
-
244
-
245
227
  @router.put(
246
228
  CONNECTION_SECRETS,
247
229
  status_code=HTTP_200_OK,
@@ -251,7 +233,7 @@ def validate_and_update_secrets(
251
233
  def put_connection_config_secrets(
252
234
  connection_key: FidesKey,
253
235
  *,
254
- db: Session = Depends(deps.get_db),
236
+ connection_service: ConnectionService = Depends(get_connection_service),
255
237
  unvalidated_secrets: connection_secrets_schemas,
256
238
  verify: Optional[bool] = True,
257
239
  ) -> TestStatusMessage:
@@ -261,10 +243,8 @@ def put_connection_config_secrets(
261
243
  The specific secrets will be connection-dependent. For example, the components needed to connect to a Postgres DB
262
244
  will differ from Dynamo DB.
263
245
  """
264
- connection_config = get_connection_config_or_error(db, connection_key)
265
-
266
- return validate_and_update_secrets(
267
- connection_key, connection_config, db, unvalidated_secrets, verify
246
+ return update_connection_secrets(
247
+ connection_service, connection_key, unvalidated_secrets, verify
268
248
  )
269
249
 
270
250
 
@@ -277,7 +257,7 @@ def put_connection_config_secrets(
277
257
  def patch_connection_config_secrets(
278
258
  connection_key: FidesKey,
279
259
  *,
280
- db: Session = Depends(deps.get_db),
260
+ connection_service: ConnectionService = Depends(get_connection_service),
281
261
  unvalidated_secrets: connection_secrets_schemas,
282
262
  verify: Optional[bool] = True,
283
263
  ) -> TestStatusMessage:
@@ -287,22 +267,12 @@ def patch_connection_config_secrets(
287
267
  The specific secrets will be connection-dependent. For example, the components needed to connect to a Postgres DB
288
268
  will differ from Dynamo DB.
289
269
  """
290
- connection_config = get_connection_config_or_error(db, connection_key)
291
-
292
- existing_secrets: Optional[Dict[str, Any]] = connection_config.secrets
293
-
294
- # We create the new secrets object by combining the existing secrets with the new secrets.
295
- patched_secrets = {}
296
- if existing_secrets:
297
- patched_secrets = {**existing_secrets}
298
-
299
- patched_secrets = {
300
- **patched_secrets,
301
- **unvalidated_secrets, # type: ignore[dict-item]
302
- }
303
-
304
- return validate_and_update_secrets(
305
- connection_key, connection_config, db, patched_secrets, verify # type: ignore[arg-type]
270
+ return update_connection_secrets(
271
+ connection_service,
272
+ connection_key,
273
+ unvalidated_secrets,
274
+ verify,
275
+ merge_with_existing=True,
306
276
  )
307
277
 
308
278
 
@@ -354,6 +324,16 @@ def put_connection_oauth_config(
354
324
  )
355
325
  connection_config.save(db=db)
356
326
 
327
+ event_audit_service = EventAuditService(db)
328
+ connection_service = ConnectionService(db, event_audit_service)
329
+
330
+ # Create secrets audit event for OAuth credential changes
331
+ connection_service.create_secrets_audit_event(
332
+ EventAuditType.connection_secrets_updated,
333
+ connection_config,
334
+ oauth_config.model_dump(exclude_unset=True), # The OAuth secrets being updated
335
+ )
336
+
357
337
  msg = (
358
338
  f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
359
339
  )
@@ -455,6 +435,19 @@ def patch_connection_oauth_config(
455
435
  detail="Invalid OAuth2 configuration.",
456
436
  ) from exc
457
437
 
438
+ # Create audit event for OAuth config update (OAuth credentials are secrets)
439
+ event_audit_service = EventAuditService(db)
440
+ connection_service = ConnectionService(db, event_audit_service)
441
+
442
+ # Create secrets audit event for OAuth credential changes
443
+ connection_service.create_secrets_audit_event(
444
+ EventAuditType.connection_secrets_updated,
445
+ connection_config,
446
+ validated_config.model_dump(
447
+ exclude_unset=True
448
+ ), # The OAuth secrets being updated
449
+ )
450
+
458
451
  msg = (
459
452
  f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
460
453
  )
@@ -3,10 +3,12 @@ from typing import Optional
3
3
  from zipfile import BadZipFile, ZipFile
4
4
 
5
5
  from fastapi import Body, Depends, HTTPException, Request
6
+ from fastapi.encoders import jsonable_encoder
6
7
  from fastapi.params import Security
7
8
  from fastapi.responses import JSONResponse
8
9
  from fideslang.validation import FidesKey
9
10
  from loguru import logger
11
+ from pydantic import ValidationError
10
12
  from sqlalchemy.orm import Session
11
13
  from starlette.status import (
12
14
  HTTP_200_OK,
@@ -18,9 +20,15 @@ from starlette.status import (
18
20
  )
19
21
 
20
22
  from fides.api.api import deps
21
- from fides.api.common_exceptions import FidesopsException, KeyOrNameAlreadyExists
23
+ from fides.api.common_exceptions import (
24
+ FidesopsException,
25
+ KeyOrNameAlreadyExists,
26
+ SaaSConfigNotFoundException,
27
+ )
28
+ from fides.api.common_exceptions import ValidationError as FidesValidationError
22
29
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
23
30
  from fides.api.models.datasetconfig import DatasetConfig
31
+ from fides.api.models.event_audit import EventAuditStatus, EventAuditType
24
32
  from fides.api.models.sql_models import System # type: ignore
25
33
  from fides.api.oauth.utils import verify_oauth_client
26
34
  from fides.api.schemas.connection_configuration.connection_config import (
@@ -29,7 +37,6 @@ from fides.api.schemas.connection_configuration.connection_config import (
29
37
  from fides.api.schemas.connection_configuration.saas_config_template_values import (
30
38
  SaasConnectionTemplateValues,
31
39
  )
32
- from fides.api.schemas.saas.connector_template import ConnectorTemplate
33
40
  from fides.api.schemas.saas.saas_config import (
34
41
  SaaSConfig,
35
42
  SaaSConfigValidationDetails,
@@ -42,13 +49,11 @@ from fides.api.service.authentication.authentication_strategy_oauth2_authorizati
42
49
  OAuth2AuthorizationCodeAuthenticationStrategy,
43
50
  )
44
51
  from fides.api.service.connectors.saas.connector_registry_service import (
45
- ConnectorRegistry,
46
52
  CustomConnectorTemplateLoader,
47
- create_connection_config_from_template_no_save,
48
- upsert_dataset_config_from_template,
49
53
  )
50
54
  from fides.api.util.api_router import APIRouter
51
- from fides.api.util.connection_util import validate_secrets
55
+ from fides.api.util.connection_util import validate_secrets_error_message
56
+ from fides.api.util.event_audit_util import generate_connection_audit_event_details
52
57
  from fides.common.api.scope_registry import (
53
58
  CONNECTION_AUTHORIZE,
54
59
  CONNECTOR_TEMPLATE_REGISTER,
@@ -59,13 +64,17 @@ from fides.common.api.scope_registry import (
59
64
  )
60
65
  from fides.common.api.v1.urn_registry import (
61
66
  AUTHORIZE,
62
- CONNECTION_TYPES,
63
67
  REGISTER_CONNECTOR_TEMPLATE,
64
68
  SAAS_CONFIG,
65
69
  SAAS_CONFIG_VALIDATE,
66
70
  SAAS_CONNECTOR_FROM_TEMPLATE,
67
71
  V1_URL_PREFIX,
68
72
  )
73
+ from fides.service.connection.connection_service import (
74
+ ConnectionService,
75
+ ConnectorTemplateNotFound,
76
+ )
77
+ from fides.service.event_audit_service import EventAuditService
69
78
 
70
79
  router = APIRouter(tags=["SaaS Configs"], prefix=V1_URL_PREFIX)
71
80
 
@@ -168,12 +177,29 @@ def patch_saas_config(
168
177
  Given a SaaS config element, update the corresponding ConnectionConfig object
169
178
  or report failure
170
179
  """
180
+
171
181
  logger.info(
172
182
  "Updating SaaS config '{}' on connection config '{}'",
173
183
  saas_config.fides_key,
174
184
  connection_config.key,
175
185
  )
176
186
  connection_config.update_saas_config(db, saas_config=saas_config)
187
+
188
+ # Create audit event for SaaS config update
189
+ event_audit_service = EventAuditService(db)
190
+ event_details, description = generate_connection_audit_event_details(
191
+ EventAuditType.connection_updated,
192
+ connection_config=connection_config,
193
+ )
194
+ event_audit_service.create_event_audit(
195
+ event_type=EventAuditType.connection_updated,
196
+ status=EventAuditStatus.succeeded,
197
+ resource_type="connection_config",
198
+ resource_identifier=connection_config.key,
199
+ description=description,
200
+ event_details=event_details,
201
+ )
202
+
177
203
  return connection_config.saas_config # type: ignore
178
204
 
179
205
 
@@ -305,59 +331,45 @@ def instantiate_connection(
305
331
  Looks up the connector type in the SaaS connector registry and, if all required
306
332
  fields are provided, persists the associated connection config and dataset to the database.
307
333
  """
308
- connector_template: Optional[ConnectorTemplate] = (
309
- ConnectorRegistry.get_connector_template(saas_connector_type)
310
- )
311
- if not connector_template:
312
- raise HTTPException(
313
- status_code=HTTP_404_NOT_FOUND,
314
- detail=f"SaaS connector type '{saas_connector_type}' is not yet available in Fidesops. For a list of available SaaS connectors, refer to {CONNECTION_TYPES}.",
334
+ event_audit_service = EventAuditService(db)
335
+ connection_service = ConnectionService(db, event_audit_service)
336
+ try:
337
+ connection_config, dataset_config = connection_service.instantiate_connection(
338
+ saas_connector_type, template_values, system
315
339
  )
316
-
317
- if DatasetConfig.filter(
318
- db=db,
319
- conditions=(DatasetConfig.fides_key == template_values.instance_key), # type: ignore[arg-type]
320
- ).count():
340
+ except ConnectorTemplateNotFound as exc:
321
341
  raise HTTPException(
322
- status_code=HTTP_400_BAD_REQUEST,
323
- detail=f"SaaS connector instance key '{template_values.instance_key}' already exists.",
324
- )
325
-
326
- try:
327
- connection_config: ConnectionConfig = (
328
- create_connection_config_from_template_no_save(
329
- db, connector_template, template_values
330
- )
342
+ status_code=HTTP_404_NOT_FOUND,
343
+ detail=f"{exc.args[0]}",
331
344
  )
332
345
  except KeyOrNameAlreadyExists as exc:
333
346
  raise HTTPException(
334
347
  status_code=HTTP_400_BAD_REQUEST,
335
348
  detail=exc.args[0],
336
349
  )
337
-
338
- connection_config.secrets = validate_secrets(
339
- db, template_values.secrets, connection_config
340
- ).model_dump(mode="json")
341
- if system:
342
- connection_config.system_id = system.id
343
- connection_config.save(db=db) # Not persisted to db until secrets are validated
344
-
345
- try:
346
- dataset_config: DatasetConfig = upsert_dataset_config_from_template(
347
- db, connection_config, connector_template, template_values
350
+ except SaaSConfigNotFoundException:
351
+ raise HTTPException(
352
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
353
+ detail=validate_secrets_error_message(),
348
354
  )
349
- except Exception:
350
- connection_config.delete(db)
355
+ except FidesValidationError as e:
356
+ # Check if the exception has the original pydantic errors attached
357
+ raise HTTPException(status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message)
358
+ except ValidationError as e:
359
+ errors = e.errors(include_url=False, include_input=False)
360
+ for err in errors:
361
+ # Additionally, manually remove the context from the error message -
362
+ # this may contain sensitive information
363
+ err.pop("ctx", None)
364
+ raise HTTPException(
365
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
366
+ detail=jsonable_encoder(errors),
367
+ )
368
+ except Exception as exc:
351
369
  raise HTTPException(
352
370
  status_code=HTTP_500_INTERNAL_SERVER_ERROR,
353
- detail=f"SaaS Connector could not be created from the '{saas_connector_type}' template at this time.",
371
+ detail=f"{exc.args[0]}",
354
372
  )
355
- logger.info(
356
- "SaaS Connector and Dataset {} successfully created from '{}' template.",
357
- template_values.instance_key,
358
- saas_connector_type,
359
- )
360
-
361
373
  return SaasConnectionTemplateResponse(
362
374
  connection=connection_config, dataset=dataset_config.ctl_dataset
363
375
  )
@@ -30,7 +30,7 @@ from fides.api.db.system import (
30
30
  upsert_system,
31
31
  validate_privacy_declarations,
32
32
  )
33
- from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
33
+ from fides.api.models.connectionconfig import ConnectionConfig
34
34
  from fides.api.models.fides_user import FidesUser
35
35
  from fides.api.models.sql_models import System # type:ignore[attr-defined]
36
36
  from fides.api.oauth.roles import APPROVER
@@ -57,14 +57,12 @@ from fides.api.schemas.system import (
57
57
  BasicSystemResponse,
58
58
  SystemResponse,
59
59
  )
60
- from fides.api.service.deps import get_system_service
60
+ from fides.api.service.deps import get_connection_service, get_system_service
61
61
  from fides.api.util.api_router import APIRouter
62
62
  from fides.api.util.connection_util import (
63
- connection_status,
64
63
  delete_connection_config,
65
- get_connection_config_or_error,
66
64
  patch_connection_configs,
67
- validate_secrets,
65
+ update_connection_secrets,
68
66
  )
69
67
  from fides.common.api.scope_registry import (
70
68
  CONNECTION_CREATE_OR_UPDATE,
@@ -81,6 +79,7 @@ from fides.common.api.v1.urn_registry import (
81
79
  SYSTEM_CONNECTIONS,
82
80
  V1_URL_PREFIX,
83
81
  )
82
+ from fides.service.connection.connection_service import ConnectionService
84
83
  from fides.service.system.system_service import SystemService
85
84
 
86
85
  SYSTEM_ROUTER = APIRouter(tags=["System"], prefix=f"{V1_URL_PREFIX}/system")
@@ -160,6 +159,7 @@ def patch_connection_secrets(
160
159
  db: Session = Depends(deps.get_db),
161
160
  unvalidated_secrets: connection_secrets_schemas,
162
161
  verify: Optional[bool] = True,
162
+ connection_service: ConnectionService = Depends(get_connection_service),
163
163
  ) -> TestStatusMessage:
164
164
  """
165
165
  Patch secrets that will be used to connect to a specified connection_type.
@@ -169,45 +169,13 @@ def patch_connection_secrets(
169
169
  """
170
170
 
171
171
  system = get_system(db, fides_key)
172
- connection_config: ConnectionConfig = get_connection_config_or_error(
173
- db, system.connection_configs.key
172
+ return update_connection_secrets(
173
+ connection_service,
174
+ system.connection_configs.key,
175
+ unvalidated_secrets,
176
+ verify,
177
+ merge_with_existing=True,
174
178
  )
175
- # Inserts unchanged sensitive values. The FE does not send masked values sensitive secrets.
176
- if connection_config.secrets is not None:
177
- for key, value in connection_config.secrets.items():
178
- if key not in unvalidated_secrets:
179
- # unvalidated_secrets is actually a dictionary here. connection_secrets_schemas
180
- # are just provided for documentation but the data was not parsed up front.
181
- # That happens below in validate_secrets.
182
- unvalidated_secrets[key] = value # type: ignore
183
- else:
184
- connection_config.secrets = {}
185
-
186
- validated_secrets = validate_secrets(
187
- db, unvalidated_secrets, connection_config
188
- ).model_dump(mode="json")
189
-
190
- for key, value in validated_secrets.items():
191
- connection_config.secrets[key] = value # type: ignore
192
-
193
- # Deauthorize an OAuth connection when the secrets are updated. This is necessary because
194
- # the existing access tokens may not be valid anymore. This only applies to SaaS connection
195
- # configurations that use the "oauth2_authorization_code" authentication strategy.
196
- if (
197
- connection_config.authorized
198
- and connection_config.connection_type == ConnectionType.saas
199
- ):
200
- del connection_config.secrets["access_token"]
201
-
202
- # Save validated secrets, regardless of whether they've been verified.
203
- logger.info("Updating connection config secrets for '{}'", connection_config.key)
204
- connection_config.save(db=db)
205
-
206
- msg = f"Secrets updated for ConnectionConfig with key: {connection_config.key}."
207
- if verify:
208
- return connection_status(connection_config, msg, db)
209
-
210
- return TestStatusMessage(msg=msg, test_status=None)
211
179
 
212
180
 
213
181
  @SYSTEM_CONNECTIONS_ROUTER.delete(
@@ -36,7 +36,7 @@ from fides.api.models.fides_user import FidesUser
36
36
  from fides.api.models.fides_user_invite import FidesUserInvite
37
37
  from fides.api.models.fides_user_permissions import FidesUserPermissions
38
38
  from fides.api.models.sql_models import System # type: ignore[attr-defined]
39
- from fides.api.oauth.roles import APPROVER, VIEWER
39
+ from fides.api.oauth.roles import APPROVER, EXTERNAL_RESPONDENT, VIEWER
40
40
  from fides.api.oauth.utils import (
41
41
  create_temporary_user_for_login_flow,
42
42
  extract_payload,
@@ -608,6 +608,7 @@ def get_users(
608
608
  db: Session = Depends(get_db),
609
609
  params: Params = Depends(),
610
610
  username: Optional[str] = None,
611
+ include_external: bool = True,
611
612
  client: ClientDetail = Security(verify_user_read_scopes),
612
613
  authorization: str = Security(oauth2_scheme),
613
614
  ) -> AbstractPage[FidesUser]:
@@ -625,6 +626,12 @@ def get_users(
625
626
  # User has USER_READ scope, can see all users
626
627
  if username:
627
628
  query = query.filter(FidesUser.username.ilike(f"%{escape_like(username)}%"))
629
+
630
+ # Filter out external respondents if include_external is False
631
+ if not include_external:
632
+ query = query.join(FidesUserPermissions).filter(
633
+ ~FidesUserPermissions.roles.op("@>")([EXTERNAL_RESPONDENT])
634
+ )
628
635
  else:
629
636
  # User has USER_READ_OWN scope, only show their own data
630
637
  query = query.filter(FidesUser.id == client.user_id)
fides/api/app_setup.py CHANGED
@@ -39,9 +39,6 @@ from fides.api.oauth.system_manager_oauth_util import (
39
39
  verify_oauth_client_for_system_from_request_body_cli,
40
40
  )
41
41
  from fides.api.oauth.utils import get_root_client, verify_oauth_client_prod
42
- from fides.api.service.connectors.saas.connector_registry_service import (
43
- update_saas_configs,
44
- )
45
42
 
46
43
  # pylint: disable=wildcard-import, unused-wildcard-import
47
44
  from fides.api.service.saas_request.override_implementations import *
@@ -55,6 +52,7 @@ from fides.api.util.rate_limit import (
55
52
  fides_limiter,
56
53
  is_rate_limit_enabled,
57
54
  )
55
+ from fides.api.util.saas_config_updater import update_saas_configs
58
56
  from fides.config import CONFIG
59
57
  from fides.config.config_proxy import ConfigProxy
60
58
 
@@ -406,3 +406,7 @@ class MonitorConfigNotFoundException(BaseException):
406
406
 
407
407
  class MissingNamespaceSchemaException(BaseException):
408
408
  """Attempting to use namespace fides_meta without specifying the schema to validate it."""
409
+
410
+
411
+ class ConnectionNotFoundException(BaseException):
412
+ """ConnectionConfig could not be found"""
@@ -9,6 +9,7 @@ from fides.api.email_templates.template_names import (
9
9
  CONSENT_REQUEST_VERIFICATION_TEMPLATE,
10
10
  EMAIL_ERASURE_REQUEST_FULFILLMENT,
11
11
  EXTERNAL_USER_WELCOME,
12
+ MANUAL_TASK_DIGEST,
12
13
  PRIVACY_REQUEST_COMPLETE_ACCESS_TEMPLATE,
13
14
  PRIVACY_REQUEST_COMPLETE_DELETION_TEMPLATE,
14
15
  PRIVACY_REQUEST_ERROR_NOTIFICATION_TEMPLATE,
@@ -59,6 +60,8 @@ def get_email_template( # pylint: disable=too-many-return-statements, too-many-
59
60
  return template_env.get_template(USER_INVITE)
60
61
  if action_type == MessagingActionType.EXTERNAL_USER_WELCOME:
61
62
  return template_env.get_template(EXTERNAL_USER_WELCOME)
63
+ if action_type == MessagingActionType.MANUAL_TASK_DIGEST:
64
+ return template_env.get_template(MANUAL_TASK_DIGEST)
62
65
 
63
66
  logger.error("No corresponding template linked to the {}", action_type)
64
67
  raise EmailTemplateUnhandledActionType(
@@ -11,3 +11,4 @@ PRIVACY_REQUEST_REVIEW_APPROVE_TEMPLATE = "privacy_request_review_approve.html"
11
11
  TEST_MESSAGE_TEMPLATE = "test_message.html"
12
12
  USER_INVITE = "user_invite.html"
13
13
  EXTERNAL_USER_WELCOME = "external_user_welcome.html"
14
+ MANUAL_TASK_DIGEST = "manual_task_digest.html"