You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2007/01/03 18:11:00 UTC
svn commit: r492222 - in /james/server/sandbox/handlerapi-experiment: ./
src/java/org/apache/james/smtpserver/
src/java/org/apache/james/smtpserver/core/
src/java/org/apache/james/smtpserver/core/filter/fastfail/
src/java/org/apache/james/smtpserver/ho...
Author: norman
Date: Wed Jan 3 09:10:58 2007
New Revision: 492222
URL: http://svn.apache.org/viewvc?view=rev&rev=492222
Log:
Add HookResultHook to hook in on HookResult.
Use HookResultHook to implement JunkScoreHandler
Added:
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java (with props)
Removed:
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractJunkHandler.java
Modified:
james/server/sandbox/handlerapi-experiment/TODO
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java
Modified: james/server/sandbox/handlerapi-experiment/TODO
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/TODO?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/TODO (original)
+++ james/server/sandbox/handlerapi-experiment/TODO Wed Jan 3 09:10:58 2007
@@ -1,5 +1,4 @@
- Enable From/Sender and Date checks on message received
-- Find a way to handle the old JunkHandlerScore stuff
- Check DataCmdHandler for correct clean-up on every exceptions
- on Rcpt message reject, the original code was logging a lot of informations. Maybe we should change the Hook callers to do something similar (in RcptCmdHandler create a log string including context() call)
- RcptOptions: introduce a new extension points to have Handlers to declare support for given command options so that the syntax check can support them.
@@ -9,4 +8,5 @@
- Decide what to do with services and DI (logging and more).
- SenderAuthIdentifyVerificationRcptHook use session.getConfigurationData().isVerifyIdentity() to decide wether to enable itself or not: isn't it better to add the handler to the config and commenting/uncommenting the handler already do the trick? If so we shoudl simply remove that configuration and remove the check in the code.
- I would like to Merge HeloHook and EhloHook to a single hook. They are alternative and I think there is no need for both in the high-level api. less is more ;-)
- (currently we have a single handler implementing both hook and doing the same thing for both).
\ No newline at end of file
+ (currently we have a single handler implementing both hook and doing the same thing for both).
+- Let AuthCmdHandler and EhloCmdHandler handler HookResultHook too
\ No newline at end of file
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java Wed Jan 3 09:10:58 2007
@@ -32,6 +32,7 @@
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.james.smtpserver.core.CoreCmdHandlerLoader;
+import org.apache.james.smtpserver.core.SendMailHandler;
import java.util.Enumeration;
import java.util.Iterator;
@@ -122,6 +123,9 @@
}
}
}
+ // load the sendmail handler
+ // TODO: Should move this to an extra loader ?
+ loadClass(classLoader, SendMailHandler.class.getName(), addHandler(null, SendMailHandler.class.getName()));
}
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java Wed Jan 3 09:10:58 2007
@@ -25,6 +25,7 @@
import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.smtpserver.hook.HookResult;
+import org.apache.james.smtpserver.hook.HookResultHook;
import org.apache.james.smtpserver.hook.HookReturnCode;
import org.apache.james.util.mail.SMTPRetCode;
@@ -41,6 +42,7 @@
private List hooks;
+ private List rHooks;
/**
* Handle command processing
@@ -80,13 +82,20 @@
private SMTPResponse processHooks(SMTPSession session, String command,
String parameters) {
List hooks = getHooks();
-
if (hooks != null) {
int count = hooks.size();
for (int i = 0; i < count; i++) {
Object rawHook = hooks.get(i);
getLogger().debug("executing hook " + rawHook.getClass().getName());
- SMTPResponse res = callHook(rawHook, session, parameters);
+ HookResult hRes = callHook(rawHook, session, parameters);
+ if (rHooks != null) {
+ for (int i2 = 0; i2 < rHooks.size(); i2++) {
+ Object rHook = rHooks.get(i2);
+ getLogger().debug("executing hook " + rHook);
+ hRes = ((HookResultHook) rHook).onHookResult(session, hRes, rawHook);
+ }
+ }
+ SMTPResponse res = HookResultToSMTPResponse(hRes);
if (res != null) {
return res;
}
@@ -101,11 +110,21 @@
* @param rawHook the hook (to be casted)
* @param session the session
* @param parameters the parameters
- * @return the SMTPResponse, can be calculated using calcDefaultSMTPResponse.
+ * @return the HookResult, will be calculated using HookResultToSMTPResponse.
*/
- protected abstract SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters);
+ protected abstract HookResult callHook(Object rawHook, SMTPSession session, String parameters);
/**
+ * Convert the HookResult to SMTPResponse using default values. Should be override for using own values
+ *
+ * @param result
+ * @return
+ */
+ protected SMTPResponse HookResultToSMTPResponse(HookResult result) {
+ return calcDefaultSMTPResponse(result);
+ }
+
+ /**
* @param result
*/
public static SMTPResponse calcDefaultSMTPResponse(HookResult result) {
@@ -173,6 +192,7 @@
public List getMarkerInterfaces() {
List classes = new ArrayList(1);
classes.add(getHookInterface());
+ classes.add(HookResultHook.class);
return classes;
}
@@ -188,6 +208,8 @@
public void wireExtensions(Class interfaceName, List extension) {
if (getHookInterface().equals(interfaceName)) {
this.hooks = extension;
+ } else if (HookResultHook.class.equals(interfaceName)) {
+ this.rHooks = extension;
}
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java Wed Jan 3 09:10:58 2007
@@ -45,7 +45,7 @@
private final Object VRFYCMDHANDLER = VrfyCmdHandler.class.getName();
private final Object WELCOMEMESSAGEHANDLER = WelcomeMessageHandler.class.getName();
private final Object ADDDEFAULTATTRIBUTESHANDLER = AddDefaultAttributesMessageHook.class.getName();
- private final Object SENDMAILHANDLER = SendMailHandler.class.getName();
+ //private final Object SENDMAILHANDLER = SendMailHandler.class.getName();
private final Object USERSREPOSITORYAUTHHANDLER = UsersRepositoryAuthHook.class.getName();
private final Object POSTMASTERABUSEHOOK = PostmasterAbuseRcptHook.class.getName();
private final Object AUTHREQUIREDTORELAY = AuthRequiredToRelayRcptHook.class.getName();
@@ -60,7 +60,7 @@
// Insert the basecommands in the Map
commands.add(WELCOMEMESSAGEHANDLER);
commands.add(ADDDEFAULTATTRIBUTESHANDLER);
- commands.add(SENDMAILHANDLER);
+ //commands.add(SENDMAILHANDLER);
commands.add(AUTHCMDHANDLER);
commands.add(DATACMDHANDLER);
commands.add(EHLOCMDHANDLER);
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java Wed Jan 3 09:10:58 2007
@@ -36,6 +36,8 @@
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.smtpserver.SizeLimitedOutputStream;
import org.apache.james.smtpserver.WiringException;
+import org.apache.james.smtpserver.hook.HookResult;
+import org.apache.james.smtpserver.hook.HookResultHook;
import org.apache.james.smtpserver.hook.MessageHook;
import org.apache.james.util.mail.SMTPRetCode;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -61,7 +63,7 @@
public class DataCmdHandler
extends AbstractLogEnabled
implements CommandHandler, ExtensibleHandler {
-
+
private final class DataLineHandler implements LineHandler {
public void onLine(SMTPSession session, byte[] line) {
MimeMessageInputStreamSource mmiss = (MimeMessageInputStreamSource) session.getState().get(DATA_MIMEMESSAGE_STREAMSOURCE);
@@ -165,6 +167,8 @@
private List messageHandlers;
+ private List rHooks;
+
/**
* process DATA command
*
@@ -359,8 +363,9 @@
* @see org.apache.james.smtpserver.ExtensibleHandler#getMarkerInterfaces()
*/
public List getMarkerInterfaces() {
- List classes = new ArrayList(1);
+ List classes = new ArrayList(2);
classes.add(MessageHook.class);
+ classes.add(HookResultHook.class);
return classes;
}
@@ -380,6 +385,8 @@
}
throw new WiringException("No messageHandler configured");
}
+ } else if (HookResultHook.class.equals(interfaceName)) {
+ this.rHooks = extension;
}
}
@@ -389,10 +396,21 @@
private void processExtensions(SMTPSession session, Mail mail) {
if(mail != null && mail instanceof Mail && messageHandlers != null) {
try {
- getLogger().debug("executing message handlers");
int count = messageHandlers.size();
for(int i =0; i < count; i++) {
- SMTPResponse response = AbstractHookableCmdHandler.calcDefaultSMTPResponse(((MessageHook)messageHandlers.get(i)).onMessage(session, (Mail) mail));
+ Object rawHandler = messageHandlers.get(i);
+ getLogger().debug("executing message handler " + rawHandler);
+ HookResult hRes = ((MessageHook)rawHandler).onMessage(session, (Mail) mail);
+
+ if (rHooks != null) {
+ for (int i2 = 0; i2 < rHooks.size(); i2++) {
+ Object rHook = rHooks.get(i2);
+ getLogger().debug("executing hook " + rHook);
+ hRes = ((HookResultHook) rHook).onHookResult(session, hRes, rawHandler);
+ }
+ }
+
+ SMTPResponse response = AbstractHookableCmdHandler.calcDefaultSMTPResponse(hRes);
//if the response is received, stop processing of command handlers
if(response != null) {
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java Wed Jan 3 09:10:58 2007
@@ -23,6 +23,7 @@
import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.smtpserver.hook.EhloHook;
+import org.apache.james.smtpserver.hook.HookResult;
import org.apache.james.util.mail.SMTPRetCode;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -166,11 +167,12 @@
return EhloHook.class;
}
- /**
+ /*
+ * (non-Javadoc)
* @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
*/
- protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
- return calcDefaultSMTPResponse(((EhloHook) rawHook).doEhlo(session, parameters));
+ protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+ return ((EhloHook) rawHook).doEhlo(session, parameters);
}
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java Wed Jan 3 09:10:58 2007
@@ -23,6 +23,7 @@
import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.smtpserver.hook.HeloHook;
+import org.apache.james.smtpserver.hook.HookResult;
import org.apache.james.util.mail.SMTPRetCode;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -93,11 +94,12 @@
return HeloHook.class;
}
+
/**
* @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
*/
- protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
- return calcDefaultSMTPResponse(((HeloHook) rawHook).doHelo(session, parameters));
+ protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+ return ((HeloHook) rawHook).doHelo(session, parameters);
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java Wed Jan 3 09:10:58 2007
@@ -22,6 +22,7 @@
import org.apache.james.smtpserver.CommandHandler;
import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.HookResult;
import org.apache.james.smtpserver.hook.MailHook;
import org.apache.james.util.mail.SMTPRetCode;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -292,11 +293,12 @@
return MailHook.class;
}
+
/**
* @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
*/
- protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
- return calcDefaultSMTPResponse(((MailHook) rawHook).doMail(session,(MailAddress) session.getState().get(SMTPSession.SENDER)));
+ protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+ return ((MailHook) rawHook).doMail(session,(MailAddress) session.getState().get(SMTPSession.SENDER));
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java Wed Jan 3 09:10:58 2007
@@ -21,6 +21,7 @@
import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.HookResult;
import org.apache.james.smtpserver.hook.QuitHook;
import org.apache.james.util.mail.SMTPRetCode;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -106,8 +107,8 @@
/**
* @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
*/
- protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
- return calcDefaultSMTPResponse(((QuitHook) rawHook).doQuit(session));
+ protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+ return ((QuitHook) rawHook).doQuit(session);
}
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java Wed Jan 3 09:10:58 2007
@@ -22,6 +22,7 @@
import org.apache.james.smtpserver.CommandHandler;
import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.HookResult;
import org.apache.james.smtpserver.hook.RcptHook;
import org.apache.james.util.mail.SMTPRetCode;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -246,11 +247,11 @@
* @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object,
* org.apache.james.smtpserver.SMTPSession, java.lang.String)
*/
- protected SMTPResponse callHook(Object rawHook, SMTPSession session,
+ protected HookResult callHook(Object rawHook, SMTPSession session,
String parameters) {
- return calcDefaultSMTPResponse(((RcptHook) rawHook).doRcpt(session,
+ return ((RcptHook) rawHook).doRcpt(session,
(MailAddress) session.getState().get(SMTPSession.SENDER),
- (MailAddress) session.getState().get(CURRENT_RECIPIENT)));
+ (MailAddress) session.getState().get(CURRENT_RECIPIENT));
}
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java Wed Jan 3 09:10:58 2007
@@ -25,9 +25,9 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.smtpserver.hook.HookResult;
+import org.apache.james.smtpserver.hook.HookResultHook;
import org.apache.james.smtpserver.hook.HookReturnCode;
import org.apache.james.smtpserver.hook.MessageHook;
-import org.apache.james.util.junkscore.ComposedJunkScore;
import org.apache.james.util.junkscore.JunkScore;
import org.apache.james.util.junkscore.JunkScoreImpl;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -36,6 +36,7 @@
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -46,30 +47,53 @@
* -Compose action stores the junkScore values in the mail attributes
* -Header action create headers which holds the junkScore for each check
*/
-public class JunkScoreHandler extends AbstractLogEnabled implements MessageHook, Configurable {
+public class JunkScoreHandler extends AbstractLogEnabled implements HookResultHook, MessageHook, Configurable {
private double maxScore = 0;
private String action;
private static final String REJECT_ACTION = "reject";
- private static final String COMPOSE_ACTION = "compose";
private static final String HEADER_ACTION = "header";
+ private Map scoreMappings;
/**
* @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
*/
public void configure(Configuration arg0) throws ConfigurationException {
- Configuration maxScoreConfig = arg0.getChild("maxScore");
+ Configuration maxScoreConfig = arg0.getChild("maxScore",true);
if (maxScoreConfig != null) {
setMaxScore(maxScoreConfig.getValueAsDouble(0));
}
- Configuration actionConfig = arg0.getChild("action");
+ Configuration actionConfig = arg0.getChild("action",true);
if (actionConfig != null) {
setAction(actionConfig.getValue().toLowerCase());
} else {
throw new ConfigurationException("Please configure the action");
}
+ Configuration[] children = arg0.getChildren("mappings");
+
+ if (children != null) {
+ if (children.length != 0) {
+ scoreMappings = new HashMap(children.length);
+
+ for (int i = 0 ; i < children.length; i++) {
+ String args[] = children[i].getValue().split("=");
+
+ if (args.length == 2) {
+ scoreMappings.put(args[0], args[1]);
+ } else {
+ throw new ConfigurationException("Invalid mapping syntax use: className=score");
+ }
+ }
+ } else {
+ throw new ConfigurationException("Please configure at least one mapping");
+ }
+ }
+ }
+
+ public void setScoreMappings(Map scoreMappings) {
+ this.scoreMappings = scoreMappings;
}
/**
@@ -88,7 +112,7 @@
* @throws ConfigurationException if invalid action is used
*/
public void setAction(String action) throws ConfigurationException {
- if (!action.equals(REJECT_ACTION) && !action.equals(COMPOSE_ACTION) && !action.equals(HEADER_ACTION))
+ if (!action.equals(REJECT_ACTION) && !action.equals(HEADER_ACTION))
throw new ConfigurationException("Illegal action: " + action);
this.action = action;
@@ -98,27 +122,11 @@
* @see org.apache.james.smtpserver.hook.MessageHook#onMessage(org.apache.james.smtpserver.SMTPSession, org.apache.mailet.Mail)
*/
public HookResult onMessage(SMTPSession session, Mail mail) {
- return checkScore(session, mail);
- }
- /**
- * Check if the JunkScore limit is reached and perform the configured action
- *
- * @param session the SMTPSession
- */
- private HookResult checkScore(SMTPSession session, Mail mail) {
- JunkScore score1 = getLazyJunkScoreHandler(session.getConnectionState(),JunkScore.JUNK_SCORE_SESSION);
- JunkScore score2 = getLazyJunkScoreHandler(session.getState(),JunkScore.JUNK_SCORE);
-
- JunkScore composed = new ComposedJunkScore(score1,score2);
-
- if (action.equals(COMPOSE_ACTION)) {
- // Save the scores attribute to maybe use it later!
- mail.setAttribute(JunkScore.JUNK_SCORE_SESSION_ATTR, String.valueOf(score1.getCompleteStoredScores()));
- mail.setAttribute(JunkScore.JUNK_SCORE_ATTR, String.valueOf(score2.getCompleteStoredScores()));
- mail.setAttribute(JunkScore.JUNK_SCORE_COMPOSED_ATTR, String.valueOf(composed.getCompleteStoredScores()));
- } else if (action.equals(REJECT_ACTION)) {
- if (maxScore < composed.getCompleteStoredScores()) {
+ JunkScore junkScore = getJunkScore(session);
+
+ if (action.equals(REJECT_ACTION)) {
+ if (maxScore < junkScore.getCompleteStoredScores()) {
StringBuffer buffer = new StringBuffer(256).append(
"Rejected message from ").append(
@@ -126,9 +134,9 @@
.toString()).append(" from host ")
.append(session.getRemoteHost()).append(" (")
.append(session.getRemoteIPAddress()).append(
- "). This message reach the smap hits treshold. Required rejection hits: ")
+ "). This message reach the spam hits treshold. Required rejection hits: ")
.append(maxScore).append(" hits: ")
- .append(composed.getCompleteStoredScores());
+ .append(junkScore.getCompleteStoredScores());
getLogger().info(buffer.toString());
return new HookResult(HookReturnCode.DENY, DSNStatus.getStatus(DSNStatus.PERMANENT,
@@ -137,7 +145,7 @@
} else if (action.equals(HEADER_ACTION)) {
try {
MimeMessage message = mail.getMessage();
- Map scores = composed.getStoredScores();
+ Map scores = junkScore.getStoredScores();
Iterator itScores = scores.keySet().iterator();
StringBuffer header = new StringBuffer();
@@ -150,7 +158,7 @@
}
message.setHeader("X-JUNKSCORE", header.toString());
- message.setHeader("X-JUNKSCORE-COMPOSED", String.valueOf(composed.getCompleteStoredScores()));
+ message.setHeader("X-JUNKSCORE-COMPOSED", String.valueOf(junkScore.getCompleteStoredScores()));
} catch (MessagingException e) {
getLogger().info("Unable to add Junkscore to header: " + e.getMessage());
@@ -158,13 +166,37 @@
}
return new HookResult(HookReturnCode.DECLINED);
}
+
- public static JunkScore getLazyJunkScoreHandler(Map state, String key) {
- JunkScore score = (JunkScore) state.get(key);
+ private JunkScore getJunkScore(SMTPSession session) {
+ JunkScore score = (JunkScore) session.getState().get(JunkScore.JUNK_SCORE);
if (score == null) {
score = new JunkScoreImpl();
- state.put(key, score);
+ session.getState().put(JunkScore.JUNK_SCORE, score);
}
return score;
}
+
+ /**
+ * @see org.apache.james.smtpserver.hook.HookResultHook#onHookResult(org.apache.james.smtpserver.SMTPSession, org.apache.james.smtpserver.hook.HookResult, java.lang.Object)
+ */
+ public HookResult onHookResult(SMTPSession session, HookResult result, Object object) {
+ if (result.getResult() == HookReturnCode.DENY) {
+ String className = object.getClass().getName();
+
+ if (scoreMappings != null) {
+ String score = (String) scoreMappings.get(className);
+
+ if (score != null) {
+ getLogger().debug("Add JunkScore " + score + " for " + className);
+ getJunkScore(session).setStoredScore(className, Double.parseDouble(score));
+
+ return new HookResult(HookReturnCode.DECLINED);
+ }
+ }
+ }
+ return result;
+ }
+
+
}
Added: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java?view=auto&rev=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java (added)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java Wed Jan 3 09:10:58 2007
@@ -0,0 +1,28 @@
+/****************************************************************
+ * 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.james.smtpserver.hook;
+
+import org.apache.james.smtpserver.SMTPSession;
+
+public interface HookResultHook {
+
+ public HookResult onHookResult(SMTPSession session,HookResult result, Object object);
+}
Propchange: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java Wed Jan 3 09:10:58 2007
@@ -34,17 +34,11 @@
import org.apache.james.test.mock.avalon.MockLogger;
import org.apache.james.test.mock.javaxmail.MockMimeMessage;
import org.apache.james.test.mock.mailet.MockMail;
-import org.apache.james.util.junkscore.JunkScore;
import org.apache.mailet.Mail;
import junit.framework.TestCase;
public class JunkScoreHandlerTest extends TestCase {
- private String response = null;
- private final static String KEY1 = "KEY1";
- private final static String KEY2 = "KEY2";
- private final static double SCORE1 = 10.0;
- private final static double SCORE2 = 7.1;
private SMTPSession setupMockedSMTPSession() {
SMTPSession session = new AbstractSMTPSession() {
@@ -52,7 +46,7 @@
HashMap cState = new HashMap();
public Map getState() {
- state.put(SMTPSession.SENDER, "sender@localhost");
+ state.put(SMTPSession.SENDER, "sender@localhost");
return state;
}
@@ -96,39 +90,60 @@
}
public void testRejectAction() throws ConfigurationException {
-
+ Map mappings = new HashMap();
+ Object c = getDummyClass();
+ Object o = new Object().getClass();
+
+ mappings.put(c.getClass().getName(), "20.0");
+
SMTPSession session = setupMockedSMTPSession();
JunkScoreHandler handler = new JunkScoreHandler();
ContainerUtil.enableLogging(handler,new MockLogger());
-
+
handler.setAction("reject");
handler.setMaxScore(15.0);
Mail m = getMockMail();
handler.onMessage(session, m);
- assertNull("Not rejected",response);
- ((JunkScore) session.getState().get(JunkScore.JUNK_SCORE)).setStoredScore(KEY1, SCORE1);
- ((JunkScore) session.getConnectionState().get(JunkScore.JUNK_SCORE_SESSION)).setStoredScore(KEY2, SCORE2);
- HookResult response = handler.onMessage(session, m);
-
- assertEquals("Rejected",response.getResult(), HookReturnCode.DENY);
+ handler.setScoreMappings(mappings);
+
+ assertEquals("HookResult not changed", handler.onHookResult(session, new HookResult(HookReturnCode.DENY), o).getResult(), HookReturnCode.DENY);
+
+ assertEquals("HookResult changed", handler.onHookResult(session, new HookResult(HookReturnCode.DENY), c).getResult(), HookReturnCode.DECLINED);
+
+ assertEquals("Rejected", handler.onMessage(session, m).getResult(), HookReturnCode.DENY);
}
+
public void testHeaderAction() throws ConfigurationException, MessagingException {
+ Map mappings = new HashMap();
+ Object c = getDummyClass();
+
+ mappings.put(c.getClass().getName(), "20.0");
+
SMTPSession session = setupMockedSMTPSession();
JunkScoreHandler handler = new JunkScoreHandler();
ContainerUtil.enableLogging(handler,new MockLogger());
handler.setAction("header");
+ handler.setScoreMappings(mappings);
- JunkScoreHandler.getLazyJunkScoreHandler(session.getState(), JunkScore.JUNK_SCORE).setStoredScore(KEY1, SCORE1);
- JunkScoreHandler.getLazyJunkScoreHandler(session.getConnectionState(), JunkScore.JUNK_SCORE_SESSION).setStoredScore(KEY2, SCORE2);
Mail m = getMockMail();
- HookResult response = handler.onMessage(session,m);
+ assertEquals("HookResult changed", handler.onHookResult(session, new HookResult(HookReturnCode.DENY), c).getResult(), HookReturnCode.DECLINED);
+
+ assertEquals("Not rejected", handler.onMessage(session,m).getResult(),HookReturnCode.DECLINED);
MimeMessage message = m.getMessage();
assertNotNull("Header added",message.getHeader("X-JUNKSCORE")[0]);
- assertNotNull("Header added",message.getHeader("X-JUNKSCORE-COMPOSED")[0]);
- assertEquals("Not rejected", response.getResult(),HookReturnCode.DECLINED);
}
+
+
+ private DummyClass getDummyClass() {
+ return new DummyClass();
+ }
+
+ private class DummyClass{
+ // just a dummy class for testing
+ }
+
}
Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java Wed Jan 3 09:10:58 2007
@@ -1696,4 +1696,36 @@
assertEquals("Not reject emails to abuse"+ smtpProtocol.getReplyString(), 250, smtpProtocol
.getReplyCode());
}
+
+ public void testJunkScore() throws Exception {
+ m_testConfiguration.setAuthorizedAddresses("192.168.0.1/32");
+ m_testConfiguration.useRBL(true);
+ m_testConfiguration.useJunkScore(true);
+ finishSetUp(m_testConfiguration);
+
+ m_dnsServer.setLocalhostByName(InetAddress.getByName("127.0.0.1"));
+
+ SMTPClient smtpProtocol = new SMTPClient();
+ smtpProtocol.connect("127.0.0.1", m_smtpListenerPort);
+
+ smtpProtocol.sendCommand("ehlo", InetAddress.getLocalHost().toString());
+
+ String sender = "test_user_smtp@localhost";
+
+ smtpProtocol.setSender(sender);
+
+ smtpProtocol.addRecipient("mail@localhost");
+ assertEquals("not reject: "+smtpProtocol.getReplyString(), 250, smtpProtocol
+ .getReplyCode());
+
+ smtpProtocol.sendShortMessageData("Subject: test\r\n\r\nTest body testDNSRBLRejectWorks\r\n");
+ assertEquals("reject: "+smtpProtocol.getReplyString(), 554, smtpProtocol
+ .getReplyCode());
+
+ smtpProtocol.quit();
+
+ // mail was rejected by SMTPServer
+ assertNull("mail reject by mail server", m_mailServer
+ .getLastMail());
+ }
}
Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java Wed Jan 3 09:10:58 2007
@@ -25,6 +25,7 @@
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.james.smtpserver.core.CoreCmdHandlerLoader;
import org.apache.james.smtpserver.core.filter.fastfail.DNSRBLHandler;
+import org.apache.james.smtpserver.core.filter.fastfail.JunkScoreHandler;
import org.apache.james.smtpserver.core.filter.fastfail.MaxRcptHandler;
import org.apache.james.smtpserver.core.filter.fastfail.ResolvableEhloHeloHandler;
import org.apache.james.smtpserver.core.filter.fastfail.ReverseEqualsEhloHeloHandler;
@@ -50,6 +51,7 @@
private int m_maxRcpt = 0;
private boolean m_useRBL = false;
private boolean m_addressBracketsEnforcement = true;
+ private boolean m_useJunkScore = false;
public SMTPTestConfiguration(int smtpListenerPort) {
@@ -138,6 +140,10 @@
public void setAddressBracketsEnforcement(boolean addressBracketsEnforcement) {
this.m_addressBracketsEnforcement = addressBracketsEnforcement;
}
+
+ public void useJunkScore(boolean useJunkScore) {
+ this.m_useJunkScore = useJunkScore;
+ }
public void init() throws ConfigurationException {
@@ -207,6 +213,27 @@
d.addChild(Util.getValuedConfiguration("maxRcpt", m_maxRcpt + ""));
config.addChild(d);
}
+ if (m_useJunkScore) {
+ DefaultConfiguration handler = new DefaultConfiguration("handler");
+ handler.setAttribute("class", JunkScoreHandler.class.getName());
+
+ DefaultConfiguration mapping = new DefaultConfiguration("mappings");
+ mapping.setValue(DNSRBLHandler.class.getName() + "=" + "25.0");
+ handler.addChild(mapping);
+
+ DefaultConfiguration action = new DefaultConfiguration("action");
+ action.setValue("reject");
+ handler.addChild(action);
+
+ DefaultConfiguration score = new DefaultConfiguration("maxScore");
+ score.setValue("15.0");
+ handler.addChild(score);
+
+
+ config.addChild(handler);
+
+ }
+
config.addChild(createHandler(CoreCmdHandlerLoader.class.getName(),
null));
handlerConfig.addChild(config);
Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java Wed Jan 3 09:10:58 2007
@@ -158,7 +158,7 @@
}
public String getUser() {
- return null;
+ return null;
}
public int getRcptCount() {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org