Skip to content

Commit ccf8fd7

Browse files
yaronfcursoragent
andcommitted
fix: guard nil client config and signer/verifier config misuse
Default nil ClientConfig in NewClient and return errors from sign/verify paths instead of panicking when Signer or Verifier config is unset. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 6e7ecf1 commit ccf8fd7

4 files changed

Lines changed: 41 additions & 0 deletions

File tree

client.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ type Client struct {
2121
}
2222

2323
// NewClient constructs a new client, with the flexibility of including a custom http.Client.
24+
// config may be nil for a default configuration.
2425
func NewClient(client http.Client, config *ClientConfig) *Client {
26+
if config == nil {
27+
config = NewClientConfig()
28+
}
2529
return &Client{config: *config, client: client}
2630
}
2731

client_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,9 @@ func TestClient_PostForm(t *testing.T) {
302302
})
303303
}
304304
}
305+
306+
func TestNewDefaultClientNilConfig(t *testing.T) {
307+
c := NewDefaultClient(nil)
308+
assert.NotNil(t, c)
309+
assert.NoError(t, validateClient(c))
310+
}

signatures.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,9 @@ func signRequestDebug(signatureName string, signer Signer, req *http.Request) (s
417417
if signatureName == "" {
418418
return "", "", "", fmt.Errorf("empty signature name")
419419
}
420+
if signer.config == nil {
421+
return "", "", "", fmt.Errorf("nil signer config")
422+
}
420423
withTrailers, err := signer.fields.hasTrailerFields(false)
421424
if err != nil {
422425
return "", "", "", err
@@ -443,6 +446,9 @@ func signResponseDebug(signatureName string, signer Signer, res *http.Response,
443446
if signatureName == "" {
444447
return "", "", "", fmt.Errorf("empty signature name")
445448
}
449+
if signer.config == nil {
450+
return "", "", "", fmt.Errorf("nil signer config")
451+
}
446452
resWithTrailers, err := signer.fields.hasTrailerFields(false)
447453
if err != nil {
448454
return "", "", "", err
@@ -480,6 +486,9 @@ func VerifyRequest(signatureName string, verifier Verifier, req *http.Request) e
480486
}
481487

482488
func verifyRequestDebug(signatureName string, verifier Verifier, req *http.Request) (signatureBase string, err error) {
489+
if verifier.config == nil {
490+
return "", fmt.Errorf("nil verifier config")
491+
}
483492
config := NewMessageConfig().WithRequest(req)
484493
if s := resolvedScheme(verifier.config.schemeFromRequest, req); s != "" {
485494
config = config.WithScheme(s)
@@ -514,6 +523,9 @@ func verifyDebug(signatureName string, verifier Verifier, message *Message) (str
514523
if signatureName == "" {
515524
return "", nil, fmt.Errorf("empty signature name")
516525
}
526+
if verifier.config == nil {
527+
return "", nil, fmt.Errorf("nil verifier config")
528+
}
517529

518530
withTrailers, wantSigRaw, psiSig, err := extractSignatureFields(
519531
signatureName, &verifier, message.headers, message.trailers, message.body, verifier.config.maxBodySize)
@@ -665,6 +677,9 @@ func VerifyResponse(signatureName string, verifier Verifier, res *http.Response,
665677
}
666678

667679
func verifyResponseDebug(signatureName string, verifier Verifier, res *http.Response, req *http.Request) (signatureBase string, err error) {
680+
if verifier.config == nil {
681+
return "", fmt.Errorf("nil verifier config")
682+
}
668683
config := NewMessageConfig()
669684
if s := resolvedScheme(verifier.config.schemeFromRequest, req); s != "" {
670685
config = config.WithScheme(s)

signatures_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,22 @@ func TestGetRawHeaderEmptyValues(t *testing.T) {
923923
}
924924
}
925925

926+
func TestSignRequestNilSignerConfig(t *testing.T) {
927+
_, _, err := SignRequest("sig1", Signer{fields: *NewFields()}, readRequest(httpreq1))
928+
if err == nil {
929+
t.Fatal("expected error")
930+
}
931+
assert.Contains(t, err.Error(), "nil signer config")
932+
}
933+
934+
func TestVerifyRequestNilVerifierConfig(t *testing.T) {
935+
err := VerifyRequest("sig1", Verifier{fields: *NewFields()}, readRequest(httpreq1))
936+
if err == nil {
937+
t.Fatal("expected error")
938+
}
939+
assert.Contains(t, err.Error(), "nil verifier config")
940+
}
941+
926942
// Same as TestCreated but using Message
927943
func TestMessageCreated(t *testing.T) {
928944
testOnceWithConfig := func(t *testing.T, createdTime int64, verifyConfig *VerifyConfig, wantSuccess bool) {

0 commit comments

Comments
 (0)