Skip to content

Commit 8a56a96

Browse files
fix(core): Don't require known manager names (#2792)
### Proposed Changes * The policy service's list of known managers is not exhaustive; that is up to each KAS * Adds more logging to help identify misspelled or forgotten mgrs ### Checklist - [ ] I have added or updated unit tests - [ ] I have added or updated integration tests (if appropriate) - [ ] I have added or updated documentation ### Testing Instructions
1 parent 6784e88 commit 8a56a96

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

service/kas/kas.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ func NewRegistration() *serviceregistry.Service[kasconnect.AccessServiceHandler]
6161
}
6262
}
6363

64+
var kmgrNames []string
65+
6466
if kasCfg.Preview.KeyManagement {
6567
srp.Logger.Info("preview feature: key management is enabled")
6668

@@ -75,17 +77,18 @@ func NewRegistration() *serviceregistry.Service[kasconnect.AccessServiceHandler]
7577
p.KeyDelegator = trust.NewDelegatingKeyService(NewPlatformKeyIndexer(srp.SDK, kasURL.String(), srp.Logger), srp.Logger, cacheClient)
7678
for _, manager := range srp.KeyManagerFactories {
7779
p.KeyDelegator.RegisterKeyManager(manager.Name, manager.Factory)
80+
kmgrNames = append(kmgrNames, manager.Name)
7881
}
7982

8083
// Register Basic Key Manager
81-
8284
p.KeyDelegator.RegisterKeyManager(security.BasicManagerName, func(opts *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
8385
bm, err := security.NewBasicManager(opts.Logger, opts.Cache, kasCfg.RootKey)
8486
if err != nil {
8587
return nil, err
8688
}
8789
return bm, nil
8890
})
91+
kmgrNames = append(kmgrNames, security.BasicManagerName)
8992
// Explicitly set the default manager for session key generation.
9093
// This should be configurable, e.g., defaulting to BasicManager or an HSM if available.
9194
p.KeyDelegator.SetDefaultMode(security.BasicManagerName) // Example: default to BasicManager
@@ -102,7 +105,9 @@ func NewRegistration() *serviceregistry.Service[kasconnect.AccessServiceHandler]
102105
})
103106
// Set default for non-key-management mode
104107
p.KeyDelegator.SetDefaultMode(inProcessService.Name())
108+
kmgrNames = append(kmgrNames, inProcessService.Name())
105109
}
110+
srp.Logger.Info("kas registered trust.KeyManagers", slog.Any("key_managers", kmgrNames))
106111

107112
p.SDK = srp.SDK
108113
p.Logger = srp.Logger

service/policy/keymanagement/key_management.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ func (ksvc Service) CreateProviderConfig(ctx context.Context, req *connect.Reque
112112
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("manager field is required"))
113113
}
114114
if !ksvc.isManagerRegistered(manager) {
115-
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("manager type '%s' is not registered", manager))
115+
ksvc.logger.WarnContext(ctx, "create provider: manager type is not registered",
116+
slog.String("manager", manager),
117+
slog.Any("registered_managers", ksvc.listManagerNames()))
116118
}
117119

118120
auditParams := audit.PolicyEventParams{
@@ -186,10 +188,8 @@ func (ksvc Service) UpdateProviderConfig(ctx context.Context, req *connect.Reque
186188

187189
// Validate manager type if provided
188190
manager := req.Msg.GetManager()
189-
if manager != "" {
190-
if !ksvc.isManagerRegistered(manager) {
191-
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("manager type '%s' is not registered", manager))
192-
}
191+
if manager != "" && !ksvc.isManagerRegistered(manager) {
192+
ksvc.logger.WarnContext(ctx, "update provider: manager type is not registered", slog.String("manager", manager))
193193
}
194194

195195
auditParams := audit.PolicyEventParams{
@@ -278,3 +278,11 @@ func (ksvc *Service) isManagerRegistered(managerName string) bool {
278278
}
279279
return false
280280
}
281+
282+
func (ksvc Service) listManagerNames() []string {
283+
names := make([]string, 0, len(ksvc.keyManagerFactories))
284+
for _, factory := range ksvc.keyManagerFactories {
285+
names = append(names, factory.Name)
286+
}
287+
return names
288+
}

service/trust/delegating_key_service.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"errors"
77
"fmt"
88
"log/slog"
9+
"maps"
10+
"slices"
911
"sync"
1012

1113
"github.com/opentdf/platform/lib/ocrypto"
@@ -198,6 +200,7 @@ func (d *DelegatingKeyService) getKeyManager(ctx context.Context, name string) (
198200
factory, factoryExists := d.managerFactories[name]
199201
// Read defaultMode under lock for comparison.
200202
currentDefaultMode := d.defaultMode
203+
allNames := slices.Collect(maps.Keys(d.managerFactories))
201204
d.mutex.Unlock()
202205

203206
if factoryExists {
@@ -221,6 +224,7 @@ func (d *DelegatingKeyService) getKeyManager(ctx context.Context, name string) (
221224
// If 'name' was the defaultMode, _defKM will error if its factory is also missing.
222225
// If 'name' was not the defaultMode, we fall back to the default manager.
223226
d.l.Debug("key manager factory not found for name, attempting to use/load default",
227+
slog.Any("key_managers", allNames),
224228
slog.String("requested_name", name),
225229
slog.String("configured_default_mode", currentDefaultMode),
226230
)

0 commit comments

Comments
 (0)