/* * MinIO .NET Library for Amazon S3 Compatible Cloud Storage, (C) 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.Text.RegularExpressions; namespace Minio.Helper; internal static class S3utils { internal static readonly Regex TrimWhitespaceRegex = new("\\s+", RegexOptions.None, TimeSpan.FromHours(1)); internal static bool IsAmazonEndPoint(string endpoint) { if (IsAmazonChinaEndPoint(endpoint)) return true; var rgx = new Regex("^s3[.-]?(.*?)\\.amazonaws\\.com$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture, TimeSpan.FromSeconds(3)); var matches = rgx.Matches(endpoint); return matches.Count > 0; } // IsAmazonChinaEndpoint - Match if it is exactly Amazon S3 China endpoint. // Customers who wish to use the new Beijing Region are required // to sign up for a separate set of account credentials unique to // the China (Beijing) Region. Customers with existing AWS credentials // will not be able to access resources in the new Region, and vice versa. // For more info https://aws.amazon.com/about-aws/whats-new/2013/12/18/announcing-the-aws-china-beijing-region/ internal static bool IsAmazonChinaEndPoint(string endpoint) { return string.Equals(endpoint, "s3.cn-north-1.amazonaws.com.cn", StringComparison.OrdinalIgnoreCase); } // IsVirtualHostSupported - verifies if bucketName can be part of // virtual host. Currently only Amazon S3 and Google Cloud Storage // would support this. internal static bool IsVirtualHostSupported(Uri endpointURL, string bucketName) { if (endpointURL is null) return false; // bucketName can be valid but '.' in the hostname will fail SSL // certificate validation. So do not use host-style for such buckets. if (string.Equals(endpointURL.Scheme, "https", StringComparison.OrdinalIgnoreCase) && bucketName.Contains('.', StringComparison.Ordinal)) return false; // Return true for all other cases return IsAmazonEndPoint(endpointURL.Host); } internal static string GetPath(string p1, string p2) { try { var combination = Path.Combine(p1, p2); // combination = Uri.EscapeUriString(combination); return Utils.EncodePath(combination); } catch (Exception ex) { throw new DirectoryNotFoundException(ex.Message); } } /// /// IsValidIP parses input string for ip address validity. /// /// /// internal static bool IsValidIP(string ip) { if (string.IsNullOrEmpty(ip)) return false; var splitValues = ip.Split('.'); if (splitValues.Length != 4) return false; return splitValues.All(r => byte.TryParse(r, out var _)); } // TrimAll trims leading and trailing spaces and replace sequential spaces with one space, following Trimall() // in http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html internal static string TrimAll(string s) { if (string.IsNullOrEmpty(s)) return s; return TrimWhitespaceRegex.Replace(s, " ").Trim(); } }