Skip to content

Commit f042271

Browse files
committed
fix(GODT-2802): missing error on unlock failed
1 parent c761773 commit f042271

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

keyring.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/ProtonMail/go-crypto/openpgp/armor"
1313
"github.com/ProtonMail/gopenpgp/v2/crypto"
1414
"github.com/bradenaw/juniper/xslices"
15+
"github.com/sirupsen/logrus"
1516
)
1617

1718
func ExtractSignatures(kr *crypto.KeyRing, arm string) ([]Signature, error) {
@@ -151,6 +152,7 @@ func (keys Keys) Unlock(passphrase []byte, userKR *crypto.KeyRing) (*crypto.KeyR
151152
for _, key := range xslices.Filter(keys, func(key Key) bool { return bool(key.Active) }) {
152153
unlocked, err := key.Unlock(passphrase, userKR)
153154
if err != nil {
155+
logrus.WithField("KeyID", key.ID).WithError(err).Warning("Cannot unlock key")
154156
continue
155157
}
156158

@@ -159,6 +161,10 @@ func (keys Keys) Unlock(passphrase []byte, userKR *crypto.KeyRing) (*crypto.KeyR
159161
}
160162
}
161163

164+
if kr.CountEntities() == 0 {
165+
return nil, errors.New("not able to unlock any key")
166+
}
167+
162168
return kr, nil
163169
}
164170

keyring_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package proton
2+
3+
import (
4+
"testing"
5+
6+
"github.com/ProtonMail/gopenpgp/v2/crypto"
7+
"github.com/ProtonMail/gopenpgp/v2/helper"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestKeyring_Unlock(t *testing.T) {
12+
r := require.New(t)
13+
14+
newKey := func(id, passphrase string) Key {
15+
arm, err := helper.GenerateKey(id, id+"@email.com", []byte(passphrase), "rsa", 2048)
16+
r.NoError(err)
17+
18+
privKey, err := crypto.NewKeyFromArmored(arm)
19+
r.NoError(err)
20+
21+
serial, err := privKey.Serialize()
22+
r.NoError(err)
23+
24+
return Key{
25+
ID: id,
26+
PrivateKey: serial,
27+
Active: true,
28+
}
29+
}
30+
31+
keys := Keys{
32+
newKey("1", "good_phrase"),
33+
newKey("2", "good_phrase"),
34+
newKey("3", "bad_phrase"),
35+
}
36+
37+
_, err := keys.Unlock([]byte("ugly_phrase"), nil)
38+
r.Error(err)
39+
40+
kr, err := keys.Unlock([]byte("bad_phrase"), nil)
41+
r.NoError(err)
42+
r.Equal(1, kr.CountEntities())
43+
44+
kr, err = keys.Unlock([]byte("good_phrase"), nil)
45+
r.NoError(err)
46+
r.Equal(2, kr.CountEntities())
47+
}

0 commit comments

Comments
 (0)