diff --git a/iamy/aws.go b/iamy/aws.go index 79ccdfb..9b8ea04 100644 --- a/iamy/aws.go +++ b/iamy/aws.go @@ -92,7 +92,7 @@ func (a *AwsFetcher) fetchS3Data() error { continue } - policyDoc, err := NewPolicyDocumentFromEncodedJson(b.policyJson) + policyDoc, err := NewPolicyDocumentFromJson(b.policyJson) if err != nil { return errors.Wrap(err, "Error creating Policy document") } diff --git a/iamy/policy.go b/iamy/policy.go index 094b73e..3883858 100644 --- a/iamy/policy.go +++ b/iamy/policy.go @@ -8,18 +8,23 @@ import ( "sort" ) -func NewPolicyDocumentFromEncodedJson(encoded string) (*PolicyDocument, error) { - jsonString, err := url.QueryUnescape(encoded) - if err != nil { +func NewPolicyDocumentFromJson(jsonString string) (*PolicyDocument, error) { + var doc PolicyDocument + if err := json.Unmarshal([]byte(jsonString), &doc); err != nil { + log.Printf("Error unmarshalling JSON %s %s", err, jsonString) return nil, err } - var doc PolicyDocument - if err = json.Unmarshal([]byte(jsonString), &doc); err != nil { + return &doc, nil +} + +func NewPolicyDocumentFromEncodedJson(encoded string) (*PolicyDocument, error) { + jsonString, err := url.QueryUnescape(encoded) + if err != nil { return nil, err } - return &doc, nil + return NewPolicyDocumentFromJson(jsonString) } // PolicyDocument represents an AWS policy document. diff --git a/iamy/policy_test.go b/iamy/policy_test.go index e12ebc7..acec793 100644 --- a/iamy/policy_test.go +++ b/iamy/policy_test.go @@ -126,3 +126,10 @@ Actual: %#v`, nt.description, nt.input, nt.expected, result) } } } + +func TestNewPolicyDocumentFromJson(t *testing.T) { + _, err := NewPolicyDocumentFromJson(`{"Version":"2012-10-17","Id":"AllowPublicRead","Statement":[{"Sid":"PublicReadBucketObjects","Effect":"Allow","Principal":"*","Action":"s3:GetObject","Resource":"arn:aws:s3:::example.com/*","Condition":{"StringEquals":{"aws:Referer":"%zz"}}}]}`) + if err != nil { + t.Errorf("Error decoding policy %s", err) + } +}