Skip to content

Commit f4f4343

Browse files
CopilotNotMyFault
andauthored
Skip non-name JSON values safely
Co-authored-by: NotMyFault <13383509+NotMyFault@users.noreply.github.com>
1 parent 931978f commit f4f4343

1 file changed

Lines changed: 88 additions & 28 deletions

File tree

src/main/java/com/thevoxelbox/voxelsniper/VoxelSniperPlugin.java

Lines changed: 88 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -336,39 +336,45 @@ private static String findLatestVersionName(String response) {
336336
}
337337

338338
String lastObject = response.substring(lastObjectStart, lastObjectEnd);
339-
int objectDepth = 0;
340-
for (int index = 0; index < lastObject.length(); index++) {
341-
char character = lastObject.charAt(index);
342-
if (character == '"') {
343-
int stringEnd = findStringEnd(lastObject, index + 1);
344-
if (stringEnd == -1) {
339+
for (int index = 1; index < lastObject.length() - 1; ) {
340+
index = skipWhitespace(lastObject, index);
341+
if (index >= lastObject.length() - 1) {
342+
break;
343+
}
344+
if (lastObject.charAt(index) == ',') {
345+
index++;
346+
continue;
347+
}
348+
if (lastObject.charAt(index) != '"') {
349+
return null;
350+
}
351+
352+
int keyEnd = findStringEnd(lastObject, index + 1);
353+
if (keyEnd == -1) {
354+
return null;
355+
}
356+
String key = lastObject.substring(index + 1, keyEnd);
357+
int colonIndex = skipWhitespace(lastObject, keyEnd + 1);
358+
if (colonIndex >= lastObject.length() || lastObject.charAt(colonIndex) != ':') {
359+
return null;
360+
}
361+
int valueStart = skipWhitespace(lastObject, colonIndex + 1);
362+
if ("name".equals(key)) {
363+
if (valueStart >= lastObject.length() || lastObject.charAt(valueStart) != '"') {
345364
return null;
346365
}
347-
if (objectDepth == 1) {
348-
String key = lastObject.substring(index + 1, stringEnd);
349-
int colonIndex = skipWhitespace(lastObject, stringEnd + 1);
350-
if (colonIndex < lastObject.length() && lastObject.charAt(colonIndex) == ':') {
351-
int valueStart = skipWhitespace(lastObject, colonIndex + 1);
352-
if ("name".equals(key) && valueStart < lastObject.length() && lastObject.charAt(valueStart) == '"') {
353-
int valueEnd = findStringEnd(lastObject, valueStart + 1);
354-
if (valueEnd == -1) {
355-
return null;
356-
}
357-
return lastObject.substring(valueStart + 1, valueEnd);
358-
}
359-
}
366+
int valueEnd = findStringEnd(lastObject, valueStart + 1);
367+
if (valueEnd == -1) {
368+
return null;
360369
}
361-
index = stringEnd;
362-
continue;
363-
}
364-
if (character == '{') {
365-
objectDepth++;
366-
continue;
370+
return lastObject.substring(valueStart + 1, valueEnd);
367371
}
368-
if (character == '}') {
369-
objectDepth--;
370-
continue;
372+
373+
int valueEnd = skipJsonValue(lastObject, valueStart);
374+
if (valueEnd == -1) {
375+
return null;
371376
}
377+
index = valueEnd + 1;
372378
}
373379
return null;
374380
}
@@ -396,4 +402,58 @@ private static int skipWhitespace(String input, int startIndex) {
396402
return index;
397403
}
398404

405+
private static int skipJsonValue(String input, int startIndex) {
406+
if (startIndex >= input.length()) {
407+
return -1;
408+
}
409+
char character = input.charAt(startIndex);
410+
if (character == '"') {
411+
return findStringEnd(input, startIndex + 1);
412+
}
413+
if (character == '{' || character == '[') {
414+
char open = character;
415+
char close = character == '{' ? '}' : ']';
416+
int depth = 1;
417+
boolean inString = false;
418+
boolean escaping = false;
419+
for (int index = startIndex + 1; index < input.length(); index++) {
420+
char current = input.charAt(index);
421+
if (escaping) {
422+
escaping = false;
423+
continue;
424+
}
425+
if (inString) {
426+
if (current == '\\') {
427+
escaping = true;
428+
} else if (current == '"') {
429+
inString = false;
430+
}
431+
continue;
432+
}
433+
if (current == '"') {
434+
inString = true;
435+
continue;
436+
}
437+
if (current == open) {
438+
depth++;
439+
} else if (current == close) {
440+
depth--;
441+
if (depth == 0) {
442+
return index;
443+
}
444+
}
445+
}
446+
return -1;
447+
}
448+
int index = startIndex;
449+
while (index < input.length()) {
450+
char current = input.charAt(index);
451+
if (current == ',' || current == '}') {
452+
return index - 1;
453+
}
454+
index++;
455+
}
456+
return input.length() - 1;
457+
}
458+
399459
}

0 commit comments

Comments
 (0)