···1212 "github.com/sotangled/tangled/knotserver/config"
1313 "github.com/sotangled/tangled/knotserver/db"
1414 "github.com/sotangled/tangled/knotserver/jsclient"
1515+ "github.com/sotangled/tangled/rbac"
1616+)
1717+1818+const (
1919+ ThisServer = "thisserver" // resource identifier for rbac enforcement
1520)
16211722type Handle struct {
1823 c *config.Config
1924 db *db.DB
2025 js *jsclient.JetstreamClient
2626+ e *rbac.Enforcer
21272228 // init is a channel that is closed when the knot has been initailized
2329 // i.e. when the first user (knot owner) has been added.
···2531 knotInitialized bool
2632}
27332828-func Setup(ctx context.Context, c *config.Config, db *db.DB) (http.Handler, error) {
3434+func Setup(ctx context.Context, c *config.Config, db *db.DB, e *rbac.Enforcer) (http.Handler, error) {
2935 r := chi.NewRouter()
30363137 h := Handle{
3238 c: c,
3339 db: db,
4040+ e: e,
3441 init: make(chan struct{}),
3542 }
36433737- err := h.StartJetstream(ctx)
4444+ err := e.AddDomain(ThisServer)
4545+ if err != nil {
4646+ return nil, fmt.Errorf("failed to setup enforcer: %w", err)
4747+ }
4848+4949+ err = h.StartJetstream(ctx)
3850 if err != nil {
3951 return nil, fmt.Errorf("failed to start jetstream: %w", err)
4052 }
···94106}
9510796108func (h *Handle) StartJetstream(ctx context.Context) error {
9797- colections := []string{tangled.PublicKeyNSID}
109109+ collections := []string{tangled.PublicKeyNSID, tangled.KnotMemberNSID}
98110 dids := []string{}
99111100100- h.js = jsclient.NewJetstreamClient(colections, dids)
112112+ h.js = jsclient.NewJetstreamClient(collections, dids)
101113 messages, err := h.js.ReadJetstream(ctx)
102114 if err != nil {
103115 return fmt.Errorf("failed to read from jetstream: %w", err)
···126138 log.Printf("failed to add public key: %v", err)
127139 } else {
128140 log.Printf("added public key from firehose: %s", data["did"])
141141+ }
142142+ case tangled.KnotMemberNSID:
143143+ did := data["did"].(string)
144144+ record := commit["record"].(map[string]interface{})
145145+ ok, err := h.e.E.Enforce(did, ThisServer, ThisServer, "server:invite")
146146+ if err != nil || !ok {
147147+ log.Printf("failed to add member from did %s", did)
148148+ } else {
149149+ log.Printf("adding member")
150150+ h.e.AddMember(ThisServer, record["member"].(string))
129151 }
130152 default:
131153 }
+8
knotserver/jsclient/jetstream.go
···5555 j.triggerReconnect()
5656}
57575858+// Adds one did to the did list
5959+func (j *JetstreamClient) AddDid(did string) {
6060+ j.mu.Lock()
6161+ j.dids = append(j.dids, did)
6262+ j.mu.Unlock()
6363+ j.triggerReconnect()
6464+}
6565+5866func (j *JetstreamClient) triggerReconnect() {
5967 select {
6068 case j.reconnectCh <- struct{}{}:
+1
knotserver/routes.go
···432432 }
433433434434 h.js.UpdateDids([]string{data.Did})
435435+ h.e.AddOwner(ThisServer, data.Did)
435436 // Signal that the knot is ready
436437 close(h.init)
437438