A general purpose toolset for creating components of an OAuth request.
예제 #1
0
        private string WriteAuthorizationHeader(WebParameterCollection parameters)
        {
            StringBuilder stringBuilder = new StringBuilder("OAuth ");

            if (!OAuthRequest.IsNullOrBlank(this.Realm))
            {
                stringBuilder.AppendFormat("realm=\"{0}\",", (object)OAuthTools.UrlEncodeRelaxed(this.Realm));
            }
            parameters.Sort((Comparison <WebParameter>)((l, r) => l.Name.CompareTo(r.Name)));
            int num = 0;

            foreach (WebParameter webParameter in parameters.Where <WebParameter>((Func <WebParameter, bool>)(parameter =>
            {
                if (!OAuthRequest.IsNullOrBlank(parameter.Name) && !OAuthRequest.IsNullOrBlank(parameter.Value))
                {
                    return(parameter.Name.StartsWith("oauth_"));
                }
                return(false);
            })))
            {
                ++num;
                string format = num < parameters.Count ? "{0}=\"{1}\"," : "{0}=\"{1}\"";
                stringBuilder.AppendFormat(format, (object)webParameter.Name, (object)webParameter.Value);
            }
            return(stringBuilder.ToString());
        }
예제 #2
0
        private string WriteAuthorizationHeader(WebParameterCollection parameters)
        {
            var sb = new StringBuilder("OAuth ");

            if (!IsNullOrBlank(Realm))
            {
                sb.AppendFormat("realm=\"{0}\",", OAuthTools.UrlEncodeRelaxed(Realm));
            }

            parameters.Sort((l, r) => l.Name.CompareTo(r.Name));

            var count = 0;

            foreach (var parameter in parameters.Where(parameter =>
                                                       !IsNullOrBlank(parameter.Name) &&
                                                       !IsNullOrBlank(parameter.Value) &&
                                                       parameter.Name.StartsWith("oauth_")))
            {
                count++;
                var format = count < parameters.Count ? "{0}=\"{1}\"," : "{0}=\"{1}\"";
                sb.AppendFormat(format, parameter.Name, parameter.Value);
            }

            var authorization = sb.ToString();

            return(authorization);
        }
예제 #3
0
        /// <summary>
        /// Creates a signature value given a signature base and the consumer secret and a known token secret.
        /// </summary>
        /// <seealso href="http://oauth.net/core/1.0#rfc.section.9.2" />
        /// <param name="signatureMethod">The hashing method</param>
        /// <param name="signatureTreatment">The treatment to use on a signature value</param>
        /// <param name="signatureBase">The signature base</param>
        /// <param name="consumerSecret">The consumer secret</param>
        /// <param name="tokenSecret">The token secret</param>
        /// <returns></returns>
        public static string GetSignature(
            OAuthSignatureMethod signatureMethod,
            OAuthSignatureTreatment signatureTreatment,
            string signatureBase,
            string consumerSecret,
            string tokenSecret)
        {
            if (OAuthTools.IsNullOrBlank(tokenSecret))
            {
                tokenSecret = string.Empty;
            }
            consumerSecret = OAuthTools.UrlEncodeRelaxed(consumerSecret);
            tokenSecret    = OAuthTools.UrlEncodeRelaxed(tokenSecret);
            if (signatureMethod != OAuthSignatureMethod.HmacSha1)
            {
                throw new NotImplementedException("Only HMAC-SHA1 is currently supported.");
            }
            HMACSHA1 hmacshA1 = new HMACSHA1();
            string   s        = consumerSecret + "&" + tokenSecret;

            hmacshA1.Key = OAuthTools._encoding.GetBytes(s);
            string str = OAuthTools.HashWith(signatureBase, (HashAlgorithm)hmacshA1);

            return(signatureTreatment == OAuthSignatureTreatment.Escaped ? OAuthTools.UrlEncodeRelaxed(str) : str);
        }
