[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