8
9
10
11
12
13
14
15
16
17
18
19
20
21
..
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
...
507
508
509
510
511
512
513
514
515
516
517
518
519
520
...
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
....
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
|
pol_sec: secmode.t
pol_reg: bool
pol_autoherald: bool
credmgd: bool
maxupsz: intptr
poolinitsz: intptr
instance: pstring
overlord: &srv
ui_cue_staff: pstring
ui_cue_founder: pstring
ui_hue: uint16
nranks: uint16
maxinvites: uint16
master: uint64
................................................................................
webmgr: lib.net.mg_mgr
webcon: &lib.net.mg_connection
cfg: cfgcache
id: rawstring
pool: lib.mem.pool
}
terra cfgcache:free() -- :/
self.secret:free()
self.instance:free()
self.ui_cue_staff:free()
self.ui_cue_founder:free()
self.usrdef_pol_follow:free()
self.usrdef_pol_follow_req:free()
end
terra srv:post_enum_author_uid(uid: uint64, r: lib.store.range): lib.mem.vec(lib.mem.ptr(lib.store.post))
................................................................................
local route = {} -- these are defined in route.t, as they need access to renderers
terra route.dispatch_http :: {&convo, lib.mem.ptr(int8), lib.http.method.t} -> {}
local mimetypes = {
{'html', 'text/html'};
{'json', 'application/json'};
{'mkdown', 'text/markdown'};
{'text', 'text/plain'};
{'ansi', 'text/x-ansi'};
}
local mimevar = symbol(lib.mem.ref(int8))
local mimeneg = `lib.http.mime.none
................................................................................
in ret end
end
local handle = {
http = terra(con: &lib.net.mg_connection, event_kind: int, event: &opaque, userdata: &opaque)
var server = [&srv](userdata)
var mgpeer = getpeer(con)
var peer = lib.store.inet { port = mgpeer.port; }
if mgpeer.is_ip6 then peer.pv = 6 else peer.pv = 4 end
if peer.pv == 6 then
for i = 0, 16 do peer.v6[i] = mgpeer.ip6[i] end
else -- v4
@[&uint32](&peer.v4) = mgpeer.ip
end
-- the peer property is currently broken and there is precious
-- little i can do about this -- it always reports a peer v4 IP
-- of 0.0.0.0, altho the port seems to come through correctly.
-- for now i'm leaving it as is, but note that netmask restrictions
-- WILL NOT WORK until upstream gets its shit together. FIXME
-- needs to check for an X-Forwarded-For header from nginx and
-- use that instead of the peer iff peer is ::1/127.1 FIXME
-- maybe also haproxy support?
switch event_kind do
case lib.net.MG_EV_HTTP_MSG then
lib.dbg('routing HTTP request')
var msg = [&lib.net.mg_http_message](event)
var co = convo {
con = con, srv = server, msg = msg;
aid = 0, aid_issue = 0, who = nil;
reqtype = lib.http.mime.none;
peer = peer, live_last = 0;
................................................................................
str:free()
end
return default
end
terra cfgcache:load()
self.instance = self.overlord:conf_get('instance-name')
self.secret = self.overlord:conf_get('server-secret')
self.pol_reg = self:cfbool('policy-self-register', false)
self.pol_autoherald = self:cfbool('policy-self-herald', true)
do self.credmgd = false
var sreg = self.overlord:conf_get('credential-store')
|
>
|
>
>
>
|
<
<
<
<
<
<
>
|
|
>
|
>
>
>
>
>
>
>
>
>
>
>
|
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
..
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
...
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
...
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
....
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
|
pol_sec: secmode.t
pol_reg: bool
pol_autoherald: bool
credmgd: bool
maxupsz: intptr
poolinitsz: intptr
instance: pstring
domain: pstring
overlord: &srv
ui_cue_staff: pstring
ui_cue_founder: pstring
ui_hue: uint16
nranks: uint16
maxinvites: uint16
master: uint64
................................................................................
webmgr: lib.net.mg_mgr
webcon: &lib.net.mg_connection
cfg: cfgcache
id: rawstring
pool: lib.mem.pool
}
terra cfgcache:free() -- :/ TODO replace with pool
self.secret:free()
self.instance:free()
self.domain:free()
self.ui_cue_staff:free()
self.ui_cue_founder:free()
self.usrdef_pol_follow:free()
self.usrdef_pol_follow_req:free()
end
terra srv:post_enum_author_uid(uid: uint64, r: lib.store.range): lib.mem.vec(lib.mem.ptr(lib.store.post))
................................................................................
local route = {} -- these are defined in route.t, as they need access to renderers
terra route.dispatch_http :: {&convo, lib.mem.ptr(int8), lib.http.method.t} -> {}
local mimetypes = {
{'html', 'text/html'};
{'json', 'application/json'};
{'json', 'application/ld+json'};
{'json', 'application/activity+json'};
{'mkdown', 'text/markdown'};
{'text', 'text/plain'};
{'ansi', 'text/x-ansi'};
}
local mimevar = symbol(lib.mem.ref(int8))
local mimeneg = `lib.http.mime.none
................................................................................
in ret end
end
local handle = {
http = terra(con: &lib.net.mg_connection, event_kind: int, event: &opaque, userdata: &opaque)
var server = [&srv](userdata)
var mgpeer = getpeer(con)
-- var pbuf: int8[128]
-- the peer property is currently broken and there is precious
-- little i can do about this -- it always reports a peer v4 IP
-- of 0.0.0.0 for v6 connections, altho the port seems to come
-- through correctly. -- for now i'm leaving it as is, but note
-- that netmask restrictions WILL NOT WORK until upstream gets
-- its shit together. FIXME
-- needs to check for an X-Forwarded-For header from nginx and
-- use that instead of the peer iff peer is ::1/127.1 FIXME
-- maybe also haproxy support?
switch event_kind do
case lib.net.MG_EV_HTTP_MSG then
-- lib.net.mg_ntoa(&mgpeer,&pbuf[0],127)
-- lib.dbg('got connection from client ',&pbuf[0])
var peer = lib.store.inet { port = mgpeer.port; }
if mgpeer.is_ip6 then peer.pv = 6 else peer.pv = 4 end
if peer.pv == 6 then
for i = 0, 16 do peer.v6[i] = mgpeer.ip6[i] end
else -- v4
@[&uint32](&peer.v4) = mgpeer.ip
end
lib.dbg('routing HTTP request')
var msg = [&lib.net.mg_http_message](event)
var co = convo {
con = con, srv = server, msg = msg;
aid = 0, aid_issue = 0, who = nil;
reqtype = lib.http.mime.none;
peer = peer, live_last = 0;
................................................................................
str:free()
end
return default
end
terra cfgcache:load()
self.instance = self.overlord:conf_get('instance-name')
self.domain = self.overlord:conf_get('domain')
self.secret = self.overlord:conf_get('server-secret')
self.pol_reg = self:cfbool('policy-self-register', false)
self.pol_autoherald = self:cfbool('policy-self-herald', true)
do self.credmgd = false
var sreg = self.overlord:conf_get('credential-store')
|