Author: norman
Date: Sun May 14 03:12:22 2006
New Revision: 406304

URL: http://svn.apache.org/viewcvs?rev=406304&view=rev
Log:
-Add a findTXTRecord to the DNSServer
-Add new feature JAMES-492. 
-Add set methods to easy change settings in junit tests
-Add junit test for DNSRBLHandler

Added:
    
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
Modified:
    james/server/trunk/src/java/org/apache/james/dnsserver/DNSServer.java
    james/server/trunk/src/java/org/apache/james/services/DNSServer.java
    james/server/trunk/src/java/org/apache/james/smtpserver/DNSRBLHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
    james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java

Modified: james/server/trunk/src/java/org/apache/james/dnsserver/DNSServer.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/dnsserver/DNSServer.java?rev=406304&r1=406303&r2=406304&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/dnsserver/DNSServer.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/dnsserver/DNSServer.java Sun 
May 14 03:12:22 2006
@@ -38,6 +38,7 @@
 import org.xbill.DNS.RRset;
 import org.xbill.DNS.ResolverConfig;
 import org.xbill.DNS.SetResponse;
+import org.xbill.DNS.TXTRecord;
 import org.xbill.DNS.TextParseException;
 import org.xbill.DNS.Type;
 
@@ -532,5 +533,25 @@
      */
     public void dispose()
     {
-    } 
+    }
+    
+    /**
+     * @see org.apache.james.services.DNSServer#findTXTRecords(String)
+     */
+    public Collection findTXTRecords(String hostname){
+        List txtR = new ArrayList();
+        Record[] records;
+        
+        records = lookup(hostname, Type.TXT);
+    
+        if (records != null) {
+           for (int i = 0; i < records.length; i++) {
+               TXTRecord txt = (TXTRecord) records[i];
+               txtR.add(txt.rdataToString());
+           }
+        
+        }
+        return txtR;
+    }
+
 }

Modified: james/server/trunk/src/java/org/apache/james/services/DNSServer.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/services/DNSServer.java?rev=406304&r1=406303&r2=406304&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/services/DNSServer.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/services/DNSServer.java Sun 
May 14 03:12:22 2006
@@ -45,6 +45,14 @@
      */
     Collection findMXRecords(String hostname);
 
+    /**
+     * Get a collection of DNS TXT Records
+     * 
+     * @param hostname The hostname to check
+     * @return collection of strings representing TXT record values
+     */
+    Collection findTXTRecords(String hostname);
+
 
     /**
      * Performs DNS lookups as needed to find servers which should or might

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/DNSRBLHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/DNSRBLHandler.java?rev=406304&r1=406303&r2=406304&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/DNSRBLHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/DNSRBLHandler.java 
Sun May 14 03:12:22 2006
@@ -27,6 +27,7 @@
 import org.apache.james.services.DNSServer;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.StringTokenizer;
 
 /**
@@ -42,6 +43,8 @@
     private String[] blacklist;
     
     private DNSServer dnsServer = null;
+    
+    private boolean getDetail = false;
 
     /**
      * @see 
org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
@@ -61,7 +64,7 @@
                     }
                 }
                 if (rblserverCollection != null && rblserverCollection.size() 
> 0) {
-                    whitelist = (String[]) rblserverCollection.toArray(new 
String[rblserverCollection.size()]);
+                    setWhitelist((String[]) rblserverCollection.toArray(new 
String[rblserverCollection.size()]));
                     rblserverCollection.clear();
                 }
             }
@@ -75,11 +78,16 @@
                     }
                 }
                 if (rblserverCollection != null && rblserverCollection.size() 
> 0) {
-                    blacklist = (String[]) rblserverCollection.toArray(new 
String[rblserverCollection.size()]);
+                    setBlacklist((String[]) rblserverCollection.toArray(new 
String[rblserverCollection.size()]));
                     rblserverCollection.clear();
                 }
             }
         }
+        
+        Configuration configuration = 
handlerConfiguration.getChild("getDetail",false);
+        if(configuration != null) {
+           getDetail = configuration.getValueAsBoolean();
+        }
 
     }
 
@@ -87,7 +95,7 @@
      * @see 
org.apache.avalon.framework.service.Serviceable#service(ServiceManager)
      */
     public void service(ServiceManager serviceMan) throws ServiceException {
-        dnsServer = (DNSServer) serviceMan.lookup(DNSServer.ROLE);
+        setDNSServer((DNSServer) serviceMan.lookup(DNSServer.ROLE));
     }
     
     /*
@@ -99,7 +107,38 @@
         boolean blocklisted = checkDNSRBL(session, 
session.getRemoteIPAddress());
         session.setBlockListed(blocklisted);
     }
+    
+    /**
+     * Set the whitelist array
+     * @param whitelist The array which contains the whitelist
+     */
+    public void setWhitelist(String[] whitelist) {
+        this.whitelist = whitelist;
+    }
+    
+    /**
+     * Set the blacklist array
+     * @param blacklist The array which contains the blacklist
+     */
+    public void setBlacklist(String[] blacklist) {
+        this.blacklist = blacklist;
+    }
+    
+    /**
+     * Set the DNSServer
+     * @param dnsServer The DNSServer
+     */
+    public void setDNSServer(DNSServer dnsServer) {
+        this.dnsServer = dnsServer;
+    }
 
