Skip to content

Commit 13839a4

Browse files
committed
Add source provenance to Json parser
1 parent 5ad6961 commit 13839a4

File tree

1 file changed

+81
-51
lines changed
  • javascript/frameworks/ui5/lib/advanced_security/javascript/frameworks/ui5

1 file changed

+81
-51
lines changed

javascript/frameworks/ui5/lib/advanced_security/javascript/frameworks/ui5/JsonParser.qll

Lines changed: 81 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,70 @@
1+
signature string getJsonSig();
12

2-
signature class JsonStringReader {
3-
string read();
4-
}
5-
6-
module JsonParser<JsonStringReader Reader> {
3+
module JsonParser<getJsonSig/0 getJson> {
74
private newtype TJsonToken =
85
MkLeftBracketToken(int begin, int end, string value, string source) {
9-
source = any(Reader r).read() and
6+
source = getJson() and
107
begin = source.indexOf("{") and
118
begin = end and
129
value = "{"
1310
} or
1411
MkRightBracketToken(int begin, int end, string value, string source) {
15-
source = any(Reader r).read() and
12+
source = getJson() and
1613
begin = source.indexOf("}") and
1714
begin = end and
1815
value = "}"
1916
} or
2017
MkLeftSquareBracketToken(int begin, int end, string value, string source) {
21-
source = any(Reader r).read() and
18+
source = getJson() and
2219
begin = source.indexOf("[") and
2320
begin = end and
2421
value = "["
2522
} or
2623
MkRightSquareBracketToken(int begin, int end, string value, string source) {
27-
source = any(Reader r).read() and
24+
source = getJson() and
2825
begin = source.indexOf("]") and
2926
begin = end and
3027
value = "]"
3128
} or
3229
MkWhiteSpaceToken(int begin, int end, string value, string source) {
33-
source = any(Reader r).read() and
30+
source = getJson() and
3431
value = source.regexpFind("[\\s\\v\\h]", _, begin) and
3532
begin + value.length() - 1 = end
3633
} or
3734
MkCommaToken(int begin, int end, string value, string source) {
38-
source = any(Reader r).read() and
35+
source = getJson() and
3936
begin = source.indexOf(",") and
4037
begin = end and
4138
value = ","
4239
} or
4340
MkColonToken(int begin, int end, string value, string source) {
44-
source = any(Reader r).read() and
41+
source = getJson() and
4542
begin = source.indexOf(":") and
4643
begin = end and
4744
value = ":"
4845
} or
4946
MkNumberToken(int begin, int end, string value, string source) {
50-
source = any(Reader r).read() and
47+
source = getJson() and
5148
value = source.regexpFind("-?[1-9]\\d*(\\.\\d+)?((e|E)?(\\+|-)?\\d+)?", _, begin) and
5249
begin + value.length() - 1 = end
5350
} or
5451
MkStringToken(int begin, int end, string value, string source) {
55-
source = any(Reader r).read() and
52+
source = getJson() and
5653
value = source.regexpFind("\"[^\"]*\"", _, begin) and
5754
begin + value.length() - 1 = end
5855
} or
5956
MkTrueToken(int begin, int end, string value, string source) {
60-
source = any(Reader r).read() and
57+
source = getJson() and
6158
value = source.regexpFind("true", _, begin) and
6259
begin + value.length() - 1 = end
6360
} or
6461
MkFalseToken(int begin, int end, string value, string source) {
65-
source = any(Reader r).read() and
62+
source = getJson() and
6663
value = source.regexpFind("false", _, begin) and
6764
begin + value.length() - 1 = end
6865
} or
6966
MkNullToken(int begin, int end, string value, string source) {
70-
source = any(Reader r).read() and
67+
source = getJson() and
7168
value = source.regexpFind("null", _, begin) and
7269
begin + value.length() - 1 = end
7370
}
@@ -382,96 +379,128 @@ module JsonParser<JsonStringReader Reader> {
382379
}
383380

384381
private newtype TJsonValue =
385-
MkJsonNumber(float n) {
386-
exists(NumberToken t | t.getValue().toFloat() = n | not any(StringToken str).contains(t))
382+
MkJsonNumber(float n, JsonToken source) {
383+
exists(NumberToken t | t.getValue().toFloat() = n and source = t |
384+
not any(StringToken str).contains(t)
385+
)
386+
} or
387+
MkJsonString(string s, JsonToken source) {
388+
exists(StringToken t | t.(JsonToken).getValue() = s and t = source)
387389
} or
388-
MkJsonString(string s) { exists(StringToken t | t.(JsonToken).getValue() = s) } or
389-
MkJsonObject(JsonMemberList members) {
390+
MkJsonObject(JsonMemberList members, JsonToken source) {
390391
exists(LeftBracketToken l, RightBracketToken r, JsonToken last |
391392
getNextSkippingWhitespace(l) != r
392393
|
393394
mkJsonMembers(getNextSkippingWhitespace(l), members, last) and
394-
getNextSkippingWhitespace(last) = r
395+
getNextSkippingWhitespace(last) = r and
396+
source = l
395397
)
396398
or
397399
exists(LeftBracketToken l, RightBracketToken r | getNextSkippingWhitespace(l) = r |
398-
members = EmtpyMemberList()
400+
members = EmtpyMemberList() and source = l
399401
)
400402
} or
401-
MkJsonArray(JsonValueList values) {
403+
MkJsonArray(JsonValueList values, JsonToken source) {
402404
exists(LeftSquareBracketToken l, RightSquareBracketToken r, JsonToken last |
403405
mkJsonValues(getNextSkippingWhitespace(l), values, last) and
404-
getNextSkippingWhitespace(last) = r
406+
getNextSkippingWhitespace(last) = r and
407+
source = l
405408
)
406409
or
407410
exists(LeftSquareBracketToken l, RightSquareBracketToken r |
408411
getNextSkippingWhitespace(l) = r
409412
|
410-
values = EmtpyJsonValueList()
413+
values = EmtpyJsonValueList() and source = l
411414
)
412415
} or
413-
MkJsonTrue() { exists(TrueToken t | not any(StringToken str).contains(t)) } or
414-
MkJsonFalse() { exists(FalseToken t | not any(StringToken str).contains(t)) } or
415-
MkJsonNull() { exists(NullToken t | not any(StringToken str).contains(t)) }
416+
MkJsonTrue(JsonToken source) {
417+
exists(TrueToken t | not any(StringToken str).contains(t) and source = t)
418+
} or
419+
MkJsonFalse(JsonToken source) {
420+
exists(FalseToken t | not any(StringToken str).contains(t) and source = t)
421+
} or
422+
MkJsonNull(JsonToken source) {
423+
exists(NullToken t | not any(StringToken str).contains(t) and source = t)
424+
}
416425

417426
private predicate mkJsonValue(JsonToken first, JsonValue value, JsonToken last) {
418427
first instanceof StringToken and
419428
first = last and
420-
value = MkJsonString(first.getValue())
429+
value = MkJsonString(first.getValue(), _)
421430
or
422431
first instanceof NumberToken and
423432
first = last and
424-
value = MkJsonNumber(first.getValue().toFloat())
433+
value = MkJsonNumber(first.getValue().toFloat(), _)
425434
or
426435
first instanceof LeftBracketToken and
427436
exists(JsonMemberList members, JsonToken membersLast |
428437
mkJsonMembers(getNextSkippingWhitespace(first), members, membersLast) and
429-
value = MkJsonObject(members) and
438+
value = MkJsonObject(members, _) and
430439
last = getNextSkippingWhitespace(membersLast)
431440
) and
432441
last instanceof RightBracketToken
433442
or
434443
first instanceof LeftSquareBracketToken and
435444
exists(JsonValueList values, JsonToken valuesLast |
436445
mkJsonValues(getNextSkippingWhitespace(first), values, valuesLast) and
437-
value = MkJsonArray(values) and
446+
value = MkJsonArray(values, _) and
438447
last = getNextSkippingWhitespace(valuesLast)
439448
) and
440449
last instanceof RightSquareBracketToken
441450
or
442451
first instanceof TrueToken and
443452
first = last and
444-
value = MkJsonTrue()
453+
value = MkJsonTrue(_)
445454
or
446455
first instanceof FalseToken and
447456
first = last and
448-
value = MkJsonFalse()
457+
value = MkJsonFalse(_)
449458
or
450459
first instanceof NullToken and
451460
first = last and
452-
value = MkJsonNull()
461+
value = MkJsonNull(_)
453462
}
454463

455464
class JsonValue extends TJsonValue {
456465
string toString() {
457-
this = MkJsonString(result)
466+
this = MkJsonString(result, _)
458467
or
459-
exists(float number | this = MkJsonNumber(number) | result = number.toString())
468+
exists(float number | this = MkJsonNumber(number, _) | result = number.toString())
460469
or
461-
exists(JsonMemberList members | this = MkJsonObject(members) | result = members.toString())
470+
exists(JsonMemberList members | this = MkJsonObject(members, _) | result = members.toString())
462471
or
463-
exists(JsonValueList values | this = MkJsonArray(values) | result = values.toString())
472+
exists(JsonValueList values | this = MkJsonArray(values, _) | result = values.toString())
464473
or
465-
this = MkJsonTrue() and result = "true"
474+
this = MkJsonTrue(_) and result = "true"
466475
or
467-
this = MkJsonFalse() and result = "false"
476+
this = MkJsonFalse(_) and result = "false"
468477
or
469-
this = MkJsonNull() and result = "null"
478+
this = MkJsonNull(_) and result = "null"
479+
}
480+
481+
string getSource() {
482+
exists(JsonToken token |
483+
this = MkJsonString(_, token)
484+
or
485+
this = MkJsonNumber(_, token)
486+
or
487+
this = MkJsonObject(_, token)
488+
or
489+
this = MkJsonArray(_, token)
490+
or
491+
this = MkJsonTrue(token)
492+
or
493+
this = MkJsonFalse(token)
494+
or
495+
this = MkJsonNull(token)
496+
|
497+
result = token.getSource()
498+
)
470499
}
471500
}
472501

473502
class JsonObject extends JsonValue, MkJsonObject {
474-
JsonMemberList getMembers() { this = MkJsonObject(result) }
503+
JsonMemberList getMembers() { this = MkJsonObject(result, _) }
475504

476505
JsonMember getMember(int index) { result = getMembers().getMember(index) }
477506

@@ -483,19 +512,20 @@ module JsonParser<JsonStringReader Reader> {
483512
class JsonNumber extends JsonValue, MkJsonNumber { }
484513

485514
class JsonArray extends JsonValue, MkJsonArray {
486-
JsonValueList getValues() { this = MkJsonArray(result) }
515+
JsonValueList getValues() { this = MkJsonArray(result, _) }
487516

488517
JsonValue getValue(int index) { result = getValues().getValue(index) }
489518

490519
JsonValue getAValue() { result = getValue(_) }
491520
}
492521

493-
JsonValue parse() {
522+
JsonValue parse(string json) {
523+
result.getSource() = json and
494524
exists(JsonToken firstToken |
495-
not any(JsonToken t).getBegin() < firstToken.getBegin() and
496-
if firstToken instanceof WhiteSpaceToken
497-
then mkJsonValue(getNextSkippingWhitespace(firstToken), result, _)
498-
else mkJsonValue(firstToken, result, _)
525+
not any(JsonToken t).getBegin() < firstToken.getBegin() and
526+
if firstToken instanceof WhiteSpaceToken
527+
then mkJsonValue(getNextSkippingWhitespace(firstToken), result, _)
528+
else mkJsonValue(firstToken, result, _)
499529
)
500530
}
501-
}
531+
}

0 commit comments

Comments
 (0)