mindroot 9.11.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 (415) hide show
  1. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  2. mindroot/docs/Makefile +20 -0
  3. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  4. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  5. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  6. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  7. mindroot/docs/_build/doctrees/index.doctree +0 -0
  8. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  9. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  10. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  11. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  12. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  13. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  14. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  44. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  45. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  46. mindroot/docs/_build/html/.buildinfo +4 -0
  47. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  48. mindroot/docs/_build/html/_images/envvar.png +0 -0
  49. mindroot/docs/_build/html/_images/files.png +0 -0
  50. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  51. mindroot/docs/_build/html/_images/mood.png +0 -0
  52. mindroot/docs/_build/html/_images/moon.png +0 -0
  53. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  54. mindroot/docs/_build/html/_images/restart.png +0 -0
  55. mindroot/docs/_build/html/_modules/index.html +425 -0
  56. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  57. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  152. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  153. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  182. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  183. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  184. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  185. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  186. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  188. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  189. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  190. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  191. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  192. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  193. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  194. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  195. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  196. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  197. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  198. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  199. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  226. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  227. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  228. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  229. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  230. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  231. mindroot/docs/_build/html/_static/basic.css +906 -0
  232. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  233. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  234. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  250. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  251. mindroot/docs/_build/html/_static/custom.css +19 -0
  252. mindroot/docs/_build/html/_static/debug.css +69 -0
  253. mindroot/docs/_build/html/_static/doctools.js +149 -0
  254. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  255. mindroot/docs/_build/html/_static/file.png +0 -0
  256. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  257. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  272. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  273. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  280. mindroot/docs/_build/html/_static/jquery.js +2 -0
  281. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  282. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  283. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  284. mindroot/docs/_build/html/_static/language_data.js +192 -0
  285. mindroot/docs/_build/html/_static/minus.png +0 -0
  286. mindroot/docs/_build/html/_static/plus.png +0 -0
  287. mindroot/docs/_build/html/_static/pygments.css +232 -0
  288. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  289. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  290. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  292. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  293. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  294. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  295. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  296. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  297. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  298. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  299. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  300. mindroot/docs/_build/html/developer_documentation.html +338 -0
  301. mindroot/docs/_build/html/genindex.html +4690 -0
  302. mindroot/docs/_build/html/getting_started.html +423 -0
  303. mindroot/docs/_build/html/index.html +357 -0
  304. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  305. mindroot/docs/_build/html/installation.html +330 -0
  306. mindroot/docs/_build/html/llm_api_key.html +337 -0
  307. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  308. mindroot/docs/_build/html/objects.inv +0 -0
  309. mindroot/docs/_build/html/programming_task.html +326 -0
  310. mindroot/docs/_build/html/py-modindex.html +1307 -0
  311. mindroot/docs/_build/html/search.html +307 -0
  312. mindroot/docs/_build/html/searchindex.js +1 -0
  313. mindroot/docs/_build/html/source/ahp.html +302 -0
  314. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  315. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  334. mindroot/docs/_build/html/source/mindroot.html +811 -0
  335. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  336. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  341. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  342. mindroot/docs/_build/html/source/modules.html +377 -0
  343. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  344. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  345. mindroot/docs/_build/html/user_documentation.html +333 -0
  346. mindroot/docs/_static/custom.css +19 -0
  347. mindroot/docs/chat_with_assistant.rst +14 -0
  348. mindroot/docs/conf.py +54 -0
  349. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  350. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  351. mindroot/docs/data/equivalent_flags.json +1 -0
  352. mindroot/docs/data/mcp/servers.json +9 -0
  353. mindroot/docs/data/models.json +57 -0
  354. mindroot/docs/data/plugin_manifest.json +95 -0
  355. mindroot/docs/data/preferred_models.json +12 -0
  356. mindroot/docs/data/providers.json +62 -0
  357. mindroot/docs/developer_documentation.rst +26 -0
  358. mindroot/docs/envvar.png +0 -0
  359. mindroot/docs/files.png +0 -0
  360. mindroot/docs/getting_started.rst +139 -0
  361. mindroot/docs/index.rst +38 -0
  362. mindroot/docs/install_plugins_with_tools.rst +25 -0
  363. mindroot/docs/installation.rst +21 -0
  364. mindroot/docs/installopenrouter.png +0 -0
  365. mindroot/docs/llm_api_key.rst +22 -0
  366. mindroot/docs/llm_plugin_installation.rst +27 -0
  367. mindroot/docs/make.bat +35 -0
  368. mindroot/docs/mood.png +0 -0
  369. mindroot/docs/moon.png +0 -0
  370. mindroot/docs/openrouter.png +0 -0
  371. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  372. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  373. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  374. mindroot/docs/programming_task.rst +10 -0
  375. mindroot/docs/restart.png +0 -0
  376. mindroot/docs/source/ahp.rst +7 -0
  377. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  378. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  379. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  380. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  381. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  382. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  383. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  384. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  385. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  386. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  387. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  388. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  389. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  390. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  391. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  392. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  393. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  394. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  395. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  396. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  397. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  398. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  399. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  400. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  401. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  402. mindroot/docs/source/mindroot.lib.rst +152 -0
  403. mindroot/docs/source/mindroot.registry.rst +29 -0
  404. mindroot/docs/source/mindroot.rst +54 -0
  405. mindroot/docs/source/modules.rst +7 -0
  406. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  407. mindroot/docs/starting_mindroot.rst +12 -0
  408. mindroot/docs/user_documentation.rst +16 -0
  409. mindroot/server.py +10 -1
  410. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/METADATA +1 -1
  411. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/RECORD +415 -8
  412. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/WHEEL +0 -0
  413. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/entry_points.txt +0 -0
  414. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/licenses/LICENSE +0 -0
  415. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,400 @@
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.jwt_auth.middleware &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
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
43
+ <ul>
44
+ <li class="toctree-l1"><a class="reference internal" href="../../../../getting_started.html">Getting Started</a></li>
45
+ </ul>
46
+
47
+ </div>
48
+ </div>
49
+ </nav>
50
+
51
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
52
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
53
+ <a href="../../../../index.html">MindRoot</a>
54
+ </nav>
55
+
56
+ <div class="wy-nav-content">
57
+ <div class="rst-content">
58
+ <div role="navigation" aria-label="Page navigation">
59
+ <ul class="wy-breadcrumbs">
60
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
61
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
62
+ <li class="breadcrumb-item active">mindroot.coreplugins.jwt_auth.middleware</li>
63
+ <li class="wy-breadcrumbs-aside">
64
+ </li>
65
+ </ul>
66
+ <hr/>
67
+ </div>
68
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
69
+ <div itemprop="articleBody">
70
+
71
+ <h1>Source code for mindroot.coreplugins.jwt_auth.middleware</h1><div class="highlight"><pre>
72
+ <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">Request</span><span class="p">,</span> <span class="n">HTTPException</span>
73
+ <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">JSONResponse</span><span class="p">,</span> <span class="n">RedirectResponse</span>
74
+ <span class="kn">from</span><span class="w"> </span><span class="nn">fastapi.security</span><span class="w"> </span><span class="kn">import</span> <span class="n">HTTPBearer</span><span class="p">,</span> <span class="n">HTTPAuthorizationCredentials</span>
75
+ <span class="kn">import</span><span class="w"> </span><span class="nn">jwt</span>
76
+ <span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
77
+ <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_routes</span><span class="p">,</span> <span class="n">public_route</span><span class="p">,</span> <span class="n">public_static</span>
78
+ <span class="kn">from</span><span class="w"> </span><span class="nn">coreplugins.api_keys</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_key_manager</span>
79
+ <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>
80
+ <span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
81
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.session_files</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_session_data</span>
82
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.utils.debug</span><span class="w"> </span><span class="kn">import</span> <span class="n">debug_box</span>
83
+ <span class="kn">import</span><span class="w"> </span><span class="nn">secrets</span>
84
+ <span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
85
+ <span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
86
+
87
+ <div class="viewcode-block" id="get_or_create_jwt_secret">
88
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.jwt_auth.html#mindroot.coreplugins.jwt_auth.middleware.get_or_create_jwt_secret">[docs]</a>
89
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_or_create_jwt_secret</span><span class="p">():</span>
90
+ <span class="n">secret_key</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;JWT_SECRET_KEY&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
91
+
92
+ <span class="k">if</span> <span class="n">secret_key</span><span class="p">:</span>
93
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;JWT_SECRET_KEY found in environment variables&quot;</span><span class="p">)</span>
94
+ <span class="k">return</span> <span class="n">secret_key</span>
95
+
96
+ <span class="c1"># Check if .env file exists and contains JWT_SECRET_KEY</span>
97
+ <span class="n">env_path</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="s2">&quot;.env&quot;</span>
98
+
99
+ <span class="k">if</span> <span class="n">env_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
100
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">env_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>
101
+ <span class="n">lines</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
102
+ <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
103
+ <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;JWT_SECRET_KEY=&#39;</span><span class="p">):</span>
104
+ <span class="c1"># Extract the key value</span>
105
+ <span class="n">key_value</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
106
+ <span class="k">if</span> <span class="n">key_value</span><span class="p">:</span>
107
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;JWT_SECRET_KEY found in </span><span class="si">{</span><span class="n">env_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
108
+ <span class="c1"># Also set it in environment for current session</span>
109
+ <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;JWT_SECRET_KEY&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">key_value</span>
110
+ <span class="k">return</span> <span class="n">key_value</span>
111
+
112
+ <span class="c1"># If we get here, no key was found anywhere, so generate one</span>
113
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;JWT_SECRET_KEY not found, generating new key...&quot;</span><span class="p">)</span>
114
+ <span class="n">secret_key</span> <span class="o">=</span> <span class="n">secrets</span><span class="o">.</span><span class="n">token_urlsafe</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span>
115
+
116
+ <span class="c1"># Save to .env file</span>
117
+ <span class="c1"># Check if file exists and needs a newline before appending</span>
118
+ <span class="n">needs_newline</span> <span class="o">=</span> <span class="kc">False</span>
119
+ <span class="k">if</span> <span class="n">env_path</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="ow">and</span> <span class="n">env_path</span><span class="o">.</span><span class="n">stat</span><span class="p">()</span><span class="o">.</span><span class="n">st_size</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
120
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">env_path</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
121
+ <span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1"># Go to last byte</span>
122
+ <span class="n">last_char</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="mi">1</span><span class="p">)</span>
123
+ <span class="n">needs_newline</span> <span class="o">=</span> <span class="n">last_char</span> <span class="o">!=</span> <span class="sa">b</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
124
+
125
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">env_path</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
126
+ <span class="k">if</span> <span class="n">needs_newline</span><span class="p">:</span>
127
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
128
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;JWT_SECRET_KEY=</span><span class="si">{</span><span class="n">secret_key</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
129
+
130
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Generated new JWT_SECRET_KEY and saved to </span><span class="si">{</span><span class="n">env_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
131
+ <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;JWT_SECRET_KEY&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">secret_key</span>
132
+
133
+ <span class="k">return</span> <span class="n">secret_key</span></div>
134
+
135
+
136
+ <span class="c1"># Get or create the secret key</span>
137
+ <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="n">get_or_create_jwt_secret</span><span class="p">()</span>
138
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;JWT_SECRET_KEY loaded successfully&quot;</span><span class="p">)</span>
139
+
140
+ <span class="n">ALGORITHM</span> <span class="o">=</span> <span class="s2">&quot;HS256&quot;</span>
141
+ <span class="n">ACCESS_TOKEN_EXPIRE_MINUTES</span> <span class="o">=</span> <span class="mi">10080</span> <span class="c1"># 1 week</span>
142
+
143
+ <span class="n">security</span> <span class="o">=</span> <span class="n">HTTPBearer</span><span class="p">()</span>
144
+
145
+ <div class="viewcode-block" id="create_access_token">
146
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.jwt_auth.html#mindroot.coreplugins.jwt_auth.middleware.create_access_token">[docs]</a>
147
+ <span class="k">def</span><span class="w"> </span><span class="nf">create_access_token</span><span class="p">(</span><span class="n">data</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
148
+ <span class="n">to_encode</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
149
+ <span class="n">expire</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">minutes</span><span class="o">=</span><span class="n">ACCESS_TOKEN_EXPIRE_MINUTES</span><span class="p">)</span>
150
+ <span class="n">to_encode</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;exp&quot;</span><span class="p">:</span> <span class="n">expire</span><span class="p">})</span>
151
+ <span class="n">encoded_jwt</span> <span class="o">=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">to_encode</span><span class="p">,</span> <span class="n">SECRET_KEY</span><span class="p">,</span> <span class="n">algorithm</span><span class="o">=</span><span class="n">ALGORITHM</span><span class="p">)</span>
152
+ <span class="k">return</span> <span class="n">encoded_jwt</span></div>
153
+
154
+
155
+ <div class="viewcode-block" id="decode_token">
156
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.jwt_auth.html#mindroot.coreplugins.jwt_auth.middleware.decode_token">[docs]</a>
157
+ <span class="k">def</span><span class="w"> </span><span class="nf">decode_token</span><span class="p">(</span><span class="n">token</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
158
+ <span class="k">try</span><span class="p">:</span>
159
+ <span class="n">payload</span> <span class="o">=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">SECRET_KEY</span><span class="p">,</span> <span class="n">algorithms</span><span class="o">=</span><span class="p">[</span><span class="n">ALGORITHM</span><span class="p">])</span>
160
+ <span class="k">return</span> <span class="n">payload</span>
161
+ <span class="k">except</span> <span class="n">jwt</span><span class="o">.</span><span class="n">ExpiredSignatureError</span><span class="p">:</span>
162
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Token has expired&quot;</span><span class="p">)</span>
163
+ <span class="k">return</span> <span class="kc">False</span>
164
+ <span class="k">except</span> <span class="n">jwt</span><span class="o">.</span><span class="n">InvalidTokenError</span><span class="p">:</span>
165
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Invalid token&quot;</span><span class="p">)</span>
166
+ <span class="k">return</span> <span class="kc">False</span></div>
167
+
168
+
169
+ <div class="viewcode-block" id="path_matches_pattern">
170
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.jwt_auth.html#mindroot.coreplugins.jwt_auth.middleware.path_matches_pattern">[docs]</a>
171
+ <span class="k">def</span><span class="w"> </span><span class="nf">path_matches_pattern</span><span class="p">(</span><span class="n">request_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">route_pattern</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>
172
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
173
+ <span class="sd"> Check if a request path matches a route pattern with parameters.</span>
174
+ <span class="sd"> </span>
175
+ <span class="sd"> Examples:</span>
176
+ <span class="sd"> - path_matches_pattern(&#39;/chat/embed/abc123&#39;, &#39;/chat/embed/{token}&#39;) -&gt; True</span>
177
+ <span class="sd"> - path_matches_pattern(&#39;/chat/widget/xyz/session&#39;, &#39;/chat/widget/{token}/session&#39;) -&gt; True</span>
178
+ <span class="sd"> - path_matches_pattern(&#39;/login&#39;, &#39;/login&#39;) -&gt; True</span>
179
+ <span class="sd"> &quot;&quot;&quot;</span>
180
+ <span class="c1"># Handle exact matches first</span>
181
+ <span class="k">if</span> <span class="n">request_path</span> <span class="o">==</span> <span class="n">route_pattern</span><span class="p">:</span>
182
+ <span class="k">return</span> <span class="kc">True</span>
183
+
184
+ <span class="c1"># Convert FastAPI route pattern to regex</span>
185
+ <span class="c1"># Replace {param} with regex pattern that matches any non-slash characters</span>
186
+ <span class="n">regex_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;\{[^}]+\}&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;[^/]+&#39;</span><span class="p">,</span> <span class="n">route_pattern</span><span class="p">)</span>
187
+ <span class="c1"># Escape other regex special characters</span>
188
+ <span class="n">regex_pattern</span> <span class="o">=</span> <span class="n">regex_pattern</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;</span><span class="se">\\</span><span class="s1">.&#39;</span><span class="p">)</span>
189
+ <span class="c1"># Add start and end anchors</span>
190
+ <span class="n">regex_pattern</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;^</span><span class="si">{</span><span class="n">regex_pattern</span><span class="si">}</span><span class="s1">$&#39;</span>
191
+
192
+ <span class="k">try</span><span class="p">:</span>
193
+ <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">regex_pattern</span><span class="p">,</span> <span class="n">request_path</span><span class="p">))</span>
194
+ <span class="k">except</span> <span class="n">re</span><span class="o">.</span><span class="n">error</span><span class="p">:</span>
195
+ <span class="c1"># If regex compilation fails, fall back to exact match</span>
196
+ <span class="k">return</span> <span class="n">request_path</span> <span class="o">==</span> <span class="n">route_pattern</span></div>
197
+
198
+
199
+ <div class="viewcode-block" id="is_public_route">
200
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.jwt_auth.html#mindroot.coreplugins.jwt_auth.middleware.is_public_route">[docs]</a>
201
+ <span class="k">def</span><span class="w"> </span><span class="nf">is_public_route</span><span class="p">(</span><span class="n">request_path</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>
202
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
203
+ <span class="sd"> Check if a request path matches any registered public route pattern.</span>
204
+ <span class="sd"> &quot;&quot;&quot;</span>
205
+ <span class="c1"># Check exact matches and pattern matches</span>
206
+ <span class="k">for</span> <span class="n">route_pattern</span> <span class="ow">in</span> <span class="n">public_routes</span><span class="p">:</span>
207
+ <span class="k">if</span> <span class="n">path_matches_pattern</span><span class="p">(</span><span class="n">request_path</span><span class="p">,</span> <span class="n">route_pattern</span><span class="p">):</span>
208
+ <span class="k">return</span> <span class="kc">True</span>
209
+
210
+ <span class="c1"># Check special cases</span>
211
+ <span class="k">if</span> <span class="n">request_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;/reset-password&#39;</span><span class="p">):</span>
212
+ <span class="k">return</span> <span class="kc">True</span>
213
+
214
+ <span class="k">return</span> <span class="kc">False</span></div>
215
+
216
+
217
+ <div class="viewcode-block" id="middleware">
218
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.jwt_auth.html#mindroot.coreplugins.jwt_auth.middleware.middleware">[docs]</a>
219
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">middleware</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">call_next</span><span class="p">):</span>
220
+ <span class="k">try</span><span class="p">:</span>
221
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;-------------------------- auth middleware ----------------------------&#39;</span><span class="p">)</span>
222
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Request URL:&#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
223
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;events&#39;</span><span class="p">):</span>
224
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;events:&quot;</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
225
+
226
+ <span class="c1"># Check for API key in query parameters</span>
227
+ <span class="n">api_key</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;api_key&#39;</span><span class="p">)</span>
228
+ <span class="k">if</span> <span class="n">api_key</span><span class="p">:</span>
229
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Found API key in query parameters&#39;</span><span class="p">)</span>
230
+ <span class="n">key_data</span> <span class="o">=</span> <span class="n">api_key_manager</span><span class="o">.</span><span class="n">validate_key</span><span class="p">(</span><span class="n">api_key</span><span class="p">)</span>
231
+ <span class="k">if</span> <span class="n">key_data</span><span class="p">:</span>
232
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Validated API Key, key_data is&quot;</span><span class="p">,</span> <span class="n">key_data</span><span class="p">)</span>
233
+ <span class="n">username</span> <span class="o">=</span> <span class="n">key_data</span><span class="p">[</span><span class="s1">&#39;username&#39;</span><span class="p">]</span>
234
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to get user data&quot;</span><span class="p">)</span>
235
+ <span class="n">user_data</span> <span class="o">=</span> <span class="k">await</span> <span class="n">service_manager</span><span class="o">.</span><span class="n">get_user_data</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
236
+
237
+ <span class="k">if</span> <span class="n">user_data</span><span class="p">:</span>
238
+ <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user_data</span>
239
+ <span class="c1"># Create JWT token for persistent session</span>
240
+ <span class="n">token</span> <span class="o">=</span> <span class="n">create_access_token</span><span class="p">({</span><span class="s2">&quot;sub&quot;</span><span class="p">:</span> <span class="n">username</span><span class="p">})</span>
241
+ <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">access_token</span> <span class="o">=</span> <span class="n">token</span>
242
+ <span class="c1"># Get response and set cookie</span>
243
+ <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
244
+ <span class="k">return</span> <span class="n">response</span>
245
+ <span class="k">else</span><span class="p">:</span>
246
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;User </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2"> for key </span><span class="si">{</span><span class="n">api_key</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
247
+ <span class="k">return</span> <span class="n">JSONResponse</span><span class="p">(</span>
248
+ <span class="n">status_code</span><span class="o">=</span><span class="mi">403</span><span class="p">,</span>
249
+ <span class="n">content</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;detail&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;User &#39;</span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">&#39; for API key </span><span class="si">{</span><span class="n">api_key</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">}</span>
250
+ <span class="p">)</span>
251
+ <span class="k">else</span><span class="p">:</span>
252
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Could not validate API key, key_data returned as&quot;</span><span class="p">,</span> <span class="n">key_data</span><span class="p">)</span>
253
+ <span class="k">return</span> <span class="n">JSONResponse</span><span class="p">(</span>
254
+ <span class="n">status_code</span><span class="o">=</span><span class="mi">403</span><span class="p">,</span>
255
+ <span class="n">content</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;detail&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid API key&quot;</span><span class="p">}</span>
256
+ <span class="p">)</span>
257
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;/imgs/&quot;</span><span class="p">):</span>
258
+ <span class="k">return</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
259
+ <span class="k">try</span><span class="p">:</span>
260
+ <span class="n">path_parts</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
261
+ <span class="c1"># filter empty &quot;&quot; strings</span>
262
+ <span class="n">path_parts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">path_parts</span><span class="p">))</span>
263
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Request path split is </span><span class="si">{</span><span class="n">path_parts</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
264
+ <span class="n">plugin_name</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
265
+ <span class="n">static_part</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
266
+ <span class="n">filename</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
267
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Checking for static file: </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">static_part</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
268
+ <span class="k">if</span> <span class="n">static_part</span> <span class="o">==</span> <span class="s1">&#39;static&#39;</span><span class="p">:</span>
269
+ <span class="k">if</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.js&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.css&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.png&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.mp4&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.gif&#39;</span><span class="p">):</span>
270
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Static file requested:&#39;</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
271
+ <span class="k">return</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
272
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
273
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error checking for static file&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
274
+ <span class="k">pass</span>
275
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Did not find static file&quot;</span><span class="p">)</span>
276
+
277
+ <span class="c1"># Use the improved public route checking</span>
278
+ <span class="k">if</span> <span class="n">is_public_route</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="p">):</span>
279
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Public route: &#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
280
+ <span class="k">return</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
281
+ <span class="k">elif</span> <span class="nb">any</span><span class="p">([</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">public_static</span><span class="p">]):</span>
282
+ <span class="k">return</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
283
+ <span class="k">else</span><span class="p">:</span>
284
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Not a public route: &#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
285
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;public routes:&quot;</span><span class="p">,</span> <span class="n">public_routes</span><span class="p">)</span>
286
+
287
+ <span class="c1"># Check for token in cookies first</span>
288
+ <span class="n">token</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;access_token&quot;</span><span class="p">)</span>
289
+ <span class="c1">#token = None</span>
290
+ <span class="k">if</span> <span class="n">token</span><span class="p">:</span>
291
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to decode token..&quot;</span><span class="p">)</span>
292
+ <span class="n">payload</span> <span class="o">=</span> <span class="n">decode_token</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
293
+ <span class="k">if</span> <span class="n">payload</span><span class="p">:</span>
294
+ <span class="c1"># Get username from token</span>
295
+ <span class="n">username</span> <span class="o">=</span> <span class="n">payload</span><span class="p">[</span><span class="s1">&#39;sub&#39;</span><span class="p">]</span>
296
+
297
+ <span class="n">user_data</span> <span class="o">=</span> <span class="k">await</span> <span class="n">service_manager</span><span class="o">.</span><span class="n">get_user_data</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
298
+ <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user_data</span>
299
+ <span class="k">if</span> <span class="n">user_data</span><span class="p">:</span>
300
+ <span class="k">return</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
301
+ <span class="k">else</span><span class="p">:</span>
302
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;User data not found, redirecting to login..&quot;</span><span class="p">)</span>
303
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
304
+ <span class="k">else</span><span class="p">:</span>
305
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Invalid or expired token, redirecting to login..&quot;</span><span class="p">)</span>
306
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
307
+ <span class="k">else</span><span class="p">:</span>
308
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;..Did not find token in cookies..&quot;</span><span class="p">)</span>
309
+ <span class="k">try</span><span class="p">:</span>
310
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying bearer token..&quot;</span><span class="p">)</span>
311
+ <span class="n">token</span> <span class="o">=</span> <span class="k">await</span> <span class="n">security</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
312
+ <span class="k">except</span> <span class="n">HTTPException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
313
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Bearer header: No valid token found: &#39;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
314
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying session context..&quot;</span><span class="p">)</span>
315
+ <span class="k">try</span><span class="p">:</span>
316
+ <span class="n">session_id</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
317
+ <span class="n">token</span> <span class="o">=</span> <span class="k">await</span> <span class="n">load_session_data</span><span class="p">(</span><span class="n">session_id</span><span class="p">,</span> <span class="s2">&quot;access_token&quot;</span><span class="p">)</span>
318
+ <span class="k">if</span> <span class="n">token</span><span class="p">:</span>
319
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Retrieved token from session file&quot;</span><span class="p">)</span>
320
+ <span class="nb">print</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
321
+ <span class="k">else</span><span class="p">:</span>
322
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;No token found in session file&quot;</span><span class="p">)</span>
323
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
324
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error loading session data&quot;</span><span class="p">)</span>
325
+ <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
326
+
327
+ <span class="k">if</span> <span class="n">token</span><span class="p">:</span>
328
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="s1">&#39;credentials&#39;</span><span class="p">):</span>
329
+ <span class="n">payload</span> <span class="o">=</span> <span class="n">decode_token</span><span class="p">(</span><span class="n">token</span><span class="o">.</span><span class="n">credentials</span><span class="p">)</span>
330
+ <span class="k">else</span><span class="p">:</span>
331
+ <span class="n">payload</span> <span class="o">=</span> <span class="n">decode_token</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
332
+ <span class="k">if</span> <span class="n">payload</span><span class="p">:</span>
333
+ <span class="n">username</span> <span class="o">=</span> <span class="n">payload</span><span class="p">[</span><span class="s1">&#39;sub&#39;</span><span class="p">]</span>
334
+ <span class="n">user_data</span> <span class="o">=</span> <span class="k">await</span> <span class="n">service_manager</span><span class="o">.</span><span class="n">get_user_data</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
335
+
336
+ <span class="k">if</span> <span class="n">user_data</span><span class="p">:</span>
337
+ <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user_data</span>
338
+ <span class="k">return</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
339
+ <span class="k">else</span><span class="p">:</span>
340
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;User data not found, redirecting to login..&quot;</span><span class="p">)</span>
341
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
342
+ <span class="k">else</span><span class="p">:</span>
343
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Invalid or expired token, redirecting to login..&quot;</span><span class="p">)</span>
344
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
345
+
346
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;No valid token found&#39;</span><span class="p">)</span>
347
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
348
+
349
+ <span class="k">except</span> <span class="n">HTTPException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
350
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;HTTPException:&#39;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
351
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
352
+
353
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
354
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Error:&#39;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
355
+ <span class="k">if</span> <span class="s1">&#39;does not exist&#39;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">or</span> <span class="s1">&#39;not found&#39;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
356
+ <span class="k">return</span> <span class="n">JSONResponse</span><span class="p">(</span>
357
+ <span class="n">status_code</span><span class="o">=</span><span class="mi">404</span><span class="p">,</span>
358
+ <span class="n">content</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;detail&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Resource not found: </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>
359
+ <span class="p">)</span>
360
+
361
+ <span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
362
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
363
+ <span class="k">return</span> <span class="n">JSONResponse</span><span class="p">(</span>
364
+ <span class="n">status_code</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span>
365
+ <span class="n">content</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;detail&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Internal server error: </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>
366
+ <span class="p">)</span>
367
+
368
+ <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
369
+ <span class="k">return</span> <span class="n">response</span></div>
370
+
371
+ </pre></div>
372
+
373
+ </div>
374
+ </div>
375
+ <footer>
376
+
377
+ <hr/>
378
+
379
+ <div role="contentinfo">
380
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
381
+ </div>
382
+
383
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
384
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
385
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
386
+
387
+
388
+ </footer>
389
+ </div>
390
+ </div>
391
+ </section>
392
+ </div>
393
+ <script>
394
+ jQuery(function () {
395
+ SphinxRtdTheme.Navigation.enable(true);
396
+ });
397
+ </script>
398
+
399
+ </body>
400
+ </html>