|
1 | 1 | using System; |
| 2 | +using System.Collections.Generic; |
| 3 | +using System.Linq; |
2 | 4 | using GitCredentialManager.Authentication.OAuth; |
3 | 5 |
|
4 | 6 | namespace GitCredentialManager |
5 | 7 | { |
6 | 8 | public class GenericOAuthConfig |
7 | 9 | { |
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) |
9 | 11 | { |
10 | 12 | config = new GenericOAuthConfig(); |
| 13 | + Uri authzEndpointUri = null; |
| 14 | + Uri tokenEndpointUri = null; |
| 15 | + var remoteUri = input.GetRemoteUri(); |
11 | 16 |
|
12 | | - if (!settings.TryGetSetting( |
| 17 | + if (input.WwwAuth.Any(x => x.Contains("Basic realm=\"Gitea\"", StringComparison.OrdinalIgnoreCase))) |
| 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 = WellKnown.GiteaClientId; |
| 22 | + authzEndpointUri = new Uri(remoteUri, WellKnown.GiteaAuthzEndpoint); |
| 23 | + tokenEndpointUri = new Uri(remoteUri, WellKnown.GiteaTokenEndpoint); |
| 24 | + config.RedirectUri = WellKnown.LocalIPv4RedirectUri; |
| 25 | + } |
| 26 | + |
| 27 | + if (settings.TryGetSetting( |
13 | 28 | Constants.EnvironmentVariables.OAuthAuthzEndpoint, |
14 | 29 | Constants.GitConfiguration.Credential.SectionName, |
15 | 30 | 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) |
18 | 37 | { |
19 | 38 | trace.WriteLine($"Invalid OAuth configuration - missing/invalid authorize endpoint: {authzEndpoint}"); |
20 | 39 | config = null; |
21 | 40 | return false; |
22 | 41 | } |
23 | 42 |
|
24 | | - if (!settings.TryGetSetting( |
| 43 | + if (settings.TryGetSetting( |
25 | 44 | Constants.EnvironmentVariables.OAuthTokenEndpoint, |
26 | 45 | Constants.GitConfiguration.Credential.SectionName, |
27 | 46 | 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) |
30 | 53 | { |
31 | 54 | trace.WriteLine($"Invalid OAuth configuration - missing/invalid token endpoint: {tokenEndpoint}"); |
32 | 55 | config = null; |
@@ -74,12 +97,12 @@ public static bool TryGet(ITrace trace, ISettings settings, Uri remoteUri, out G |
74 | 97 | Constants.EnvironmentVariables.OAuthRedirectUri, |
75 | 98 | Constants.GitConfiguration.Credential.SectionName, |
76 | 99 | 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)) |
79 | 101 | { |
80 | 102 | config.RedirectUri = redirectUri; |
81 | 103 | } |
82 | | - else |
| 104 | + |
| 105 | + if (config.RedirectUri == null) |
83 | 106 | { |
84 | 107 | trace.WriteLine($"Invalid OAuth configuration - missing/invalid redirect URI: {redirectUrl}"); |
85 | 108 | config = null; |
@@ -134,5 +157,15 @@ public static bool TryGet(ITrace trace, ISettings settings, Uri remoteUri, out G |
134 | 157 | public string DefaultUserName { get; set; } |
135 | 158 |
|
136 | 159 | public bool SupportsDeviceCode => Endpoints.DeviceAuthorizationEndpoint != null; |
| 160 | + |
| 161 | + public static class WellKnown |
| 162 | + { |
| 163 | + // https://docs.gitea.com/next/development/oauth2-provider?_highlight=oauth#pre-configured-applications |
| 164 | + public const string GiteaClientId = "e90ee53c-94e2-48ac-9358-a874fb9e0662"; |
| 165 | + // https://docs.gitea.com/next/development/oauth2-provider?_highlight=oauth#endpoints |
| 166 | + public const string GiteaAuthzEndpoint = "/login/oauth/authorize"; |
| 167 | + public const string GiteaTokenEndpoint = "/login/oauth/access_token"; |
| 168 | + public static Uri LocalIPv4RedirectUri = new Uri("http://127.0.0.1"); |
| 169 | + } |
137 | 170 | } |
138 | 171 | } |
0 commit comments