Author: norman
Date: Tue Aug 29 14:02:53 2006
New Revision: 438212

URL: http://svn.apache.org/viewvc?rev=438212&view=rev
Log:
Add JDBCVirtualUserTableHandler. See JAMES-597

Added:
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/JDBCVirtualUserTableHandler.java
Modified:
    james/server/trunk/src/conf/james-smtphandlerchain.xml
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractVirtualUserTableHandler.java
    
james/server/trunk/src/java/org/apache/james/transport/mailets/JDBCVirtualUserTable.java
    james/server/trunk/src/java/org/apache/james/util/VirtualUserTableUtil.java

Modified: james/server/trunk/src/conf/james-smtphandlerchain.xml
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-smtphandlerchain.xml?rev=438212&r1=438211&r2=438212&view=diff
==============================================================================
--- james/server/trunk/src/conf/james-smtphandlerchain.xml (original)
+++ james/server/trunk/src/conf/james-smtphandlerchain.xml Tue Aug 29 14:02:53 
2006
@@ -112,12 +112,19 @@
          </mapping>
      </handler>
      -->
+     
+     <!-- IF you want to use the ValidRcptHandler you can set virtual user 
which will accepted here.-->
+     <!--
+     <handler 
class="org.apache.james.smtpserver.core.filter.fastfail.JDBCVirtualUserTableHandler"
 command="RCPT">
+         <table> db://maildb/VirtualUserTable </table>
+     </handler>
+     -->
          
      <!-- If activated all email will get rejected which has no valid user -->
      <!-- You need to add the recipient to the validRecipient list if you want 
-->
      <!-- to accept email for a recipient which not exist on the server -->
      <!-- 
-     <handler 
class="org.apache.james.smtpserver.core.filter.fastfail.ValidRcptHandler" 
command="MAIL">
+     <handler 
class="org.apache.james.smtpserver.core.filter.fastfail.ValidRcptHandler" 
command="RCPT">
          <validRecipients> </validRecipients>
          <validDomains> </validDomains>
          <validRegexPattern> </validRegexPattern>

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractVirtualUserTableHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractVirtualUserTableHandler.java?rev=438212&r1=438211&r2=438212&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractVirtualUserTableHandler.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractVirtualUserTableHandler.java
 Tue Aug 29 14:02:53 2006
