Hi, all,
Today patch is about moving property "maxIdleTime" from User to Connection. More precisely, property maxIdleTime from User will be used only once, according to following algorithm:
1. When connection created, it property "maxIdleTime" set from ConnectionManagetImpl internal property value.
2. When user authenticated, connection property maxIdleTime overridden with it value.
We need this change to prevent NPE from last patch (sorry about that) and not to use fake BaseUser to store maxIdleTime property until user logged in.
--
Sergey Vladimirov
--
Sergey Vladimirov
Index:
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ConnectionManagerImpl.java
===================================================================
---
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ConnectionManagerImpl.java
(revision 399733)
+++
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ConnectionManagerImpl.java
(working copy)
@@ -16,12 +16,7 @@
*/
package org.apache.ftpserver;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.Vector;
+import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -31,7 +26,6 @@
import org.apache.ftpserver.interfaces.ConnectionManagerObserver;
import org.apache.ftpserver.interfaces.IConnection;
import org.apache.ftpserver.interfaces.IConnectionManager;
-import org.apache.ftpserver.usermanager.BaseUser;
/**
* Connection service to manage all the connections (request handlers).
@@ -114,6 +108,10 @@
return anonEnabled;
}
+ public int getDefaultIdleSec() {
+ return defaultIdleSec;
+ }
+
/**
* Get maximum anonymous logins
*/
@@ -156,9 +154,11 @@
observer.updatedConnection(connection);
}
- // set default idle time
- BaseUser user = (BaseUser)connection.getRequest().getUser();
- user.setMaxIdleTime(defaultIdleSec);
+ /*
+ * set default idle time for request. This value should be overrided
+ * after user login
+ */
+ connection.getRequest().setMaxIdleTime(defaultIdleSec);
// now start a new thread to serve this connection
new Thread(connection).start();
Index:
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ftplet/FtpRequest.java
===================================================================
---
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ftplet/FtpRequest.java
(revision 399733)
+++
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/ftplet/FtpRequest.java
(working copy)
@@ -22,6 +22,8 @@
import java.net.InetAddress;
import java.util.Date;
+import org.apache.ftpserver.ConnectionManagerImpl;
+
/**
* Defines an object to provide client request information to a ftplet.
* Ftplet methods will always get the same instance of Ftplet request.
@@ -67,8 +69,22 @@
* Get last access time.
*/
Date getLastAccessTime();
+
+ /**
+ * Returns maximum idle time. This time equals to
+ * [EMAIL PROTECTED] ConnectionManagerImpl#getDefaultIdleSec()} until user
login, and
+ * [EMAIL PROTECTED] User#getMaxIdleTime()} after user login.
+ */
+ int getMaxIdleTime();
/**
+ * Set maximum idle time in seconds. This time equals to
+ * [EMAIL PROTECTED] ConnectionManagerImpl#getDefaultIdleSec()} until user
login, and
+ * [EMAIL PROTECTED] User#getMaxIdleTime()} after user login.
+ */
+ void setMaxIdleTime(int maxIdleTimeSec);
+
+ /**
* Get user object.
*/
User getUser();
Index:
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/FtpRequestImpl.java
===================================================================
---
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/FtpRequestImpl.java
(revision 404813)
+++
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/FtpRequestImpl.java
(working copy)
@@ -51,6 +51,7 @@
private ConnectionObserver observer;
private String language;
+ private int maxIdleTime = 0;
private long connectionTime = 0L;
private long loginTime = 0L;
private long lastAccessTime = 0L;
@@ -403,7 +404,7 @@
*/
public boolean isTimeout(long currTime) {
boolean bActive = true;
- int maxIdleTime = user.getMaxIdleTime();
+ int maxIdleTime = getMaxIdleTime();
if(maxIdleTime > 0) {
long currIdleTimeMillis = currTime - lastAccessTime;
long maxIdleTimeMillis = maxIdleTime * 1000L;
@@ -418,4 +419,12 @@
public boolean isTimeout() {
return isTimeout(System.currentTimeMillis());
}
+
+ public int getMaxIdleTime() {
+ return this.maxIdleTime;
+ }
+
+ public void setMaxIdleTime(int maxIdleTimeSec) {
+ this.maxIdleTime = maxIdleTimeSec;
+ }
}
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 404813)
+++
C:/Vladimirov/workspace/ftpserver/src/java/org/apache/ftpserver/command/PASS.java
(working copy)
@@ -118,6 +118,7 @@
if(bSuccess) {
request.setUser(user);
request.setUserArgument(null);
+ request.setMaxIdleTime(user.getMaxIdleTime());
} else {
log.warn("Login failure - " + userName);
out.send(530, "PASS", userName);
