This is an automated email from the ASF dual-hosted git repository.

pkarwasz pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/2.x by this push:
     new f592d2919b Improve validation for StringMatchFilter for null/empty 
text #3153 (#3158)
f592d2919b is described below

commit f592d2919bd52769846b582bf9aeb5e3e6e934f0
Author: JWT <[email protected]>
AuthorDate: Sun Nov 3 22:11:56 2024 +0100

    Improve validation for StringMatchFilter for null/empty text #3153 (#3158)
    
    Add improved validation in StringMatchFilter for null/empty text
    
    Co-authored-by: Jeff Thomas <[email protected]>
---
 .../log4j/core/filter/StringMatchFilterTest.java   | 88 ++++++++++++++++++++++
 .../log4j2-stringmatchfilter-3153-nok.xml          | 20 +++++
 .../resources/log4j2-stringmatchfilter-3153-ok.xml | 20 +++++
 .../log4j/core/filter/StringMatchFilter.java       | 13 +++-
 .../.2.x.x/3153_fix_StringMatchFilter_guardNPE.xml |  8 ++
 5 files changed, 146 insertions(+), 3 deletions(-)

diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/filter/StringMatchFilterTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/filter/StringMatchFilterTest.java
new file mode 100644
index 0000000000..0972279b07
--- /dev/null
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/filter/StringMatchFilterTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.logging.log4j.core.filter;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit test for {@link StringMatchFilter}.
+ */
+public class StringMatchFilterTest {
+
+    /**
+     * Test that if no match-string is set on the builder, the '{@link 
StringMatchFilter.Builder#build()}' returns
+     * {@code null}.
+     */
+    @Test
+    public void testFilterBuilderFailsWithNullText() {
+        Assertions.assertNull(StringMatchFilter.newBuilder().build());
+    }
+
+    /**
+     * Test that if a {@code null} string is set as a match-pattern, an {@code 
IllegalArgumentExeption} is thrown.
+     */
+    @Test
+    void testFilterBuilderFailsWithExceptionOnNullText() {
+        Assertions.assertThrows(IllegalArgumentException.class, () -> 
StringMatchFilter.newBuilder()
+                .setMatchString(null));
+    }
+
+    /**
+     * Test that if an empty ({@code ""}) string is set as a match-pattern, an 
{@code IllegalArgumentException} is thrown.
+     */
+    @Test
+    void testFilterBuilderFailsWithExceptionOnEmptyText() {
+        Assertions.assertThrows(IllegalArgumentException.class, () -> 
StringMatchFilter.newBuilder()
+                .setMatchString(""));
+    }
+
+    /**
+     * Test that if a {@link StringMatchFilter} is specified with a 'text' 
attribute it is correctly instantiated.
+     *
+     * @param configuration the configuration
+     */
+    @Test
+    @LoggerContextSource("log4j2-stringmatchfilter-3153-ok.xml")
+    void testConfigurationWithTextPOS(final Configuration configuration) {
+        final Filter filter = configuration.getFilter();
+        assertNotNull(filter, "The filter should not be null.");
+        assertInstanceOf(
+                StringMatchFilter.class, filter, "Expected a 
StringMatchFilter, but got: " + filter.getClass());
+        assertEquals("FooBar", filter.toString());
+    }
+
+    /**
+     * Test that if a {@link StringMatchFilter} is specified without a 'text' 
attribute it is not instantiated.
+     *
+     * @param configuration the configuration
+     */
+    @Test
+    @LoggerContextSource("log4j2-stringmatchfilter-3153-nok.xml")
+    void testConfigurationWithTextNEG(final Configuration configuration) {
+        final Filter filter = configuration.getFilter();
+        assertNull(filter, "The filter should be null.");
+    }
+}
diff --git 
a/log4j-core-test/src/test/resources/log4j2-stringmatchfilter-3153-nok.xml 
b/log4j-core-test/src/test/resources/log4j2-stringmatchfilter-3153-nok.xml
new file mode 100644
index 0000000000..8f3755a220
--- /dev/null
+++ b/log4j-core-test/src/test/resources/log4j2-stringmatchfilter-3153-nok.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to you under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<Configuration status="warn">
+   <StringMatchFfilter/>
+</Configuration>
diff --git 
a/log4j-core-test/src/test/resources/log4j2-stringmatchfilter-3153-ok.xml 
b/log4j-core-test/src/test/resources/log4j2-stringmatchfilter-3153-ok.xml
new file mode 100644
index 0000000000..1ac8c144af
--- /dev/null
+++ b/log4j-core-test/src/test/resources/log4j2-stringmatchfilter-3153-ok.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to you under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<Configuration status="warn">
+   <StringMatchFilter text="FooBar"/>
+</Configuration>
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java
index 96a91c1830..31de425866 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java
@@ -25,6 +25,8 @@ import org.apache.logging.log4j.core.config.Node;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.core.util.Assert;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 
@@ -41,7 +43,7 @@ public final class StringMatchFilter extends AbstractFilter {
 
     private StringMatchFilter(final String text, final Result onMatch, final 
Result onMismatch) {
         super(onMatch, onMismatch);
-        this.text = text;
+        this.text = Assert.requireNonEmpty(text, "text");
     }
 
     @Override
@@ -235,8 +237,10 @@ public final class StringMatchFilter extends 
AbstractFilter {
 
     public static class Builder extends 
AbstractFilterBuilder<StringMatchFilter.Builder>
             implements 
org.apache.logging.log4j.core.util.Builder<StringMatchFilter> {
+
         @PluginBuilderAttribute
-        private String text = "";
+        @Required(message = "No text provided for StringMatchFilter")
+        private String text;
 
         /**
          * Sets the text to search in event messages.
@@ -244,12 +248,15 @@ public final class StringMatchFilter extends 
AbstractFilter {
          * @return this instance.
          */
         public StringMatchFilter.Builder setMatchString(final String text) {
-            this.text = text;
+            this.text = Assert.requireNonEmpty(text, "The 'text' argument must 
not be null or empty.");
             return this;
         }
 
         @Override
         public StringMatchFilter build() {
+            if (!isValid()) {
+                return null;
+            }
             return new StringMatchFilter(this.text, this.getOnMatch(), 
this.getOnMismatch());
         }
     }
diff --git a/src/changelog/.2.x.x/3153_fix_StringMatchFilter_guardNPE.xml 
b/src/changelog/.2.x.x/3153_fix_StringMatchFilter_guardNPE.xml
new file mode 100644
index 0000000000..d84642c718
--- /dev/null
+++ b/src/changelog/.2.x.x/3153_fix_StringMatchFilter_guardNPE.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xmlns="https://logging.apache.org/xml/ns";
+       xsi:schemaLocation="https://logging.apache.org/xml/ns 
https://logging.apache.org/xml/ns/log4j-changelog-0.xsd";
+       type="changed">
+  <issue id="3153" 
link="https://github.com/apache/logging-log4j2/issues/3153"/>
+  <description format="asciidoc">Add improved validation to StringMatchFilter 
for null/empty text. GitHub issue #3153.</description>
+</entry>

Reply via email to