···4 "context"
5 "fmt"
607 "github.com/go-gst/go-gst/gst"
08 "stream.place/streamplace/pkg/model"
9)
1011-// Handle shutting down a pipeline when a signing key is revoked
12func (mm *MediaManager) HandleKeyRevocation(ctx context.Context, ms MediaSigner, pipeline *gst.Pipeline) {
13 sub := mm.bus.Subscribe(ms.Streamer())
14 defer mm.bus.Unsubscribe(ms.Streamer(), sub)
···17 case <-ctx.Done():
18 return
19 case msg := <-sub:
20- signingKey, ok := msg.(*model.SigningKey)
21- if !ok {
00000000000000022 continue
23- }
24- if signingKey.RevokedAt == nil {
25- continue
26- }
27- if signingKey.DID == ms.DID() {
28- err := fmt.Errorf("signing key revoked, ending stream: %s", signingKey.RKey)
29- pipeline.Error(err.Error(), err)
30- return
31 }
32 }
33 }
···4 "context"
5 "fmt"
67+ comatproto "github.com/bluesky-social/indigo/api/atproto"
8 "github.com/go-gst/go-gst/gst"
9+ "stream.place/streamplace/pkg/atproto"
10 "stream.place/streamplace/pkg/model"
11)
1213+// Handle shutting down a pipeline when a signing key is revoked or a user gets banned
14func (mm *MediaManager) HandleKeyRevocation(ctx context.Context, ms MediaSigner, pipeline *gst.Pipeline) {
15 sub := mm.bus.Subscribe(ms.Streamer())
16 defer mm.bus.Unsubscribe(ms.Streamer(), sub)
···19 case <-ctx.Done():
20 return
21 case msg := <-sub:
22+ switch v := msg.(type) {
23+ case *model.SigningKey:
24+ if v.RevokedAt == nil {
25+ continue
26+ }
27+ if v.DID == ms.DID() {
28+ err := fmt.Errorf("signing key revoked, ending stream: %s", v.RKey)
29+ pipeline.Error(err.Error(), err)
30+ return
31+ }
32+ case *comatproto.LabelDefs_Label:
33+ if atproto.IsBanned(v) {
34+ err := fmt.Errorf("user banned, ending stream: %s", v.Uri)
35+ pipeline.Error(err.Error(), err)
36+ return
37+ }
38+ default:
39 continue
0000000040 }
41 }
42 }
+40-5
pkg/model/label.go
···1package model
23-import "gorm.io/gorm/clause"
00000045type Label struct {
6 // cid: Optionally, CID specifying the specific version of 'uri' resource this label applies to.
7 Cid *string `json:"cid,omitempty" cborgen:"cid,omitempty" gorm:"column:cid"`
8 // cts: Timestamp when this label was created.
9- Cts string `json:"cts" cborgen:"cts" gorm:"column:cts"`
10 // exp: Timestamp at which this label expires (no longer applies).
11- Exp *string `json:"exp,omitempty" cborgen:"exp,omitempty" gorm:"column:exp"`
12 // neg: If true, this is a negation label, overwriting a previous label.
13- Neg *bool `json:"neg,omitempty" cborgen:"neg,omitempty" gorm:"column:neg"`
14 // sig: Signature of dag-cbor encoded label.
15 Sig []byte `json:"sig,omitempty" cborgen:"sig,omitempty" gorm:"column:sig"`
16 // src: DID of the actor who created this label.
···22 // ver: The AT Protocol version of the label object.
23 Ver *int64 `json:"ver,omitempty" cborgen:"ver,omitempty" gorm:"column:ver"`
2425- Record []byte `json:"record,omitempty" cborgen:"record,omitempty" gorm:"column:record"`
026}
2728func (m *DBModel) CreateLabel(label *Label) error {
···35 UpdateAll: true,
36 }).Create(label).Error
37}
0000000000000000000000000000
···1package model
23+import (
4+ "bytes"
5+ "time"
6+7+ comatproto "github.com/bluesky-social/indigo/api/atproto"
8+ "gorm.io/gorm/clause"
9+)
1011type Label struct {
12 // cid: Optionally, CID specifying the specific version of 'uri' resource this label applies to.
13 Cid *string `json:"cid,omitempty" cborgen:"cid,omitempty" gorm:"column:cid"`
14 // cts: Timestamp when this label was created.
15+ Cts time.Time `json:"cts" cborgen:"cts" gorm:"column:cts"`
16 // exp: Timestamp at which this label expires (no longer applies).
17+ Exp time.Time `json:"exp,omitempty" cborgen:"exp,omitempty" gorm:"column:exp"`
18 // neg: If true, this is a negation label, overwriting a previous label.
19+ Neg bool `json:"neg,omitempty" cborgen:"neg,omitempty" gorm:"column:neg"`
20 // sig: Signature of dag-cbor encoded label.
21 Sig []byte `json:"sig,omitempty" cborgen:"sig,omitempty" gorm:"column:sig"`
22 // src: DID of the actor who created this label.
···28 // ver: The AT Protocol version of the label object.
29 Ver *int64 `json:"ver,omitempty" cborgen:"ver,omitempty" gorm:"column:ver"`
3031+ Record []byte `json:"record,omitempty" cborgen:"record,omitempty" gorm:"column:record"`
32+ RepoDID string `json:"repoDID,omitempty" cborgen:"repoDID,omitempty" gorm:"column:repo_did"`
33}
3435func (m *DBModel) CreateLabel(label *Label) error {
···42 UpdateAll: true,
43 }).Create(label).Error
44}
45+46+func (m *DBModel) GetActiveLabels(uri string) ([]*comatproto.LabelDefs_Label, error) {
47+ now := time.Now().UTC()
48+ var labels []Label
49+ err := m.DB.Where("uri = ? AND (exp IS NULL OR exp < ?) AND neg = ?", uri, now, false).Find(&labels).Error
50+ if err != nil {
51+ return nil, err
52+ }
53+ lexs := make([]*comatproto.LabelDefs_Label, len(labels))
54+ for i, l := range labels {
55+ lex, err := l.ToLexicon()
56+ if err != nil {
57+ return nil, err
58+ }
59+ lexs[i] = lex
60+ }
61+ return lexs, nil
62+}
63+64+func (l Label) ToLexicon() (*comatproto.LabelDefs_Label, error) {
65+ r := bytes.NewReader(l.Record)
66+ var lex comatproto.LabelDefs_Label
67+ err := lex.UnmarshalCBOR(r)
68+ if err != nil {
69+ return nil, err
70+ }
71+ return &lex, nil
72+}