feat(GODT-2500): Add panic handlers everywhere.

This commit is contained in:
Jakub
2023-03-22 17:18:17 +01:00
parent 9f59e61b14
commit ec92c918cd
42 changed files with 283 additions and 130 deletions

View File

@ -25,6 +25,7 @@ import (
"path/filepath"
"testing"
"github.com/ProtonMail/gluon/queue"
"github.com/ProtonMail/gopenpgp/v2/crypto"
"github.com/stretchr/testify/require"
"github.com/vmihailenco/msgpack/v5"
@ -52,7 +53,7 @@ func TestMigrate(t *testing.T) {
require.NoError(t, os.WriteFile(filepath.Join(dir, "vault.enc"), b, 0o600))
// Migrate the vault.
s, corrupt, err := New(dir, "default-gluon-dir", []byte("my secret key"))
s, corrupt, err := New(dir, "default-gluon-dir", []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.False(t, corrupt)

View File

@ -22,6 +22,7 @@ import (
"testing"
"github.com/Masterminds/semver/v3"
"github.com/ProtonMail/gluon/queue"
"github.com/ProtonMail/proton-bridge/v3/internal/updater"
"github.com/ProtonMail/proton-bridge/v3/internal/vault"
"github.com/stretchr/testify/require"
@ -63,7 +64,7 @@ func TestVault_Settings_SMTP(t *testing.T) {
func TestVault_Settings_GluonDir(t *testing.T) {
// create a new test vault.
s, corrupt, err := vault.New(t.TempDir(), "/path/to/gluon", []byte("my secret key"))
s, corrupt, err := vault.New(t.TempDir(), "/path/to/gluon", []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.False(t, corrupt)

View File

@ -29,6 +29,7 @@ import (
"path/filepath"
"sync"
"github.com/ProtonMail/proton-bridge/v3/internal/async"
"github.com/bradenaw/juniper/parallel"
"github.com/bradenaw/juniper/xslices"
"github.com/sirupsen/logrus"
@ -44,10 +45,12 @@ type Vault struct {
ref map[string]int
refLock sync.Mutex
panicHandler async.PanicHandler
}
// New constructs a new encrypted data vault at the given filepath using the given encryption key.
func New(vaultDir, gluonCacheDir string, key []byte) (*Vault, bool, error) {
func New(vaultDir, gluonCacheDir string, key []byte, panicHandler async.PanicHandler) (*Vault, bool, error) {
if err := os.MkdirAll(vaultDir, 0o700); err != nil {
return nil, false, err
}
@ -69,9 +72,17 @@ func New(vaultDir, gluonCacheDir string, key []byte) (*Vault, bool, error) {
return nil, false, err
}
vault.panicHandler = panicHandler
return vault, corrupt, nil
}
func (vault *Vault) handlePanic() {
if vault.panicHandler != nil {
vault.panicHandler.HandlePanic()
}
}
// GetUserIDs returns the user IDs and usernames of all users in the vault.
func (vault *Vault) GetUserIDs() []string {
return xslices.Map(vault.get().Users, func(user UserData) string {
@ -115,6 +126,8 @@ func (vault *Vault) ForUser(parallelism int, fn func(*User) error) error {
userIDs := vault.GetUserIDs()
return parallel.DoContext(context.Background(), parallelism, len(userIDs), func(_ context.Context, idx int) error {
defer vault.handlePanic()
user, err := vault.NewUser(userIDs[idx])
if err != nil {
return err

View File

@ -22,6 +22,7 @@ import (
"runtime"
"testing"
"github.com/ProtonMail/gluon/queue"
"github.com/ProtonMail/proton-bridge/v3/internal/vault"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
@ -31,7 +32,7 @@ func BenchmarkVault(b *testing.B) {
vaultDir, gluonDir := b.TempDir(), b.TempDir()
// Create a new vault.
s, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"))
s, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(b, err)
require.False(b, corrupt)

View File

@ -22,6 +22,7 @@ import (
"path/filepath"
"testing"
"github.com/ProtonMail/gluon/queue"
"github.com/ProtonMail/proton-bridge/v3/internal/vault"
"github.com/stretchr/testify/require"
)
@ -30,19 +31,19 @@ func TestVault_Corrupt(t *testing.T) {
vaultDir, gluonDir := t.TempDir(), t.TempDir()
{
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"))
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.False(t, corrupt)
}
{
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"))
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.False(t, corrupt)
}
{
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("bad key"))
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("bad key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.True(t, corrupt)
}
@ -52,13 +53,13 @@ func TestVault_Corrupt_JunkData(t *testing.T) {
vaultDir, gluonDir := t.TempDir(), t.TempDir()
{
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"))
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.False(t, corrupt)
}
{
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"))
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.False(t, corrupt)
}
@ -71,7 +72,7 @@ func TestVault_Corrupt_JunkData(t *testing.T) {
_, err = f.Write([]byte("junk data"))
require.NoError(t, err)
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"))
_, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.True(t, corrupt)
}
@ -99,7 +100,7 @@ func TestVault_Reset(t *testing.T) {
func newVault(t *testing.T) *vault.Vault {
t.Helper()
s, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"))
s, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"), queue.NoopPanicHandler{})
require.NoError(t, err)
require.False(t, corrupt)