e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
114 lines
3.2 KiB
C#
114 lines
3.2 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="RegexWorker.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
/*
|
|
* Base class for browser capabilities object: just a read-only dictionary
|
|
* holder that supports Init()
|
|
*
|
|
*
|
|
|
|
|
|
*/
|
|
|
|
using System.Web.UI;
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.Globalization;
|
|
using System.Security.Permissions;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Web.RegularExpressions;
|
|
using System.Web.Util;
|
|
|
|
namespace System.Web.Configuration {
|
|
|
|
//
|
|
public class RegexWorker {
|
|
internal static readonly Regex RefPat = new BrowserCapsRefRegex();
|
|
private Hashtable _groups;
|
|
private HttpBrowserCapabilities _browserCaps;
|
|
|
|
public RegexWorker(HttpBrowserCapabilities browserCaps) {
|
|
_browserCaps = browserCaps;
|
|
}
|
|
|
|
private string Lookup(string from) {
|
|
MatchCollection matches = RefPat.Matches(from);
|
|
|
|
// shortcut for no reference case
|
|
if (matches.Count == 0) {
|
|
return from;
|
|
}
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
int startIndex = 0;
|
|
|
|
foreach (Match match in matches) {
|
|
int length = match.Index - startIndex;
|
|
sb.Append(from.Substring(startIndex, length));
|
|
startIndex = match.Index + match.Length;
|
|
|
|
string groupName = match.Groups["name"].Value;
|
|
|
|
string result = null;
|
|
if (_groups != null) {
|
|
result = (String)_groups[groupName];
|
|
}
|
|
|
|
if (result == null) {
|
|
result = _browserCaps[groupName];
|
|
}
|
|
|
|
sb.Append(result);
|
|
}
|
|
|
|
sb.Append(from, startIndex, from.Length - startIndex);
|
|
string output = sb.ToString();
|
|
|
|
// Return null instead of empty string since empty string is used to override values.
|
|
if (output.Length == 0) {
|
|
return null;
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
public string this[string key] {
|
|
get {
|
|
return Lookup(key);
|
|
}
|
|
}
|
|
|
|
public bool ProcessRegex(string target, string regexExpression) {
|
|
if(target == null) {
|
|
target = String.Empty;
|
|
}
|
|
|
|
// Adding timeout for Regex in case of malicious string causing DoS
|
|
Regex regex = RegexUtil.CreateRegex(regexExpression, RegexOptions.ExplicitCapture);
|
|
Match match = regex.Match(target);
|
|
if(match.Success == false) {
|
|
return false;
|
|
}
|
|
|
|
string[] groups = regex.GetGroupNames();
|
|
|
|
if (groups.Length > 0) {
|
|
if (_groups == null) {
|
|
_groups = new Hashtable();
|
|
}
|
|
|
|
for (int i = 0; i < groups.Length; i++) {
|
|
_groups[groups[i]] = match.Groups[i].Value;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|