diff --git a/source/java/org/alfresco/web/app/Application.java b/source/java/org/alfresco/web/app/Application.java index d9860c0fbe..f327b0fd08 100644 --- a/source/java/org/alfresco/web/app/Application.java +++ b/source/java/org/alfresco/web/app/Application.java @@ -818,35 +818,46 @@ public class Application /** * Return the language Locale for the current user Session. * - * @param session HttpSession for the current user - * + * @param session + * HttpSession for the current user + * @param useInterfaceLanguage + * If the session language hasn't been established yet, should we base it on user preferences? * @return Current language Locale set or the VM default if none set - never null */ - public static Locale getLanguage(HttpSession session) + public static Locale getLanguage(HttpSession session, boolean useInterfaceLanguage) { Locale locale = (Locale)session.getAttribute(LOCALE); if (locale == null) { - // first check saved user preferences - String strLocale = null; - if (getCurrentUser(session) != null) + if (useInterfaceLanguage) { - strLocale = (String)PreferencesService.getPreferences(session).getValue( - UserPreferencesBean.PREF_INTERFACELANGUAGE); - if (strLocale != null) + // first check saved user preferences + String strLocale = null; + if (getCurrentUser(session) != null) { - locale = I18NUtil.parseLocale(strLocale); + strLocale = (String) PreferencesService.getPreferences(session).getValue( + UserPreferencesBean.PREF_INTERFACELANGUAGE); + if (strLocale != null) + { + locale = I18NUtil.parseLocale(strLocale); + } + else + { + // failing that, use the server default locale + locale = Locale.getDefault(); + } } else { - // failing that, use the server default locale - locale = Locale.getDefault(); + // else get from web-client config - the first item in the configured list of languages + locale = getLanguage(WebApplicationContextUtils.getRequiredWebApplicationContext(session + .getServletContext())); } } else { - // else get from web-client config - the first item in the configured list of languages - locale = getLanguage(WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext())); + // Get the request default, already decoded from the request headers + locale = I18NUtil.getLocale(); } // save in user session session.setAttribute(LOCALE, locale); diff --git a/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java b/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java index b3272c423c..56c6ed02db 100644 --- a/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java +++ b/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java @@ -103,21 +103,17 @@ public final class AuthenticationHelper * @param res * the response */ - public static void setupThread(ServletContext sc, HttpServletRequest req, HttpServletResponse res) + public static void setupThread(ServletContext sc, HttpServletRequest req, HttpServletResponse res, boolean useInterfaceLanguage) { // setup faces context FacesContext fc = Application.inPortalServer() ? AlfrescoFacesPortlet.getFacesContext(req) : FacesHelper .getFacesContext(req, res, sc); - // Set the current locale and language - if (Application.getClientConfig(fc).isLanguageSelect()) - { - I18NUtil.setLocale(Application.getLanguage(req.getSession())); - } + // Set the current locale and language (overriding the one already decoded from the Accept-Language header + I18NUtil.setLocale(Application.getLanguage(req.getSession(), Application.getClientConfig(fc).isLanguageSelect() && useInterfaceLanguage)); // Programatically retrieve the UserPreferencesBean from JSF - UserPreferencesBean userPreferencesBean = (UserPreferencesBean) fc.getApplication().createValueBinding( - "#{UserPreferencesBean}").getValue(fc); + UserPreferencesBean userPreferencesBean = (UserPreferencesBean) FacesHelper.getManagedBean(fc, "UserPreferencesBean"); if (userPreferencesBean != null) { String contentFilterLanguageStr = userPreferencesBean.getContentFilterLanguage(); @@ -202,7 +198,7 @@ public final class AuthenticationHelper setUser(sc, req, AuthenticationUtil.getGuestUserName(), auth.getCurrentTicket(), false); // Set up the thread context - setupThread(sc, req, res); + setupThread(sc, req, res, true); // remove the session invalidated flag session.removeAttribute(AuthenticationHelper.SESSION_INVALIDATED); @@ -246,7 +242,7 @@ public final class AuthenticationHelper } // Set up the thread context - setupThread(sc, req, res); + setupThread(sc, req, res, true); return AuthenticationStatus.Success; } @@ -307,8 +303,8 @@ public final class AuthenticationHelper return AuthenticationStatus.Failure; } - // Set up the thread context - setupThread(context, httpRequest, httpResponse); + // As we are authenticating via a ticket, establish the session locale using request headers rather than web client preferences + setupThread(context, httpRequest, httpResponse, false); return AuthenticationStatus.Success; } diff --git a/source/java/org/alfresco/web/app/servlet/GlobalLocalizationFilter.java b/source/java/org/alfresco/web/app/servlet/GlobalLocalizationFilter.java index 5a9f418d69..6d85d5727c 100644 --- a/source/java/org/alfresco/web/app/servlet/GlobalLocalizationFilter.java +++ b/source/java/org/alfresco/web/app/servlet/GlobalLocalizationFilter.java @@ -29,6 +29,8 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; import org.springframework.extensions.surf.util.I18NUtil; @@ -50,12 +52,45 @@ public class GlobalLocalizationFilter implements Filter */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - - setLanguageFromRequestHeader(httpRequest); + setLanguageFromRequestHeader((HttpServletRequest) request); // continue filter chaining - chain.doFilter(request, response); + chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response){ + + /* (non-Javadoc) + * @see javax.servlet.ServletResponseWrapper#setContentType(java.lang.String) + */ + @Override + public void setContentType(String type) + { + super.setContentType(type); + + // Parse the parameters of the media type, since some app servers (Websphere) refuse to pay attention if the + // character encoding isn't explicitly set + int startIndex = type.indexOf(';') + 1; + int length = type.length(); + while (startIndex != 0 && startIndex < length) + { + int endIndex = type.indexOf(';', startIndex); + if (endIndex == -1) + { + endIndex = length; + } + String param = type.substring(startIndex, endIndex); + int sepIndex = param.indexOf('='); + if (sepIndex != -1) + { + String name = param.substring(0, sepIndex).trim(); + if (name.equalsIgnoreCase("charset")) + { + setCharacterEncoding(param.substring(sepIndex+1).trim()); + break; + } + } + startIndex = endIndex + 1; + } + } + }); } diff --git a/source/java/org/alfresco/web/app/servlet/HTTPRequestAuthenticationFilter.java b/source/java/org/alfresco/web/app/servlet/HTTPRequestAuthenticationFilter.java index 14422b9aaa..8947c64918 100644 --- a/source/java/org/alfresco/web/app/servlet/HTTPRequestAuthenticationFilter.java +++ b/source/java/org/alfresco/web/app/servlet/HTTPRequestAuthenticationFilter.java @@ -177,7 +177,7 @@ public class HTTPRequestAuthenticationFilter implements Filter // Set the current locale authComponent.clearCurrentSecurityContext(); authComponent.setCurrentUser(user.getUserName()); - AuthenticationHelper.setupThread(this.context, req, resp); + AuthenticationHelper.setupThread(this.context, req, resp, true); chain.doFilter(sreq, sresp); return; } @@ -233,7 +233,7 @@ public class HTTPRequestAuthenticationFilter implements Filter AuthenticationHelper.setUser(context, req, userName, authenticationService.getCurrentTicket(), true); // Set the locale using the session - AuthenticationHelper.setupThread(this.context, req, res); + AuthenticationHelper.setupThread(this.context, req, res, true); } diff --git a/source/java/org/alfresco/web/app/servlet/KerberosAuthenticationFilter.java b/source/java/org/alfresco/web/app/servlet/KerberosAuthenticationFilter.java index 151b6446a8..4055b46f62 100644 --- a/source/java/org/alfresco/web/app/servlet/KerberosAuthenticationFilter.java +++ b/source/java/org/alfresco/web/app/servlet/KerberosAuthenticationFilter.java @@ -107,7 +107,7 @@ public class KerberosAuthenticationFilter extends BaseKerberosAuthenticationFilt protected void onValidate(ServletContext sc, HttpServletRequest req, HttpServletResponse res) { // Set the locale using the session - AuthenticationHelper.setupThread(sc, req, res); + AuthenticationHelper.setupThread(sc, req, res, true); } /* (non-Javadoc) diff --git a/source/java/org/alfresco/web/app/servlet/NTLMAuthenticationFilter.java b/source/java/org/alfresco/web/app/servlet/NTLMAuthenticationFilter.java index b6f77c355c..43a6a91d5c 100644 --- a/source/java/org/alfresco/web/app/servlet/NTLMAuthenticationFilter.java +++ b/source/java/org/alfresco/web/app/servlet/NTLMAuthenticationFilter.java @@ -101,7 +101,7 @@ public class NTLMAuthenticationFilter extends BaseNTLMAuthenticationFilter protected void onValidate(ServletContext sc, HttpServletRequest req, HttpServletResponse res) { // Set the locale using the session - AuthenticationHelper.setupThread(sc, req, res); + AuthenticationHelper.setupThread(sc, req, res, true); } /* (non-Javadoc) diff --git a/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java b/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java index 086c151764..f82c9e417a 100644 --- a/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java +++ b/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java @@ -129,7 +129,11 @@ public class WebScriptSSOAuthenticationFilter extends BaseAuthenticationFilter i String script = req.getPathInfo(); if (script != null && script.equals(API_LOGIN) && req.getMethod().equalsIgnoreCase("POST")) { - handleLoginForm(req, res); + if (handleLoginForm(req, res)); + { + // Establish the session locale using request headers rather than web client preferences + AuthenticationHelper.setupThread(context, req, res, false); + } } else { diff --git a/source/java/org/alfresco/web/bean/search/SearchContext.java b/source/java/org/alfresco/web/bean/search/SearchContext.java index c1874ed610..b089bd2885 100644 --- a/source/java/org/alfresco/web/bean/search/SearchContext.java +++ b/source/java/org/alfresco/web/bean/search/SearchContext.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * @@ -43,6 +43,7 @@ import org.alfresco.util.ISO9075; import org.alfresco.web.bean.repository.Repository; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.lucene.queryParser.QueryParser; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; @@ -194,7 +195,7 @@ public class SearchContext implements Serializable if (text.charAt(0) == '"' && text.charAt(text.length() - 1) == '"') { // as a single quoted phrase - String quotedSafeText = '"' + text.substring(1, text.length() - 1) + '"'; + String quotedSafeText = '"' + QueryParser.escape(text.substring(1, text.length() - 1)) + '"'; fullTextBuf.append("TEXT:").append(quotedSafeText); nameAttrBuf.append("@").append(nameAttr).append(":").append(quotedSafeText); for (QName qname : this.simpleSearchAdditionalAttrs) @@ -331,7 +332,7 @@ public class SearchContext implements Serializable String escapedName = Repository.escapeQName(qname); String value = queryFixedValues.get(qname); attributeQuery.append(" +@").append(escapedName) - .append(":\"").append(value).append('"'); + .append(":\"").append(QueryParser.escape(value)).append('"'); } } @@ -346,8 +347,8 @@ public class SearchContext implements Serializable { String escapedName = Repository.escapeQName(qname); RangeProperties rp = rangeAttributes.get(qname); - String value1 = AbstractLuceneQueryParser.escape(rp.lower); - String value2 = AbstractLuceneQueryParser.escape(rp.upper); + String value1 = QueryParser.escape(rp.lower); + String value2 = QueryParser.escape(rp.upper); attributeQuery.append(" +@").append(escapedName) .append(":").append(rp.inclusive ? "[" : "{").append(value1) .append(" TO ").append(value2).append(rp.inclusive ? "]" : "}"); @@ -499,7 +500,7 @@ public class SearchContext implements Serializable if (andOp) buf.append('+'); else if (notOp) buf.append('-'); buf.append('@').append(Repository.escapeQName(qname)).append(":\"") - .append(value).append("\" "); + .append(SearchContext.escape(value)).append("\" "); } /** @@ -511,12 +512,12 @@ public class SearchContext implements Serializable * @param attrBuf Attribute search buffer to append lucene terms to * @param textBuf Text search buffer to append lucene terms to */ - private static void processSearchTextAttribute(String qname, String value, StringBuilder attrBuf, StringBuilder textBuf) - { - textBuf.append("TEXT:\"").append(value).append('"'); - attrBuf.append('@').append(qname).append(":\"") - .append(value).append('"'); - } + private static void processSearchTextAttribute(String qname, String value, StringBuilder attrBuf, StringBuilder textBuf) + { + textBuf.append("TEXT:\"").append(SearchContext.escape(value)).append('"'); + attrBuf.append('@').append(qname).append(":\"") + .append(SearchContext.escape(value)).append('"'); + } /** * Returns a String where those characters that QueryParser @@ -563,7 +564,7 @@ public class SearchContext implements Serializable ChildAssociationRef elementRef = ((Path.ChildAssocElement)element).getRef(); if (elementRef.getParentRef() != null) { - Collection prefixes = ns.getPrefixes(elementRef.getQName().getNamespaceURI()); + Collection prefixes = ns.getPrefixes(elementRef.getQName().getNamespaceURI()); if (prefixes.size() >0) { elementString = '/' + (String)prefixes.iterator().next() + ':' + ISO9075.encode(elementRef.getQName().getLocalName()); diff --git a/source/web/scripts/ajax/xforms.js b/source/web/scripts/ajax/xforms.js index bbbee08377..6cbcb2a30e 100644 --- a/source/web/scripts/ajax/xforms.js +++ b/source/web/scripts/ajax/xforms.js @@ -937,9 +937,13 @@ alfresco.xforms.RichTextEditor = alfresco.xforms.Widget.extend({ tinyMCE.settings[i] = this._params[i]; } } + tinyMCE.settings.height = (this._params["height"]>0) ? parseInt(this._params["height"]) : this.widget.style.height; - tinyMCE.settings.width = (this._params["width"]>0) ? parseInt(this._params["width"]) : this.widget.style.width; - + tinyMCE.settings.width = (this._params["width"]>0) ? parseInt(this._params["width"]) : this.widget.style.width; + + // ALF-9089 + if (this._params["convert_fonts_to_spans"]=="false") tinyMCE.settings.convert_fonts_to_spans = false; + tinyMCE.settings.auto_focus = this.widget.id; tinyMCE.execCommand("mceAddControl", false, this.widget.id) var editorDocument = tinyMCE.get(this.widget.id).getDoc(); @@ -2997,14 +3001,23 @@ alfresco.xforms.VGroup = alfresco.xforms.AbstractGroup.extend({ parentOffsetWidth = this._children[i].domContainer.parentNode.offsetWidth; if (parentOffsetWidth != 0) { - contentDiv.style.width = (this._children[i] instanceof alfresco.xforms.AbstractGroup + contentDiv.style.width = (this._children[i] instanceof alfresco.xforms.AbstractGroup ? "100%" : (1 - (contentDiv.offsetLeft / parentOffsetWidth)) * 100 + "%"); } else { - contentDiv.style.width = "100%"; + contentDiv.style.width = "100%"; + } + + if (contentDiv.labelNode) + { + contentDiv.labelNode.style.position = "relative"; + contentDiv.labelNode.style.top = "0px"; + contentDiv.labelNode.style.height = contentDiv.offsetHeight + "px"; + contentDiv.labelNode.style.lineHeight = contentDiv.labelNode.style.height; + contentDiv.labelNode.style.width = contentDiv.labelNode.scrollWidth + "px"; } if (recursively)