Differences From
Artifact [d14bb4b6ce]:
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)