Browse Source

Fix ACL interface compatibility with gRPC database backend (v0.53.1)

- Change Follows, Managed, and Curating ACL structs to use database.Database
  interface instead of concrete *database.D type
- Add type assertions for ManagedACL and CuratingACL initialization since
  they require Badger-specific APIs
- Log warning when running managed/curating ACL with non-Badger backend
- Update managed_minimal_test.go to use new field name

Files modified:
- pkg/acl/follows.go: Use db database.Database field, replace f.D with f.db
- pkg/acl/managed.go: Use db database.Database with type assertion for ManagedACL
- pkg/acl/curating.go: Use db database.Database with type assertion for CuratingACL
- pkg/acl/managed_minimal_test.go: Update test to use db field
- pkg/version/version: Bump to v0.53.1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
main v0.53.1
woikos 4 months ago
parent
commit
9b4497e775
No known key found for this signature in database
  1. 11
      pkg/acl/curating.go
  2. 22
      pkg/acl/follows.go
  3. 16
      pkg/acl/managed.go
  4. 2
      pkg/acl/managed_minimal_test.go
  5. 2
      pkg/version/version

11
pkg/acl/curating.go

@ -36,7 +36,7 @@ const (
type Curating struct { type Curating struct {
Ctx context.Context Ctx context.Context
cfg *config.C cfg *config.C
db *database.D db database.Database
curatingACL *database.CuratingACL curatingACL *database.CuratingACL
owners [][]byte owners [][]byte
admins [][]byte admins [][]byte
@ -56,9 +56,14 @@ func (c *Curating) Configure(cfg ...any) (err error) {
switch cv := ca.(type) { switch cv := ca.(type) {
case *config.C: case *config.C:
c.cfg = cv c.cfg = cv
case *database.D: case database.Database:
c.db = cv c.db = cv
c.curatingACL = database.NewCuratingACL(cv) // CuratingACL requires the concrete Badger database type
if d, ok := cv.(*database.D); ok {
c.curatingACL = database.NewCuratingACL(d)
} else {
log.W.F("curating ACL: database is not Badger, curating ACL features will be limited")
}
case context.Context: case context.Context:
c.Ctx = cv c.Ctx = cv
default: default:

22
pkg/acl/follows.go

@ -35,7 +35,7 @@ import (
type Follows struct { type Follows struct {
Ctx context.Context Ctx context.Context
cfg *config.C cfg *config.C
*database.D db database.Database
pubs *publish.S pubs *publish.S
followsMx sync.RWMutex followsMx sync.RWMutex
admins [][]byte admins [][]byte
@ -56,9 +56,9 @@ func (f *Follows) Configure(cfg ...any) (err error) {
case *config.C: case *config.C:
// log.D.F("setting ACL config: %v", c) // log.D.F("setting ACL config: %v", c)
f.cfg = c f.cfg = c
case *database.D: case database.Database:
// log.D.F("setting ACL database: %s", c.Path()) // log.D.F("setting ACL database: %s", c.Path())
f.D = c f.db = c
case context.Context: case context.Context:
// log.D.F("setting ACL context: %s", c.Value("id")) // log.D.F("setting ACL context: %s", c.Value("id"))
f.Ctx = c f.Ctx = c
@ -69,7 +69,7 @@ func (f *Follows) Configure(cfg ...any) (err error) {
err = errorf.E("invalid type: %T", reflect.TypeOf(ca)) err = errorf.E("invalid type: %T", reflect.TypeOf(ca))
} }
} }
if f.cfg == nil || f.D == nil { if f.cfg == nil || f.db == nil {
err = errorf.E("both config and database must be set") err = errorf.E("both config and database must be set")
return return
} }
@ -109,7 +109,7 @@ func (f *Follows) Configure(cfg ...any) (err error) {
var sers types.Uint40s var sers types.Uint40s
for _, idx := range idxs { for _, idx := range idxs {
var s types.Uint40s var s types.Uint40s
if s, err = f.D.GetSerialsByRange(idx); chk.E(err) { if s, err = f.db.GetSerialsByRange(idx); chk.E(err) {
continue continue
} }
sers = append(sers, s...) sers = append(sers, s...)
@ -117,7 +117,7 @@ func (f *Follows) Configure(cfg ...any) (err error) {
if len(sers) > 0 { if len(sers) > 0 {
for _, s := range sers { for _, s := range sers {
var ev *event.E var ev *event.E
if ev, err = f.D.FetchEventBySerial(s); chk.E(err) { if ev, err = f.db.FetchEventBySerial(s); chk.E(err) {
continue continue
} }
// log.I.F("admin follow list:\n%s", ev.Serialize()) // log.I.F("admin follow list:\n%s", ev.Serialize())
@ -268,14 +268,14 @@ func (f *Follows) adminRelays() (urls []string) {
} }
var sers types.Uint40s var sers types.Uint40s
for _, idx := range idxs { for _, idx := range idxs {
s, err := f.D.GetSerialsByRange(idx) s, err := f.db.GetSerialsByRange(idx)
if chk.E(err) { if chk.E(err) {
continue continue
} }
sers = append(sers, s...) sers = append(sers, s...)
} }
for _, s := range sers { for _, s := range sers {
ev, err := f.D.FetchEventBySerial(s) ev, err := f.db.FetchEventBySerial(s)
if chk.E(err) || ev == nil { if chk.E(err) || ev == nil {
continue continue
} }
@ -663,7 +663,7 @@ func (f *Follows) processCollectedEvents(relayURL string, followListEvents, meta
// Save follow list events to database and extract follows // Save follow list events to database and extract follows
for pubkeyHex, ev := range latestFollowLists { for pubkeyHex, ev := range latestFollowLists {
if _, err := f.D.SaveEvent(f.Ctx, ev); err != nil { if _, err := f.db.SaveEvent(f.Ctx, ev); err != nil {
if !strings.HasPrefix(err.Error(), "blocked:") { if !strings.HasPrefix(err.Error(), "blocked:") {
log.W.F("follows syncer: failed to save follow list from %s: %v", pubkeyHex, err) log.W.F("follows syncer: failed to save follow list from %s: %v", pubkeyHex, err)
} }
@ -682,7 +682,7 @@ func (f *Follows) processCollectedEvents(relayURL string, followListEvents, meta
// Save metadata events to database // Save metadata events to database
for pubkeyHex, ev := range latestMetadata { for pubkeyHex, ev := range latestMetadata {
if _, err := f.D.SaveEvent(f.Ctx, ev); err != nil { if _, err := f.db.SaveEvent(f.Ctx, ev); err != nil {
if !strings.HasPrefix(err.Error(), "blocked:") { if !strings.HasPrefix(err.Error(), "blocked:") {
log.W.F("follows syncer: failed to save metadata from %s: %v", pubkeyHex, err) log.W.F("follows syncer: failed to save metadata from %s: %v", pubkeyHex, err)
} }
@ -695,7 +695,7 @@ func (f *Follows) processCollectedEvents(relayURL string, followListEvents, meta
// Save relay list events to database // Save relay list events to database
for pubkeyHex, ev := range latestRelayLists { for pubkeyHex, ev := range latestRelayLists {
if _, err := f.D.SaveEvent(f.Ctx, ev); err != nil { if _, err := f.db.SaveEvent(f.Ctx, ev); err != nil {
if !strings.HasPrefix(err.Error(), "blocked:") { if !strings.HasPrefix(err.Error(), "blocked:") {
log.W.F("follows syncer: failed to save relay list from %s: %v", pubkeyHex, err) log.W.F("follows syncer: failed to save relay list from %s: %v", pubkeyHex, err)
} }

16
pkg/acl/managed.go

@ -19,7 +19,7 @@ import (
type Managed struct { type Managed struct {
Ctx context.Context Ctx context.Context
cfg *config.C cfg *config.C
*database.D db database.Database
managedACL *database.ManagedACL managedACL *database.ManagedACL
owners [][]byte owners [][]byte
admins [][]byte admins [][]byte
@ -33,16 +33,22 @@ func (m *Managed) Configure(cfg ...any) (err error) {
switch c := ca.(type) { switch c := ca.(type) {
case *config.C: case *config.C:
m.cfg = c m.cfg = c
case *database.D: case database.Database:
m.D = c m.db = c
m.managedACL = database.NewManagedACL(c) // ManagedACL requires the concrete Badger database type
// Type assertion to check if it's a Badger database
if d, ok := c.(*database.D); ok {
m.managedACL = database.NewManagedACL(d)
} else {
log.W.F("managed ACL: database is not Badger, managed ACL features will be limited")
}
case context.Context: case context.Context:
m.Ctx = c m.Ctx = c
default: default:
err = errorf.E("invalid type: %T", reflect.TypeOf(ca)) err = errorf.E("invalid type: %T", reflect.TypeOf(ca))
} }
} }
if m.cfg == nil || m.D == nil { if m.cfg == nil || m.db == nil {
err = errorf.E("both config and database must be set") err = errorf.E("both config and database must be set")
return return
} }

2
pkg/acl/managed_minimal_test.go

@ -33,7 +33,7 @@ func TestManagedACL_BasicFunctionality(t *testing.T) {
managed := &Managed{ managed := &Managed{
Ctx: ctx, Ctx: ctx,
cfg: cfg, cfg: cfg,
D: db, db: db,
managedACL: database.NewManagedACL(db), managedACL: database.NewManagedACL(db),
owners: [][]byte{[]byte("owner1")}, owners: [][]byte{[]byte("owner1")},
admins: [][]byte{[]byte("admin1")}, admins: [][]byte{[]byte("admin1")},

2
pkg/version/version

@ -1 +1 @@
v0.53.0 v0.53.1

Loading…
Cancel
Save