luci-base: dispatcher.uc: update uci session ID in Lua context
authorJo-Philipp Wich <jo@mein.io>
Thu, 27 Oct 2022 08:14:58 +0000 (10:14 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 27 Oct 2022 09:14:52 +0000 (11:14 +0200)
Make sure that the uci session ID of the `luci.model.uci` module within
the Lua context is updated once we acquire the login session information.

In case legacy themes are used, the probing of the theme header template
might indirectly load the Lua runtime and the Lua side `luci.dispatcher`
module which in turn will load the `luci.model.uci` and set the session
ID there which is not yet initialized at this point in time.

This results in broken uci change handling within legacy Lua applications
when a legacy theme is loaded.

Fixes: #6060
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/ucode/dispatcher.uc

index 1d10d7876d17c63eb2f3b9a6d32df31faafe35be..805abc4ce0130a97cb7a4ab617ecbf62ea2f411a 100644 (file)
@@ -925,6 +925,14 @@ dispatch = function(_http, path) {
                        resolved.ctx.authtoken ??= session.data?.token;
                        resolved.ctx.authuser ??= session.data?.username;
                        resolved.ctx.authacl ??= session.acls;
+
+                       /* In case the Lua runtime was already initialized, e.g. by probing legacy
+                        * theme header templates, make sure to update the session ID of the uci
+                        * module. */
+                       if (runtime.L) {
+                               runtime.L.invoke('require', 'luci.model.uci');
+                               runtime.L.get('luci', 'model', 'uci').invoke('set_session_id', session.sid);
+                       }
                }
 
                if (length(resolved.ctx.acls)) {