Skip to content

Commit d93c150

Browse files
committed
refactor: remote claim builder: simplify NewClaimBuilders
- collapse `range o.Metadata` and `range o.Claims` for loops into the func `getStaticValues` since they're duplicates in terms of logic - moved the `IsStatic()` error check out of `getStaticValues` to `func (v Value) RawMessage() (json.RawMessage, error)` since that's a better home for that particular check, reducing the cognitive load
1 parent a101fb8 commit d93c150

File tree

2 files changed

+34
-46
lines changed

2 files changed

+34
-46
lines changed

token/claimBuilder.go

Lines changed: 32 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -289,28 +289,11 @@ func (cb *clientCertificateClaimBuilder) AddClaims(_ context.Context, r *Request
289289
// The returned builders do not include those claims derived from HTTP requests. Claims derived from HTTP
290290
// requests are handled by NewRequestBuilders and DecodeServerRequest.
291291
func NewClaimBuilders(n random.Noncer, client xhttpclient.Interface, o Options) (ClaimBuilders, error) {
292-
var (
293-
builders = ClaimBuilders{requestClaimBuilder{}}
294-
staticClaimBuilder = make(staticClaimBuilder)
295-
)
296-
297-
if o.Remote != nil { // scan the metadata looking for static values that should be applied when invoking the remote server
298-
metadata := make(map[string]interface{})
299-
for _, value := range o.Metadata {
300-
switch {
301-
case len(value.Key) == 0:
302-
return nil, ErrMissingKey
303-
case value.IsFromHTTP():
304-
continue
305-
case !value.IsStatic():
306-
return nil, fmt.Errorf("a value is required for the static metadata: %s", value.Key)
307-
default:
308-
msg, err := value.RawMessage()
309-
if err != nil {
310-
return nil, err
311-
}
312-
metadata[value.Key] = msg
313-
}
292+
builders := ClaimBuilders{requestClaimBuilder{}}
293+
if o.Remote != nil {
294+
metadata, err := getStaticValues(o.Metadata)
295+
if err != nil {
296+
return nil, fmt.Errorf("remote claim builder configuration failure: metadata error: %w", err)
314297
}
315298

316299
remoteClaimBuilder, err := newRemoteClaimBuilder(client, metadata, o.Remote)
@@ -321,31 +304,12 @@ func NewClaimBuilders(n random.Noncer, client xhttpclient.Interface, o Options)
321304
builders = append(builders, remoteClaimBuilder)
322305
}
323306

324-
for _, value := range o.Claims {
325-
switch {
326-
case len(value.Key) == 0:
327-
return nil, ErrMissingKey
328-
329-
case value.IsFromHTTP():
330-
continue
331-
332-
case !value.IsStatic():
333-
return nil, fmt.Errorf("a value is required for the static claim: %s", value.Key)
334-
335-
default:
336-
msg, err := value.RawMessage()
337-
if err != nil {
338-
return nil, err
339-
}
340-
341-
staticClaimBuilder[value.Key] = msg
342-
}
343-
}
344-
345-
if len(staticClaimBuilder) > 0 {
346-
builders = append(builders, staticClaimBuilder)
307+
staticClaims, err := getStaticValues(o.Claims)
308+
if err != nil {
309+
return nil, fmt.Errorf("static claim builder configuration failure: %w", err)
347310
}
348311

312+
builders = append(builders, staticClaimBuilder(staticClaims))
349313
if o.Nonce && n != nil {
350314
builders = append(builders, nonceClaimBuilder{n: n})
351315
}
@@ -371,3 +335,26 @@ func NewClaimBuilders(n random.Noncer, client xhttpclient.Interface, o Options)
371335

372336
return builders, err
373337
}
338+
339+
func getStaticValues(vals []Value) (map[string]any, error) {
340+
var errs []error
341+
342+
m := make(map[string]any)
343+
for _, value := range vals {
344+
if len(value.Key) == 0 {
345+
errs = append(errs, fmt.Errorf("valid static field `%s`: %w", value.Key, ErrVariableNotAllowed))
346+
347+
continue
348+
}
349+
350+
if value.IsFromHTTP() {
351+
continue
352+
}
353+
354+
msg, err := value.RawMessage()
355+
errs = append(errs, err)
356+
m[value.Key] = msg
357+
}
358+
359+
return m, errors.Join(errs...)
360+
}

token/options.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package token
44

55
import (
66
"encoding/json"
7+
"fmt"
78
"time"
89

910
"github.com/xmidt-org/themis/key"
@@ -77,7 +78,7 @@ func (v Value) RawMessage() (json.RawMessage, error) {
7778
return json.RawMessage(raw), err
7879

7980
default:
80-
return json.RawMessage(nil), nil
81+
return json.RawMessage(nil), fmt.Errorf("a value is required for the static field: %s", v.Key)
8182
}
8283
}
8384

0 commit comments

Comments
 (0)