Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions AsyncOAuth.sln
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsyncOAuth", "AsyncOAuth\AsyncOAuth.csproj", "{877842FF-EDAE-40E7-913B-C871AD5A48CC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsyncOAuth.ConsoleApp", "AsyncOAuth.ConsoleApp\AsyncOAuth.ConsoleApp.csproj", "{C8BF0013-AE03-48C0-A11B-6CF9F39257DE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsyncOAuth.WindowsStoreApp", "AsyncOAuth.WindowsStoreApp\AsyncOAuth.WindowsStoreApp.csproj", "{8AE19756-F952-49E7-977B-68CC9626FD0C}"
EndProject
# Visual Studio 2013
VisualStudioVersion = 12.0.30110.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{36461CE6-8D3B-4F43-AFA5-C190569860BE}"
ProjectSection(SolutionItems) = preProject
Docs\AsyncOAuth.nuspec = Docs\AsyncOAuth.nuspec
Expand All @@ -15,6 +11,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{36461CE6-8
README.md = README.md
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsyncOAuth", "AsyncOAuth\AsyncOAuth.csproj", "{877842FF-EDAE-40E7-913B-C871AD5A48CC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsyncOAuth.ConsoleApp", "AsyncOAuth.ConsoleApp\AsyncOAuth.ConsoleApp.csproj", "{C8BF0013-AE03-48C0-A11B-6CF9F39257DE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsyncOAuth.WindowsStoreApp", "AsyncOAuth.WindowsStoreApp\AsyncOAuth.WindowsStoreApp.csproj", "{8AE19756-F952-49E7-977B-68CC9626FD0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down
7 changes: 6 additions & 1 deletion AsyncOAuth/AsyncOAuth.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,16 @@
<RootNamespace>AsyncOAuth</RootNamespace>
<AssemblyName>AsyncOAuth</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile88</TargetFrameworkProfile>
<TargetFrameworkProfile>Profile136</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>4.0</OldToolsVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
Expand Down
36 changes: 34 additions & 2 deletions AsyncOAuth/Internal/Utility.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AsyncOAuth
{
Expand All @@ -12,17 +13,27 @@ public static long ToUnixTime(this DateTime target)
return (long)(target - unixEpoch).TotalSeconds;
}

/// <summary>Escape RFC3986 String</summary>
/// <summary>Escape RFC3986 String</summary>

/// <param name="stringToEscape"></param>
/// <returns></returns>

public static string UrlEncode(this string stringToEscape)
{
return Uri.EscapeDataString(stringToEscape)
.Replace("!", "%21")
.Replace("*", "%2A")
.Replace("'", "%27")
.Replace("(", "%28")
.Replace(")", "%29");
.Replace(")", "%29")
.Replace(" ", "%20")
;
}
/**/





public static string UrlDecode(this string stringToUnescape)
{
Expand All @@ -35,6 +46,27 @@ public static string UrlDecode(this string stringToUnescape)
.Replace("%29", ")");
}

public static List<string> ParseUrlSegments (string path)
{
var segments = path.Split('/');
List<string> encodedSegments = new List<string>();
foreach (var item in segments)
{
encodedSegments.Add(item.UrlEncode());
}
return encodedSegments;
}

public static string EncodedPath(List<string> urlSegments)
{
StringBuilder p = new StringBuilder();
foreach (var item in urlSegments)
{
p.AppendFormat("/{0}", item);
}
return p.ToString();
}

public static IEnumerable<KeyValuePair<string, string>> ParseQueryString(string query)
{
var queryParams = query.TrimStart('?').Split('&')
Expand Down
31 changes: 19 additions & 12 deletions AsyncOAuth/OAuthUtility.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Text;
Expand All @@ -19,16 +20,16 @@ public static class OAuthUtility
/// <para>ex(WinRT): </para>
/// <para>ComputeHash = (key, buffer) =></para>
/// <para>{</para>
/// <para>&#160;&#160;&#160;&#160;var crypt = Windows.Security.Cryptography.Core.MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");</para>
/// <para>&#160;&#160;&#160;&#160;var keyBuffer = Windows.Security.Cryptography.CryptographicBuffer.CreateFromByteArray(key);</para>
/// <para>&#160;&#160;&#160;&#160;var cryptKey = crypt.CreateKey(keyBuffer);</para>
/// <para>&#160;</para>
/// <para>&#160;&#160;&#160;&#160;var dataBuffer = Windows.Security.Cryptography.CryptographicBuffer.CreateFromByteArray(buffer);</para>
/// <para>&#160;&#160;&#160;&#160;var signBuffer = Windows.Security.Cryptography.Core.CryptographicEngine.Sign(cryptKey, dataBuffer);</para>
/// <para>&#160;</para>
/// <para>&#160;&#160;&#160;&#160;byte[] value;</para>
/// <para>&#160;&#160;&#160;&#160;Windows.Security.Cryptography.CryptographicBuffer.CopyToByteArray(signBuffer, out value);</para>
/// <para>&#160;&#160;&#160;&#160;return value;</para>
/// <para>var crypt = Windows.Security.Cryptography.Core.MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");</para>
/// <para>var keyBuffer = Windows.Security.Cryptography.CryptographicBuffer.CreateFromByteArray(key);</para>
/// <para>var cryptKey = crypt.CreateKey(keyBuffer);</para>
/// <para></para>
/// <para>var dataBuffer = Windows.Security.Cryptography.CryptographicBuffer.CreateFromByteArray(buffer);</para>
/// <para>var signBuffer = Windows.Security.Cryptography.Core.CryptographicEngine.Sign(cryptKey, dataBuffer);</para>
/// <para></para>
/// <para>byte[] value;</para>
/// <para>Windows.Security.Cryptography.CryptographicBuffer.CopyToByteArray(signBuffer, out value);</para>
/// <para>return value;</para>
/// <para>};</para>
/// </summary>
public static HashFunction ComputeHash { private get; set; }
Expand All @@ -44,7 +45,11 @@ static string GenerateSignature(string consumerSecret, Uri uri, HttpMethod metho

// escaped => unescaped[]
var queryParams = Utility.ParseQueryString(uri.GetComponents(UriComponents.Query | UriComponents.KeepDelimiter, UriFormat.UriEscaped));



var encodedLocalPath = Utility.EncodedPath(Utility.ParseUrlSegments(uri.LocalPath)).TrimStart('/');
var baseUrl = uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);

var stringParameter = parameters
.Where(x => x.Key.ToLower() != "realm")
.Concat(queryParams)
Expand All @@ -54,10 +59,12 @@ static string GenerateSignature(string consumerSecret, Uri uri, HttpMethod metho
.Select(p => p.Key + "=" + p.Value)
.ToString("&");
var signatureBase = method.ToString() +
"&" + uri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.Unescaped).UrlEncode() +
"&" + (baseUrl +"/"+ encodedLocalPath).UrlEncode() +
"&" + stringParameter.UrlEncode();
Debug.WriteLine(signatureBase);

var hash = ComputeHash(Encoding.UTF8.GetBytes(hmacKeyBase), Encoding.UTF8.GetBytes(signatureBase));

return Convert.ToBase64String(hash).UrlEncode();
}

Expand Down