diff --git a/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/channel.xml b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/channel.xml new file mode 100644 index 0000000000..c1be83a2e3 --- /dev/null +++ b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/channel.xml @@ -0,0 +1,274 @@ + + d82ce8bd-37a0-4b16-8fc8-1593ab3c4648 + 2 + HL7 XXE repro + + 3 + + 0 + sourceConnector + + + + None + true + false + false + 1 + + + Default Resource + [Default Resource] + + + 1000 + + + + + HL7V2 + XML + + + true + true + true + true + false + \r + true + + + false + false + \r + + + MSH_Segment + + + + \r + AA + + AE + An Error Occurred Processing Message. + AR + Message Rejected. + false + yyyyMMddHHmmss.SSS + + + AA,CA + AE,CE + AR,CR + true + Destination_Encoded + + + + + + false + + + Element_Name + + 1 + + + + + + + + + Channel Reader + SOURCE + true + true + + + + 1 + Destination 1 + + + + false + false + 10000 + false + 0 + false + false + 1 + + false + + + Default Resource + [Default Resource] + + + 1000 + true + + none + ${message.encodedData} + + + + + XML + XML + + + false + + + Element_Name + + 1 + + + + + + + false + + + Element_Name + + 1 + + + + + + + + HL7V2 + XML + + + true + true + false + false + false + \r + true + + + false + false + \r + + + MSH_Segment + + + + \r + AA + + AE + An Error Occurred Processing Message. + AR + Message Rejected. + false + yyyyMMddHHmmss.SSS + + + AA,CA + AE,CE + AR,CR + true + Destination_Encoded + + + + + + false + + + Element_Name + + 1 + + + + + + + + + Channel Writer + DESTINATION + true + true + + + // Modify the message variable below to pre process data +return message; + // This script executes once after a message has been processed +// Responses returned from here will be stored as "Postprocessor" in the response map +return; + // This script executes once when the channel is deployed +// You only have access to the globalMap and globalChannelMap here to persist data +return; + // This script executes once when the channel is undeployed +// You only have access to the globalMap and globalChannelMap here to persist data +return; + + true + DEVELOPMENT + false + false + false + false + false + false + STARTED + true + + + SOURCE + STRING + mirth_source + + + TYPE + STRING + mirth_type + + + + None + + + + + Default Resource + [Default Resource] + + + + + + true + + + America/Chicago + + + true + false + + 1 + + + \ No newline at end of file diff --git a/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source new file mode 100644 index 0000000000..8381d05993 --- /dev/null +++ b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source @@ -0,0 +1,3 @@ + + ]> +|^~\&&xxe;ACK12.4AA1 \ No newline at end of file diff --git a/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source_status b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source_status new file mode 100644 index 0000000000..1316c06a69 --- /dev/null +++ b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source_status @@ -0,0 +1 @@ +TRANSFORMED \ No newline at end of file diff --git a/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source_transformed b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source_transformed new file mode 100644 index 0000000000..6383d5381b --- /dev/null +++ b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/01-xxe/source_transformed @@ -0,0 +1 @@ +|^~\&ACK12.4AA1 \ No newline at end of file diff --git a/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/02-control/source b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/02-control/source new file mode 100644 index 0000000000..77d58e96c7 --- /dev/null +++ b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/02-control/source @@ -0,0 +1,2 @@ + +|^~\&asdfACK12.4AA1 \ No newline at end of file diff --git a/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/02-control/source_status b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/02-control/source_status new file mode 100644 index 0000000000..1316c06a69 --- /dev/null +++ b/ci/tests/205-hl7-xxe/channels/01-hl7-xxe/messages/02-control/source_status @@ -0,0 +1 @@ +TRANSFORMED \ No newline at end of file diff --git a/client/lib/hapi-base-2.3.jar b/client/lib/hapi-base-2.3.jar deleted file mode 100644 index 4eab2e225d..0000000000 Binary files a/client/lib/hapi-base-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v21-2.3.jar b/client/lib/hapi-structures-v21-2.3.jar deleted file mode 100644 index 4cfcea8eea..0000000000 Binary files a/client/lib/hapi-structures-v21-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v22-2.3.jar b/client/lib/hapi-structures-v22-2.3.jar deleted file mode 100644 index 6da93b48a1..0000000000 Binary files a/client/lib/hapi-structures-v22-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v23-2.3.jar b/client/lib/hapi-structures-v23-2.3.jar deleted file mode 100644 index faa8f13af5..0000000000 Binary files a/client/lib/hapi-structures-v23-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v231-2.3.jar b/client/lib/hapi-structures-v231-2.3.jar deleted file mode 100644 index 6e6777579f..0000000000 Binary files a/client/lib/hapi-structures-v231-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v24-2.3.jar b/client/lib/hapi-structures-v24-2.3.jar deleted file mode 100644 index 8f9fdbeeff..0000000000 Binary files a/client/lib/hapi-structures-v24-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v25-2.3.jar b/client/lib/hapi-structures-v25-2.3.jar deleted file mode 100644 index c2806adff0..0000000000 Binary files a/client/lib/hapi-structures-v25-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v251-2.3.jar b/client/lib/hapi-structures-v251-2.3.jar deleted file mode 100644 index 06cac70c87..0000000000 Binary files a/client/lib/hapi-structures-v251-2.3.jar and /dev/null differ diff --git a/client/lib/hapi-structures-v26-2.3.jar b/client/lib/hapi-structures-v26-2.3.jar deleted file mode 100644 index 641730fe51..0000000000 Binary files a/client/lib/hapi-structures-v26-2.3.jar and /dev/null differ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8a81742e0a..60d3f3a062 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -67,9 +67,18 @@ guava = { module = "com.google.guava:guava", version = "32.0.1-jre" } guice = { module = "com.google.inject:guice", version = "4.1.0" } ha-api = { module = "org.glassfish.ha:ha-api", version = "3.1.9" } hamcrest = { module = "org.hamcrest:hamcrest", version = "2.2" } -hapi-structures-v27 = { module = "ca.uhn.hapi:hapi-structures-v27", version = "2.3" } -hapi-structures-v28 = { module = "ca.uhn.hapi:hapi-structures-v28", version = "2.3" } -hapi-structures-v281 = { module = "ca.uhn.hapi:hapi-structures-v281", version = "2.3" } +hapi-base = { module = "ca.uhn.hapi:hapi-base", version = "2.6.0" } +hapi-structures-v21 = { module = "ca.uhn.hapi:hapi-structures-v21", version = "2.6.0" } +hapi-structures-v22 = { module = "ca.uhn.hapi:hapi-structures-v22", version = "2.6.0" } +hapi-structures-v23 = { module = "ca.uhn.hapi:hapi-structures-v23", version = "2.6.0" } +hapi-structures-v231 = { module = "ca.uhn.hapi:hapi-structures-v231", version = "2.6.0" } +hapi-structures-v24 = { module = "ca.uhn.hapi:hapi-structures-v24", version = "2.6.0" } +hapi-structures-v25 = { module = "ca.uhn.hapi:hapi-structures-v25", version = "2.6.0" } +hapi-structures-v251 = { module = "ca.uhn.hapi:hapi-structures-v251", version = "2.6.0" } +hapi-structures-v26 = { module = "ca.uhn.hapi:hapi-structures-v26", version = "2.6.0" } +hapi-structures-v27 = { module = "ca.uhn.hapi:hapi-structures-v27", version = "2.6.0" } +hapi-structures-v28 = { module = "ca.uhn.hapi:hapi-structures-v28", version = "2.6.0" } +hapi-structures-v281 = { module = "ca.uhn.hapi:hapi-structures-v281", version = "2.6.0" } hikaricp = { module = "com.zaxxer:HikariCP", version = "2.5.1" } hk2-api = { module = "org.glassfish.hk2:hk2-api", version = "2.4.0-b31" } hk2-locator = { module = "org.glassfish.hk2:hk2-locator", version = "2.4.0-b31" } @@ -220,12 +229,12 @@ postgresql = { module = "org.postgresql:postgresql", version = "42.7.12" } snakeyaml = { module = "org.yaml:snakeyaml", version = "2.5" } [bundles] -client-main = ["bcpkix-jdk18on", "bcprov-jdk18on", "bcutil-jdk18on", "commons-beanutils", "commons-codec", "commons-collections4", "commons-compress", "commons-configuration2", "commons-io", "commons-lang3", "commons-logging", "commons-pool2", "commons-text", "commons-vfs2", "guava", "hapi-structures-v27", "hapi-structures-v28", "hapi-structures-v281", "hk2-api", "hk2-locator", "hk2-utils", "httpclient", "httpcore", "httpmime", "jackson-annotations", "jackson-core", "jackson-databind", "jakarta-activation", "jakarta-mail", "java-semver", "javassist", "javax-activation-api", "javax-annotation-api", "javax-inject", "javax-ws-rs-api", "jaxb-api", "jaxb-runtime", "jcifs-ng", "jersey-client", "jersey-common", "jersey-guava", "jersey-media-multipart", "jersey-proxy-client", "jetty-util", "joda-time", "libphonenumber", "log4j-1-2-api", "log4j-api", "log4j-core", "miglayout-core", "miglayout-swing", "mimepull", "quartz", "reflections", "regions", "rhino", "slf4j-api", "slf4j-log4j12", "staxon", "swagger-annotations", "swingx-core", "utils", "velocity-engine-core", "velocity-tools-generic", "xpp3", "xstream"] +client-main = ["bcpkix-jdk18on", "bcprov-jdk18on", "bcutil-jdk18on", "commons-beanutils", "commons-codec", "commons-collections4", "commons-compress", "commons-configuration2", "commons-io", "commons-lang3", "commons-logging", "commons-pool2", "commons-text", "commons-vfs2", "guava", "hapi-base", "hapi-structures-v21", "hapi-structures-v22", "hapi-structures-v23", "hapi-structures-v231", "hapi-structures-v24", "hapi-structures-v25", "hapi-structures-v251", "hapi-structures-v26", "hapi-structures-v27", "hapi-structures-v28", "hapi-structures-v281", "hk2-api", "hk2-locator", "hk2-utils", "httpclient", "httpcore", "httpmime", "jackson-annotations", "jackson-core", "jackson-databind", "jakarta-activation", "jakarta-mail", "java-semver", "javassist", "javax-activation-api", "javax-annotation-api", "javax-inject", "javax-ws-rs-api", "jaxb-api", "jaxb-runtime", "jcifs-ng", "jersey-client", "jersey-common", "jersey-guava", "jersey-media-multipart", "jersey-proxy-client", "jetty-util", "joda-time", "libphonenumber", "log4j-1-2-api", "log4j-api", "log4j-core", "miglayout-core", "miglayout-swing", "mimepull", "quartz", "reflections", "regions", "rhino", "slf4j-api", "slf4j-log4j12", "staxon", "swagger-annotations", "swingx-core", "utils", "velocity-engine-core", "velocity-tools-generic", "xpp3", "xstream"] command-main = ["bcpkix-jdk18on", "bcprov-jdk18on", "bcutil-jdk18on", "commons-beanutils", "commons-cli", "commons-codec", "commons-collections4", "commons-configuration2", "commons-io", "commons-lang3", "commons-logging", "commons-pool2", "commons-text", "commons-vfs2", "guava", "hk2-api", "hk2-locator", "hk2-utils", "httpclient", "httpcore", "httpmime", "jackson-annotations", "jackson-core", "jackson-databind", "jakarta-activation", "javassist", "javax-activation-api", "javax-annotation-api-v1-3", "javax-inject", "javax-ws-rs-api", "jaxb-api", "jaxb-runtime", "jersey-client", "jersey-common", "jersey-guava", "jersey-media-multipart", "jersey-proxy-client", "jetty-util", "log4j-api", "log4j-core", "mimepull", "reflections", "rhino", "slf4j-api", "slf4j-log4j12", "staxon", "swagger-annotations", "velocity-engine-core", "velocity-tools-generic", "xpp3", "xstream"] command-test = ["junit"] donkey-main = ["checker-qual", "commons-beanutils", "commons-codec", "commons-collections4", "commons-dbcp2", "commons-dbutils", "commons-io", "commons-lang3", "commons-logging", "commons-math3", "commons-pool2", "commons-text", "derby", "error-prone-annotations", "failureaccess", "guava", "guice", "hikaricp", "j2objc-annotations", "javassist", "jsr305", "listenablefuture", "log4j-1-2-api", "log4j-api", "log4j-core", "mssql-jdbc", "mysql-connector-j", "ojdbc8", "postgresql", "quartz", "slf4j-api", "slf4j-log4j12", "xpp3", "xstream"] donkey-test = ["aopalliance-repackaged", "byte-buddy", "byte-buddy-agent", "javax-inject", "junit", "mockito-core", "objenesis"] generator-main = ["commons-collections4", "commons-io", "commons-lang3", "log4j-1-2-api", "log4j-api", "log4j-core", "slf4j-api", "slf4j-log4j12", "velocity-engine-core"] -server-main = ["annotations", "aopalliance-repackaged", "apache-client", "apache-el", "apache-jsp", "apache-jsp-v8-5-70", "asm", "asm-analysis", "asm-commons", "asm-tree", "asm-util", "auth", "aws-core", "aws-json-protocol", "aws-query-protocol", "aws-xml-protocol", "bcpkix-jdk18on", "bcprov-jdk18on", "bcutil-jdk18on", "classgraph", "commons-beanutils", "commons-cli", "commons-codec", "commons-collections", "commons-collections4", "commons-compress", "commons-configuration2", "commons-dbcp2", "commons-dbutils", "commons-digester3", "commons-el", "commons-email", "commons-fileupload", "commons-httpclient", "commons-io", "commons-jxpath", "commons-lang3", "commons-logging", "commons-math3", "commons-net", "commons-pool2", "commons-text", "commons-vfs2", "derby", "derbytools", "ecj", "eventstream", "fastinfoset", "geronimo-j2ee-management-1-1-spec", "geronimo-jms-1-1-spec", "gmbal-api-only", "guice", "ha-api", "hapi-structures-v27", "hapi-structures-v28", "hapi-structures-v281", "hikaricp", "hk2-api", "hk2-locator", "hk2-utils", "http-client-spi", "httpclient", "httpcore", "httpmime", "jackson-annotations", "jackson-core", "jackson-databind", "jackson-dataformat-cbor", "jackson-dataformat-yaml", "jackson-datatype-jsr310", "jakarta-activation", "jakarta-mail", "java-semver", "javassist", "javax-activation-api", "javax-annotation-api", "javax-inject", "javax-json", "javax-json-api", "javax-servlet-api", "javax-ws-rs-api", "javax-xml-soap-api", "jaxb-api", "jaxb-runtime", "jaxws-api", "jaxws-rt", "jaxws-tools", "jdom2", "jersey-client", "jersey-common", "jersey-container-jetty-http", "jersey-container-jetty-servlet", "jersey-container-servlet", "jersey-container-servlet-core", "jersey-guava", "jersey-media-jaxb", "jersey-media-multipart", "jersey-proxy-client", "jersey-server", "jetty-annotations", "jetty-continuation", "jetty-http", "jetty-io", "jetty-jndi", "jetty-plus", "jetty-rewrite", "jetty-schemas", "jetty-security", "jetty-server", "jetty-servlet", "jetty-util", "jetty-util-ajax", "jetty-webapp", "jetty-xml", "jna", "jna-platform", "joda-time", "jsch", "jsr181-api", "kms", "log4j-1-2-api", "log4j-api", "log4j-core", "management-api", "metrics-spi", "mimepull", "mssql-jdbc", "mybatis", "mysql-connector-j", "netty-buffer", "netty-codec", "netty-codec-http", "netty-codec-http2", "netty-common", "netty-handler", "netty-nio-client", "netty-reactive-streams", "netty-reactive-streams-http", "netty-resolver", "netty-transport", "netty-transport-native-unix-common", "ojdbc8", "org-osgi-core", "osgi-resource-locator", "oshi-core", "persistence-api", "policy", "postgresql", "profiles", "protocol-core", "quartz", "reactive-streams", "reflections", "regions", "rhino", "s3", "saaj-impl", "sdk-core", "snakeyaml", "stax-ex", "staxon", "streambuffer", "sts", "swagger-annotations", "swagger-core", "swagger-integration", "swagger-jaxrs2", "swagger-jaxrs2-servlet-initializer", "swagger-models", "taglibs-standard-impl", "taglibs-standard-spec", "txw2", "utils", "validation-api", "velocity-engine-core", "velocity-tools-generic", "xpp3", "xstream"] +server-main = ["annotations", "aopalliance-repackaged", "apache-client", "apache-el", "apache-jsp", "apache-jsp-v8-5-70", "asm", "asm-analysis", "asm-commons", "asm-tree", "asm-util", "auth", "aws-core", "aws-json-protocol", "aws-query-protocol", "aws-xml-protocol", "bcpkix-jdk18on", "bcprov-jdk18on", "bcutil-jdk18on", "classgraph", "commons-beanutils", "commons-cli", "commons-codec", "commons-collections", "commons-collections4", "commons-compress", "commons-configuration2", "commons-dbcp2", "commons-dbutils", "commons-digester3", "commons-el", "commons-email", "commons-fileupload", "commons-httpclient", "commons-io", "commons-jxpath", "commons-lang3", "commons-logging", "commons-math3", "commons-net", "commons-pool2", "commons-text", "commons-vfs2", "derby", "derbytools", "ecj", "eventstream", "fastinfoset", "geronimo-j2ee-management-1-1-spec", "geronimo-jms-1-1-spec", "gmbal-api-only", "guice", "ha-api", "hapi-base", "hapi-structures-v21", "hapi-structures-v22", "hapi-structures-v23", "hapi-structures-v231", "hapi-structures-v24", "hapi-structures-v25", "hapi-structures-v251", "hapi-structures-v26", "hapi-structures-v27", "hapi-structures-v28", "hapi-structures-v281", "hikaricp", "hk2-api", "hk2-locator", "hk2-utils", "http-client-spi", "httpclient", "httpcore", "httpmime", "jackson-annotations", "jackson-core", "jackson-databind", "jackson-dataformat-cbor", "jackson-dataformat-yaml", "jackson-datatype-jsr310", "jakarta-activation", "jakarta-mail", "java-semver", "javassist", "javax-activation-api", "javax-annotation-api", "javax-inject", "javax-json", "javax-json-api", "javax-servlet-api", "javax-ws-rs-api", "javax-xml-soap-api", "jaxb-api", "jaxb-runtime", "jaxws-api", "jaxws-rt", "jaxws-tools", "jdom2", "jersey-client", "jersey-common", "jersey-container-jetty-http", "jersey-container-jetty-servlet", "jersey-container-servlet", "jersey-container-servlet-core", "jersey-guava", "jersey-media-jaxb", "jersey-media-multipart", "jersey-proxy-client", "jersey-server", "jetty-annotations", "jetty-continuation", "jetty-http", "jetty-io", "jetty-jndi", "jetty-plus", "jetty-rewrite", "jetty-schemas", "jetty-security", "jetty-server", "jetty-servlet", "jetty-util", "jetty-util-ajax", "jetty-webapp", "jetty-xml", "jna", "jna-platform", "joda-time", "jsch", "jsr181-api", "kms", "log4j-1-2-api", "log4j-api", "log4j-core", "management-api", "metrics-spi", "mimepull", "mssql-jdbc", "mybatis", "mysql-connector-j", "netty-buffer", "netty-codec", "netty-codec-http", "netty-codec-http2", "netty-common", "netty-handler", "netty-nio-client", "netty-reactive-streams", "netty-reactive-streams-http", "netty-resolver", "netty-transport", "netty-transport-native-unix-common", "ojdbc8", "org-osgi-core", "osgi-resource-locator", "oshi-core", "persistence-api", "policy", "postgresql", "profiles", "protocol-core", "quartz", "reactive-streams", "reflections", "regions", "rhino", "s3", "saaj-impl", "sdk-core", "snakeyaml", "stax-ex", "staxon", "streambuffer", "sts", "swagger-annotations", "swagger-core", "swagger-integration", "swagger-jaxrs2", "swagger-jaxrs2-servlet-initializer", "swagger-models", "taglibs-standard-impl", "taglibs-standard-spec", "txw2", "utils", "validation-api", "velocity-engine-core", "velocity-tools-generic", "xpp3", "xstream"] server-test = ["byte-buddy", "byte-buddy-agent", "hamcrest", "junit-v4-13-1", "mockito-core", "mockito-inline", "objenesis"] server-extensions = ["flying-saucer-core", "flying-saucer-pdf", "fontbox", "graphics2d", "imagej", "itext", "itext-rtf", "jcifs-ng", "openhtmltopdf-core", "openhtmltopdf-pdfbox", "pdfbox", "xmpbox"] diff --git a/gradle/vendored-layout.json b/gradle/vendored-layout.json index 7bffae2a4d..1f6bf96407 100644 --- a/gradle/vendored-layout.json +++ b/gradle/vendored-layout.json @@ -1,398 +1,416 @@ { - "client": { - "ca.uhn.hapi:hapi-structures-v27": "", - "ca.uhn.hapi:hapi-structures-v28": "", - "ca.uhn.hapi:hapi-structures-v281": "", - "com.fasterxml.jackson.core:jackson-annotations": "", - "com.fasterxml.jackson.core:jackson-core": "", - "com.fasterxml.jackson.core:jackson-databind": "", - "com.github.zafarkhaja:java-semver": "", - "com.google.guava:guava": "", - "com.googlecode.libphonenumber:libphonenumber": "", - "com.miglayout:miglayout-core": "", - "com.miglayout:miglayout-swing": "", - "com.sun.activation:jakarta.activation": "", - "com.sun.mail:jakarta.mail": "", - "com.thoughtworks.xstream:xstream": "", - "commons-beanutils:commons-beanutils": "", - "commons-codec:commons-codec": "", - "commons-io:commons-io": "", - "commons-logging:commons-logging": "", - "de.odysseus.staxon:staxon": "", - "eu.agno3.jcifs:jcifs-ng": "", - "io.swagger.core.v3:swagger-annotations": "", - "javax.activation:javax.activation-api": "", - "javax.annotation:javax.annotation-api": "", - "javax.ws.rs:javax.ws.rs-api": "", - "javax.xml.bind:jaxb-api": "", - "joda-time:joda-time": "", - "org.apache.commons:commons-collections4": "", - "org.apache.commons:commons-compress": "", - "org.apache.commons:commons-configuration2": "", - "org.apache.commons:commons-lang3": "", - "org.apache.commons:commons-pool2": "", - "org.apache.commons:commons-text": "", - "org.apache.commons:commons-vfs2": "", - "org.apache.httpcomponents:httpclient": "", - "org.apache.httpcomponents:httpcore": "", - "org.apache.httpcomponents:httpmime": "", - "org.apache.logging.log4j:log4j-1.2-api": "", - "org.apache.logging.log4j:log4j-api": "", - "org.apache.logging.log4j:log4j-core": "", - "org.apache.velocity.tools:velocity-tools-generic": "", - "org.apache.velocity:velocity-engine-core": "", - "org.bouncycastle:bcpkix-jdk18on": "", - "org.bouncycastle:bcprov-jdk18on": "", - "org.bouncycastle:bcutil-jdk18on": "", - "org.eclipse.jetty:jetty-util": "", - "org.glassfish.hk2.external:javax.inject": "", - "org.glassfish.hk2:hk2-api": "", - "org.glassfish.hk2:hk2-locator": "", - "org.glassfish.hk2:hk2-utils": "", - "org.glassfish.jaxb:jaxb-runtime": "", - "org.glassfish.jersey.bundles.repackaged:jersey-guava": "", - "org.glassfish.jersey.core:jersey-client": "", - "org.glassfish.jersey.core:jersey-common": "", - "org.glassfish.jersey.ext:jersey-proxy-client": "", - "org.glassfish.jersey.media:jersey-media-multipart": "", - "org.javassist:javassist": "", - "org.jvnet.mimepull:mimepull": "", - "org.mozilla:rhino": "", - "org.quartz-scheduler:quartz": "", - "org.reflections:reflections": "", - "org.slf4j:slf4j-api": "", - "org.slf4j:slf4j-log4j12": "", - "org.swinglabs:swingx-core": { - "dir": "", - "file": "swingx-core-1.6.2.jar" + "client": { + "ca.uhn.hapi:hapi-base": "", + "ca.uhn.hapi:hapi-structures-v21": "", + "ca.uhn.hapi:hapi-structures-v22": "", + "ca.uhn.hapi:hapi-structures-v23": "", + "ca.uhn.hapi:hapi-structures-v231": "", + "ca.uhn.hapi:hapi-structures-v24": "", + "ca.uhn.hapi:hapi-structures-v25": "", + "ca.uhn.hapi:hapi-structures-v251": "", + "ca.uhn.hapi:hapi-structures-v26": "", + "ca.uhn.hapi:hapi-structures-v27": "", + "ca.uhn.hapi:hapi-structures-v28": "", + "ca.uhn.hapi:hapi-structures-v281": "", + "com.fasterxml.jackson.core:jackson-annotations": "", + "com.fasterxml.jackson.core:jackson-core": "", + "com.fasterxml.jackson.core:jackson-databind": "", + "com.github.zafarkhaja:java-semver": "", + "com.google.guava:guava": "", + "com.googlecode.libphonenumber:libphonenumber": "", + "com.miglayout:miglayout-core": "", + "com.miglayout:miglayout-swing": "", + "com.sun.activation:jakarta.activation": "", + "com.sun.mail:jakarta.mail": "", + "com.thoughtworks.xstream:xstream": "", + "commons-beanutils:commons-beanutils": "", + "commons-codec:commons-codec": "", + "commons-io:commons-io": "", + "commons-logging:commons-logging": "", + "de.odysseus.staxon:staxon": "", + "eu.agno3.jcifs:jcifs-ng": "", + "io.swagger.core.v3:swagger-annotations": "", + "javax.activation:javax.activation-api": "", + "javax.annotation:javax.annotation-api": "", + "javax.ws.rs:javax.ws.rs-api": "", + "javax.xml.bind:jaxb-api": "", + "joda-time:joda-time": "", + "org.apache.commons:commons-collections4": "", + "org.apache.commons:commons-compress": "", + "org.apache.commons:commons-configuration2": "", + "org.apache.commons:commons-lang3": "", + "org.apache.commons:commons-pool2": "", + "org.apache.commons:commons-text": "", + "org.apache.commons:commons-vfs2": "", + "org.apache.httpcomponents:httpclient": "", + "org.apache.httpcomponents:httpcore": "", + "org.apache.httpcomponents:httpmime": "", + "org.apache.logging.log4j:log4j-1.2-api": "", + "org.apache.logging.log4j:log4j-api": "", + "org.apache.logging.log4j:log4j-core": "", + "org.apache.velocity.tools:velocity-tools-generic": "", + "org.apache.velocity:velocity-engine-core": "", + "org.bouncycastle:bcpkix-jdk18on": "", + "org.bouncycastle:bcprov-jdk18on": "", + "org.bouncycastle:bcutil-jdk18on": "", + "org.eclipse.jetty:jetty-util": "", + "org.glassfish.hk2.external:javax.inject": "", + "org.glassfish.hk2:hk2-api": "", + "org.glassfish.hk2:hk2-locator": "", + "org.glassfish.hk2:hk2-utils": "", + "org.glassfish.jaxb:jaxb-runtime": "", + "org.glassfish.jersey.bundles.repackaged:jersey-guava": "", + "org.glassfish.jersey.core:jersey-client": "", + "org.glassfish.jersey.core:jersey-common": "", + "org.glassfish.jersey.ext:jersey-proxy-client": "", + "org.glassfish.jersey.media:jersey-media-multipart": "", + "org.javassist:javassist": "", + "org.jvnet.mimepull:mimepull": "", + "org.mozilla:rhino": "", + "org.quartz-scheduler:quartz": "", + "org.reflections:reflections": "", + "org.slf4j:slf4j-api": "", + "org.slf4j:slf4j-log4j12": "", + "org.swinglabs:swingx-core": { + "dir": "", + "file": "swingx-core-1.6.2.jar" + }, + "software.amazon.awssdk:regions": "", + "software.amazon.awssdk:utils": "", + "xpp3:xpp3": "" }, - "software.amazon.awssdk:regions": "", - "software.amazon.awssdk:utils": "", - "xpp3:xpp3": "" - }, - "command": { - "com.fasterxml.jackson.core:jackson-annotations": "", - "com.fasterxml.jackson.core:jackson-core": "", - "com.fasterxml.jackson.core:jackson-databind": "", - "com.google.guava:guava": "", - "com.sun.activation:jakarta.activation": "", - "com.thoughtworks.xstream:xstream": "", - "commons-beanutils:commons-beanutils": "", - "commons-cli:commons-cli": "", - "commons-codec:commons-codec": "", - "commons-io:commons-io": "", - "commons-logging:commons-logging": "", - "de.odysseus.staxon:staxon": "", - "io.swagger.core.v3:swagger-annotations": "", - "javax.activation:javax.activation-api": "", - "javax.annotation:javax.annotation-api": "", - "javax.ws.rs:javax.ws.rs-api": "", - "javax.xml.bind:jaxb-api": "", - "org.apache.commons:commons-collections4": "", - "org.apache.commons:commons-configuration2": "", - "org.apache.commons:commons-lang3": "", - "org.apache.commons:commons-pool2": "", - "org.apache.commons:commons-text": "", - "org.apache.commons:commons-vfs2": "", - "org.apache.httpcomponents:httpclient": "", - "org.apache.httpcomponents:httpcore": "", - "org.apache.httpcomponents:httpmime": "", - "org.apache.logging.log4j:log4j-api": "", - "org.apache.logging.log4j:log4j-core": "", - "org.apache.velocity.tools:velocity-tools-generic": "", - "org.apache.velocity:velocity-engine-core": "", - "org.bouncycastle:bcpkix-jdk18on": "", - "org.bouncycastle:bcprov-jdk18on": "", - "org.bouncycastle:bcutil-jdk18on": "", - "org.eclipse.jetty:jetty-util": "", - "org.glassfish.hk2.external:javax.inject": "", - "org.glassfish.hk2:hk2-api": "", - "org.glassfish.hk2:hk2-locator": "", - "org.glassfish.hk2:hk2-utils": "", - "org.glassfish.jaxb:jaxb-runtime": "", - "org.glassfish.jersey.bundles.repackaged:jersey-guava": "", - "org.glassfish.jersey.core:jersey-client": "", - "org.glassfish.jersey.core:jersey-common": "", - "org.glassfish.jersey.ext:jersey-proxy-client": "", - "org.glassfish.jersey.media:jersey-media-multipart": "", - "org.javassist:javassist": "", - "org.jvnet.mimepull:mimepull": "", - "org.mozilla:rhino": "", - "org.reflections:reflections": "", - "org.slf4j:slf4j-api": "", - "org.slf4j:slf4j-log4j12": "", - "xpp3:xpp3": "" - }, - "donkey": { - "com.google.code.findbugs:jsr305": "guava", - "com.google.errorprone:error_prone_annotations": "guava", - "com.google.guava:failureaccess": "guava", - "com.google.guava:guava": "guava", - "com.google.guava:listenablefuture": "guava", - "com.google.inject:guice": "", - "com.google.j2objc:j2objc-annotations": "guava", - "com.microsoft.sqlserver:mssql-jdbc": "database", - "com.mysql:mysql-connector-j": "database", - "com.oracle.database.jdbc:ojdbc8": "database", - "com.thoughtworks.xstream:xstream": "xstream", - "com.zaxxer:HikariCP": "", - "commons-beanutils:commons-beanutils": "commons", - "commons-codec:commons-codec": "commons", - "commons-dbutils:commons-dbutils": "commons", - "commons-io:commons-io": "commons", - "commons-logging:commons-logging": "commons", - "org.apache.commons:commons-collections4": "commons", - "org.apache.commons:commons-dbcp2": "commons", - "org.apache.commons:commons-lang3": "commons", - "org.apache.commons:commons-math3": "commons", - "org.apache.commons:commons-pool2": "commons", - "org.apache.commons:commons-text": "commons", - "org.apache.derby:derby": "database", - "org.apache.logging.log4j:log4j-1.2-api": "", - "org.apache.logging.log4j:log4j-api": "", - "org.apache.logging.log4j:log4j-core": "", - "org.checkerframework:checker-qual": "guava", - "org.javassist:javassist": "", - "org.postgresql:postgresql": "database", - "org.quartz-scheduler:quartz": "", - "org.slf4j:slf4j-api": "", - "org.slf4j:slf4j-log4j12": "", - "xpp3:xpp3": "xstream" - }, - "generator": { - "commons-io:commons-io": "", - "org.apache.commons:commons-collections4": "", - "org.apache.commons:commons-lang3": "", - "org.apache.logging.log4j:log4j-1.2-api": "", - "org.apache.logging.log4j:log4j-api": "", - "org.apache.logging.log4j:log4j-core": "", - "org.apache.velocity:velocity-engine-core": "", - "org.slf4j:slf4j-api": "", - "org.slf4j:slf4j-log4j12": "" - }, - "server": { - "ca.uhn.hapi:hapi-structures-v27": "hapi", - "ca.uhn.hapi:hapi-structures-v28": "hapi", - "ca.uhn.hapi:hapi-structures-v281": "hapi", - "com.fasterxml.jackson.core:jackson-annotations": "jackson", - "com.fasterxml.jackson.core:jackson-core": "jackson", - "com.fasterxml.jackson.core:jackson-databind": "jackson", - "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": "jackson", - "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": "jackson", - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": "jackson", - "com.github.mwiede:jsch": "", - "com.github.oshi:oshi-core": "", - "com.github.zafarkhaja:java-semver": "", - "com.google.inject:guice": "", - "com.microsoft.sqlserver:mssql-jdbc": "database", - "com.mysql:mysql-connector-j": "database", - "com.oracle.database.jdbc:ojdbc8": "database", - "com.sun.activation:jakarta.activation": "javax", - "com.sun.mail:jakarta.mail": "javax", - "com.sun.xml.fastinfoset:FastInfoset": "javax/jaxws/ext", - "com.sun.xml.messaging.saaj:saaj-impl": { - "dir": "javax/jaxws/ext", - "file": "saaj-impl-1.0.jar" + "command": { + "com.fasterxml.jackson.core:jackson-annotations": "", + "com.fasterxml.jackson.core:jackson-core": "", + "com.fasterxml.jackson.core:jackson-databind": "", + "com.google.guava:guava": "", + "com.sun.activation:jakarta.activation": "", + "com.thoughtworks.xstream:xstream": "", + "commons-beanutils:commons-beanutils": "", + "commons-cli:commons-cli": "", + "commons-codec:commons-codec": "", + "commons-io:commons-io": "", + "commons-logging:commons-logging": "", + "de.odysseus.staxon:staxon": "", + "io.swagger.core.v3:swagger-annotations": "", + "javax.activation:javax.activation-api": "", + "javax.annotation:javax.annotation-api": "", + "javax.ws.rs:javax.ws.rs-api": "", + "javax.xml.bind:jaxb-api": "", + "org.apache.commons:commons-collections4": "", + "org.apache.commons:commons-configuration2": "", + "org.apache.commons:commons-lang3": "", + "org.apache.commons:commons-pool2": "", + "org.apache.commons:commons-text": "", + "org.apache.commons:commons-vfs2": "", + "org.apache.httpcomponents:httpclient": "", + "org.apache.httpcomponents:httpcore": "", + "org.apache.httpcomponents:httpmime": "", + "org.apache.logging.log4j:log4j-api": "", + "org.apache.logging.log4j:log4j-core": "", + "org.apache.velocity.tools:velocity-tools-generic": "", + "org.apache.velocity:velocity-engine-core": "", + "org.bouncycastle:bcpkix-jdk18on": "", + "org.bouncycastle:bcprov-jdk18on": "", + "org.bouncycastle:bcutil-jdk18on": "", + "org.eclipse.jetty:jetty-util": "", + "org.glassfish.hk2.external:javax.inject": "", + "org.glassfish.hk2:hk2-api": "", + "org.glassfish.hk2:hk2-locator": "", + "org.glassfish.hk2:hk2-utils": "", + "org.glassfish.jaxb:jaxb-runtime": "", + "org.glassfish.jersey.bundles.repackaged:jersey-guava": "", + "org.glassfish.jersey.core:jersey-client": "", + "org.glassfish.jersey.core:jersey-common": "", + "org.glassfish.jersey.ext:jersey-proxy-client": "", + "org.glassfish.jersey.media:jersey-media-multipart": "", + "org.javassist:javassist": "", + "org.jvnet.mimepull:mimepull": "", + "org.mozilla:rhino": "", + "org.reflections:reflections": "", + "org.slf4j:slf4j-api": "", + "org.slf4j:slf4j-log4j12": "", + "xpp3:xpp3": "" }, - "com.sun.xml.stream.buffer:streambuffer": "javax/jaxws/ext", - "com.sun.xml.ws:jaxws-rt": "javax/jaxws", - "com.sun.xml.ws:jaxws-tools": "javax/jaxws", - "com.sun.xml.ws:policy": "javax/jaxws/ext", - "com.thoughtworks.xstream:xstream": "", - "com.typesafe.netty:netty-reactive-streams": "aws/ext/netty", - "com.typesafe.netty:netty-reactive-streams-http": "aws/ext/netty", - "com.zaxxer:HikariCP": "", - "commons-beanutils:commons-beanutils": "commons", - "commons-cli:commons-cli": "commons", - "commons-codec:commons-codec": "commons", - "commons-collections:commons-collections": "commons", - "commons-dbutils:commons-dbutils": "commons", - "commons-el:commons-el": "commons", - "commons-fileupload:commons-fileupload": "commons", - "commons-httpclient:commons-httpclient": "commons", - "commons-io:commons-io": "commons", - "commons-jxpath:commons-jxpath": "commons", - "commons-logging:commons-logging": "commons", - "commons-net:commons-net": "commons", - "de.odysseus.staxon:staxon": "", - "io.github.classgraph:classgraph": "", - "io.netty:netty-buffer": "aws/ext/netty", - "io.netty:netty-codec": "aws/ext/netty", - "io.netty:netty-codec-http": "aws/ext/netty", - "io.netty:netty-codec-http2": "aws/ext/netty", - "io.netty:netty-common": "aws/ext/netty", - "io.netty:netty-handler": "aws/ext/netty", - "io.netty:netty-resolver": "aws/ext/netty", - "io.netty:netty-transport": "aws/ext/netty", - "io.netty:netty-transport-native-epoll": "aws/ext/netty", - "io.netty:netty-transport-native-unix-common": "aws/ext/netty", - "io.swagger.core.v3:swagger-annotations": "swagger", - "io.swagger.core.v3:swagger-core": "swagger", - "io.swagger.core.v3:swagger-integration": "swagger", - "io.swagger.core.v3:swagger-jaxrs2": "swagger", - "io.swagger.core.v3:swagger-jaxrs2-servlet-initializer": "swagger", - "io.swagger.core.v3:swagger-models": "swagger", - "javax.activation:javax.activation-api": "javax", - "javax.annotation:javax.annotation-api": "javax", - "javax.json:javax.json-api": "javax", - "javax.jws:jsr181-api": { - "dir": "javax/jaxws/ext", - "file": "jsr181-api-1.0.jar" + "donkey": { + "com.google.code.findbugs:jsr305": "guava", + "com.google.errorprone:error_prone_annotations": "guava", + "com.google.guava:failureaccess": "guava", + "com.google.guava:guava": "guava", + "com.google.guava:listenablefuture": "guava", + "com.google.inject:guice": "", + "com.google.j2objc:j2objc-annotations": "guava", + "com.microsoft.sqlserver:mssql-jdbc": "database", + "com.mysql:mysql-connector-j": "database", + "com.oracle.database.jdbc:ojdbc8": "database", + "com.thoughtworks.xstream:xstream": "xstream", + "com.zaxxer:HikariCP": "", + "commons-beanutils:commons-beanutils": "commons", + "commons-codec:commons-codec": "commons", + "commons-dbutils:commons-dbutils": "commons", + "commons-io:commons-io": "commons", + "commons-logging:commons-logging": "commons", + "org.apache.commons:commons-collections4": "commons", + "org.apache.commons:commons-dbcp2": "commons", + "org.apache.commons:commons-lang3": "commons", + "org.apache.commons:commons-math3": "commons", + "org.apache.commons:commons-pool2": "commons", + "org.apache.commons:commons-text": "commons", + "org.apache.derby:derby": "database", + "org.apache.logging.log4j:log4j-1.2-api": "", + "org.apache.logging.log4j:log4j-api": "", + "org.apache.logging.log4j:log4j-core": "", + "org.checkerframework:checker-qual": "guava", + "org.javassist:javassist": "", + "org.postgresql:postgresql": "database", + "org.quartz-scheduler:quartz": "", + "org.slf4j:slf4j-api": "", + "org.slf4j:slf4j-log4j12": "", + "xpp3:xpp3": "xstream" }, - "javax.persistence:persistence-api": "jersey/ext", - "javax.servlet:javax.servlet-api": "javax", - "javax.validation:validation-api": "jersey/ext", - "javax.ws.rs:javax.ws.rs-api": "javax", - "javax.xml.bind:jaxb-api": "javax/jaxb", - "javax.xml.soap:javax.xml.soap-api": "javax/jaxws", - "javax.xml.ws:jaxws-api": "javax/jaxws", - "joda-time:joda-time": "", - "net.java.dev.jna:jna": "", - "net.java.dev.jna:jna-platform": "", - "org.apache.commons:commons-collections4": "commons", - "org.apache.commons:commons-compress": "commons", - "org.apache.commons:commons-configuration2": "commons", - "org.apache.commons:commons-dbcp2": "commons", - "org.apache.commons:commons-digester3": "commons", - "org.apache.commons:commons-email": "commons", - "org.apache.commons:commons-lang3": "commons", - "org.apache.commons:commons-math3": "commons", - "org.apache.commons:commons-pool2": "commons", - "org.apache.commons:commons-text": "commons", - "org.apache.commons:commons-vfs2": "commons", - "org.apache.derby:derby": "database", - "org.apache.derby:derbytools": "database", - "org.apache.geronimo.specs:geronimo-j2ee-management_1.1_spec": "jms", - "org.apache.geronimo.specs:geronimo-jms_1.1_spec": "jms", - "org.apache.httpcomponents:httpclient": "commons", - "org.apache.httpcomponents:httpcore": "commons", - "org.apache.httpcomponents:httpmime": "commons", - "org.apache.logging.log4j:log4j-1.2-api": "log4j", - "org.apache.logging.log4j:log4j-api": "log4j", - "org.apache.logging.log4j:log4j-core": "log4j", - "org.apache.taglibs:taglibs-standard-impl": { - "dir": "jetty/jsp", - "file": "org.apache.taglibs.taglibs-standard-impl-1.2.5.jar" + "generator": { + "commons-io:commons-io": "", + "org.apache.commons:commons-collections4": "", + "org.apache.commons:commons-lang3": "", + "org.apache.logging.log4j:log4j-1.2-api": "", + "org.apache.logging.log4j:log4j-api": "", + "org.apache.logging.log4j:log4j-core": "", + "org.apache.velocity:velocity-engine-core": "", + "org.slf4j:slf4j-api": "", + "org.slf4j:slf4j-log4j12": "" }, - "org.apache.taglibs:taglibs-standard-spec": { - "dir": "jetty/jsp", - "file": "org.apache.taglibs.taglibs-standard-spec-1.2.5.jar" + "server": { + "ca.uhn.hapi:hapi-base": "hapi", + "ca.uhn.hapi:hapi-structures-v21": "hapi", + "ca.uhn.hapi:hapi-structures-v22": "hapi", + "ca.uhn.hapi:hapi-structures-v23": "hapi", + "ca.uhn.hapi:hapi-structures-v231": "hapi", + "ca.uhn.hapi:hapi-structures-v24": "hapi", + "ca.uhn.hapi:hapi-structures-v25": "hapi", + "ca.uhn.hapi:hapi-structures-v251": "hapi", + "ca.uhn.hapi:hapi-structures-v26": "hapi", + "ca.uhn.hapi:hapi-structures-v27": "hapi", + "ca.uhn.hapi:hapi-structures-v28": "hapi", + "ca.uhn.hapi:hapi-structures-v281": "hapi", + "com.fasterxml.jackson.core:jackson-annotations": "jackson", + "com.fasterxml.jackson.core:jackson-core": "jackson", + "com.fasterxml.jackson.core:jackson-databind": "jackson", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": "jackson", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": "jackson", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": "jackson", + "com.github.mwiede:jsch": "", + "com.github.oshi:oshi-core": "", + "com.github.zafarkhaja:java-semver": "", + "com.google.inject:guice": "", + "com.microsoft.sqlserver:mssql-jdbc": "database", + "com.mysql:mysql-connector-j": "database", + "com.oracle.database.jdbc:ojdbc8": "database", + "com.sun.activation:jakarta.activation": "javax", + "com.sun.mail:jakarta.mail": "javax", + "com.sun.xml.fastinfoset:FastInfoset": "javax/jaxws/ext", + "com.sun.xml.messaging.saaj:saaj-impl": { + "dir": "javax/jaxws/ext", + "file": "saaj-impl-1.0.jar" + }, + "com.sun.xml.stream.buffer:streambuffer": "javax/jaxws/ext", + "com.sun.xml.ws:jaxws-rt": "javax/jaxws", + "com.sun.xml.ws:jaxws-tools": "javax/jaxws", + "com.sun.xml.ws:policy": "javax/jaxws/ext", + "com.thoughtworks.xstream:xstream": "", + "com.typesafe.netty:netty-reactive-streams": "aws/ext/netty", + "com.typesafe.netty:netty-reactive-streams-http": "aws/ext/netty", + "com.zaxxer:HikariCP": "", + "commons-beanutils:commons-beanutils": "commons", + "commons-cli:commons-cli": "commons", + "commons-codec:commons-codec": "commons", + "commons-collections:commons-collections": "commons", + "commons-dbutils:commons-dbutils": "commons", + "commons-el:commons-el": "commons", + "commons-fileupload:commons-fileupload": "commons", + "commons-httpclient:commons-httpclient": "commons", + "commons-io:commons-io": "commons", + "commons-jxpath:commons-jxpath": "commons", + "commons-logging:commons-logging": "commons", + "commons-net:commons-net": "commons", + "de.odysseus.staxon:staxon": "", + "io.github.classgraph:classgraph": "", + "io.netty:netty-buffer": "aws/ext/netty", + "io.netty:netty-codec": "aws/ext/netty", + "io.netty:netty-codec-http": "aws/ext/netty", + "io.netty:netty-codec-http2": "aws/ext/netty", + "io.netty:netty-common": "aws/ext/netty", + "io.netty:netty-handler": "aws/ext/netty", + "io.netty:netty-resolver": "aws/ext/netty", + "io.netty:netty-transport": "aws/ext/netty", + "io.netty:netty-transport-native-epoll": "aws/ext/netty", + "io.netty:netty-transport-native-unix-common": "aws/ext/netty", + "io.swagger.core.v3:swagger-annotations": "swagger", + "io.swagger.core.v3:swagger-core": "swagger", + "io.swagger.core.v3:swagger-integration": "swagger", + "io.swagger.core.v3:swagger-jaxrs2": "swagger", + "io.swagger.core.v3:swagger-jaxrs2-servlet-initializer": "swagger", + "io.swagger.core.v3:swagger-models": "swagger", + "javax.activation:javax.activation-api": "javax", + "javax.annotation:javax.annotation-api": "javax", + "javax.json:javax.json-api": "javax", + "javax.jws:jsr181-api": { + "dir": "javax/jaxws/ext", + "file": "jsr181-api-1.0.jar" + }, + "javax.persistence:persistence-api": "jersey/ext", + "javax.servlet:javax.servlet-api": "javax", + "javax.validation:validation-api": "jersey/ext", + "javax.ws.rs:javax.ws.rs-api": "javax", + "javax.xml.bind:jaxb-api": "javax/jaxb", + "javax.xml.soap:javax.xml.soap-api": "javax/jaxws", + "javax.xml.ws:jaxws-api": "javax/jaxws", + "joda-time:joda-time": "", + "net.java.dev.jna:jna": "", + "net.java.dev.jna:jna-platform": "", + "org.apache.commons:commons-collections4": "commons", + "org.apache.commons:commons-compress": "commons", + "org.apache.commons:commons-configuration2": "commons", + "org.apache.commons:commons-dbcp2": "commons", + "org.apache.commons:commons-digester3": "commons", + "org.apache.commons:commons-email": "commons", + "org.apache.commons:commons-lang3": "commons", + "org.apache.commons:commons-math3": "commons", + "org.apache.commons:commons-pool2": "commons", + "org.apache.commons:commons-text": "commons", + "org.apache.commons:commons-vfs2": "commons", + "org.apache.derby:derby": "database", + "org.apache.derby:derbytools": "database", + "org.apache.geronimo.specs:geronimo-j2ee-management_1.1_spec": "jms", + "org.apache.geronimo.specs:geronimo-jms_1.1_spec": "jms", + "org.apache.httpcomponents:httpclient": "commons", + "org.apache.httpcomponents:httpcore": "commons", + "org.apache.httpcomponents:httpmime": "commons", + "org.apache.logging.log4j:log4j-1.2-api": "log4j", + "org.apache.logging.log4j:log4j-api": "log4j", + "org.apache.logging.log4j:log4j-core": "log4j", + "org.apache.taglibs:taglibs-standard-impl": { + "dir": "jetty/jsp", + "file": "org.apache.taglibs.taglibs-standard-impl-1.2.5.jar" + }, + "org.apache.taglibs:taglibs-standard-spec": { + "dir": "jetty/jsp", + "file": "org.apache.taglibs.taglibs-standard-spec-1.2.5.jar" + }, + "org.apache.velocity.tools:velocity-tools-generic": "", + "org.apache.velocity:velocity-engine-core": "", + "org.bouncycastle:bcpkix-jdk18on": "", + "org.bouncycastle:bcprov-jdk18on": "", + "org.bouncycastle:bcutil-jdk18on": "", + "org.eclipse.jdt:ecj": { + "dir": "jetty/jsp", + "file": "org.eclipse.jdt.ecj-3.19.0.jar" + }, + "org.eclipse.jetty.toolchain:jetty-schemas": "jetty", + "org.eclipse.jetty:apache-jsp": "jetty/jsp", + "org.eclipse.jetty:jetty-annotations": "jetty", + "org.eclipse.jetty:jetty-continuation": "jetty", + "org.eclipse.jetty:jetty-http": "jetty", + "org.eclipse.jetty:jetty-io": "jetty", + "org.eclipse.jetty:jetty-jndi": "jetty", + "org.eclipse.jetty:jetty-plus": "jetty", + "org.eclipse.jetty:jetty-rewrite": "jetty", + "org.eclipse.jetty:jetty-security": "jetty", + "org.eclipse.jetty:jetty-server": "jetty", + "org.eclipse.jetty:jetty-servlet": "jetty", + "org.eclipse.jetty:jetty-util": "jetty", + "org.eclipse.jetty:jetty-util-ajax": "jetty", + "org.eclipse.jetty:jetty-webapp": "jetty", + "org.eclipse.jetty:jetty-xml": "jetty", + "org.glassfish.external:management-api": { + "dir": "javax/jaxws/ext", + "file": "management-api-3.2.1.b001.jar" + }, + "org.glassfish.gmbal:gmbal-api-only": { + "dir": "javax/jaxws/ext", + "file": "gmbal-api-only-3.1.0.b001.jar" + }, + "org.glassfish.ha:ha-api": "javax/jaxws/ext", + "org.glassfish.hk2.external:aopalliance-repackaged": "jersey/ext", + "org.glassfish.hk2.external:javax.inject": "javax", + "org.glassfish.hk2:hk2-api": "jersey/ext", + "org.glassfish.hk2:hk2-locator": "jersey/ext", + "org.glassfish.hk2:hk2-utils": "jersey/ext", + "org.glassfish.hk2:osgi-resource-locator": "jersey/ext", + "org.glassfish.jaxb:jaxb-runtime": "javax/jaxb", + "org.glassfish.jaxb:txw2": "javax/jaxb/ext", + "org.glassfish.jersey.bundles.repackaged:jersey-guava": "jersey", + "org.glassfish.jersey.containers:jersey-container-jetty-http": "jersey", + "org.glassfish.jersey.containers:jersey-container-jetty-servlet": "jersey", + "org.glassfish.jersey.containers:jersey-container-servlet": "jersey", + "org.glassfish.jersey.containers:jersey-container-servlet-core": "jersey", + "org.glassfish.jersey.core:jersey-client": "jersey", + "org.glassfish.jersey.core:jersey-common": "jersey", + "org.glassfish.jersey.core:jersey-server": "jersey", + "org.glassfish.jersey.ext:jersey-proxy-client": "jersey", + "org.glassfish.jersey.media:jersey-media-jaxb": "jersey", + "org.glassfish.jersey.media:jersey-media-multipart": "jersey", + "org.glassfish:javax.json": "javax", + "org.javassist:javassist": "", + "org.jdom:jdom2": "", + "org.jvnet.mimepull:mimepull": "javax/jaxws/ext", + "org.jvnet.staxex:stax-ex": "javax/jaxws/ext", + "org.mortbay.jasper:apache-el": { + "dir": "jetty/jsp", + "file": "org.mortbay.jasper.apache-el-8.5.70.jar" + }, + "org.mortbay.jasper:apache-jsp": { + "dir": "jetty/jsp", + "file": "org.mortbay.jasper.apache-jsp-8.5.70.jar" + }, + "org.mozilla:rhino": "", + "org.mybatis:mybatis": "", + "org.osgi:org.osgi.core": "jersey/ext", + "org.ow2.asm:asm": "jersey/ext", + "org.ow2.asm:asm-analysis": "jersey/ext", + "org.ow2.asm:asm-commons": "jersey/ext", + "org.ow2.asm:asm-tree": "jersey/ext", + "org.ow2.asm:asm-util": "jersey/ext", + "org.postgresql:postgresql": "database", + "org.quartz-scheduler:quartz": "", + "org.reactivestreams:reactive-streams": "aws/ext", + "org.reflections:reflections": "swagger/ext", + "org.yaml:snakeyaml": "jackson", + "software.amazon.awssdk:annotations": "aws", + "software.amazon.awssdk:apache-client": "aws", + "software.amazon.awssdk:auth": "aws", + "software.amazon.awssdk:aws-core": "aws", + "software.amazon.awssdk:aws-json-protocol": "aws", + "software.amazon.awssdk:aws-query-protocol": "aws", + "software.amazon.awssdk:aws-xml-protocol": "aws", + "software.amazon.awssdk:http-client-spi": "aws", + "software.amazon.awssdk:kms": "aws", + "software.amazon.awssdk:metrics-spi": "aws", + "software.amazon.awssdk:netty-nio-client": "aws/ext/netty", + "software.amazon.awssdk:profiles": "aws", + "software.amazon.awssdk:protocol-core": "aws", + "software.amazon.awssdk:regions": "aws", + "software.amazon.awssdk:s3": "aws", + "software.amazon.awssdk:sdk-core": "aws", + "software.amazon.awssdk:sts": "aws", + "software.amazon.awssdk:utils": "aws", + "software.amazon.eventstream:eventstream": "aws", + "xpp3:xpp3": "" }, - "org.apache.velocity.tools:velocity-tools-generic": "", - "org.apache.velocity:velocity-engine-core": "", - "org.bouncycastle:bcpkix-jdk18on": "", - "org.bouncycastle:bcprov-jdk18on": "", - "org.bouncycastle:bcutil-jdk18on": "", - "org.eclipse.jdt:ecj": { - "dir": "jetty/jsp", - "file": "org.eclipse.jdt.ecj-3.19.0.jar" - }, - "org.eclipse.jetty.toolchain:jetty-schemas": "jetty", - "org.eclipse.jetty:apache-jsp": "jetty/jsp", - "org.eclipse.jetty:jetty-annotations": "jetty", - "org.eclipse.jetty:jetty-continuation": "jetty", - "org.eclipse.jetty:jetty-http": "jetty", - "org.eclipse.jetty:jetty-io": "jetty", - "org.eclipse.jetty:jetty-jndi": "jetty", - "org.eclipse.jetty:jetty-plus": "jetty", - "org.eclipse.jetty:jetty-rewrite": "jetty", - "org.eclipse.jetty:jetty-security": "jetty", - "org.eclipse.jetty:jetty-server": "jetty", - "org.eclipse.jetty:jetty-servlet": "jetty", - "org.eclipse.jetty:jetty-util": "jetty", - "org.eclipse.jetty:jetty-util-ajax": "jetty", - "org.eclipse.jetty:jetty-webapp": "jetty", - "org.eclipse.jetty:jetty-xml": "jetty", - "org.glassfish.external:management-api": { - "dir": "javax/jaxws/ext", - "file": "management-api-3.2.1.b001.jar" - }, - "org.glassfish.gmbal:gmbal-api-only": { - "dir": "javax/jaxws/ext", - "file": "gmbal-api-only-3.1.0.b001.jar" - }, - "org.glassfish.ha:ha-api": "javax/jaxws/ext", - "org.glassfish.hk2.external:aopalliance-repackaged": "jersey/ext", - "org.glassfish.hk2.external:javax.inject": "javax", - "org.glassfish.hk2:hk2-api": "jersey/ext", - "org.glassfish.hk2:hk2-locator": "jersey/ext", - "org.glassfish.hk2:hk2-utils": "jersey/ext", - "org.glassfish.hk2:osgi-resource-locator": "jersey/ext", - "org.glassfish.jaxb:jaxb-runtime": "javax/jaxb", - "org.glassfish.jaxb:txw2": "javax/jaxb/ext", - "org.glassfish.jersey.bundles.repackaged:jersey-guava": "jersey", - "org.glassfish.jersey.containers:jersey-container-jetty-http": "jersey", - "org.glassfish.jersey.containers:jersey-container-jetty-servlet": "jersey", - "org.glassfish.jersey.containers:jersey-container-servlet": "jersey", - "org.glassfish.jersey.containers:jersey-container-servlet-core": "jersey", - "org.glassfish.jersey.core:jersey-client": "jersey", - "org.glassfish.jersey.core:jersey-common": "jersey", - "org.glassfish.jersey.core:jersey-server": "jersey", - "org.glassfish.jersey.ext:jersey-proxy-client": "jersey", - "org.glassfish.jersey.media:jersey-media-jaxb": "jersey", - "org.glassfish.jersey.media:jersey-media-multipart": "jersey", - "org.glassfish:javax.json": "javax", - "org.javassist:javassist": "", - "org.jdom:jdom2": "", - "org.jvnet.mimepull:mimepull": "javax/jaxws/ext", - "org.jvnet.staxex:stax-ex": "javax/jaxws/ext", - "org.mortbay.jasper:apache-el": { - "dir": "jetty/jsp", - "file": "org.mortbay.jasper.apache-el-8.5.70.jar" - }, - "org.mortbay.jasper:apache-jsp": { - "dir": "jetty/jsp", - "file": "org.mortbay.jasper.apache-jsp-8.5.70.jar" - }, - "org.mozilla:rhino": "", - "org.mybatis:mybatis": "", - "org.osgi:org.osgi.core": "jersey/ext", - "org.ow2.asm:asm": "jersey/ext", - "org.ow2.asm:asm-analysis": "jersey/ext", - "org.ow2.asm:asm-commons": "jersey/ext", - "org.ow2.asm:asm-tree": "jersey/ext", - "org.ow2.asm:asm-util": "jersey/ext", - "org.postgresql:postgresql": "database", - "org.quartz-scheduler:quartz": "", - "org.reactivestreams:reactive-streams": "aws/ext", - "org.reflections:reflections": "swagger/ext", - "org.yaml:snakeyaml": "jackson", - "software.amazon.awssdk:annotations": "aws", - "software.amazon.awssdk:apache-client": "aws", - "software.amazon.awssdk:auth": "aws", - "software.amazon.awssdk:aws-core": "aws", - "software.amazon.awssdk:aws-json-protocol": "aws", - "software.amazon.awssdk:aws-query-protocol": "aws", - "software.amazon.awssdk:aws-xml-protocol": "aws", - "software.amazon.awssdk:http-client-spi": "aws", - "software.amazon.awssdk:kms": "aws", - "software.amazon.awssdk:metrics-spi": "aws", - "software.amazon.awssdk:netty-nio-client": "aws/ext/netty", - "software.amazon.awssdk:profiles": "aws", - "software.amazon.awssdk:protocol-core": "aws", - "software.amazon.awssdk:regions": "aws", - "software.amazon.awssdk:s3": "aws", - "software.amazon.awssdk:sdk-core": "aws", - "software.amazon.awssdk:sts": "aws", - "software.amazon.awssdk:utils": "aws", - "software.amazon.eventstream:eventstream": "aws", - "xpp3:xpp3": "" - }, - "server-extensions": { - "com.lowagie:itext": "extensions/doc", - "com.lowagie:itext-rtf": "extensions/doc", - "com.openhtmltopdf:openhtmltopdf-core": "extensions/doc", - "com.openhtmltopdf:openhtmltopdf-pdfbox": "extensions/doc", - "de.rototor.pdfbox:graphics2d": "extensions/doc", - "eu.agno3.jcifs:jcifs-ng": "extensions/file", - "gov.nih.imagej:imagej": { - "dir": "extensions/dicomviewer", - "file": "ij.jar" - }, - "org.apache.pdfbox:fontbox": "extensions/doc", - "org.apache.pdfbox:pdfbox": "extensions/doc", - "org.apache.pdfbox:xmpbox": "extensions/doc", - "org.xhtmlrenderer:flying-saucer-core": "extensions/doc", - "org.xhtmlrenderer:flying-saucer-pdf": "extensions/doc" - } -} \ No newline at end of file + "server-extensions": { + "com.lowagie:itext": "extensions/doc", + "com.lowagie:itext-rtf": "extensions/doc", + "com.openhtmltopdf:openhtmltopdf-core": "extensions/doc", + "com.openhtmltopdf:openhtmltopdf-pdfbox": "extensions/doc", + "de.rototor.pdfbox:graphics2d": "extensions/doc", + "eu.agno3.jcifs:jcifs-ng": "extensions/file", + "gov.nih.imagej:imagej": { + "dir": "extensions/dicomviewer", + "file": "ij.jar" + }, + "org.apache.pdfbox:fontbox": "extensions/doc", + "org.apache.pdfbox:pdfbox": "extensions/doc", + "org.apache.pdfbox:xmpbox": "extensions/doc", + "org.xhtmlrenderer:flying-saucer-core": "extensions/doc", + "org.xhtmlrenderer:flying-saucer-pdf": "extensions/doc" + } +} diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index e55208d267..c9bb98c060 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -5,33 +5,105 @@ false - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/lib/hapi/hapi-base-2.3.jar b/server/lib/hapi/hapi-base-2.3.jar deleted file mode 100644 index 4eab2e225d..0000000000 Binary files a/server/lib/hapi/hapi-base-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v21-2.3.jar b/server/lib/hapi/hapi-structures-v21-2.3.jar deleted file mode 100644 index 4cfcea8eea..0000000000 Binary files a/server/lib/hapi/hapi-structures-v21-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v22-2.3.jar b/server/lib/hapi/hapi-structures-v22-2.3.jar deleted file mode 100644 index 6da93b48a1..0000000000 Binary files a/server/lib/hapi/hapi-structures-v22-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v23-2.3.jar b/server/lib/hapi/hapi-structures-v23-2.3.jar deleted file mode 100644 index faa8f13af5..0000000000 Binary files a/server/lib/hapi/hapi-structures-v23-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v231-2.3.jar b/server/lib/hapi/hapi-structures-v231-2.3.jar deleted file mode 100644 index 6e6777579f..0000000000 Binary files a/server/lib/hapi/hapi-structures-v231-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v24-2.3.jar b/server/lib/hapi/hapi-structures-v24-2.3.jar deleted file mode 100644 index 8f9fdbeeff..0000000000 Binary files a/server/lib/hapi/hapi-structures-v24-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v25-2.3.jar b/server/lib/hapi/hapi-structures-v25-2.3.jar deleted file mode 100644 index c2806adff0..0000000000 Binary files a/server/lib/hapi/hapi-structures-v25-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v251-2.3.jar b/server/lib/hapi/hapi-structures-v251-2.3.jar deleted file mode 100644 index 06cac70c87..0000000000 Binary files a/server/lib/hapi/hapi-structures-v251-2.3.jar and /dev/null differ diff --git a/server/lib/hapi/hapi-structures-v26-2.3.jar b/server/lib/hapi/hapi-structures-v26-2.3.jar deleted file mode 100644 index 641730fe51..0000000000 Binary files a/server/lib/hapi/hapi-structures-v26-2.3.jar and /dev/null differ diff --git a/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/ER7Serializer.java b/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/ER7Serializer.java index 71e9a49b54..4907f88070 100644 --- a/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/ER7Serializer.java +++ b/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/ER7Serializer.java @@ -18,9 +18,12 @@ import java.util.Map; import java.util.regex.Pattern; +import javax.xml.parsers.DocumentBuilderFactory; + import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; @@ -37,6 +40,7 @@ import ca.uhn.hl7v2.DefaultHapiContext; import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.HapiContext; +import ca.uhn.hl7v2.model.GenericMessage; import ca.uhn.hl7v2.model.Message; import ca.uhn.hl7v2.parser.DefaultXMLParser; import ca.uhn.hl7v2.parser.ParserConfiguration; @@ -78,7 +82,7 @@ public ER7Serializer(SerializerProperties properties) { if (serializationProperties.isUseStrictParser()) { serializationPipeParser = new CustomPipeParser(context); - serializationXmlParser = new CustomDefaultXMLParser(context); + serializationXmlParser = new CustomDefaultXMLParser(context, serializationProperties.isAllowUnknownMessageTypes()); // turn off strict validation if needed if (!serializationProperties.isUseStrictValidation()) { @@ -97,7 +101,7 @@ public ER7Serializer(SerializerProperties properties) { if (deserializationProperties.isUseStrictParser()) { deserializationPipeParser = new CustomPipeParser(context); - deserializationXmlParser = new CustomDefaultXMLParser(context); + deserializationXmlParser = new CustomDefaultXMLParser(context, false); // turn off strict validation if needed if (!deserializationProperties.isUseStrictValidation()) { @@ -510,8 +514,11 @@ protected Message instantiateMessage(String theName, String theVersion, boolean private class CustomDefaultXMLParser extends DefaultXMLParser { - public CustomDefaultXMLParser(HapiContext context) { + private final boolean allowUnknownMessageTypes; + + public CustomDefaultXMLParser(HapiContext context, boolean allowUnknownMessageTypes) { super(context); + this.allowUnknownMessageTypes = allowUnknownMessageTypes; } @Override @@ -522,6 +529,50 @@ protected Message instantiateMessage(String theName, String theVersion, boolean return message; } + + /* + * HAPI 2.4 commented out the GenericMessage check in XMLParser.doEncode (upstream #20 and + * PR #21), so a message whose type has no generated structure class now encodes as + * instead of failing. A channel that rejects an unrecognised type today + * would silently start accepting it and hand the transformer a document no filter or step + * was written against, so reject it unless the channel opts in. + */ + @Override + protected String doEncode(Message source) throws HL7Exception { + if (!allowUnknownMessageTypes && source instanceof GenericMessage) { + throw new HL7Exception("Can't XML-encode a GenericMessage. Message must have a recognized structure."); + } + + return super.doEncode(source); + } + + /* + * Identical to HAPI 2.6.0's XMLUtils.parseDocument apart from setCoalescing(true). Without + * it the parser yields CDATA_SECTION nodes and XMLParser.parsePrimitive reads only text + * nodes, so a field written as CDATA loses its contents with no error. HAPI 2.3 did not + * produce those nodes because it parsed through an LSParser. Every other setting is copied + * from upstream so this does not relax the entity restrictions the 2.6.0 upgrade adds. + */ + @Override + protected synchronized Document parseStringIntoDocument(String xml) throws HL7Exception { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + factory.setCoalescing(true); + factory.setXIncludeAware(false); + factory.setExpandEntityReferences(false); + factory.setValidating(false); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false); + factory.setFeature("http://xml.org/sax/features/external-general-entities", false); + factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); + factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + + return factory.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); + } catch (Exception e) { + throw new HL7Exception("Exception parsing XML", e); + } + } } } diff --git a/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2SerializationProperties.java b/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2SerializationProperties.java index 3d788c5dff..e5bb626b4f 100644 --- a/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2SerializationProperties.java +++ b/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2SerializationProperties.java @@ -23,6 +23,7 @@ public class HL7v2SerializationProperties extends SerializationProperties { private boolean handleSubcomponents = true; private boolean useStrictParser = false; private boolean useStrictValidation = false; + private boolean allowUnknownMessageTypes = false; private boolean stripNamespaces = false; private String segmentDelimiter = "\\r"; private boolean convertLineBreaks = true; @@ -35,6 +36,7 @@ public Map getPropertyDescriptors() { properties.put("handleSubcomponents", new DataTypePropertyDescriptor(handleSubcomponents, "Parse Subcomponents", "Parse subcomponents (applies to Non-Strict Parser only).", PropertyEditorType.BOOLEAN)); properties.put("useStrictParser", new DataTypePropertyDescriptor(useStrictParser, "Use Strict Parser", "Parse messages based upon strict HL7 specifications.", PropertyEditorType.BOOLEAN)); properties.put("useStrictValidation", new DataTypePropertyDescriptor(useStrictValidation, "Validate in Strict Parser", "Validate messages using HL7 specifications (applies to Strict Parser only).", PropertyEditorType.BOOLEAN)); + properties.put("allowUnknownMessageTypes", new DataTypePropertyDescriptor(allowUnknownMessageTypes, "Allow Unrecognized Message Types", "Convert a message whose type has no known structure into generic XML instead of rejecting it (applies to Strict Parser only).", PropertyEditorType.BOOLEAN)); properties.put("stripNamespaces", new DataTypePropertyDescriptor(stripNamespaces, "Strip Namespaces", "Strips namespace definitions from the transformed XML message (applies to Strict Parser only).", PropertyEditorType.BOOLEAN)); properties.put("segmentDelimiter", new DataTypePropertyDescriptor(segmentDelimiter, "Segment Delimiter", "This is the input delimiter character(s) expected to occur after each segment.", PropertyEditorType.STRING)); properties.put("convertLineBreaks", new DataTypePropertyDescriptor(convertLineBreaks, "Convert Line Breaks", "Convert all styles of line breaks (CRLF, CR, LF) in the raw message to the segment delimiter. ", PropertyEditorType.BOOLEAN)); @@ -61,6 +63,10 @@ public void setProperties(Map properties) { this.useStrictValidation = (Boolean) properties.get("useStrictValidation"); } + if (properties.get("allowUnknownMessageTypes") != null) { + this.allowUnknownMessageTypes = (Boolean) properties.get("allowUnknownMessageTypes"); + } + if (properties.get("stripNamespaces") != null) { this.stripNamespaces = (Boolean) properties.get("stripNamespaces"); } @@ -107,6 +113,14 @@ public void setUseStrictValidation(boolean useStrictValidation) { this.useStrictValidation = useStrictValidation; } + public boolean isAllowUnknownMessageTypes() { + return allowUnknownMessageTypes; + } + + public void setAllowUnknownMessageTypes(boolean allowUnknownMessageTypes) { + this.allowUnknownMessageTypes = allowUnknownMessageTypes; + } + public boolean isStripNamespaces() { return stripNamespaces; } @@ -152,6 +166,7 @@ public Map getPurgedProperties() { purgedProperties.put("handleRepetitions", handleRepetitions); purgedProperties.put("handleSubcomponents", handleSubcomponents); purgedProperties.put("useStrictParser", useStrictParser); + purgedProperties.put("allowUnknownMessageTypes", allowUnknownMessageTypes); purgedProperties.put("stripNamespaces", stripNamespaces); purgedProperties.put("convertLineBreaks", convertLineBreaks); return purgedProperties; diff --git a/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/ER7SerializerXxeTest.java b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/ER7SerializerXxeTest.java new file mode 100644 index 0000000000..eb95c23c81 --- /dev/null +++ b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/ER7SerializerXxeTest.java @@ -0,0 +1,87 @@ +package com.mirth.connect.plugins.datatypes.hl7v2; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.File; + +import org.apache.commons.io.FileUtils; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.mirth.connect.donkey.model.message.MessageSerializerException; +import com.mirth.connect.model.datatype.SerializerProperties; + +/** + * XXE coverage for {@link ER7Serializer#fromXML(String)}. The lenient handler and the strict (HAPI) + * parser are independent code paths; ci/tests/205-hl7-xxe covers the strict one end to end. + * + * Every payload declares a dummy entity holding " xmlns=". fromXML injects a namespace into the + * first '>'-delimited chunk of the message when that chunk does not already contain one, and with a + * DOCTYPE present the chunk is an entity declaration rather than the root element. The injection + * then corrupts the declaration into malformed XML and the parser rejects the message for being + * malformed instead of for its external entity, which makes an XXE test pass for the wrong reason. + * The dummy entity satisfies the check so the payload reaches the parser intact. + */ +public class ER7SerializerXxeTest { + + private static File secret; + + @BeforeClass + public static void writeSecret() throws Exception { + secret = File.createTempFile("xxe", ".txt"); + secret.deleteOnExit(); + FileUtils.write(secret, "canary", UTF_8); + } + + @Test + public void lenientParserDoesNotResolveExternalEntity() { + assertExternalEntityNotResolved(false, false); + } + + @Test + public void strictParserDoesNotResolveExternalEntity() { + assertExternalEntityNotResolved(true, false); + } + + @Test + public void strictValidatingParserDoesNotResolveExternalEntity() { + assertExternalEntityNotResolved(true, true); + } + + /** Guards the payload shape, so the tests above exercise a message the parser really reads. */ + @Test + public void strictParserAcceptsDoctypeWithoutExternalEntity() throws Exception { + assertTrue(serializer(true, false).fromXML(message("", "asdf")).contains("asdf")); + } + + /** Dropping the entity and rejecting the message are both fine; leaking the file is not. */ + private static void assertExternalEntityNotResolved(boolean strictParser, boolean strictValidation) { + String xml = message("", "&xxe;"); + String outcome; + + try { + outcome = serializer(strictParser, strictValidation).fromXML(xml); + } catch (MessageSerializerException e) { + outcome = String.valueOf(e); + } + + assertFalse(outcome, outcome.contains("canary")); + } + + private static ER7Serializer serializer(boolean strictParser, boolean strictValidation) { + HL7v2DeserializationProperties properties = new HL7v2DeserializationProperties(); + properties.setUseStrictParser(strictParser); + properties.setUseStrictValidation(strictValidation); + return new ER7Serializer(new SerializerProperties(new HL7v2SerializationProperties(), properties, null)); + } + + private static String message(String entityDeclaration, String sendingApplication) { + return "\n " + entityDeclaration + " ]>\n" + + "|^~\\&" + + "" + sendingApplication + "ACK" + + "12.4" + + "AA1"; + } +} diff --git a/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/Hl7v2CdataTest.java b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/Hl7v2CdataTest.java new file mode 100644 index 0000000000..1b6fb0e22b --- /dev/null +++ b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/Hl7v2CdataTest.java @@ -0,0 +1,86 @@ +package com.mirth.connect.plugins.datatypes.hl7v2; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com.mirth.connect.model.datatype.SerializerProperties; + +/** + * A field written as CDATA must keep its contents. + * + *

