1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2024-11-24 19:52:39 +01:00

Cleanup OAuth Dep

Co-Authored-By: ta264 <ta264@users.noreply.github.com>
This commit is contained in:
Qstick 2021-07-28 22:53:48 -04:00 committed by Mark McDowall
parent da5716cca2
commit d740e995a3
7 changed files with 56 additions and 66 deletions

View File

@ -32,8 +32,6 @@ namespace NzbDrone.Common.OAuth
/// <seealso cref="http://oauth.net/core/1.0#request_urls"/> /// <seealso cref="http://oauth.net/core/1.0#request_urls"/>
public virtual string RequestUrl { get; set; } public virtual string RequestUrl { get; set; }
#region Authorization Header
#if !WINRT #if !WINRT
public string GetAuthorizationHeader(NameValueCollection parameters) public string GetAuthorizationHeader(NameValueCollection parameters)
{ {
@ -121,10 +119,6 @@ namespace NzbDrone.Common.OAuth
return authorization; return authorization;
} }
#endregion
#region Authorization Query
#if !WINRT #if !WINRT
public string GetAuthorizationQuery(NameValueCollection parameters) public string GetAuthorizationQuery(NameValueCollection parameters)
{ {
@ -209,8 +203,6 @@ namespace NzbDrone.Common.OAuth
return authorization; return authorization;
} }
#endregion
private string GetNewSignature(WebParameterCollection parameters) private string GetNewSignature(WebParameterCollection parameters)
{ {
var timestamp = OAuthTools.GetTimestamp(); var timestamp = OAuthTools.GetTimestamp();
@ -241,8 +233,6 @@ namespace NzbDrone.Common.OAuth
return signature; return signature;
} }
#region Static Helpers
public static OAuthRequest ForRequestToken(string consumerKey, string consumerSecret) public static OAuthRequest ForRequestToken(string consumerKey, string consumerSecret)
{ {
var credentials = new OAuthRequest var credentials = new OAuthRequest
@ -335,8 +325,6 @@ namespace NzbDrone.Common.OAuth
return credentials; return credentials;
} }
#endregion
private void ValidateRequestState() private void ValidateRequestState()
{ {
if (IsNullOrBlank(Method)) if (IsNullOrBlank(Method))
@ -500,7 +488,7 @@ namespace NzbDrone.Common.OAuth
private static bool IsNullOrBlank(string value) private static bool IsNullOrBlank(string value)
{ {
return String.IsNullOrEmpty(value) || (!String.IsNullOrEmpty(value) && value.Trim() == String.Empty); return string.IsNullOrEmpty(value) || (!string.IsNullOrEmpty(value) && string.IsNullOrEmpty(value.Trim()));
} }
} }
} }

View File

@ -61,7 +61,7 @@ namespace NzbDrone.Common.OAuth
/// <returns></returns> /// <returns></returns>
public static string GetNonce() public static string GetNonce()
{ {
const string chars = (Lower + Digit); const string chars = Lower + Digit;
var nonce = new char[16]; var nonce = new char[16];
lock (_randomLock) lock (_randomLock)
@ -98,7 +98,7 @@ namespace NzbDrone.Common.OAuth
private static long ToUnixTime(DateTime dateTime) private static long ToUnixTime(DateTime dateTime)
{ {
var timeSpan = (dateTime - new DateTime(1970, 1, 1)); var timeSpan = dateTime - new DateTime(1970, 1, 1);
var timestamp = (long)timeSpan.TotalSeconds; var timestamp = (long)timeSpan.TotalSeconds;
return timestamp; return timestamp;
@ -155,8 +155,7 @@ namespace NzbDrone.Common.OAuth
var ret = original.OfType<char>().Where( var ret = original.OfType<char>().Where(
c => !Unreserved.OfType<char>().Contains(c) && c != '%').Aggregate( c => !Unreserved.OfType<char>().Contains(c) && c != '%').Aggregate(
value, (current, c) => current.Replace( value, (current, c) => current.Replace(
c.ToString(), PercentEncode(c.ToString()) c.ToString(), PercentEncode(c.ToString())));
));
return ret.Replace("%%", "%25%"); // Revisit to encode actual %'s return ret.Replace("%%", "%25%"); // Revisit to encode actual %'s
} }
@ -211,7 +210,7 @@ namespace NzbDrone.Common.OAuth
copy.RemoveAll(exclusions); copy.RemoveAll(exclusions);
foreach(var parameter in copy) foreach (var parameter in copy)
{ {
parameter.Value = UrlEncodeStrict(parameter.Value); parameter.Value = UrlEncodeStrict(parameter.Value);
} }
@ -225,7 +224,7 @@ namespace NzbDrone.Common.OAuth
#if WINRT #if WINRT
return CultureInfo.InvariantCulture.CompareInfo.Compare(left, right, CompareOptions.IgnoreCase) == 0; return CultureInfo.InvariantCulture.CompareInfo.Compare(left, right, CompareOptions.IgnoreCase) == 0;
#else #else
return String.Compare(left, right, StringComparison.InvariantCultureIgnoreCase) == 0; return string.Compare(left, right, StringComparison.InvariantCultureIgnoreCase) == 0;
#endif #endif
} }
@ -353,7 +352,7 @@ namespace NzbDrone.Common.OAuth
{ {
if (IsNullOrBlank(tokenSecret)) if (IsNullOrBlank(tokenSecret))
{ {
tokenSecret = String.Empty; tokenSecret = string.Empty;
} }
consumerSecret = UrlEncodeRelaxed(consumerSecret); consumerSecret = UrlEncodeRelaxed(consumerSecret);
@ -403,7 +402,7 @@ namespace NzbDrone.Common.OAuth
private static bool IsNullOrBlank(string value) private static bool IsNullOrBlank(string value)
{ {
return String.IsNullOrEmpty(value) || (!String.IsNullOrEmpty(value) && value.Trim() == String.Empty); return string.IsNullOrEmpty(value) || (!string.IsNullOrEmpty(value) && string.IsNullOrEmpty(value.Trim()));
} }
} }
} }

