root/ff-luci/trunk/modules/rpc/luasrc/controller/rpc.lua @ 2956

Revision 2956, 3.1 KB (checked in by Cyrus, 5 years ago)

libs/json: Completed JSON library
modules/rpc: Added experimental JSON-RPC API

  • Property svn:keywords set to Id
Line 
1--[[
2LuCI - Lua Configuration Interface
3
4Copyright 2008 Steven Barth <steven@midlink.org>
5Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
6
7Licensed under the Apache License, Version 2.0 (the "License");
8you may not use this file except in compliance with the License.
9You may obtain a copy of the License at
10
11    http://www.apache.org/licenses/LICENSE-2.0
12
13$Id$
14]]--
15
16local require = require
17local pairs = pairs
18local print = print
19
20module "luci.controller.rpc"
21
22function index()
23    local function authenticator(validator, accs)
24        local auth = luci.http.formvalue("auth", true)
25        if auth then
26            local user = luci.sauth.read(auth)
27            if user and luci.util.contains(accs, user) then
28                return user, auth
29            end
30        end
31        luci.http.status(403, "Forbidden")
32    end
33   
34    uci = entry({"rpc", "uci"}, call("rpc_uci"))
35    uci.sysauth = "root"
36    uci.sysauth_authenticator = authenticator
37   
38    fs = entry({"rpc", "fs"}, call("rpc_fs"))
39    fs.sysauth = "root"
40    fs.sysauth_authenticator = authenticator
41
42    fs = entry({"rpc", "sys"}, call("rpc_sys"))
43    fs.sysauth = "root"
44    fs.sysauth_authenticator = authenticator
45   
46    uci = entry({"rpc", "auth"}, call("rpc_auth"))
47end
48
49function rpc_auth()
50    local jsonrpc = require "luci.jsonrpc"
51    local sauth   = require "luci.sauth"
52    local http    = require "luci.http"
53    local sys     = require "luci.sys"
54    local ltn12   = require "luci.ltn12"
55   
56    http.setfilehandler()
57   
58    local loginstat
59   
60    local server = {}
61    server.login = function(user, pass)
62        local sid
63       
64        if sys.user.checkpasswd(user, pass) then
65            sid = sys.uniqueid(16)
66            http.header("Set-Cookie", "sysauth=" .. sid.."; path=/")
67            sauth.write(sid, user)
68        end
69       
70        return sid
71    end
72   
73    http.prepare_content("application/json")
74    ltn12.pump.all(jsonrpc.handle(server, http.source()), http.write)
75end
76
77function rpc_uci()
78    local uci     = require "luci.controller.rpc.uci"
79    local jsonrpc = require "luci.jsonrpc"
80    local http    = require "luci.http"
81    local ltn12   = require "luci.ltn12"
82   
83    http.prepare_content("application/json")
84    ltn12.pump.all(jsonrpc.handle(uci, http.source()), http.write)
85end
86
87function rpc_fs()
88    local util    = require "luci.util"
89    local fs      = util.clone(require "luci.fs")
90    local jsonrpc = require "luci.jsonrpc"
91    local http    = require "luci.http"
92    local ltn12   = require "luci.ltn12"
93   
94    function fs.readfile(filename)
95        if not pcall(require, "mime") then
96            error("Base64 support not available. Please install LuaSocket.")
97        end
98       
99        return ltn12.source.chain(ltn12.source.file(filename), mime.encode("base64"))
100    end
101   
102    function fs.writefile(filename, data)
103        if not pcall(require, "mime") then
104            error("Base64 support not available. Please install LuaSocket.")
105        end
106   
107        local sink = ltn12.sink.chain(mime.decode("base64"), ltn12.sink.file(filename))
108        return ltn12.pump.all(ltn12.source.string(data), sink)
109    end
110   
111    http.prepare_content("application/json")
112    ltn12.pump.all(jsonrpc.handle(fs, http.source()), http.write)
113end
114
115function rpc_sys()
116    local sys     = require "luci.sys"
117    local jsonrpc = require "luci.jsonrpc"
118    local http    = require "luci.http"
119    local ltn12   = require "luci.ltn12"
120   
121    http.prepare_content("application/json")
122    ltn12.pump.all(jsonrpc.handle(sys, http.source()), http.write)
123end
Note: See TracBrowser for help on using the browser.