예제 #1
0
        private async new Task <T> Request <T>(object param, OBS.Runtime.Internal.IRequest request) where T : new()
        {
            try
            {
                var    clientWrapper = new RestClientWrapper(request, _disConfig);
                string result        = await clientWrapper.RequestAsync(param, _credentials.GetAccessKeyId(), _credentials.GetSecretKey(), _region, _disConfig.GetProjectId());

                int statusCode = int.Parse(result.Split('\n')[0]);
                var task       = new TaskCompletionSource <T>();
                if (statusCode >= 200 && statusCode < 300)
                {
                    result = result.Substring(statusCode.ToString().Length + 1);
                    result = result.Equals("Created") ? "{\"status_code\":\"201 Created\",\"content\":\"\"}"
                            : (result.Equals("NoContent") ? "{\"status_code\":\"204 NO CONTENT\",\"content\":\"\"}"
                            : result);
                    task.SetResult(JsonConvert.DeserializeObject <T>(result));
                    return(task.Task.Result);
                }
                else
                {
                    throw new Exception(result);
                }
            }
            catch (Exception e)
            {
                throw;
            }
        }
        private static void SignHttps(IRequest request, ClientConfig clientConfig, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey)
        {
            string nonce = Guid.NewGuid().ToString();
            string date  = AWSSDKUtils.FormattedCurrentTimestampRFC822;
            string stringToSign;

            stringToSign = date + nonce;
            metrics.AddProperty(Metric.StringToSign, stringToSign);

            string signature = ComputeHash(stringToSign, awsSecretAccessKey, clientConfig.SignatureMethod);

            StringBuilder builder = new StringBuilder();

            builder.Append(HTTPS_SCHEME).Append(" ");
            builder.Append("AWSAccessKeyId=" + awsAccessKeyId + ",");
            builder.Append("Algorithm=" + clientConfig.SignatureMethod.ToString() + ",");
            builder.Append("SignedHeaders=x-amz-date;x-amz-nonce,");
            builder.Append("Signature=" + signature);

            builder.Append(GetSignedHeadersComponent(request) + ",");

            request.Headers[HeaderKeys.XAmzAuthorizationHeader] = builder.ToString();
            request.Headers[HeaderKeys.XAmzNonceHeader]         = nonce;
            request.Headers[HeaderKeys.XAmzDateHeader]          = date;
        }
        public override void Sign(IRequest request, string awsAccessKeyId, string awsSecretAccessKey)
        {
            //请求指标
            var metrics = new RequestMetrics();
            SignerRequestParamsEx signerParams = new SignerRequestParamsEx(request, this.regionName, this.serviceName, "SDK-HMAC-SHA256");

            SignHttp(request, metrics, awsAccessKeyId, awsSecretAccessKey, signerParams);
        }
        private static void SignHttpEx(IRequest request, RequestMetrics metrics, string awsAccessKeyId,
                                       string awsSecretAccessKey, SignerRequestParamsEx param = null)
        {
            string date       = "20171006T170510Z"; //AWSSDKUtils.FormattedCurrentTimestampISO8601;
            string hostHeader = request.Endpoint.Host;

            request.Headers[HttpHeaderKeys.HostHeader] = hostHeader;
            request.Headers[HttpHeaderKeys.SdkData]    = date;
        }
        private long GetSigningDate(IRequest request)
        {
            DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0));

            var timeSpan = DateTime.Now.AddHours(-8) - startTime;

            //var jj = ;
            //long milliseconds = kk.Ticks / TimeSpan.TicksPerMillisecond;
            return((long)timeSpan.TotalMilliseconds - (long)(request.TimeOffset * 1000));
        }
        private static string GetRequestPayload(IRequest request)
        {
            if (request.Content == null)
            {
                return(string.Empty);
            }

            Encoding encoding = Encoding.GetEncoding(DEFAULT_ENCODING);

            return(encoding.GetString(request.Content, 0, request.Content.Length));
        }
        protected void AddHostHeader(IRequest request)
        {
            var endpoint          = request.Endpoint;
            var hostHeaderBuilder = new StringBuilder(endpoint.Host);

            if (HttpUtils.IsUsingNonDefaultPort(endpoint))
            {
                hostHeaderBuilder.Append(":").Append(endpoint.Port);
            }

            request.Headers.Add("Host", hostHeaderBuilder.ToString());
        }
        private static string GetSignedHeadersComponent(IRequest request)
        {
            StringBuilder builder = new StringBuilder();

            builder.Append("SignedHeaders=");
            bool first = true;

            foreach (string header in GetHeadersForStringToSign(request))
            {
                if (!first)
                {
                    builder.Append(";");
                }
                builder.Append(header);
                first = false;
            }
            return(builder.ToString());
        }
        private static bool IsHttpsRequest(IRequest request)
        {
            string protocol = request.Endpoint.Scheme;

            if (protocol.Equals("http", StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }
            else if (protocol.Equals("https", StringComparison.OrdinalIgnoreCase))
            {
                return(true);
            }
            else
            {
                throw new ObsServiceException(
                          "Unknown request endpoint protocol encountered while signing request: " + protocol);
            }
        }
        public override void Sign(IRequest request, ICredentials credentials)
        {
            var sanitizedCredentials = this.SanitizeCredentials(credentials);
            var signerParams         = new SignerRequestParamsEx(request, this.regionName, this.serviceName, "SDK-HMAC-SHA256");

            this.AddHostHeader(request);
            request.Headers.Add("X-Sdk-Date", signerParams.GetFormattedSigningDateTime());

            String contentSha256 = this.CalculateContentHash(request);

            if ("required".Equals(request.Headers["x-sdk-content-sha256"]))
            {
                request.Headers.Add("x-sdk-content-sha256", contentSha256);
            }

            var metrics = new RequestMetrics();

            SignHttp(request, metrics, sanitizedCredentials.GetAccessKeyId(), sanitizedCredentials.GetSecretKey(), signerParams);
        }
        private static List <string> GetHeadersForStringToSign(IRequest request)
        {
            List <string> headersToSign = new List <string>();

            foreach (var entry in request.Headers)
            {
                string key = entry.Key;
                if (key.StartsWith("x-sdk-date", StringComparison.OrdinalIgnoreCase) ||
                    key.Equals("content-type", StringComparison.OrdinalIgnoreCase) ||
                    key.Equals("x-sdk-version", StringComparison.OrdinalIgnoreCase) ||
                    key.Equals("accept", StringComparison.OrdinalIgnoreCase) ||
                    key.Equals("host", StringComparison.OrdinalIgnoreCase))
                {
                    headersToSign.Add(key.ToLower());
                }
            }

            headersToSign.Sort(StringComparer.OrdinalIgnoreCase);
            return(headersToSign);
        }
        /// <summary>
        /// Signs the specified request with the AWS3 signing protocol by using the
        /// AWS account credentials given in the method parameters.
        /// </summary>
        /// <param name="awsAccessKeyId">The AWS public key</param>
        /// <param name="awsSecretAccessKey">The AWS secret key used to sign the request in clear text</param>
        /// <param name="metrics">Request metrics</param>
        /// <param name="clientConfig">The configuration that specifies which hashing algorithm to use</param>
        /// <param name="request">The request to have the signature compute for</param>
        /// <exception cref="OBS.Runtime.SignatureException">If any problems are encountered while signing the request</exception>
        public override void Sign(IRequest request, ClientConfig clientConfig, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey)
        {
            var signer = SelectSigner(request, clientConfig);
            var useV4  = signer is AWS4Signer;

            if (useV4)
            {
                signer.Sign(request, clientConfig, metrics, awsAccessKeyId, awsSecretAccessKey);
            }
            else
            {
                if (UseAws3Https)
                {
                    SignHttps(request, clientConfig, metrics, awsAccessKeyId, awsSecretAccessKey);
                }
                else
                {
                    SignHttp(request, metrics, awsAccessKeyId, awsSecretAccessKey);
                }
            }
        }
        public SignerRequestParams(IRequest <T> request, string regionNameOverride, string serviceNameOverride, string signingAlgorithm, string signDate)
        {
            if (request == null)
            {
                throw new ArgumentException("Request cannot be null");
            }

            if (signingAlgorithm == null)
            {
                throw new ArgumentException("Signing Algorithm cannot be null");
            }

            this._signingDateTimeMilli = null == signDate?this.GetSigningDate(request) : this.GetSigningDate(signDate);

            this._request = request;
            this._formattedSigningDate = SignerUtils.FormatDateStamp(this._signingDateTimeMilli);
            this._serviceName          = serviceNameOverride ?? "";
            this._regionName           = regionNameOverride ?? "";
            this._scope = this.GenerateScope(this._formattedSigningDate, this._serviceName, this._regionName);
            this._formattedSigningDateTime = SignerUtils.FormatTimestamp(this._signingDateTimeMilli);
            this._signingAlgorithm         = signingAlgorithm;
        }
        private static string GetCanonicalizedHeadersForStringToSign(IRequest request)
        {
            List <string> headersToSign = GetHeadersForStringToSign(request);

            for (int i = 0; i < headersToSign.Count; i++)
            {
                headersToSign[i] = headersToSign[i].ToLower(CultureInfo.InvariantCulture);
            }

            SortedDictionary <string, string> sortedHeaderMap = new SortedDictionary <string, string>();

            foreach (var entry in request.Headers)
            {
                if (headersToSign.Contains(entry.Key.ToLower(CultureInfo.InvariantCulture)))
                {
                    sortedHeaderMap[entry.Key] = entry.Value;
                }
            }

            StringBuilder builder = new StringBuilder();

            foreach (var entry in sortedHeaderMap)
            {
                string value = entry.Value;
                string key   = entry.Key.ToLower(CultureInfo.InvariantCulture);
                if (key.Equals("x-sdk-date"))
                {
                    value = "20171006T170510Z";
                }

                builder.Append(key);
                builder.Append(":");
                builder.Append(value);
                builder.Append("\n");
            }

            return(builder.ToString());
        }
 public SignerRequestParams(IRequest <T> request, string regionNameOverride, string serviceNameOverride, string signingAlgorithm) :
     this(request, regionNameOverride, serviceNameOverride, signingAlgorithm, null)
 {
 }
        private static void SignHttp(IRequest request, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey, SignerRequestParamsEx param = null)
        {
            string hostHeader = request.Endpoint.Host;

            request.Headers[HttpHeaderKeys.HostHeader] = hostHeader;

            SigningAlgorithm algorithm = SigningAlgorithm.HmacSHA256;
            string           nonce     = Guid.NewGuid().ToString();
            string           date      = AWSSDKUtils.FormattedCurrentTimestampISO8601;
            bool             isHttps   = IsHttpsRequest(request);

            // Temporarily disabling the AWS3 HTTPS signing scheme and only using AWS3 HTTP
            isHttps = false;

            request.Headers[HttpHeaderKeys.SdkData] = date;

            // AWS3 HTTP requires that we sign the Host header
            // so we have to have it in the request by the time we sign.

            if (!request.Endpoint.IsDefaultPort)
            {
                hostHeader += ":" + request.Endpoint.Port;
            }


            byte[] bytesToSign = null;
            string stringToSign;
            Uri    url = request.Endpoint;

            if (!string.IsNullOrEmpty(request.ResourcePath))
            {
                url = new Uri(request.Endpoint, request.ResourcePath);
            }

            stringToSign = request.HttpMethod + "\n"
                           + GetCanonicalizedResourcePath(url) + "\n"
                           + GetCanonicalizedQueryString(request.Parameters) + "\n"
                           + GetCanonicalizedHeadersForStringToSign(request) + "\n"
                           + GetRequestPayload(request);

            String hehehe = CreateStringToSign(stringToSign, param);

            bytesToSign = CryptoUtilFactory.CryptoInstance.ComputeSHA256Hash(Encoding.UTF8.GetBytes(hehehe));

            metrics.AddProperty(Metric.StringToSign, stringToSign);
            string signature = AWSSDKUtils.ToHex(ComputeHash(bytesToSign, awsSecretAccessKey, algorithm, true), true);

            //this.ComputeSignature()


            StringBuilder builder = new StringBuilder();

            builder.Append("SDK-HMAC-SHA256");
            builder.Append(" ");
            builder.Append("Credential=" + awsAccessKeyId + "/20171006/cn-north-1/dis/sdk_request, ");
            //builder.Append("Algorithm=" + algorithm.ToString() + ",");
            builder.Append(GetSignedHeadersComponent(request) + ",");
            builder.Append("Signature=" + signature);
            string authorizationHeader = builder.ToString();

            request.Headers[HttpHeaderKeys.Authorization] = authorizationHeader;
        }
 private long GetSigningDate(IRequest <T> request)
 {
     return(DateTime.Now.Millisecond - (long)(request.GetTimeOffset() * 1000));
 }
 protected String CalculateContentHash(IRequest request)
 {
     return(request.ComputeContentStreamHash());
 }