[New] Added MailUserChallengeHandler
This commit is contained in:
parent
3f2c749659
commit
5fbfbdc731
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue