internal AuthenticationModes GetSupportedAuthenticationModes(Uri targetUri) { // Check for an explicit override for supported authentication modes if (Context.Settings.TryGetSetting( GitLabConstants.EnvironmentVariables.AuthenticationModes, Constants.GitConfiguration.Credential.SectionName, GitLabConstants.GitConfiguration.Credential.AuthenticationModes, out string authModesStr)) { if (Enum.TryParse(authModesStr, true, out AuthenticationModes authModes) && authModes != AuthenticationModes.None) { Context.Trace.WriteLine($"Supported authentication modes override present: {authModes}"); return(authModes); } else { Context.Trace.WriteLine($"Invalid value for supported authentication modes override setting: '{authModesStr}'"); } } // GitLab.com has well-known supported auth modes if (GitLabConstants.IsGitLabDotCom(targetUri)) { return(GitLabConstants.DotComAuthenticationModes); } // Try to detect what auth modes are available for this non-GitLab.com host. // Assume that PATs are always available to give at least one option to users! var modes = AuthenticationModes.Pat; // If there is a configured OAuth client ID (that isn't GitLab.com's client ID) // then assume OAuth is possible. string oauthClientId = GitLabOAuth2Client.GetClientId(Context.Settings); if (!GitLabConstants.IsGitLabDotComClientId(oauthClientId)) { modes |= AuthenticationModes.Browser; } else { // Tell the user that they may wish to configure OAuth for this GitLab instance Context.Streams.Error.WriteLine( $"warning: missing OAuth configuration for {targetUri.Host} - see {GitLabConstants.HelpUrls.GitLab} for more information"); } // Would like to query password_authentication_enabled_for_git, but can't unless logged in https://gitlab.com/gitlab-org/gitlab/-/issues/349463. // For now assume password auth is always available. bool supportsBasic = true; if (supportsBasic) { modes |= AuthenticationModes.Basic; } return(modes); }
public override bool IsSupported(InputArguments input) { if (input is null) { return(false); } // We do not support unencrypted HTTP communications to GitLab, // but we report `true` here for HTTP so that we can show a helpful // error message for the user in `CreateCredentialAsync`. if (!StringComparer.OrdinalIgnoreCase.Equals(input.Protocol, "http") && !StringComparer.OrdinalIgnoreCase.Equals(input.Protocol, "https")) { return(false); } if (GitLabConstants.IsGitLabDotCom(input.GetRemoteUri())) { return(true); } // Split port number and hostname from host input argument if (!input.TryGetHostAndPort(out string hostName, out _)) { return(false); } string[] domains = hostName.Split(new char[] { '.' }); // GitLab[.subdomain].domain.tld if (domains.Length >= 3 && StringComparer.OrdinalIgnoreCase.Equals(domains[0], "gitlab")) { return(true); } return(false); }