mindroot 9.10.0__py3-none-any.whl → 9.12.0__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 mindroot might be problematic. Click here for more details.

Files changed (418) hide show
  1. mindroot/__init__.py +1 -0
  2. mindroot/coreplugins/__init__.py +2 -0
  3. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  4. mindroot/docs/Makefile +20 -0
  5. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  6. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  7. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  8. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  9. mindroot/docs/_build/doctrees/index.doctree +0 -0
  10. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  11. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  12. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  13. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  14. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  44. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  45. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  46. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  47. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  48. mindroot/docs/_build/html/.buildinfo +4 -0
  49. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  50. mindroot/docs/_build/html/_images/envvar.png +0 -0
  51. mindroot/docs/_build/html/_images/files.png +0 -0
  52. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  53. mindroot/docs/_build/html/_images/mood.png +0 -0
  54. mindroot/docs/_build/html/_images/moon.png +0 -0
  55. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  56. mindroot/docs/_build/html/_images/restart.png +0 -0
  57. mindroot/docs/_build/html/_modules/index.html +425 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  152. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  153. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  182. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  183. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  184. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  185. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  186. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  188. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  189. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  190. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  191. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  192. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  193. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  194. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  195. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  196. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  197. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  198. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  199. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  226. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  227. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  228. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  229. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  230. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  231. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  232. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  233. mindroot/docs/_build/html/_static/basic.css +906 -0
  234. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  250. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  251. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  252. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  253. mindroot/docs/_build/html/_static/custom.css +19 -0
  254. mindroot/docs/_build/html/_static/debug.css +69 -0
  255. mindroot/docs/_build/html/_static/doctools.js +149 -0
  256. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  257. mindroot/docs/_build/html/_static/file.png +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  272. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  273. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  280. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  281. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  282. mindroot/docs/_build/html/_static/jquery.js +2 -0
  283. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  284. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  285. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  286. mindroot/docs/_build/html/_static/language_data.js +192 -0
  287. mindroot/docs/_build/html/_static/minus.png +0 -0
  288. mindroot/docs/_build/html/_static/plus.png +0 -0
  289. mindroot/docs/_build/html/_static/pygments.css +232 -0
  290. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  292. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  293. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  294. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  295. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  296. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  297. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  298. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  299. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  300. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  301. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  302. mindroot/docs/_build/html/developer_documentation.html +338 -0
  303. mindroot/docs/_build/html/genindex.html +4690 -0
  304. mindroot/docs/_build/html/getting_started.html +423 -0
  305. mindroot/docs/_build/html/index.html +357 -0
  306. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  307. mindroot/docs/_build/html/installation.html +330 -0
  308. mindroot/docs/_build/html/llm_api_key.html +337 -0
  309. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  310. mindroot/docs/_build/html/objects.inv +0 -0
  311. mindroot/docs/_build/html/programming_task.html +326 -0
  312. mindroot/docs/_build/html/py-modindex.html +1307 -0
  313. mindroot/docs/_build/html/search.html +307 -0
  314. mindroot/docs/_build/html/searchindex.js +1 -0
  315. mindroot/docs/_build/html/source/ahp.html +302 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  334. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  335. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  336. mindroot/docs/_build/html/source/mindroot.html +811 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  341. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  342. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  343. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  344. mindroot/docs/_build/html/source/modules.html +377 -0
  345. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  346. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  347. mindroot/docs/_build/html/user_documentation.html +333 -0
  348. mindroot/docs/_static/custom.css +19 -0
  349. mindroot/docs/chat_with_assistant.rst +14 -0
  350. mindroot/docs/conf.py +54 -0
  351. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  352. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  353. mindroot/docs/data/equivalent_flags.json +1 -0
  354. mindroot/docs/data/mcp/servers.json +9 -0
  355. mindroot/docs/data/models.json +57 -0
  356. mindroot/docs/data/plugin_manifest.json +95 -0
  357. mindroot/docs/data/preferred_models.json +12 -0
  358. mindroot/docs/data/providers.json +62 -0
  359. mindroot/docs/developer_documentation.rst +26 -0
  360. mindroot/docs/envvar.png +0 -0
  361. mindroot/docs/files.png +0 -0
  362. mindroot/docs/getting_started.rst +139 -0
  363. mindroot/docs/index.rst +38 -0
  364. mindroot/docs/install_plugins_with_tools.rst +25 -0
  365. mindroot/docs/installation.rst +21 -0
  366. mindroot/docs/installopenrouter.png +0 -0
  367. mindroot/docs/llm_api_key.rst +22 -0
  368. mindroot/docs/llm_plugin_installation.rst +27 -0
  369. mindroot/docs/make.bat +35 -0
  370. mindroot/docs/mood.png +0 -0
  371. mindroot/docs/moon.png +0 -0
  372. mindroot/docs/openrouter.png +0 -0
  373. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  374. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  375. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  376. mindroot/docs/programming_task.rst +10 -0
  377. mindroot/docs/restart.png +0 -0
  378. mindroot/docs/source/ahp.rst +7 -0
  379. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  380. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  381. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  382. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  383. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  384. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  385. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  386. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  387. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  388. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  389. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  390. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  391. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  392. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  393. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  394. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  395. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  396. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  397. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  398. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  399. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  400. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  401. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  402. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  403. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  404. mindroot/docs/source/mindroot.lib.rst +152 -0
  405. mindroot/docs/source/mindroot.registry.rst +29 -0
  406. mindroot/docs/source/mindroot.rst +54 -0
  407. mindroot/docs/source/modules.rst +7 -0
  408. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  409. mindroot/docs/starting_mindroot.rst +12 -0
  410. mindroot/docs/user_documentation.rst +16 -0
  411. mindroot/lib/plugins/default_plugin_manifest.json +1 -1
  412. mindroot/server.py +10 -1
  413. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/METADATA +1 -1
  414. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/RECORD +418 -10
  415. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/WHEEL +0 -0
  416. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/entry_points.txt +0 -0
  417. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/licenses/LICENSE +0 -0
  418. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,183 @@
