introduce ApplicationAuthorization which contains raw token result

This commit is contained in:
Brendan Forster
2015-01-02 13:09:50 +09:30
parent 9db29d4a69
commit d613cef196
16 changed files with 71 additions and 48 deletions
@@ -48,7 +48,7 @@ namespace Octokit.Reactive
/// <exception cref="TwoFactorRequiredException">Thrown when the current account has two-factor
/// authentication enabled.</exception>
/// <returns></returns>
IObservable<Authorization> GetOrCreateApplicationAuthentication(
IObservable<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization);
@@ -71,7 +71,7 @@ namespace Octokit.Reactive
/// <exception cref="TwoFactorChallengeFailedException">Thrown when the two-factor code is not
/// valid.</exception>
/// <returns></returns>
IObservable<Authorization> GetOrCreateApplicationAuthentication(
IObservable<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization,
@@ -82,7 +82,7 @@ namespace Octokit.Reactive
/// </summary>
/// <param name="newAuthorization">Information about the new authorization to create</param>
/// <returns></returns>
IObservable<Authorization> Create(NewAuthorization newAuthorization);
IObservable<ApplicationAuthorization> Create(NewAuthorization newAuthorization);
/// <summary>
/// Update the <see cref="Authorization"/> specified by the id.
@@ -62,7 +62,7 @@ namespace Octokit.Reactive
/// <exception cref="TwoFactorRequiredException">Thrown when the current account has two-factor
/// authentication enabled.</exception>
/// <returns></returns>
public IObservable<Authorization> GetOrCreateApplicationAuthentication(
public IObservable<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization)
@@ -93,7 +93,7 @@ namespace Octokit.Reactive
/// <exception cref="TwoFactorChallengeFailedException">Thrown when the two-factor code is not
/// valid.</exception>
/// <returns></returns>
public IObservable<Authorization> GetOrCreateApplicationAuthentication(
public IObservable<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization,
@@ -117,7 +117,7 @@ namespace Octokit.Reactive
/// </summary>
/// <param name="newAuthorization">Information about the new authorization to create</param>
/// <returns></returns>
public IObservable<Authorization> Create(NewAuthorization newAuthorization)
public IObservable<ApplicationAuthorization> Create(NewAuthorization newAuthorization)
{
Ensure.ArgumentNotNull(newAuthorization, "authorization");
@@ -28,7 +28,7 @@ namespace Octokit
/// <param name="twoFactorChallengeHandler">Callback used to retrieve the two-factor authentication code
/// from the user</param>
/// <returns></returns>
public static IObservable<Authorization> GetOrCreateApplicationAuthentication(
public static IObservable<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
this IObservableAuthorizationsClient authorizationsClient,
string clientId,
string clientSecret,
@@ -42,7 +42,7 @@ namespace Octokit
Ensure.ArgumentNotNull(newAuthorization, "authorization");
return authorizationsClient.GetOrCreateApplicationAuthentication(clientId, clientSecret, newAuthorization)
.Catch<Authorization, TwoFactorRequiredException>(exception => twoFactorChallengeHandler(exception)
.Catch<ApplicationAuthorization, TwoFactorRequiredException>(exception => twoFactorChallengeHandler(exception)
.SelectMany(result =>
result.ResendCodeRequested
? authorizationsClient.GetOrCreateApplicationAuthentication(
@@ -83,7 +83,7 @@ namespace Octokit.Tests.Clients
authEndpoint.Create(new NewAuthorization());
client.Received().Post<Authorization>(Arg.Is<Uri>(u => u.ToString() == "authorizations")
client.Received().Post<ApplicationAuthorization>(Arg.Is<Uri>(u => u.ToString() == "authorizations")
, Args.NewAuthorization);
}
}
@@ -113,7 +113,7 @@ namespace Octokit.Tests.Clients
authEndpoint.GetOrCreateApplicationAuthentication("clientId", "secret", data);
client.Received().Put<Authorization>(Arg.Is<Uri>(u => u.ToString() == "authorizations/clients/clientId"),
client.Received().Put<ApplicationAuthorization>(Arg.Is<Uri>(u => u.ToString() == "authorizations/clients/clientId"),
Args.Object);
}
@@ -126,7 +126,7 @@ namespace Octokit.Tests.Clients
authEndpoint.GetOrCreateApplicationAuthentication("clientId", "secret", data, "two-factor");
client.Received().Put<Authorization>(
client.Received().Put<ApplicationAuthorization>(
Arg.Is<Uri>(u => u.ToString() == "authorizations/clients/clientId"),
Args.Object,
"two-factor");
@@ -137,8 +137,8 @@ namespace Octokit.Tests.Clients
{
var data = new NewAuthorization();
var client = Substitute.For<IApiConnection>();
client.Put<Authorization>(Args.Uri, Args.Object, Args.String)
.ThrowsAsync<Authorization>(
client.Put<ApplicationAuthorization>(Args.Uri, Args.Object, Args.String)
.ThrowsAsync<ApplicationAuthorization>(
new AuthorizationException(
new ApiResponse<object> { StatusCode = HttpStatusCode.Unauthorized }));
var authEndpoint = new AuthorizationsClient(client);
@@ -159,7 +159,7 @@ namespace Octokit.Tests.Clients
"secret",
Arg.Any<NewAuthorization>(),
"two-factor-code")
.Returns(Task.Factory.StartNew(() => new Authorization {Token = "xyz"}));
.Returns(Task.Factory.StartNew(() => new ApplicationAuthorization { Token = "xyz" }));
var result = await client.GetOrCreateApplicationAuthentication("clientId",
"secret",
@@ -191,7 +191,7 @@ namespace Octokit.Tests.Clients
"secret",
Arg.Any<NewAuthorization>(),
"two-factor-code")
.Returns(Task.Factory.StartNew(() => new Authorization { Token = "OAUTHSECRET" }));
.Returns(Task.Factory.StartNew(() => new ApplicationAuthorization { Token = "OAUTHSECRET" }));
var result = await client.GetOrCreateApplicationAuthentication("clientId",
"secret",
@@ -16,11 +16,11 @@ namespace Octokit.Tests.Reactive
{
var firstResponse = new TwoFactorRequiredException(TwoFactorType.AuthenticatorApp);
var twoFactorChallengeResult = new TwoFactorChallengeResult("two-factor-code");
var secondResponse = new Authorization {Token = "OAUTHSECRET"};
var secondResponse = new ApplicationAuthorization { Token = "OAUTHSECRET" };
var client = Substitute.For<IObservableAuthorizationsClient>();
client.GetOrCreateApplicationAuthentication(Args.String, Args.String, Args.NewAuthorization)
.Returns(Observable.Throw<Authorization>(firstResponse));
.Returns(Observable.Throw<ApplicationAuthorization>(firstResponse));
client.GetOrCreateApplicationAuthentication(
Args.String,
Args.String,
@@ -51,11 +51,11 @@ namespace Octokit.Tests.Reactive
TwoFactorChallengeResult.RequestResendCode,
new TwoFactorChallengeResult("two-factor-code")
});
var secondResponse = new Authorization { Token = "OAUTHSECRET" };
var secondResponse = new ApplicationAuthorization { Token = "OAUTHSECRET" };
var client = Substitute.For<IObservableAuthorizationsClient>();
client.GetOrCreateApplicationAuthentication(Args.String, Args.String, Args.NewAuthorization)
.Returns(Observable.Throw<Authorization>(firstResponse));
.Returns(Observable.Throw<ApplicationAuthorization>(firstResponse));
client.GetOrCreateApplicationAuthentication(
Args.String,
Args.String,
@@ -90,13 +90,13 @@ namespace Octokit.Tests.Reactive
var data = new NewAuthorization();
var client = Substitute.For<IObservableAuthorizationsClient>();
client.GetOrCreateApplicationAuthentication("clientId", "secret", Arg.Any<NewAuthorization>())
.Returns(Observable.Throw<Authorization>(new TwoFactorRequiredException()));
.Returns(Observable.Throw<ApplicationAuthorization>(new TwoFactorRequiredException()));
client.GetOrCreateApplicationAuthentication("clientId",
"secret",
Arg.Any<NewAuthorization>(),
"wrong-code")
.Returns(Observable.Throw<Authorization>(twoFactorFailedException));
var observer = Substitute.For<System.IObserver<Authorization>>();
.Returns(Observable.Throw<ApplicationAuthorization>(twoFactorFailedException));
var observer = Substitute.For<System.IObserver<ApplicationAuthorization>>();
client.GetOrCreateApplicationAuthentication(
"clientId",
+16 -16
View File
@@ -10,7 +10,7 @@ namespace Octokit
/// A client for GitHub's OAuth API.
/// </summary>
/// <remarks>
/// See the <a href="http://developer.github.com/v3/oauth_authorizations/">OAuth API documentation</a> for more details.
/// See the <a href="http://developer.github.com/v3/oauth/">OAuth API documentation</a> for more details.
/// </remarks>
public class AuthorizationsClient : ApiClient, IAuthorizationsClient
{
@@ -29,7 +29,7 @@ namespace Octokit
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="http://developer.github.com/v3/oauth_authorizations/#list-your-authorizations">API documentation</a> for more information.
/// See the <a href="http://developer.github.com/v3/oauth/#list-your-authorizations">API documentation</a> for more information.
/// </remarks>
/// <exception cref="AuthorizationException">
/// Thrown when the current user does not have permission to make the request.
@@ -46,7 +46,7 @@ namespace Octokit
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="http://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization">API documentation</a> for more information.
/// See the <a href="http://developer.github.com/v3/oauth/#get-a-single-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="id">The ID of the <see cref="Authorization"/> to get</param>
/// <exception cref="AuthorizationException">
@@ -65,7 +65,7 @@ namespace Octokit
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="http://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app">API documentation</a> for more information.
/// See the <a href="http://developer.github.com/v3/oauth/#get-or-create-an-authorization-for-a-specific-app">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">Client ID of the OAuth application for the token</param>
/// <param name="clientSecret">The client secret</param>
@@ -78,7 +78,7 @@ namespace Octokit
/// </exception>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The created <see cref="Authorization"/>.</returns>
public Task<Authorization> GetOrCreateApplicationAuthentication(
public Task<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization)
@@ -99,13 +99,13 @@ namespace Octokit
{
// use classic API
var endpoint = ApiUrls.AuthorizationsForClient(clientId);
return ApiConnection.Put<Authorization>(endpoint, requestData);
return ApiConnection.Put<ApplicationAuthorization>(endpoint, requestData);
}
else
{
// use new API
var endpoint = ApiUrls.AuthorizationsForClient(clientId, newAuthorization.Fingerprint);
return ApiConnection.Put<Authorization>(endpoint, requestData, null, previewAcceptsHeader);
return ApiConnection.Put<ApplicationAuthorization>(endpoint, requestData, null, previewAcceptsHeader);
}
}
@@ -115,7 +115,7 @@ namespace Octokit
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="http://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app">API documentation</a> for more information.
/// See the <a href="http://developer.github.com/v3/oauth/#get-or-create-an-authorization-for-a-specific-app">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">Client ID of the OAuth application for the token</param>
/// <param name="clientSecret">The client secret</param>
@@ -129,7 +129,7 @@ namespace Octokit
/// </exception>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The created <see cref="Authorization"/>.</returns>
public async Task<Authorization> GetOrCreateApplicationAuthentication(
public async Task<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization,
@@ -154,7 +154,7 @@ namespace Octokit
{
// use classic API
var endpoint = ApiUrls.AuthorizationsForClient(clientId);
return await ApiConnection.Put<Authorization>(
return await ApiConnection.Put<ApplicationAuthorization>(
endpoint,
requestData,
twoFactorAuthenticationCode);
@@ -163,7 +163,7 @@ namespace Octokit
{
// use new API
var endpoint = ApiUrls.AuthorizationsForClient(clientId, newAuthorization.Fingerprint);
return await ApiConnection.Put<Authorization>(
return await ApiConnection.Put<ApplicationAuthorization>(
endpoint,
requestData,
twoFactorAuthenticationCode,
@@ -181,7 +181,7 @@ namespace Octokit
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="http://developer.github.com/v3/oauth_authorizations/#update-an-existing-authorization">API
/// See the <a href="http://developer.github.com/v3/oauth/#update-an-existing-authorization">API
/// documentation</a> for more details.
/// </remarks>
/// <param name="id">ID of the <see cref="Authorization"/> to update</param>
@@ -215,7 +215,7 @@ namespace Octokit
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#create-a-new-authorization">API documentation</a> for more information.
/// See the <a href="http://developer.github.com/v3/oauth/#create-a-new-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="newAuthorization">Describes the new authorization to create</param>
/// <exception cref="AuthorizationException">
@@ -223,11 +223,11 @@ namespace Octokit
/// </exception>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The created <see cref="Authorization"/>.</returns>
public Task<Authorization> Create(NewAuthorization newAuthorization)
public Task<ApplicationAuthorization> Create(NewAuthorization newAuthorization)
{
Ensure.ArgumentNotNull(newAuthorization, "newAuthorization");
return ApiConnection.Post<Authorization>(ApiUrls.Authorizations(), newAuthorization);
return ApiConnection.Post<ApplicationAuthorization>(ApiUrls.Authorizations(), newAuthorization);
}
/// <summary>
@@ -235,7 +235,7 @@ namespace Octokit
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="http://developer.github.com/v3/oauth_authorizations/#delete-an-authorization">API
/// See the <a href="http://developer.github.com/v3/oauth/#delete-an-authorization">API
/// documentation</a> for more details.
/// </remarks>
/// <param name="id">The system-wide ID of the authorization to delete</param>
+3 -3
View File
@@ -66,7 +66,7 @@ namespace Octokit
/// </exception>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The created <see cref="Authorization"/>.</returns>
Task<Authorization> GetOrCreateApplicationAuthentication(
Task<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization);
@@ -91,7 +91,7 @@ namespace Octokit
/// </exception>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The created <see cref="Authorization"/>.</returns>
Task<Authorization> GetOrCreateApplicationAuthentication(
Task<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
string clientId,
string clientSecret,
NewAuthorization newAuthorization,
@@ -110,7 +110,7 @@ namespace Octokit
/// </exception>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The created <see cref="Authorization"/>.</returns>
Task<Authorization> Create(NewAuthorization newAuthorization);
Task<ApplicationAuthorization> Create(NewAuthorization newAuthorization);
/// <summary>
/// Updates the specified <see cref="Authorization"/>.
+1 -1
View File
@@ -30,7 +30,7 @@ namespace Octokit
/// <param name="twoFactorChallengeHandler">Callback used to retrieve the two-factor authentication code
/// from the user</param>
/// <returns></returns>
public static async Task<Authorization> GetOrCreateApplicationAuthentication(
public static async Task<ApplicationAuthorization> GetOrCreateApplicationAuthentication(
this IAuthorizationsClient authorizationsClient,
string clientId,
string clientSecret,
@@ -0,0 +1,23 @@
using System;
using System.Diagnostics;
using System.Globalization;
namespace Octokit
{
/// <summary>
/// Represents an oauth access given to a particular application.
/// </summary>
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class ApplicationAuthorization : Authorization
{
/// <summary>
/// The oauth token (be careful with these, they are like passwords!).
/// </summary>
/// <remarks>
/// This will return only return a value the first time
/// the authorization is created. All subsequent API calls
/// (for example, 'get' for an authorization) will return `null`
/// </remarks>
public string Token { get; set; }
}
}
-6
View File
@@ -26,12 +26,6 @@ namespace Octokit
/// </summary>
public Application Application { get; set; }
/// <summary>
/// The oauth token (be careful with these, they are like passwords!).
/// </summary>
[Obsolete("Now returns empty string, to be deprecated for security reasons")]
public string Token { get; set; }
/// <summary>
/// The last eight characters of the user's token
/// </summary>
+1
View File
@@ -358,6 +358,7 @@
<Compile Include="Models\Response\SignatureResponse.cs" />
<Compile Include="Helpers\PropertyOrField.cs" />
<Compile Include="Helpers\ApiUrls.Authorizations.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
+1
View File
@@ -370,6 +370,7 @@
<Compile Include="Models\Response\SignatureResponse.cs" />
<Compile Include="Helpers\PropertyOrField.cs" />
<Compile Include="Helpers\ApiUrls.Authorizations.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
</Project>
+1
View File
@@ -365,6 +365,7 @@
<Compile Include="Models\Response\SignatureResponse.cs" />
<Compile Include="Helpers\PropertyOrField.cs" />
<Compile Include="Helpers\ApiUrls.Authorizations.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.MonoTouch.CSharp.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+1
View File
@@ -356,6 +356,7 @@
<Compile Include="Models\Response\SignatureResponse.cs" />
<Compile Include="Helpers\PropertyOrField.cs" />
<Compile Include="Helpers\ApiUrls.Authorizations.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
+1
View File
@@ -360,6 +360,7 @@
<Compile Include="Models\Response\SignatureResponse.cs" />
<Compile Include="Helpers\PropertyOrField.cs" />
<Compile Include="Helpers\ApiUrls.Authorizations.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
+1
View File
@@ -89,6 +89,7 @@
<Compile Include="Models\Request\CommitRequest.cs" />
<Compile Include="Models\Response\CommitContent.cs" />
<Compile Include="Models\Response\ContentType.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
<Compile Include="Models\Response\GitHubCommitFile.cs" />
<Compile Include="Models\Response\RepositoryContent.cs" />
<Compile Include="Models\Response\RepositoryContentChangeSet.cs" />