From 251e580e8ac3ec5824de97ab999c13e868da50b2 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 5 Aug 2025 23:15:13 +0300 Subject: [PATCH] add headers lua runtime support --- com/Auth/DeleteUnit.lua | 13 +++--- com/Auth/GetAccess.lua | 10 ++--- com/Auth/PutNewUnit.lua | 12 +++--- com/List.lua | 6 ++- internal/server/sv1/lua_handler.go | 39 ++++++++++++++++- internal/server/sv1/lua_types.go | 69 ++++++++++++++++++++++++++---- 6 files changed, 115 insertions(+), 34 deletions(-) diff --git a/com/Auth/DeleteUnit.lua b/com/Auth/DeleteUnit.lua index 53b3f0f..35b83d7 100644 --- a/com/Auth/DeleteUnit.lua +++ b/com/Auth/DeleteUnit.lua @@ -6,6 +6,9 @@ local log = require("internal.log") local session = require("internal.session") local crypt = require("internal.crypt.bcrypt") +local params = session.request.params.get() +local token = session.request.headers.get("x-session-token") + local function close_db() if db then db:close() @@ -22,20 +25,14 @@ local function error_response(message, code, data) close_db() end -if not session.request.params then +if not params then return error_response("no params provided") end -if not session.request.params.token then +if not (token and token == require("_config").token()) then return error_response("access denied") end -if session.request.params.token ~= require("_config").token() then - return error_response("access denied") -end - -local params = session.request.params - if not (params.username and params.email and params.password) then return error_response("no username/email/password provided") end diff --git a/com/Auth/GetAccess.lua b/com/Auth/GetAccess.lua index 945b3e0..25e48d2 100644 --- a/com/Auth/GetAccess.lua +++ b/com/Auth/GetAccess.lua @@ -6,6 +6,9 @@ local log = require("internal.log") local session = require("internal.session") local crypt = require("internal.crypt.bcrypt") +local params = session.request.params.get() +local token = session.request.headers.get("x-session-token") + local function close_db() if db then db:close() @@ -22,16 +25,11 @@ local function error_response(message, code, data) close_db() end -local params = session.request.params if not params then return error_response("No params provided") end -if not session.request.params.token then - return error_response("access denied") -end - -if session.request.params.token ~= require("_config").token() then +if not (token and token == require("_config").token()) then return error_response("access denied") end diff --git a/com/Auth/PutNewUnit.lua b/com/Auth/PutNewUnit.lua index 415e64b..25a2510 100644 --- a/com/Auth/PutNewUnit.lua +++ b/com/Auth/PutNewUnit.lua @@ -6,6 +6,9 @@ local log = require("internal.log") local session = require("internal.session") local crypt = require("internal.crypt.bcrypt") +local params = session.request.params.get() +local token = session.request.headers.get("x-session-token") + local function close_db() if db then db:close() @@ -22,19 +25,14 @@ local function error_response(message, code, data) close_db() end -if not session.request.params then +if not params then return error_response("no params provided") end -if not session.request.params.token then +if not (token and token == require("_config").token()) then return error_response("access denied") end -if session.request.params.token ~= require("_config").token() then - return error_response("access denied") -end - -local params = session.request.params if not (params.username and params.email and params.password) then return error_response("no username/email/password provided") end diff --git a/com/List.lua b/com/List.lua index 8e329b9..cb2c227 100644 --- a/com/List.lua +++ b/com/List.lua @@ -2,7 +2,9 @@ local session = require("internal.session") -if session.request.params.about then +local params = session.request.params.get() + +if params.about then session.response.result = { description = "Returns a list of available methods", params = { @@ -48,7 +50,7 @@ local function scanDirectory(basePath, targetPath) end local basePath = "com" -local layer = session.request and session.request.params.layer and session.request.params.layer:gsub(">", "/") or nil +local layer = params.layer and params.layer:gsub(">", "/") or nil session.response.result = { answer = layer and scanDirectory(basePath, layer) or scanDirectory(basePath, "") diff --git a/internal/server/sv1/lua_handler.go b/internal/server/sv1/lua_handler.go index 61358af..feebe64 100644 --- a/internal/server/sv1/lua_handler.go +++ b/internal/server/sv1/lua_handler.go @@ -53,7 +53,36 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest, sessionMod := L.NewTable() inTable := L.NewTable() paramsTable := L.NewTable() + headersTable := L.NewTable() + fetchedHeadersTable := L.NewTable() + for k, v := range r.Header { + L.SetField(fetchedHeadersTable, k, ConvertGolangTypesToLua(L, v)) + } + + headersGetter := L.NewFunction(func(L *lua.LState) int { + path := L.OptString(1, "") + def := L.Get(2) + + get := func(path string) lua.LValue { + if path == "" { + return fetchedHeadersTable + } + fetched := r.Header.Get(path) + if fetched == "" { + return lua.LNil + } + return lua.LString(fetched) + } + val := get(path) + if val == lua.LNil && def != lua.LNil { + L.Push(def) + } else { + L.Push(val) + } + return 1 + }) + fetchedParamsTable := L.NewTable() if fetchedParams, ok := req.Params.(map[string]any); ok { for k, v := range fetchedParams { @@ -61,7 +90,7 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest, } } - getter := L.NewFunction(func(L *lua.LState) int { + paramsGetter := L.NewFunction(func(L *lua.LState) int { path := L.OptString(1, "") def := L.Get(2) @@ -94,8 +123,14 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest, } return 1 }) + L.SetField(headersTable, "__fetched", fetchedHeadersTable) - L.SetField(paramsTable, "get", getter) + L.SetField(headersTable, "get", headersGetter) + L.SetField(inTable, "headers", headersTable) + + L.SetField(paramsTable, "__fetched", fetchedParamsTable) + + L.SetField(paramsTable, "get", paramsGetter) L.SetField(inTable, "params", paramsTable) outTable := L.NewTable() diff --git a/internal/server/sv1/lua_types.go b/internal/server/sv1/lua_types.go index c99687d..094e5f8 100644 --- a/internal/server/sv1/lua_types.go +++ b/internal/server/sv1/lua_types.go @@ -45,33 +45,84 @@ func ConvertLuaTypesToGolang(value lua.LValue) any { func ConvertGolangTypesToLua(L *lua.LState, val any) lua.LValue { switch v := val.(type) { + + case nil: + return lua.LNil + case string: return lua.LString(v) case bool: return lua.LBool(v) case int: - return lua.LNumber(float64(v)) + return lua.LNumber(v) + case int8: + return lua.LNumber(v) + case int16: + return lua.LNumber(v) + case int32: + return lua.LNumber(v) case int64: - return lua.LNumber(float64(v)) + return lua.LNumber(v) + case uint: + return lua.LNumber(v) + case uint8: + return lua.LNumber(v) + case uint16: + return lua.LNumber(v) + case uint32: + return lua.LNumber(v) + case uint64: + return lua.LNumber(v) case float32: - return lua.LNumber(float64(v)) + return lua.LNumber(v) case float64: return lua.LNumber(v) + + case []string: + tbl := L.NewTable() + for i, s := range v { + tbl.RawSetInt(i+1, lua.LString(s)) + } + return tbl + case []int: + tbl := L.NewTable() + for i, n := range v { + tbl.RawSetInt(i+1, lua.LNumber(n)) + } + return tbl + case []float64: + tbl := L.NewTable() + for i, f := range v { + tbl.RawSetInt(i+1, lua.LNumber(f)) + } + return tbl case []any: tbl := L.NewTable() for i, item := range v { tbl.RawSetInt(i+1, ConvertGolangTypesToLua(L, item)) } return tbl - case map[string]any: + + case map[string]string: tbl := L.NewTable() - for key, value := range v { - tbl.RawSetString(key, ConvertGolangTypesToLua(L, value)) + for k, s := range v { + tbl.RawSetString(k, lua.LString(s)) } return tbl - case nil: - return lua.LNil + case map[string]int: + tbl := L.NewTable() + for k, n := range v { + tbl.RawSetString(k, lua.LNumber(n)) + } + return tbl + case map[string]any: + tbl := L.NewTable() + for k, val := range v { + tbl.RawSetString(k, ConvertGolangTypesToLua(L, val)) + } + return tbl + default: return lua.LString(fmt.Sprintf("%v", v)) } -} +} \ No newline at end of file