From 973d66a051cf2512e70be3d08a238070e19e4654 Mon Sep 17 00:00:00 2001 From: Vadim Shulkin Date: Thu, 8 May 2025 15:11:26 -0400 Subject: [PATCH] Added --- .../plugins/custom/Base64InflateFunction.java | 37 +++++++++++------- .../custom/Base64InflateFunction.class | Bin 4980 -> 5043 bytes ...-function-base64inflate-1.0.0-SNAPSHOT.jar | Bin 14159 -> 15042 bytes ...-function-base64inflate-1.0.0-SNAPSHOT.jar | Bin 11099 -> 11982 bytes 4 files changed, 22 insertions(+), 15 deletions(-) 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 7321eec8ba6cf4ae9c6fb8f7d6b454c5d19a4be5..05208f88886416d9e31e2bbdae97232a3e576683 100644 GIT binary patch delta 1820 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 delta 2835 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 Q5Cg;jPA&jYR)qTf7hmC}X8-^I 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 7eccf401a298e869ec2d4de5459748829b098fa3..f82d40f70415c70df4c0dff5995fd901b5500aa5 100644 GIT binary patch delta 2968 zcmYk8XH?T$7R5v89fCk;K3W2yw+y|AhzLj%qy#As5iwwbLVyVTrG+9z2?7?Xp-2+} z3B5N_kzSr;j=6OMvb6<2Y8mxY zG!6zllGmsAn-6i{e~$y-PqiPvp(;hlGnvpK)p8x(dU2IorEgsOCxOWzJ^RluZ;EB9 z?-=)2Cp3B#CK|Tke&E{@zw(z=qrd6=ks(`~l!c24jWyWe9#)z00Eat_+cJrT!-xC$ zXPCq%WOBXlwiVJ@_!xgf%nb6gk7Ef5hToKT%Gaz!kxFHykGX|33tb21G-vv{rF7hY zag)fO{_rPv6g)JJ#eiy-U2_Gfh?hn3F5hnO8;Q643C%H&*kyga63nkUW^;_M_d;19 zmxR_+Yt1@vp1*@4k&ua(Tj54_?RsUD`$kJt&1f;K%9xV+Zp?e0eUsH8tl~P4hE+1A z-T}MT6*MW2K5xQ2wPKKLs00-V%D&_S!{S%>@QKDq4oD4kxS2l^xn81GXKY z6tGy2hO3%L)Ma-j^_B*b;Ht|QTy}MX-$c>${2P^ZD$36 zC&=859OL!^r_+?9P2b@el@V7@6p-6^;db2%9^(aYGFK;0N3BW>QhWSt{xsrUEoz++ z5@VU>U8%2I6o>X8;-u7GcSp5mdOk>b@6h-B&3gR<43~y&q0b8M0}*8}CD;~;@YSO} zCGE=i=ih5DKV~4Oi(4Pb6p!Wj9~AyXMk<yX zyB2T-G!Ox1T%!a0u=%367~?>=Vng@i4)db6Sc9v^UzGi?-|&G?Ug6Q?UM>2n6%m}l zawt6Iw(2u(OIOv40AWb9&Bdv<5;*`#uOtlik#8b^h?~1YHr8dOfprdAfmB6J?snTF z^DPwb*2bDeIs2QZ8=GX2Y)n;I?bSjAT-|{yb$e0z%d2HmA6Dq5+EoR!?B;IW(DLGE z%kNZ$e6@po?#Ob+u0A<%PAW8`5(t>1+Te z&z3)cY%mK?lPn;Ztph>iG`;qXFZhGi)q;?{t&ItG8-$8Ge`d9^Pch5gcfhOJLtZhW ztfwPkE)m1_p zhJ*8Wi=uXhLn-o@JfzH<+}1rTa~B$Yn$)MV0a1_=w{~o|fAa+vA}?5Hq4J@LL7qE_ zkk@&NSKGBV#4oT2+9X`C4NGN`$;{#(=k8XD53-mc)%LyeWxnbceaTsT)eaMy2|rCi zvntM$w|s%7z8!$v6dK&rrzA_h=rJ&YVeMI#PVxW6rOC0gp`7sG=j*m>a&8GKJs-Ui zMlO@|qE~{z>KYjc^1{-PHQ^V35UZF@Txja4tmW`96&cpiD$*5v#5cZpBzr)`+dmP_GC9CbiQZu zJ|^=5rQ(F9{gl?qjFD+$COZ(%2m)1A(Xhm_aU%kYoIw9LFd`Ow5xDN|eP6-D$Nk~M zMB6C~o=eaZ22--UU4<1Fr`3fD;oH{S&mx&eY)#`My6_Zwff^6TiGH<)s;38%%>Y9!h+ZCXy9gZ$*l-(Lc?wbA`kPA8)uujLeg znEi!J;C}4m0`sXTWQhVsqxjyKNXtF5uhk)zB`@pxb>AzwKK()wDIOzcuSg zE5RmVuXg9j)KB4$*8EU>e9eV-$KRTnbnC zUQ%f%IoB#Bbb-JUy3ujt>s`zO=7kW_ps`3m^n&)toYA%4<*;qsQ)iu69ifb2+p*_E zS-9X(vqf6Ftv@r~5L$dVno=m0Da;Elj(rtb(if#R>2?^h7^)oIpxUhHPaXl1?Tcl8 zzv}XzPq|S;n)h?vWq&YqVWZS<+AjCLQ*>3B!z48%)&qAv!kR71Q2vw!Hn9iOex@~i zBc$7xOeyoi>%r}+o3GuET5OO8{T=qNhM1hXp#6h-4;2| zfA!~QA6SJLCZz#(y6p_Nq z`Ocn*(4B)sbe2{EXA2OMqyg}$An_9T0+ACcNYq8Joljzh5C$g+5xo&2=PC9qH3$)1 z1z^Na|GA$$s~nwI%!r0EGGGtkGiyU^J+sE}GiyoImW6Qef_OnLXHYvyoe%MEdRcV& delta 2152 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