diff --git a/api/geth_backend.go b/api/geth_backend.go index 1b902509f..1a649447b 100644 --- a/api/geth_backend.go +++ b/api/geth_backend.go @@ -14,6 +14,7 @@ import ( "time" "github.com/status-im/status-go/services/ens" + "github.com/status-im/status-go/sqlite" "github.com/imdario/mergo" @@ -50,7 +51,6 @@ import ( "github.com/status-im/status-go/services/typeddata" wcommon "github.com/status-im/status-go/services/wallet/common" "github.com/status-im/status-go/signal" - "github.com/status-im/status-go/sqlite" "github.com/status-im/status-go/transactions" "github.com/status-im/status-go/walletdatabase" ) @@ -609,7 +609,7 @@ func (b *GethStatusBackend) loginAccount(request *requests.Login) error { } if acc.KDFIterations == 0 { - acc.KDFIterations = sqlite.ReducedKDFIterationsNumber + acc.KDFIterations = dbsetup.ReducedKDFIterationsNumber } err := b.ensureDBsOpened(acc, password) @@ -867,7 +867,7 @@ func (b *GethStatusBackend) ExportUnencryptedDatabase(acc multiaccounts.Account, return err } - err = dbsetup.DecryptDatabase(dbPath, directory, password, acc.KDFIterations) + err = sqlite.DecryptDB(dbPath, directory, password, acc.KDFIterations) if err != nil { b.log.Error("failed to initialize db", "err", err) return err @@ -887,7 +887,7 @@ func (b *GethStatusBackend) ImportUnencryptedDatabase(acc multiaccounts.Account, return err } - err = dbsetup.EncryptDatabase(databasePath, path, password, acc.KDFIterations, signal.SendReEncryptionStarted, signal.SendReEncryptionFinished) + err = sqlite.EncryptDB(databasePath, path, password, acc.KDFIterations, signal.SendReEncryptionStarted, signal.SendReEncryptionFinished) if err != nil { b.log.Error("failed to initialize db", "err", err) return err @@ -990,7 +990,7 @@ func (b *GethStatusBackend) changeAppDBPassword(account *multiaccounts.Account, } // Exporting database to a temporary file with a new password - err = dbsetup.ExportDB(dbPath, password, account.KDFIterations, tmpDbPath, newPassword, signal.SendReEncryptionStarted, signal.SendReEncryptionFinished) + err = sqlite.ExportDB(dbPath, password, account.KDFIterations, tmpDbPath, newPassword, signal.SendReEncryptionStarted, signal.SendReEncryptionFinished) if err != nil { return err } @@ -1032,7 +1032,7 @@ func (b *GethStatusBackend) changeWalletDBPassword(account *multiaccounts.Accoun } // Exporting database to a temporary file with a new password - err = dbsetup.ExportDB(dbPath, password, account.KDFIterations, tmpDbPath, newPassword, signal.SendReEncryptionStarted, signal.SendReEncryptionFinished) + err = sqlite.ExportDB(dbPath, password, account.KDFIterations, tmpDbPath, newPassword, signal.SendReEncryptionStarted, signal.SendReEncryptionFinished) if err != nil { return err } @@ -1300,7 +1300,7 @@ func (b *GethStatusBackend) generateOrImportAccount(mnemonic string, customizati Name: request.DisplayName, CustomizationColor: multiacccommon.CustomizationColor(request.CustomizationColor), CustomizationColorClock: customizationColorClock, - KDFIterations: sqlite.ReducedKDFIterationsNumber, + KDFIterations: dbsetup.ReducedKDFIterationsNumber, } if request.ImagePath != "" { iis, err := images.GenerateIdentityImages(request.ImagePath, 0, 0, 1000, 1000) diff --git a/appdatabase/database_test.go b/appdatabase/database_test.go index 9bfdcb660..fdd8d6849 100644 --- a/appdatabase/database_test.go +++ b/appdatabase/database_test.go @@ -100,7 +100,7 @@ const ( func TestMigrateWalletJsonBlobs(t *testing.T) { openDB := func() (*sql.DB, error) { - return sqlite.OpenDB(sqlite.InMemoryPath, "1234567890", sqlite.ReducedKDFIterationsNumber) + return sqlite.OpenDB(sqlite.InMemoryPath, "1234567890", dbsetup.ReducedKDFIterationsNumber) } db, err := openDB() require.NoError(t, err) diff --git a/appdatabase/node_config_test.go b/appdatabase/node_config_test.go index 9b1b974df..f16464fbd 100644 --- a/appdatabase/node_config_test.go +++ b/appdatabase/node_config_test.go @@ -17,7 +17,6 @@ import ( "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/nodecfg" "github.com/status-im/status-go/params" - "github.com/status-im/status-go/protocol/pushnotificationserver" "github.com/status-im/status-go/t/helpers" ) @@ -205,7 +204,7 @@ func randomNodeConfig() *params.NodeConfig { }, RegisterTopics: randomTopicSlice(), RequireTopics: randomTopicLimits(), - PushNotificationServerConfig: pushnotificationserver.Config{ + PushNotificationServerConfig: params.PushNotificationServerConfig{ Enabled: randomBool(), GorushURL: randomString(), Identity: privK, diff --git a/cmd/ping-community/main.go b/cmd/ping-community/main.go index 654c9d0d9..b30852a66 100644 --- a/cmd/ping-community/main.go +++ b/cmd/ping-community/main.go @@ -19,11 +19,11 @@ import ( "github.com/status-im/status-go/account/generator" "github.com/status-im/status-go/api" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/multiaccounts" "github.com/status-im/status-go/multiaccounts/accounts" "github.com/status-im/status-go/multiaccounts/settings" - "github.com/status-im/status-go/sqlite" "github.com/status-im/status-go/logutils" "github.com/status-im/status-go/params" @@ -396,7 +396,7 @@ func ImportAccount(seedPhrase string, backend *api.GethStatusBackend) error { account := multiaccounts.Account{ KeyUID: generatedAccountInfo.KeyUID, - KDFIterations: sqlite.ReducedKDFIterationsNumber, + KDFIterations: dbsetup.ReducedKDFIterationsNumber, } settings, err := defaultSettings(generatedAccountInfo, derivedAddresses, &seedPhrase) if err != nil { diff --git a/cmd/populate-db/main.go b/cmd/populate-db/main.go index 4b7cc04b8..197c7bc20 100644 --- a/cmd/populate-db/main.go +++ b/cmd/populate-db/main.go @@ -20,6 +20,7 @@ import ( "github.com/status-im/status-go/account/generator" "github.com/status-im/status-go/api" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/logutils" @@ -33,7 +34,6 @@ import ( "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/requests" wakuextn "github.com/status-im/status-go/services/wakuext" - "github.com/status-im/status-go/sqlite" ) type testTimeSource struct{} @@ -461,7 +461,7 @@ func ImportAccount(seedPhrase string, backend *api.GethStatusBackend) error { account := multiaccounts.Account{ KeyUID: generatedAccountInfo.KeyUID, - KDFIterations: sqlite.ReducedKDFIterationsNumber, + KDFIterations: dbsetup.ReducedKDFIterationsNumber, } settings, err := defaultSettings(generatedAccountInfo, derivedAddresses, &seedPhrase) if err != nil { diff --git a/cmd/spiff-workflow/main.go b/cmd/spiff-workflow/main.go index f989ab9b1..68d3aa71b 100644 --- a/cmd/spiff-workflow/main.go +++ b/cmd/spiff-workflow/main.go @@ -18,6 +18,7 @@ import ( "github.com/status-im/status-go/account/generator" "github.com/status-im/status-go/api" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/logutils" "github.com/status-im/status-go/multiaccounts" @@ -28,7 +29,6 @@ import ( "github.com/status-im/status-go/protocol" "github.com/status-im/status-go/protocol/identity/alias" waku2extn "github.com/status-im/status-go/services/wakuv2ext" - "github.com/status-im/status-go/sqlite" ) const ( @@ -357,7 +357,7 @@ func ImportAccount(seedPhrase string, backend *api.GethStatusBackend) error { account := multiaccounts.Account{ KeyUID: generatedAccountInfo.KeyUID, - KDFIterations: sqlite.ReducedKDFIterationsNumber, + KDFIterations: dbsetup.ReducedKDFIterationsNumber, } settings, err := defaultSettings(generatedAccountInfo, derivedAddresses, &seedPhrase) if err != nil { diff --git a/cmd/statusd/main.go b/cmd/statusd/main.go index c18c793a0..d0f7ddac4 100644 --- a/cmd/statusd/main.go +++ b/cmd/statusd/main.go @@ -22,6 +22,7 @@ import ( "github.com/status-im/status-go/api" "github.com/status-im/status-go/appdatabase" + "github.com/status-im/status-go/common/dbsetup" gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/logutils" @@ -31,7 +32,7 @@ import ( "github.com/status-im/status-go/params" "github.com/status-im/status-go/profiling" "github.com/status-im/status-go/protocol" - "github.com/status-im/status-go/sqlite" + "github.com/status-im/status-go/protocol/pushnotificationserver" "github.com/status-im/status-go/walletdatabase" ) @@ -208,21 +209,24 @@ func main() { return } - walletDB, err := walletdatabase.InitializeDB(config.DataDir+"/"+installationID.String()+"-wallet.db", "", sqlite.ReducedKDFIterationsNumber) + walletDB, err := walletdatabase.InitializeDB(config.DataDir+"/"+installationID.String()+"-wallet.db", "", dbsetup.ReducedKDFIterationsNumber) if err != nil { logger.Error("failed to initialize app db", "error", err) return } - appDB, err := appdatabase.InitializeDB(config.DataDir+"/"+installationID.String()+".db", "", sqlite.ReducedKDFIterationsNumber) + appDB, err := appdatabase.InitializeDB(config.DataDir+"/"+installationID.String()+".db", "", dbsetup.ReducedKDFIterationsNumber) if err != nil { logger.Error("failed to initialize app db", "error", err) return } - options := []protocol.Option{ protocol.WithPushNotifications(), - protocol.WithPushNotificationServerConfig(&config.PushNotificationServerConfig), + protocol.WithPushNotificationServerConfig(&pushnotificationserver.Config{ + Enabled: config.PushNotificationServerConfig.Enabled, + Identity: config.PushNotificationServerConfig.Identity, + GorushURL: config.PushNotificationServerConfig.GorushURL, + }), protocol.WithDatabase(appDB), protocol.WithWalletDatabase(walletDB), protocol.WithTorrentConfig(&config.TorrentConfig), diff --git a/common/dbsetup/db_setup.go b/common/dbsetup/db_setup.go index ac1059853..79c7c5296 100644 --- a/common/dbsetup/db_setup.go +++ b/common/dbsetup/db_setup.go @@ -5,33 +5,20 @@ import ( "errors" "github.com/ethereum/go-ethereum/log" - "github.com/status-im/status-go/sqlite" ) +const InMemoryPath = ":memory:" + +// The reduced number of kdf iterations (for performance reasons) which is +// currently used for derivation of the database key +// https://github.com/status-im/status-go/pull/1343 +// https://notes.status.im/i8Y_l7ccTiOYq09HVgoFwA +const ReducedKDFIterationsNumber = 3200 + type DatabaseInitializer interface { Initialize(path, password string, kdfIterationsNumber int) (*sql.DB, error) } -// DecryptDatabase creates an unencrypted copy of the database and copies it -// over to the given directory -func DecryptDatabase(oldPath, newPath, password string, kdfIterationsNumber int) error { - return sqlite.DecryptDB(oldPath, newPath, password, kdfIterationsNumber) -} - -// EncryptDatabase creates an encrypted copy of the database and copies it to the -// user path -func EncryptDatabase(oldPath, newPath, password string, kdfIterationsNumber int, onStart func(), onEnd func()) error { - return sqlite.EncryptDB(oldPath, newPath, password, kdfIterationsNumber, onStart, onEnd) -} - -func ExportDB(path string, password string, kdfIterationsNumber int, newDbPath string, newPassword string, onStart func(), onEnd func()) error { - return sqlite.ExportDB(path, password, kdfIterationsNumber, newDbPath, newPassword, onStart, onEnd) -} - -func ChangeDatabasePassword(path string, password string, kdfIterationsNumber int, newPassword string, onStart func(), onEnd func()) error { - return sqlite.ChangeEncryptionKey(path, password, kdfIterationsNumber, newPassword, onStart, onEnd) -} - // GetDBFilename takes an instance of sql.DB and returns the filename of the "main" database func GetDBFilename(db *sql.DB) (string, error) { if db == nil { diff --git a/multiaccounts/database.go b/multiaccounts/database.go index 4663e8267..424659f07 100644 --- a/multiaccounts/database.go +++ b/multiaccounts/database.go @@ -6,6 +6,7 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/log" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/images" "github.com/status-im/status-go/multiaccounts/common" "github.com/status-im/status-go/multiaccounts/migrations" @@ -300,7 +301,7 @@ func (db *Database) SaveAccount(account Account) error { } if account.KDFIterations <= 0 { - account.KDFIterations = sqlite.ReducedKDFIterationsNumber + account.KDFIterations = dbsetup.ReducedKDFIterationsNumber } _, err = db.db.Exec("INSERT OR REPLACE INTO accounts (name, identicon, colorHash, colorId, customizationColor, customizationColorClock, keycardPairing, keyUid, kdfIterations) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", account.Name, account.Identicon, colorHash, account.ColorID, account.CustomizationColor, account.CustomizationColorClock, account.KeycardPairing, account.KeyUID, account.KDFIterations) @@ -322,7 +323,7 @@ func (db *Database) UpdateAccount(account Account) error { } if account.KDFIterations <= 0 { - account.KDFIterations = sqlite.ReducedKDFIterationsNumber + account.KDFIterations = dbsetup.ReducedKDFIterationsNumber } _, err = db.db.Exec("UPDATE accounts SET name = ?, identicon = ?, colorHash = ?, colorId = ?, customizationColor = ?, customizationColorClock = ?, keycardPairing = ?, kdfIterations = ? WHERE keyUid = ?", account.Name, account.Identicon, colorHash, account.ColorID, account.CustomizationColor, account.CustomizationColorClock, account.KeycardPairing, account.KDFIterations, account.KeyUID) diff --git a/multiaccounts/database_test.go b/multiaccounts/database_test.go index d772539f2..c8c409be5 100644 --- a/multiaccounts/database_test.go +++ b/multiaccounts/database_test.go @@ -6,8 +6,8 @@ import ( "os" "testing" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/images" - "github.com/status-im/status-go/protocol/sqlite" "github.com/stretchr/testify/require" @@ -28,7 +28,7 @@ func setupTestDB(t *testing.T) (*Database, func()) { func TestAccounts(t *testing.T) { db, stop := setupTestDB(t) defer stop() - expected := Account{Name: "string", KeyUID: "string", CustomizationColor: common.CustomizationColorBlue, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: sqlite.ReducedKDFIterationsNumber} + expected := Account{Name: "string", KeyUID: "string", CustomizationColor: common.CustomizationColorBlue, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: dbsetup.ReducedKDFIterationsNumber} require.NoError(t, db.SaveAccount(expected)) accounts, err := db.GetAccounts() require.NoError(t, err) @@ -39,7 +39,7 @@ func TestAccounts(t *testing.T) { func TestAccountsUpdate(t *testing.T) { db, stop := setupTestDB(t) defer stop() - expected := Account{KeyUID: "string", CustomizationColor: common.CustomizationColorBlue, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: sqlite.ReducedKDFIterationsNumber} + expected := Account{KeyUID: "string", CustomizationColor: common.CustomizationColorBlue, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: dbsetup.ReducedKDFIterationsNumber} require.NoError(t, db.SaveAccount(expected)) expected.Name = "chars" expected.CustomizationColor = common.CustomizationColorMagenta @@ -54,7 +54,7 @@ func TestLoginUpdate(t *testing.T) { db, stop := setupTestDB(t) defer stop() - accounts := []Account{{Name: "first", KeyUID: "0x1", KDFIterations: sqlite.ReducedKDFIterationsNumber}, {Name: "second", KeyUID: "0x2", KDFIterations: sqlite.ReducedKDFIterationsNumber}} + accounts := []Account{{Name: "first", KeyUID: "0x1", KDFIterations: dbsetup.ReducedKDFIterationsNumber}, {Name: "second", KeyUID: "0x2", KDFIterations: dbsetup.ReducedKDFIterationsNumber}} for _, acc := range accounts { require.NoError(t, db.SaveAccount(acc)) } @@ -185,7 +185,7 @@ func TestDatabase_GetAccount(t *testing.T) { db, stop := setupTestDB(t) defer stop() - expected := Account{Name: "string", KeyUID: keyUID, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: sqlite.ReducedKDFIterationsNumber} + expected := Account{Name: "string", KeyUID: keyUID, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: dbsetup.ReducedKDFIterationsNumber} require.NoError(t, db.SaveAccount(expected)) account, err := db.GetAccount(expected.KeyUID) diff --git a/multiaccounts/settings/database_test.go b/multiaccounts/settings/database_test.go index e132e5a9b..887f1805b 100644 --- a/multiaccounts/settings/database_test.go +++ b/multiaccounts/settings/database_test.go @@ -8,10 +8,10 @@ import ( "github.com/stretchr/testify/require" "github.com/status-im/status-go/appdatabase" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/multiaccounts/errors" "github.com/status-im/status-go/params" - "github.com/status-im/status-go/sqlite" "github.com/status-im/status-go/t/helpers" ) @@ -71,7 +71,7 @@ func TestClosingsqlDB(t *testing.T) { password := "settings-tests" // Make connection with sql.DB - db, err := appdatabase.InitializeDB(testFileName, password, sqlite.ReducedKDFIterationsNumber) + db, err := appdatabase.InitializeDB(testFileName, password, dbsetup.ReducedKDFIterationsNumber) // handle removing the test file on any exit defer func() { @@ -96,7 +96,7 @@ func TestClosingsqlDB(t *testing.T) { require.NoError(t, err) // Make another connection with sql.DB - db2, err := appdatabase.InitializeDB(testFileName, password, sqlite.ReducedKDFIterationsNumber) + db2, err := appdatabase.InitializeDB(testFileName, password, dbsetup.ReducedKDFIterationsNumber) require.NoError(t, err) // Init settings.Database struct using second connection diff --git a/params/config.go b/params/config.go index d66331c15..9c30c6045 100644 --- a/params/config.go +++ b/params/config.go @@ -22,7 +22,6 @@ import ( "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" - "github.com/status-im/status-go/protocol/pushnotificationserver" "github.com/status-im/status-go/static" wakucommon "github.com/status-im/status-go/waku/common" wakuv2common "github.com/status-im/status-go/wakuv2/common" @@ -489,7 +488,7 @@ type NodeConfig struct { MailServerRegistryAddress string // PushNotificationServerConfig is the config for the push notification server - PushNotificationServerConfig pushnotificationserver.Config `json:"PushNotificationServerConfig"` + PushNotificationServerConfig PushNotificationServerConfig `json:"PushNotificationServerConfig"` OutputMessageCSVEnabled bool @@ -587,6 +586,12 @@ func (p *PushNotificationServer) UnmarshalText(data []byte) error { return nil } +type PushNotificationServerConfig struct { + Enabled bool + Identity *ecdsa.PrivateKey + GorushURL string +} + // ShhextConfig defines options used by shhext service. type ShhextConfig struct { PFSEnabled bool diff --git a/protocol/common/message_sender_test.go b/protocol/common/message_sender_test.go index f51d1786b..73fc47000 100644 --- a/protocol/common/message_sender_test.go +++ b/protocol/common/message_sender_test.go @@ -1,10 +1,10 @@ package common import ( - "path/filepath" "testing" transport2 "github.com/status-im/status-go/protocol/transport" + "github.com/status-im/status-go/t/helpers" "github.com/status-im/status-go/waku" @@ -22,6 +22,8 @@ import ( "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/sqlite" v1protocol "github.com/status-im/status-go/protocol/v1" + + "github.com/status-im/status-go/appdatabase" ) func TestMessageSenderSuite(t *testing.T) { @@ -32,7 +34,6 @@ type MessageSenderSuite struct { suite.Suite sender *MessageSender - tmpDir string testMessage protobuf.ChatMessage logger *zap.Logger } @@ -52,12 +53,12 @@ func (s *MessageSenderSuite) SetupTest() { s.logger, err = zap.NewDevelopment() s.Require().NoError(err) - s.tmpDir = s.T().TempDir() - identity, err := crypto.GenerateKey() s.Require().NoError(err) - database, err := sqlite.Open(filepath.Join(s.tmpDir, "sender-test.sql"), "some-key", sqlite.ReducedKDFIterationsNumber) + database, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(database) s.Require().NoError(err) encryptionProtocol := encryption.New( @@ -188,8 +189,11 @@ func (s *MessageSenderSuite) TestHandleDecodedMessagesDatasyncEncrypted() { s.Require().NoError(err) // Create sender encryption protocol. - senderDatabase, err := sqlite.Open(filepath.Join(s.tmpDir, "sender.db.sql"), "", sqlite.ReducedKDFIterationsNumber) + senderDatabase, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) s.Require().NoError(err) + err = sqlite.Migrate(senderDatabase) + s.Require().NoError(err) + senderEncryptionProtocol := encryption.New( senderDatabase, "installation-2", diff --git a/protocol/encryption/encryption_multi_device_test.go b/protocol/encryption/encryption_multi_device_test.go index abca3ea23..f0f3cf833 100644 --- a/protocol/encryption/encryption_multi_device_test.go +++ b/protocol/encryption/encryption_multi_device_test.go @@ -3,12 +3,12 @@ package encryption import ( "crypto/ecdsa" "fmt" - "io/ioutil" "testing" - "github.com/status-im/status-go/protocol/tt" - + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/protocol/tt" + "github.com/status-im/status-go/t/helpers" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -51,12 +51,12 @@ func setupUser(user string, s *EncryptionServiceMultiDeviceSuite, n int) error { for i := 0; i < n; i++ { installationID := fmt.Sprintf("%s%d", user, i+1) - dbFileName := fmt.Sprintf("sqlite-persistence-test-%s.sql", installationID) - dbPath, err := ioutil.TempFile("", dbFileName) + + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) if err != nil { return err } - db, err := sqlite.Open(dbPath.Name(), "some-key", sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) if err != nil { return err } diff --git a/protocol/encryption/encryption_test.go b/protocol/encryption/encryption_test.go index 310f32245..f95e1b172 100644 --- a/protocol/encryption/encryption_test.go +++ b/protocol/encryption/encryption_test.go @@ -3,12 +3,12 @@ package encryption import ( "errors" "fmt" - "io/ioutil" - "os" "testing" "time" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -27,23 +27,17 @@ func TestEncryptionServiceTestSuite(t *testing.T) { type EncryptionServiceTestSuite struct { suite.Suite - logger *zap.Logger - alice *Protocol - bob *Protocol - aliceDBPath *os.File - bobDBPath *os.File + logger *zap.Logger + alice *Protocol + bob *Protocol } func (s *EncryptionServiceTestSuite) initDatabases(config encryptorConfig) { var err error - s.aliceDBPath, err = ioutil.TempFile("", "alice.db.sql") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) s.Require().NoError(err) - - s.bobDBPath, err = ioutil.TempFile("", "bob.db.sql") - s.Require().NoError(err) - - db, err := sqlite.Open(s.aliceDBPath.Name(), "alice-key", sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) s.Require().NoError(err) config.InstallationID = aliceInstallationID s.alice = NewWithEncryptorConfig( @@ -53,7 +47,9 @@ func (s *EncryptionServiceTestSuite) initDatabases(config encryptorConfig) { s.logger.With(zap.String("user", "alice")), ) - db, err = sqlite.Open(s.bobDBPath.Name(), "bob-key", sqlite.ReducedKDFIterationsNumber) + db, err = helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) s.Require().NoError(err) config.InstallationID = bobInstallationID s.bob = NewWithEncryptorConfig( @@ -70,8 +66,6 @@ func (s *EncryptionServiceTestSuite) SetupTest() { } func (s *EncryptionServiceTestSuite) TearDownTest() { - os.Remove(s.aliceDBPath.Name()) - os.Remove(s.bobDBPath.Name()) _ = s.logger.Sync() } diff --git a/protocol/encryption/multidevice/persistence_test.go b/protocol/encryption/multidevice/persistence_test.go index 9710e0d8d..3e272d253 100644 --- a/protocol/encryption/multidevice/persistence_test.go +++ b/protocol/encryption/multidevice/persistence_test.go @@ -1,17 +1,13 @@ package multidevice import ( - "database/sql" - "os" "testing" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" -) - -const ( - dbPath = "/tmp/status-key-store.db" + "github.com/status-im/status-go/t/helpers" ) func TestSQLLitePersistenceTestSuite(t *testing.T) { @@ -20,15 +16,13 @@ func TestSQLLitePersistenceTestSuite(t *testing.T) { type SQLLitePersistenceTestSuite struct { suite.Suite - // nolint: structcheck, megacheck - db *sql.DB service *sqlitePersistence } func (s *SQLLitePersistenceTestSuite) SetupTest() { - os.Remove(dbPath) - - db, err := sqlite.Open(dbPath, "test-key", sqlite.ReducedKDFIterationsNumber) + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) s.Require().NoError(err) s.service = newSQLitePersistence(db) diff --git a/protocol/encryption/persistence_keys_storage_test.go b/protocol/encryption/persistence_keys_storage_test.go index 09af66fe6..7f6d68106 100644 --- a/protocol/encryption/persistence_keys_storage_test.go +++ b/protocol/encryption/persistence_keys_storage_test.go @@ -1,13 +1,14 @@ package encryption import ( - "path/filepath" "testing" dr "github.com/status-im/doubleratchet" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" ) var ( @@ -30,10 +31,9 @@ type SQLLitePersistenceKeysStorageTestSuite struct { } func (s *SQLLitePersistenceKeysStorageTestSuite) SetupTest() { - dir := s.T().TempDir() - key := "blahblahblah" - - db, err := sqlite.Open(filepath.Join(dir, "db.sql"), key, sqlite.ReducedKDFIterationsNumber) + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) s.Require().NoError(err) p := newSQLitePersistence(db) diff --git a/protocol/encryption/persistence_test.go b/protocol/encryption/persistence_test.go index a01bdc4a1..16dc0deb0 100644 --- a/protocol/encryption/persistence_test.go +++ b/protocol/encryption/persistence_test.go @@ -1,13 +1,13 @@ package encryption import ( - "database/sql" - "path/filepath" "testing" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/eth-node/crypto" + "github.com/status-im/status-go/t/helpers" "github.com/status-im/status-go/protocol/encryption/multidevice" "github.com/status-im/status-go/protocol/sqlite" @@ -19,15 +19,13 @@ func TestSQLLitePersistenceTestSuite(t *testing.T) { type SQLLitePersistenceTestSuite struct { suite.Suite - // nolint: structcheck, megacheck - db *sql.DB service *sqlitePersistence } func (s *SQLLitePersistenceTestSuite) SetupTest() { - dir := s.T().TempDir() - - db, err := sqlite.Open(filepath.Join(dir, "db.sql"), "test-key", sqlite.ReducedKDFIterationsNumber) + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) s.Require().NoError(err) s.service = newSQLitePersistence(db) diff --git a/protocol/encryption/protocol_test.go b/protocol/encryption/protocol_test.go index b7e2406f1..28fb19fcb 100644 --- a/protocol/encryption/protocol_test.go +++ b/protocol/encryption/protocol_test.go @@ -1,13 +1,12 @@ package encryption import ( - "io/ioutil" - "os" "testing" - "github.com/status-im/status-go/protocol/tt" - + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/protocol/tt" + "github.com/status-im/status-go/t/helpers" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -21,11 +20,9 @@ func TestProtocolServiceTestSuite(t *testing.T) { type ProtocolServiceTestSuite struct { suite.Suite - aliceDBPath *os.File - bobDBPath *os.File - alice *Protocol - bob *Protocol - logger *zap.Logger + alice *Protocol + bob *Protocol + logger *zap.Logger } func (s *ProtocolServiceTestSuite) SetupTest() { @@ -33,15 +30,9 @@ func (s *ProtocolServiceTestSuite) SetupTest() { s.logger = tt.MustCreateTestLogger() - s.aliceDBPath, err = ioutil.TempFile("", "alice.db.sql") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) s.Require().NoError(err) - aliceDBKey := "alice" - - s.bobDBPath, err = ioutil.TempFile("", "bob.db.sql") - s.Require().NoError(err) - bobDBKey := "bob" - - db, err := sqlite.Open(s.aliceDBPath.Name(), aliceDBKey, sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) s.Require().NoError(err) s.alice = New( db, @@ -49,7 +40,9 @@ func (s *ProtocolServiceTestSuite) SetupTest() { s.logger.With(zap.String("user", "alice")), ) - db, err = sqlite.Open(s.bobDBPath.Name(), bobDBKey, sqlite.ReducedKDFIterationsNumber) + db, err = helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) s.Require().NoError(err) s.bob = New( db, @@ -59,8 +52,6 @@ func (s *ProtocolServiceTestSuite) SetupTest() { } func (s *ProtocolServiceTestSuite) TearDownTest() { - os.Remove(s.aliceDBPath.Name()) - os.Remove(s.bobDBPath.Name()) _ = s.logger.Sync() } diff --git a/protocol/encryption/sharedsecret/service_test.go b/protocol/encryption/sharedsecret/service_test.go index a33d9c544..295cc70d9 100644 --- a/protocol/encryption/sharedsecret/service_test.go +++ b/protocol/encryption/sharedsecret/service_test.go @@ -1,17 +1,17 @@ package sharedsecret import ( - "io/ioutil" - "os" "testing" + "github.com/status-im/status-go/appdatabase" + "github.com/status-im/status-go/protocol/sqlite" "github.com/status-im/status-go/protocol/tt" + "github.com/status-im/status-go/t/helpers" "github.com/stretchr/testify/suite" "go.uber.org/zap" "github.com/status-im/status-go/eth-node/crypto" - "github.com/status-im/status-go/protocol/sqlite" ) func TestServiceTestSuite(t *testing.T) { @@ -21,25 +21,21 @@ func TestServiceTestSuite(t *testing.T) { type SharedSecretTestSuite struct { suite.Suite service *SharedSecret - path string logger *zap.Logger } func (s *SharedSecretTestSuite) SetupTest() { s.logger = tt.MustCreateTestLogger() - dbFile, err := ioutil.TempFile(os.TempDir(), "sharedsecret") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) s.Require().NoError(err) - s.path = dbFile.Name() - - db, err := sqlite.Open(s.path, "", sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) s.Require().NoError(err) s.service = New(db, s.logger) } func (s *SharedSecretTestSuite) TearDownTest() { - os.Remove(s.path) _ = s.logger.Sync() } diff --git a/protocol/ens/persistence_test.go b/protocol/ens/persistence_test.go index 1ffc94819..87d36e98a 100644 --- a/protocol/ens/persistence_test.go +++ b/protocol/ens/persistence_test.go @@ -5,7 +5,9 @@ import ( "github.com/stretchr/testify/require" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" ) func TestGetENSToBeVerified(t *testing.T) { @@ -13,9 +15,8 @@ func TestGetENSToBeVerified(t *testing.T) { name := "test.eth" updatedName := "test2.eth" - db, err := sqlite.Open(sqlite.InMemoryPath, "", sqlite.ReducedKDFIterationsNumber) + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) require.NoError(t, err) - err = sqlite.Migrate(db) require.NoError(t, err) diff --git a/protocol/persistence_test.go b/protocol/persistence_test.go index c4b084a42..c823e5a5b 100644 --- a/protocol/persistence_test.go +++ b/protocol/persistence_test.go @@ -4,7 +4,6 @@ import ( "bytes" "database/sql" "fmt" - "io/ioutil" "math" "sort" "strconv" @@ -14,11 +13,13 @@ import ( "github.com/stretchr/testify/require" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" ) func TestTableUserMessagesAllFieldsCount(t *testing.T) { @@ -891,11 +892,12 @@ func TestPersistenceEmojiReactions(t *testing.T) { } func openTestDB() (*sql.DB, error) { - dbPath, err := ioutil.TempFile("", "status-go-test-db-") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) if err != nil { return nil, err } - return sqlite.Open(dbPath.Name(), "", sqlite.ReducedKDFIterationsNumber) + + return db, sqlite.Migrate(db) } func insertMinimalMessage(p *sqlitePersistence, id string) error { diff --git a/protocol/pushnotificationclient/client_test.go b/protocol/pushnotificationclient/client_test.go index d0f750b7b..eea686fc8 100644 --- a/protocol/pushnotificationclient/client_test.go +++ b/protocol/pushnotificationclient/client_test.go @@ -3,14 +3,13 @@ package pushnotificationclient import ( "bytes" "crypto/ecdsa" - "io/ioutil" "math/rand" - "os" "testing" "github.com/google/uuid" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto/ecies" "github.com/status-im/status-go/eth-node/types" @@ -18,13 +17,13 @@ import ( "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/sqlite" "github.com/status-im/status-go/protocol/tt" + "github.com/status-im/status-go/t/helpers" ) const testDeviceToken = "test-token" type ClientSuite struct { suite.Suite - tmpFile *os.File persistence *Persistence identity *ecdsa.PrivateKey installationID string @@ -39,13 +38,12 @@ func TestClientSuite(t *testing.T) { } func (s *ClientSuite) SetupTest() { - tmpFile, err := ioutil.TempFile("", "") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) s.Require().NoError(err) - s.tmpFile = tmpFile - database, err := sqlite.Open(s.tmpFile.Name(), "", sqlite.ReducedKDFIterationsNumber) - s.Require().NoError(err) - s.persistence = NewPersistence(database) + s.persistence = NewPersistence(db) identity, err := crypto.GenerateKey() s.Require().NoError(err) diff --git a/protocol/pushnotificationclient/persistence_test.go b/protocol/pushnotificationclient/persistence_test.go index 36e67bb95..cf9c52a9e 100644 --- a/protocol/pushnotificationclient/persistence_test.go +++ b/protocol/pushnotificationclient/persistence_test.go @@ -2,18 +2,18 @@ package pushnotificationclient import ( "crypto/ecdsa" - "io/ioutil" - "os" "testing" "time" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" ) const ( @@ -29,22 +29,16 @@ func TestSQLitePersistenceSuite(t *testing.T) { type SQLitePersistenceSuite struct { suite.Suite - tmpFile *os.File persistence *Persistence } func (s *SQLitePersistenceSuite) SetupTest() { - tmpFile, err := ioutil.TempFile("", "") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) s.Require().NoError(err) - s.tmpFile = tmpFile - - database, err := sqlite.Open(s.tmpFile.Name(), "", sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) s.Require().NoError(err) - s.persistence = NewPersistence(database) -} -func (s *SQLitePersistenceSuite) TearDownTest() { - _ = os.Remove(s.tmpFile.Name()) + s.persistence = NewPersistence(db) } func (s *SQLitePersistenceSuite) TestSaveAndRetrieveServer() { diff --git a/protocol/pushnotificationserver/persistence_test.go b/protocol/pushnotificationserver/persistence_test.go index e8d16d06b..362a447e8 100644 --- a/protocol/pushnotificationserver/persistence_test.go +++ b/protocol/pushnotificationserver/persistence_test.go @@ -1,17 +1,17 @@ package pushnotificationserver import ( - "io/ioutil" - "os" "testing" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" ) func TestSQLitePersistenceSuite(t *testing.T) { @@ -20,22 +20,16 @@ func TestSQLitePersistenceSuite(t *testing.T) { type SQLitePersistenceSuite struct { suite.Suite - tmpFile *os.File persistence Persistence } func (s *SQLitePersistenceSuite) SetupTest() { - tmpFile, err := ioutil.TempFile("", "") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) s.Require().NoError(err) - s.tmpFile = tmpFile - - database, err := sqlite.Open(s.tmpFile.Name(), "", sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) s.Require().NoError(err) - s.persistence = NewSQLitePersistence(database) -} -func (s *SQLitePersistenceSuite) TearDownTest() { - _ = os.Remove(s.tmpFile.Name()) + s.persistence = NewSQLitePersistence(db) } func (s *SQLitePersistenceSuite) TestSaveAndRetrieve() { diff --git a/protocol/pushnotificationserver/server_test.go b/protocol/pushnotificationserver/server_test.go index 211141d95..2b6726efc 100644 --- a/protocol/pushnotificationserver/server_test.go +++ b/protocol/pushnotificationserver/server_test.go @@ -3,18 +3,18 @@ package pushnotificationserver import ( "crypto/ecdsa" "crypto/rand" - "io/ioutil" - "os" "testing" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/sqlite" "github.com/status-im/status-go/protocol/tt" + "github.com/status-im/status-go/t/helpers" ) func TestServerSuite(t *testing.T) { @@ -27,7 +27,6 @@ func TestServerSuite(t *testing.T) { type ServerSuite struct { suite.Suite - tmpFile *os.File persistence Persistence accessToken string installationID string @@ -39,13 +38,12 @@ type ServerSuite struct { } func (s *ServerSuite) SetupTest() { - tmpFile, err := ioutil.TempFile("", "") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) s.Require().NoError(err) - s.tmpFile = tmpFile - database, err := sqlite.Open(s.tmpFile.Name(), "", sqlite.ReducedKDFIterationsNumber) - s.Require().NoError(err) - s.persistence = NewSQLitePersistence(database) + s.persistence = NewSQLitePersistence(db) identity, err := crypto.GenerateKey() s.Require().NoError(err) diff --git a/protocol/sqlite/db.go b/protocol/sqlite/db.go index c8b33340f..344cca953 100644 --- a/protocol/sqlite/db.go +++ b/protocol/sqlite/db.go @@ -2,8 +2,6 @@ package sqlite import ( "database/sql" - "fmt" - "os" "github.com/pkg/errors" @@ -14,87 +12,8 @@ import ( mvdsmigrations "github.com/vacp2p/mvds/persistenceutil" ) -// The reduced number of kdf iterations (for performance reasons) which is -// currently used for derivation of the database key -// https://github.com/status-im/status-go/pull/1343 -// https://notes.status.im/i8Y_l7ccTiOYq09HVgoFwA -const ReducedKDFIterationsNumber = 3200 - -const InMemoryPath = ":memory:" - var migrationsTable = "status_protocol_go_" + sqlcipher.DefaultMigrationsTable -// MigrationConfig is a struct that allows to define bindata migrations. -type MigrationConfig struct { - AssetNames []string - AssetGetter func(name string) ([]byte, error) -} - -// Open opens or initializes a new database for a given file path. -// MigrationConfig is optional but if provided migrations are applied automatically. -func Open(path, key string, kdfIterationNumber int) (*sql.DB, error) { - return openAndMigrate(path, key, kdfIterationNumber) -} - -// OpenInMemory opens an in memory SQLite database. -// Number of KDF iterations is reduced to 0. -func OpenInMemory() (*sql.DB, error) { - return openAndMigrate(InMemoryPath, "", 0) -} - -// OpenWithIter allows to open a new database with a custom number of kdf iterations. -// Higher kdf iterations number makes it slower to open the database. -func OpenWithIter(path, key string, kdfIter int) (*sql.DB, error) { - return openAndMigrate(path, key, kdfIter) -} - -func open(path string, key string, kdfIter int) (*sql.DB, error) { - if path != InMemoryPath { - _, err := os.OpenFile(path, os.O_CREATE, 0600) - if err != nil { - return nil, err - } - } - - db, err := sql.Open("sqlite3", path) - if err != nil { - return nil, err - } - - keyString := fmt.Sprintf("PRAGMA key = '%s'", key) - - // Disable concurrent access as not supported by the driver - db.SetMaxOpenConns(1) - - if _, err = db.Exec("PRAGMA foreign_keys=ON"); err != nil { - return nil, err - } - - if _, err = db.Exec(keyString); err != nil { - return nil, err - } - - kdfString := fmt.Sprintf("PRAGMA kdf_iter = '%d'", kdfIter) - - if _, err = db.Exec(kdfString); err != nil { - return nil, err - } - - return db, nil -} - -func openAndMigrate(path string, key string, kdfIter int) (*sql.DB, error) { - db, err := open(path, key, kdfIter) - if err != nil { - return nil, err - } - - if err := Migrate(db); err != nil { - return nil, err - } - return db, nil -} - // applyMigrations allows to apply bindata migrations on the current *sql.DB. // `assetNames` is a list of assets with migrations and `assetGetter` is responsible // for returning the content of the asset with a given name. diff --git a/protocol/sqlite/db_test.go b/protocol/sqlite/db_test.go index f063444ad..4d10857c4 100644 --- a/protocol/sqlite/db_test.go +++ b/protocol/sqlite/db_test.go @@ -1,42 +1,21 @@ package sqlite import ( - "path/filepath" "testing" "github.com/stretchr/testify/require" + + "github.com/status-im/status-go/appdatabase" + "github.com/status-im/status-go/t/helpers" ) -func TestOpen(t *testing.T) { - dir := t.TempDir() - - dbPath := filepath.Join(dir, "db.sql") - - // Open the db for the first time. - db, err := openAndMigrate(dbPath, "some-key", ReducedKDFIterationsNumber) - require.NoError(t, err) - - // Insert some data. - _, err = db.Exec("CREATE TABLE test(name TEXT)") - require.NoError(t, err) - _, err = db.Exec(`INSERT INTO test (name) VALUES ("abc")`) - require.NoError(t, err) - db.Close() - - // Open again with different key should fail - // because the file already exists and it should not - // be recreated. - _, err = openAndMigrate(dbPath, "different-key", ReducedKDFIterationsNumber) - require.Error(t, err) -} - // TestCommunitiesMigrationDirty tests the communities migration when // dirty flag has been set to true. // We first make it fail, then clean up so that it can be replayed, and // then execute again, and we should be all migrated. func TestCommunitiesMigrationDirty(t *testing.T) { // Open the db for the first time. - db, err := open(InMemoryPath, "some-key", ReducedKDFIterationsNumber) + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) require.NoError(t, err) // Create a communities table, so that migration will fail @@ -84,7 +63,7 @@ func TestCommunitiesMigrationDirty(t *testing.T) { // dirty to false and then execute again, and we should be all migrated. func TestCommunitiesMigrationNotDirty(t *testing.T) { // Open the db for the first time. - db, err := open(InMemoryPath, "some-key", ReducedKDFIterationsNumber) + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) require.NoError(t, err) // Create a communities table, so that migration will fail diff --git a/protocol/transport/transport_test.go b/protocol/transport/transport_test.go index dd1c7f699..842f7c547 100644 --- a/protocol/transport/transport_test.go +++ b/protocol/transport/transport_test.go @@ -1,11 +1,11 @@ package transport import ( - "io/ioutil" - "os" "testing" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" "github.com/stretchr/testify/require" @@ -13,10 +13,11 @@ import ( ) func TestNewTransport(t *testing.T) { - dbPath, err := ioutil.TempFile("", "transport.sql") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) require.NoError(t, err) - defer os.Remove(dbPath.Name()) - db, err := sqlite.Open(dbPath.Name(), "some-key", sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) + require.NoError(t, err) + require.NoError(t, err) logger := tt.MustCreateTestLogger() diff --git a/protocol/verification/persistence_test.go b/protocol/verification/persistence_test.go index 06a3005ff..2d8d7baa7 100644 --- a/protocol/verification/persistence_test.go +++ b/protocol/verification/persistence_test.go @@ -1,13 +1,14 @@ package verification import ( - "io/ioutil" "testing" "time" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" ) func TestPersistenceSuite(t *testing.T) { @@ -21,13 +22,10 @@ type PersistenceSuite struct { } func (s *PersistenceSuite) SetupTest() { - s.db = nil - - dbPath, err := ioutil.TempFile("", "") - s.NoError(err, "creating temp file for db") - - db, err := sqlite.Open(dbPath.Name(), "", sqlite.ReducedKDFIterationsNumber) - s.NoError(err, "creating sqlite db instance") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) + s.Require().NoError(err) + err = sqlite.Migrate(db) + s.Require().NoError(err) s.db = &Persistence{db: db} } diff --git a/server/handlers_test.go b/server/handlers_test.go index e518b4698..645af3f91 100644 --- a/server/handlers_test.go +++ b/server/handlers_test.go @@ -3,7 +3,6 @@ package server import ( "database/sql" "encoding/json" - "io/ioutil" "net/http" "net/http/httptest" "net/url" @@ -12,17 +11,18 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap" + "github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/logutils" "github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/t/helpers" ) func setupTest(t *testing.T) (*sql.DB, *zap.Logger) { - dbPath, err := ioutil.TempFile("", "status-go-test-db-") + db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) require.NoError(t, err) - - db, err := sqlite.Open(dbPath.Name(), "", sqlite.ReducedKDFIterationsNumber) + err = sqlite.Migrate(db) require.NoError(t, err) logger := logutils.ZapLogger() diff --git a/server/pairing/payload_management_test.go b/server/pairing/payload_management_test.go index dbb6d28f2..f3c74bfd7 100644 --- a/server/pairing/payload_management_test.go +++ b/server/pairing/payload_management_test.go @@ -13,9 +13,9 @@ import ( "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/images" "github.com/status-im/status-go/multiaccounts" - "github.com/status-im/status-go/protocol/sqlite" "github.com/status-im/status-go/server/servertest" "github.com/status-im/status-go/t/utils" ) @@ -29,7 +29,7 @@ var ( ColorHash: multiaccounts.ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, Images: images.SampleIdentityImages(), - KDFIterations: sqlite.ReducedKDFIterationsNumber, + KDFIterations: dbsetup.ReducedKDFIterationsNumber, } account1Hash = []byte{0x8f, 0xba, 0x35, 0x1, 0x2b, 0x9d, 0xad, 0xf0, 0x2d, 0x3c, 0x4d, 0x6, 0xb5, 0x22, 0x2, 0x47, 0xd4, 0x1c, 0xf4, 0x31, 0x2f, 0xb, 0x5b, 0x27, 0x5d, 0x43, 0x97, 0x58, 0x2d, 0xf0, 0xe1, 0xbe} account2Hash = []byte{0x9, 0xf8, 0x5c, 0xe9, 0x92, 0x96, 0x2d, 0x88, 0x2b, 0x8e, 0x42, 0x3f, 0xa4, 0x93, 0x6c, 0xad, 0xe9, 0xc0, 0x1b, 0x8a, 0x8, 0x8c, 0x5e, 0x7a, 0x84, 0xa2, 0xf, 0x9f, 0x77, 0x58, 0x2c, 0x2c} diff --git a/server/pairing/sync_device_test.go b/server/pairing/sync_device_test.go index b999ec08d..741f8f2a1 100644 --- a/server/pairing/sync_device_test.go +++ b/server/pairing/sync_device_test.go @@ -13,6 +13,7 @@ import ( "go.uber.org/zap" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/protocol/encryption/multidevice" "github.com/status-im/status-go/protocol/tt" @@ -36,7 +37,6 @@ import ( "github.com/status-im/status-go/protocol/requests" accservice "github.com/status-im/status-go/services/accounts" "github.com/status-im/status-go/services/browsers" - "github.com/status-im/status-go/sqlite" ) const ( @@ -102,7 +102,7 @@ func (s *SyncDeviceSuite) prepareBackendWithAccount(mnemonic, tmpdir string) *ap } account := multiaccounts.Account{ KeyUID: generatedAccountInfo.KeyUID, - KDFIterations: sqlite.ReducedKDFIterationsNumber, + KDFIterations: dbsetup.ReducedKDFIterationsNumber, } err = accountManager.InitKeystore(filepath.Join(tmpdir, keystoreDir, account.KeyUID)) require.NoError(s.T(), err) diff --git a/services/wallet/history/balance_db_test.go b/services/wallet/history/balance_db_test.go index 0e85cb43b..67b552bac 100644 --- a/services/wallet/history/balance_db_test.go +++ b/services/wallet/history/balance_db_test.go @@ -9,13 +9,13 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/common/dbsetup" "github.com/status-im/status-go/services/wallet/bigint" "github.com/status-im/status-go/walletdatabase" ) func setupBalanceDBTest(t *testing.T) (*BalanceDB, func()) { - db, err := walletdatabase.InitializeDB(sqlite.InMemoryPath, "wallet-history-balance_db-tests", 1) + db, err := walletdatabase.InitializeDB(dbsetup.InMemoryPath, "wallet-history-balance_db-tests", 1) require.NoError(t, err) return NewBalanceDB(db), func() { require.NoError(t, db.Close()) diff --git a/sqlite/sqlite.go b/sqlite/sqlite.go index 9d82a389c..d880e099f 100644 --- a/sqlite/sqlite.go +++ b/sqlite/sqlite.go @@ -12,7 +12,7 @@ import ( sqlcipher "github.com/mutecomm/go-sqlcipher/v4" // We require go sqlcipher that overrides default implementation - "github.com/status-im/status-go/protocol/sqlite" + "github.com/status-im/status-go/common/dbsetup" ) const ( @@ -80,7 +80,7 @@ func attachDatabaseWithDefaultSettings(db *sql.DB, attachedDbPath string, attach } if kdfIterationsNumber <= 0 { - kdfIterationsNumber = sqlite.ReducedKDFIterationsNumber + kdfIterationsNumber = dbsetup.ReducedKDFIterationsNumber } if _, err := db.Exec(fmt.Sprintf(`PRAGMA %s.busy_timeout = 60000`, attachedDbName)); err != nil { @@ -177,7 +177,7 @@ func openDB(path string, key string, kdfIterationsNumber int, cipherPageSize int } if kdfIterationsNumber <= 0 { - kdfIterationsNumber = sqlite.ReducedKDFIterationsNumber + kdfIterationsNumber = dbsetup.ReducedKDFIterationsNumber } if _, err := conn.Exec(fmt.Sprintf("PRAGMA cipher_page_size = %d", cipherPageSize), nil); err != nil { @@ -289,7 +289,7 @@ func ChangeEncryptionKey(path string, key string, kdfIterationsNumber int, newKe } if kdfIterationsNumber <= 0 { - kdfIterationsNumber = sqlite.ReducedKDFIterationsNumber + kdfIterationsNumber = dbsetup.ReducedKDFIterationsNumber } db, err := openDB(path, key, kdfIterationsNumber, V4CipherPageSize) diff --git a/t/helpers/db.go b/t/helpers/db.go index 49cae7b32..1e1b1874f 100644 --- a/t/helpers/db.go +++ b/t/helpers/db.go @@ -6,7 +6,6 @@ import ( "os" "github.com/status-im/status-go/common/dbsetup" - "github.com/status-im/status-go/protocol/sqlite" ) const kdfIterationsNumberForTests = 1 @@ -33,7 +32,7 @@ func SetupTestSQLDB(dbInit dbsetup.DatabaseInitializer, prefix string) (*sql.DB, } func SetupTestMemorySQLDB(dbInit dbsetup.DatabaseInitializer) (*sql.DB, error) { - db, err := dbInit.Initialize(sqlite.InMemoryPath, "password", kdfIterationsNumberForTests) + db, err := dbInit.Initialize(dbsetup.InMemoryPath, "password", kdfIterationsNumberForTests) if err != nil { return nil, err }