Implement zone management in levelDB driver: now fully implemented

This commit is contained in:
nemunaire 2020-04-20 13:05:11 +02:00
parent 53e6b315c7
commit 92896d8a84
7 changed files with 137 additions and 44 deletions

View File

@ -101,12 +101,12 @@ func apiAuthHandler(f func(*config.Options, *happydns.User, httprouter.Params, i
err: err,
status: http.StatusUnauthorized,
}.WriteResponse(w)
} else if session, err := storage.UsersStore.GetSession(sessionid); err != nil {
} else if session, err := storage.MainStore.GetSession(sessionid); err != nil {
APIErrorResponse{
err: err,
status: http.StatusUnauthorized,
}.WriteResponse(w)
} else if std, err := storage.UsersStore.GetUser(int(session.IdUser)); err != nil {
} else if std, err := storage.MainStore.GetUser(int(session.IdUser)); err != nil {
APIErrorResponse{
err: err,
status: http.StatusUnauthorized,

View File

@ -52,7 +52,7 @@ func dummyAuth(_ httprouter.Params, body io.Reader) Response {
}
}
if user, err := storage.UsersStore.GetUserByEmail(lf.Email); err != nil {
if user, err := storage.MainStore.GetUserByEmail(lf.Email); err != nil {
return APIErrorResponse{
err: err,
}
@ -64,7 +64,7 @@ func dummyAuth(_ httprouter.Params, body io.Reader) Response {
}
}
if err := storage.UsersStore.CreateSession(session); err != nil {
if err := storage.MainStore.CreateSession(session); err != nil {
return APIErrorResponse{
err: err,
}
@ -88,7 +88,7 @@ func checkAuth(_ httprouter.Params, body io.Reader) Response {
}
}
if user, err := storage.UsersStore.GetUserByEmail(lf.Email); err != nil {
if user, err := storage.MainStore.GetUserByEmail(lf.Email); err != nil {
return APIErrorResponse{
err: err,
}
@ -105,7 +105,7 @@ func checkAuth(_ httprouter.Params, body io.Reader) Response {
}
}
if err := storage.UsersStore.CreateSession(session); err != nil {
if err := storage.MainStore.CreateSession(session); err != nil {
return APIErrorResponse{
err: err,
}

View File

@ -40,7 +40,7 @@ func registerUser(opts *config.Options, p httprouter.Params, body io.Reader) Res
return APIErrorResponse{
err: err,
}
} else if err := storage.UsersStore.CreateUser(user); err != nil {
} else if err := storage.MainStore.CreateUser(user); err != nil {
return APIErrorResponse{
err: err,
}

15
main.go
View File

@ -13,7 +13,6 @@ import (
"git.happydns.org/happydns/config"
"git.happydns.org/happydns/storage"
leveldb "git.happydns.org/happydns/storage/leveldb"
mysql "git.happydns.org/happydns/storage/mysql"
)
type ResponseWriterPrefix struct {
@ -71,27 +70,17 @@ func main() {
// Initialize contents
log.Println("Opening database...")
if store, err := mysql.NewMySQLStorage(opts.DSN); err != nil {
log.Fatal("Cannot open the database: ", err)
} else {
storage.MainStore = store
}
defer storage.MainStore.Close()
if store, err := leveldb.NewLevelDBStorage("happydns.db"); err != nil {
log.Fatal("Cannot open the database: ", err)
} else {
storage.UsersStore = store
defer store.Close()
storage.MainStore = store
}
defer storage.UsersStore.Close()
log.Println("Do database migrations...")
if err = storage.MainStore.DoMigration(); err != nil {
log.Fatal("Cannot migrate database: ", err)
}
if err = storage.UsersStore.DoMigration(); err != nil {
log.Fatal("Cannot migrate users database: ", err)
}
// Serve content
log.Println("Ready, listening on", opts.Bind)

View File

@ -33,23 +33,3 @@ type Storage interface {
DeleteZone(z *happydns.Zone) error
ClearZones() error
}
type UserStorage interface {
DoMigration() error
Close() error
GetSession(id []byte) (*happydns.Session, error)
CreateSession(session *happydns.Session) error
UpdateSession(session *happydns.Session) error
DeleteSession(session *happydns.Session) error
ClearSessions() error
GetUsers() (happydns.Users, error)
GetUser(id int) (*happydns.User, error)
GetUserByEmail(email string) (*happydns.User, error)
UserExists(email string) bool
CreateUser(user *happydns.User) error
UpdateUser(user *happydns.User) error
DeleteUser(user *happydns.User) error
ClearUsers() error
}

127
storage/leveldb/zone.go Normal file
View File

@ -0,0 +1,127 @@
package database
import (
"fmt"
"git.happydns.org/happydns/model"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/util"
)
func (s *LevelDBStorage) GetZones(u *happydns.User) (zones happydns.Zones, err error) {
iter := s.search("zone-")
defer iter.Release()
for iter.Next() {
var z happydns.Zone
err = decodeData(iter.Value(), &z)
if err != nil {
return
}
if z.IdUser == u.Id {
zones = append(zones, &z)
}
}
return
}
func (s *LevelDBStorage) GetZone(u *happydns.User, id int) (z *happydns.Zone, err error) {
z = &happydns.Zone{}
err = s.get(fmt.Sprintf("zone-%d", id), &z)
if z.IdUser != u.Id {
z = nil
err = leveldb.ErrNotFound
}
return
}
func (s *LevelDBStorage) GetZoneByDN(u *happydns.User, dn string) (*happydns.Zone, error) {
zones, err := s.GetZones(u)
if err != nil {
return nil, err
}
for _, zone := range zones {
if zone.DomainName == dn {
return zone, nil
}
}
return nil, leveldb.ErrNotFound
}
func (s *LevelDBStorage) ZoneExists(dn string) bool {
iter := s.search("zone-")
defer iter.Release()
for iter.Next() {
var z happydns.Zone
err := decodeData(iter.Value(), &z)
if err != nil {
continue
}
if z.DomainName == dn {
return true
}
}
return false
}
func (s *LevelDBStorage) CreateZone(u *happydns.User, z *happydns.Zone) error {
key, id, err := s.findInt63Key("zone-")
if err != nil {
return err
}
z.Id = id
z.IdUser = u.Id
return s.put(key, z)
}
func (s *LevelDBStorage) UpdateZone(z *happydns.Zone) error {
return s.put(fmt.Sprintf("zone-%d", z.Id), z)
}
func (s *LevelDBStorage) UpdateZoneOwner(z *happydns.Zone, newOwner *happydns.User) error {
z.IdUser = newOwner.Id
return s.put(fmt.Sprintf("zone-%d", z.Id), z)
}
func (s *LevelDBStorage) DeleteZone(z *happydns.Zone) error {
return s.delete(fmt.Sprintf("zone-%d", z.Id))
}
func (s *LevelDBStorage) ClearZones() error {
tx, err := s.db.OpenTransaction()
if err != nil {
return err
}
iter := tx.NewIterator(util.BytesPrefix([]byte("zone-")), nil)
defer iter.Release()
for iter.Next() {
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
}

View File

@ -1,6 +1,3 @@
package storage
var (
MainStore Storage
UsersStore UserStorage
)
var MainStore Storage