diff --git a/graylog-plugin-function-base64inflate/src/main/java/org/graylog/plugins/custom/Base64InflateFunction.java b/graylog-plugin-function-base64inflate/src/main/java/org/graylog/plugins/custom/Base64InflateFunction.java index 9bb618a..dac3bea 100644 --- a/graylog-plugin-function-base64inflate/src/main/java/org/graylog/plugins/custom/Base64InflateFunction.java +++ b/graylog-plugin-function-base64inflate/src/main/java/org/graylog/plugins/custom/Base64InflateFunction.java @@ -27,11 +27,14 @@ import org.graylog.plugins.pipelineprocessor.ast.functions.FunctionDescriptor; import org.graylog.plugins.pipelineprocessor.ast.functions.ParameterDescriptor; import java.io.ByteArrayInputStream; -import java.io.InputStreamReader; -import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Base64; -import java.util.zip.GZIPInputStream; +import java.util.zip.Inflater; +import java.util.zip.InflaterInputStream; +import java.net.URLDecoder; + // @Function(name = "Base64Inflate", description = "Decodes a URL-safe Base64-encoded and GZIP-compressed string") public class Base64InflateFunction extends AbstractFunction { @@ -57,21 +60,25 @@ public class Base64InflateFunction extends AbstractFunction { @Override public String evaluate(FunctionArgs args, EvaluationContext context) { final String input = inputParam.required(args, context); - try { - byte[] decoded = Base64.getUrlDecoder().decode(input); - try (GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(decoded)); - InputStreamReader isr = new InputStreamReader(gis, StandardCharsets.UTF_8); - BufferedReader br = new BufferedReader(isr)) { - StringBuilder out = new StringBuilder(); - String line; - while ((line = br.readLine()) != null) { - out.append(line); + try { + String urlDecoded = URLDecoder.decode(input, StandardCharsets.UTF_8.name()); + byte[] base64Decoded = Base64.getDecoder().decode(urlDecoded); + + try (InflaterInputStream inflater = new InflaterInputStream( + new ByteArrayInputStream(base64Decoded), new Inflater(true)); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + + byte[] buffer = new byte[1024]; + int len; + while ((len = inflater.read(buffer)) != -1) { + outputStream.write(buffer, 0, len); } - return out.toString(); + + return outputStream.toString(StandardCharsets.UTF_8.name()); } - } catch (Exception e) { - // You may choose to log this or return null + } catch (IOException | IllegalArgumentException e) { + e.printStackTrace(); return null; } } diff --git a/graylog-plugin-function-base64inflate/target/classes/org/graylog/plugins/custom/Base64InflateFunction.class b/graylog-plugin-function-base64inflate/target/classes/org/graylog/plugins/custom/Base64InflateFunction.class index 7321eec..05208f8 100644 Binary files a/graylog-plugin-function-base64inflate/target/classes/org/graylog/plugins/custom/Base64InflateFunction.class and b/graylog-plugin-function-base64inflate/target/classes/org/graylog/plugins/custom/Base64InflateFunction.class differ diff --git a/graylog-plugin-function-base64inflate/target/graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar b/graylog-plugin-function-base64inflate/target/graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar index 4fa9fb9..b9f441e 100644 Binary files a/graylog-plugin-function-base64inflate/target/graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar and b/graylog-plugin-function-base64inflate/target/graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar differ diff --git a/graylog-plugin-function-base64inflate/target/original-graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar b/graylog-plugin-function-base64inflate/target/original-graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar index 7eccf40..f82d40f 100644 Binary files a/graylog-plugin-function-base64inflate/target/original-graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar and b/graylog-plugin-function-base64inflate/target/original-graylog-plugin-function-base64inflate-1.0.0-SNAPSHOT.jar differ