1 -- Cjdns admin module for Lua
2 -- Written by Philip Horger
4 common = require 'cjdns/common'
7 AdminInterface.__index = AdminInterface
8 common.AdminInterface = AdminInterface
10 function AdminInterface.new(properties)
11 properties = properties or {}
13 properties.host = properties.host or "127.0.0.1"
14 properties.port = properties.port or 11234
15 properties.password = properties.password or nil
16 properties.config = properties.config or common.ConfigFile.new("/etc/cjdroute.conf", false)
17 properties.timeout = properties.timeout or 2
19 properties.udp = common.UDPInterface.new(properties)
21 return setmetatable(properties, AdminInterface)
24 function AdminInterface:send(object)
25 local bencoded, err = bencode.encode(object)
30 local sock_obj = assert(socket.udp())
31 sock_obj:settimeout(self.timeout)
33 local _, err = sock_obj:sendto(bencoded, self.host, self.port)
41 function AdminInterface:recv(sock_obj)
42 local retrieved, err = sock_obj:receive()
44 return nil, "ai:recv > " .. err
46 local bencoded, err = bencode.decode(retrieved)
50 return nil, "ai:recv > " .. err
54 function AdminInterface:call(request)
55 local sock_obj, err = self:send(request)
57 return nil, "ai:call > " .. err
60 return self:recv(sock_obj)
63 function AdminInterface:getCookie()
64 local cookie_response, err = self:call({ q = "cookie" })
65 if not cookie_response then
66 return nil, "ai:getCookie > " .. err
68 return cookie_response.cookie
71 function AdminInterface:auth(request)
72 local funcname = request.q
74 for k, v in pairs(request) do
79 local cookie, err = self:getCookie()
84 -- Step 2: Calculate hash1 (password + cookie)
85 local plaintext1 = self.password .. cookie
86 local hash1 = sha2.sha256hex(plaintext1)
88 -- Step 3: Calculate hash2 (intermediate stage request)
96 local plaintext2, err = bencode.encode(request)
100 local hash2 = sha2.sha256hex(plaintext2)
102 -- Step 4: Update hash in request, then ship it out
104 return self:call(request)