예제 #4
0
 /// <summary>
 /// Creates a signature value given a signature base and the consumer secret.
 /// This method is used when the token secret is currently unknown.
 /// </summary>
 /// <seealso href="http://oauth.net/core/1.0#rfc.section.9.2" />
 /// <param name="signatureMethod">The hashing method</param>
 /// <param name="signatureBase">The signature base</param>
 /// <param name="consumerSecret">The consumer key</param>
 /// <returns></returns>
 public static string GetSignature(
     OAuthSignatureMethod signatureMethod,
     string signatureBase,
     string consumerSecret)
 {
     return(OAuthTools.GetSignature(signatureMethod, OAuthSignatureTreatment.Escaped, signatureBase, consumerSecret, (string)null));
 }
예제 #5
0
        private string WriteAuthorizationHeader(WebParameterCollection parameters)
        {
            var sb = new StringBuilder("OAuth ");

            if (!IsNullOrBlank(Realm))
            {
                sb.AppendFormat("realm=\"{0}\",", OAuthTools.UrlEncodeRelaxed(Realm));
            }

            parameters.Sort((l, r) => l.Name.CompareTo(r.Name));

            foreach (var parameter in parameters.Where(parameter =>
                                                       !IsNullOrBlank(parameter.Name) &&
                                                       !IsNullOrBlank(parameter.Value) &&
                                                       (parameter.Name.StartsWith("oauth_") || parameter.Name.StartsWith("x_auth_"))))
            {
                sb.AppendFormat("{0}=\"{1}\",", parameter.Name, parameter.Value);
            }

            sb.Remove(sb.Length - 1, 1);

            var authorization = sb.ToString();

            return(authorization);
        }
예제 #6
0
        private string GetNewSignatureXAuth(WebParameterCollection parameters)
        {
            string timestamp = OAuthTools.GetTimestamp();
            string nonce     = OAuthTools.GetNonce();

            this.AddXAuthParameters((ICollection <WebParameter>)parameters, timestamp, nonce);
            return(OAuthTools.GetSignature(this.SignatureMethod, this.SignatureTreatment, OAuthTools.ConcatenateRequestElements(this.Method.ToUpperInvariant(), this.RequestUrl, parameters), this.ConsumerSecret, this.TokenSecret));
        }
예제 #7
0
        public static string ConcatenateRequestElements(string method, string url, WebParameterCollection parameters)
        {
            StringBuilder stringBuilder = new StringBuilder();
            string        value         = method.ToUpper() + "&";
            string        value2        = OAuthTools.UrlEncodeRelaxed(OAuthTools.ConstructRequestUrl(new Uri(url))) + "&";
            string        value3        = OAuthTools.UrlEncodeRelaxed(OAuthTools.NormalizeRequestParameters(parameters));

            stringBuilder.Append(value);
            stringBuilder.Append(value2);
            stringBuilder.Append(value3);
            return(stringBuilder.ToString());
        }
예제 #8
0
        public static WebParameterCollection SortParametersExcludingSignature(WebParameterCollection parameters)
        {
            WebParameterCollection     webParameterCollection = new WebParameterCollection(parameters);
            IEnumerable <WebParameter> parameters2            = webParameterCollection.Where((WebParameter n) => OAuthTools.EqualsIgnoreCase(n.Name, "oauth_signature"));

            webParameterCollection.RemoveAll(parameters2);
            foreach (WebParameter webParameter in webParameterCollection)
            {
                webParameter.Value = OAuthTools.UrlEncodeStrict(webParameter.Value);
            }
            webParameterCollection.Sort((WebParameter x, WebParameter y) => (!x.Name.Equals(y.Name)) ? x.Name.CompareTo(y.Name) : x.Value.CompareTo(y.Value));
            return(webParameterCollection);
        }
예제 #9
0
        private string GetNewSignature(WebParameterCollection parameters)
        {
            var timestamp = OAuthTools.GetTimestamp();

            var nonce = OAuthTools.GetNonce();

            AddAuthParameters(parameters, timestamp, nonce);

            var signatureBase = OAuthTools.ConcatenateRequestElements(Method.ToUpperInvariant(), RequestUrl, parameters);
            var signature     = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, TokenSecret);

            return(signature);
        }
