Skip to content

Commit

Permalink
fix UnmarshalJSON issue where map (of signing keys) was nil (#160)
Browse files Browse the repository at this point in the history
Signed-off-by: Matthias Hanel <mh@synadia.com>
  • Loading branch information
matthiashanel authored Oct 28, 2021
1 parent 7ddd6b0 commit c51646f
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 5 deletions.
16 changes: 11 additions & 5 deletions v2/signingkeys.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,12 @@ func (sk SigningKeys) Validate(vr *ValidationResults) {
}

// MarshalJSON serializes the scoped signing keys as an array
func (sk SigningKeys) MarshalJSON() ([]byte, error) {
func (sk *SigningKeys) MarshalJSON() ([]byte, error) {
if sk == nil {
return nil, nil
}
var a []interface{}
for k, v := range sk {
for k, v := range *sk {
if v != nil {
a = append(a, v)
} else {
Expand All @@ -132,7 +135,10 @@ func (sk SigningKeys) MarshalJSON() ([]byte, error) {
return json.Marshal(a)
}

func (sk SigningKeys) UnmarshalJSON(data []byte) error {
func (sk *SigningKeys) UnmarshalJSON(data []byte) error {
if *sk == nil {
*sk = make(SigningKeys)
}
// read an array - we can have a string or an map
var a []interface{}
if err := json.Unmarshal(data, &a); err != nil {
Expand All @@ -141,7 +147,7 @@ func (sk SigningKeys) UnmarshalJSON(data []byte) error {
for _, i := range a {
switch v := i.(type) {
case string:
sk[v] = nil
(*sk)[v] = nil
case map[string]interface{}:
d, err := json.Marshal(v)
if err != nil {
Expand All @@ -153,7 +159,7 @@ func (sk SigningKeys) UnmarshalJSON(data []byte) error {
if err := json.Unmarshal(d, &us); err != nil {
return err
}
sk[us.Key] = us
(*sk)[us.Key] = us
default:
return fmt.Errorf("unknown signing key scope %q", v["type"])
}
Expand Down
31 changes: 31 additions & 0 deletions v2/signingkeys_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package jwt

import (
"encoding/json"
"strings"
"testing"

Expand Down Expand Up @@ -249,3 +250,33 @@ func TestGetKeys(t *testing.T) {
}
}
}

func TestJson(t *testing.T) {
ac, apk := makeAccount(t, nil, nil)
ac.SigningKeys.Add(publicKey(createAccountNKey(t), t))
ac.SigningKeys.Add(publicKey(createAccountNKey(t), t))
ac.SigningKeys.Add(publicKey(createAccountNKey(t), t))

token, err := ac.Encode(apk)
if err != nil {
t.Fatal(err)
}
aac, err := DecodeAccountClaims(token)
if err != nil {
t.Fatal(err)
}

j, err := json.Marshal(aac)
if err != nil {
t.Fatal(err)
}
var myAcc AccountClaims
err = json.Unmarshal(j, &myAcc)
if err != nil {
t.Fatal(err)
}
if len(myAcc.SigningKeys) != 3 {
t.Fatalf("Expected 3 signing keys got: %d",len(myAcc.SigningKeys))
}

}

0 comments on commit c51646f

Please sign in to comment.