mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Cleanup of duplicated code in Utils (webclient) and StringUtils (webscriptframework).
Change header case check to case-insensitive in RemoteClient. Addition of helper object to Script root scope for WebScripts - 'scriptUtils' with helper methods for encoding and stripping of HTML/JS etc. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@10216 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -66,8 +66,8 @@ public class CreatePostDialog extends CreateContentWizard
|
|||||||
this.mimeType = Repository.getMimeTypeForFileName(
|
this.mimeType = Repository.getMimeTypeForFileName(
|
||||||
FacesContext.getCurrentInstance(), this.fileName);
|
FacesContext.getCurrentInstance(), this.fileName);
|
||||||
|
|
||||||
// remove link breaks and replace with <br/>
|
// remove link breaks and replace with <br>
|
||||||
this.content = Utils.replaceLineBreaks(this.content);
|
this.content = Utils.replaceLineBreaks(this.content, false);
|
||||||
|
|
||||||
return super.finishImpl(context, outcome);
|
return super.finishImpl(context, outcome);
|
||||||
}
|
}
|
||||||
|
@@ -61,8 +61,8 @@ public class CreateReplyDialog extends CreatePostDialog
|
|||||||
@Override
|
@Override
|
||||||
protected String finishImpl(FacesContext context, String outcome) throws Exception
|
protected String finishImpl(FacesContext context, String outcome) throws Exception
|
||||||
{
|
{
|
||||||
// remove link breaks and replace with <br/>
|
// remove link breaks and replace with <br>
|
||||||
this.content = Utils.replaceLineBreaks(this.content);
|
this.content = Utils.replaceLineBreaks(this.content, false);
|
||||||
|
|
||||||
super.finishImpl(context, outcome);
|
super.finishImpl(context, outcome);
|
||||||
|
|
||||||
|
@@ -112,7 +112,7 @@ public class CreateTopicDialog extends CreateSpaceDialog
|
|||||||
// set the mimetype and encoding
|
// set the mimetype and encoding
|
||||||
writer.setMimetype(Repository.getMimeTypeForFileName(context, fileName));
|
writer.setMimetype(Repository.getMimeTypeForFileName(context, fileName));
|
||||||
writer.setEncoding("UTF-8");
|
writer.setEncoding("UTF-8");
|
||||||
writer.putContent(Utils.replaceLineBreaks(this.message));
|
writer.putContent(Utils.replaceLineBreaks(this.message, false));
|
||||||
|
|
||||||
return outcome;
|
return outcome;
|
||||||
}
|
}
|
||||||
|
@@ -73,8 +73,8 @@ public class EditPostDialog extends CreatePostDialog
|
|||||||
@Override
|
@Override
|
||||||
protected String finishImpl(FacesContext context, String outcome) throws Exception
|
protected String finishImpl(FacesContext context, String outcome) throws Exception
|
||||||
{
|
{
|
||||||
// remove link breaks and replace with <br/>
|
// remove link breaks and replace with <br>
|
||||||
this.content = Utils.replaceLineBreaks(this.content);
|
this.content = Utils.replaceLineBreaks(this.content, false);
|
||||||
|
|
||||||
// update the content
|
// update the content
|
||||||
NodeRef postNode = this.browseBean.getDocument().getNodeRef();
|
NodeRef postNode = this.browseBean.getDocument().getNodeRef();
|
||||||
|
@@ -24,19 +24,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.web.ui.common;
|
package org.alfresco.web.ui.common;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.faces.application.FacesMessage;
|
import javax.faces.application.FacesMessage;
|
||||||
import javax.faces.component.NamingContainer;
|
import javax.faces.component.NamingContainer;
|
||||||
@@ -81,7 +77,6 @@ import org.alfresco.web.ui.common.component.UIStatusMessage;
|
|||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.myfaces.shared_impl.renderkit.html.HtmlFormRendererBase;
|
import org.apache.myfaces.shared_impl.renderkit.html.HtmlFormRendererBase;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
import org.springframework.web.jsf.FacesContextUtils;
|
import org.springframework.web.jsf.FacesContextUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,7 +84,7 @@ import org.springframework.web.jsf.FacesContextUtils;
|
|||||||
*
|
*
|
||||||
* @author Kevin Roast
|
* @author Kevin Roast
|
||||||
*/
|
*/
|
||||||
public final class Utils
|
public final class Utils extends StringUtils
|
||||||
{
|
{
|
||||||
private static final String MSG_TIME_PATTERN = "time_pattern";
|
private static final String MSG_TIME_PATTERN = "time_pattern";
|
||||||
private static final String MSG_DATE_PATTERN = "date_pattern";
|
private static final String MSG_DATE_PATTERN = "date_pattern";
|
||||||
@@ -97,44 +92,6 @@ public final class Utils
|
|||||||
|
|
||||||
private static final Log logger = LogFactory.getLog(Utils.class);
|
private static final Log logger = LogFactory.getLog(Utils.class);
|
||||||
|
|
||||||
private static final Set<String> safeTags = new HashSet<String>();
|
|
||||||
|
|
||||||
static
|
|
||||||
{
|
|
||||||
safeTags.add("p");
|
|
||||||
safeTags.add("/p");
|
|
||||||
safeTags.add("b");
|
|
||||||
safeTags.add("/b");
|
|
||||||
safeTags.add("i");
|
|
||||||
safeTags.add("/i");
|
|
||||||
safeTags.add("br");
|
|
||||||
safeTags.add("ul");
|
|
||||||
safeTags.add("/ul");
|
|
||||||
safeTags.add("ol");
|
|
||||||
safeTags.add("/ol");
|
|
||||||
safeTags.add("li");
|
|
||||||
safeTags.add("/li");
|
|
||||||
safeTags.add("h1");
|
|
||||||
safeTags.add("/h1");
|
|
||||||
safeTags.add("h2");
|
|
||||||
safeTags.add("/h2");
|
|
||||||
safeTags.add("h3");
|
|
||||||
safeTags.add("/h3");
|
|
||||||
safeTags.add("h4");
|
|
||||||
safeTags.add("/h4");
|
|
||||||
safeTags.add("h5");
|
|
||||||
safeTags.add("/h5");
|
|
||||||
safeTags.add("h6");
|
|
||||||
safeTags.add("/h6");
|
|
||||||
safeTags.add("span");
|
|
||||||
safeTags.add("/span");
|
|
||||||
safeTags.add("a");
|
|
||||||
safeTags.add("/a");
|
|
||||||
safeTags.add("img");
|
|
||||||
safeTags.add("font");
|
|
||||||
safeTags.add("/font");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private constructor
|
* Private constructor
|
||||||
*/
|
*/
|
||||||
@@ -142,331 +99,6 @@ public final class Utils
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the given string, so that it can be used within an HTML page.
|
|
||||||
*
|
|
||||||
* @param string the String to convert
|
|
||||||
*/
|
|
||||||
public static String encode(String string)
|
|
||||||
{
|
|
||||||
if (string == null)
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder sb = null; //create on demand
|
|
||||||
String enc;
|
|
||||||
char c;
|
|
||||||
for (int i = 0; i < string.length(); i++)
|
|
||||||
{
|
|
||||||
enc = null;
|
|
||||||
c = string.charAt(i);
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case '"': enc = """; break; //"
|
|
||||||
case '&': enc = "&"; break; //&
|
|
||||||
case '<': enc = "<"; break; //<
|
|
||||||
case '>': enc = ">"; break; //>
|
|
||||||
|
|
||||||
//misc
|
|
||||||
//case 0x80: enc = "€"; break; sometimes euro symbol is ascii 128, should we suport it?
|
|
||||||
case '\u20AC': enc = "€"; break;
|
|
||||||
case '\u00AB': enc = "«"; break;
|
|
||||||
case '\u00BB': enc = "»"; break;
|
|
||||||
case '\u00A0': enc = " "; break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (((int)c) >= 0x80)
|
|
||||||
{
|
|
||||||
//encode all non basic latin characters
|
|
||||||
enc = "&#" + ((int)c) + ";";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (enc != null)
|
|
||||||
{
|
|
||||||
if (sb == null)
|
|
||||||
{
|
|
||||||
String soFar = string.substring(0, i);
|
|
||||||
sb = new StringBuilder(i + 8);
|
|
||||||
sb.append(soFar);
|
|
||||||
}
|
|
||||||
sb.append(enc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (sb != null)
|
|
||||||
{
|
|
||||||
sb.append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sb == null)
|
|
||||||
{
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Crop a label within a SPAN element, using ellipses '...' at the end of label and
|
|
||||||
* and encode the result for HTML output. A SPAN will only be generated if the label
|
|
||||||
* is beyond the default setting of 32 characters in length.
|
|
||||||
*
|
|
||||||
* @param text to crop and encode
|
|
||||||
*
|
|
||||||
* @return encoded and cropped resulting label HTML
|
|
||||||
*/
|
|
||||||
public static String cropEncode(String text)
|
|
||||||
{
|
|
||||||
return cropEncode(text, 32);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Crop a label within a SPAN element, using ellipses '...' at the end of label and
|
|
||||||
* and encode the result for HTML output. A SPAN will only be generated if the label
|
|
||||||
* is beyond the specified number of characters in length.
|
|
||||||
*
|
|
||||||
* @param text to crop and encode
|
|
||||||
* @param length length of string to crop too
|
|
||||||
*
|
|
||||||
* @return encoded and cropped resulting label HTML
|
|
||||||
*/
|
|
||||||
public static String cropEncode(String text, int length)
|
|
||||||
{
|
|
||||||
if (text.length() > length)
|
|
||||||
{
|
|
||||||
String label = text.substring(0, length - 3) + "...";
|
|
||||||
StringBuilder buf = new StringBuilder(length + 32 + text.length());
|
|
||||||
buf.append("<span title=\"")
|
|
||||||
.append(Utils.encode(text))
|
|
||||||
.append("\">")
|
|
||||||
.append(Utils.encode(label))
|
|
||||||
.append("</span>");
|
|
||||||
return buf.toString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return Utils.encode(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode a string to the %AB hex style JavaScript compatible notation.
|
|
||||||
* Used to encode a string to a value that can be safely inserted into an HTML page and
|
|
||||||
* then decoded (and probably eval()ed) using the unescape() JavaScript method.
|
|
||||||
*
|
|
||||||
* @param s string to encode
|
|
||||||
*
|
|
||||||
* @return %AB hex style encoded string
|
|
||||||
*/
|
|
||||||
public static String encodeJavascript(String s)
|
|
||||||
{
|
|
||||||
StringBuilder buf = new StringBuilder(s.length() * 3);
|
|
||||||
for (int i=0; i<s.length(); i++)
|
|
||||||
{
|
|
||||||
char c = s.charAt(i);
|
|
||||||
int iChar = (int)c;
|
|
||||||
buf.append('%');
|
|
||||||
buf.append(Integer.toHexString(iChar));
|
|
||||||
}
|
|
||||||
return buf.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Strip unsafe HTML tags from a string - only leaves most basic formatting tags
|
|
||||||
* and encodes or strips the remaining characters.
|
|
||||||
*
|
|
||||||
* @param s HTML string to strip tags from
|
|
||||||
*
|
|
||||||
* @return safe string
|
|
||||||
*/
|
|
||||||
public static String stripUnsafeHTMLTags(String s)
|
|
||||||
{
|
|
||||||
s = s.replace("onclick", "$");
|
|
||||||
s = s.replace("onmouseover", "$");
|
|
||||||
s = s.replace("onmouseout", "$");
|
|
||||||
s = s.replace("onmousemove", "$");
|
|
||||||
s = s.replace("onfocus", "$");
|
|
||||||
s = s.replace("onblur", "$");
|
|
||||||
StringBuilder buf = new StringBuilder(s.length());
|
|
||||||
char[] chars = s.toCharArray();
|
|
||||||
for (int i=0; i<chars.length; i++)
|
|
||||||
{
|
|
||||||
if (chars[i] == '<')
|
|
||||||
{
|
|
||||||
// found a tag?
|
|
||||||
int endMatchIndex = -1;
|
|
||||||
int endTagIndex = -1;
|
|
||||||
if (i < chars.length - 2)
|
|
||||||
{
|
|
||||||
for (int x=(i + 1); x<chars.length; x++)
|
|
||||||
{
|
|
||||||
if (chars[x] == ' ' && endMatchIndex == -1)
|
|
||||||
{
|
|
||||||
// keep track of the match point for comparing tags in the safeTags set
|
|
||||||
endMatchIndex = x;
|
|
||||||
}
|
|
||||||
else if (chars[x] == '>')
|
|
||||||
{
|
|
||||||
endTagIndex = x;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (chars[x] == '<')
|
|
||||||
{
|
|
||||||
// found another angle bracket - not a tag def so we can safely output to here
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (endTagIndex != -1)
|
|
||||||
{
|
|
||||||
// found end of the tag to match
|
|
||||||
String tag = s.substring(i + 1, endTagIndex);
|
|
||||||
String matchTag = tag;
|
|
||||||
if (endMatchIndex != -1)
|
|
||||||
{
|
|
||||||
matchTag = s.substring(i + 1, endMatchIndex);
|
|
||||||
}
|
|
||||||
if (safeTags.contains(matchTag.toLowerCase()))
|
|
||||||
{
|
|
||||||
// safe tag - append to buffer
|
|
||||||
buf.append('<').append(tag).append('>');
|
|
||||||
}
|
|
||||||
// inc counter to skip past whole tag
|
|
||||||
i = endTagIndex;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String enc = null;
|
|
||||||
switch (chars[i])
|
|
||||||
{
|
|
||||||
case '"': enc = """; break;
|
|
||||||
case '&': enc = "&"; break;
|
|
||||||
case '<': enc = "<"; break;
|
|
||||||
case '>': enc = ">"; break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (((int)chars[i]) >= 0x80)
|
|
||||||
{
|
|
||||||
//encode all non basic latin characters
|
|
||||||
enc = "&#" + ((int)chars[i]) + ";";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
buf.append(enc == null ? chars[i] : enc);
|
|
||||||
}
|
|
||||||
return buf.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace one string instance with another within the specified string
|
|
||||||
*
|
|
||||||
* @param str
|
|
||||||
* @param repl
|
|
||||||
* @param with
|
|
||||||
*
|
|
||||||
* @return replaced string
|
|
||||||
*/
|
|
||||||
public static String replace(String str, String repl, String with)
|
|
||||||
{
|
|
||||||
int lastindex = 0;
|
|
||||||
int pos = str.indexOf(repl);
|
|
||||||
|
|
||||||
// If no replacement needed, return the original string
|
|
||||||
// and save StringBuffer allocation/char copying
|
|
||||||
if (pos < 0)
|
|
||||||
{
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = repl.length();
|
|
||||||
int lendiff = with.length() - repl.length();
|
|
||||||
StringBuilder out = new StringBuilder((lendiff <= 0) ? str.length() : (str.length() + (lendiff << 3)));
|
|
||||||
for (; pos >= 0; pos = str.indexOf(repl, lastindex = pos + len))
|
|
||||||
{
|
|
||||||
out.append(str.substring(lastindex, pos)).append(with);
|
|
||||||
}
|
|
||||||
|
|
||||||
return out.append(str.substring(lastindex, str.length())).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove all occurances of a String from a String
|
|
||||||
*
|
|
||||||
* @param str String to remove occurances from
|
|
||||||
* @param match The string to remove
|
|
||||||
*
|
|
||||||
* @return new String with occurances of the match removed
|
|
||||||
*/
|
|
||||||
public static String remove(String str, String match)
|
|
||||||
{
|
|
||||||
int lastindex = 0;
|
|
||||||
int pos = str.indexOf(match);
|
|
||||||
|
|
||||||
// If no replacement needed, return the original string
|
|
||||||
// and save StringBuffer allocation/char copying
|
|
||||||
if (pos < 0)
|
|
||||||
{
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = match.length();
|
|
||||||
StringBuilder out = new StringBuilder(str.length());
|
|
||||||
for (; pos >= 0; pos = str.indexOf(match, lastindex = pos + len))
|
|
||||||
{
|
|
||||||
out.append(str.substring(lastindex, pos));
|
|
||||||
}
|
|
||||||
|
|
||||||
return out.append(str.substring(lastindex, str.length())).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replaces carriage returns and line breaks with the <br> tag.
|
|
||||||
*
|
|
||||||
* @param str The string to be parsed
|
|
||||||
* @return The string with line breaks removed
|
|
||||||
*/
|
|
||||||
public static String replaceLineBreaks(String str)
|
|
||||||
{
|
|
||||||
String replaced = null;
|
|
||||||
|
|
||||||
if (str != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
StringBuilder parsedContent = new StringBuilder(str.length() + 32);
|
|
||||||
BufferedReader reader = new BufferedReader(new StringReader(str));
|
|
||||||
String line = reader.readLine();
|
|
||||||
while (line != null)
|
|
||||||
{
|
|
||||||
parsedContent.append(line);
|
|
||||||
line = reader.readLine();
|
|
||||||
if (line != null)
|
|
||||||
{
|
|
||||||
parsedContent.append("<br>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
replaced = parsedContent.toString();
|
|
||||||
}
|
|
||||||
catch (IOException ioe)
|
|
||||||
{
|
|
||||||
if (logger.isWarnEnabled())
|
|
||||||
{
|
|
||||||
logger.warn("Failed to replace line breaks in string: " + str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return replaced;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper to output an attribute to the output stream
|
* Helper to output an attribute to the output stream
|
||||||
*
|
*
|
||||||
@@ -632,7 +264,7 @@ public final class Utils
|
|||||||
buf.append("']['");
|
buf.append("']['");
|
||||||
buf.append(name);
|
buf.append(name);
|
||||||
buf.append("'].value='");
|
buf.append("'].value='");
|
||||||
buf.append(StringUtils.replace(params.get(name), "'", "\\'"));
|
buf.append(replace(params.get(name), "'", "\\'"));
|
||||||
buf.append("';");
|
buf.append("';");
|
||||||
|
|
||||||
// weak, but this seems to be the way Sun RI do it...
|
// weak, but this seems to be the way Sun RI do it...
|
||||||
|
Reference in New Issue
Block a user