Skip to content

Commit c447774

Browse files
Patrick Zhengdependabot[bot]qba73
authored
backport: from main to release-1.3 branch (#536)
Signed-off-by: Patrick Zheng <[email protected]> Signed-off-by: Jakub Jarosz <[email protected]> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jakub Jarosz <[email protected]>
1 parent 727046d commit c447774

File tree

9 files changed

+253
-80
lines changed

9 files changed

+253
-80
lines changed

config/errors.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright The Notary Project Authors.
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
package config
15+
16+
import (
17+
"errors"
18+
"fmt"
19+
)
20+
21+
// ErrKeyNameEmpty is used when key name is empty.
22+
var ErrKeyNameEmpty = errors.New("key name cannot be empty")
23+
24+
// KeyNotFoundError is used when key is not found in the signingkeys.json file.
25+
type KeyNotFoundError struct {
26+
KeyName string
27+
}
28+
29+
// Error returns the error message.
30+
func (e KeyNotFoundError) Error() string {
31+
if e.KeyName != "" {
32+
return fmt.Sprintf("signing key %s not found", e.KeyName)
33+
}
34+
return "signing key not found"
35+
}

config/errors_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright The Notary Project Authors.
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
package config
15+
16+
import "testing"
17+
18+
func TestErrorKeyNotFound(t *testing.T) {
19+
e := KeyNotFoundError{}
20+
if e.Error() != "signing key not found" {
21+
t.Fatalf("ErrorKeyNotFound.Error() = %v, want %v", e.Error(), "signing key not found")
22+
}
23+
24+
e = KeyNotFoundError{KeyName: "testKey"}
25+
if e.Error() != `signing key testKey not found` {
26+
t.Fatalf("ErrorKeyNotFound.Error() = %v, want %v", e.Error(), "signing key testKey not found")
27+
}
28+
}

config/keys.go

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,6 @@ type KeySuite struct {
5050
*ExternalKey
5151
}
5252

53-
var errorKeyNameEmpty = errors.New("key name cannot be empty")
54-
var errKeyNotFound = errors.New("signing key not found")
55-
5653
// SigningKeys reflects the signingkeys.json file.
5754
type SigningKeys struct {
5855
Default *string `json:"default,omitempty"`
@@ -67,13 +64,12 @@ func NewSigningKeys() *SigningKeys {
6764
// Add adds new signing key
6865
func (s *SigningKeys) Add(name, keyPath, certPath string, markDefault bool) error {
6966
if name == "" {
70-
return errorKeyNameEmpty
67+
return ErrKeyNameEmpty
7168
}
7269
_, err := tls.LoadX509KeyPair(certPath, keyPath)
7370
if err != nil {
7471
return err
7572
}
76-
7773
ks := KeySuite{
7874
Name: name,
7975
X509KeyPair: &X509KeyPair{
@@ -88,25 +84,20 @@ func (s *SigningKeys) Add(name, keyPath, certPath string, markDefault bool) erro
8884
func (s *SigningKeys) AddPlugin(ctx context.Context, keyName, id, pluginName string, pluginConfig map[string]string, markDefault bool) error {
8985
logger := log.GetLogger(ctx)
9086
logger.Debugf("Adding key with name %v and plugin name %v", keyName, pluginName)
91-
9287
if keyName == "" {
93-
return errorKeyNameEmpty
88+
return ErrKeyNameEmpty
9489
}
95-
9690
if id == "" {
9791
return errors.New("missing key id")
9892
}
99-
10093
if pluginName == "" {
10194
return errors.New("plugin name cannot be empty")
10295
}
103-
10496
mgr := plugin.NewCLIManager(dir.PluginFS())
10597
_, err := mgr.Get(ctx, pluginName)
10698
if err != nil {
10799
return err
108100
}
109-
110101
ks := KeySuite{
111102
Name: keyName,
112103
ExternalKey: &ExternalKey{
@@ -115,7 +106,6 @@ func (s *SigningKeys) AddPlugin(ctx context.Context, keyName, id, pluginName str
115106
PluginConfig: pluginConfig,
116107
},
117108
}
118-
119109
if err = s.add(ks, markDefault); err != nil {
120110
logger.Error("Failed to add key with error: %v", err)
121111
return err
@@ -127,14 +117,12 @@ func (s *SigningKeys) AddPlugin(ctx context.Context, keyName, id, pluginName str
127117
// Get returns signing key for the given name
128118
func (s *SigningKeys) Get(keyName string) (KeySuite, error) {
129119
if keyName == "" {
130-
return KeySuite{}, errorKeyNameEmpty
120+
return KeySuite{}, ErrKeyNameEmpty
131121
}
132-
133122
idx := slices.IndexIsser(s.Keys, keyName)
134123
if idx < 0 {
135-
return KeySuite{}, errKeyNotFound
124+
return KeySuite{}, KeyNotFoundError{KeyName: keyName}
136125
}
137-
138126
return s.Keys[idx], nil
139127
}
140128

@@ -144,7 +132,6 @@ func (s *SigningKeys) GetDefault() (KeySuite, error) {
144132
return KeySuite{}, errors.New("default signing key not set." +
145133
" Please set default signing key or specify a key name")
146134
}
147-
148135
return s.Get(*s.Default)
149136
}
150137

@@ -153,12 +140,11 @@ func (s *SigningKeys) Remove(keyName ...string) ([]string, error) {
153140
var deletedNames []string
154141
for _, name := range keyName {
155142
if name == "" {
156-
return deletedNames, errorKeyNameEmpty
143+
return deletedNames, ErrKeyNameEmpty
157144
}
158-
159145
idx := slices.IndexIsser(s.Keys, name)
160146
if idx < 0 {
161-
return deletedNames, errors.New(name + ": not found")
147+
return deletedNames, KeyNotFoundError{KeyName: name}
162148
}
163149
s.Keys = slices.Delete(s.Keys, idx)
164150
deletedNames = append(deletedNames, name)
@@ -172,13 +158,11 @@ func (s *SigningKeys) Remove(keyName ...string) ([]string, error) {
172158
// UpdateDefault updates default signing key
173159
func (s *SigningKeys) UpdateDefault(keyName string) error {
174160
if keyName == "" {
175-
return errorKeyNameEmpty
161+
return ErrKeyNameEmpty
176162
}
177-
178163
if !slices.ContainsIsser(s.Keys, keyName) {
179-
return fmt.Errorf("key with name '%s' not found", keyName)
164+
return KeyNotFoundError{KeyName: keyName}
180165
}
181-
182166
s.Default = &keyName
183167
return nil
184168
}
@@ -189,11 +173,9 @@ func (s *SigningKeys) Save() error {
189173
if err != nil {
190174
return err
191175
}
192-
193176
if err := validateKeys(s); err != nil {
194177
return err
195178
}
196-
197179
return save(path, s)
198180
}
199181

@@ -208,11 +190,9 @@ func LoadSigningKeys() (*SigningKeys, error) {
208190
}
209191
return nil, err
210192
}
211-
212193
if err := validateKeys(&config); err != nil {
213194
return nil, err
214195
}
215-
216196
return &config, nil
217197
}
218198

@@ -224,11 +204,9 @@ func LoadExecSaveSigningKeys(fn func(keys *SigningKeys) error) error {
224204
if err != nil {
225205
return err
226206
}
227-
228207
if err := fn(signingKeys); err != nil {
229208
return err
230209
}
231-
232210
return signingKeys.Save()
233211
}
234212

@@ -241,12 +219,10 @@ func (s *SigningKeys) add(key KeySuite, markDefault bool) error {
241219
if slices.ContainsIsser(s.Keys, key.Name) {
242220
return fmt.Errorf("signing key with name %q already exists", key.Name)
243221
}
244-
245222
s.Keys = append(s.Keys, key)
246223
if markDefault {
247224
s.Default = &key.Name
248225
}
249-
250226
return nil
251227
}
252228

@@ -262,17 +238,14 @@ func validateKeys(config *SigningKeys) error {
262238
}
263239
uniqueKeyNames.Add(key.Name)
264240
}
265-
266241
if config.Default != nil {
267242
defaultKey := *config.Default
268243
if len(defaultKey) == 0 {
269244
return fmt.Errorf("malformed %s: default key name cannot be empty", dir.PathSigningKeys)
270245
}
271-
272246
if !uniqueKeyNames.Contains(defaultKey) {
273247
return fmt.Errorf("malformed %s: default key '%s' not found", dir.PathSigningKeys, defaultKey)
274248
}
275249
}
276-
277250
return nil
278251
}

config/keys_test.go

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"context"
1818
"crypto/x509"
1919
"encoding/pem"
20+
"errors"
2021
"os"
2122
"path/filepath"
2223
"reflect"
@@ -310,14 +311,22 @@ func TestGet(t *testing.T) {
310311
})
311312

312313
t.Run("NonExistent", func(t *testing.T) {
313-
if _, err := sampleSigningKeysInfo.Get("nonExistent"); err == nil {
314+
_, err := sampleSigningKeysInfo.Get("nonExistent")
315+
if err == nil {
314316
t.Error("expected Get() to fail for nonExistent key name")
315317
}
318+
if !errors.Is(err, KeyNotFoundError{KeyName: "nonExistent"}) {
319+
t.Error("expected Get() to return ErrorKeyNotFound")
320+
}
316321
})
317322

318-
t.Run("InvalidName", func(t *testing.T) {
319-
if _, err := sampleSigningKeysInfo.Get(""); err == nil {
320-
t.Error("expected Get() to fail for invalid key name")
323+
t.Run("EmptyName", func(t *testing.T) {
324+
_, err := sampleSigningKeysInfo.Get("")
325+
if err == nil {
326+
t.Error("expected Get() to fail for empty key name")
327+
}
328+
if !errors.Is(err, ErrKeyNameEmpty) {
329+
t.Error("expected Get() to return ErrorKeyNameEmpty")
321330
}
322331
})
323332
}
@@ -358,14 +367,22 @@ func TestUpdateDefault(t *testing.T) {
358367
})
359368

360369
t.Run("NonExistent", func(t *testing.T) {
361-
if err := sampleSigningKeysInfo.UpdateDefault("nonExistent"); err == nil {
370+
err := sampleSigningKeysInfo.UpdateDefault("nonExistent")
371+
if err == nil {
362372
t.Error("expected Get() to fail for nonExistent key name")
363373
}
374+
if !errors.Is(err, KeyNotFoundError{KeyName: "nonExistent"}) {
375+
t.Error("expected Get() to return ErrorKeyNotFound")
376+
}
364377
})
365378

366-
t.Run("InvalidName", func(t *testing.T) {
367-
if err := sampleSigningKeysInfo.UpdateDefault(""); err == nil {
368-
t.Error("expected Get() to fail for invalid key name")
379+
t.Run("EmptyName", func(t *testing.T) {
380+
err := sampleSigningKeysInfo.UpdateDefault("")
381+
if err == nil {
382+
t.Error("expected Get() to fail for empty key name")
383+
}
384+
if !errors.Is(err, ErrKeyNameEmpty) {
385+
t.Error("expected Get() to return ErrorKeyNameEmpty")
369386
}
370387
})
371388
}
@@ -382,21 +399,28 @@ func TestRemove(t *testing.T) {
382399
if _, err := testSigningKeysInfo.Get(testKeyName); err == nil {
383400
t.Error("Delete() filed to delete key")
384401
}
385-
386402
if keys[0] != testKeyName {
387403
t.Error("Delete() deleted key name mismatch")
388404
}
389405
})
390406

391407
t.Run("NonExistent", func(t *testing.T) {
392-
if _, err := testSigningKeysInfo.Remove(testKeyName); err == nil {
408+
_, err := testSigningKeysInfo.Remove("nonExistent")
409+
if err == nil {
393410
t.Error("expected Get() to fail for nonExistent key name")
394411
}
412+
if !errors.Is(err, KeyNotFoundError{KeyName: "nonExistent"}) {
413+
t.Error("expected Get() to return ErrorKeyNotFound")
414+
}
395415
})
396416

397-
t.Run("InvalidName", func(t *testing.T) {
398-
if _, err := testSigningKeysInfo.Remove(""); err == nil {
399-
t.Error("expected Get() to fail for invalid key name")
417+
t.Run("EmptyName", func(t *testing.T) {
418+
_, err := testSigningKeysInfo.Remove("")
419+
if err == nil {
420+
t.Error("expected Get() to fail for empty key name")
421+
}
422+
if !errors.Is(err, ErrKeyNameEmpty) {
423+
t.Error("expected Get() to return ErrorKeyNameEmpty")
400424
}
401425
})
402426
}

0 commit comments

Comments
 (0)