[New] Added MailUserChallengeHandler

This commit is contained in:
Robert von Burg 2016-09-08 11:20:45 +02:00
parent 3f2c749659
commit 5fbfbdc731
3 changed files with 89 additions and 45 deletions

View File

@ -1,49 +1,11 @@
package li.strolch.privilege.handler;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.privilege.base.PrivilegeException;
import li.strolch.privilege.model.Usage;
import li.strolch.privilege.model.internal.User;
import li.strolch.privilege.model.internal.UserChallenge;
public class ConsoleUserChallengeHandler implements UserChallengeHandler {
private static final Logger logger = LoggerFactory.getLogger(ConsoleUserChallengeHandler.class);
protected Map<User, UserChallenge> challenges;
public class ConsoleUserChallengeHandler extends UserChallengeHandler {
@Override
public void initialize(Map<String, String> parameterMap) {
this.challenges = Collections.synchronizedMap(new HashMap<>());
}
@Override
public void initiateChallengeFor(Usage usage, User user) {
UserChallenge challenge = new UserChallenge(usage, user, UUID.randomUUID().toString());
this.challenges.put(user, challenge);
logger.info("Password reset challenge for " + user.getUsername() + " is: " + challenge.getChallenge());
}
@Override
public UserChallenge validateResponse(User user, String challenge) throws PrivilegeException {
UserChallenge userChallenge = this.challenges.remove(user);
if (userChallenge == null)
throw new PrivilegeException("No challenge exists for user " + user.getUsername());
if (!userChallenge.getUser().equals(user))
throw new PrivilegeException("UserChallenge invalid: Wrong user!");
if (!userChallenge.getChallenge().equals(challenge))
throw new PrivilegeException("Challenge is invalid!");
userChallenge.fulfilled();
return userChallenge;
public void sendChallengeToUser(User user, String challenge) {
logger.info("Password reset challenge for " + user.getUsername() + " is: " + challenge);
}
}

View File

@ -0,0 +1,33 @@
package li.strolch.privilege.handler;
import java.text.MessageFormat;
import li.strolch.privilege.model.internal.User;
import li.strolch.utils.SmtpMailer;
import li.strolch.utils.helper.StringHelper;
public class MailUserChallengeHandler extends UserChallengeHandler {
private static final String EMAIL = "email";
@Override
public void sendChallengeToUser(User user, String challenge) {
String subject = "Mail TAN";
StringBuilder sb = new StringBuilder();
sb.append("Hello ").append(user.getFirstname()).append(" ").append(user.getLastname()).append("\n\n");
sb.append("You have requested an action which requires you to respond to a challenge.\n\n");
sb.append("Please use the following code to response to the challenge:\n\n");
sb.append(challenge);
String text = sb.toString();
String recipient = user.getProperty(EMAIL);
if (StringHelper.isEmpty(recipient)) {
String msg = "User {0} has no property {1}";
throw new RuntimeException(MessageFormat.format(msg, user.getUsername(), EMAIL));
}
SmtpMailer.getInstance().sendMail(subject, text, recipient);
}
}

View File

@ -1,13 +1,23 @@
package li.strolch.privilege.handler;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.privilege.base.PrivilegeException;
import li.strolch.privilege.model.Usage;
import li.strolch.privilege.model.internal.User;
import li.strolch.privilege.model.internal.UserChallenge;
import li.strolch.utils.CodeGenerator;
public interface UserChallengeHandler {
public abstract class UserChallengeHandler {
protected static final Logger logger = LoggerFactory.getLogger(ConsoleUserChallengeHandler.class);
protected Map<User, UserChallenge> challenges;
/**
* Initialize the concrete {@link UserChallengeHandler}. The passed parameter map contains any configuration the
@ -16,7 +26,9 @@ public interface UserChallengeHandler {
* @param parameterMap
* a map containing configuration properties
*/
public void initialize(Map<String, String> parameterMap);
public void initialize(Map<String, String> parameterMap) {
this.challenges = Collections.synchronizedMap(new HashMap<>());
}
/**
* Initiate a password reset challenge for the given user
@ -26,7 +38,24 @@ public interface UserChallengeHandler {
* @param user
* the user for which to initiate the challenge for
*/
public void initiateChallengeFor(Usage usage, User user);
public void initiateChallengeFor(Usage usage, User user) {
String challenge = generateChallenge();
UserChallenge userChallenge = new UserChallenge(usage, user, challenge);
this.challenges.put(user, userChallenge);
sendChallengeToUser(user, challenge);
}
/**
* Generates and returns a new challenge
*
* @return a new challenge
*/
protected String generateChallenge() {
String challenge = CodeGenerator.alphaNumericUpper(12);
return challenge;
}
/**
* Validate the response of a challenge for the given username
@ -41,6 +70,26 @@ public interface UserChallengeHandler {
*
* @return the challenge
*/
public UserChallenge validateResponse(User user, String challenge) throws PrivilegeException;
public UserChallenge validateResponse(User user, String challenge) throws PrivilegeException {
UserChallenge userChallenge = this.challenges.remove(user);
if (userChallenge == null)
throw new PrivilegeException("No challenge exists for user " + user.getUsername());
if (!userChallenge.getUser().equals(user))
throw new PrivilegeException("UserChallenge invalid: Wrong user!");
if (!userChallenge.getChallenge().equals(challenge))
throw new PrivilegeException("Challenge is invalid!");
userChallenge.fulfilled();
return userChallenge;
}
/**
* Sends the challenge to the user
*
* @param user
* @param challenge
*/
public abstract void sendChallengeToUser(User user, String challenge);
}