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 ( @@ -36,7 +36,7 @@ const (
type Curating struct {
Ctx context.Context
cfg *config.C
db *database.D
db database.Database
curatingACL *database.CuratingACL
owners [][]byte
admins [][]byte
@ -56,9 +56,14 @@ func (c *Curating) Configure(cfg ...any) (err error) { @@ -56,9 +56,14 @@ func (c *Curating) Configure(cfg ...any) (err error) {
switch cv := ca.(type) {
case *config.C:
c.cfg = cv
case *database.D:
case database.Database:
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:
c.Ctx = cv
default:

22
pkg/acl/follows.go

@ -35,7 +35,7 @@ import ( @@ -35,7 +35,7 @@ import (
type Follows struct {
Ctx context.Context
cfg *config.C
*database.D
db database.Database
pubs *publish.S
followsMx sync.RWMutex
admins [][]byte
@ -56,9 +56,9 @@ func (f *Follows) Configure(cfg ...any) (err error) { @@ -56,9 +56,9 @@ func (f *Follows) Configure(cfg ...any) (err error) {
case *config.C:
// log.D.F("setting ACL config: %v", c)
f.cfg = c
case *database.D:
case database.Database:
// log.D.F("setting ACL database: %s", c.Path())
f.D = c
f.db = c
case context.Context:
// log.D.F("setting ACL context: %s", c.Value("id"))
f.Ctx = c
@ -69,7 +69,7 @@ func (f *Follows) Configure(cfg ...any) (err error) { @@ -69,7 +69,7 @@ func (f *Follows) Configure(cfg ...any) (err error) {
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")
return
}
@ -109,7 +109,7 @@ func (f *Follows) Configure(cfg ...any) (err error) { @@ -109,7 +109,7 @@ func (f *Follows) Configure(cfg ...any) (err error) {
var sers types.Uint40s
for _, idx := range idxs {
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
}
sers = append(sers, s...)
@ -117,7 +117,7 @@ func (f *Follows) Configure(cfg ...any) (err error) { @@ -117,7 +117,7 @@ func (f *Follows) Configure(cfg ...any) (err error) {
if len(sers) > 0 {
for _, s := range sers {
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
}
// log.I.F("admin follow list:\n%s", ev.Serialize())
@ -268,14 +268,14 @@ func (f *Follows) adminRelays() (urls []string) { @@ -268,14 +268,14 @@ func (f *Follows) adminRelays() (urls []string) {
}
var sers types.Uint40s
for _, idx := range idxs {
s, err := f.D.GetSerialsByRange(idx)
s, err := f.db.GetSerialsByRange(idx)
if chk.E(err) {
continue
}
sers = append(sers, s...)
}
for _, s := range sers {
ev, err := f.D.FetchEventBySerial(s)
ev, err := f.db.FetchEventBySerial(s)
if chk.E(err) || ev == nil {
continue
}
@ -663,7 +663,7 @@ func (f *Follows) processCollectedEvents(relayURL string, followListEvents, meta @@ -663,7 +663,7 @@ func (f *Follows) processCollectedEvents(relayURL string, followListEvents, meta
// Save follow list events to database and extract follows
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:") {
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 @@ -682,7 +682,7 @@ func (f *Follows) processCollectedEvents(relayURL string, followListEvents, meta
// Save metadata events to database
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:") {
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 @@ -695,7 +695,7 @@ func (f *Follows) processCollectedEvents(relayURL string, followListEvents, meta
// Save relay list events to database
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:") {
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 ( @@ -19,7 +19,7 @@ import (
type Managed struct {
Ctx context.Context
cfg *config.C
*database.D
db database.Database
managedACL *database.ManagedACL
owners [][]byte
admins [][]byte
@ -33,16 +33,22 @@ func (m *Managed) Configure(cfg ...any) (err error) { @@ -33,16 +33,22 @@ func (m *Managed) Configure(cfg ...any) (err error) {
switch c := ca.(type) {
case *config.C:
m.cfg = c
case *database.D:
m.D = c
m.managedACL = database.NewManagedACL(c)
case database.Database:
m.db = 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:
m.Ctx = c
default:
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")
return
}

2
pkg/acl/managed_minimal_test.go

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

2
pkg/version/version

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

Loading…
Cancel
Save