/*
* #%L
* BroadleafCommerce Open Admin Platform
* %%
* Copyright (C) 2009 - 2013 Broadleaf Commerce
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.broadleafcommerce.openadmin.web.controller;
import org.broadleafcommerce.common.service.GenericResponse;
import org.broadleafcommerce.common.util.BLCMessageUtils;
import org.broadleafcommerce.common.web.JsonResponse;
import org.broadleafcommerce.common.web.controller.BroadleafAbstractController;
import org.broadleafcommerce.openadmin.server.security.domain.AdminMenu;
import org.broadleafcommerce.openadmin.server.security.domain.AdminModule;
import org.broadleafcommerce.openadmin.server.security.domain.AdminSection;
import org.broadleafcommerce.openadmin.server.security.domain.AdminUser;
import org.broadleafcommerce.openadmin.server.security.service.AdminSecurityService;
import org.broadleafcommerce.openadmin.server.security.service.AdminUserDetails;
import org.broadleafcommerce.openadmin.server.security.service.navigation.AdminNavigationService;
import org.broadleafcommerce.openadmin.web.form.ResetPasswordForm;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* AdminLoginController handles login related needs for the BLC admin including:
* <ul>
* <li>Forgot Password</li>
* <li>Forgot Username</li>
* <li>Reset Password</li>
* </ul>
*
*/
@Controller("blAdminLoginController")
public class AdminLoginController extends BroadleafAbstractController {
private static final String ANONYMOUS_USER_NAME = "anonymousUser";
@Resource(name="blAdminSecurityService")
protected AdminSecurityService adminSecurityService;
@Resource(name="blAdminNavigationService")
protected AdminNavigationService adminNavigationService;
// Entry URLs
protected static String loginView = "login/login";
protected static String forgotPasswordView = "login/forgotPassword";
protected static String forgotUsernameView = "login/forgotUsername";
protected static String resetPasswordView = "login/resetPassword";
protected static String changePasswordView = "login/changePasswordPopup";
protected static String loginRedirect = "login";
protected static String resetPasswordRedirect = "resetPassword";
protected static String noAccessView = "noAccess";
@RequestMapping(value="/login", method=RequestMethod.GET)
public String baseLogin(HttpServletRequest request, HttpServletResponse response, Model model) {
return getLoginView();
}
@RequestMapping(value = {"/", "/loginSuccess"}, method = RequestMethod.GET)
public String loginSuccess(HttpServletRequest request, HttpServletResponse response, Model model) {
AdminMenu adminMenu = adminNavigationService.buildMenu(getPersistentAdminUser());
if (!adminMenu.getAdminModules().isEmpty()) {
AdminModule first = adminMenu.getAdminModules().get(0);
List<AdminSection> sections = first.getSections();
if (!sections.isEmpty()) {
AdminSection adminSection = sections.get(0);
return "redirect:" + adminSection.getUrl();
}
}
return "noAccess";
}
@RequestMapping(value="/forgotPassword", method=RequestMethod.GET)
public String forgotPassword(HttpServletRequest request, HttpServletResponse response, Model model) {
return getForgotPasswordView();
}
@RequestMapping(value="/forgotUsername", method=RequestMethod.GET)
public String forgotUsername(HttpServletRequest request, HttpServletResponse response,Model model) {
return getForgotUsernameView();
}
@RequestMapping(value = "/sendResetPassword", method = RequestMethod.POST)
public String processSendResetPasswordEmail(HttpServletRequest request, HttpServletResponse response,
@RequestParam("username") String username) {
GenericResponse errorResponse = adminSecurityService.sendResetPasswordNotification(username);
if (errorResponse.getHasErrors()) {
setErrors(errorResponse, request);
return getForgotPasswordView();
} else {
request.getSession(true).setAttribute("forgot_password_username", username);
return redirectToResetPasswordWithMessage("passwordTokenSent");
}
}
@RequestMapping(value="/resetPassword", method=RequestMethod.POST)
public String processResetPassword(HttpServletRequest request, HttpServletResponse response, Model model,
@ModelAttribute("resetPasswordForm") ResetPasswordForm resetPasswordForm) {
GenericResponse errorResponse = adminSecurityService.resetPasswordUsingToken(
resetPasswordForm.getUsername(),
resetPasswordForm.getToken(),
resetPasswordForm.getPassword(),
resetPasswordForm.getConfirmPassword());
if (errorResponse.getHasErrors()) {
setErrors(errorResponse, request);
return getResetPasswordView();
} else {
return redirectToLoginWithMessage("passwordReset");
}
}
@RequestMapping(value="/forgotUsername", method=RequestMethod.POST)
public String processForgotUserName(HttpServletRequest request,
@RequestParam("emailAddress") String email) {
GenericResponse errorResponse = adminSecurityService.sendForgotUsernameNotification(email);
if (errorResponse.getHasErrors()) {
setErrors(errorResponse, request);
return getForgotUsernameView();
} else {
return redirectToLoginWithMessage("usernameSent");
}
}
@RequestMapping(value="/resetPassword", method=RequestMethod.GET)
public String resetPassword(HttpServletRequest request, HttpServletResponse response, Model model) {
return getResetPasswordView();
}
@ModelAttribute("resetPasswordForm")
public ResetPasswordForm initResetPasswordForm(HttpServletRequest request) {
ResetPasswordForm resetPasswordForm = new ResetPasswordForm();
String username = (String) request.getSession(true).getAttribute("forgot_password_username");
String token = request.getParameter("token");
resetPasswordForm.setToken(token);
resetPasswordForm.setUsername(username);
return resetPasswordForm;
}
@RequestMapping(value="/changePassword", method=RequestMethod.GET)
public String changePassword(HttpServletRequest request, HttpServletResponse response, Model model) {
SecurityContext c = SecurityContextHolder.getContext();
model.addAttribute("username", ((AdminUserDetails) c.getAuthentication().getPrincipal()).getUsername());
return "login/changePasswordPopup";
}
@RequestMapping(value="/changePassword", method=RequestMethod.POST)
public String processchangePassword(HttpServletRequest request, HttpServletResponse response, Model model,
@ModelAttribute("resetPasswordForm") ResetPasswordForm resetPasswordForm) {
GenericResponse errorResponse = adminSecurityService.changePassword(resetPasswordForm.getUsername(),
resetPasswordForm.getOldPassword(),
resetPasswordForm.getPassword(),
resetPasswordForm.getConfirmPassword());
if (errorResponse.getHasErrors()) {
String errorCode = errorResponse.getErrorCodesList().get(0);
return new JsonResponse(response)
.with("status", "error")
.with("errorText", BLCMessageUtils.getMessage("password." + errorCode))
.done();
} else {
return new JsonResponse(response)
.with("data.status", "ok")
.with("successMessage", BLCMessageUtils.getMessage("PasswordChange_success"))
.done();
}
}
protected String redirectToLoginWithMessage(String message) {
StringBuffer url = new StringBuffer("redirect:").append(loginRedirect).append("?messageCode=").append(message);
return url.toString();
}
protected String redirectToResetPasswordWithMessage(String message) {
StringBuffer url = new StringBuffer("redirect:").append(resetPasswordRedirect).append("?messageCode=").append(message);
return url.toString();
}
protected void setErrors(GenericResponse response, HttpServletRequest request) {
String errorCode = response.getErrorCodesList().get(0);
request.setAttribute("errorCode", errorCode);
}
protected AdminUser getPersistentAdminUser() {
SecurityContext ctx = SecurityContextHolder.getContext();
if (ctx != null) {
Authentication auth = ctx.getAuthentication();
if (auth != null && !auth.getName().equals(ANONYMOUS_USER_NAME)) {
UserDetails temp = (UserDetails) auth.getPrincipal();
return adminSecurityService.readAdminUserByUserName(temp.getUsername());
}
}
return null;
}
public static String getLoginView() {
return loginView;
}
public static void setLoginView(String loginView) {
AdminLoginController.loginView = loginView;
}
public static String getForgotPasswordView() {
return forgotPasswordView;
}
public static void setForgotPasswordView(String forgotPasswordView) {
AdminLoginController.forgotPasswordView = forgotPasswordView;
}
public static String getForgotUsernameView() {
return forgotUsernameView;
}
public static void setForgotUsernameView(String forgotUsernameView) {
AdminLoginController.forgotUsernameView = forgotUsernameView;
}
public static String getResetPasswordView() {
return resetPasswordView;
}
public static void setResetPasswordView(String resetPasswordView) {
AdminLoginController.resetPasswordView = resetPasswordView;
}
public static String getChangePasswordView() {
return changePasswordView;
}
public static void setChangePasswordView(String changePasswordView) {
AdminLoginController.changePasswordView = changePasswordView;
}
public AdminSecurityService getAdminSecurityService() {
return adminSecurityService;
}
public void setAdminSecurityService(AdminSecurityService adminSecurityService) {
this.adminSecurityService = adminSecurityService;
}
public static String getLoginRedirect() {
return loginRedirect;
}
public static void setLoginRedirect(String loginRedirect) {
AdminLoginController.loginRedirect = loginRedirect;
}
public static String getResetPasswordRedirect() {
return resetPasswordRedirect;
}
public static void setResetPasswordRedirect(String resetPasswordRedirect) {
AdminLoginController.resetPasswordRedirect = resetPasswordRedirect;
}
}