View File

@ -11,7 +11,6 @@
<PackageReference Include="MailKit" Version="2.10.1" /> <PackageReference Include="MailKit" Version="2.10.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="NLog" Version="4.6.6" /> <PackageReference Include="NLog" Version="4.6.6" />
<PackageReference Include="OAuth" Version="1.0.3" />
<PackageReference Include="RestSharp" Version="106.15.0" /> <PackageReference Include="RestSharp" Version="106.15.0" />
<PackageReference Include="TinyTwitter" Version="1.1.2" /> <PackageReference Include="TinyTwitter" Version="1.1.2" />
<PackageReference Include="Kveer.XmlRPC" Version="1.2.0" /> <PackageReference Include="Kveer.XmlRPC" Version="1.2.0" />

View File

@ -29,16 +29,16 @@ namespace TinyTwitter
public class TinyTwitter public class TinyTwitter
{ {
private readonly OAuthInfo oauth; private readonly OAuthInfo _oauth;
public TinyTwitter(OAuthInfo oauth) public TinyTwitter(OAuthInfo oauth)
{ {
this.oauth = oauth; _oauth = oauth;
} }
public void UpdateStatus(string message) public void UpdateStatus(string message)
{ {
new RequestBuilder(oauth, "POST", "https://api.twitter.com/1.1/statuses/update.json") new RequestBuilder(_oauth, "POST", "https://api.twitter.com/1.1/statuses/update.json")
.AddParameter("status", message) .AddParameter("status", message)
.Execute(); .Execute();
} }
@ -53,35 +53,33 @@ namespace TinyTwitter
public void DirectMessage(string message, string screenName) public void DirectMessage(string message, string screenName)
{ {
new RequestBuilder(oauth, "POST", "https://api.twitter.com/1.1/direct_messages/new.json") new RequestBuilder(_oauth, "POST", "https://api.twitter.com/1.1/direct_messages/new.json")
.AddParameter("text", message) .AddParameter("text", message)
.AddParameter("screen_name", screenName) .AddParameter("screen_name", screenName)
.Execute(); .Execute();
} }
#region RequestBuilder
public class RequestBuilder public class RequestBuilder
{ {
private const string VERSION = "1.0"; private const string VERSION = "1.0";
private const string SIGNATURE_METHOD = "HMAC-SHA1"; private const string SIGNATURE_METHOD = "HMAC-SHA1";
private readonly OAuthInfo oauth; private readonly OAuthInfo _oauth;
private readonly string method; private readonly string _method;
private readonly IDictionary<string, string> customParameters; private readonly IDictionary<string, string> _customParameters;
private readonly string url; private readonly string _url;
public RequestBuilder(OAuthInfo oauth, string method, string url) public RequestBuilder(OAuthInfo oauth, string method, string url)
{ {
this.oauth = oauth; _oauth = oauth;
this.method = method; _method = method;
this.url = url; _url = url;
customParameters = new Dictionary<string, string>(); _customParameters = new Dictionary<string, string>();
} }
public RequestBuilder AddParameter(string name, string value) public RequestBuilder AddParameter(string name, string value)
{ {
customParameters.Add(name, value.EncodeRFC3986()); _customParameters.Add(name, value.EncodeRFC3986());
return this; return this;
} }
@ -90,14 +88,14 @@ namespace TinyTwitter
var timespan = GetTimestamp(); var timespan = GetTimestamp();
var nonce = CreateNonce(); var nonce = CreateNonce();
var parameters = new Dictionary<string, string>(customParameters); var parameters = new Dictionary<string, string>(_customParameters);
AddOAuthParameters(parameters, timespan, nonce); AddOAuthParameters(parameters, timespan, nonce);
var signature = GenerateSignature(parameters); var signature = GenerateSignature(parameters);
var headerValue = GenerateAuthorizationHeaderValue(parameters, signature); var headerValue = GenerateAuthorizationHeaderValue(parameters, signature);
var request = (HttpWebRequest)WebRequest.Create(GetRequestUrl()); var request = (HttpWebRequest)WebRequest.Create(GetRequestUrl());
request.Method = method; request.Method = _method;
request.ContentType = "application/x-www-form-urlencoded"; request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("Authorization", headerValue); request.Headers.Add("Authorization", headerValue);
@ -127,25 +125,31 @@ namespace TinyTwitter
private void WriteRequestBody(HttpWebRequest request) private void WriteRequestBody(HttpWebRequest request)
{ {
if (method == "GET") if (_method == "GET")
{
return; return;
}
var requestBody = Encoding.ASCII.GetBytes(GetCustomParametersString()); var requestBody = Encoding.ASCII.GetBytes(GetCustomParametersString());
using (var stream = request.GetRequestStream()) using (var stream = request.GetRequestStream())
{
stream.Write(requestBody, 0, requestBody.Length); stream.Write(requestBody, 0, requestBody.Length);
} }
}
private string GetRequestUrl() private string GetRequestUrl()
{ {
if (method != "GET" || customParameters.Count == 0) if (_method != "GET" || _customParameters.Count == 0)
return url; {
return _url;
}
return string.Format("{0}?{1}", url, GetCustomParametersString()); return string.Format("{0}?{1}", _url, GetCustomParametersString());
} }
private string GetCustomParametersString() private string GetCustomParametersString()
{ {
return customParameters.Select(x => string.Format("{0}={1}", x.Key, x.Value)).Join("&"); return _customParameters.Select(x => string.Format("{0}={1}", x.Key, x.Value)).Join("&");
} }
private string GenerateAuthorizationHeaderValue(IEnumerable<KeyValuePair<string, string>> parameters, string signature) private string GenerateAuthorizationHeaderValue(IEnumerable<KeyValuePair<string, string>> parameters, string signature)
@ -161,15 +165,15 @@ namespace TinyTwitter
private string GenerateSignature(IEnumerable<KeyValuePair<string, string>> parameters) private string GenerateSignature(IEnumerable<KeyValuePair<string, string>> parameters)
{ {
var dataToSign = new StringBuilder() var dataToSign = new StringBuilder()
.Append(method).Append("&") .Append(_method).Append('&')
.Append(url.EncodeRFC3986()).Append("&") .Append(_url.EncodeRFC3986()).Append('&')
.Append(parameters .Append(parameters
.OrderBy(x => x.Key) .OrderBy(x => x.Key)
.Select(x => string.Format("{0}={1}", x.Key, x.Value)) .Select(x => string.Format("{0}={1}", x.Key, x.Value))
.Join("&") .Join("&")
.EncodeRFC3986()); .EncodeRFC3986());
var signatureKey = string.Format("{0}&{1}", oauth.ConsumerSecret.EncodeRFC3986(), oauth.AccessSecret.EncodeRFC3986()); var signatureKey = string.Format("{0}&{1}", _oauth.ConsumerSecret.EncodeRFC3986(), _oauth.AccessSecret.EncodeRFC3986());
var sha1 = new HMACSHA1(Encoding.ASCII.GetBytes(signatureKey)); var sha1 = new HMACSHA1(Encoding.ASCII.GetBytes(signatureKey));
var signatureBytes = sha1.ComputeHash(Encoding.ASCII.GetBytes(dataToSign.ToString())); var signatureBytes = sha1.ComputeHash(Encoding.ASCII.GetBytes(dataToSign.ToString()));
@ -179,11 +183,11 @@ namespace TinyTwitter
private void AddOAuthParameters(IDictionary<string, string> parameters, string timestamp, string nonce) private void AddOAuthParameters(IDictionary<string, string> parameters, string timestamp, string nonce)
{ {
parameters.Add("oauth_version", VERSION); parameters.Add("oauth_version", VERSION);
parameters.Add("oauth_consumer_key", oauth.ConsumerKey); parameters.Add("oauth_consumer_key", _oauth.ConsumerKey);
parameters.Add("oauth_nonce", nonce); parameters.Add("oauth_nonce", nonce);
parameters.Add("oauth_signature_method", SIGNATURE_METHOD); parameters.Add("oauth_signature_method", SIGNATURE_METHOD);
parameters.Add("oauth_timestamp", timestamp); parameters.Add("oauth_timestamp", timestamp);
parameters.Add("oauth_token", oauth.AccessToken); parameters.Add("oauth_token", _oauth.AccessToken);
} }
private static string GetTimestamp() private static string GetTimestamp()
@ -196,8 +200,6 @@ namespace TinyTwitter
return new Random().Next(0x0000000, 0x7fffffff).ToString("X8"); return new Random().Next(0x0000000, 0x7fffffff).ToString("X8");
} }
} }
#endregion
} }
public static class TinyTwitterHelperExtensions public static class TinyTwitterHelperExtensions
@ -217,7 +219,9 @@ namespace TinyTwitter
// From Twitterizer http://www.twitterizer.net/ // From Twitterizer http://www.twitterizer.net/
if (string.IsNullOrEmpty(value)) if (string.IsNullOrEmpty(value))
{
return string.Empty; return string.Empty;
}
var encoded = Uri.EscapeDataString(value); var encoded = Uri.EscapeDataString(value);