Skip to content

Commit aee5be7

Browse files
yaronfcursoragent
andcommitted
fix: look up Date header with normalized lowercase key
parsedMessage stores header names lowercased; SetVerifyDateWithin never ran because applyPolicyCreated used "Date". Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent c057eef commit aee5be7

2 files changed

Lines changed: 54 additions & 1 deletion

File tree

signatures.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,7 @@ func applyPolicyCreated(psi *psiSignature, message parsedMessage, config VerifyC
913913
}
914914

915915
if config.dateWithin != 0 {
916-
dateHdr, ok := message.headers["Date"]
916+
dateHdr, ok := message.headers["date"]
917917
if ok {
918918
if len(dateHdr) > 1 {
919919
return fmt.Errorf("multiple Date headers")

signatures_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,59 @@ func TestCreated(t *testing.T) {
862862
t.Run("verify logic requires to verify Created", testDateFail)
863863
}
864864

865+
func TestVerifyDateWithin(t *testing.T) {
866+
now := time.Now().Unix()
867+
fields := Headers("@status", "date", "content-type")
868+
signatureName := "sigres"
869+
key, err := base64.StdEncoding.DecodeString("uzvJfB4u3N0Jy4T7NZ75MDVcr8zSTInedJtkgcu46YW4XByzNJjxBdtjUkdJPBtbmHhIDi6pcl8jsasjlTMtDQ==")
870+
if err != nil {
871+
t.Fatal(err)
872+
}
873+
signConfig := NewSignConfig().SignCreated(true).setFakeCreated(now).SetKeyID("test-shared-secret")
874+
signer, err := NewHMACSHA256Signer(key, signConfig, fields)
875+
if err != nil {
876+
t.Fatal(err)
877+
}
878+
res := readResponse(httpres2)
879+
alignedDate := time.Unix(now, 0).UTC().Format(http.TimeFormat)
880+
res.Header.Set("Date", alignedDate)
881+
sigInput, sig, err := SignResponse(signatureName, *signer, res, nil)
882+
if err != nil {
883+
t.Fatal(err)
884+
}
885+
verifyConfig := NewVerifyConfig().SetVerifyDateWithin(time.Minute)
886+
887+
t.Run("aligned Date passes", func(t *testing.T) {
888+
res2 := readResponse(httpres2)
889+
res2.Header.Set("Date", alignedDate)
890+
res2.Header.Add("Signature", sig)
891+
res2.Header.Add("Signature-Input", sigInput)
892+
verifier, err := NewHMACSHA256Verifier(key, verifyConfig, fields)
893+
if err != nil {
894+
t.Fatal(err)
895+
}
896+
if err := VerifyResponse(signatureName, *verifier, res2, nil); err != nil {
897+
t.Errorf("verification error: %s", err)
898+
}
899+
})
900+
901+
t.Run("misaligned Date fails", func(t *testing.T) {
902+
res2 := readResponse(httpres2)
903+
res2.Header.Set("Date", time.Unix(now-3600, 0).UTC().Format(http.TimeFormat))
904+
res2.Header.Add("Signature", sig)
905+
res2.Header.Add("Signature-Input", sigInput)
906+
verifier, err := NewHMACSHA256Verifier(key, verifyConfig, fields)
907+
if err != nil {
908+
t.Fatal(err)
909+
}
910+
err = VerifyResponse(signatureName, *verifier, res2, nil)
911+
if err == nil {
912+
t.Fatal("expected verification to fail")
913+
}
914+
assert.Contains(t, err.Error(), "Date header")
915+
})
916+
}
917+
865918
// Same as TestCreated but using Message
866919
func TestMessageCreated(t *testing.T) {
867920
testOnceWithConfig := func(t *testing.T, createdTime int64, verifyConfig *VerifyConfig, wantSuccess bool) {

0 commit comments

Comments
 (0)