public override void Analyze(AnalyzeContext context) { if (context.FileContents == null) { context.FileContents = _fileSystem.FileReadAllText(context.TargetUri.LocalPath); } string filePath = context.TargetUri.GetFilePath(); foreach (MatchExpression matchExpression in _matchExpressions) { if (!string.IsNullOrEmpty(matchExpression.FileNameAllowRegex)) { if (!_engine.IsMatch(filePath, matchExpression.FileNameAllowRegex, RegexDefaults.DefaultOptionsCaseInsensitive)) { continue; } } if (!string.IsNullOrEmpty(matchExpression.FileNameDenyRegex)) { if (_engine.IsMatch(filePath, matchExpression.FileNameDenyRegex, RegexDefaults.DefaultOptionsCaseInsensitive)) { continue; } } if (matchExpression.MatchLengthToDecode > 0) { decimal unencodedLength = matchExpression.MatchLengthToDecode; // Every 3 bytes of a base64-encoded string produces 4 bytes of data. int unpaddedLength = (int)Math.Ceiling(decimal.Divide(unencodedLength * 8M, 6M)); int paddedLength = 4 * (int)Math.Ceiling(decimal.Divide(unencodedLength, 3M)); // Create proper regex for base64-encoded string which includes padding characters. string base64DecodingRegexText = string.Format(Base64DecodingFormatString, "{" + unpaddedLength + "}") + new string('=', paddedLength - unpaddedLength); foreach (FlexMatch flexMatch in _engine.Matches(context.FileContents, base64DecodingRegexText)) { // This will run the match expression against the decoded content. RunMatchExpression( binary64DecodedMatch: flexMatch, context, matchExpression); } } // This runs the match expression against the entire, unencoded file. RunMatchExpression( binary64DecodedMatch: null, context, matchExpression); } }
public static IEnumerable <string> Matches(this IRegex c, string parent) { return(c.Matches(parent, 1, RegexOptions.None)); }