Skip to content

Commit 09448e0

Browse files
committed
escape special characters in building a PostPolicy JSON string
1 parent bce8d0c commit 09448e0

File tree

2 files changed

+329
-27
lines changed

2 files changed

+329
-27
lines changed

src/main/java/com/aliyun/oss/model/PolicyConditions.java

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package com.aliyun.oss.model;
2121

2222
import com.aliyun.oss.common.utils.StringUtils;
23+
2324
import java.util.ArrayList;
2425
import java.util.HashMap;
2526
import java.util.List;
@@ -77,24 +78,24 @@ public String jsonize() {
7778
String jsonizedCond = null;
7879
switch (tupleType) {
7980
case Two:
80-
jsonizedCond = String.format("{\"%s\":\"%s\"},", name, value);
81+
jsonizedCond = String.format("{\"%s\":\"%s\"},", jsonEscape(name), jsonEscape(value));
8182
break;
8283
case Three:
8384
switch (matchMode) {
8485
case Exact:
85-
jsonizedCond = String.format("[\"eq\",\"$%s\",\"%s\"],", name, value);
86+
jsonizedCond = String.format("[\"eq\",\"$%s\",\"%s\"],", jsonEscape(name), jsonEscape(value));
8687
break;
8788
case StartWith:
88-
jsonizedCond = String.format("[\"starts-with\",\"$%s\",\"%s\"],", name, value);
89+
jsonizedCond = String.format("[\"starts-with\",\"$%s\",\"%s\"],", jsonEscape(name), jsonEscape(value));
8990
break;
9091
case Range:
9192
jsonizedCond = String.format("[\"content-length-range\",%d,%d],", minimum, maximum);
9293
break;
9394
case In:
94-
jsonizedCond = String.format("[\"in\",\"$%s\",[\"%s\"]],", name, StringUtils.join("\",\"",contain));
95+
jsonizedCond = String.format("[\"in\",\"$%s\",[\"%s\"]],", jsonEscape(name), StringUtils.join("\",\"",jsonEscape(contain)));
9596
break;
9697
case NotIn:
97-
jsonizedCond = String.format("[\"not-in\",\"$%s\",[\"%s\"]],", name, StringUtils.join("\",\"",contain));
98+
jsonizedCond = String.format("[\"not-in\",\"$%s\",[\"%s\"]],", jsonEscape(name), StringUtils.join("\",\"",jsonEscape(contain)));
9899
break;
99100
default:
100101
throw new IllegalArgumentException(String.format("Unsupported match mode %s", matchMode.toString()));
@@ -152,6 +153,67 @@ public long getMaximum() {
152153
public void setMaximum(long maximum) {
153154
this.maximum = maximum;
154155
}
156+
157+
private static String[] jsonEscape(String[] ss) {
158+
if (ss == null) {
159+
return null;
160+
}
161+
String[] result = new String[ss.length];
162+
for (int i = 0; i < ss.length; i++) {
163+
result[i] = jsonEscape(ss[i]);
164+
}
165+
return result;
166+
}
167+
168+
private static String jsonEscape(String s) {
169+
if (s == null) {
170+
return null;
171+
}
172+
StringBuffer sb = new StringBuffer();
173+
for (int i = 0; i < s.length(); i++) {
174+
char ch = s.charAt(i);
175+
switch (ch) {
176+
case '"':
177+
sb.append("\\\"");
178+
break;
179+
case '\\':
180+
sb.append("\\\\");
181+
break;
182+
case '\b':
183+
sb.append("\\b");
184+
break;
185+
case '\f':
186+
sb.append("\\f");
187+
break;
188+
case '\n':
189+
sb.append("\\n");
190+
break;
191+
case '\r':
192+
sb.append("\\r");
193+
break;
194+
case '\t':
195+
sb.append("\\t");
196+
break;
197+
case '/':
198+
sb.append("\\/");
199+
break;
200+
default:
201+
if ((ch >= '\u0000' && ch <= '\u001F') ||
202+
(ch >= '\u007F' && ch <= '\u009F') ||
203+
(ch >= '\u2000' && ch <= '\u20FF')) {
204+
String ss = Integer.toHexString(ch);
205+
sb.append("\\u");
206+
for (int k = 0; k < 4 - ss.length(); k++) {
207+
sb.append('0');
208+
}
209+
sb.append(ss.toUpperCase());
210+
} else {
211+
sb.append(ch);
212+
}
213+
}
214+
}
215+
return sb.toString();
216+
}
155217
}
156218

157219
/**

0 commit comments

Comments
 (0)