Skip to content

Commit cc77110

Browse files
committed
avoid to swallow errors
Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent 77379d2 commit cc77110

File tree

5 files changed

+110
-22
lines changed

5 files changed

+110
-22
lines changed

token/services/identity/membership/lm.go

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -430,18 +430,35 @@ func (l *LocalMembership) registerLocalIdentity(ctx context.Context, identityCon
430430
l.logger.DebugfContext(ctx, "try to load identity with [%d] key managers [%v]", len(l.KeyManagerProviders), l.KeyManagerProviders)
431431
for i, p := range l.KeyManagerProviders {
432432
var err error
433-
keyManager, err = p.Get(ctx, identityConfig)
434-
if err == nil && keyManager != nil && len(keyManager.EnrollmentID()) != 0 {
435-
priority = i
436-
break
433+
var km KeyManager
434+
km, err = p.Get(ctx, identityConfig)
435+
if err != nil {
436+
errs = append(errs, err)
437+
continue
438+
}
439+
440+
if len(km.EnrollmentID()) == 0 {
441+
errs = append(errs, errors.Errorf("no enrollment id found for identity [%s]", identityConfig.ID))
442+
continue
437443
}
438-
keyManager = nil
439-
errs = append(errs, err)
444+
445+
// only assign keyManager if the provider returned a valid enrollment id
446+
keyManager = km
447+
priority = i
448+
break
440449
}
441450
if keyManager == nil {
442-
return errors.Wrapf(
443-
errors.Join(errs...),
444-
"failed to get a key manager for the passed identity config for [%s:%s]",
451+
logger.Errorf("no key manager found for identity [%s], err [%+v]", identityConfig.ID, errs)
452+
err := errors.Join(errs...)
453+
if err != nil {
454+
return errors.Wrapf(err,
455+
"failed to get a key manager for the passed identity config for [%s:%s]",
456+
identityConfig.ID,
457+
identityConfig.URL,
458+
)
459+
}
460+
return errors.Errorf(
461+
"no key manager found for [%s:%s]",
445462
identityConfig.ID,
446463
identityConfig.URL,
447464
)
@@ -467,21 +484,29 @@ func (l *LocalMembership) registerLocalIdentity(ctx context.Context, identityCon
467484
func (l *LocalMembership) registerIdentityConfiguration(ctx context.Context, identity *IdentityConfiguration, defaultIdentity bool) error {
468485
// Try to register the local identity
469486
identity.URL = l.config.TranslatePath(identity.URL)
470-
if err := l.registerLocalIdentity(ctx, identity, defaultIdentity); err != nil {
471-
l.logger.Warnf("failed to load local identity at [%s]:[%s]", identity.URL, err)
487+
err1 := l.registerLocalIdentity(ctx, identity, defaultIdentity)
488+
if err1 == nil {
489+
// nothing else needs to be done
490+
return nil
491+
}
492+
493+
// second chance, load the path as folder
494+
{
495+
l.logger.Warnf("failed to load local identity at [%s]:[%s]", identity.URL, err1)
472496
// Does path correspond to a folder containing multiple identities?
473-
if err := l.registerLocalIdentities(ctx, identity); err != nil {
474-
return errors.WithMessagef(err, "failed to register local identity")
497+
err2 := l.registerLocalIdentities(ctx, identity)
498+
if err2 != nil {
499+
return errors.Wrap(errors.Join(err1, err2), "failed to register local identity")
475500
}
476501
}
502+
477503
return nil
478504
}
479505

480506
func (l *LocalMembership) registerLocalIdentities(ctx context.Context, configuration *IdentityConfiguration) error {
481507
entries, err := os.ReadDir(configuration.URL)
482508
if err != nil {
483-
l.logger.Warnf("failed reading from [%s]: [%s]", configuration.URL, err)
484-
return nil
509+
return errors.Wrapf(err, "no valid identities found in [%s]", configuration.URL)
485510
}
486511
found := 0
487512
var errs []error
@@ -502,7 +527,7 @@ func (l *LocalMembership) registerLocalIdentities(ctx context.Context, configura
502527
found++
503528
}
504529
if found == 0 {
505-
return errors.Errorf("no valid identities found in [%s], errs [%v]", configuration.URL, errs)
530+
return errors.Wrapf(errors.Join(errs...), "no valid identities found in [%s]", configuration.URL)
506531
}
507532
return nil
508533
}

token/services/identity/membership/lm_test.go

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,65 @@ func TestRegisterIdentity_KeyManagerProviderFails(t *testing.T) {
251251
kmp,
252252
)
253253

254-
// RegisterIdentity swallows register errors and tries to read the path; it returns nil
254+
// Now RegisterIdentity returns an error when no key manager provider succeeds
255255
err := lm.RegisterIdentity(ctx, membership.IdentityConfiguration{ID: "X", URL: "/tmp/x"})
256-
assert.NoError(t, err)
256+
assert.Error(t, err)
257257
// nothing persisted
258258
assert.Equal(t, 0, iss.AddConfigurationCallCount())
259259
}
260260

261+
func TestRegisterIdentity_EmptyEnrollmentID(t *testing.T) {
262+
ctx := t.Context()
263+
264+
ip := &mock.IdentityProvider{}
265+
// no binds expected
266+
267+
des := &mock.SignerDeserializerManager{}
268+
269+
iss := &mock.IdentityStoreService{}
270+
iss.ConfigurationExistsReturns(false, nil)
271+
iss.AddConfigurationReturns(nil)
272+
273+
km := &mock.KeyManager{}
274+
km.EnrollmentIDReturns("")
275+
km.AnonymousReturns(false)
276+
km.IsRemoteReturns(false)
277+
km.IdentityTypeReturns("typ")
278+
279+
kmp := &mock.KeyManagerProvider{}
280+
kmp.GetReturns(km, nil)
281+
282+
lm := membership.NewLocalMembership(
283+
logging.MustGetLogger("test"),
284+
&mock.Config{},
285+
[]byte("netid"),
286+
des,
287+
iss,
288+
"testType",
289+
false,
290+
ip,
291+
kmp,
292+
)
293+
294+
// Use a non-existent path so registerLocalIdentities will attempt to read it and return nil
295+
nonExistent := filepath.Join(t.TempDir(), "does_not_exist")
296+
// Now RegisterIdentity returns an error when the selected KeyManager has an empty EnrollmentID
297+
err := lm.RegisterIdentity(ctx, membership.IdentityConfiguration{ID: "z", URL: nonExistent})
298+
assert.Error(t, err)
299+
300+
// Because enrollment ID was empty, no configuration should be persisted
301+
assert.Equal(t, 0, iss.AddConfigurationCallCount())
302+
303+
// Deserializer manager should not be called because no valid key manager was found
304+
assert.Equal(t, 0, des.AddTypedSignerDeserializerCallCount())
305+
306+
// Identity provider should not be bound
307+
assert.Equal(t, 0, ip.BindCallCount())
308+
309+
// KeyManagerProvider should have been called at least once
310+
assert.GreaterOrEqual(t, kmp.GetCallCount(), 1)
311+
}
312+
261313
func TestRegisterIdentity_BindFails(t *testing.T) {
262314
ctx := t.Context()
263315

@@ -292,9 +344,9 @@ func TestRegisterIdentity_BindFails(t *testing.T) {
292344
kmp,
293345
)
294346

295-
// RegisterIdentity swallows register errors (logs them) and returns nil
347+
// Now RegisterIdentity returns an error when the bind fails during addLocalIdentity
296348
err := lm.RegisterIdentity(ctx, membership.IdentityConfiguration{ID: "Y", URL: "/tmp/y"})
297-
assert.NoError(t, err)
349+
assert.Error(t, err)
298350
// bind failed so nothing persisted
299351
assert.Equal(t, 0, iss.AddConfigurationCallCount())
300352
}

token/services/identity/x509/crypto/configbuilder.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ const (
2525
func LoadConfig(dir string, keyStoreDirName string) (*Config, error) {
2626
signcertDir := filepath.Join(dir, SignCertsDirName)
2727
signcert, err := getPemMaterialFromDir(signcertDir)
28-
if err != nil || len(signcert) == 0 {
28+
if err != nil {
2929
return nil, errors.Wrapf(err, "could not load a valid signer certificate from directory %s", signcertDir)
3030
}
31+
if len(signcert) == 0 {
32+
return nil, errors.Errorf("no signer certificate found in directory %s", signcertDir)
33+
}
3134
// load secret key, if available. If not available, the public's key SKI will be used to load the secret key from the key store
3235
if len(keyStoreDirName) == 0 {
3336
keyStoreDirName = KeyStoreDirName

token/services/identity/x509/km.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,23 +67,27 @@ func NewKeyManagerFromConf(
6767
var err error
6868
conf, err = crypto.LoadConfig(configPath, keyStoreDirName)
6969
if err != nil {
70+
logger.Errorf("failed loading x509 configuration [%+v]", err)
7071
return nil, nil, errors.WithMessagef(err, "could not get config from dir [%s]", configPath)
7172
}
7273
}
74+
logger.Debugf("load x509 config, check version...")
7375
// enforce version
7476
if conf.Version != crypto.ProtobufProtocolVersionV1 {
7577
return nil, nil, errors.Errorf("unsupported protocol version: %d", conf.Version)
7678
}
79+
logger.Debugf("load x509 config, new signing key manager...")
7780
p, err := newSigningKeyManager(conf, bccspConfig, keyStore)
7881
if err == nil {
82+
logger.Debugf("load x509 config, new signing key manager...done [%v]", p)
7983
return p, conf, nil
8084
}
8185
// load as verify only
8286
p, conf, err = newVerifyingKeyManager(conf, bccspConfig)
8387
if err != nil {
8488
return nil, nil, err
8589
}
86-
return p, conf, err
90+
return p, conf, nil
8791
}
8892

8993
func newSigningKeyManager(conf *crypto.Config, bccspConfig *crypto.BCCSP, keyStore crypto.KeyStore) (*KeyManager, error) {

token/services/identity/x509/kmp.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ func (k *KeyManagerProvider) registerProvider(ctx context.Context, conf *crypto.
102102
}
103103
}
104104

105+
logger.DebugfContext(ctx, "prepare opts and conf for [%s][%s]", translatedPath, keyStorePath)
106+
105107
optsRaw, err := yaml.Marshal(identityConfig.Opts)
106108
if err != nil {
107109
return nil, errors.Wrapf(err, "failed to marshal config [%v]", identityConfig)
@@ -113,6 +115,8 @@ func (k *KeyManagerProvider) registerProvider(ctx context.Context, conf *crypto.
113115
idConfig.Config = optsRaw
114116
idConfig.Raw = confRaw
115117

118+
logger.DebugfContext(ctx, "provider ready for [%s][%s][%s]", translatedPath, keyStorePath, provider)
119+
116120
return provider, nil
117121
}
118122

0 commit comments

Comments
 (0)