Subversion Repositories general

Rev

Rev 1056 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package ak.hostadmiral.core.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;

import ak.backpath.BackPath;

import ak.hostadmiral.core.resources.CoreResources;
import ak.hostadmiral.core.model.User;
import ak.hostadmiral.core.model.UserManager;
import ak.hostadmiral.core.servlet.LoginInfo;
import ak.hostadmiral.core.servlet.SessionKeys;

public final class LoginAction
        extends Action
{
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response)
                throws Exception
        {
                ActionUtils.prepare(request, response);

                if("show".equals(mapping.getParameter())) {
                        return mapping.findForward("default");
                }
                else if("submit".equals(mapping.getParameter())) {
                        DynaActionForm theForm = (DynaActionForm)form;
                        User user = UserManager.getInstance().loginUser((String)theForm.get("login"),
                                (String)theForm.get("password"), request.getRemoteAddr());

                        if(user == null) {
                                Thread.sleep(1000); // FIXME: make this delay configurable

                                ActionErrors errors = new ActionErrors();
                                errors.add(ActionMessages.GLOBAL_MESSAGE,
                                        new ActionError(CoreResources.LOGIN_FAILED));
                                saveErrors(request, errors);
                                return mapping.getInputForward();
                        }
                    else {
                        request.getSession().setAttribute(SessionKeys.USER, user);
                        request.getSession().setAttribute(SessionKeys.LOGIN_INFO,
                                new LoginInfo(user.getId()));
                        request.getSession().setAttribute(Globals.LOCALE_KEY, user.getLocale());

                        String origin = BackPath.findBackPath(request).getBackwardUrl();
                        if(origin == null || origin.length() <= 0) {
                                        return mapping.findForward("default");
                                }
                                else {
                                        response.sendRedirect(origin);
                                        return null;
                                }
                        }
                }
                else {
                        throw new Exception("unknown mapping parameter");
                }
        }
}