Hi, all,
 
I prepared patch (reprepared) that set link in Request to User from UserManager, instead of creating new BaseUser object and repopulating all User properties.
 
From my point of view, In ideal case BaseUser should be like "DefaultUser" or "AbstractUser" as base for UserManager implementation. FTPServer core should works only with User interface.
 
Sergey.

 
2006/5/4, Sergey Vladimirov <[EMAIL PROTECTED]>:
Hi, ftpserver-dev,
 
We have BaseUser used over all code. Almost every component believes, that User is instance of BaseUser.
I'm sure we need to remove this assumption, and use User interface.
 
That means, we should not assume, that UserManager uses BaseUser, or can work with it. Additionaly, FtpRequestImpl should not use "empty" BaseUser before authentication - just store user name and wait until correct user can be retrievied from UserManager (after PASS command).
 
It will help to implement application specific UserManager much easy.

--
Sergey Vladimirov



--
Sergey Vladimirov
Index: 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ftplet/Credentials.java
===================================================================
--- 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ftplet/Credentials.java
     (revision 0)
+++ 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ftplet/Credentials.java
     (revision 0)
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * 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.ftpserver.ftplet;
+
+/**
+ * Class contains login until user logged in.
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sergey Vladimirov</a>
+ */
+public class Credentials {
+    private String userName;
+
+    public String getUserName() {
+       return userName;
+    }
+
+    public void setUserName(String userName) {
+       this.userName = userName;
+    }
+}
Index: 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/FtpRequestImpl.java
===================================================================
--- 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/FtpRequestImpl.java
 (revision 399733)
+++ 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/FtpRequestImpl.java
 (working copy)
@@ -26,10 +26,7 @@
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterInputStream;
 
-import org.apache.ftpserver.ftplet.FileObject;
-import org.apache.ftpserver.ftplet.FileSystemView;
-import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.User;
+import org.apache.ftpserver.ftplet.*;
 import org.apache.ftpserver.interfaces.ConnectionObserver;
 import org.apache.ftpserver.usermanager.BaseUser;
 
@@ -45,6 +42,7 @@
     private String command;
     private String argument;
     
+    private Credentials credentials;
     private User user;
     private HashMap attributeMap;
     private InetAddress remoteAddr;
@@ -66,7 +64,8 @@
      */
     public FtpRequestImpl() {
         attributeMap = new HashMap();
-        user = new BaseUser();
+        credentials = new Credentials();
+        user = null;
         connectionTime = System.currentTimeMillis();
     } 
     
@@ -103,7 +102,8 @@
      * Reinitialize request.
      */
     public void reinitialize() {
-        user = new BaseUser();
+       credentials = new Credentials();
+        user = null;
         loginTime = 0L;
         fileSystemView = null;
         renameFrom = null;
@@ -242,6 +242,13 @@
     }
     
     /**
+     * Get credentials
+     */
+    public Credentials getCredentials() {
+       return credentials;
+    }
+    
+    /**
      * Get the ftp command.
      */
     public String getCommand() {
@@ -290,6 +297,10 @@
         return user;
     }
     
+    public void setUser(User user) {
+       this.user = user;
+    }
+    
     /**
      * Get remote address
      */
Index: 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/command/PASS.java
===================================================================
--- 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/command/PASS.java
   (revision 399733)
+++ 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/command/PASS.java
   (working copy)
@@ -23,18 +23,11 @@
 import org.apache.ftpserver.FtpRequestImpl;
 import org.apache.ftpserver.FtpWriter;
 import org.apache.ftpserver.RequestHandler;
-import org.apache.ftpserver.ftplet.FileSystemManager;
-import org.apache.ftpserver.ftplet.FileSystemView;
-import org.apache.ftpserver.ftplet.FtpException;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
-import org.apache.ftpserver.ftplet.User;
-import org.apache.ftpserver.ftplet.UserManager;
+import org.apache.ftpserver.ftplet.*;
 import org.apache.ftpserver.interfaces.ICommand;
 import org.apache.ftpserver.interfaces.IConnectionManager;
 import org.apache.ftpserver.interfaces.IFtpConfig;
 import org.apache.ftpserver.interfaces.IFtpStatistics;
