Differences From
Artifact [2ed8642241]:
1 1 -- vim: ft=terra
2 2 local pstr = lib.mem.ptr(int8)
3 3 local pref = lib.mem.ref(int8)
4 +
4 5 local terra
5 -render_conf_sec(co: &lib.srv.convo, path: lib.mem.ptr(pref)): pstr
6 - var time: lib.store.timepoint = co.who.source:auth_sigtime_user_fetch(co.who.id)
6 +render_conf_sec(co: &lib.srv.convo, uid: uint64): pstr
7 + var time: lib.store.timepoint = co.who.source:auth_sigtime_user_fetch(uid)
7 8 var tstr: int8[26]
8 9 lib.osclock.ctime_r(&time, &tstr[0])
9 10 var body = data.view.conf_sec {
10 11 lastreset = pstr {
11 12 ptr = &tstr[0], ct = lib.str.sz(&tstr[0])
12 13 }
13 14 }
14 15
15 16 if co.srv.cfg.credmgd then
17 + var new = co:pgetv('new')
16 18 var a: lib.str.acc a:init(768)
17 - body:append(&a)
18 - var credmgr = data.view.conf_sec_credmg {
19 - credlist = '<option>your password</option>'
20 - }
21 - credmgr:append(&a)
19 + if not new then
20 + body:append(&a)
21 + var credmgr = data.view.conf_sec_credmg {
22 + credlist = pstr{'',0};
23 + }
24 + var creds = co.srv:auth_enum_uid(uid)
25 + if creds.ct > 0 then defer creds:free()
26 + var cl: lib.str.acc cl:init(256)
27 + for i=0, creds.ct do var c = creds(i).ptr
28 + if not c.blacklist then
29 + cl:lpush('<option value="'):shpush(c.aid):lpush('"> ['):push(c.kind,0):lpush('] '):push(c.comment,0)
30 + if c.netmask.pv ~= 0 then
31 + -- push string rep
32 + end
33 + cl:lpush('</option>')
34 + end
35 + end
36 + credmgr.credlist = cl:finalize()
37 + end
38 + credmgr:append(&a)
39 + if credmgr.credlist.ct > 0 then credmgr.credlist:free() end
40 + elseif new:cmp(lib.str.plit'pw') then
41 + var d: data.view.conf_sec_pwnew
42 + var time = lib.osclock.time(nil)
43 + var timestr: int8[26] lib.osclock.ctime_r(&time, ×tr[0])
44 + var cmt: lib.str.acc
45 + cmt:init(48):lpush('enrolled over http on '):push(×tr[0],0)
46 + d.comment = cmt:finalize()
47 +
48 + var st = d:tostr()
49 + d.comment:free()
50 + return st
51 + elseif new:cmp(lib.str.plit'challenge') then
52 + -- we're going to break the rules a bit and do database munging from
53 + -- the rendering code, because doing otherwise in this case would be
54 + -- genuinely nightmarish
55 + elseif new:cmp(lib.str.plit'otp') then
56 + elseif new:cmp(lib.str.plit'api') then
57 + else return pstr.null() end
22 58 return a:finalize()
23 59 else return body:tostr() end
24 60 end
61 +
62 +terra lib.render.conf.sec_overlay
63 +(co: &lib.srv.convo, path: lib.mem.ptr(pref)): pstr
64 + -- render the credential panel for the current user, allowing
65 + -- it to be reused in the administration UI
66 + return render_conf_sec(co,co.who.id)
67 +end
68 +
25 69 return render_conf_sec