1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
..
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
-- vim: ft=terra
local terra
login_form(co: &lib.srv.convo, user: &lib.store.actor, creds: &lib.store.credset, msg: &int8)
var doc = data.view.docskel {
instance = co.srv.cfg.instance.ptr;
title = 'instance logon';
class = 'login';
navlinks = co.navbar.ptr;
}
if user == nil then
var form = data.view.login_username {
loginmsg = msg;
}
if form.loginmsg == nil then
form.loginmsg = 'identify yourself for access to this instance.'
end
var formtxt = form:tostr()
doc.body = formtxt.ptr
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 = 'enter the password associated with your account'
ch.label = 'password'
ch.method = 'pw'
elseif creds.otp() then
ch.challenge = 'enter a valid one-time password for your account'
ch.label = 'OTP code'
ch.method = 'otp'
elseif creds.challenge() then
ch.challenge = 'sign the challenge token: <code>...</code>'
ch.label = 'digest'
ch.method = 'challenge'
else
co:complain(500,'login failure','unknown login method')
return
end
doc.body = ch:tostr().ptr
else
-- pick a method
end
var hdrs = array(
lib.http.header { 'Content-Type', 'text/html; charset=UTF-8' }
)
doc:send(co.con,200,[lib.mem.ptr(lib.http.header)] {ct = 1, ptr = &hdrs[0]})
lib.mem.heapf(doc.body)
end
return login_form
|
>
>
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
..
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
-- 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 = data.view.docskel {
instance = co.srv.cfg.instance;
title = lib.str.plit 'instance logon';
class = lib.str.plit 'login';
navlinks = co.navbar;
}
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'
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'
elseif creds.challenge() then
ch.challenge = P'sign the challenge token: <code>...</code>'
ch.label = P'digest'
ch.method = P'challenge'
else
co:complain(500,'login failure','unknown login method')
return
end
doc.body = ch:tostr()
else
-- pick a method
end
var hdrs = array(
lib.http.header { 'Content-Type', 'text/html; charset=UTF-8' }
)
doc:send(co.con,200,[lib.mem.ptr(lib.http.header)] {ct = 1, ptr = &hdrs[0]})
doc.body:free()
end
return login_form
|