OSDN Git Service

varを使用する (IDE0007)
[opentween/open-tween.git] / OpenTween / Connection / OAuthUtility.cs
index b9cddff..d61924f 100644 (file)
@@ -38,11 +38,6 @@ namespace OpenTween.Connection
     public static class OAuthUtility
     {
         /// <summary>
-        /// OAuth署名のoauth_timestamp算出用基準日付(1970/1/1 00:00:00)
-        /// </summary>
-        private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Unspecified);
-
-        /// <summary>
         /// OAuth署名のoauth_nonce算出用乱数クラス
         /// </summary>
         private static readonly Random NonceRandom = new Random();
@@ -63,23 +58,23 @@ namespace OpenTween.Connection
             string realm = null)
         {
             // OAuth共通情報取得
-            Dictionary<string, string> parameter = GetOAuthParameter(consumerKey, token);
+            var parameter = GetOAuthParameter(consumerKey, token);
             // OAuth共通情報にquery情報を追加
             if (query != null)
-                foreach (KeyValuePair<string, string> item in query)
-                    parameter.Add(item.Key, item.Value);
+                foreach (var (key, value) in query)
+                    parameter.Add(key, value);
             // 署名の作成・追加
             parameter.Add("oauth_signature", CreateSignature(consumerSecret, tokenSecret, httpMethod, requestUri, parameter));
             // HTTPリクエストのヘッダに追加
-            StringBuilder sb = new StringBuilder("OAuth ");
+            var sb = new StringBuilder("OAuth ");
 
             if (realm != null)
                 sb.AppendFormat("realm=\"{0}\",", realm);
 
-            foreach (KeyValuePair<string, string> item in parameter)
+            foreach (var (key, value) in parameter)
                 // 各種情報のうち、oauth_で始まる情報のみ、ヘッダに追加する。各情報はカンマ区切り、データはダブルクォーテーションで括る
-                if (item.Key.StartsWith("oauth_"))
-                    sb.AppendFormat("{0}=\"{1}\",", item.Key, MyCommon.UrlEncode(item.Value));
+                if (key.StartsWith("oauth_", StringComparison.Ordinal))
+                    sb.AppendFormat("{0}=\"{1}\",", key, MyCommon.UrlEncode(value));
 
             return sb.ToString();
         }
@@ -91,12 +86,14 @@ namespace OpenTween.Connection
         /// <returns>OAuth情報のディクショナリ</returns>
         public static Dictionary<string, string> GetOAuthParameter(string consumerKey, string token)
         {
-            Dictionary<string, string> parameter = new Dictionary<string, string>();
-            parameter.Add("oauth_consumer_key", consumerKey);
-            parameter.Add("oauth_signature_method", "HMAC-SHA1");
-            parameter.Add("oauth_timestamp", Convert.ToInt64((DateTime.UtcNow - UnixEpoch).TotalSeconds).ToString()); // epoch秒
-            parameter.Add("oauth_nonce", NonceRandom.Next(123400, 9999999).ToString());
-            parameter.Add("oauth_version", "1.0");
+            var parameter = new Dictionary<string, string>
+            {
+                ["oauth_consumer_key"] = consumerKey,
+                ["oauth_signature_method"] = "HMAC-SHA1",
+                ["oauth_timestamp"] = DateTimeUtc.Now.ToUnixTime().ToString(), // epoch秒
+                ["oauth_nonce"] = NonceRandom.Next(123400, 9999999).ToString(),
+                ["oauth_version"] = "1.0",
+            };
             if (!string.IsNullOrEmpty(token))
                 parameter.Add("oauth_token", token); // トークンがあれば追加
             return parameter;
@@ -113,21 +110,21 @@ namespace OpenTween.Connection
         public static string CreateSignature(string consumerSecret, string tokenSecret, string method, Uri uri, Dictionary<string, string> parameter)
         {
             // パラメタをソート済みディクショナリに詰替(OAuthの仕様)
-            SortedDictionary<string, string> sorted = new SortedDictionary<string, string>(parameter);
+            var sorted = new SortedDictionary<string, string>(parameter);
             // URLエンコード済みのクエリ形式文字列に変換
-            string paramString = MyCommon.BuildQueryString(sorted);
+            var paramString = MyCommon.BuildQueryString(sorted);
             // アクセス先URLの整形
-            string url = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath);
+            var url = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath);
             // 署名のベース文字列生成(&区切り)。クエリ形式文字列は再エンコードする
-            string signatureBase = string.Format("{0}&{1}&{2}", method, MyCommon.UrlEncode(url), MyCommon.UrlEncode(paramString));
+            var signatureBase = string.Format("{0}&{1}&{2}", method, MyCommon.UrlEncode(url), MyCommon.UrlEncode(paramString));
             // 署名鍵の文字列をコンシューマー秘密鍵とアクセストークン秘密鍵から生成(&区切り。アクセストークン秘密鍵なくても&残すこと)
-            string key = MyCommon.UrlEncode(consumerSecret) + "&";
+            var key = MyCommon.UrlEncode(consumerSecret) + "&";
             if (!string.IsNullOrEmpty(tokenSecret))
                 key += MyCommon.UrlEncode(tokenSecret);
             // 鍵生成&署名生成
-            using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes(key)))
+            using (var hmac = new HMACSHA1(Encoding.ASCII.GetBytes(key)))
             {
-                byte[] hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase));
+                var hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase));
                 return Convert.ToBase64String(hash);
             }
         }