RPC initial authentication API completed

This commit is contained in:
Steven Barth 2008-08-22 22:13:54 +00:00
parent 69cab40a9a
commit 3bcab66128
3 changed files with 51 additions and 24 deletions

View file

@ -79,7 +79,7 @@ function error500(message)
return false return false
end end
function authenticator.htmlauth(validator, default) function authenticator.htmlauth(validator, accs, default)
local user = luci.http.formvalue("username") local user = luci.http.formvalue("username")
local pass = luci.http.formvalue("password") local pass = luci.http.formvalue("password")
@ -125,7 +125,7 @@ function dispatch(request)
local c = context.tree local c = context.tree
local track = {} local track = {}
local args = {} local args = {}
context.args = context.path context.args = args
local n local n
for i, s in ipairs(request) do for i, s in ipairs(request) do
@ -187,7 +187,7 @@ function dispatch(request)
if not luci.util.contains(accs, user) then if not luci.util.contains(accs, user) then
if authen then if authen then
local user = authen(luci.sys.user.checkpasswd, def) local user = authen(luci.sys.user.checkpasswd, accs, def)
if not user or not luci.util.contains(accs, user) then if not user or not luci.util.contains(accs, user) then
return return
else else

View file

@ -15,17 +15,44 @@ $Id$
module("luci.controller.rpc", package.seeall) module("luci.controller.rpc", package.seeall)
function index() function index()
local authenticator = function(validator) local function authenticator(validator, accs)
local args = luci.dispatcher.context.args
if args and #args > 0 then
local user = luci.sauth.read(args[1])
if user and luci.util.contains(accs, user) then
return user
end
end
luci.http.status(403, "Forbidden")
end
uci = entry({"rpc", "uci"}, call("rpc_uci"))
uci.sysauth = "root"
uci.sysauth_authenticator = authenticator
uci.leaf = true
uci = entry({"rpc", "auth"}, call("rpc_auth"))
end
function rpc_auth()
require "luci.jsonrpc" require "luci.jsonrpc"
require "luci.http" require "luci.sauth"
luci.http.setfilehandler() luci.http.setfilehandler()
local loginstat local loginstat
local server = {} local server = {}
server.login = function(...) server.login = function(user, pass)
loginstat = validator(...) local sid
return loginstat
if luci.sys.user.checkpasswd(user, pass) then
sid = luci.sys.uniqueid(16)
luci.http.header("Set-Cookie", "sysauth=" .. sid.."; path=/")
luci.sauth.write(sid, user)
end
return sid
end end
luci.http.prepare_content("application/json") luci.http.prepare_content("application/json")
@ -34,11 +61,6 @@ function index()
return loginstat return loginstat
end end
uci = entry({"rpc", "uci"}, call("rpc_uci"))
uci.sysauth = "root"
uci.sysauth_authenticator = authenticator
end
function rpc_uci() function rpc_uci()
luci.http.write("HELLO THAR!")
end end

View file

@ -14,9 +14,10 @@ $Id$
]]-- ]]--
module("luci.jsonrpc", package.seeall) module("luci.jsonrpc", package.seeall)
require "luci.json"
function resolve(mod, method) function resolve(mod, method)
local path = luci.util.split(value, ".") local path = luci.util.split(method, ".")
for j=1, #path-1 do for j=1, #path-1 do
if not type(mod) == "table" then if not type(mod) == "table" then
@ -43,7 +44,7 @@ function handle(tbl, rawdata)
and (not json.params or type(json.params) == "table") then and (not json.params or type(json.params) == "table") then
if tbl[json.method] then if tbl[json.method] then
response = reply(json.jsonrpc, json.id, response = reply(json.jsonrpc, json.id,
proxy(resolve(tbl, json.method), unpack(json.params))) proxy(resolve(tbl, json.method), unpack(json.params or {})))
else else
response = reply(json.jsonrpc, json.id, response = reply(json.jsonrpc, json.id,
nil, {code=-32601, message="Method not found."}) nil, {code=-32601, message="Method not found."})
@ -75,12 +76,16 @@ function reply(jsonrpc, id, res, err)
end end
function proxy(method, ...) function proxy(method, ...)
local res = {luci.util.copcall(method, unpack(params))} local res = {luci.util.copcall(method, ...)}
local stat = table.remove(res, 1) local stat = table.remove(res, 1)
if not stat then if not stat then
return nil, {code=-32602, message="Invalid params.", data=table.remove(res, 1)} return nil, {code=-32602, message="Invalid params.", data=table.remove(res, 1)}
else else
return (#res <= 1) and res[1] or res if #res <= 1 then
return res[1] or luci.json.Null
else
return res
end
end end
end end