/* * Copyright 2007 Zhang, Zheng <oldbig@gmail.com> * * This file is part of ZOJ. * * ZOJ is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either revision 3 of the License, or (at your option) any later revision. * * ZOJ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with ZOJ. if not, see * <http://www.gnu.org/licenses/>. */ package cn.edu.zju.acm.onlinejudge.action; import javax.servlet.http.Cookie; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import cn.edu.zju.acm.onlinejudge.bean.UserPreference; import cn.edu.zju.acm.onlinejudge.bean.UserProfile; import cn.edu.zju.acm.onlinejudge.form.LoginForm; import cn.edu.zju.acm.onlinejudge.persistence.AuthorizationPersistence; import cn.edu.zju.acm.onlinejudge.persistence.PersistenceException; import cn.edu.zju.acm.onlinejudge.persistence.UserPersistence; import cn.edu.zju.acm.onlinejudge.security.UserSecurity; import cn.edu.zju.acm.onlinejudge.util.PersistenceManager; /** * <p> * Login Action. * </p> * * * @author Zhang, Zheng * @version 2.0 */ public class LoginAction extends BaseAction { /** * <p> * Default constructor. * </p> */ public LoginAction() { // empty } /** * Login. * * <pre> * </pre> * * @param mapping * action mapping * @param form * action form * @param request * http servlet request * @param response * http servlet response * * @return action forward instance * * @throws Exception * any errors happened */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, ContextAdapter context) throws Exception { LoginForm loginForm = (LoginForm) form; String forwardPath = context.getRequest().getParameter("forward"); if (loginForm.getHandle() == null) { context.setAttribute("forward", forwardPath); return this.handleSuccess(mapping, context, "failure"); } ActionMessages errors = this.authenticate(loginForm, context); if (errors.size() > 0) { context.setAttribute("forward", forwardPath); return this.handleFailure(mapping, context, errors); } if (loginForm.isRememberMe()) { Cookie ch = new Cookie("oj_handle", loginForm.getHandle()); ch.setMaxAge(3600 * 24 * 30); ch.setPath("/"); context.getResponse().addCookie(ch); Cookie cp = new Cookie("oj_password", loginForm.getPassword()); cp.setMaxAge(3600 * 24 * 30); cp.setPath("/"); context.getResponse().addCookie(cp); } if (forwardPath != null) { return this.handleSuccess(new ActionForward(forwardPath, true), context, forwardPath); } return this.handleSuccess(mapping, context, "success"); } /** * Authenticate. * * @param form * @return * @throws Exception */ private ActionMessages authenticate(LoginForm form, ContextAdapter context) throws PersistenceException { context.getRequest().getSession().invalidate(); ActionMessages errors = new ActionMessages(); UserPersistence userPersistence = PersistenceManager.getInstance().getUserPersistence(); UserProfile profile = userPersistence.login(form.getHandle(), form.getPassword()); // no such user if (profile == null) { errors.add("password", new ActionMessage("LoginForm.password.invalid")); return errors; } // deactivated if (!profile.isActive()) { errors.add("password", new ActionMessage("LoginForm.password.deactivated")); return errors; } AuthorizationPersistence authorizationPersistence = PersistenceManager.getInstance().getAuthorizationPersistence(); // get UserSecurity UserSecurity security = authorizationPersistence.getUserSecurity(profile.getId()); // get UserPreference UserPreference perference = userPersistence.getUserPreference(profile.getId()); context.setUserProfile(profile); context.setUserSecurity(security); if(context.getAllCourses().size()!=0) { security.setHasCourses(true); } else { security.setHasCourses(false); } context.setUserPreference(perference); return errors; } }