+    /**
+     * 
+     * @param getDetail
+     */
+    public void setGetDetail(boolean getDetail) {
+        this.getDetail = getDetail;
+    }
 
     /**
      * @see 
org.apache.james.smtpserver.SMTPHandlerConfigurationData#checkDNSRBL(Socket)
@@ -151,6 +190,17 @@
                     dnsServer.getByName(reversedOctets + rblList[i]);
                     if (getLogger().isInfoEnabled()) {
                         getLogger().info("Connection from " + ipAddress + " 
restricted by " + rblList[i] + " to SMTP AUTH/postmaster/abuse.");
+                    }
+                    
+                    // we should try to retrieve details
+                    if (getDetail) {
+                        Collection txt = 
dnsServer.findTXTRecords(reversedOctets + rblList[i]);
+                        
+                        // Check if we found a txt record
+                        if (!txt.isEmpty()) {
+                            // Set the detail
+                            
session.setBlockListedDetail(txt.iterator().next().toString());
+                        }
                     }
                     return true;
                 } catch (java.net.UnknownHostException uhe) {

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java?rev=406304&r1=406303&r2=406304&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java 
Sun May 14 03:12:22 2006
@@ -161,8 +161,13 @@
             if (session.isBlockListed() &&                                     
           // was found in the RBL
                 (!session.isRelayingAllowed() || (session.isAuthRequired() && 
session.getUser() == null)) &&  // Not an authorized IP or SMTP AUTH is enabled 
and not authenticated
                 !(recipientAddress.getUser().equalsIgnoreCase("postmaster") || 
recipientAddress.getUser().equalsIgnoreCase("abuse"))) {
+                
                 // trying to send e-mail to other than postmaster or abuse
-                responseString = "530 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Rejected: 
unauthenticated e-mail from " + session.getRemoteIPAddress() + " is restricted. 
 Contact the postmaster for details.";
+                if (session.getBlockListedDetail() != null) {
+                    responseString = "530 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" " + 
session.getBlockListedDetail();
+                } else {
+                    responseString = "530 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Rejected: 
unauthenticated e-mail from " + session.getRemoteIPAddress() + " is restricted. 
 Contact the postmaster for details.";
+                }
                 session.writeResponse(responseString);
                 return;
             }

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=406304&r1=406303&r2=406304&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
Sun May 14 03:12:22 2006
@@ -123,6 +123,11 @@
      * TEMPORARY: is the sending address blocklisted
      */
     private boolean blocklisted;
