Skip to content
Snippets Groups Projects
Commit 53281ed1 authored by Josh Brooks's avatar Josh Brooks
Browse files

Remove method and have backup lists on ud.NewStore

parent ece3b054
No related branches found
No related tags found
3 merge requests!233Modify restore to call user-defined bindings callback. Add Sent requests to...,!231Revert "Update store to print changes to the partners list",!191Properly repopulate UD store after backup
...@@ -27,6 +27,7 @@ import ( ...@@ -27,6 +27,7 @@ import (
"gitlab.com/elixxir/crypto/backup" "gitlab.com/elixxir/crypto/backup"
"gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/cyclic"
"gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/crypto/fastRNG"
"gitlab.com/elixxir/primitives/fact"
"gitlab.com/elixxir/primitives/version" "gitlab.com/elixxir/primitives/version"
"gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/comms/connect"
"gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/crypto/csprng"
...@@ -97,7 +98,7 @@ func NewClient(ndfJSON, storageDir string, password []byte, ...@@ -97,7 +98,7 @@ func NewClient(ndfJSON, storageDir string, password []byte,
jww.DEBUG.Printf("User generation took: %s", time.Now().Sub(start)) jww.DEBUG.Printf("User generation took: %s", time.Now().Sub(start))
_, err = checkVersionAndSetupStorage(def, storageDir, password, protoUser, _, err = checkVersionAndSetupStorage(def, storageDir, password, protoUser,
cmixGrp, e2eGrp, rngStreamGen, false, registrationCode) cmixGrp, e2eGrp, rngStreamGen, false, registrationCode, nil)
if err != nil { if err != nil {
return err return err
} }
...@@ -128,7 +129,7 @@ func NewPrecannedClient(precannedID uint, defJSON, storageDir string, ...@@ -128,7 +129,7 @@ func NewPrecannedClient(precannedID uint, defJSON, storageDir string,
protoUser := createPrecannedUser(precannedID, rngStream, cmixGrp, e2eGrp) protoUser := createPrecannedUser(precannedID, rngStream, cmixGrp, e2eGrp)
_, err = checkVersionAndSetupStorage(def, storageDir, password, protoUser, _, err = checkVersionAndSetupStorage(def, storageDir, password, protoUser,
cmixGrp, e2eGrp, rngStreamGen, true, "") cmixGrp, e2eGrp, rngStreamGen, true, "", nil)
if err != nil { if err != nil {
return err return err
} }
...@@ -158,7 +159,7 @@ func NewVanityClient(ndfJSON, storageDir string, password []byte, ...@@ -158,7 +159,7 @@ func NewVanityClient(ndfJSON, storageDir string, password []byte,
protoUser := createNewVanityUser(rngStream, cmixGrp, e2eGrp, userIdPrefix) protoUser := createNewVanityUser(rngStream, cmixGrp, e2eGrp, userIdPrefix)
_, err = checkVersionAndSetupStorage(def, storageDir, password, protoUser, _, err = checkVersionAndSetupStorage(def, storageDir, password, protoUser,
cmixGrp, e2eGrp, rngStreamGen, false, registrationCode) cmixGrp, e2eGrp, rngStreamGen, false, registrationCode, nil)
if err != nil { if err != nil {
return err return err
} }
...@@ -199,7 +200,7 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, ...@@ -199,7 +200,7 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword,
// Note we do not need registration // Note we do not need registration
storageSess, err := checkVersionAndSetupStorage(def, storageDir, storageSess, err := checkVersionAndSetupStorage(def, storageDir,
[]byte(sessionPassword), usr, cmixGrp, e2eGrp, rngStreamGen, []byte(sessionPassword), usr, cmixGrp, e2eGrp, rngStreamGen,
false, backUp.RegistrationCode) false, backUp.RegistrationCode, backUp.UserDiscoveryRegistration.FactList)
// Set registration values in storage // Set registration values in storage
storageSess.User().SetReceptionRegistrationValidationSignature(backUp. storageSess.User().SetReceptionRegistrationValidationSignature(backUp.
...@@ -215,13 +216,6 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, ...@@ -215,13 +216,6 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword,
return nil, "", err return nil, "", err
} }
err = storageSess.GetUd().RestoreFromBackUp(backUp.
UserDiscoveryRegistration.FactList)
if err != nil {
return nil, "", errors.WithMessage(err, "Could not restore user "+
"discover storage")
}
return backUp.Contacts.Identities, backUp.JSONParams, nil return backUp.Contacts.Identities, backUp.JSONParams, nil
} }
...@@ -292,7 +286,7 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password, ...@@ -292,7 +286,7 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password,
// Set up storage // Set up storage
storageSess, err := checkVersionAndSetupStorage(def, storageDir, password, usr, storageSess, err := checkVersionAndSetupStorage(def, storageDir, password, usr,
cmixGrp, e2eGrp, rngStreamGen, false, protoUser.RegCode) cmixGrp, e2eGrp, rngStreamGen, false, protoUser.RegCode, nil)
if err != nil { if err != nil {
return err return err
} }
...@@ -955,7 +949,7 @@ func checkVersionAndSetupStorage(def *ndf.NetworkDefinition, ...@@ -955,7 +949,7 @@ func checkVersionAndSetupStorage(def *ndf.NetworkDefinition,
storageDir string, password []byte, storageDir string, password []byte,
protoUser user.User, protoUser user.User,
cmixGrp, e2eGrp *cyclic.Group, rngStreamGen *fastRNG.StreamGenerator, cmixGrp, e2eGrp *cyclic.Group, rngStreamGen *fastRNG.StreamGenerator,
isPrecanned bool, registrationCode string) (*storage.Session, error) { isPrecanned bool, registrationCode string, backupFacts fact.FactList) (*storage.Session, error) {
// Get current client version // Get current client version
currentVersion, err := version.ParseVersion(SEMVER) currentVersion, err := version.ParseVersion(SEMVER)
if err != nil { if err != nil {
...@@ -965,7 +959,8 @@ func checkVersionAndSetupStorage(def *ndf.NetworkDefinition, ...@@ -965,7 +959,8 @@ func checkVersionAndSetupStorage(def *ndf.NetworkDefinition,
// Create Storage // Create Storage
passwordStr := string(password) passwordStr := string(password)
storageSess, err := storage.New(storageDir, passwordStr, protoUser, storageSess, err := storage.New(storageDir, passwordStr, protoUser,
currentVersion, cmixGrp, e2eGrp, rngStreamGen, def.RateLimits) currentVersion, cmixGrp, e2eGrp, rngStreamGen, def.RateLimits,
backupFacts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -14,6 +14,7 @@ import ( ...@@ -14,6 +14,7 @@ import (
"gitlab.com/elixxir/client/storage/hostList" "gitlab.com/elixxir/client/storage/hostList"
"gitlab.com/elixxir/client/storage/rounds" "gitlab.com/elixxir/client/storage/rounds"
"gitlab.com/elixxir/client/storage/ud" "gitlab.com/elixxir/client/storage/ud"
"gitlab.com/elixxir/primitives/fact"
"gitlab.com/xx_network/primitives/rateLimiting" "gitlab.com/xx_network/primitives/rateLimiting"
"sync" "sync"
"testing" "testing"
...@@ -98,7 +99,7 @@ func initStore(baseDir, password string) (*Session, error) { ...@@ -98,7 +99,7 @@ func initStore(baseDir, password string) (*Session, error) {
func New(baseDir, password string, u userInterface.User, func New(baseDir, password string, u userInterface.User,
currentVersion version.Version, cmixGrp, e2eGrp *cyclic.Group, currentVersion version.Version, cmixGrp, e2eGrp *cyclic.Group,
rng *fastRNG.StreamGenerator, rng *fastRNG.StreamGenerator,
rateLimitParams ndf.RateLimiting) (*Session, error) { rateLimitParams ndf.RateLimiting, backupFacts fact.FactList) (*Session, error) {
s, err := initStore(baseDir, password) s, err := initStore(baseDir, password)
if err != nil { if err != nil {
...@@ -180,7 +181,7 @@ func New(baseDir, password string, u userInterface.User, ...@@ -180,7 +181,7 @@ func New(baseDir, password string, u userInterface.User,
s.bucketStore = utility.NewStoredBucket(uint32(rateLimitParams.Capacity), uint32(rateLimitParams.LeakedTokens), s.bucketStore = utility.NewStoredBucket(uint32(rateLimitParams.Capacity), uint32(rateLimitParams.LeakedTokens),
time.Duration(rateLimitParams.LeakDuration), s.kv) time.Duration(rateLimitParams.LeakDuration), s.kv)
s.ud, err = ud.NewStore(s.kv) s.ud, err = ud.NewStore(s.kv, backupFacts)
if err != nil { if err != nil {
return nil, errors.WithMessage(err, "Failed to create ud store") return nil, errors.WithMessage(err, "Failed to create ud store")
} }
...@@ -527,7 +528,7 @@ func InitTestingSession(i interface{}) *Session { ...@@ -527,7 +528,7 @@ func InitTestingSession(i interface{}) *Session {
// jww.FATAL.Panicf("Failed to create ring buffer store: %+v", err) // jww.FATAL.Panicf("Failed to create ring buffer store: %+v", err)
//} //}
s.ud, err = ud.NewStore(s.kv) s.ud, err = ud.NewStore(s.kv, nil)
if err != nil { if err != nil {
jww.FATAL.Panicf("Failed to create ud store: %v", err) jww.FATAL.Panicf("Failed to create ud store: %v", err)
} }
......
...@@ -21,7 +21,6 @@ const ( ...@@ -21,7 +21,6 @@ const (
"%s (%s) is non-empty but not an email. Cancelling backup operation" "%s (%s) is non-empty but not an email. Cancelling backup operation"
backupMissingAllZeroesFactErr = "Cannot backup missing facts: Both email and phone facts are empty!" backupMissingAllZeroesFactErr = "Cannot backup missing facts: Both email and phone facts are empty!"
factNotInStoreErr = "Fact %v does not exist in store" factNotInStoreErr = "Fact %v does not exist in store"
storeStatefulErr = "cannot overwrite ud store which already contains state"
) )
// Store is the storage object for the higher level ud.Manager object. // Store is the storage object for the higher level ud.Manager object.
...@@ -36,8 +35,10 @@ type Store struct { ...@@ -36,8 +35,10 @@ type Store struct {
mux sync.RWMutex mux sync.RWMutex
} }
// NewStore creates a new, empty Store object. // NewStore creates a new Store object. If we are initializing from a backup,
func NewStore(kv *versioned.KV) (*Store, error) { // the backupFacts fact.FactList will be non-nil and initialize the state
// with the backed up data.
func NewStore(kv *versioned.KV, backupFacts fact.FactList) (*Store, error) {
kv = kv.Prefix(prefix) kv = kv.Prefix(prefix)
s := &Store{ s := &Store{
confirmedFacts: make(map[fact.Fact]struct{}, 0), confirmedFacts: make(map[fact.Fact]struct{}, 0),
...@@ -45,25 +46,11 @@ func NewStore(kv *versioned.KV) (*Store, error) { ...@@ -45,25 +46,11 @@ func NewStore(kv *versioned.KV) (*Store, error) {
kv: kv, kv: kv,
} }
return s, s.save() for _, f := range backupFacts {
}
// RestoreFromBackUp initializes the confirmedFacts map
// with the backed up fact data. This will error if
// the store is already stateful.
func (s *Store) RestoreFromBackUp(backupData fact.FactList) error {
s.mux.Lock()
defer s.mux.Unlock()
if len(s.confirmedFacts) != 0 || len(s.unconfirmedFacts) != 0 {
return errors.New(storeStatefulErr)
}
for _, f := range backupData {
s.confirmedFacts[f] = struct{}{} s.confirmedFacts[f] = struct{}{}
} }
return nil return s, s.save()
} }
// StoreUnconfirmedFact stores a fact that has been added to UD but has not been // StoreUnconfirmedFact stores a fact that has been added to UD but has not been
......
...@@ -21,78 +21,18 @@ func TestNewStore(t *testing.T) { ...@@ -21,78 +21,18 @@ func TestNewStore(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore)) kv := versioned.NewKV(make(ekv.Memstore))
_, err := NewStore(kv) _, err := NewStore(kv, nil)
if err != nil { if err != nil {
t.Errorf("NewStore() produced an error: %v", err) t.Errorf("NewStore() produced an error: %v", err)
} }
} }
// Unit test
func TestStore_RestoreFromBackUp(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore))
s, err := NewStore(kv)
if err != nil {
t.Errorf("NewStore() produced an error: %v", err)
}
expected := fact.Fact{
Fact: "josh",
T: fact.Username,
}
fl := fact.FactList{expected}
err = s.RestoreFromBackUp(fl)
if err != nil {
t.Fatalf("RestoreFromBackup err: %v", err)
}
_, exists := s.confirmedFacts[expected]
if !exists {
t.Fatalf("Fact %s does not exist in map", expected)
}
}
// Error case.
func TestStore_RestoreFromBackUp_StatefulStore(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore))
s, err := NewStore(kv)
if err != nil {
t.Errorf("NewStore() produced an error: %v", err)
}
confirmId := "confirm"
expected := fact.Fact{
Fact: "josh",
T: fact.Username,
}
err = s.StoreUnconfirmedFact(confirmId, expected)
if err != nil {
t.Fatalf("StoreUnconfirmedFact error: %v", err)
}
// Expected error: should error when restoring on
// a stateful store.
fl := fact.FactList{expected}
err = s.RestoreFromBackUp(fl)
if err == nil {
t.Fatalf("RestoreFromBackup err: %v", err)
}
}
// Unit test. // Unit test.
func TestStore_ConfirmFact(t *testing.T) { func TestStore_ConfirmFact(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore)) kv := versioned.NewKV(make(ekv.Memstore))
expectedStore, err := NewStore(kv) expectedStore, err := NewStore(kv, nil)
if err != nil { if err != nil {
t.Errorf("NewStore() produced an error: %v", err) t.Errorf("NewStore() produced an error: %v", err)
} }
...@@ -130,7 +70,7 @@ func TestStore_ConfirmFact(t *testing.T) { ...@@ -130,7 +70,7 @@ func TestStore_ConfirmFact(t *testing.T) {
func TestStore_StoreUnconfirmedFact(t *testing.T) { func TestStore_StoreUnconfirmedFact(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore)) kv := versioned.NewKV(make(ekv.Memstore))
expectedStore, err := NewStore(kv) expectedStore, err := NewStore(kv, nil)
if err != nil { if err != nil {
t.Errorf("NewStore() produced an error: %v", err) t.Errorf("NewStore() produced an error: %v", err)
} }
...@@ -192,7 +132,7 @@ func TestStore_DeleteFact(t *testing.T) { ...@@ -192,7 +132,7 @@ func TestStore_DeleteFact(t *testing.T) {
func TestStore_BackUpMissingFacts(t *testing.T) { func TestStore_BackUpMissingFacts(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore)) kv := versioned.NewKV(make(ekv.Memstore))
expectedStore, err := NewStore(kv) expectedStore, err := NewStore(kv, nil)
if err != nil { if err != nil {
t.Errorf("NewStore() produced an error: %v", err) t.Errorf("NewStore() produced an error: %v", err)
} }
...@@ -228,7 +168,7 @@ func TestStore_BackUpMissingFacts(t *testing.T) { ...@@ -228,7 +168,7 @@ func TestStore_BackUpMissingFacts(t *testing.T) {
func TestStore_BackUpMissingFacts_DuplicateFactType(t *testing.T) { func TestStore_BackUpMissingFacts_DuplicateFactType(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore)) kv := versioned.NewKV(make(ekv.Memstore))
expectedStore, err := NewStore(kv) expectedStore, err := NewStore(kv, nil)
if err != nil { if err != nil {
t.Errorf("NewStore() produced an error: %v", err) t.Errorf("NewStore() produced an error: %v", err)
} }
...@@ -266,7 +206,7 @@ func TestStore_BackUpMissingFacts_DuplicateFactType(t *testing.T) { ...@@ -266,7 +206,7 @@ func TestStore_BackUpMissingFacts_DuplicateFactType(t *testing.T) {
func TestStore_GetFacts(t *testing.T) { func TestStore_GetFacts(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore)) kv := versioned.NewKV(make(ekv.Memstore))
testStore, err := NewStore(kv) testStore, err := NewStore(kv, nil)
if err != nil { if err != nil {
t.Errorf("NewStore() produced an error: %v", err) t.Errorf("NewStore() produced an error: %v", err)
} }
...@@ -316,7 +256,7 @@ func TestStore_GetFacts(t *testing.T) { ...@@ -316,7 +256,7 @@ func TestStore_GetFacts(t *testing.T) {
func TestStore_GetFactStrings(t *testing.T) { func TestStore_GetFactStrings(t *testing.T) {
kv := versioned.NewKV(make(ekv.Memstore)) kv := versioned.NewKV(make(ekv.Memstore))
testStore, err := NewStore(kv) testStore, err := NewStore(kv, nil)
if err != nil { if err != nil {
t.Errorf("NewStore() produced an error: %v", err) t.Errorf("NewStore() produced an error: %v", err)
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment