Skip to content

Commit 4c83069

Browse files
committed
1 parent d0ae441 commit 4c83069

File tree

3 files changed

+44
-13
lines changed

3 files changed

+44
-13
lines changed

src/shared/Core.Tests/GenericOAuthConfigTests.cs

Lines changed: 10 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);

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: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,55 @@
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+
// https://docs.gitea.com/next/development/oauth2-provider?_highlight=oauth#pre-configured-applications
20+
trace.WriteLine($"Using universal Gitea OAuth configuration");
21+
Uri.TryCreate(remoteUri, "/login/oauth/authorize", out authzEndpointUri);
22+
Uri.TryCreate(remoteUri, "/login/oauth/access_token", out tokenEndpointUri);
23+
config.ClientId = "e90ee53c-94e2-48ac-9358-a874fb9e0662";
24+
config.RedirectUri = new Uri("http://127.0.0.1");
25+
}
26+
27+
if (settings.TryGetSetting(
1328
Constants.EnvironmentVariables.OAuthAuthzEndpoint,
1429
Constants.GitConfiguration.Credential.SectionName,
1530
Constants.GitConfiguration.Credential.OAuthAuthzEndpoint,
16-
out string authzEndpoint) ||
17-
!Uri.TryCreate(remoteUri, authzEndpoint, out Uri authzEndpointUri))
31+
out string authzEndpoint))
32+
{
33+
Uri.TryCreate(remoteUri, authzEndpoint, out authzEndpointUri);
34+
}
35+
36+
if (authzEndpointUri == null)
1837
{
1938
trace.WriteLine($"Invalid OAuth configuration - missing/invalid authorize endpoint: {authzEndpoint}");
2039
config = null;
2140
return false;
2241
}
2342

24-
if (!settings.TryGetSetting(
43+
if (settings.TryGetSetting(
2544
Constants.EnvironmentVariables.OAuthTokenEndpoint,
2645
Constants.GitConfiguration.Credential.SectionName,
2746
Constants.GitConfiguration.Credential.OAuthTokenEndpoint,
28-
out string tokenEndpoint) ||
29-
!Uri.TryCreate(remoteUri, tokenEndpoint, out Uri tokenEndpointUri))
47+
out string tokenEndpoint))
48+
{
49+
Uri.TryCreate(remoteUri, tokenEndpoint, out tokenEndpointUri);
50+
}
51+
52+
if (tokenEndpointUri == null)
3053
{
3154
trace.WriteLine($"Invalid OAuth configuration - missing/invalid token endpoint: {tokenEndpoint}");
3255
config = null;
@@ -74,12 +97,12 @@ public static bool TryGet(ITrace trace, ISettings settings, Uri remoteUri, out G
7497
Constants.EnvironmentVariables.OAuthRedirectUri,
7598
Constants.GitConfiguration.Credential.SectionName,
7699
Constants.GitConfiguration.Credential.OAuthRedirectUri,
77-
out string redirectUrl) &&
78-
Uri.TryCreate(redirectUrl, UriKind.Absolute, out Uri redirectUri))
100+
out string redirectUrl) && Uri.TryCreate(redirectUrl, UriKind.Absolute, out Uri redirectUri))
79101
{
80102
config.RedirectUri = redirectUri;
81103
}
82-
else
104+
105+
if (config.RedirectUri == null)
83106
{
84107
trace.WriteLine($"Invalid OAuth configuration - missing/invalid redirect URI: {redirectUrl}");
85108
config = null;

0 commit comments

Comments
 (0)