/src/dotnet/Dmarc/src/Dmarc.DnsRecord.Evaluator/Spf/Parsers/DomainSpecParserPassive.cs

https://github.com/ukncsc/mail-check · C# · 42 lines · 33 code · 5 blank · 4 comment · 5 complexity · 559124c58c84cae0df828edb2761c3f2 MD5 · raw file

  1. using System.Text.RegularExpressions;
  2. using Dmarc.DnsRecord.Evaluator.Rules;
  3. using Dmarc.DnsRecord.Evaluator.Spf.Domain;
  4. namespace Dmarc.DnsRecord.Evaluator.Spf.Parsers
  5. {
  6. public interface IDomainSpecParser
  7. {
  8. DomainSpec Parse(string domainSpec, bool mandatory);
  9. }
  10. //Note this doesnt expand macros or perform dns look ups
  11. //
  12. public class DomainSpecParserPassive : IDomainSpecParser
  13. {
  14. //Regex taken from Eddy Minet's .Net implementation http://www.openspf.org/Implementations
  15. private readonly Regex _macroRegex = new Regex(@"%{1}\{(?<macro_letter>[slodipvhcrt])(?<digits>[0-9]*)(?<transformer>r)?(?<delimiter>[.+,\/_=-]?)\}", RegexOptions.IgnoreCase);
  16. //Credited to bkr : http://stackoverflow.com/questions/11809631/fully-qualified-domain-name-validation
  17. private readonly Regex _domainRegex = new Regex(@"(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-_]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}\.?$)");
  18. public DomainSpec Parse(string domainSpecString, bool mandatory)
  19. {
  20. DomainSpec domainSpec = new DomainSpec(domainSpecString);
  21. if (string.IsNullOrEmpty(domainSpecString))
  22. {
  23. if (mandatory)
  24. {
  25. string errorMessgae = string.Format(SpfParserResource.NoValueErrorMessage, "domain");
  26. domainSpec.AddError(new Error(ErrorType.Error, errorMessgae));
  27. }
  28. }
  29. else if (!_domainRegex.IsMatch(domainSpecString) && !_macroRegex.IsMatch(domainSpecString))
  30. {
  31. string errorMessage = string.Format(SpfParserResource.InvalidValueErrorMessage, "domain or macro", domainSpecString);
  32. domainSpec.AddError(new Error(ErrorType.Error, errorMessage));
  33. }
  34. return domainSpec;
  35. }
  36. }
  37. }