-- vim: ft=terra
local pstr = lib.mem.ptr(int8)
local P = lib.str.plit
local terra
login_form(co: &lib.srv.convo, user: &lib.store.actor, creds: &lib.store.credset, msg: pstr)
var doc = [lib.srv.convo.page] {
title = lib.str.plit 'instance logon';
class = lib.str.plit 'login';
cache = false;
}
if user == nil then
var form = data.view.login_username {
loginmsg = msg;
}
if form.loginmsg.ptr == nil then
form.loginmsg = lib.str.plit 'identify yourself for access to this instance.'
end
doc.body = form:tostr()
elseif creds:sz() == 0 then
co:complain(403,'access denied','your host is not eligible to authenticate as this user')
return
elseif creds:sz() == 1 then
if creds.trust() then
-- TODO log in immediately
return
end
var ch = data.view.login_challenge {
handle = user.handle;
name = lib.coalesce(user.nym, user.handle);
}
if creds.pw() then
ch.challenge = P'enter the password associated with your account'
ch.label = P'password'
ch.method = P'pw'
ch.auto = P'current-password';
elseif creds.otp() then
ch.challenge = P'enter a valid one-time password for your account'
ch.label = P'OTP code'
ch.method = P'otp'
ch.auto = P'one-time-code';
elseif creds.challenge() then
ch.challenge = P'sign the challenge token: <code>...</code>'
ch.label = P'digest'
ch.method = P'challenge'
ch.auto = P'one-time-code';
else
co:complain(500,'login failure','unknown login method')
return
end
doc.body = ch:tostr()
else
-- pick a method
end
co:stdpage(doc)
doc.body:free()
end
return login_form