-import org.apache.ftpserver.usermanager.BaseUser;
 
 /**
  * <code>PASS &lt;SP&gt; <password> &lt;CRLF&gt;</code><br>
@@ -73,8 +66,8 @@
             }
             
             // check user name
-            User user = request.getUser();
-            String userName = user.getName();
+            Credentials credentials = request.getCredentials();
+            String userName = credentials.getUserName();
             if(userName == null) {
                 out.send(503, "PASS", null);
                 return;
@@ -106,36 +99,31 @@
             
             // authenticate user
             UserManager userManager = fconfig.getUserManager();
+            User user = null;
             try {
                 if(bAnonymous) {
                     bSuccess = userManager.doesExist("anonymous");
+                    if (bSuccess)
+                       user = userManager.getUserByName("anonymous");
                 }
                 else {
                     bSuccess = userManager.authenticate(userName, password);
+                    if (bSuccess)
+                       user = userManager.getUserByName(userName);
                 }
             }
             catch(Exception ex) {
                 bSuccess = false;
                 log.warn("PASS.execute()", ex);
             }
-            if(!bSuccess) {
+            if(bSuccess) {
+               request.setUser(user);
+            } else {
                 log.warn("Login failure - " + userName);
                 out.send(530, "PASS", userName);
                 return;
             }
             
-            // populate user information
-            try {
-                populateUser(handler, userName);
-            }
-            catch(FtpException ex) {
-                bSuccess = false;
-            }
-            if(!bSuccess) {
-                out.send(530, "PASS", userName);
-                return;
-            }
-            
             // everything is fine - send login ok message
             out.send(230, "PASS", userName);
             if(bAnonymous) {
@@ -168,25 +156,4 @@
             }
         }
     }
-
-    /**
-     * Populate user.
-     */
-    private void populateUser(RequestHandler handler,
-                              String login) throws FtpException {
-        
-        User user = handler.getConfig().getUserManager().getUserByName(login);
-        if(user == null) {
-            throw new FtpException(login + " : does not exist.");
-        }
-        
-        BaseUser reqUser = (BaseUser)handler.getRequest().getUser();
-        reqUser.setName(user.getName());
-        reqUser.setEnabled(user.getEnabled());
-        reqUser.setHomeDirectory(user.getHomeDirectory());
-        reqUser.setMaxUploadRate(user.getMaxUploadRate());
-        reqUser.setMaxDownloadRate(user.getMaxDownloadRate());
-        reqUser.setMaxIdleTime(user.getMaxIdleTime());
-        reqUser.setWritePermission(user.getWritePermission());
-    }
 }
Index: 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/command/USER.java
===================================================================
--- 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/command/USER.java
   (revision 399733)
+++ 
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/command/USER.java
   (working copy)
@@ -21,12 +21,11 @@
 import org.apache.ftpserver.FtpRequestImpl;
 import org.apache.ftpserver.FtpWriter;
 import org.apache.ftpserver.RequestHandler;
-import org.apache.ftpserver.ftplet.FtpException;
+import org.apache.ftpserver.ftplet.User;
 import org.apache.ftpserver.interfaces.ICommand;
 import org.apache.ftpserver.interfaces.IConnectionManager;
 import org.apache.ftpserver.interfaces.IFtpConfig;
 import org.apache.ftpserver.interfaces.IFtpStatistics;
-import org.apache.ftpserver.usermanager.BaseUser;
 
 /**
  * <code>USER &lt;SP&gt; &lt;username&gt; &lt;CRLF&gt;</code><br>
@@ -47,7 +46,7 @@
      */
     public void execute(RequestHandler handler, 
                         FtpRequestImpl request, 
-                        FtpWriter out) throws IOException, FtpException {
+                        FtpWriter out) throws IOException {
     
         boolean bSuccess = false;
         IFtpConfig fconfig = handler.getConfig();
@@ -66,8 +65,8 @@
             }
             
             // already logged-in
-            BaseUser user = (BaseUser)request.getUser();
             if(request.isLoggedIn()) {
+                User user = request.getUser();
                 if( userName.equals(user.getName()) ) {
                     out.send(230, "USER", null);
                     bSuccess = true;
@@ -103,7 +102,7 @@
             
             // finally set the user name
             bSuccess = true;
-            user.setName(userName);
+            request.getCredentials().setUserName(userName);
             if(bAnonymous) {
                 out.send(331, "USER.anonymous", userName);
             }
  • Using BaseUser Sergey Vladimirov
    • Re: Using BaseUser Sergey Vladimirov

Reply via email to