Skip to content

Commit c512d1b

Browse files
committed
1 parent d0ae441 commit c512d1b

File tree

3 files changed

+83
-13
lines changed

3 files changed

+83
-13
lines changed

src/shared/Core.Tests/GenericOAuthConfigTests.cs

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using GitCredentialManager.Tests.Objects;
34
using Xunit;
45

@@ -9,7 +10,9 @@ public class GenericOAuthConfigTests
910
[Fact]
1011
public void GenericOAuthConfig_TryGet_Valid_ReturnsTrue()
1112
{
12-
var remoteUri = new Uri("https://example.com");
13+
var protocol = "https";
14+
var host = "example.com";
15+
var remoteUri = new Uri($"{protocol}://{host}");
1316
const string expectedClientId = "115845b0-77f8-4c06-a3dc-7d277381fad1";
1417
const string expectedClientSecret = "4D35385D9F24";
1518
const string expectedUserName = "TEST_USER";
@@ -44,7 +47,12 @@ public void GenericOAuthConfig_TryGet_Valid_ReturnsTrue()
4447
RemoteUri = remoteUri
4548
};
4649

47-
bool result = GenericOAuthConfig.TryGet(trace, settings, remoteUri, out GenericOAuthConfig config);
50+
var input = new InputArguments(new Dictionary<string, string> {
51+
{"protocol", protocol},
52+
{"host", host},
53+
});
54+
55+
bool result = GenericOAuthConfig.TryGet(trace, settings, input, out GenericOAuthConfig config);
4856

4957
Assert.True(result);
5058
Assert.Equal(expectedClientId, config.ClientId);
@@ -57,5 +65,43 @@ public void GenericOAuthConfig_TryGet_Valid_ReturnsTrue()
5765
Assert.Equal(expectedUserName, config.DefaultUserName);
5866
Assert.True(config.UseAuthHeader);
5967
}
68+
69+
[Fact]
70+
public void GenericOAuthConfig_TryGet_Gitea()
71+
{
72+
var protocol = "https";
73+
var host = "example.com";
74+
var remoteUri = new Uri($"{protocol}://{host}");
75+
// https://docs.gitea.com/next/development/oauth2-provider?_highlight=oauth#pre-configured-applications
76+
const string expectedClientId = "e90ee53c-94e2-48ac-9358-a874fb9e0662";
77+
// https://docs.gitea.com/next/development/oauth2-provider?_highlight=oauth#endpoints
78+
const string authzEndpoint = "/login/oauth/authorize";
79+
const string tokenEndpoint = "/login/oauth/access_token";
80+
string[] expectedScopes = Array.Empty<string>();
81+
var expectedRedirectUri = new Uri("http://127.0.0.1");
82+
var expectedAuthzEndpoint = new Uri(remoteUri, authzEndpoint);
83+
var expectedTokenEndpoint = new Uri(remoteUri, tokenEndpoint);
84+
85+
var trace = new NullTrace();
86+
var settings = new TestSettings
87+
{
88+
RemoteUri = remoteUri
89+
};
90+
91+
var input = new InputArguments(new Dictionary<string, string> {
92+
{"protocol", protocol},
93+
{"host", host},
94+
{"wwwauth", "Basic realm=\"Gitea\""}
95+
});
96+
97+
bool result = GenericOAuthConfig.TryGet(trace, settings, input, out GenericOAuthConfig config);
98+
99+
Assert.True(result);
100+
Assert.Equal(expectedClientId, config.ClientId);
101+
Assert.Equal(expectedRedirectUri, config.RedirectUri);
102+
Assert.Equal(expectedScopes, config.Scopes);
103+
Assert.Equal(expectedAuthzEndpoint, config.Endpoints.AuthorizationEndpoint);
104+
Assert.Equal(expectedTokenEndpoint, config.Endpoints.TokenEndpoint);
105+
}
60106
}
61107
}

