From ac63cc60af6299542500c1b8a997e825adf62739 Mon Sep 17 00:00:00 2001 From: Christian Pape Date: Tue, 18 Apr 2023 07:49:53 +0200 Subject: [PATCH] NMS-15498: Treat only ASCII characters between 32 and 127 as displayable --- core/snmp/api/pom.xml | 4 ++++ .../java/org/opennms/netmgt/snmp/AbstractSnmpValue.java | 8 ++++++++ .../org/opennms/netmgt/snmp/AbstractSnmpValueTest.java | 9 +++++++++ .../org/opennms/netmgt/snmp/joesnmp/JoeSnmpValue.java | 2 +- .../java/org/opennms/netmgt/snmp/snmp4j/Snmp4JValue.java | 2 +- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/core/snmp/api/pom.xml b/core/snmp/api/pom.xml index 4bf7b017e515..e81a8e6c11e3 100644 --- a/core/snmp/api/pom.xml +++ b/core/snmp/api/pom.xml @@ -29,6 +29,10 @@ + + commons-lang + commons-lang + org.slf4j slf4j-api diff --git a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java index a7dda226b72a..97b9d876bf45 100644 --- a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java +++ b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java @@ -28,8 +28,16 @@ package org.opennms.netmgt.snmp; +import java.nio.charset.Charset; + +import org.apache.commons.lang.StringUtils; + public abstract class AbstractSnmpValue implements SnmpValue { + public static boolean allBytesPlainAscii(final byte[] bytes) { + return StringUtils.isAsciiPrintable(new String(bytes, Charset.defaultCharset())); + } + public static boolean allBytesDisplayable(final byte[] bytes) { if (allBytesUTF_8(bytes)) { return true; diff --git a/core/snmp/api/src/test/java/org/opennms/netmgt/snmp/AbstractSnmpValueTest.java b/core/snmp/api/src/test/java/org/opennms/netmgt/snmp/AbstractSnmpValueTest.java index fc43e20c11ce..946c167c0588 100644 --- a/core/snmp/api/src/test/java/org/opennms/netmgt/snmp/AbstractSnmpValueTest.java +++ b/core/snmp/api/src/test/java/org/opennms/netmgt/snmp/AbstractSnmpValueTest.java @@ -28,6 +28,7 @@ package org.opennms.netmgt.snmp; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -110,6 +111,14 @@ public void testHighIso8859CharDisplayable() throws UnsupportedEncodingException assertTrue(new String(hexStringToBytes(highIso8859Char), "ISO-8859-1"), AbstractSnmpValue.allBytesDisplayable(hexStringToBytes(highIso8859Char))); } + @Test + public void testPlainAscii() { + for(char i = 0; i < 256; i++) { + final String string = "foo" + i + "bar"; + assertEquals(i > 31 && i < 127, AbstractSnmpValue.allBytesPlainAscii(string.getBytes())); + } + } + private static byte[] hexStringToBytes(String hexString) { assertTrue(hexString.length() % 2 == 0); byte[] retval = new byte[hexString.length() / 2]; diff --git a/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpValue.java b/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpValue.java index a2b361d281ed..fb7a6d93e895 100644 --- a/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpValue.java +++ b/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpValue.java @@ -293,7 +293,7 @@ public boolean isDisplayable() { return true; if (getType() == SnmpValue.SNMP_OCTET_STRING) { - return allBytesDisplayable(getBytes()); + return allBytesPlainAscii(getBytes()); } return false; diff --git a/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JValue.java b/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JValue.java index cef051f5e5b5..d8f1f4625f3b 100644 --- a/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JValue.java +++ b/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JValue.java @@ -306,7 +306,7 @@ public boolean isDisplayable() { } if (getType() == SnmpValue.SNMP_OCTET_STRING) { - return allBytesDisplayable(getBytes()); + return allBytesPlainAscii(getBytes()); } return false;