using System.ComponentModel.DataAnnotations; using System.Text.RegularExpressions; using MimeKit; namespace Bit.Core.Utilities; public class StrictEmailAddressAttribute : ValidationAttribute { public StrictEmailAddressAttribute() : base("The {0} field is not a supported e-mail address format.") { } public override bool IsValid(object value) { var emailAddress = value?.ToString(); if (emailAddress == null) { return false; } try { var parsedEmailAddress = MailboxAddress.Parse(emailAddress).Address; if (parsedEmailAddress != emailAddress) { return false; } } catch (ParseException) { return false; } // The regex below is intended to catch edge cases that are not handled by the general parsing check above. // This enforces the following rules: // * Requires ASCII only in the local-part (code points 0-127) // * Requires an @ symbol // * Allows any char in second-level domain name, including unicode and symbols // * Requires at least one period (.) separating SLD from TLD // * Must end in a letter (including unicode) // See the unit tests for examples of what is allowed. var emailFormat = @"^[\x00-\x7F]+@.+\.\p{L}+$"; if (!Regex.IsMatch(emailAddress, emailFormat)) { return false; } return new EmailAddressAttribute().IsValid(emailAddress); } }