[jboss-svn-commits] JBL Code SVN: r33416 - in labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main: java/org/jboss/labs/sbs/plugin/nukesauth/dao and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Jun 9 11:48:58 EDT 2010
Author: lkrzyzanek
Date: 2010-06-09 11:48:57 -0400 (Wed, 09 Jun 2010)
New Revision: 33416
Added:
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/EmailResetPasswordAlreadySentException.java
Modified:
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManager.java
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManagerImpl.java
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/DbNukesUserDAOImpl.java
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUser.java
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserDAO.java
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserMapper.java
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/struts/EmailResetJBossPasswordToken.java
labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/plugin/spring.xml
Log:
ORG-606: Added feature - sending password reset email for nukes users
Added: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/EmailResetPasswordAlreadySentException.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/EmailResetPasswordAlreadySentException.java (rev 0)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/EmailResetPasswordAlreadySentException.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -0,0 +1,38 @@
+/*
+ * JBoss Community http://jboss.org/
+ *
+ * Copyright (c) 2010 Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT A WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License, v.2.1 along with this distribution; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * Red Hat Author(s): Libor Krzyzanek
+ */
+package org.jboss.labs.sbs.plugin.nukesauth;
+
+import com.jivesoftware.community.JiveException;
+
+/**
+ * Thrown when user is attempting to send password reset token but token is
+ * already has sent in last 72 hours
+ *
+ * @author <a href="mailto:lkrzyzan at redhat.com">Libor Krzyzanek</a>
+ */
+public class EmailResetPasswordAlreadySentException extends JiveException {
+
+ public EmailResetPasswordAlreadySentException(String msg) {
+ super(msg);
+ }
+
+}
Property changes on: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/EmailResetPasswordAlreadySentException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManager.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManager.java 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManager.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -23,6 +23,7 @@
import java.util.Date;
import java.util.List;
+import java.util.Locale;
import org.acegisecurity.BadCredentialsException;
import org.acegisecurity.userdetails.UsernameNotFoundException;
@@ -117,4 +118,16 @@
*/
public void updateNukesAccounts(User sbsUser, List<String> duplicateUsernames);
+ /**
+ * Send password reset token
+ *
+ * @param nukesUser
+ * @param locale locale for the message
+ * @throws EmailResetPasswordAlreadySentException if e-mail with reset
+ * password token has already sent
+ * @return true if e-mail was successfully sent, otherwise false
+ */
+ public boolean sendPasswordResetToken(NukesUser nukesUser, Locale locale)
+ throws EmailResetPasswordAlreadySentException;
+
}
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManagerImpl.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManagerImpl.java 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/NukesAccountManagerImpl.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -25,6 +25,7 @@
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import org.acegisecurity.BadCredentialsException;
@@ -32,13 +33,19 @@
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
+import org.apache.struts2.ServletActionContext;
import org.jboss.labs.sbs.plugin.nukesauth.dao.NukesUser;
import org.jboss.labs.sbs.plugin.nukesauth.dao.NukesUserDAO;
import org.jboss.labs.sbs.plugin.nukesauth.dao.NukesUserMapper;
import com.jivesoftware.base.User;
+import com.jivesoftware.community.EmailManager;
+import com.jivesoftware.community.EmailMessage;
+import com.jivesoftware.community.JiveGlobals;
import com.jivesoftware.community.user.profile.ProfileFieldValue;
import com.jivesoftware.community.user.profile.ProfileManager;
+import com.jivesoftware.community.web.JiveResourceResolver;
+import com.jivesoftware.util.StringUtils;
/**
* Database implementation of manager
@@ -51,6 +58,8 @@
private NukesUserDAO nukesUserDAO;
+ private EmailManager emailManager;
+
/** Nukes password encoder */
private PasswordEncoder passwordEncoder;
@@ -180,6 +189,125 @@
return usernames;
}
+ @Override
+ public boolean sendPasswordResetToken(NukesUser nukesUser, Locale locale)
+ throws EmailResetPasswordAlreadySentException {
+ String token = nukesUser.getPasswordResetToken();
+
+ final long now = System.currentTimeMillis();
+ // first, check to see if we already have a token
+ if (token != null) {
+ Long timeStamp = nukesUser.getPasswordResetLastSent();
+ Long lastSent = nukesUser.getPasswordResetLastSent();
+
+ // we've set a token prior to the last 72 hours, reset it
+ if (now - timeStamp > 72 * 60 * 60 * 1000) {
+ token = StringUtils.randomString(8);
+
+ nukesUserDAO.updateResetToken(nukesUser.getUsername(), token, now);
+ }
+ // an email was sent in the last 24 hours, don't send another
+ else if (now - lastSent < 24 * 60 * 60 * 1000) {
+ throw new EmailResetPasswordAlreadySentException("E-mail reset password token has already sent.");
+ }
+ } else {
+ token = StringUtils.randomString(8);
+
+ nukesUserDAO.updateResetToken(nukesUser.getUsername(), token, now);
+ }
+
+ String toName = nukesUser.getName();
+ String toEmail = nukesUser.getEmail();
+ String fromEmail = getFromEmail();
+ String fromName = getFromName();
+
+ // Check for null values
+ if (fromEmail == null || fromName == null) {
+ log.error("WARNING: Not all password reset jive properties set, " + "password resetting may fail.");
+ return false;
+ }
+
+ EmailMessage message = new EmailMessage();
+ message.setLocale(locale);
+ message.setSubjectProperty("passwordReset.email.subject");
+ message.setTextBodyProperty("passwordReset.email.textBody");
+ message.setHtmlBodyProperty("passwordReset.email.htmlBody");
+ message.setSender(fromName, fromEmail);
+ message.addRecipient(toName, toEmail);
+
+ populateContext(message.getContext(), nukesUser, token);
+
+ log.debug("Send Password reset e-mail");
+ emailManager.send(message);
+
+ // update the last sent timestamp in the db
+ nukesUserDAO.updateResetTokenLastSent(nukesUser.getUsername(), now);
+
+ return true;
+ }
+
+ /**
+ * Fill the message template context with needed values.
+ *
+ * @param context the map to populate
+ * @param user the user the message will be sent to.
+ * @param token the temporary password reset token.
+ */
+ private void populateContext(Map<String, Object> context, NukesUser user, String token) {
+ context.put("token", token);
+
+ String jiveURL = JiveResourceResolver.getDefaultBaseURL();
+ if (jiveURL != null) {
+ if (jiveURL.charAt(jiveURL.length() - 1) == '/') {
+ jiveURL = jiveURL.substring(0, jiveURL.length() - 1);
+ }
+ context.put("jiveURL", jiveURL);
+ }
+
+ context.put("name", user.getName());
+ context.put("user", null);
+ context.put("userDisplayName", user.getName());
+ context.put("username", user.getUsername());
+ context.put("userID", 0); // not used
+ context.put("email", user.getEmail());
+ context.put("requestIP", ServletActionContext.getRequest().getRemoteHost());
+ }
+
+ /**
+ * Get an available email address to use for outbound emails.
+ *
+ * @return an available email address to use for outbound emails.
+ */
+ private String getFromEmail() {
+ String fromEmail = JiveGlobals.getJiveProperty("passwordReset.email.fromEmail");
+
+ if (fromEmail == null) {
+ // get the admin's email addres
+ fromEmail = JiveGlobals.getJiveProperty(EmailManager.ADMINEMAIL);
+ if (fromEmail != null) {
+ return fromEmail;
+ } else {
+ log.error("No 'system.adminuser.email' property could be found!");
+ }
+ }
+
+ return fromEmail;
+ }
+
+ /**
+ * Get an available from name to use for outbound emails.
+ *
+ * @return an available from name to use for outbound emails.
+ */
+ private String getFromName() {
+ String fromName = JiveGlobals.getJiveProperty("passwordReset.email.fromName");
+ if (fromName == null) {
+ // get the admin's email addres
+ return JiveGlobals.getJiveProperty(EmailManager.ADMINNAME);
+ }
+ return fromName;
+ }
+
public void setNukesUserDAO(NukesUserDAO nukesUserDAO) {
this.nukesUserDAO = nukesUserDAO;
}
@@ -192,4 +320,8 @@
this.profileManager = profileManager;
}
+ public void setEmailManager(EmailManager emailManager) {
+ this.emailManager = emailManager;
+ }
+
}
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/DbNukesUserDAOImpl.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/DbNukesUserDAOImpl.java 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/DbNukesUserDAOImpl.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -142,4 +142,16 @@
getSimpleJdbcTemplate().update(UPDATE_LAST_LOGGEDIN, date, username);
}
+ @Override
+ public void updateResetToken(String username, String token, Long timestamp) {
+ getSimpleJdbcTemplate().update(
+ "UPDATE nuke_users SET pn_pass_reset_token = ?, pn_pass_reset_timestamp = ? WHERE pn_uname = ?", token,
+ timestamp, username);
+ }
+
+ @Override
+ public void updateResetTokenLastSent(String username, Long lastSent) {
+ getSimpleJdbcTemplate().update("UPDATE nuke_users SET pn_pass_reset_last_sent = ? WHERE pn_uname = ?", lastSent,
+ username);
+ }
}
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUser.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUser.java 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUser.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -51,6 +51,12 @@
private boolean emailVisible;
+ private String passwordResetToken;
+
+ private Long passwordResetTimestamp;
+
+ private Long passwordResetLastSent;
+
public NukesUser(String username) {
this.username = username;
}
@@ -103,6 +109,19 @@
this.modifDate = modifDate;
}
+ /**
+ * Helper method for retrieving name.
+ *
+ * @return if FirstName and LastName is not empty then "firstName lastName"
+ * otherwise username
+ */
+ public String getName() {
+ if (firstName != null && lastName != null && firstName.trim().length() > 0 && lastName.trim().length() > 0) {
+ return firstName + " " + lastName;
+ }
+ return username;
+ }
+
public String getFirstName() {
return firstName;
}
@@ -167,4 +186,28 @@
return true;
}
+ public void setPasswordResetTimestamp(Long passwordResetTimestamp) {
+ this.passwordResetTimestamp = passwordResetTimestamp;
+ }
+
+ public Long getPasswordResetTimestamp() {
+ return passwordResetTimestamp;
+ }
+
+ public void setPasswordResetLastSent(Long passwordResetLastSent) {
+ this.passwordResetLastSent = passwordResetLastSent;
+ }
+
+ public Long getPasswordResetLastSent() {
+ return passwordResetLastSent;
+ }
+
+ public void setPasswordResetToken(String passwordResetToken) {
+ this.passwordResetToken = passwordResetToken;
+ }
+
+ public String getPasswordResetToken() {
+ return passwordResetToken;
+ }
+
}
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserDAO.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserDAO.java 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserDAO.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -82,4 +82,21 @@
*/
public void updateNukesAccounts(NukesUser user, List<String> duplicateUsernames);
+ /**
+ * Update reset token.
+ *
+ * @param username
+ * @param token
+ * @param timestamp
+ */
+ public void updateResetToken(String username, String token, Long timestamp);
+
+ /**
+ * Update last sent
+ *
+ * @param username
+ * @param lastSent
+ */
+ public void updateResetTokenLastSent(String username, Long lastSent);
+
}
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserMapper.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserMapper.java 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/dao/NukesUserMapper.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -194,6 +194,9 @@
bean.setFirstName(rs.getString("pn_fname"));
bean.setLastName(rs.getString("pn_lname"));
+ bean.setPasswordResetToken(rs.getString("pn_pass_reset_token"));
+ bean.setPasswordResetTimestamp(rs.getLong("pn_pass_reset_timestamp"));
+ bean.setPasswordResetLastSent(rs.getLong("pn_pass_reset_last_sent"));
if (isEmpty(bean.getFirstName()) || isEmpty(bean.getLastName())) {
final String name = rs.getString("pn_name");
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/struts/EmailResetJBossPasswordToken.java
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/struts/EmailResetJBossPasswordToken.java 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/java/org/jboss/labs/sbs/plugin/nukesauth/struts/EmailResetJBossPasswordToken.java 2010-06-09 15:48:57 UTC (rev 33416)
@@ -23,6 +23,7 @@
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
+import org.jboss.labs.sbs.plugin.nukesauth.EmailResetPasswordAlreadySentException;
import org.jboss.labs.sbs.plugin.nukesauth.NukesAccountManager;
import org.jboss.labs.sbs.plugin.nukesauth.SbsAccountManager;
import org.jboss.labs.sbs.plugin.nukesauth.dao.NukesUser;
@@ -108,12 +109,14 @@
log.info("Send Password token for Nukes user. Nukes User: " + nukesUser);
}
- // TODO: Implement sending e-mail with token for nukes users.
+ try {
+ success = nukesAccountManager.sendPasswordResetToken(nukesUser, getLocale());
+ } catch (EmailResetPasswordAlreadySentException e) {
+ addActionError(getText("rstpwd.err.mail_send_error.info"));
+ return INPUT;
+ }
- success = true;
-
return SUCCESS;
-
}
@Override
Modified: labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/plugin/spring.xml
===================================================================
--- labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/plugin/spring.xml 2010-06-09 15:10:24 UTC (rev 33415)
+++ labs/jbosslabs/labs-3.0-build/integration/sbs-nukesauthentication/trunk/src/main/plugin/spring.xml 2010-06-09 15:48:57 UTC (rev 33416)
@@ -31,6 +31,7 @@
<property name="nukesUserDAO" ref="nukesUserDAO" />
<property name="passwordEncoder" ref="nukesPasswordEncoder" />
<property name="profileManager" ref="profileManagerImpl" />
+ <property name="emailManager" ref="emailManager" />
</bean>
<bean id="sbsAccountManager"
More information about the jboss-svn-commits
mailing list