parsav  Diff

Differences From Artifact [2ed8642241]:

To Artifact [7f83a40056]:


     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, &timestr[0])
           44  +			var cmt: lib.str.acc
           45  +			cmt:init(48):lpush('enrolled over http on '):push(&timestr[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