parsav  Diff

Differences From Artifact [d14bb4b6ce]:

To Artifact [8c264568c9]:


     1      1   -- vim: ft=terra
     2         -local util = dofile 'common.lua'
            2  +local util = lib.util
     3      3   local secmode = lib.enum { 'public', 'private', 'lockdown', 'isolate' }
            4  +local pstring = lib.mem.ptr(int8)
     4      5   local struct srv
     5      6   local struct cfgcache {
     6      7   	secret: lib.mem.ptr(int8)
     7      8   	instance: lib.mem.ptr(int8)
     8      9   	overlord: &srv
     9     10   	pol_sec: secmode.t
    10     11   	pol_reg: bool
................................................................................
    48     49   			elseif rt.stat_basetype then tk = stat
    49     50   			elseif rt.ptr_basetype then tk = ptr end
    50     51   			break
    51     52   		end
    52     53   	end
    53     54   	
    54     55   	local r = symbol(rt)
           56  +	local succ = label()
    55     57   	if tk == primary then
    56     58   		return quote
    57     59   			var [r]
    58     60   			for i=0,self.sources.ct do var src = self.sources.ptr + i
    59     61   				if src.handle ~= nil and src.backend.[meth] ~= nil then
    60     62   					r = src:[meth]([expr])
    61         -					goto success
           63  +					goto [succ]
    62     64   				end
    63     65   			end
    64     66   			lib.bail(['no active backends provide critical capability ' .. meth .. '!'])
    65         -			::success::;
           67  +			::[succ]::;
    66     68   		in r end
    67     69   	else local ok, empty
    68     70   		if tk == ptr then
    69     71   			ok = `r.ptr ~= nil
    70     72   			empty = `[rt]{ptr=nil,ct=0}
    71     73   		elseif tk == stat then
    72     74   			ok = `r.ok == true
................................................................................
   163    165   	body:send(self.con, code, [lib.mem.ptr(lib.http.header)] {
   164    166   		ptr = &hdrs[0], ct = [hdrs.type.N]
   165    167   	})
   166    168   
   167    169   	body.title:free()
   168    170   	body.body:free()
   169    171   end
          172  +
          173  +struct convo.page {
          174  +	title: pstring
          175  +	body: pstring
          176  +	class: pstring
          177  +}
          178  +
          179  +terra convo:stdpage(pg: convo.page)
          180  +	var doc = data.view.docskel {
          181  +		instance = self.srv.cfg.instance;
          182  +		title = pg.title;
          183  +		body = pg.body;
          184  +		class = pg.class;
          185  +		navlinks = self.navbar;
          186  +	}
          187  +
          188  +	var hdrs = array(
          189  +		lib.http.header { 'Content-Type', 'text/html; charset=UTF-8' }
          190  +	)
          191  +
          192  +	doc:send(self.con,200,[lib.mem.ptr(lib.http.header)] {ct = [hdrs.type.N], ptr = &hdrs[0]})
          193  +end
   170    194   
   171    195   -- CALL ONLY ONCE PER VAR
   172    196   terra convo:postv(name: rawstring)
   173    197   	if self.varbuf.ptr == nil then
   174    198   		self.varbuf = lib.mem.heapa(int8, self.msg.body.len + self.msg.query.len)
   175    199   		self.vbofs = self.varbuf.ptr
   176    200   	end
................................................................................
   344    368   							lib.osclock.time(nil))
   345    369   						if aid ~= 0 then co.aid = aid end
   346    370   					end ::nocookie::;
   347    371   				end
   348    372   
   349    373   				if co.aid ~= 0 then
   350    374   					var sess, usr = co.srv:actor_session_fetch(co.aid, peer)
   351         -					if sess.ok == false then co.aid = 0 else co.who = usr.ptr end
          375  +					if sess.ok == false then co.aid = 0 else
          376  +						co.who = usr.ptr
          377  +						co.who.rights.powers = server:actor_powers_fetch(co.who.id)
          378  +					end
   352    379   				end
   353    380   
   354    381   				var uridec = lib.mem.heapa(int8, msg.uri.len) defer uridec:free()
   355    382   				var urideclen = lib.net.mg_url_decode(msg.uri.ptr, msg.uri.len, uridec.ptr, uridec.ct, 1)
   356    383   
   357    384   				var uri = uridec
   358    385   				if urideclen == -1 then
................................................................................
   481    508   	return stats
   482    509   end
   483    510   
   484    511   terra srv:actor_auth_how(ip: lib.store.inet, usn: rawstring)
   485    512   	var cs: lib.store.credset cs:clear()
   486    513   	var ok = false
   487    514   	for i=0,self.sources.ct do
   488         -		var set, iok = self.sources.ptr[i]:actor_auth_how(ip, usn)
          515  +		var set, iok = self.sources(i):actor_auth_how(ip, usn)
   489    516   		if iok then
   490    517   			cs = cs + set
   491    518   			ok = iok
   492    519   		end
   493    520   	end
   494    521   	return cs, ok
   495    522   end
   496    523   
          524  +terra srv:actor_auth_pw(ip: lib.store.inet, user: pstring, pw: pstring): uint64
          525  +	for i=0,self.sources.ct do
          526  +		if self.sources(i).backend ~= nil and
          527  +		   self.sources(i).backend.actor_auth_pw ~= nil then
          528  +			var aid,uid,newhnd = self.sources(i):actor_auth_pw(ip,user,pw)
          529  +			if aid ~= 0 then
          530  +				if uid == 0 then
          531  +					lib.dbg('new user just logged in, creating account entry')
          532  +					var kbuf: uint8[lib.crypt.const.maxdersz]
          533  +					var newkp = lib.crypt.genkp()
          534  +					var privsz = lib.crypt.der(false,&newkp,&kbuf[0])
          535  +					var na = lib.store.actor {
          536  +						id = 0; nym = nil; handle = newhnd.ptr;
          537  +						origin = 0; bio = nil; avatar = nil;
          538  +						knownsince = lib.osclock.time(nil);
          539  +						rights = lib.store.rights_default();
          540  +						title = nil, key = [lib.mem.ptr(uint8)] {
          541  +							ptr = &kbuf[0], ct = privsz
          542  +						};
          543  +					}
          544  +					var newuid: uint64
          545  +					if self.sources(i).backend.actor_create ~= nil then
          546  +						newuid = self.sources(i):actor_create(&na)
          547  +					else newuid = self:actor_create(&na) end
          548  +
          549  +					if self.sources(i).backend.actor_auth_register_uid ~= nil then
          550  +						self.sources(i):actor_auth_register_uid(aid,newuid)
          551  +					end
          552  +				end
          553  +				return aid
          554  +			end
          555  +		end
          556  +	end
          557  +
          558  +	return 0
          559  +end
          560  +
          561  +--9twh8y94i5c1qqr7hxu20fyd
   497    562   terra cfgcache.methods.load :: {&cfgcache} -> {}
   498    563   terra cfgcache:init(o: &srv)
   499    564   	self.overlord = o
   500    565   	self:load()
   501    566   end
   502    567   
   503    568   srv.methods.start = terra(self: &srv, befile: rawstring)