1
+
2
+
3
+ <!DOCTYPE html>
4
+ <html class="writer-html5" lang="en" data-content_root="../../../../">
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>mindroot.coreplugins.user_service.role_service &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <!-- Local TOC -->
43
+ <div class="local-toc"></div>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
+ <a href="../../../../index.html">MindRoot</a>
51
+ </nav>
52
+
53
+ <div class="wy-nav-content">
54
+ <div class="rst-content">
55
+ <div role="navigation" aria-label="Page navigation">
56
+ <ul class="wy-breadcrumbs">
57
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
59
+ <li class="breadcrumb-item active">mindroot.coreplugins.user_service.role_service</li>
60
+ <li class="wy-breadcrumbs-aside">
61
+ </li>
62
+ </ul>
63
+ <hr/>
64
+ </div>
65
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
+ <div itemprop="articleBody">
67
+
68
+ <h1>Source code for mindroot.coreplugins.user_service.role_service</h1><div class="highlight"><pre>
69
+ <span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
70
+ <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
71
+ <span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span>
72
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service</span>
73
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">UserAuth</span>
74
+
75
+ <div class="viewcode-block" id="has_role">
76
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.role_service.has_role">[docs]</a>
77
+ <span class="nd">@service</span><span class="p">()</span>
78
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">has_role</span><span class="p">(</span><span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">role</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">user_data_root</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
79
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Check if user has specified role&quot;&quot;&quot;</span>
80
+ <span class="n">auth_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="s2">&quot;auth.json&quot;</span><span class="p">)</span>
81
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">auth_file</span><span class="p">):</span>
82
+ <span class="k">return</span> <span class="kc">False</span>
83
+
84
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">auth_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
85
+ <span class="k">try</span><span class="p">:</span>
86
+ <span class="n">auth_data</span> <span class="o">=</span> <span class="n">UserAuth</span><span class="p">(</span><span class="o">**</span><span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
87
+ <span class="k">return</span> <span class="n">role</span> <span class="ow">in</span> <span class="n">auth_data</span><span class="o">.</span><span class="n">roles</span>
88
+ <span class="k">except</span><span class="p">:</span>
89
+ <span class="k">return</span> <span class="kc">False</span></div>
90
+
91
+
92
+ <div class="viewcode-block" id="add_role">
93
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.role_service.add_role">[docs]</a>
94
+ <span class="nd">@service</span><span class="p">()</span>
95
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">add_role</span><span class="p">(</span><span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">role</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">user_data_root</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
96
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a role to a user. Should be called only from admin context.&quot;&quot;&quot;</span>
97
+ <span class="n">auth_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="s2">&quot;auth.json&quot;</span><span class="p">)</span>
98
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">auth_file</span><span class="p">):</span>
99
+ <span class="k">return</span> <span class="kc">False</span>
100
+
101
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">auth_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
102
+ <span class="n">auth_data</span> <span class="o">=</span> <span class="n">UserAuth</span><span class="p">(</span><span class="o">**</span><span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
103
+
104
+ <span class="c1"># Add the role if it doesn&#39;t exist</span>
105
+ <span class="k">if</span> <span class="n">role</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">auth_data</span><span class="o">.</span><span class="n">roles</span><span class="p">:</span>
106
+ <span class="n">auth_data</span><span class="o">.</span><span class="n">roles</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">role</span><span class="p">)</span>
107
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">auth_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
108
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">auth_data</span><span class="o">.</span><span class="n">dict</span><span class="p">(),</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span>
109
+
110
+ <span class="k">return</span> <span class="kc">True</span></div>
111
+
112
+
113
+ <div class="viewcode-block" id="remove_role">
114
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.role_service.remove_role">[docs]</a>
115
+ <span class="nd">@service</span><span class="p">()</span>
116
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">remove_role</span><span class="p">(</span><span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">role</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">user_data_root</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
117
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a role from a user. Should be called only from admin context.&quot;&quot;&quot;</span>
118
+ <span class="k">if</span> <span class="n">role</span> <span class="o">==</span> <span class="s2">&quot;user&quot;</span><span class="p">:</span>
119
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Cannot remove &#39;user&#39; role&quot;</span><span class="p">)</span>
120
+
121
+ <span class="n">auth_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="s2">&quot;auth.json&quot;</span><span class="p">)</span>
122
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">auth_file</span><span class="p">):</span>
123
+ <span class="k">return</span> <span class="kc">False</span>
124
+
125
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">auth_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
126
+ <span class="n">auth_data</span> <span class="o">=</span> <span class="n">UserAuth</span><span class="p">(</span><span class="o">**</span><span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
127
+
128
+ <span class="c1"># Remove the role if it exists</span>
129
+ <span class="k">if</span> <span class="n">role</span> <span class="ow">in</span> <span class="n">auth_data</span><span class="o">.</span><span class="n">roles</span><span class="p">:</span>
130
+ <span class="n">auth_data</span><span class="o">.</span><span class="n">roles</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">role</span><span class="p">)</span>
131
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">auth_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
132
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">auth_data</span><span class="o">.</span><span class="n">dict</span><span class="p">(),</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span>
133
+
134
+ <span class="k">return</span> <span class="kc">True</span></div>
135
+
136
+
137
+ <div class="viewcode-block" id="get_user_roles">
138
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.role_service.get_user_roles">[docs]</a>
139
+ <span class="nd">@service</span><span class="p">()</span>
140
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_user_roles</span><span class="p">(</span><span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">user_data_root</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
141
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get all roles for a user&quot;&quot;&quot;</span>
142
+ <span class="n">auth_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="s2">&quot;auth.json&quot;</span><span class="p">)</span>
143
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">auth_file</span><span class="p">):</span>
144
+ <span class="k">return</span> <span class="nb">set</span><span class="p">()</span>
145
+
146
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">auth_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
147
+ <span class="k">try</span><span class="p">:</span>
148
+ <span class="n">auth_data</span> <span class="o">=</span> <span class="n">UserAuth</span><span class="p">(</span><span class="o">**</span><span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
149
+ <span class="k">return</span> <span class="n">auth_data</span><span class="o">.</span><span class="n">roles</span>
150
+ <span class="k">except</span><span class="p">:</span>
151
+ <span class="k">return</span> <span class="p">[</span><span class="s2">&quot;user&quot;</span><span class="p">]</span></div>
152
+
153
+
154
+ </pre></div>
155
+
156
+ </div>
157
+ </div>
158
+ <footer>
159
+
160
+ <hr/>
161
+
162
+ <div role="contentinfo">
163
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
164
+ </div>
165
+
166
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
167
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
168
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
169
+
170
+
171
+ </footer>
172
+ </div>
173
+ </div>
174
+ </section>
175
+ </div>
176
+ <script>
177
+ jQuery(function () {
178
+ SphinxRtdTheme.Navigation.enable(true);
179
+ });
180
+ </script>
181
+
182
+ </body>
183
+ </html>
@@ -0,0 +1,202 @@
1
+
2
+
3
+ <!DOCTYPE html>
4
+ <html class="writer-html5" lang="en" data-content_root="../../../../">
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>mindroot.coreplugins.user_service.router &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <!-- Local TOC -->
43
+ <div class="local-toc"></div>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
+ <a href="../../../../index.html">MindRoot</a>
51
+ </nav>
52
+
53
+ <div class="wy-nav-content">
54
+ <div class="rst-content">
55
+ <div role="navigation" aria-label="Page navigation">
56
+ <ul class="wy-breadcrumbs">
57
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
59
+ <li class="breadcrumb-item active">mindroot.coreplugins.user_service.router</li>
60
+ <li class="wy-breadcrumbs-aside">
61
+ </li>
62
+ </ul>
63
+ <hr/>
64
+ </div>
65
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
+ <div itemprop="articleBody">
67
+
68
+ <h1>Source code for mindroot.coreplugins.user_service.router</h1><div class="highlight"><pre>
69
+ <span></span><span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">APIRouter</span><span class="p">,</span> <span class="n">Request</span><span class="p">,</span> <span class="n">Form</span><span class="p">,</span> <span class="n">Depends</span>
70
+ <span class="kn">from</span><span class="w"> </span><span class="nn">fastapi.responses</span><span class="w"> </span><span class="kn">import</span> <span class="n">HTMLResponse</span><span class="p">,</span> <span class="n">RedirectResponse</span>
71
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.templates</span><span class="w"> </span><span class="kn">import</span> <span class="n">render</span>
72
+ <span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
73
+ <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
74
+ <span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
75
+ <span class="c1"># Import services directly to avoid coroutine-call confusion</span>
76
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.password_reset_service</span><span class="w"> </span><span class="kn">import</span> <span class="n">reset_password_with_token</span><span class="p">,</span> <span class="n">initiate_password_reset</span>
77
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service_manager</span>
78
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers</span><span class="w"> </span><span class="kn">import</span> <span class="n">ProviderManager</span>
79
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.route_decorators</span><span class="w"> </span><span class="kn">import</span> <span class="n">public_route</span>
80
+
81
+ <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
82
+ <span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">()</span>
83
+
84
+ <div class="viewcode-block" id="get_reset_password_form_by_file">
85
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.router.get_reset_password_form_by_file">[docs]</a>
86
+ <span class="nd">@public_route</span><span class="p">()</span>
87
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/reset-password/</span><span class="si">{filename}</span><span class="s2">&quot;</span><span class="p">)</span>
88
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_reset_password_form_by_file</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">filename</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
89
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Show password reset form if trigger file exists&quot;&quot;&quot;</span>
90
+ <span class="c1"># print the current working directory</span>
91
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Current working directory:&quot;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">())</span>
92
+ <span class="n">trigger_dir</span> <span class="o">=</span> <span class="s2">&quot;data/password_resets&quot;</span>
93
+ <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">trigger_dir</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
94
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;file path&quot;</span><span class="p">,</span> <span class="n">file_path</span><span class="p">)</span>
95
+
96
+ <span class="c1"># Validate filename format</span>
97
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">filename</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">isalnum</span><span class="p">():</span>
98
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
99
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid file format&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
100
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
101
+
102
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
103
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;2&#39;</span><span class="p">)</span>
104
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Reset file not found or expired&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
105
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
106
+
107
+ <span class="c1"># File exists and is actually a file, show the form</span>
108
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
109
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span></div>
110
+
111
+
112
+ <div class="viewcode-block" id="handle_reset_password_by_file">
113
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.router.handle_reset_password_by_file">[docs]</a>
114
+ <span class="nd">@public_route</span><span class="p">()</span>
115
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/reset-password/</span><span class="si">{filename}</span><span class="s2">&quot;</span><span class="p">)</span>
116
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">handle_reset_password_by_file</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">filename</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">password</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">),</span> <span class="n">confirm_password</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">),</span> <span class="n">services</span><span class="p">:</span> <span class="n">ProviderManager</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">service_manager</span><span class="p">)):</span>
117
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Handle password reset using trigger file&quot;&quot;&quot;</span>
118
+ <span class="n">trigger_dir</span> <span class="o">=</span> <span class="s2">&quot;data/password_resets&quot;</span>
119
+ <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">trigger_dir</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
120
+
121
+ <span class="c1"># Validate filename format</span>
122
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">filename</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">isalnum</span><span class="p">():</span>
123
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid file format&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
124
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
125
+
126
+ <span class="k">if</span> <span class="n">password</span> <span class="o">!=</span> <span class="n">confirm_password</span><span class="p">:</span>
127
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Passwords do not match.&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
128
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
129
+
130
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
131
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Reset file not found or expired.&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
132
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
133
+
134
+ <span class="k">try</span><span class="p">:</span>
135
+ <span class="c1"># Read the trigger file</span>
136
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
137
+ <span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
138
+
139
+ <span class="c1"># Parse the file content: &quot;username is_admin_reset&quot;</span>
140
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
141
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">:</span>
142
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid reset file format.&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
143
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
144
+
145
+ <span class="n">username</span><span class="p">,</span> <span class="n">is_admin_reset_str</span> <span class="o">=</span> <span class="n">parts</span>
146
+ <span class="n">is_admin_reset</span> <span class="o">=</span> <span class="n">is_admin_reset_str</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span>
147
+
148
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">username</span><span class="p">:</span>
149
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid reset file format.&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
150
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
151
+
152
+ <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Processing password reset for user: </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2"> from file: </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
153
+
154
+ <span class="c1"># Generate token and reset password</span>
155
+ <span class="n">token</span> <span class="o">=</span> <span class="k">await</span> <span class="n">initiate_password_reset</span><span class="p">(</span><span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span> <span class="n">is_admin_reset</span><span class="o">=</span><span class="n">is_admin_reset</span><span class="p">)</span>
156
+ <span class="n">success</span> <span class="o">=</span> <span class="k">await</span> <span class="n">reset_password_with_token</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">,</span> <span class="n">new_password</span><span class="o">=</span><span class="n">password</span><span class="p">)</span>
157
+
158
+ <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
159
+ <span class="c1"># Delete the trigger file</span>
160
+ <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
161
+ <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Successfully reset password for </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">, removed trigger file: </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
162
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
163
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
164
+ <span class="k">else</span><span class="p">:</span>
165
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;Password reset failed.&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
166
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span>
167
+
168
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
169
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error processing trigger file </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
170
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;reset_password&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;request&quot;</span><span class="p">:</span> <span class="n">request</span><span class="p">,</span> <span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error processing reset: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
171
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">html</span><span class="p">)</span></div>
172
+
173
+ </pre></div>
174
+
175
+ </div>
176
+ </div>
177
+ <footer>
178
+
179
+ <hr/>
180
+
181
+ <div role="contentinfo">
182
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
183
+ </div>
184
+
185
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
186
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
187
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
188
+
189
+
190
+ </footer>
191
+ </div>
192
+ </div>
193
+ </section>
194
+ </div>
195
+ <script>
196
+ jQuery(function () {
197
+ SphinxRtdTheme.Navigation.enable(true);
198
+ });
199
+ </script>
200
+
201
+ </body>
202
+ </html>