diff --git a/api/client.go b/api/client.go index 4f1647b4cbf1152d38043406b7c511134b43d044..42fa1e69e25a22ad5c9fe7d1efd12a8625c96d15 100644 --- a/api/client.go +++ b/api/client.go @@ -30,6 +30,7 @@ import ( ) type Client struct { + storage globals.Storage sess user.Session comm io.Communications quitReceptionRunner chan bool @@ -50,19 +51,30 @@ func FormatTextMessage(message string) []byte { return wireRepresentation } -// Initializes the client by registering a storage mechanism. -// If none is provided, the system defaults to using OS file access +// Creates a new Client using the storage mechanism provided. +// If none is provided, a default storage using OS file access +// is created // returns a new Client object, and an error if it fails -func InitClient(s globals.Storage, loc string) (*Client, error) { - storageErr := globals.InitStorage(s, loc) +func NewClient(s globals.Storage, loc string) (*Client, error) { + var store globals.Storage + if s == nil { + globals.Log.WARN.Printf("No storage provided," + + " initializing Client with default storage") + store = &globals.DefaultStorage{} + } else { + store = s + } + + err := store.SetLocation(loc) - if storageErr != nil { - storageErr = errors.New( - "could not init client storage: " + storageErr.Error()) - return nil, storageErr + if err != nil { + err = errors.New("Invalid Local Storage Location: " + err.Error()) + globals.Log.ERROR.Printf(err.Error()) + return nil, err } cl := new(Client) + cl.storage = store cl.comm = io.NewMessenger() cl.listeners = switchboard.NewSwitchboard() return cl, nil @@ -113,7 +125,8 @@ func (cl *Client) Register(registrationCode string, gwAddr string, nk[i] = *nodekeys } - nus := user.NewSession(u, gwAddr, nk, grp.NewIntFromBytes([]byte("this is not a real public key")), grp) + nus := user.NewSession(cl.storage, u, gwAddr, nk, + grp.NewIntFromBytes([]byte("this is not a real public key")), grp) _, err = payment.CreateWallet(nus, io.NewMessenger(), mint) if err != nil { @@ -144,7 +157,7 @@ func (cl *Client) Login(UID *id.User, addr string, tlsCert string) (string, erro connect.GatewayCertString = tlsCert - session, err := user.LoadSession(UID) + session, err := user.LoadSession(cl.storage, UID) if session == nil { return "", errors.New("Unable to load session: " + err.Error() + @@ -262,12 +275,6 @@ func (cl *Client) Logout() error { } errStore := cl.sess.StoreSession() - // If a client is logging in again, the storage may need to go into a - // different location - // Currently, none of the storage abstractions need to do anything to - // clean up in the long term. For example, DefaultStorage closes the - // file every time it's written. - globals.LocalStorage = nil if errStore != nil { err := errors.New(fmt.Sprintf("Logout: Store Failed: %s" + diff --git a/api/client_test.go b/api/client_test.go index e75b38b4cc6df05008b2c599893a0d04a1541397..30fcd9ab892891d1b6ed666cfb776a6885e6a735 100644 --- a/api/client_test.go +++ b/api/client_test.go @@ -34,7 +34,7 @@ var client *Client func TestRegistrationGob(t *testing.T) { // Get a Client var err error - client, err = InitClient(&globals.RamStorage{}, "") + client, err = NewClient(&globals.RamStorage{}, "") if err != nil { t.Error(err) } @@ -47,7 +47,7 @@ func TestRegistrationGob(t *testing.T) { } // get the gob out of there again - sessionGob := globals.LocalStorage.Load() + sessionGob := client.storage.Load() var sessionBytes bytes.Buffer sessionBytes.Write(sessionGob) dec := gob.NewDecoder(&sessionBytes) @@ -262,7 +262,8 @@ func TestRegisterUserE2E(t *testing.T) { partnerPubKeyCyclic := grp.NewIntFromLargeInt(partnerPubKey.GetKey()) myUser := &user.User{User: userID, Nick: "test"} - session := user.NewSession(myUser, "", []user.NodeKeys{}, myPubKeyCyclic, grp) + session := user.NewSession(client.storage, + myUser, "", []user.NodeKeys{}, myPubKeyCyclic, grp) client.sess = session @@ -342,7 +343,8 @@ func TestRegisterUserE2E_CheckAllKeys(t *testing.T) { partnerPubKeyCyclic := grp.NewIntFromLargeInt(partnerPubKey.GetKey()) myUser := &user.User{User: userID, Nick: "test"} - session := user.NewSession(myUser, "", []user.NodeKeys{}, myPubKeyCyclic, grp) + session := user.NewSession(client.storage, + myUser, "", []user.NodeKeys{}, myPubKeyCyclic, grp) client.sess = session diff --git a/api/mockserver_test.go b/api/mockserver_test.go index a5df8e77d24105767aa1ed1e5025e7c48e37e5ca..459e38e28a85ed1e6f7973c9d496800f2ee8933c 100644 --- a/api/mockserver_test.go +++ b/api/mockserver_test.go @@ -11,7 +11,6 @@ import ( "fmt" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/crypto" - "gitlab.com/elixxir/client/globals" "gitlab.com/elixxir/client/user" "gitlab.com/elixxir/comms/gateway" pb "gitlab.com/elixxir/comms/mixmessages" @@ -41,19 +40,6 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -// Make sure InitClient registers storage. -func TestInitClient(t *testing.T) { - globals.LocalStorage = nil - _, err := InitClient(nil, "") - if err != nil { - t.Errorf("InitClient failed on valid input: %v", err) - } - if globals.LocalStorage == nil { - t.Errorf("InitClient did not register storage.") - } - globals.LocalStorage = nil -} - func TestRegister(t *testing.T) { gwShutDown := gateway.StartGateway(gwAddress, gateway.NewImplementation(), "", "") @@ -62,7 +48,7 @@ func TestRegister(t *testing.T) { registrationCode := "UAV6IWD6" d := DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -86,7 +72,6 @@ func TestRegister(t *testing.T) { if *regRes == *id.ZeroID { t.Errorf("Invalid registration number received: %v", *regRes) } - globals.LocalStorage = nil } func TestRegisterBadNumNodes(t *testing.T) { @@ -97,7 +82,7 @@ func TestRegisterBadNumNodes(t *testing.T) { registrationCode := "UAV6IWD6" d := DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") p := large.NewInt(int64(1)) g := large.NewInt(int64(2)) q := large.NewInt(int64(3)) @@ -106,7 +91,6 @@ func TestRegisterBadNumNodes(t *testing.T) { if err == nil { t.Errorf("Registration worked with bad numnodes! %s", err.Error()) } - globals.LocalStorage = nil } func TestRegisterBadHUID(t *testing.T) { @@ -117,7 +101,7 @@ func TestRegisterBadHUID(t *testing.T) { registrationCode := "OIF3OJ6I" d := DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") p := large.NewInt(int64(1)) g := large.NewInt(int64(2)) q := large.NewInt(int64(3)) @@ -126,7 +110,6 @@ func TestRegisterBadHUID(t *testing.T) { if err == nil { t.Error("Registration worked with bad registration code!") } - globals.LocalStorage = nil } func TestRegisterDeletedUser(t *testing.T) { @@ -137,7 +120,7 @@ func TestRegisterDeletedUser(t *testing.T) { registrationCode := "UAV6IWD6" d := DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") p := large.NewInt(int64(1)) g := large.NewInt(int64(2)) q := large.NewInt(int64(3)) @@ -150,7 +133,6 @@ func TestRegisterDeletedUser(t *testing.T) { err.Error()) } user.Users.UpsertUser(tempUser) - globals.LocalStorage = nil } func SetNulKeys(s user.Session) { @@ -169,9 +151,8 @@ func TestSend(t *testing.T) { time.Sleep(100 * time.Millisecond) defer gwShutDown() - globals.LocalStorage = nil d := DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") grp := crypto.InitCrypto() registrationCode := "UAV6IWD6" userID, err := client.Register(registrationCode, gwAddress, 1, false, grp) @@ -212,9 +193,8 @@ func TestLogout(t *testing.T) { time.Sleep(100 * time.Millisecond) defer gwShutDown() - globals.LocalStorage = nil d := DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") grp := crypto.InitCrypto() registrationCode := "UAV6IWD6" userID, err := client.Register(registrationCode, gwAddress, 1, false, grp) diff --git a/bindings/client.go b/bindings/client.go index 82ded2f5d0b23ff972055a9bfd0a441d9303acf9..bdb74194c11b002bf3a30acb82b1db4f329c6af3 100644 --- a/bindings/client.go +++ b/bindings/client.go @@ -100,13 +100,13 @@ func FormatTextMessage(message string) []byte { // loc is a string. If you're using DefaultStorage for your storage, // this would be the filename of the file that you're storing the user // session in. -func InitClient(storage Storage, loc string) (*Client, error) { +func NewClient(storage Storage, loc string) (*Client, error) { if storage == nil { return nil, errors.New("could not init client: Storage was nil") } proxy := &storageProxy{boundStorage: storage} - cl, err := api.InitClient(globals.Storage(proxy), loc) + cl, err := api.NewClient(globals.Storage(proxy), loc) return &Client{client: cl}, err } diff --git a/bindings/client_test.go b/bindings/client_test.go index 4d12984b54ed357f1cd4d7bf5214917b034378cb..760b0955193946dce11a36586649723fb538e028 100644 --- a/bindings/client_test.go +++ b/bindings/client_test.go @@ -28,30 +28,27 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -// Make sure InitClient returns an error when called incorrectly. -func TestInitClientNil(t *testing.T) { - _, err := InitClient(nil, "") +// Make sure NewClient returns an error when called incorrectly. +func TestNewClientNil(t *testing.T) { + _, err := NewClient(nil, "") if err == nil { - t.Errorf("InitClient returned nil on invalid (nil, nil) input!") + t.Errorf("NewClient returned nil on invalid (nil, nil) input!") } - globals.LocalStorage = nil - _, err = InitClient(nil, "hello") + _, err = NewClient(nil, "hello") if err == nil { - t.Errorf("InitClient returned nil on invalid (nil, 'hello') input!") + t.Errorf("NewClient returned nil on invalid (nil, 'hello') input!") } - globals.LocalStorage = nil } -func TestInitClient(t *testing.T) { +func TestNewClient(t *testing.T) { d := api.DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") if err != nil { - t.Errorf("InitClient returned error: %v", err) + t.Errorf("NewClient returned error: %v", err) } else if client == nil { - t.Errorf("InitClient returned nil Client object") + t.Errorf("NewClient returned nil Client object") } - globals.LocalStorage = nil } // BytesReceiver receives the last message and puts the data it received into @@ -77,7 +74,7 @@ func TestRegister(t *testing.T) { defer gwShutDown() registrationCode := "UAV6IWD6" d := api.DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -106,7 +103,6 @@ func TestRegister(t *testing.T) { if len(regRes) == 0 { t.Errorf("Invalid registration number received: %v", regRes) } - globals.LocalStorage = nil } func TestRegisterBadNumNodes(t *testing.T) { @@ -116,7 +112,7 @@ func TestRegisterBadNumNodes(t *testing.T) { defer gwShutDown() registrationCode := "UAV6IWD6" d := api.DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") p := large.NewInt(int64(1)) g := large.NewInt(int64(2)) q := large.NewInt(int64(3)) @@ -130,7 +126,6 @@ func TestRegisterBadNumNodes(t *testing.T) { if err == nil { t.Errorf("Registration worked with bad numnodes! %s", err.Error()) } - globals.LocalStorage = nil } func TestLoginLogout(t *testing.T) { @@ -140,7 +135,7 @@ func TestLoginLogout(t *testing.T) { defer gwShutDown() registrationCode := "UAV6IWD6" d := api.DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, err := InitClient(&d, "hello") + client, err := NewClient(&d, "hello") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -175,8 +170,6 @@ func TestLoginLogout(t *testing.T) { if err3 != nil { t.Errorf("Logoutfailed: %s", err.Error()) } - - globals.LocalStorage = nil } type MockListener bool @@ -188,7 +181,7 @@ func (m *MockListener) Hear(msg Message, isHeardElsewhere bool) { // Proves that a message can be received by a listener added with the bindings func TestListen(t *testing.T) { d := api.DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, _ := InitClient(&d, "hello") + client, _ := NewClient(&d, "hello") listener := MockListener(false) client.Listen(id.ZeroID[:], int32(cmixproto.Type_NO_TYPE), &listener) client.client.GetSwitchboard().Speak(&parse.Message{ @@ -202,12 +195,11 @@ func TestListen(t *testing.T) { if !listener { t.Error("Message not received") } - globals.LocalStorage = nil } func TestStopListening(t *testing.T) { d := api.DummyStorage{Location: "Blah", LastSave: []byte{'a', 'b', 'c'}} - client, _ := InitClient(&d, "hello") + client, _ := NewClient(&d, "hello") listener := MockListener(false) handle := client.Listen(id.ZeroID[:], int32(cmixproto.Type_NO_TYPE), &listener) client.StopListening(handle) @@ -222,7 +214,6 @@ func TestStopListening(t *testing.T) { if listener { t.Error("Message was received after we stopped listening for it") } - globals.LocalStorage = nil } type MockWriter struct { diff --git a/cmd/root.go b/cmd/root.go index 3e237639db0fb99977ff3306993a766ec1d44f4f..aa53c8a692e1876b0f3051fb3a974b7fc9993ec3 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -65,7 +65,7 @@ func sessionInitialization() { //If no session file is passed initialize with RAM Storage if sessionFile == "" { - client, err = api.InitClient(&globals.RamStorage{}, "") + client, err = api.NewClient(&globals.RamStorage{}, "") if err != nil { fmt.Printf("Could Not Initialize Ram Storage: %s\n", err.Error()) @@ -88,7 +88,7 @@ func sessionInitialization() { } //Initialize client with OS Storage - client, err = api.InitClient(&globals.DefaultStorage{}, sessionFile) + client, err = api.NewClient(nil, sessionFile) if err != nil { fmt.Printf("Could Not Initialize OS Storage: %s\n", err.Error()) diff --git a/crypto/encryptdecrypt_test.go b/crypto/encryptdecrypt_test.go index 7353ad2c0eb2de1172a1a3888e11c95886687e0d..f04f2c22f90da203ae36b7f76030b70e77f436c2 100644 --- a/crypto/encryptdecrypt_test.go +++ b/crypto/encryptdecrypt_test.go @@ -70,7 +70,7 @@ func setup(t *testing.T) { nk[i].ReceptionKeys.Recursive = grp.Inverse( nk[i].TransmissionKeys.Recursive, grp.NewInt(1)) } - session = user.NewSession(u, "", nk, nil, grp) + session = user.NewSession(nil, u, "", nk, nil, grp) } func TestEncryptDecrypt(t *testing.T) { diff --git a/globals/storage.go b/globals/storage.go index 8cb1eac4fc8dcd4f4d5fe6483a825a231b300717..f214bc13039dfe05f24634f01536d73ad7dad6d9 100644 --- a/globals/storage.go +++ b/globals/storage.go @@ -7,41 +7,10 @@ package globals import ( - "errors" "os" "sync" ) -var LocalStorage Storage - -func InitStorage(store Storage, location string) error { - if LocalStorage != nil { - errStr := "Invalid Local Storage Creation: Local storage already created" - Log.ERROR.Printf(errStr) - panic(errStr) - } - - var intermediateStorage Storage - - if store == nil { - intermediateStorage = &DefaultStorage{} - } else { - intermediateStorage = store - } - - err := intermediateStorage.SetLocation(location) - - if err != nil { - err = errors.New("Invalid Local Storage Location: " + err.Error()) - Log.ERROR.Printf(err.Error()) - return err - } - - LocalStorage = intermediateStorage - - return nil -} - type Storage interface { SetLocation(string) error GetLocation() string diff --git a/globals/storage_test.go b/globals/storage_test.go index f6bc7fc7fe1b7010f61d0e62a97413229acc0c39..fab0e91baf75f5290904cb0e4b30b0b371e03be7 100644 --- a/globals/storage_test.go +++ b/globals/storage_test.go @@ -15,30 +15,20 @@ import ( func TestInitStorage(t *testing.T) { TestData := []byte{12, 14, 54} TestSaveLoc := "testStorage.data" - // Test with existing storage - LocalStorage = new(RamStorage) - // err := InitStorage(nil, "") - // if err == nil { - // t.Errorf("InitStorage failed to fail with existing storage") - // } - // LocalStorage = nil // Test DefaultStorage initialization without existing storage - LocalStorage = nil - err := InitStorage(nil, TestSaveLoc) - if LocalStorage == nil { - t.Errorf("InitStorage failed to create a default storage") - } + storage := &DefaultStorage{} + storage.SetLocation(TestSaveLoc) // Check that DS file location is correct //jww.ERROR.Printf("Default Storage file location: %v", // LocalStorage.GetLocation()) // Test DS save - err = LocalStorage.Save(TestData) + err := storage.Save(TestData) if err != nil { t.Errorf("ds.Save failed to create a save file at: %v", - LocalStorage.GetLocation()) + storage.GetLocation()) } // Check that save file was made if !exists(TestSaveLoc) { @@ -46,31 +36,22 @@ func TestInitStorage(t *testing.T) { TestSaveLoc) } // Test DS load - actualData := LocalStorage.Load() + actualData := storage.Load() if reflect.DeepEqual(actualData, TestData) != true { t.Errorf("ds.Load failed to load expected data. Expected:%v Actual:%v", TestData, actualData) } - LocalStorage = nil // Test RamStorage - LocalStorage = nil store := RamStorage{} - err = InitStorage(&store, "") - if err != nil { - t.Errorf("InitStorage failed to initialize a RamStorage: %s", err.Error()) - } actualData = nil - LocalStorage.Save(TestData) - actualData = LocalStorage.Load() + store.Save(TestData) + actualData = store.Load() if reflect.DeepEqual(actualData, TestData) != true { t.Errorf("rs.Load failed to load expected data. Expected:%v Actual:%v", TestData, actualData) } os.Remove(TestSaveLoc) - - LocalStorage = nil - } // exists returns whether the given file or directory exists or not diff --git a/payment/orderedStorage_test.go b/payment/orderedStorage_test.go index 150ea152e5f105d8cb7b4d0ec52bd19b7a9be56b..a0ec4e430cb60c57ec2803413f74fe9806550716 100644 --- a/payment/orderedStorage_test.go +++ b/payment/orderedStorage_test.go @@ -22,11 +22,10 @@ import ( // Shows that CreateOrderedStorage creates new storage properly func TestCreateOrderedStorage_New(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") userID := id.NewUserFromUint(1, t) grp := cyclic.NewGroup(large.NewInt(100000000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{userID, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{userID, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) // show that the ordered list does not exist @@ -69,8 +68,6 @@ func TestCreateOrderedStorage_New(t *testing.T) { // Shows that CreateOrderedStorage loads old storage properly func TestCreateOrderedStorage_Load(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") userID := id.NewUserFromUint(1, t) primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + @@ -88,7 +85,8 @@ func TestCreateOrderedStorage_Load(t *testing.T) { g := large.NewInt(2) q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) - s := user.NewSession(&user.User{userID, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{userID, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) // show that the ordered list does not exist @@ -133,8 +131,6 @@ func TestCreateOrderedStorage_Load(t *testing.T) { // Shows that OrderedCoinStorage.Value returns the value of the storage correctly func TestOrderedCoinStorage_Value(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -152,7 +148,8 @@ func TestOrderedCoinStorage_Value(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) userID := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{userID, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{userID, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) src := rand.NewSource(42) @@ -173,8 +170,6 @@ func TestOrderedCoinStorage_Value(t *testing.T) { // Shows that OrderedCoinStorage.Add works when the list is empty func TestOrderedCoinStorage_Add_Empty(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -192,7 +187,8 @@ func TestOrderedCoinStorage_Add_Empty(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) userID := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{userID, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{userID, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) cs, err := coin.NewSleeve(69) @@ -212,8 +208,6 @@ func TestOrderedCoinStorage_Add_Empty(t *testing.T) { // Shows that OrderedCoinStorage.Add works when the list isn't empty and properly orders the list func TestOrderedCoinStorage_Add_Multi(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -231,7 +225,8 @@ func TestOrderedCoinStorage_Add_Multi(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) userID := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{userID, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{userID, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) ocs := OrderedCoinStorage{&[]coin.Sleeve{}, 0, s} @@ -273,8 +268,6 @@ func TestOrderedCoinStorage_Add_Multi(t *testing.T) { // Shows that added sleeves can be loaded after a save func TestOrderedCoinStorage_Add_Save(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -292,7 +285,8 @@ func TestOrderedCoinStorage_Add_Save(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) userID := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{userID, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{userID, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) // show that the ordered list does not exist @@ -328,8 +322,6 @@ func TestOrderedCoinStorage_Add_Save(t *testing.T) { // Shows that a single sleeve can be gotten from ordered coin storage func TestOrderedCoinStorage_Get(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -347,7 +339,8 @@ func TestOrderedCoinStorage_Get(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -384,8 +377,6 @@ func TestOrderedCoinStorage_Get(t *testing.T) { // Shows that a single sleeve can be popped from ordered coin storage func TestOrderedCoinStorage_Pop(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -403,7 +394,8 @@ func TestOrderedCoinStorage_Pop(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -440,8 +432,6 @@ func TestOrderedCoinStorage_Pop(t *testing.T) { // Shows that when a sleeve is popped from ordered coin storage the result can be saved properly func TestOrderedCoinStorage_Pop_Save(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -459,7 +449,8 @@ func TestOrderedCoinStorage_Pop_Save(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -514,8 +505,6 @@ func TestOrderedCoinStorage_Pop_Save(t *testing.T) { // Test that fund responds correct with insufficient funds func TestOrderedCoinStorage_Fund_Insufficient(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -533,7 +522,8 @@ func TestOrderedCoinStorage_Fund_Insufficient(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -573,8 +563,6 @@ func TestOrderedCoinStorage_Fund_Insufficient(t *testing.T) { // Tests that a single coin equal to the correct value returns properly func TestOrderedCoinStorage_Fund_Single_Exact(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -592,7 +580,8 @@ func TestOrderedCoinStorage_Fund_Single_Exact(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -633,8 +622,6 @@ func TestOrderedCoinStorage_Fund_Single_Exact(t *testing.T) { // Tests that a multiple coins equal to the correct value returns properly func TestOrderedCoinStorage_Fund_Multi_Exact(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -652,7 +639,8 @@ func TestOrderedCoinStorage_Fund_Multi_Exact(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -705,8 +693,6 @@ func TestOrderedCoinStorage_Fund_Multi_Exact(t *testing.T) { // Tests that a multiple coins equal to the correct value returns properly when there are other coins func TestOrderedCoinStorage_Fund_Multi_Exact_Split(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -724,7 +710,8 @@ func TestOrderedCoinStorage_Fund_Multi_Exact_Split(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -777,8 +764,6 @@ func TestOrderedCoinStorage_Fund_Multi_Exact_Split(t *testing.T) { // Tests that fund returns an error when the value cannot be created in the given number of coins func TestOrderedCoinStorage_Fund_Organization(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -796,7 +781,8 @@ func TestOrderedCoinStorage_Fund_Organization(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -834,8 +820,6 @@ func TestOrderedCoinStorage_Fund_Organization(t *testing.T) { // Tests that a multiple coins equal greater than the expected value returns properly when there are other coins func TestOrderedCoinStorage_Fund_Multi_Exact_Split_Change(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -853,7 +837,8 @@ func TestOrderedCoinStorage_Fund_Multi_Exact_Split_Change(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + s := user.NewSession(&globals.RamStorage{}, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) key := "TestOrderedList" @@ -907,7 +892,6 @@ func TestOrderedCoinStorage_Fund_Multi_Exact_Split_Change(t *testing.T) { // Shows that Ordered Storage reloads from a stored map properly func TestOrderedStorage_FileLoading(t *testing.T) { - globals.LocalStorage = nil storagePath, err := homedir.Expand("~/.elixxir") filename := "/orderedstoragetest.session" @@ -915,7 +899,6 @@ func TestOrderedStorage_FileLoading(t *testing.T) { if err != nil { t.Error(err.Error()) } - globals.InitStorage(&globals.DefaultStorage{}, storagePath+filename) primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -933,7 +916,9 @@ func TestOrderedStorage_FileLoading(t *testing.T) { q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) uid := id.NewUserFromUint(1, t) - s := user.NewSession(&user.User{uid, "test"}, "", []user.NodeKeys{}, + storage := &globals.RamStorage{} + s := user.NewSession(storage, + &user.User{uid, "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) // show that the ordered list does not exist @@ -963,7 +948,7 @@ func TestOrderedStorage_FileLoading(t *testing.T) { s.StoreSession() - s2, err := user.LoadSession(uid) + s2, err := user.LoadSession(storage, uid) if err != nil { t.Errorf("session load error: %s", err.Error()) @@ -993,7 +978,7 @@ func TestOrderedStorage_FileLoading(t *testing.T) { s2.StoreSession() - s3, err := user.LoadSession(uid) + s3, err := user.LoadSession(storage, uid) if err != nil { t.Errorf("session load error: %s", err.Error()) diff --git a/payment/transactionList_test.go b/payment/transactionList_test.go index ace94fa008b6f27007b0f1c269e0c83795ecb16d..95ce27dd0f4bc283286dec0cff076191f997d0e4 100644 --- a/payment/transactionList_test.go +++ b/payment/transactionList_test.go @@ -23,10 +23,9 @@ import ( ) func MockNewSession(t *testing.T) user.Session { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(100000), large.NewInt(0), large.NewInt(0)) - return user.NewSession(&user.User{User: id.NewUserFromUint(1, t), + return user.NewSession(&globals.RamStorage{}, + &user.User{User: id.NewUserFromUint(1, t), Nick: "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) } diff --git a/payment/wallet_test.go b/payment/wallet_test.go index 5cc28072995bee1a3f478a91cc459ef3b0a8a4f2..041f9c5dc8d7550b5a7e9b7240fc1a8f816cb8b8 100644 --- a/payment/wallet_test.go +++ b/payment/wallet_test.go @@ -33,11 +33,9 @@ func TestWallet_registerInvoice(t *testing.T) { payer := id.NewUserFromUint(2, t) memo := "for serious cryptography" value := uint64(85) - - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(10000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{User: payee, Nick: "Taxman McGee"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payee, Nick: "Taxman McGee"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) or, err := createTransactionList(OutboundRequestsTag, s) @@ -88,10 +86,9 @@ func TestWallet_registerInvoice(t *testing.T) { // Shows that CreateWallet creates new wallet properly func TestCreateWallet(t *testing.T) { - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(1000000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{User: id.NewUserFromUint(1, t), + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: id.NewUserFromUint(1, t), Nick: "test"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) _, err := CreateWallet(s, io.NewMessenger(), false) @@ -140,8 +137,6 @@ func TestWallet_Invoice(t *testing.T) { invoiceTime := time.Now() // Set up the wallet and its storage - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -158,7 +153,8 @@ func TestWallet_Invoice(t *testing.T) { g := large.NewInt(2) q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) - s := user.NewSession(&user.User{User: payee, Nick: "Taxman McGee"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payee, Nick: "Taxman McGee"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) or, err := createTransactionList(OutboundRequestsTag, s) @@ -412,8 +408,6 @@ func TestInvoiceListener_Hear(t *testing.T) { value := uint64(50) memo := "please gib" // Set up the wallet and its storage - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -430,7 +424,8 @@ func TestInvoiceListener_Hear(t *testing.T) { g := large.NewInt(2) q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) - s := user.NewSession(&user.User{User: payer, Nick: "CEO MF DOOM"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payer, Nick: "CEO MF DOOM"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) ir, err := createTransactionList(InboundRequestsTag, s) @@ -516,8 +511,6 @@ func TestWallet_Invoice_Error(t *testing.T) { value := int64(0) // Set up the wallet and its storage - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") primeString := "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + @@ -534,7 +527,8 @@ func TestWallet_Invoice_Error(t *testing.T) { g := large.NewInt(2) q := large.NewInt(3) grp := cyclic.NewGroup(p, g, q) - s := user.NewSession(&user.User{User: payee, Nick: "Taxman McGee"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payee, Nick: "Taxman McGee"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) or, err := createTransactionList(OutboundRequestsTag, s) @@ -578,11 +572,9 @@ func (m *MockMessaging) MessageReceiver(session user.Session, func TestResponseListener_Hear(t *testing.T) { payer := id.NewUserFromUint(5, t) payee := id.NewUserFromUint(12, t) - - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(1000000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{User: payer, Nick: "Darth Icky"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payer, Nick: "Darth Icky"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) walletAmount := uint64(8970) @@ -702,11 +694,9 @@ func TestResponseListener_Hear(t *testing.T) { func TestResponseListener_Hear_Failure(t *testing.T) { payer := id.NewUserFromUint(5, t) payee := id.NewUserFromUint(12, t) - - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(1000000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{User: payer, Nick: "Darth Icky"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payer, Nick: "Darth Icky"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) walletAmount := uint64(8970) @@ -815,11 +805,9 @@ func TestResponseListener_Hear_Failure(t *testing.T) { func TestWallet_Pay_NoChange(t *testing.T) { payer := id.NewUserFromUint(5, t) payee := id.NewUserFromUint(12, t) - - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(190000000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{User: payer, Nick: "Darth Icky"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payer, Nick: "Darth Icky"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) paymentAmount := uint64(5008) @@ -909,11 +897,9 @@ func TestWallet_Pay_NoChange(t *testing.T) { func TestWallet_Pay_YesChange(t *testing.T) { payer := id.NewUserFromUint(5, t) payee := id.NewUserFromUint(12, t) - - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(1000000000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{User: payer, Nick: "Darth Icky"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payer, Nick: "Darth Icky"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) paymentAmount := uint64(2611) @@ -1037,11 +1023,9 @@ func (rl *ReceiptUIListener) Hear(msg switchboard.Item, isHeardElsewhere bool) { func TestReceiptListener_Hear(t *testing.T) { payer := id.NewUserFromUint(5, t) payee := id.NewUserFromUint(12, t) - - globals.LocalStorage = nil - globals.InitStorage(&globals.RamStorage{}, "") grp := cyclic.NewGroup(large.NewInt(1000000), large.NewInt(0), large.NewInt(0)) - s := user.NewSession(&user.User{User: payer, Nick: "Darth Icky"}, "", + s := user.NewSession(&globals.RamStorage{}, + &user.User{User: payer, Nick: "Darth Icky"}, "", []user.NodeKeys{}, grp.NewInt(1), grp) walletAmount := uint64(8970) diff --git a/user/session.go b/user/session.go index 46a8d5f35a25cd1c6f8f1879f0b05e8efd080cd8..509d949858ffc5dbf69d61b2de3c249b1452a468 100644 --- a/user/session.go +++ b/user/session.go @@ -60,7 +60,9 @@ type RatchetKey struct { } // Creates a new Session interface for registration -func NewSession(u *User, GatewayAddr string, nk []NodeKeys, publicKey *cyclic.Int, grp *cyclic.Group) Session { +func NewSession(store globals.Storage, + u *User, GatewayAddr string, nk []NodeKeys, + publicKey *cyclic.Int, grp *cyclic.Group) Session { // With an underlying Session data structure return Session(&SessionObj{ @@ -73,19 +75,21 @@ func NewSession(u *User, GatewayAddr string, nk []NodeKeys, publicKey *cyclic.In InterfaceMap: make(map[string]interface{}), KeyManagers: make([]*keyStore.KeyManager, 0), keyMaps: keyStore.NewStore(), + store: store, }) } -func LoadSession(UID *id.User) (Session, error) { - if globals.LocalStorage == nil { - err := errors.New("StoreSession: Local Storage not avalible") +func LoadSession(store globals.Storage, + UID *id.User) (Session, error) { + if store == nil { + err := errors.New("LoadSession: Local Storage not avalible") return nil, err } rand.Seed(time.Now().UnixNano()) - sessionGob := globals.LocalStorage.Load() + sessionGob := store.Load() var sessionBytes bytes.Buffer @@ -132,6 +136,8 @@ func LoadSession(UID *id.User) (Session, error) { km.GenerateKeys(session.Grp, UID, session.keyMaps) } + // Set storage pointer + session.store = store return &session, nil } @@ -159,6 +165,9 @@ type SessionObj struct { // E2E KeyStore (not GOB encoded/decoded) keyMaps *keyStore.KeyStore + // Keep a local pointer to storage of this session + store globals.Storage + lock sync.Mutex } @@ -227,13 +236,13 @@ func (s *SessionObj) SetGWAddress(addr string) { func (s *SessionObj) storeSession() error { - if globals.LocalStorage == nil { + if s.store == nil { err := errors.New("StoreSession: Local Storage not available") return err } sessionData, err := s.getSessionData() - err = globals.LocalStorage.Save(sessionData) + err = s.store.Save(sessionData) if err != nil { return err } diff --git a/user/session_test.go b/user/session_test.go index 97233db4346dbd9d430325d2ad42d09b5b6bf6c2..9bc5aee6379c55a02703e75bc4f7bb47580bd674 100644 --- a/user/session_test.go +++ b/user/session_test.go @@ -40,19 +40,17 @@ func TestUserSession(t *testing.T) { ReturnKeys: RatchetKey{grp.NewInt(2), grp.NewInt(2)}, } - err := globals.InitStorage(&globals.RamStorage{}, "") - - if err != nil { - t.Errorf("User Session: Local storage could not be created: %s", err.Error()) - } + // Storage + storage := &globals.RamStorage{} //Ask Ben if there should be a Node Address here! - ses := NewSession(u, "abc", keys, grp.NewInt(2), grp) + ses := NewSession(storage, + u, "abc", keys, grp.NewInt(2), grp) ses.(*SessionObj).PrivateKey = grp.NewInt(2) ses.SetLastMessageID("totally unique ID") - err = ses.StoreSession() + err := ses.StoreSession() if err != nil { t.Errorf("Error: Session not stored correctly: %s", err.Error()) @@ -62,7 +60,7 @@ func TestUserSession(t *testing.T) { //TODO: write test which validates the immolation - ses, err = LoadSession(id.NewUserFromUint(UID, t)) + ses, err = LoadSession(storage, id.NewUserFromUint(UID, t)) if err != nil { t.Errorf("Error: Unable to login with valid user: %v", err.Error()) @@ -70,7 +68,8 @@ func TestUserSession(t *testing.T) { pass++ } - _, err = LoadSession(id.NewUserFromUint(10002, t)) + _, err = LoadSession(storage, + id.NewUserFromUint(10002, t)) if err == nil { t.Errorf("Error: Able to login with invalid user!") @@ -194,23 +193,20 @@ func TestUserSession(t *testing.T) { // Error tests // Test nil LocalStorage - temp := globals.LocalStorage - globals.LocalStorage = nil - _, err = LoadSession(id.NewUserFromUint(6, t)) + _, err = LoadSession(nil, id.NewUserFromUint(6, t)) if err == nil { t.Errorf("Error did not catch a nil LocalStorage") } - globals.LocalStorage = temp // Test invalid / corrupted LocalStorage h := sha256.New() h.Write([]byte(string(20000))) randBytes := h.Sum(nil) - globals.LocalStorage.Save(randBytes) + storage.Save(randBytes) - _, err = LoadSession(id.NewUserFromUint(6, t)) + _, err = LoadSession(storage, id.NewUserFromUint(6, t)) if err == nil { t.Errorf("Error did not catch a corrupt LocalStorage") @@ -234,7 +230,7 @@ func TestGetPubKey(t *testing.T) { ReturnKeys: RatchetKey{grp.NewInt(2), grp.NewInt(2)}, } - ses := NewSession(u, "abc", keys, grp.NewInt(2), grp) + ses := NewSession(nil, u, "abc", keys, grp.NewInt(2), grp) pubKey := ses.GetPublicKey() if pubKey.Cmp(grp.NewInt(2)) != 0 { t.Errorf("Public key is not set correctly!")