From 6add1868672ac5b438d14035581428eb75675284 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 20 Sep 2020 00:37:58 +0200 Subject: [PATCH] key: Check that a new key file actually works --- cmd/restic/cmd_key.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/cmd/restic/cmd_key.go b/cmd/restic/cmd_key.go index bbd4f0f90..69c2542b7 100644 --- a/cmd/restic/cmd_key.go +++ b/cmd/restic/cmd_key.go @@ -131,6 +131,11 @@ func addKey(gopts GlobalOptions, repo *repository.Repository) error { return errors.Fatalf("creating new key failed: %v\n", err) } + err = switchToNewKeyAndRemoveIfBroken(gopts.ctx, repo, id, pw) + if err != nil { + return err + } + Verbosef("saved new key as %s\n", id) return nil @@ -161,8 +166,14 @@ func changePassword(gopts GlobalOptions, repo *repository.Repository) error { if err != nil { return errors.Fatalf("creating new key failed: %v\n", err) } + oldID := repo.KeyName() - h := restic.Handle{Type: restic.KeyFile, Name: repo.KeyName()} + err = switchToNewKeyAndRemoveIfBroken(gopts.ctx, repo, id, pw) + if err != nil { + return err + } + + h := restic.Handle{Type: restic.KeyFile, Name: oldID} err = repo.Backend().Remove(gopts.ctx, h) if err != nil { return err @@ -173,6 +184,19 @@ func changePassword(gopts GlobalOptions, repo *repository.Repository) error { return nil } +func switchToNewKeyAndRemoveIfBroken(ctx context.Context, repo *repository.Repository, key *repository.Key, pw string) error { + // Verify new key to make sure it really works. A broken key can render the + // whole repository inaccessible + err := repo.SearchKey(ctx, pw, 0, key.Name()) + if err != nil { + // the key is invalid, try to remove it + h := restic.Handle{Type: restic.KeyFile, Name: key.Name()} + _ = repo.Backend().Remove(ctx, h) + return errors.Fatalf("failed to access repository with new key: %v", err) + } + return nil +} + func runKey(gopts GlobalOptions, args []string) error { if len(args) < 1 || (args[0] == "remove" && len(args) != 2) || (args[0] != "remove" && len(args) != 1) { return errors.Fatal("wrong number of arguments")