/* * Copyright 2001-2004 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.jetspeed.om.security; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.util.Date; import java.util.Hashtable; import javax.servlet.http.HttpSessionBindingEvent; import org.apache.jetspeed.services.JetspeedAuthentication; import org.apache.jetspeed.services.JetspeedUserManagement; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.turbine.om.security.User; import org.apache.turbine.util.ObjectUtils; /** * The default Jetspeed implementation of User interface. * * This basic implementation contains the functionality that is expected to be * common among all User implementations. You are welcome to extend this class * if you wish to have custom functionality in your user objects (like accessor * methods for custom attributes). * * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a> * @author <a href="mailto:morciuch@apache.org">Mark Orciuch</a> * @version $Id: BaseJetspeedUser.java,v 1.11 2004/02/23 03:14:12 jford Exp $ */ public class BaseJetspeedUser /* extends SecurityObject */implements JetspeedUser { /** The date on which the user account was created. */ private Date createDate = null; /** The date on which the user last accessed the application. */ private Date lastAccessDate = null; /** This is data that will survive a servlet engine restart. */ private Hashtable permStorage = null; /** This is data that will not survive a servlet engine restart. */ private Hashtable tempStorage = null; protected String name = ""; protected boolean isNew = true; /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(BaseJetspeedUser.class.getName()); /** * Constructor. Create a new User and set the createDate. */ public BaseJetspeedUser() { createDate = new Date(); tempStorage = new Hashtable(10); permStorage = new Hashtable(10); setHasLoggedIn(Boolean.FALSE); setDisabled("F"); isNew = true; } /** * Returns the primary principle for this User, the user id. * * @return the user id. */ public String getUserId() { String tmp = null; try { tmp = (String) getPerm(JetspeedUser.USER_ID); if (tmp != null && tmp.length() == 0) { tmp = null; } } catch (Exception e) { logger.error("getUserId(): " + e.getMessage(), e); } return tmp; } public void setUserId(String id) { if (getUserId() == null) { setPerm(JetspeedUser.USER_ID, id); } } /** * Gets the access counter for a user during a session. * * @return The access counter for the user for the session. */ public int getAccessCounterForSession() { int accessCounter = 0; try { Integer temp = (Integer) getTemp(User.SESSION_ACCESS_COUNTER); if (temp != null) { accessCounter = temp.intValue(); } } catch (Exception e) { logger.debug("getAccessCounterForSession(): " + e.getMessage(), e); } return accessCounter; } /** * Gets the access counter for a user from perm storage. * * @return The access counter for the user. */ public int getAccessCounter() { int accessCounter = 0; try { Integer temp = (Integer) getPerm(User.ACCESS_COUNTER); if (temp != null) { accessCounter = temp.intValue(); } } catch (Exception e) { logger.debug("getAccessCounter(): " + e.getMessage(), e); } return accessCounter; } /** * Gets the create date for this User. This is the time at which the user * object was created. * * @return A Java Date with the date of creation for the user. */ public java.util.Date getCreateDate() { return createDate; } /** * Gets the last access date for this User. This is the last time that the * user object was referenced. * * @return A Java Date with the last access date for the user. */ public java.util.Date getLastAccessDate() { if (lastAccessDate == null) { setLastAccessDate(); } return lastAccessDate; } /** * Get last login date/time for this user. * * @return A Java Date with the last login date for the user. */ public java.util.Date getLastLogin() { return (java.util.Date) getPerm(User.LAST_LOGIN); } /** * Get password for this user. * * @return A String with the password for the user. */ public String getPassword() { return (String) getPerm(User.PASSWORD); } /** * Get an object from permanent storage. * * @param name * The object's name. * @return An Object with the given name. */ public Object getPerm(String name) { return permStorage.get(name); } /** * Get an object from permanent storage; return default if value is null. * * @param name * The object's name. * @param def * A default value to return. * @return An Object with the given name. */ public Object getPerm(String name, Object def) { try { Object val = permStorage.get(name); return (val == null ? def : val); } catch (Exception e) { logger.error("getPerm(" + name + "): " + e.getMessage(), e); return def; } } /** * This should only be used in the case where we want to save the data to the * database. * * @return A Hashtable. */ public Hashtable getPermStorage() { if (this.permStorage == null) { this.permStorage = new Hashtable(); } return this.permStorage; } /** * Get an object from temporary storage. * * @param name * The object's name. * @return An Object with the given name. */ public Object getTemp(String name) { return tempStorage.get(name); } /** * Get an object from temporary storage; return default if value is null. * * @param name * The object's name. * @param def * A default value to return. * @return An Object with the given name. */ public Object getTemp(String name, Object def) { Object val; try { val = tempStorage.get(name); if (val == null) { val = def; } } catch (Exception e) { logger.error("getTemp(" + name + "): " + e.getMessage(), e); val = def; } return val; } /** * Returns the username for this user. If this is defined, then the user is * considered logged in. * * @return A String with the username. */ public String getUserName() { String tmp = null; try { tmp = (String) getPerm(User.USERNAME); if (tmp.length() == 0) { tmp = null; } } catch (Exception e) { logger.error("getUserName(): " + e.getMessage(), e); } return tmp; } /** * Returns the first name for this user. If this is defined, then the user is * considered logged in. * * @return A String with the user's first name. */ public String getFirstName() { String tmp = null; try { tmp = (String) getPerm(User.FIRST_NAME); if (tmp.length() == 0) { tmp = null; } } catch (Exception e) { logger.error("getFirstName(): " + e.getMessage(), e); } return tmp; } /** * Returns the last name for this user. If this is defined, then the user is * considered logged in. * * @return A String with the user's last name. */ public String getLastName() { String tmp = null; try { tmp = (String) getPerm(User.LAST_NAME); if (tmp.length() == 0) tmp = null; } catch (Exception e) { logger.error("getLastName(): " + e.getMessage(), e); } return tmp; } /** * The user is considered logged in if they have not timed out. * * @return Whether the user has logged in. */ public boolean hasLoggedIn() { Boolean loggedIn = getHasLoggedIn(); return (loggedIn != null && loggedIn.booleanValue()); } /** * Returns the email address for this user. * * @return A String with the user's email address. */ public String getEmail() { return (String) getPerm(User.EMAIL); } /** * Increments the permanent hit counter for the user. */ public void incrementAccessCounter() { setAccessCounter(getAccessCounter() + 1); } /** * Increments the session hit counter for the user. */ public void incrementAccessCounterForSession() { setAccessCounterForSession(getAccessCounterForSession() + 1); } /** * Remove an object from temporary storage and return the object. * * @param name * The name of the object to remove. * @return An Object. */ public Object removeTemp(String name) { return tempStorage.remove(name); } /** * Sets the access counter for a user, saved in perm storage. * * @param cnt * The new count. */ public void setAccessCounter(int cnt) { setPerm(User.ACCESS_COUNTER, new Integer(cnt)); } /** * Sets the session access counter for a user, saved in temp storage. * * @param cnt * The new count. */ public void setAccessCounterForSession(int cnt) { setTemp(User.SESSION_ACCESS_COUNTER, new Integer(cnt)); } /** * Sets the last access date for this User. This is the last time that the * user object was referenced. */ public void setLastAccessDate() { lastAccessDate = new java.util.Date(); } /** * Sets the create date for this User. This is the time at which the user * object was created. * * @param date * The create date. */ public void setCreateDate(java.util.Date date) { createDate = date; } /** * Set last login date/time. * * @param date * The last login date. */ public void setLastLogin(java.util.Date date) { setPerm(User.LAST_LOGIN, date); } /** * Set password. * * @param password * The new password. */ public void setPassword(String password) { setPerm(User.PASSWORD, password); } /** * Put an object into permanent storage. If the value is null, it will convert * that to a "" because the underlying storage mechanism within TurbineUser is * currently a Hashtable and null is not a valid value. * * @param name * The object's name. * @param value * The object. */ public void setPerm(String name, Object value) { ObjectUtils.safeAddToHashtable(getPermStorage(), name, value); } /** * This should only be used in the case where we want to save the data to the * database. * * @param stuff * A Hashtable. */ public void setPermStorage(Hashtable stuff) { this.permStorage = stuff; } /** * This should only be used in the case where we want to save the data to the * database. * * @return A Hashtable. */ public Hashtable getTempStorage() { if (this.tempStorage == null) { this.tempStorage = new Hashtable(); } return this.tempStorage; } /** * This should only be used in the case where we want to save the data to the * database. * * @param storage * A Hashtable. */ public void setTempStorage(Hashtable storage) { this.tempStorage = storage; } /** * This gets whether or not someone has logged in. hasLoggedIn() returns this * value as a boolean. This is private because you should use hasLoggedIn() * instead. * * @return True if someone has logged in. */ private Boolean getHasLoggedIn() { return (Boolean) getTemp(User.HAS_LOGGED_IN); } /** * This sets whether or not someone has logged in. hasLoggedIn() returns this * value. * * @param value * Whether someone has logged in or not. */ public void setHasLoggedIn(Boolean value) { setTemp(User.HAS_LOGGED_IN, value); } /** * Put an object into temporary storage. If the value is null, it will convert * that to a "" because the underlying storage mechanism within TurbineUser is * currently a Hashtable and null is not a valid value. * * @param name * The object's name. * @param value * The object. */ public void setTemp(String name, Object value) { ObjectUtils.safeAddToHashtable(tempStorage, name, value); } /** * Sets the username for this user. * * @param username * The user's username. */ public void setUserName(String username) { setPerm(User.USERNAME, username); } /** * Sets the first name for this user. * * @param firstName * User's first name. */ public void setFirstName(String firstName) { setPerm(User.FIRST_NAME, firstName); } /** * Sets the last name for this user. * * @param lastName * User's last name. */ public void setLastName(String lastName) { setPerm(User.LAST_NAME, lastName); } /** * Sets the email address. * * @param address * The email address. */ public void setEmail(String address) { setPerm(User.EMAIL, address); } /** * This method reports whether or not the user has been confirmed in the * system by checking the User.CONFIRM_VALUE column in the users record to see * if it is equal to User.CONFIRM_DATA. * * @return True if the user has been confirmed. */ public boolean isConfirmed() { String value = getConfirmed(); return (value != null && value.equals(User.CONFIRM_DATA)); } /** * Sets the confirmation value. The value should be either a random string or * User.CONFIRM_DATA * * @param value * The confirmation key value. */ public void setConfirmed(String value) { String val = ""; if (value != null) { val = value; } setPerm(User.CONFIRM_VALUE, val); } /** * Gets the confirmation value. * * @return status The confirmation value for this User */ public String getConfirmed() { return (String) getPerm(User.CONFIRM_VALUE); } /** * Updates the last login date in the database. * * @exception Exception, * a generic exception. */ public void updateLastLogin() throws Exception { setPerm(User.LAST_LOGIN, new java.util.Date()); } /** * Implement this method if you wish to be notified when the User has been * Bound to the session. * * @param hsbe * The HttpSessionBindingEvent. */ public void valueBound(HttpSessionBindingEvent hsbe) { // Currently we have no need for this method. } /** * Implement this method if you wish to be notified when the User has been * Unbound from the session. * * @param hsbe * The HttpSessionBindingEvent. */ public void valueUnbound(HttpSessionBindingEvent hsbe) { try { java.util.Date now = new java.util.Date(); // System.out.println("*********** value unbound ********************: " + // now.toString()); if (this.hasLoggedIn()) { if (JetspeedResources.getBoolean("automatic.logout.save", false)) { JetspeedUserManagement.saveUser(this); } JetspeedAuthentication.logout(); } } catch (Exception e) { logger.error("TurbineUser.valueUnbound(): " + e.getMessage(), e); // To prevent messages being lost in case the logging system // goes away before sessions get unbound on servlet container // shutdown, print the stcktrace to the container's console. ByteArrayOutputStream ostr = new ByteArrayOutputStream(); e.printStackTrace(new PrintWriter(ostr, true)); String stackTrace = ostr.toString(); System.out.println(stackTrace); } } /** * Saves this object to the data store. */ public void save() throws Exception { if (this.isNew()) { JetspeedUserManagement.addUser(this); } else { JetspeedUserManagement.saveUser(this); } } /** * Returns the disabled status for the user * * @return True when the account is disabled */ public String getDisabled() { String disabled = null; try { String tmp = (String) getPerm(JetspeedUser.DISABLED); if (tmp != null && tmp.length() > 0) { disabled = tmp; } } catch (Exception e) { logger.error("getDisabled(): " + e.getMessage(), e); } return disabled; } public void setDisabled(String disabled) { setPerm(JetspeedUser.DISABLED, disabled); } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isNew() { return isNew; } protected void setNew(boolean isNew) { this.isNew = isNew; } /** * @see org.apache.jetspeed.om.security.JetspeedUser#getPasswordChanged */ public Date getPasswordChanged() { return (Date) getPerm(JetspeedUser.PASSWORD_CHANGED); } /** * @see org.apache.jetspeed.om.security.JetspeedUser#setPasswordChanged */ public void setPasswordChanged(Date value) { setPerm(JetspeedUser.PASSWORD_CHANGED, value); } }