+    
+    /**
+     * The blocklisted detail
+     */
+    private String blocklistedDetail = null;
 
     /**
      * The id associated with this particular SMTP interaction.
@@ -423,6 +428,20 @@
      */
     public void setBlockListed(boolean blocklisted ) {
         this.blocklisted = blocklisted;
+    }
+    
+    /**
+     * @see org.apache.james.smtpserver.SMTPSession#getBlockListedDetail()
+     */
+    public String getBlockListedDetail() {
+        return blocklistedDetail;
+    }
+    
+    /**
+     * @see 
org.apache.james.smtpserver.SMTPSession#setBlockListedDetail(String)
+     */
+    public void setBlockListedDetail(String blocklistedDetail) {
+        this.blocklistedDetail = blocklistedDetail;
     }
 
     /**

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java?rev=406304&r1=406303&r2=406304&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
Sun May 14 03:12:22 2006
@@ -172,6 +172,20 @@
     boolean isBlockListed();
 
     /**
+     * Set the BlockListedDetail which will be used in responseString
+     * 
+     * @param detail The detail 
+     */
+    void setBlockListedDetail(String detail);
+    
+    /**
+     * Returns the BlockListedDetail
+     * 
+     * @return The BlockListedDetail
+     */
+    String getBlockListedDetail();
+    
+    /**
      * Returns whether Relaying is allowed or not
      *
      * @return the relaying status

Added: 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java?rev=406304&view=auto
==============================================================================
--- 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java 
(added)
+++ 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java 
Sun May 14 03:12:22 2006
@@ -0,0 +1,367 @@
+/***********************************************************************
+ * Copyright (c) 1999-2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.james.services.DNSServer;
+import org.apache.james.test.mock.avalon.MockLogger;
+import org.apache.james.util.watchdog.Watchdog;
+import org.apache.mailet.Mail;
+
+import junit.framework.TestCase;
+
+public class DNSRBLHandlerTest extends TestCase {
+
+    private DNSServer mockedDnsServer;
+
+    private SMTPSession mockedSMTPSession;
+
+    private String remoteIp = "127.0.0.2";
+
+    private boolean relaying = false;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        setupMockedDnsServer();
+        setRelayingAllowed(false);
+    }
+
+    /**
+     * Set the remoteIp
+     * 
+     * @param remoteIp The remoteIP to set
+     */
+    private void setRemoteIp(String remoteIp) {
+        this.remoteIp = remoteIp;
+    }
+
+    /**
+     * Set relayingAllowed
+     * 
+     * @param relaying true or false
+     */
+    private void setRelayingAllowed(boolean relaying) {
+        this.relaying = relaying;
+    }
+
+    /**
+     * Setup the mocked dnsserver
+     *
+     */
+    private void setupMockedDnsServer() {
+        mockedDnsServer = new DNSServer() {
+
+            public Collection findMXRecords(String hostname) {
+                throw new UnsupportedOperationException("Unimplemented in 
mock");
+            }
+
+            public Collection findTXTRecords(String hostname) {
+                List res = new ArrayList();
+                if (hostname == null) {
+                    return res;
+                }
+                ;
+                if ("2.0.0.127.bl.spamcop.net".equals(hostname)) {
+                    res
+                            .add("Blocked - see 
http://www.spamcop.net/bl.shtml?127.0.0.2";);
+                }
+                return res;
+            }
+
+            public Iterator getSMTPHostAddresses(String domainName) {
+                throw new UnsupportedOperationException("Unimplemented in 
mock");
+            }
+
+            public InetAddress[] getAllByName(String host)
+                    throws UnknownHostException {
+                throw new UnsupportedOperationException("Unimplemented in 
mock");
+            }
+
+            public InetAddress getByName(String host)
+                    throws UnknownHostException {
+                if ("2.0.0.127.bl.spamcop.net".equals(host)) {
+                    return InetAddress.getByName("127.0.0.1");
+                } else if ("3.0.0.127.bl.spamcop.net".equals(host)) {
+                    return InetAddress.getByName("127.0.0.1");
+                } else if ("192.168.0.1.bl.spamcop.net".equals(host)) {
+                    return InetAddress.getByName("fesdgaeg.deger");
+                }
+                return InetAddress.getByName(host);
+            }
+        };
+    }
+
+    /**
+     * Setup mocked smtpsession
+     */
+    private void setupMockedSMTPSession() {
+        mockedSMTPSession = new SMTPSession() {
+
+            private String blockListedDetail = null;
+
+            private boolean blocklisted = false;
+
+            public void writeResponse(String respString) {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String readCommandLine() throws IOException {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public StringBuffer getResponseBuffer() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String clearResponseBuffer() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public InputStream getInputStream() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getCommandName() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getCommandArgument() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public Mail getMail() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void setMail(Mail mail) {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getRemoteHost() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getRemoteIPAddress() {
+                return remoteIp;
+            }
+
+            public void abortMessage() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void endSession() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public boolean isSessionEnded() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public HashMap getState() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void resetState() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public SMTPHandlerConfigurationData getConfigurationData() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void setBlockListed(boolean blocklisted) {
+                this.blocklisted = blocklisted;
+            }
+
+            public boolean isBlockListed() {
+                return blocklisted;
+            }
+
+            public void setBlockListedDetail(String detail) {
+                this.blockListedDetail = detail;
+            }
+
+            public String getBlockListedDetail() {
+                return blockListedDetail;
+            }
+
+            public boolean isRelayingAllowed() {
+                return relaying;
+            }
+
+            public boolean isAuthRequired() {
+                return false;
+            }
+
+            public boolean useHeloEhloEnforcement() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getUser() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void setUser(String user) {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public Watchdog getWatchdog() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getSessionID() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+        };
+    }
+
+    // ip is blacklisted and has txt details
+    public void testDNSRBL1() {
+        DNSRBLHandler rbl = new DNSRBLHandler();
+
+        ContainerUtil.enableLogging(rbl, new MockLogger());
+
+        setupMockedSMTPSession();
+        rbl.setDNSServer(mockedDnsServer);
+
+        rbl.setBlacklist(new String[] { "bl.spamcop.net" });
+        rbl.setGetDetail(true);
+        rbl.onConnect(mockedSMTPSession);
+        assertEquals("Blocked - see http://www.spamcop.net/bl.shtml?127.0.0.2";,
+                mockedSMTPSession.getBlockListedDetail());
+        assertEquals(true, mockedSMTPSession.isBlockListed());
+    }
+
+    // ip is blacklisted and has txt details but we don'T want to retrieve the 
txt record
+    public void testDNSRBL2() {
+        DNSRBLHandler rbl = new DNSRBLHandler();
+
+        ContainerUtil.enableLogging(rbl, new MockLogger());
+
+        setupMockedSMTPSession();
+        rbl.setDNSServer(mockedDnsServer);
+
+        rbl.setBlacklist(new String[] { "bl.spamcop.net" });
+        rbl.setGetDetail(false);
+        rbl.onConnect(mockedSMTPSession);
+        assertEquals(null, mockedSMTPSession.getBlockListedDetail());
+        assertEquals(true, mockedSMTPSession.isBlockListed());
+    }
+
+    // ip is allowed to relay
+    public void testDNSRBL3() {
+        DNSRBLHandler rbl = new DNSRBLHandler();
+
+        ContainerUtil.enableLogging(rbl, new MockLogger());
+
+        setRelayingAllowed(true);
+        setupMockedSMTPSession();
+
+        rbl.setDNSServer(mockedDnsServer);
+
+        rbl.setBlacklist(new String[] { "bl.spamcop.net" });
+        rbl.setGetDetail(true);
+        rbl.onConnect(mockedSMTPSession);
+        assertEquals(null, mockedSMTPSession.getBlockListedDetail());
+        assertEquals(false, mockedSMTPSession.isBlockListed());
+    }
+
+    // ip not on blacklist
+    public void testDNSRBL4() {
+        DNSRBLHandler rbl = new DNSRBLHandler();
+
+        ContainerUtil.enableLogging(rbl, new MockLogger());
+        setRemoteIp("192.168.0.1");
+        setupMockedSMTPSession();
+
+        rbl.setDNSServer(mockedDnsServer);
+
+        rbl.setBlacklist(new String[] { "bl.spamcop.net" });
+        rbl.setGetDetail(true);
+        rbl.onConnect(mockedSMTPSession);
+        assertEquals(null, mockedSMTPSession.getBlockListedDetail());
+        assertEquals(false, mockedSMTPSession.isBlockListed());
+    }
+
+    // ip on blacklist without txt details
+    public void testDNSRBL5() {
+        DNSRBLHandler rbl = new DNSRBLHandler();
+
+        ContainerUtil.enableLogging(rbl, new MockLogger());
+        setRemoteIp("127.0.0.3");
+        setupMockedSMTPSession();
+
+        rbl.setDNSServer(mockedDnsServer);
+
+        rbl.setBlacklist(new String[] { "bl.spamcop.net" });
+        rbl.setGetDetail(true);
+        rbl.onConnect(mockedSMTPSession);
+        assertEquals(null, mockedSMTPSession.getBlockListedDetail());
+        assertEquals(true, mockedSMTPSession.isBlockListed());
+    }
+
+    // ip on whitelist
+    public void testDNSRBL6() {
+        DNSRBLHandler rbl = new DNSRBLHandler();
+
+        ContainerUtil.enableLogging(rbl, new MockLogger());
+        setRemoteIp("127.0.0.2");
+        setupMockedSMTPSession();
+
+        rbl.setDNSServer(mockedDnsServer);
+
+        rbl.setWhitelist(new String[] { "bl.spamcop.net" });
+        rbl.setGetDetail(true);
+        rbl.onConnect(mockedSMTPSession);
+        assertEquals(null, mockedSMTPSession.getBlockListedDetail());
+        assertEquals(false, mockedSMTPSession.isBlockListed());
+    }
+
+}

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java?rev=406304&r1=406303&r2=406304&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java 
(original)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java 
Sun May 14 03:12:22 2006
@@ -162,6 +162,17 @@
 //                throw new UnsupportedOperationException("getByName not 
implemented in mock for host: "+host);
             }
             
+            public Collection findTXTRecords(String hostname) {
+                List res = new ArrayList();
+                if (hostname == null) {
+                    return res;
+                };
+                if ("2.0.0.127.bl.spamcop.net".equals(hostname)) {
+                    res.add("Blocked - see 
http://www.spamcop.net/bl.shtml?127.0.0.2";);
+                }
+                return res;
+            }
+            
         };
         m_serviceManager.put(DNSServer.ROLE, dns);
         m_serviceManager.put(Store.ROLE, new MockStore());



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to