예제 #10
0
        private string WriteAuthorizationHeader(WebParameterCollection parameters)
        {
            StringBuilder stringBuilder = new StringBuilder("OAuth ");

            if (!OAuthRequest.IsNullOrBlank(this.Realm))
            {
                stringBuilder.AppendFormat("realm=\"{0}\",", OAuthTools.UrlEncodeRelaxed(this.Realm));
            }
            parameters.Sort((WebParameter l, WebParameter r) => l.Name.CompareTo(r.Name));
            int num = 0;

            foreach (WebParameter webParameter in parameters.Where((WebParameter parameter) => !OAuthRequest.IsNullOrBlank(parameter.Name) && !OAuthRequest.IsNullOrBlank(parameter.Value) && (parameter.Name.StartsWith("oauth_") || parameter.Name.StartsWith("x_auth_"))))
            {
                num++;
                string format = (num >= parameters.Count) ? "{0}=\"{1}\"" : "{0}=\"{1}\",";
                stringBuilder.AppendFormat(format, webParameter.Name, webParameter.Value);
            }
            return(stringBuilder.ToString());
        }
예제 #11
0
        /// <summary>
        /// Sorts a <see cref="T:OAuth.WebParameterCollection" /> by name, and then value if equal.
        /// </summary>
        /// <param name="parameters">A collection of parameters to sort</param>
        /// <returns>A sorted parameter collection</returns>
        public static WebParameterCollection SortParametersExcludingSignature(
            WebParameterCollection parameters)
        {
            WebParameterCollection     source      = new WebParameterCollection((IEnumerable <WebParameter>)parameters);
            IEnumerable <WebParameter> parameters1 = source.Where <WebParameter>((Func <WebParameter, bool>)(n => OAuthTools.EqualsIgnoreCase(n.Name, "oauth_signature")));

            source.RemoveAll(parameters1);
            foreach (WebParameter webParameter in source)
            {
                webParameter.Value = OAuthTools.UrlEncodeStrict(webParameter.Value);
            }
            source.Sort((Comparison <WebParameter>)((x, y) =>
            {
                if (!x.Name.Equals(y.Name))
                {
                    return(x.Name.CompareTo(y.Name));
                }
                return(x.Value.CompareTo(y.Value));
            }));
            return(source);
        }
예제 #12
0
        public static string NormalizeRequestParameters(WebParameterCollection parameters)
        {
            WebParameterCollection collection = OAuthTools.SortParametersExcludingSignature(parameters);

            return(OAuthTools.Concatenate(collection, "=", "&"));
        }
예제 #13
0
        public static string UrlEncodeStrict(string value)
        {
            string text = value.Where((char c) => !"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-._~".Contains(c) && c != '%').Aggregate(value, (string current, char c) => current.Replace(c.ToString(), OAuthTools.PercentEncode(c.ToString())));

            return(text.Replace("%%", "%25%"));
        }
예제 #14
0
        public static string UrlEncodeRelaxed(string value)
        {
            string text = Uri.EscapeDataString(value);

            return(text.Replace("(", OAuthTools.PercentEncode("(")).Replace(")", OAuthTools.PercentEncode(")")));
        }
예제 #15
0
 public static string GetTimestamp(DateTime dateTime)
 {
     return(OAuthTools.ToUnixTime(dateTime).ToString());
 }
예제 #16
0
 public static string GetTimestamp()
 {
     return(OAuthTools.GetTimestamp(DateTime.UtcNow));
 }
예제 #17
0
 /// <summary>
 /// URL encodes a string based on section 5.1 of the OAuth spec.
 /// Namely, percent encoding with [RFC3986], avoiding unreserved characters,
 /// upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs.
 /// </summary>
 /// <param name="value"></param>
 /// <seealso href="http://oauth.net/core/1.0#encoding_parameters" />
 public static string UrlEncodeStrict(string value)
 {
     return(value.Where <char>((Func <char, bool>)(c =>
     {
         if (!"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-._~".Contains <char>(c))
         {
             return c != '%';
         }
         return false;
     })).Aggregate <char, string>(value, (Func <string, char, string>)((current, c) => current.Replace(c.ToString(), OAuthTools.PercentEncode(c.ToString())))).Replace("%%", "%25%"));
 }