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

juanpablo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git

commit 365319c11a82a9f30bcd6ac4b57f39af0929f5b3
Author: Juan Pablo Santos Rodríguez <[email protected]>
AuthorDate: Wed Sep 1 18:04:52 2021 +0200

    JSPWIKI-1143: Allow SpamFilter to exclude certain users/groups from checks
---
 .../main/java/org/apache/wiki/filters/SpamFilter.java   | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java 
b/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
index df170cb..c13e631 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
@@ -19,6 +19,7 @@
 package org.apache.wiki.filters;
 
 import net.sf.akismet.Akismet;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.StopWatch;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -66,9 +67,11 @@ import java.io.StringReader;
 import java.io.StringWriter;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Properties;
 import java.util.Random;
 import java.util.StringTokenizer;
@@ -161,6 +164,9 @@ public class SpamFilter extends BasePageFilter {
     
     /** The filter property name for specifying whether authenticated users 
should be ignored. Value is <tt>{@value}</tt>. */
     public static final String  PROP_IGNORE_AUTHENTICATED  = 
"ignoreauthenticated";
+
+    /** The filter property name for specifying groups allowed to bypass the 
spam filter. Value is <tt>{@value}</tt>. */
+    public static final String PROP_ALLOWED_GROUPS = 
"jspwiki.filters.spamfilter.allowedgroups";
     
     /** The filter property name for specifying which captcha technology 
should be used. Value is <tt>{@value}</tt>. */
     public static final String  PROP_CAPTCHA               = "captcha";
@@ -221,6 +227,9 @@ public class SpamFilter extends BasePageFilter {
     /** If set to true, will ignore anyone who is in Authenticated role. */
     private boolean         m_ignoreAuthenticated;
 
+    /** Groups allowed to bypass the filter */
+    private String[]         m_allowedGroups;
+
     private boolean         m_stopAtFirstMatch = true;
 
     private static String   c_hashName;
@@ -252,6 +261,7 @@ public class SpamFilter extends BasePageFilter {
         m_blacklist = properties.getProperty( PROP_BLACKLIST, m_blacklist );
 
         m_ignoreAuthenticated = TextUtil.getBooleanProperty( properties, 
PROP_IGNORE_AUTHENTICATED, m_ignoreAuthenticated );
+        m_allowedGroups = StringUtils.split( StringUtils.defaultString( 
properties.getProperty( PROP_ALLOWED_GROUPS, m_blacklist ) ), ',' );
 
         m_useCaptcha = properties.getProperty( PROP_CAPTCHA, "" 
).equals("asirra");
 
@@ -848,13 +858,18 @@ public class SpamFilter extends BasePageFilter {
      * Returns true, if this user should be ignored.  For example, admin users.
      *
      * @param context page context
-     * @return True, if this users should be ignored.
+     * @return True, if this user should be ignored.
      */
     private boolean ignoreThisUser( final Context context ) {
         if( context.hasAdminPermissions() ) {
             return true;
         }
 
+        final List< String > groups = Arrays.asList( m_allowedGroups );
+        if( Arrays.stream( context.getWikiSession().getRoles() ).anyMatch( 
role -> groups.contains( role.getName() ) ) ) {
+            return true;
+        }
+
         if( m_ignoreAuthenticated && 
context.getWikiSession().isAuthenticated() ) {
             return true;
         }

Reply via email to