Skip to content

Commit f5c57ae

Browse files
authored
Do not Escape HTML when encoding the policy (#1374)
1 parent bf1672a commit f5c57ae

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

feature/cloudfront/sign/policy.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,13 @@ func NewCannedPolicy(resource string, expires time.Time) *Policy {
182182

183183
// encodePolicy encodes the Policy as JSON and also base 64 encodes it.
184184
func encodePolicy(p *Policy) (b64Policy, jsonPolicy []byte, err error) {
185-
jsonPolicy, err = json.Marshal(p)
186-
if err != nil {
185+
buffer := &bytes.Buffer{}
186+
encoder := json.NewEncoder(buffer)
187+
encoder.SetEscapeHTML(false)
188+
if err := encoder.Encode(p); err != nil {
187189
return nil, nil, fmt.Errorf("failed to encode policy, %s", err.Error())
188190
}
189-
191+
jsonPolicy = buffer.Bytes()
190192
// Remove leading and trailing white space, JSON encoding will note include
191193
// whitespace within the encoding.
192194
jsonPolicy = bytes.TrimSpace(jsonPolicy)

feature/cloudfront/sign/policy_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ var testCreateResource = []struct {
4949
expect string
5050
errPrefix string
5151
}{
52+
{
53+
"https", "https://example.com/a?b=1&c=2",
54+
"https://example.com/a?b=1&c=2", "",
55+
},
5256
{
5357
"https", "https://example.com/a?b=1",
5458
"https://example.com/a?b=1", "",
@@ -61,6 +65,10 @@ var testCreateResource = []struct {
6165
"rtmp", "https://example.com/a?b=1",
6266
"a?b=1", "",
6367
},
68+
{
69+
"rtmp", "https://example.com/a?b=1&c=2",
70+
"a?b=1&c=2", "",
71+
},
6472
{
6573
"ftp", "ftp://example.com/a?b=1",
6674
"", "invalid URL scheme",
@@ -112,6 +120,27 @@ func TestEncodePolicy(t *testing.T) {
112120
}
113121
}
114122

123+
func TestEncodePolicyWithQueryParams(t *testing.T) {
124+
const (
125+
expectedJSONPolicy = `{"Statement":[{"Resource":"https://example.com/a?b=1&c=2","Condition":{"DateLessThan":{"AWS:EpochTime":1257894000}}}]}`
126+
expectedB64Policy = `eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9hP2I9MSZjPTIiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyNTc4OTQwMDB9fX1dfQ==`
127+
)
128+
p := NewCannedPolicy("https://example.com/a?b=1&c=2", testTime)
129+
130+
b64Policy, jsonPolicy, err := encodePolicy(p)
131+
if err != nil {
132+
t.Fatalf("Unexpected error, %#v", err)
133+
}
134+
135+
if string(jsonPolicy) != expectedJSONPolicy {
136+
t.Errorf("Expected json encoding to match, \nexpect: %s\nactual: %s\n", expectedJSONPolicy, jsonPolicy)
137+
}
138+
139+
if string(b64Policy) != expectedB64Policy {
140+
t.Errorf("Expected b64 encoding to match, \nexpect: %s\nactual: %s\n", expectedB64Policy, b64Policy)
141+
}
142+
}
143+
115144
func TestSignEncodedPolicy(t *testing.T) {
116145
p := NewCannedPolicy("https://example.com/a", testTime)
117146
_, jsonPolicy, err := encodePolicy(p)

feature/cloudfront/sign/sign_url_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ var testSignURL = []struct {
2222
"http://example.com/a", NewCannedPolicy("http://example.com/a", testSignTime), time.Time{}, true, false,
2323
"http://example.com/a?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2V4YW1wbGUuY29tL2EiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyNTc4OTQwMDB9fX1dfQ__&Signature=cMutWOvPMOPuh0KFDsOdbML~1fe0eEBC1hdMLGRbYr3mTRrVbKDdUXL6l3vlbE0Og3rTRS6mlaSORTwesN1srESH1pXFUyCVba8tWqNy1frEiL7jZLyzA1KndH0olfJDfgHXdw-Edtk0m8mqY~AnGIYGYDu659dWeP49jVeYn30XF9sYkRCdS5IezAkqh8TO9tTDNGS4Ic6DQue4agHUFLNv1VErTafUxlSBp8hlPCuMdtZLEBLr9UJVc3oWJI3zc1~9JgVTDjbXYV1-HgTn8qQsbAU2KcieUonIzTme2td-7c2FCC0EAbOF~6QXTHWcAiSB5nVmbxn-Mx-QMVsiLw__&Key-Pair-Id=KeyID",
2424
},
25+
{
26+
"https://example.com/a?b=1&c=2", NewCannedPolicy("https://example.com/a?b=1&c=2", testSignTime), time.Time{}, true, false,
27+
"https://example.com/a?b=1&c=2&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9hP2I9MSZjPTIiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyNTc4OTQwMDB9fX1dfQ__&Signature=E6xB7RtIDvx8AxM1Wuup3ROYTQwBDW-qqcrb8lSUvtL78wenjh3P0YLXK-mFK0PSzdNtzI2ZIXja6Nh2yma0IVQiZMjn3wijvVsMy9fRXyusVXB1zYSfiInVr2uhqSb-ZCn1RD32ebyMD6IWn5Kss1fT4wefc8Q76J0Y4jprAvmLCtGnrW~quZdOg~KKmY-qK11ifNwv2ECADBxZeEx1PIDHdWuXYrCBJIwSl-bVscwQWDm2BzeYuHCaLuAVDuc62JJzc7nX3E1CA1VRHY~vegYjOV6zVxtp7aBV4RJUY4yfHNM4n640FXUPPwMacqE-lnNOfx704YVTl4tjzuvzuA__&Key-Pair-Id=KeyID",
28+
},
2529
{
2630
"http://example.com/a", nil, testSignTime, false, false,
2731
"http://example.com/a?Expires=1257894000&Signature=cMutWOvPMOPuh0KFDsOdbML~1fe0eEBC1hdMLGRbYr3mTRrVbKDdUXL6l3vlbE0Og3rTRS6mlaSORTwesN1srESH1pXFUyCVba8tWqNy1frEiL7jZLyzA1KndH0olfJDfgHXdw-Edtk0m8mqY~AnGIYGYDu659dWeP49jVeYn30XF9sYkRCdS5IezAkqh8TO9tTDNGS4Ic6DQue4agHUFLNv1VErTafUxlSBp8hlPCuMdtZLEBLr9UJVc3oWJI3zc1~9JgVTDjbXYV1-HgTn8qQsbAU2KcieUonIzTme2td-7c2FCC0EAbOF~6QXTHWcAiSB5nVmbxn-Mx-QMVsiLw__&Key-Pair-Id=KeyID",
@@ -97,6 +101,10 @@ var testBuildSignedURL = []struct {
97101
"https://example.com/a", "KeyID", NewCannedPolicy("", testSignTime), true, []byte("b64Policy"), []byte("b64Sig"),
98102
"https://example.com/a?Policy=b64Policy&Signature=b64Sig&Key-Pair-Id=KeyID",
99103
},
104+
{
105+
"https://example.com/a?b=1&c=2", "KeyID", NewCannedPolicy("", testSignTime), true, []byte("b64Policy"), []byte("b64Sig"),
106+
"https://example.com/a?b=1&c=2&Policy=b64Policy&Signature=b64Sig&Key-Pair-Id=KeyID",
107+
},
100108
{
101109
"https://example.com/a?b=1", "KeyID", NewCannedPolicy("https://example.com/a?b=1", testSignTime), false, []byte("b64Policy"), []byte("b64Sig"),
102110
"https://example.com/a?b=1&Expires=1257894000&Signature=b64Sig&Key-Pair-Id=KeyID",

0 commit comments

Comments
 (0)