From 811643a8c276273b3b1a06e4937219659af3ba78 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 26 Nov 2018 09:50:55 -0800 Subject: [PATCH] Fixed reading data: URL --- pulsar-broker-common/pom.xml | 6 +++ .../authentication/utils/AuthTokenUtils.java | 41 +++++-------------- .../client/api/url/DataURLStreamHandler.java | 28 ++++++++----- .../url/PulsarURLStreamHandlerFactory.java | 2 +- .../org/apache/pulsar/client/api/url/URL.java | 6 +-- 5 files changed, 38 insertions(+), 45 deletions(-) rename {pulsar-client => pulsar-common}/src/main/java/org/apache/pulsar/client/api/url/DataURLStreamHandler.java (80%) rename {pulsar-client => pulsar-common}/src/main/java/org/apache/pulsar/client/api/url/PulsarURLStreamHandlerFactory.java (95%) rename {pulsar-client => pulsar-common}/src/main/java/org/apache/pulsar/client/api/url/URL.java (88%) diff --git a/pulsar-broker-common/pom.xml b/pulsar-broker-common/pom.xml index 3651b802cc61f..e7031f33983d4 100644 --- a/pulsar-broker-common/pom.xml +++ b/pulsar-broker-common/pom.xml @@ -38,6 +38,12 @@ pulsar-zookeeper-utils ${project.version} + + + ${project.groupId} + pulsar-common + ${project.version} + com.google.guava diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/utils/AuthTokenUtils.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/utils/AuthTokenUtils.java index e5e198396283a..c9e8ee6a97388 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/utils/AuthTokenUtils.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/utils/AuthTokenUtils.java @@ -18,6 +18,8 @@ */ package org.apache.pulsar.broker.authentication.utils; +import com.google.common.io.ByteStreams; + import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @@ -26,9 +28,7 @@ import io.jsonwebtoken.security.Keys; import java.io.IOException; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Paths; +import java.io.InputStream; import java.security.Key; import java.security.KeyFactory; import java.security.PrivateKey; @@ -42,6 +42,8 @@ import lombok.experimental.UtilityClass; +import org.apache.pulsar.client.api.url.URL; + @UtilityClass public class AuthTokenUtils { @@ -90,39 +92,18 @@ public static String createToken(Key signingKey, String subject, Optional } public static byte[] readKeyFromUrl(String keyConfUrl) throws IOException { - if (keyConfUrl.startsWith("data:")) { - return readDataUrl(keyConfUrl); + if (keyConfUrl.startsWith("data:") || keyConfUrl.startsWith("file:")) { + try { + return ByteStreams.toByteArray((InputStream) new URL(keyConfUrl).getContent()); + } catch (Exception e) { + throw new IOException(e); + } } else if (keyConfUrl.startsWith("env:")) { String envVarName = keyConfUrl.substring("env:".length()); return Decoders.BASE64.decode(System.getenv(envVarName)); - } else if (keyConfUrl.startsWith("file:")) { - URI filePath = URI.create(keyConfUrl); - return Files.readAllBytes(Paths.get(filePath)); } else { // Assume the key content was passed in base64 return Decoders.BASE64.decode(keyConfUrl); } } - - private static byte[] readDataUrl(String data) throws IOException { - // Expected format is: - // data:[][;base64], - - // Ignore mediatype and only support base64 encoding - String[] parts = data.split(",", 2); - String header = parts[0]; - String encodedData = parts[1]; - - if (header.contains(";")) { - String encodingType = header.split(";")[1]; - if (!"base64".equals(encodingType)) { - throw new IOException("Data url encoding not supported: " + encodingType); - } - - return Decoders.BASE64.decode(encodedData); - } else { - // No encoding specified - return encodedData.getBytes(); - } - } } diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/api/url/DataURLStreamHandler.java b/pulsar-common/src/main/java/org/apache/pulsar/client/api/url/DataURLStreamHandler.java similarity index 80% rename from pulsar-client/src/main/java/org/apache/pulsar/client/api/url/DataURLStreamHandler.java rename to pulsar-common/src/main/java/org/apache/pulsar/client/api/url/DataURLStreamHandler.java index f4147cd027170..565c997c078c4 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/api/url/DataURLStreamHandler.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/client/api/url/DataURLStreamHandler.java @@ -33,12 +33,15 @@ public class DataURLStreamHandler extends URLStreamHandler { - class DataURLConnection extends URLConnection { + static class DataURLConnection extends URLConnection { private boolean parsed = false; private String contentType; - private String data; + private byte[] data; private URI uri; + private static final Pattern pattern = Pattern.compile( + "(?[^;,]+)?(;(?charset=[^;,]+))?(;(?base64))?,(?.+)", Pattern.DOTALL); + protected DataURLConnection(URL url) { super(url); try { @@ -57,20 +60,23 @@ public void connect() throws IOException { if (this.uri == null) { throw new IOException(); } - Pattern pattern = Pattern.compile( - "(?.+?)(;(?charset=.+?))?(;(?base64?))?,(?.+)", Pattern.DOTALL); + Matcher matcher = pattern.matcher(this.uri.getSchemeSpecificPart()); if (matcher.matches()) { this.contentType = matcher.group("mimeType"); - String charset = matcher.group("charset"); - if (charset == null) { - charset = "US-ASCII"; + if (contentType == null) { + this.contentType = "application/data"; } + + for (int i =0; i < matcher.groupCount(); i++) { + System.out.println("Group: " + matcher.group(i)); + } + if (matcher.group("base64") == null) { // Support Urlencode but not decode here because already decoded by URI class. - this.data = new String(matcher.group("data").getBytes(), charset); + this.data = matcher.group("data").getBytes(); } else { - this.data = new String(Base64.getDecoder().decode(matcher.group("data")), charset); + this.data = Base64.getDecoder().decode(matcher.group("data")); } } else { throw new MalformedURLException(); @@ -83,7 +89,7 @@ public long getContentLengthLong() { long length; try { this.connect(); - length = this.data.length(); + length = this.data.length; } catch (IOException e) { length = -1; } @@ -109,7 +115,7 @@ public String getContentEncoding() { public InputStream getInputStream() throws IOException { this.connect(); - return new ByteArrayInputStream(this.data.getBytes()); + return new ByteArrayInputStream(this.data); } } diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/api/url/PulsarURLStreamHandlerFactory.java b/pulsar-common/src/main/java/org/apache/pulsar/client/api/url/PulsarURLStreamHandlerFactory.java similarity index 95% rename from pulsar-client/src/main/java/org/apache/pulsar/client/api/url/PulsarURLStreamHandlerFactory.java rename to pulsar-common/src/main/java/org/apache/pulsar/client/api/url/PulsarURLStreamHandlerFactory.java index af7b668f611b9..b09d384c24248 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/api/url/PulsarURLStreamHandlerFactory.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/client/api/url/PulsarURLStreamHandlerFactory.java @@ -24,7 +24,7 @@ import java.util.Map; public class PulsarURLStreamHandlerFactory implements URLStreamHandlerFactory { - static Map> handlers; + private static final Map> handlers; static { handlers = new HashMap<>(); handlers.put("data", DataURLStreamHandler.class); diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/api/url/URL.java b/pulsar-common/src/main/java/org/apache/pulsar/client/api/url/URL.java similarity index 88% rename from pulsar-client/src/main/java/org/apache/pulsar/client/api/url/URL.java rename to pulsar-common/src/main/java/org/apache/pulsar/client/api/url/URL.java index 4d8c36745554e..e5246b76393dc 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/api/url/URL.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/client/api/url/URL.java @@ -26,8 +26,8 @@ import java.net.URLStreamHandlerFactory; public class URL { - private static URLStreamHandlerFactory urlStreamHandlerFactory = new PulsarURLStreamHandlerFactory(); - private java.net.URL url; + private static final URLStreamHandlerFactory urlStreamHandlerFactory = new PulsarURLStreamHandlerFactory(); + private final java.net.URL url; public URL(String spec) throws MalformedURLException, URISyntaxException, InstantiationException, IllegalAccessException { @@ -47,7 +47,7 @@ public Object getContent() throws IOException { return this.url.getContent(); } - public Object getContent(Class[] classes) throws IOException { + public Object getContent(Class[] classes) throws IOException { return this.url.getContent(classes); }