package edu.gatech.oad.rocket.findmythings.server.web;
import edu.gatech.oad.rocket.findmythings.server.TemplateServlet;
import edu.gatech.oad.rocket.findmythings.server.db.DatabaseService;
import edu.gatech.oad.rocket.findmythings.server.db.model.DBMember;
import edu.gatech.oad.rocket.findmythings.server.model.AppMember;
import edu.gatech.oad.rocket.findmythings.server.model.MessageBean;
import edu.gatech.oad.rocket.findmythings.server.util.Config;
import edu.gatech.oad.rocket.findmythings.server.util.Messages;
import org.apache.shiro.web.util.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
public class ActivateServlet extends TemplateServlet {
/**
*
*/
private static final long serialVersionUID = 7164782734338940628L;
private static final String PASSWORD_CONFIRM = "password_alt";
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String code = WebUtils.getCleanParam(request, Config.TICKET_PARAM);
String username = WebUtils.getCleanParam(request, Config.USERNAME_PARAM);
if (code == null || code.length() == 0 || username == null || username.length() == 0) {
WebUtils.issueRedirect(request, response, "/");
}
String forgotString = WebUtils.getCleanParam(request, Config.FORGOT_PASSWORD_PARAM);
boolean forgot = forgotString == null ? false : Boolean.parseBoolean(forgotString);
request.setAttribute(Config.TICKET_PARAM, code);
request.setAttribute(Config.USERNAME_PARAM, username);
request.setAttribute(Config.FORGOT_PASSWORD_PARAM, forgot);
if (forgot) {
// display password reset form
writeDocument(response, getDefaultTemplateURI(request), getParameterMap(request));
} else {
String userNameFromCode = DatabaseService.ofy().emailFromRegistrationCode(code);
if (userNameFromCode == null) {
request.setAttribute(MessageBean.FAILURE_REASON, Messages.Activate.CODE_EXPIRED.toString());
} else {
DatabaseService.ofy().register(code, userNameFromCode);
}
}
writeDocument(response, getDefaultTemplateURI(request), getParameterMap(request));
}
// you really should override this in the subclass! :)
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String code = WebUtils.getCleanParam(request, Config.TICKET_PARAM);
String email = WebUtils.getCleanParam(request, Config.USERNAME_PARAM);
if (code == null || code.length() == 0 || email == null || email.length() == 0) {
sendError(request, response, Messages.Activate.INVALID_DATA);
return;
}
String password = WebUtils.getCleanParam(request, Config.PASSWORD_PARAM);
String passwordAlt = WebUtils.getCleanParam(request, PASSWORD_CONFIRM);
if (password == null || password.length() < 3 || passwordAlt == null || passwordAlt.length() < 3) {
sendError(request, response, Messages.Activate.BAD_PASSWORD);
return;
}
if (!password.equals(passwordAlt)) {
sendError(request, response, Messages.Activate.PASSWORDS_MATCH);
return;
}
AppMember user = memberWithEmail(email);
if (user == null) {
sendError(request, response, Messages.Activate.NO_SUCH_USER);
return;
}
DatabaseService.ofy().updateMember((DBMember)user, password);
DatabaseService.ofy().register((DBMember)user, code);
request.setAttribute(Config.FORGOT_PASSWORD_PARAM, false);
writeDocument(response, getDefaultTemplateURI(request), getParameterMap(request));
} catch (Exception e) {
sendError(request, response, Messages.Activate.INVALID_DATA);
}
}
void sendError(HttpServletRequest request, HttpServletResponse response, Messages.Activate message) {
request.setAttribute(MessageBean.FAILURE_REASON, message.toString());
try {
writeDocument(response, getDefaultTemplateURI(request), getParameterMap(request));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void addParametersToMap(HttpServletRequest request, Map<String, Object> params) {
super.addParametersToMap(request, params);
Object code = request.getAttribute(Config.TICKET_PARAM);
if (code != null) params.put(Config.TICKET_PARAM, code);
Object forgot = request.getAttribute(Config.FORGOT_PASSWORD_PARAM);
if (forgot != null) params.put(Config.FORGOT_PASSWORD_PARAM, code);
Object user = request.getAttribute(Config.USERNAME_PARAM);
if (user != null) params.put(Config.USERNAME_PARAM, code);
}
}