GUACAMOLE-394: Automatically update the end time of user history records upon logout.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/28e7d215 Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/28e7d215 Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/28e7d215 Branch: refs/heads/master Commit: 28e7d215aceb2e5c572bdfc00207ef37d33ca8e8 Parents: 3ccb4d4 Author: Michael Jumper <[email protected]> Authored: Tue Sep 12 18:03:22 2017 -0700 Committer: Michael Jumper <[email protected]> Committed: Mon Dec 11 23:51:57 2017 -0800 ---------------------------------------------------------------------- .../auth/jdbc/base/ActivityRecordModel.java | 26 ++++++++++++++++++++ .../auth/jdbc/user/ModeledUserContext.java | 6 ++++- .../auth/jdbc/user/UserRecordMapper.java | 11 +++++++++ .../auth/jdbc/user/UserRecordMapper.xml | 16 +++++++++++- .../auth/jdbc/user/UserRecordMapper.xml | 16 +++++++++++- .../auth/jdbc/user/UserRecordMapper.xml | 16 +++++++++++- 6 files changed, 87 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/28e7d215/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java ---------------------------------------------------------------------- diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java index 86f2204..fbf6209 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ActivityRecordModel.java @@ -28,6 +28,11 @@ import java.util.Date; public class ActivityRecordModel { /** + * The ID of this object in the database, if any. + */ + private Integer recordID; + + /** * The database ID of the user associated with this activity record. */ private Integer userID; @@ -54,6 +59,27 @@ public class ActivityRecordModel { private Date endDate; /** + * Returns the ID of this record in the database, if it exists. + * + * @return + * The ID of this record in the database, or null if this record was + * not retrieved from the database. + */ + public Integer getRecordID() { + return recordID; + } + + /** + * Sets the database ID of this record to the given value. + * + * @param recordID + * The ID to assign to this object. + */ + public void setRecordID(Integer recordID) { + this.recordID = recordID; + } + + /** * Returns the database ID of the user associated with this activity * record. * http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/28e7d215/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java ---------------------------------------------------------------------- diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java index 0b3b121..5bfcda6 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUserContext.java @@ -231,7 +231,11 @@ public class ModeledUserContext extends RestrictedObject @Override public void invalidate() { - // Nothing to invalidate + + // Record logout time + userRecord.setEndDate(new Date()); + userRecordMapper.update(userRecord); + } } http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/28e7d215/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java ---------------------------------------------------------------------- diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java index 68f0c94..b2177bf 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java @@ -57,6 +57,17 @@ public interface UserRecordMapper { int insert(@Param("record") ActivityRecordModel record); /** + * Updates the given user login record. + * + * @param record + * The user login record to update. + * + * @return + * The number of rows updated. + */ + int update(@Param("record") ActivityRecordModel record); + + /** * Searches for up to <code>limit</code> user login records that contain * the given terms, sorted by the given predicates, regardless of whether * the data they are associated with is is readable by any particular user. http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/28e7d215/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml ---------------------------------------------------------------------- diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml index 0467452..bbae03b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -25,6 +25,7 @@ <!-- Result mapper for system permissions --> <resultMap id="UserRecordResultMap" type="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + <id column="history_id" property="recordID" jdbcType="INTEGER"/> <result column="remote_host" property="remoteHost" jdbcType="VARCHAR"/> <result column="user_id" property="userID" jdbcType="INTEGER"/> <result column="username" property="username" jdbcType="VARCHAR"/> @@ -52,7 +53,8 @@ </select> <!-- Insert the given user record --> - <insert id="insert" parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + <insert id="insert" useGeneratedKeys="true" keyProperty="record.recordID" + parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> INSERT INTO guacamole_user_history ( remote_host, @@ -72,6 +74,18 @@ </insert> + <!-- Update the given user record --> + <update id="update" parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + UPDATE guacamole_user_history + SET remote_host = #{record.remoteHost,jdbcType=VARCHAR}, + user_id = (SELECT user_id FROM guacamole_user + WHERE username = #{record.username,jdbcType=VARCHAR}), + username = #{record.username,jdbcType=VARCHAR}, + start_date = #{record.startDate,jdbcType=TIMESTAMP}, + end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER} + </update> + <!-- Search for specific user records --> <select id="search" resultMap="UserRecordResultMap"> http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/28e7d215/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml ---------------------------------------------------------------------- diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml index 0467452..014b38a 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -25,6 +25,7 @@ <!-- Result mapper for system permissions --> <resultMap id="UserRecordResultMap" type="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + <id column="history_id" property="recordID" jdbcType="INTEGER"/> <result column="remote_host" property="remoteHost" jdbcType="VARCHAR"/> <result column="user_id" property="userID" jdbcType="INTEGER"/> <result column="username" property="username" jdbcType="VARCHAR"/> @@ -52,7 +53,8 @@ </select> <!-- Insert the given user record --> - <insert id="insert" parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + <insert id="insert" useGeneratedKeys="true" keyProperty="record.recordID" + parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> INSERT INTO guacamole_user_history ( remote_host, @@ -72,6 +74,18 @@ </insert> + <!-- Update the given user record --> + <update id="update" parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + UPDATE guacamole_user_history + SET remote_host = #{record.remoteHost,jdbcType=VARCHAR}, + user_id = (SELECT user_id FROM guacamole_user + WHERE username = #{record.username,jdbcType=VARCHAR}), + username = #{record.username,jdbcType=VARCHAR}, + start_date = #{record.startDate,jdbcType=TIMESTAMP}, + end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER}::integer + </update> + <!-- Search for specific user records --> <select id="search" resultMap="UserRecordResultMap"> http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/28e7d215/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml ---------------------------------------------------------------------- diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml index fafa863..0143dda 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -25,6 +25,7 @@ <!-- Result mapper for system permissions --> <resultMap id="UserRecordResultMap" type="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + <id column="history_id" property="recordID" jdbcType="INTEGER"/> <result column="remote_host" property="remoteHost" jdbcType="VARCHAR"/> <result column="user_id" property="userID" jdbcType="INTEGER"/> <result column="username" property="username" jdbcType="VARCHAR"/> @@ -52,7 +53,8 @@ </select> <!-- Insert the given user record --> - <insert id="insert" parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + <insert id="insert" useGeneratedKeys="true" keyProperty="record.recordID" + parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> INSERT INTO [guacamole_user_history] ( remote_host, @@ -72,6 +74,18 @@ </insert> + <!-- Update the given user record --> + <update id="update" parameterType="org.apache.guacamole.auth.jdbc.base.ActivityRecordModel"> + UPDATE [guacamole_user_history] + SET remote_host = #{record.remoteHost,jdbcType=VARCHAR}, + user_id = (SELECT user_id FROM [guacamole_user] + WHERE username = #{record.username,jdbcType=VARCHAR}), + username = #{record.username,jdbcType=VARCHAR}, + start_date = #{record.startDate,jdbcType=TIMESTAMP}, + end_date = #{record.endDate,jdbcType=TIMESTAMP} + WHERE history_id = #{record.recordID,jdbcType=INTEGER} + </update> + <!-- Search for specific user records --> <select id="search" resultMap="UserRecordResultMap">
