moleflap/door/addtoken.lua

96 lines
2.5 KiB
Lua

#!/usr/bin/env lua
require 'luasql.postgres'
require 'helper'
require 'config'
require 'token'
require 'base64'
function exit(env, con)
con:close()
env:close()
os.exit()
end
print "* adding token ..."
env = luasql.postgres()
con = env:connect(config.db)
print "current users:"
for name in rows(con,"select name from users;") do print(name) end
io.stdout:write("enter name: ")
name = io.stdin:read()
if name == "" then
print "* action canceled"
else
token = generate_token()
print "* generate token"
io.stdout:write("enter prefix (length "..config.prefix_len.." chars): [default random] ")
prefix = io.stdin:read()
if prefix == "" then
prefix = token:sub(1,config.prefix_len)
else
if prefix:len() ~= config.prefix_len then
print("ERROR - prefix must have given length "..config.prefix_len..".")
exit(env,con)
end
if not is_base64(prefix) then
print "ERROR - prefix must be a valid base64 string."
exit(env,con)
end
if 0 ~= con:execute("select ttl from tokens where prefix='"..prefix.."';"):numrows() then
print "ERROR - prefix already in use."
exit(env,con)
end
end
token = set_prefix(prefix,token)
while true do
io.stdout:write("enter gpg id: [] ")
gpg_id = io.stdin:read()
if prefix == "" then
break
end
if os.execute("gpg --batch --recv-keys "..gpg_id) == 0 then
break
end
end
if 0 ~= con:execute("select ttl from tokens where token='"..token.."';"):numrows() then
print(token)
print "ERROR - token already exists .. please try again."
exit(env,con)
end
cur = con:execute("insert into users (name, ntc) values ('"..name.."', 1);")
if cur == 1 then
print("* add user " .. name)
else
assert(con:execute("update users set ntc=ntc+1 where name='"..name.."';"))
end
ttl = os.time() + config.ttl
assert(con:execute("insert into tokens (prefix, token, ttl) values ('"..prefix.."', '"..token.."', "..ttl..");"))
assert(con:execute("delete from graveyard where prefix='"..prefix.."';"))
print "* add token:"
print(token)
print("* prefix to remember: "..prefix)
while true do
io.stdout:write("enter gpg id: [] ")
gpg_id = io.stdin:read()
if prefix == "" then
break
end
if os.execute("gpg --batch --recv-keys "..gpg_id) == 0 then
break
end
end
end
exit(env,con)