+ * HAPI 2.6.0's {@code XMLUtils.parseDocument} builds its factory without coalescing, so the parser + * hands back CDATA_SECTION nodes, and {@code XMLParser.parsePrimitive} has only ever read text + * nodes. The content is then dropped with no error. HAPI 2.3 did not produce those nodes because it + * parsed through an {@code LSParser}, which is why this only appears after the upgrade. + * + *

+ * Both shapes are covered, a field that is entirely CDATA and one that mixes CDATA with ordinary + * text, on each strict path that reaches the parser: {@code fromXML} with validation off and on, + * and {@code toXML}, which only parses XML input when validation is also on. + */ +public class Hl7v2CdataTest { + + private static final String PURE_CDATA = message(""); + private static final String MIXED_CDATA = message("beforeafter"); + + @Test + public void fromXmlKeepsPureCdata() throws Exception { + assertKeeps("clinical", serializer(false).fromXML(PURE_CDATA)); + } + + @Test + public void fromXmlKeepsPureCdataWhenValidating() throws Exception { + assertKeeps("clinical", serializer(true).fromXML(PURE_CDATA)); + } + + @Test + public void fromXmlKeepsMixedCdata() throws Exception { + assertKeeps("beforeclinicalafter", serializer(false).fromXML(MIXED_CDATA)); + } + + @Test + public void fromXmlKeepsMixedCdataWhenValidating() throws Exception { + assertKeeps("beforeclinicalafter", serializer(true).fromXML(MIXED_CDATA)); + } + + /** toXML only parses XML input when strict validation is on; otherwise it passes it through. */ + @Test + public void toXmlKeepsPureCdataWhenValidating() throws Exception { + assertKeeps("clinical", serializer(true).toXML(PURE_CDATA)); + } + + @Test + public void toXmlKeepsMixedCdataWhenValidating() throws Exception { + assertKeeps("beforeclinicalafter", serializer(true).toXML(MIXED_CDATA)); + } + + private static void assertKeeps(String expected, String actual) { + assertTrue("expected MSH-3 to still hold '" + expected + "', got: " + actual, + actual.contains(expected)); + } + + /** MSH-3 carries the payload, so a dropped field is visible in the sending application. */ + private static String message(String sendingApplication) { + return "\n" + + "" + + "|^~\\&" + + "" + sendingApplication + "" + + "ADTA01ADT_A01" + + "MSGX2.4" + + "\n"; + } + + private static ER7Serializer serializer(boolean strictValidation) { + HL7v2SerializationProperties serialization = new HL7v2SerializationProperties(); + serialization.setUseStrictParser(true); + serialization.setUseStrictValidation(strictValidation); + + HL7v2DeserializationProperties deserialization = new HL7v2DeserializationProperties(); + deserialization.setUseStrictParser(true); + deserialization.setUseStrictValidation(strictValidation); + + return new ER7Serializer(new SerializerProperties(serialization, deserialization, null)); + } +} diff --git a/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/Hl7v2UnknownMessageTypeTest.java b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/Hl7v2UnknownMessageTypeTest.java new file mode 100644 index 0000000000..7002b1fc8b --- /dev/null +++ b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/Hl7v2UnknownMessageTypeTest.java @@ -0,0 +1,66 @@ +package com.mirth.connect.plugins.datatypes.hl7v2; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; + +import com.mirth.connect.donkey.model.message.MessageSerializerException; +import com.mirth.connect.model.datatype.SerializerProperties; + +/** + * A message type with no generated structure class parses into a HAPI {@code GenericMessage}. + * Through HAPI 2.3 the XML parser refused to encode one; 2.4 removed that refusal, so the same + * message now converts successfully and reaches the transformer as {@code }, + * which no existing filter or transformer step is written against. + * + *

+ * The engine keeps rejecting it by default so existing channels are unaffected, and exposes the + * newer behaviour behind "Allow Unrecognized Message Types" for anyone who wants it. + */ +public class Hl7v2UnknownMessageTypeTest { + + /** MSH-9 names a type no structure jar provides, so HAPI falls back to GenericMessage. */ + private static final String UNKNOWN_TYPE = + "MSH|^~\\&|SENDAPP|SENDFAC|RECVAPP|RECVFAC|20260101120000||XYZ^Q01^XYZ_Q01|MSG00001|P|2.4\r"; + + /** The same message shape with a type HAPI does have a structure for. */ + private static final String KNOWN_TYPE = + "MSH|^~\\&|SENDAPP|SENDFAC|RECVAPP|RECVFAC|20260101120000||ADT^A01^ADT_A01|MSG00002|P|2.4\r"; + + @Test + public void rejectsUnrecognizedMessageTypeByDefault() { + try { + serializer(false).toXML(UNKNOWN_TYPE); + fail("An unrecognized message type should be rejected unless the channel opts in"); + } catch (MessageSerializerException e) { + // expected + } + } + + @Test + public void encodesUnrecognizedMessageTypeWhenAllowed() throws Exception { + String xml = serializer(true).toXML(UNKNOWN_TYPE); + + assertTrue("expected a generic message document, got: " + xml, xml.contains("GenericMessage")); + assertTrue("the original message type should survive the conversion: " + xml, xml.contains("XYZ")); + } + + /** The option must not change anything for a type the parser does recognize. */ + @Test + public void recognizedMessageTypeIsUnaffectedEitherWay() throws Exception { + String rejecting = serializer(false).toXML(KNOWN_TYPE); + String allowing = serializer(true).toXML(KNOWN_TYPE); + + assertTrue("expected an ADT_A01 document, got: " + rejecting, rejecting.contains("ADT_A01")); + org.junit.Assert.assertEquals(rejecting, allowing); + } + + private static ER7Serializer serializer(boolean allowUnknownMessageTypes) { + HL7v2SerializationProperties serialization = new HL7v2SerializationProperties(); + serialization.setUseStrictParser(true); + serialization.setAllowUnknownMessageTypes(allowUnknownMessageTypes); + + return new ER7Serializer(new SerializerProperties(serialization, new HL7v2DeserializationProperties(), null)); + } +}