src/shared/Core/GenericHostProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public override async Task<ICredential> GenerateCredentialAsync(InputArguments i
6363
// Cannot check WIA or OAuth support for non-HTTP based protocols
6464
}
6565
// Check for an OAuth configuration for this remote
66-
else if (GenericOAuthConfig.TryGet(Context.Trace, Context.Settings, uri, out GenericOAuthConfig oauthConfig))
66+
else if (GenericOAuthConfig.TryGet(Context.Trace, Context.Settings, input, out GenericOAuthConfig oauthConfig))
6767
{
6868
Context.Trace.WriteLine($"Found generic OAuth configuration for '{uri}':");
6969
Context.Trace.WriteLine($"\tAuthzEndpoint = {oauthConfig.Endpoints.AuthorizationEndpoint}");

src/shared/Core/GenericOAuthConfig.cs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,56 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24
using GitCredentialManager.Authentication.OAuth;
35

46
namespace GitCredentialManager
57
{
68
public class GenericOAuthConfig
79
{
8-
public static bool TryGet(ITrace trace, ISettings settings, Uri remoteUri, out GenericOAuthConfig config)
10+
public static bool TryGet(ITrace trace, ISettings settings, InputArguments input, out GenericOAuthConfig config)
911
{
1012
config = new GenericOAuthConfig();
13+
Uri authzEndpointUri = null;
14+
Uri tokenEndpointUri = null;
15+
var remoteUri = input.GetRemoteUri();
1116

12-
if (!settings.TryGetSetting(
17+
if (input.WwwAuth.Any(x => x.Contains("Basic realm=\"Gitea\"")))
18+
{
19+
trace.WriteLine($"Using universal Gitea OAuth configuration");
20+
// https://docs.gitea.com/next/development/oauth2-provider?_highlight=oauth#pre-configured-applications
21+
config.ClientId = "e90ee53c-94e2-48ac-9358-a874fb9e0662";
22+
// https://docs.gitea.com/next/development/oauth2-provider?_highlight=oauth#endpoints
23+
authzEndpointUri = new Uri(remoteUri, "/login/oauth/authorize");
24+
tokenEndpointUri = new Uri(remoteUri, "/login/oauth/access_token");
25+
config.RedirectUri = new Uri("http://127.0.0.1");
26+
}
27+
28+
if (settings.TryGetSetting(
1329
Constants.EnvironmentVariables.OAuthAuthzEndpoint,
1430
Constants.GitConfiguration.Credential.SectionName,
1531
Constants.GitConfiguration.Credential.OAuthAuthzEndpoint,
16-
out string authzEndpoint) ||
17-
!Uri.TryCreate(remoteUri, authzEndpoint, out Uri authzEndpointUri))
32+
out string authzEndpoint))
33+
{
34+
Uri.TryCreate(remoteUri, authzEndpoint, out authzEndpointUri);
35+
}
36+
37+
if (authzEndpointUri == null)
1838
{
1939
trace.WriteLine($"Invalid OAuth configuration - missing/invalid authorize endpoint: {authzEndpoint}");
2040
config = null;
2141
return false;
2242
}
2343

24-
if (!settings.TryGetSetting(
44+
if (settings.TryGetSetting(
2545
Constants.EnvironmentVariables.OAuthTokenEndpoint,
2646
Constants.GitConfiguration.Credential.SectionName,
2747
Constants.GitConfiguration.Credential.OAuthTokenEndpoint,
28-
out string tokenEndpoint) ||
29-
!Uri.TryCreate(remoteUri, tokenEndpoint, out Uri tokenEndpointUri))
48+
out string tokenEndpoint))
49+
{
50+
Uri.TryCreate(remoteUri, tokenEndpoint, out tokenEndpointUri);
51+
}
52+
53+
if (tokenEndpointUri == null)
3054
{
3155
trace.WriteLine($"Invalid OAuth configuration - missing/invalid token endpoint: {tokenEndpoint}");
3256
config = null;
@@ -74,12 +98,12 @@ public static bool TryGet(ITrace trace, ISettings settings, Uri remoteUri, out G
7498
Constants.EnvironmentVariables.OAuthRedirectUri,
7599
Constants.GitConfiguration.Credential.SectionName,
76100
Constants.GitConfiguration.Credential.OAuthRedirectUri,
77-
out string redirectUrl) &&
78-
Uri.TryCreate(redirectUrl, UriKind.Absolute, out Uri redirectUri))
101+
out string redirectUrl) && Uri.TryCreate(redirectUrl, UriKind.Absolute, out Uri redirectUri))
79102
{
80103
config.RedirectUri = redirectUri;
81104
}
82-
else
105+
106+
if (config.RedirectUri == null)
83107
{
84108
trace.WriteLine($"Invalid OAuth configuration - missing/invalid redirect URI: {redirectUrl}");
85109
config = null;

0 commit comments

Comments
 (0)