コード例 #1
0
    /// <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);
        }
    }
コード例 #2
0
    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 lower­case 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 lower­case 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);
    }
コード例 #3
0
    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));
    }
コード例 #4
0
    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);
    }
コード例 #5
0
    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);
    }
コード例 #6
0
 [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);
 }
コード例 #7
0
 protected abstract bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message);
コード例 #8
0
ファイル: TestInputValidator.cs プロジェクト: Genbox/SimpleS3
 protected override bool TryValidateBucketNameInternal(string bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message)
 {
     status  = ValidationStatus.Ok;
     message = null;
     return(true);
 }
コード例 #9
0
ファイル: NullInputValidator.cs プロジェクト: Genbox/SimpleS3
 public bool TryValidateBucketName(string?bucketName, BucketNameValidationMode mode, out ValidationStatus status, out string?message)
 {
     status  = ValidationStatus.Unknown;
     message = null;
     return(true);
 }
コード例 #10
0
    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);
    }