Files
OurUmbraco/uWiki/Library/Utills.cs
T
Sebastiaan Janssen 810cbd267f Initial commit
2012-12-17 09:41:11 +01:00

131 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Web;
using umbraco.cms.businesslogic.member;
using System.Xml;
namespace uWiki.Library {
public class Utills {
private static Regex _tags = new Regex("<[^>]*(>|$)", RegexOptions.Singleline | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
private static Regex _whitelist = new Regex(@"
^</?(a|b(lockquote)?|code|em|h(1|2|3)|i|li|ol|p(re)?|s(ub|up|trong|trike)?|table|tr|th|td|ul)>$
|^<(b|h)r\s?/?>$
|^<a[^>]+>$
|^<img[^>]+/?>$",
RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace |
RegexOptions.ExplicitCapture | RegexOptions.Compiled);
/// <summary>
/// sanitize any potentially dangerous tags from the provided raw HTML input using
/// a whitelist based approach, leaving the "safe" HTML tags
/// </summary>
public static string Sanitize(string html) {
var tagname = "";
Match tag;
var tags = _tags.Matches(html);
// iterate through all HTML tags in the input
for (int i = tags.Count - 1; i > -1; i--) {
tag = tags[i];
tagname = tag.Value.ToLower();
if (!_whitelist.IsMatch(tagname)) {
// not on our whitelist? I SAY GOOD DAY TO YOU, SIR. GOOD DAY!
html = html.Remove(tag.Index, tag.Length);
} else if (tagname.StartsWith("<a")) {
// detailed <a> tag checking
if (!IsMatch(tagname,
@"<a\s
href=""(\#\d+|(https?|ftp)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+)""
(\stitle=""[^""]+"")?\s?>")) {
html = html.Remove(tag.Index, tag.Length);
}
} else if (tagname.StartsWith("<img")) {
// detailed <img> tag checking
if (!IsMatch(tagname,
@"<img\s
src=""https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+""
(\swidth=""\d{1,3}"")?
(\sheight=""\d{1,3}"")?
(\salt=""[^""]*"")?
(\stitle=""[^""]*"")?
\s?/?>")) {
html = html.Remove(tag.Index, tag.Length);
}
}
}
return html;
}
/// <summary>
/// Utility function to match a regex pattern: case, whitespace, and line insensitive
/// </summary>
private static bool IsMatch(string s, string pattern) {
return Regex.IsMatch(s, pattern, RegexOptions.Singleline | RegexOptions.IgnoreCase |
RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture);
}
public static Member GetMember(int id) {
Member m = Member.GetMemberFromCache(id);
if (m == null)
m = new Member(id);
return m;
}
public static bool IsInGroup(string GroupName)
{
if (umbraco.library.IsLoggedOn())
return IsMemberInGroup(GroupName, Member.CurrentMemberId());
else
return false;
}
public static bool IsMemberInGroup(string GroupName, int memberid)
{
Member m = Utills.GetMember(memberid);
foreach (MemberGroup mg in m.Groups.Values)
{
if (mg.Text == GroupName)
return true;
}
return false;
}
public static int GetWikiHelpFallBackPage(string section)
{
try
{
XmlDocument config = new XmlDocument();
config.Load(
HttpContext.Current.Server.MapPath(umbraco.GlobalSettings.Path + "/../config/UmbracoHelp.config"));
int p = 0;
if (config.SelectNodes(string.Format("//section [@alias = '{0}']", section)).Count > 0)
int.TryParse(config.SelectSingleNode(string.Format("//section [@alias = '{0}']", section)).Attributes["node"].Value, out p);
else
int.TryParse(config.SelectSingleNode("//section [@alias = '*']").Attributes["node"].Value, out p);
return p;
}
catch (Exception e)
{
umbraco.BusinessLogic.Log.Add(umbraco.BusinessLogic.LogTypes.Debug, 0, e.ToString());
return 0;
}
}
}
}