db: Remove User without corresponding AuthUser

This commit is contained in:
nemunaire 2023-01-10 17:03:25 +01:00
parent 34ff91e6c0
commit 0ea2f2cf82
2 changed files with 48 additions and 3 deletions

View File

@ -71,7 +71,7 @@ func NewLevelDBStorage(path string) (s *LevelDBStorage, err error) {
}
func (s *LevelDBStorage) Tidy() error {
for _, tidy := range []func() error{s.TidySessions, s.TidyAuthUsers, s.TidyProviders, s.TidyDomains, s.TidyZones} {
for _, tidy := range []func() error{s.TidySessions, s.TidyAuthUsers, s.TidyUsers, s.TidyProviders, s.TidyDomains, s.TidyZones} {
if err := tidy(); err != nil {
return err
}

View File

@ -37,6 +37,7 @@ import (
"git.happydns.org/happydomain/model"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/util"
)
@ -62,12 +63,16 @@ func (s *LevelDBStorage) GetUsers() (users happydns.Users, err error) {
return
}
func (s *LevelDBStorage) GetUser(id happydns.Identifier) (u *happydns.User, err error) {
func (s *LevelDBStorage) getUser(key string) (u *happydns.User, err error) {
u = &happydns.User{}
err = s.get(fmt.Sprintf("user-%s", id.String()), &u)
err = s.get(key, &u)
return
}
func (s *LevelDBStorage) GetUser(id happydns.Identifier) (u *happydns.User, err error) {
return s.getUser(fmt.Sprintf("user-%s", id.String()))
}
func (s *LevelDBStorage) GetUserByEmail(email string) (u *happydns.User, err error) {
var users happydns.Users
@ -148,3 +153,43 @@ func (s *LevelDBStorage) ClearUsers() error {
return nil
}
func (s *LevelDBStorage) TidyUsers() error {
tx, err := s.db.OpenTransaction()
if err != nil {
return err
}
iter := tx.NewIterator(util.BytesPrefix([]byte("user-")), nil)
defer iter.Release()
for iter.Next() {
user, err := s.getUser(string(iter.Key()))
if err != nil {
// Drop unreadable providers
log.Printf("Deleting unreadable user (%s): %v\n", err.Error(), user)
err = tx.Delete(iter.Key(), nil)
} else {
_, err = s.GetAuthUser(user.Id)
if err == leveldb.ErrNotFound {
// Drop providers of unexistant users
log.Printf("Deleting orphan user (authuser %s not found): %v\n", user.Id.String(), user)
err = tx.Delete(iter.Key(), nil)
}
}
if err != nil {
tx.Discard()
return err
}
}
err = tx.Commit()
if err != nil {
tx.Discard()
return err
}
return nil
}