/// <summary> /// Validate a bucket name. See https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html#bucketnamingrules for more info /// </summary> /// <returns>True if the bucket name passed validation</returns> public bool TryValidateBucketName(string?bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message) { Validator.RequireThat(mode != BucketNameValidationMode.Unknown, nameof(mode), "Mode must not be Unknown"); if (mode == BucketNameValidationMode.Disabled) { status = ValidationStatus.Ok; message = null; return(true); } if (bucketName == null) { status = ValidationStatus.NullInput; message = null; return(false); } switch (mode) { case BucketNameValidationMode.DnsLabel: return(TryValidateBucketDns(bucketName, out status, out message)); case BucketNameValidationMode.Unrestricted: return(TryValidateBlacklisted(bucketName, out status, out message)); case BucketNameValidationMode.Default: case BucketNameValidationMode.DefaultStrict: return(TryValidateBlacklisted(bucketName, out status, out message) && TryValidateBucketNameInternal(bucketName, mode, out status, out message)); default: throw new InvalidOperationException("Unsupported validation mode: " + mode); } }
protected override bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message) { //Source: https://wasabi.com/wp-content/themes/wasabi/docs/User_Guide/topics/Creating_a_Bucket.htm //Spec: A bucket name can consist of 3 to 63 characters if (bucketName.Length < 3 || bucketName.Length > 63) { status = ValidationStatus.WrongLength; message = "3-63"; return(false); } //Spec: lowercase letters, numbers, periods, and dashes. foreach (char c in bucketName) { if (CharHelper.InRange(c, 'a', 'z') || CharHelper.InRange(c, '0', '9') || CharHelper.OneOf(c, '.', '-')) { continue; } status = ValidationStatus.WrongFormat; message = c.ToString(); return(false); } //Spec: The name must begin with a lowercase letter or number. char start = bucketName[0]; if (!CharHelper.InRange(start, 'a', 'z') && !CharHelper.InRange(start, '0', '9')) { status = ValidationStatus.WrongFormat; message = start.ToString(); return(false); } //Spec: The name must begin with a lowercase letter or number. char end = bucketName[bucketName.Length - 1]; if (!CharHelper.InRange(end, 'a', 'z') && !CharHelper.InRange(end, '0', '9')) { status = ValidationStatus.WrongFormat; message = end.ToString(); return(false); } //Spec: name cannot be formatted as an IP address (123.45.678.90) if (_ipRegex.IsMatch(bucketName)) { status = ValidationStatus.WrongFormat; message = bucketName; return(false); } status = ValidationStatus.Ok; message = null; return(true); }
public static void ValidateBucketName(this IInputValidator validator, BucketNameValidationMode mode, string?bucketName) { if (validator.TryValidateBucketName(bucketName, mode, out ValidationStatus status, out string?message)) { return; } throw new ArgumentException("Invalid bucket name: " + ValidationMessages.GetMessage(status, message), nameof(bucketName)); }
protected override bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message) { //https://cloud.google.com/storage/docs/naming-buckets //Spec: Bucket names must contain 3-63 characters. Names containing dots can contain up to 222 characters, but each dot-separated component can be no longer than 63 characters. if (bucketName.Length < 3 || bucketName.Length > 63) { status = ValidationStatus.WrongLength; message = "3-63"; return(false); } //Spec: Bucket names must start and end with a number or letter. char start = bucketName[0]; char end = bucketName[bucketName.Length - 1]; if (!CharHelper.InRange(start, 'a', 'z') && !CharHelper.InRange(start, '0', '9')) { status = ValidationStatus.WrongFormat; message = start.ToString(); return(false); } if (!CharHelper.InRange(end, 'a', 'z') && !CharHelper.InRange(end, '0', '9')) { status = ValidationStatus.WrongFormat; message = end.ToString(); return(false); } //Spec: Bucket names must contain only lowercase letters, numbers, dashes (-), underscores (_), and dots (.). Spaces are not allowed. Names containing dots require verification. foreach (char c in bucketName) { if (CharHelper.InRange(c, 'a', 'z') || CharHelper.InRange(c, '0', '9') || CharHelper.OneOf(c, '-', '_', '.')) { continue; } status = ValidationStatus.WrongFormat; message = c.ToString(); return(false); } //Spec: Bucket names cannot begin with the "goog" prefix. //Spec: Bucket names cannot contain "google" or close misspellings, such as "g00gle". if (bucketName.StartsWith("goog", StringComparison.Ordinal) || bucketName.Contains("google") || bucketName.Contains("g00gle")) { status = ValidationStatus.ReservedName; message = bucketName; return(false); } status = ValidationStatus.Ok; message = null; return(true); }
protected override bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message) { //https://www.backblaze.com/b2/docs/buckets.html //Spec: A bucket name must be at least 6 characters long, and can be at most 50 characters if (bucketName.Length < 6 || bucketName.Length > 50) { status = ValidationStatus.WrongLength; message = "6-50"; return(false); } //Spec: Bucket names that start with "b2-" are reserved for BackBlaze use. if (bucketName.StartsWith("b2-", StringComparison.OrdinalIgnoreCase)) { status = ValidationStatus.ReservedName; message = bucketName; return(false); } //Spec: Bucket names can consist of upper-case letters, lower-case letters, numbers, and "-". No other characters are allowed. foreach (char c in bucketName) { if (CharHelper.InRange(c, 'a', 'z') || CharHelper.InRange(c, 'A', 'Z') || CharHelper.InRange(c, '0', '9') || c == '-') { continue; } status = ValidationStatus.WrongFormat; message = c.ToString(); return(false); } status = ValidationStatus.Ok; message = null; return(true); }
[InlineData("自由", BucketNameValidationMode.Unrestricted, ValidationStatus.Ok)] //Anything should be allowed when it is unrestricted public void TryValidateBucketNameSuccessTest(string input, BucketNameValidationMode mode, ValidationStatus expectedStatus) { _validator.TryValidateBucketName(input, mode, out var status, out _); Assert.Equal(expectedStatus, status); }
protected abstract bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message);
protected override bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message) { status = ValidationStatus.Ok; message = null; return(true); }
public bool TryValidateBucketName(string?bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message) { status = ValidationStatus.Unknown; message = null; return(true); }
protected override bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message) { //Source: https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html //Spec: Bucket names must be between 3 and 63 characters long. if (bucketName.Length < 3 || bucketName.Length > 63) { status = ValidationStatus.WrongLength; message = "3-63"; return(false); } //Spec: Bucket names can consist only of lowercase letters, numbers, dots (.), and hyphens (-). foreach (char c in bucketName) { if (CharHelper.InRange(c, 'a', 'z') || CharHelper.InRange(c, '0', '9') || CharHelper.OneOf(c, '.', '-')) { continue; } status = ValidationStatus.WrongFormat; message = c.ToString(); return(false); } //Spec: Bucket names must begin and end with a letter or number. char start = bucketName[0]; if (!CharHelper.InRange(start, 'a', 'z') && !CharHelper.InRange(start, '0', '9')) { status = ValidationStatus.WrongFormat; message = start.ToString(); return(false); } //Spec: Bucket names must begin and end with a letter or number. char end = bucketName[bucketName.Length - 1]; if (!CharHelper.InRange(end, 'a', 'z') && !CharHelper.InRange(end, '0', '9')) { status = ValidationStatus.WrongFormat; message = end.ToString(); return(false); } //Spec: Bucket names must not be formatted as an IP address (for example, 192.168.5.4). if (_ipRegex.IsMatch(bucketName)) { status = ValidationStatus.WrongFormat; message = bucketName; return(false); } //Spec: Bucket names must not start with the prefix xn--. if (bucketName.StartsWith("xn--", StringComparison.Ordinal)) { status = ValidationStatus.WrongFormat; message = "xn--"; return(false); } //Spec: Bucket names must not end with the suffix -s3alias. This suffix is reserved for access point alias names. For more information, see Using a bucket-style alias for your access point. if (bucketName.EndsWith("-s3alias", StringComparison.Ordinal)) { status = ValidationStatus.WrongFormat; message = "-s3alias"; return(false); } status = ValidationStatus.Ok; message = null; return(true); }