@@ -56,7 +56,9 @@
         // Only non-null mappings are translated
         if (targetString != null) {
             if (targetString.startsWith("error:")) {
-                // No valid mapping
+            // write back the error
+            session.writeResponse(targetString.substring("error:".length()));
+                session.setStopHandlerProcessing(true);
                 return;
             } else {
                 StringTokenizer tokenizer = new StringTokenizer(targetString,
@@ -68,10 +70,10 @@
 
                     if (targetAddress.startsWith("regex:")) {   
                         try {
-                targetAddress = VirtualUserTableUtil.regexMap(rcpt, 
targetAddress);
-            } catch (MalformedPatternException e) {
+                            targetAddress = 
VirtualUserTableUtil.regexMap(rcpt, targetAddress);
+                        } catch (MalformedPatternException e) {
                             getLogger().error("Exception during regexMap 
processing: ", e);
-            }
+                        }
 
 
                         if (targetAddress == null)
@@ -118,7 +120,7 @@
      * @param recipientsMap the mapping of virtual to real recipients, as 
      *    <code>MailAddress</code>es to <code>String</code>s.
      */
-    protected abstract String mapRecipients(MailAddress recipient);;
+    protected abstract String mapRecipients(MailAddress recipient);
     
     public Collection getImplCommands() {
         Collection c = new ArrayList();

Added: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/JDBCVirtualUserTableHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/JDBCVirtualUserTableHandler.java?rev=438212&view=auto
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/JDBCVirtualUserTableHandler.java
 (added)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/JDBCVirtualUserTableHandler.java
 Tue Aug 29 14:02:53 2006
@@ -0,0 +1,158 @@
+/****************************************************************
+ * 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.core.filter.fastfail;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.avalon.cornerstone.services.datasources.DataSourceSelector;
+import org.apache.avalon.excalibur.datasource.DataSourceComponent;
+import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.james.util.JDBCUtil;
+import org.apache.james.util.VirtualUserTableUtil;
+import org.apache.mailet.MailAddress;
+
+/**
+ * 
+ * Handler which check for valid mappings via JDBCVirtualUserTable
+ */
+public class JDBCVirtualUserTableHandler extends 
AbstractVirtualUserTableHandler implements 
Configurable,Serviceable,Initializable{
+    
+    private DataSourceSelector datasources = null;
+    private DataSourceComponent dataSourceComponent = null;
+    private String tableName = null;
+    private String dataSourceName = null;
+    private String query = VirtualUserTableUtil.QUERY; 
+
+    /**
+     * @see 
org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
+     */
+    public void configure(Configuration arg0) throws ConfigurationException {
+        Configuration table = arg0.getChild("table",false);
+        
+        if (table != null) {
+            String tableURL = table.getValue();
+
+            String datasourceName = tableURL.substring(5);
+            int pos = datasourceName.indexOf("/");
+            tableName = datasourceName.substring(pos + 1);
+            dataSourceName = datasourceName.substring(0, pos);
+        } else {
+            throw new ConfigurationException("Table location not specified for 
JDBCVirtualUserTableHandler");
+        }
+        
+        Configuration queryConfig = arg0.getChild("query",false);
+        
+        if (queryConfig != null) {
+            query = queryConfig.getValue();     
+        } 
+    }
+
+    /**
+     * @see 
org.apache.avalon.framework.service.Serviceable#service(ServiceManager)
+     */
+    public void service(ServiceManager arg0) throws ServiceException {
+        datasources = (DataSourceSelector)arg0.lookup(DataSourceSelector.ROLE);
+    }
+    
+
+    /**
+     * @see org.apache.avalon.framework.activity.Initializable#initialize()
+     */
+    public void initialize() throws Exception {
+        Connection conn = null;
+    
+        setDataSourceComponent((DataSourceComponent) 
datasources.select(dataSourceName));
+    
+        try {
+        conn = dataSourceComponent.getConnection();
+            if (!(theJDBCUtil.tableExists(conn.getMetaData(), tableName))) {
+                StringBuffer exceptionBuffer =
+                                              new StringBuffer(128)
+                                              .append("Could not find table '")
+                                              .append(tableName)
+                                              .append("' in datasource '")
+                                              .append(dataSourceName)
+                                             .append("'");
+                throw new Exception(exceptionBuffer.toString());
+            }
+        } finally {
+            theJDBCUtil.closeJDBCConnection(conn);
+        }
+    }
+    
+    public void setDataSourceComponent(DataSourceComponent 
dataSourceComponent) {
+        this.dataSourceComponent = dataSourceComponent;
+    }
+    
+    /**
+     * The JDBCUtil helper class
+     */
+    private final JDBCUtil theJDBCUtil = new JDBCUtil() {
+        protected void delegatedLog(String logString) {
+            getLogger().debug("JDBCVirtualUserTable: " + logString);
+        }
+    };
+    
+    /**
+     * @see 
org.apache.james.smtpserver.core.filter.fastfail.AbstractVirtualUserTableHandler#mapRecipients(MailAddress)
+     */
+    protected String mapRecipients(MailAddress recipient) {
+        Connection conn = null;
+        PreparedStatement mappingStmt = null;
+        try {
+            conn = dataSourceComponent.getConnection();
+            mappingStmt = conn.prepareStatement(query);
+
+                ResultSet mappingRS = null;
+                try {
+                    mappingStmt.setString(1, recipient.getUser());
+                    mappingStmt.setString(2, recipient.getHost());
+                    mappingStmt.setString(3, recipient.getHost());
+                    mappingRS = mappingStmt.executeQuery();
+                    if (mappingRS.next()) {
+                        String targetString = mappingRS.getString(1);
+                        return targetString;
+                    }
+                } finally {
+                    theJDBCUtil.closeJDBCResultSet(mappingRS);
+                }
+            
+        } catch (SQLException sqle) {
+            getLogger().error("Error accessing database", sqle);
+        } finally {
+            theJDBCUtil.closeJDBCStatement(mappingStmt);
+            theJDBCUtil.closeJDBCConnection(conn);
+        }
+        
+        return null;
+    }
+
+}

Modified: 
james/server/trunk/src/java/org/apache/james/transport/mailets/JDBCVirtualUserTable.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/JDBCVirtualUserTable.java?rev=438212&r1=438211&r2=438212&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/transport/mailets/JDBCVirtualUserTable.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/transport/mailets/JDBCVirtualUserTable.java
 Tue Aug 29 14:02:53 2006
@@ -26,6 +26,7 @@
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.james.Constants;
 import org.apache.james.util.JDBCUtil;
+import org.apache.james.util.VirtualUserTableUtil;
 import org.apache.mailet.MailAddress;
 import org.apache.mailet.MailetException;
 
@@ -149,7 +150,7 @@
             }
 
             //Build the query
-            query = getInitParameter("sqlquery","select 
VirtualUserTable.target_address from VirtualUserTable, VirtualUserTable as 
VUTDomains where (VirtualUserTable.user like ? or VirtualUserTable.user like 
'\\%') and (VirtualUserTable.domain like ? or (VirtualUserTable.domain like 
'\\%' and VUTDomains.domain like ?)) order by 
concat(VirtualUserTable.user,'@',VirtualUserTable.domain) desc limit 1");
+            query = getInitParameter("sqlquery",VirtualUserTableUtil.QUERY);
         } catch (MailetException me) {
             throw me;
         } catch (Exception e) {

Modified: 
james/server/trunk/src/java/org/apache/james/util/VirtualUserTableUtil.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/util/VirtualUserTableUtil.java?rev=438212&r1=438211&r2=438212&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/util/VirtualUserTableUtil.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/util/VirtualUserTableUtil.java 
Tue Aug 29 14:02:53 2006
@@ -39,7 +39,8 @@
 
     private VirtualUserTableUtil() {}
     
-    
+
+    public static String QUERY = "select VirtualUserTable.target_address from 
VirtualUserTable, VirtualUserTable as VUTDomains where (VirtualUserTable.user 
like ? or VirtualUserTable.user like '\\%') and (VirtualUserTable.domain like ? 
or (VirtualUserTable.domain like '\\%' and VUTDomains.domain like ?)) order by 
concat(VirtualUserTable.user,'@',VirtualUserTable.domain) desc limit 1";
     /**
      * Processes regex virtual user mapping
      *



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

Reply via email to