diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java index c3d2a3023..7a32ded0b 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java @@ -118,11 +118,13 @@ public abstract class ParserBase { //FIXME: i18n should be done here public void logError(int line, int col, String path, IssueType type, String message, IssueSeverity level) throws FHIRFormatError { - if (policy == ValidationPolicy.EVERYTHING) { - ValidationMessage msg = new ValidationMessage(Source.InstanceValidator, type, line, col, path, message, level); - errors.add(msg); - } else if (level == IssueSeverity.FATAL || (level == IssueSeverity.ERROR && policy == ValidationPolicy.QUICK)) - throw new FHIRFormatError(message+String.format(" at line %d col %d", line, col)); + if (errors != null) { + if (policy == ValidationPolicy.EVERYTHING) { + ValidationMessage msg = new ValidationMessage(Source.InstanceValidator, type, line, col, path, message, level); + errors.add(msg); + } else if (level == IssueSeverity.FATAL || (level == IssueSeverity.ERROR && policy == ValidationPolicy.QUICK)) + throw new FHIRFormatError(message+String.format(" at line %d col %d", line, col)); + } } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java index dfdaf3b51..a7c89f4b0 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java @@ -237,6 +237,7 @@ public class SHCParser extends ParserBase { private static final int BUFFER_SIZE = 1024; public static final String CURRENT_PACKAGE = "hl7.fhir.uv.shc-vaccination#0.6.2"; + private static final int MAX_ALLOWED_SHC_LENGTH = 1195; // todo: deal with chunking public static String decodeQRCode(String src) { @@ -253,10 +254,14 @@ public class SHCParser extends ParserBase { return b.toString(); } - public static JWT decodeJWT(String jwt) throws IOException, DataFormatException { + public JWT decodeJWT(String jwt) throws IOException, DataFormatException { if (jwt.startsWith("shc:/")) { jwt = decodeQRCode(jwt); } + if (jwt.length() > MAX_ALLOWED_SHC_LENGTH) { + logError(-1, -1, "jwt", IssueType.TOOLONG, "JWT Payload limit length is "+MAX_ALLOWED_SHC_LENGTH+" bytes for a single image - this has "+jwt.length()+" bytes", IssueSeverity.ERROR); + } + String[] parts = splitToken(jwt); byte[] headerJson; byte[] payloadJson; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ResourceChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ResourceChecker.java index ab0c772f4..0aa551594 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ResourceChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ResourceChecker.java @@ -99,7 +99,7 @@ public class ResourceChecker { String s = new String(cnt, StandardCharsets.UTF_8); if (s.startsWith("shc:/")) s = SHCParser.decodeQRCode(s); - JWT jwt = SHCParser.decodeJWT(s); + JWT jwt = new SHCParser(context).decodeJWT(s); return Manager.FhirFormat.SHC; } catch (Exception e) { if (debug) {