📄 cmslogin.java
字号:
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/workplace/CmsLogin.java,v $
* Date : $Date: 2006/03/27 14:52:43 $
* Version: $Revision: 1.24 $
*
* This library is part of OpenCms -
* the Open Source Content Mananagement System
*
* Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.workplace;
import org.opencms.db.CmsLoginMessage;
import org.opencms.db.CmsUserSettings;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsResourceFilter;
import org.opencms.i18n.CmsAcceptLanguageHeaderParser;
import org.opencms.i18n.CmsEncoder;
import org.opencms.i18n.CmsMessageContainer;
import org.opencms.jsp.CmsJspLoginBean;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUriSplitter;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;
import org.apache.commons.logging.Log;
/**
* Handles the login of Users to the OpenCms workplace.<p>
*
* @author Alexander Kandzior
*
* @version $Revision: 1.24 $
*
* @since 6.0.0
*/
public class CmsLogin extends CmsJspLoginBean {
/** Action constant: Default action, display the dialog. */
private static final int ACTION_DISPLAY = 0;
/** Action constant: Login sucessful. */
private static final int ACTION_LOGIN = 1;
/** Action constant: Logout. */
private static final int ACTION_LOGOUT = 2;
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsLogin.class);
/** The parameter name for the "login" action. */
private static final String PARAM_ACTION_LOGIN = "login";
/** The parameter name for the "logout" action. */
private static final String PARAM_ACTION_LOGOUT = "logout";
/** The html id for the login form. */
private static final String PARAM_FORM = "ocLoginForm";
/** The parameter name for the password. */
private static final String PARAM_PASSWORD = "ocPword";
/** The parameter name for the user name. */
private static final String PARAM_USERNAME = "ocUname";
/** The action to perform. */
private int m_action;
/** The value of the "login" action parameter. */
private String m_actionLogin;
/** The value of the "logout" action parameter. */
private String m_actionLogout;
/** The locale to use for display, this will not be the workplace locale, but the browser locale. */
private Locale m_locale;
/** The message to display with the dialog in a JavaScrip alert. */
private CmsMessageContainer m_message;
/** The value of the password parameter. */
private String m_password;
/** The redirect URL after a successful login. */
private String m_requestedResource;
/** The value of the user name parameter. */
private String m_username;
/**
* Public constructor for login page.<p>
*
* @param context the JSP page context object
* @param req the JSP request
* @param res the JSP response
*/
public CmsLogin(PageContext context, HttpServletRequest req, HttpServletResponse res) {
super(context, req, res);
// this page must never be cached
res.setDateHeader(CmsRequestUtil.HEADER_LAST_MODIFIED, System.currentTimeMillis());
CmsRequestUtil.setNoCacheHeaders(res);
// divine the best locale from the users browser settings
CmsAcceptLanguageHeaderParser parser = new CmsAcceptLanguageHeaderParser(
req,
OpenCms.getWorkplaceManager().getDefaultLocale());
List acceptedLocales = parser.getAcceptedLocales();
List workplaceLocales = OpenCms.getWorkplaceManager().getLocales();
m_locale = OpenCms.getLocaleManager().getFirstMatchingLocale(acceptedLocales, workplaceLocales);
if (m_locale == null) {
// no match found - use OpenCms default locale
m_locale = OpenCms.getWorkplaceManager().getDefaultLocale();
}
}
/**
* Returns the HTML for the login dialog in it's current state.<p>
*
* @return the HTML for the login dialog
*
* @throws IOException in case a redirect fails
*/
public String displayDialog() throws IOException {
if ((OpenCms.getSiteManager().getSites().size() > 1)
&& !OpenCms.getSiteManager().isWorkplaceRequest(getRequest())) {
// this is a multi site-configuration, but not a request to the configured Workplace site
StringBuffer loginLink = new StringBuffer();
loginLink.append(OpenCms.getSiteManager().getWorkplaceSiteMatcher().toString());
loginLink.append(getFormLink());
// send a redirect to the workplace site
getResponse().sendRedirect(loginLink.toString());
return null;
}
CmsObject cms = getCmsObject();
m_message = null;
if (cms.getRequestContext().currentUser().isGuestUser()) {
// user is not currently logged in
m_action = ACTION_DISPLAY;
m_username = CmsRequestUtil.getNotEmptyParameter(getRequest(), PARAM_USERNAME);
if (m_username != null) {
// remove white spaces, can only lead to confusion on user name
m_username = m_username.trim();
}
m_password = CmsRequestUtil.getNotEmptyParameter(getRequest(), PARAM_PASSWORD);
m_actionLogin = CmsRequestUtil.getNotEmptyParameter(getRequest(), PARAM_ACTION_LOGIN);
} else {
// user is already logged in
m_action = ACTION_LOGIN;
m_actionLogout = CmsRequestUtil.getNotEmptyParameter(getRequest(), PARAM_ACTION_LOGOUT);
}
m_requestedResource = CmsRequestUtil.getNotEmptyParameter(
getRequest(),
CmsWorkplaceManager.PARAM_LOGIN_REQUESTED_RESOURCE);
if (m_requestedResource == null) {
// no resource was requested, use default workplace URI
m_requestedResource = CmsFrameset.JSP_WORKPLACE_URI;
} else {
if (m_actionLogin != null) {
m_requestedResource = CmsEncoder.decode(m_requestedResource);
}
}
if (Boolean.valueOf(m_actionLogin).booleanValue()) {
// login was requested
if ((m_username == null) && (m_password == null)) {
m_message = Messages.get().container(Messages.GUI_LOGIN_NO_DATA_0);
} else if (m_username == null) {
m_message = Messages.get().container(Messages.GUI_LOGIN_NO_NAME_0);
} else if (m_password == null) {
m_message = Messages.get().container(Messages.GUI_LOGIN_NO_PASSWORD_0);
} else if ((m_username != null) && (m_password != null)) {
// try to login with the given user information
login(m_username, m_password);
if (getLoginException() == null) {
// the login was successful
m_action = ACTION_LOGIN;
// set the default project of the user
CmsUserSettings settings = new CmsUserSettings(cms);
try {
CmsProject project = cms.readProject(settings.getStartProject());
if (cms.getAllAccessibleProjects().contains(project)) {
// user has access to the project, set this as current project
cms.getRequestContext().setCurrentProject(project);
}
} catch (Exception e) {
// unable to set the startup project, bad but not critical
LOG.warn(Messages.get().getBundle().key(
Messages.LOG_LOGIN_NO_STARTUP_PROJECT_2,
m_username,
settings.getStartProject()), e);
}
} else {
// there was an error during login
if (org.opencms.security.Messages.ERR_LOGIN_FAILED_DISABLED_3 == getLoginException().getMessageContainer().getKey()) {
// the user account is disabled
m_message = Messages.get().container(Messages.GUI_LOGIN_FAILED_DISABLED_0);
} else if (org.opencms.security.Messages.ERR_LOGIN_FAILED_TEMP_DISABLED_5 == getLoginException().getMessageContainer().getKey()) {
// the user account is temporarily disabled because of too many login failures
m_message = Messages.get().container(Messages.GUI_LOGIN_FAILED_TEMP_DISABLED_0);
} else if (org.opencms.security.Messages.ERR_LOGIN_FAILED_WITH_MESSAGE_1 == getLoginException().getMessageContainer().getKey()) {
// all logins have been diasabled be the Administration
CmsLoginMessage loginMessage = OpenCms.getLoginManager().getLoginMessage();
if (loginMessage != null) {
m_message = Messages.get().container(
Messages.GUI_LOGIN_FAILED_WITH_MESSAGE_1,
loginMessage.getMessage());
}
}
if (m_message == null) {
// any other error - display default message
m_message = Messages.get().container(Messages.GUI_LOGIN_FAILED_0);
}
}
}
} else if (Boolean.valueOf(m_actionLogout).booleanValue()) {
m_action = ACTION_LOGOUT;
// after logout this will automatically redirect to the login form again
logout();
return null;
}
if (m_action == ACTION_LOGIN) {
// clear message
m_message = null;
// login is successful, check if the requested resource can be read
CmsUriSplitter splitter = new CmsUriSplitter(m_requestedResource, true);
String resource = splitter.getPrefix();
if (CmsStringUtil.isEmptyOrWhitespaceOnly(resource)) {
// bad resource name, use workplace as default
resource = CmsFrameset.JSP_WORKPLACE_URI;
}
if (!getCmsObject().existsResource(resource, CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)) {
// requested resource does either not exist or is not readable by user
if (CmsFrameset.JSP_WORKPLACE_URI.equals(resource)) {
// we know the Workplace exists, so the user does not have access to the Workplace
// probalbly this is a "Guest" user in a default setup where "Guest" has no access to the Workplace
m_message = Messages.get().container(Messages.GUI_LOGIN_FAILED_NO_WORKPLACE_PERMISSIONS_0);
m_action = ACTION_DISPLAY;
} else if (getCmsObject().existsResource(CmsFrameset.JSP_WORKPLACE_URI)) {
// resource does either not exist or is not readable, but general workplace permissions are granted
m_message = Messages.get().container(Messages.GUI_LOGIN_UNKNOWN_RESOURCE_1, m_requestedResource);
m_requestedResource = CmsFrameset.JSP_WORKPLACE_URI;
} else {
// resource does not exist and no general workplace permissions granted
m_message = Messages.get().container(
Messages.GUI_LOGIN_FAILED_NO_TARGET_PERMISSIONS_1,
m_requestedResource);
m_action = ACTION_DISPLAY;
}
}
if (m_action == ACTION_DISPLAY) {
// the login was invalid
m_requestedResource = null;
// destroy the generated session
HttpSession session = getRequest().getSession(false);
if (session != null) {
session.invalidate();
}
}
}
return displayLoginForm();
}
/**
* Appends the JavaScript for the login screen
* to the given HTML buffer.<p>
*
* @param html the html buffer to append the script to
* @param message the message to display after an unsuccessful login
*/
protected void appendDefaultLoginScript(StringBuffer html, CmsMessageContainer message) {
html.append("<script type=\"text/javascript\">\n");
if (message != null) {
html.append("function showAlert() {\n");
html.append("\talert(\"");
html.append(CmsStringUtil.escapeJavaScript(message.key(m_locale)));
html.append("\");\n");
html.append("}\n");
}
html.append("function doOnload() {\n");
html.append("\tdocument.");
html.append(PARAM_FORM);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -