/// <summary>
        /// Performs login to GitHub.
        /// </summary>
        /// <param name="login">User login.</param>
        /// <param name="pass">User password.</param>
        /// <param name="authCode">Optional authentication code for two-factor authentication.</param>
        /// <returns><see cref="HttpResponseMessage"/>.</returns>
        private static async Task <HttpResponseMessage> LoginGithub(string login, string pass, string authCode = null)
        {
            var authString = Convert.ToBase64String(Encoding.Default.GetBytes($"{login}:{pass}"));
            var parameters = new
            {
                scopes        = new string[] { },
                client_id     = ClientId,
                client_secret = ClientSecret,
            };

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("User-Agent", login);

                using (var message = new HttpRequestMessage(HttpMethod.Post, ApiUrl))
                {
                    message.Headers.Accept.ParseAdd("application/json");
                    message.Headers.Authorization = AuthenticationHeaderValue.Parse($"Basic {authString}");

                    // Two-factor authentication
                    if (authCode != null)
                    {
                        message.Headers.Add(GithubOtpHeader, authCode);
                    }

                    var content = new StringContent(JsonConvert.SerializeObject(parameters), Encoding.UTF8, "application/json");
                    message.Content = content;

                    CakeTubeLogger.Trace(Resources_Logs.GettingOAuthToken);
                    return(await client.SendAsync(message).ConfigureAwait(false));
                }
            }
        }
        /// <summary>
        /// Gets GiHub OAuth token.
        /// </summary>
        /// <param name="login">User login.</param>
        /// <param name="pass">User password.</param>
        /// <returns>OAuth token or string.Empty in case of failure.</returns>
        public static async Task <string> GetGithubOAuthToken(string login, string pass)
        {
            try
            {
                var response = await LoginGithub(login, pass).ConfigureAwait(false);

                if (!response.IsSuccessStatusCode)
                {
                    if (response.StatusCode == HttpStatusCode.Unauthorized &&
                        response.Headers.Contains(GithubOtpHeader))
                    {
                        CakeTubeLogger.Trace(Resources_Logs.TwoFactorAuthenticationEnabled);

                        var requestAuthCode = ServiceLocator.Current.GetInstance <RequestAuthCode>();

                        requestAuthCode.ShowDialog();
                        if (requestAuthCode.DialogResult != true)
                        {
                            CakeTubeLogger.Trace(Resources_Logs.CancelAuthorization);
                            return(string.Empty);
                        }

                        var authCode = requestAuthCode.RequestAuthCodeViewModel.AuthCode;
                        CakeTubeLogger.Trace(Resources_Logs.SendingAuthenticationCode);

                        response = await LoginGithub(login, pass, authCode).ConfigureAwait(false);

                        if (!response.IsSuccessStatusCode)
                        {
                            CakeTubeLogger.Trace(Resources_Logs.TwoFactorAuthenticationFailedError);
                            return(string.Empty);
                        }
                    }
                    else
                    {
                        CakeTubeLogger.Trace(Resources_Logs.UnableToGetOAuthError);
                        return(string.Empty);
                    }
                }

                CakeTubeLogger.Trace(Resources_Logs.GettingValidResponse);
                var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                var responseJson = JObject.Parse(responseString);

                return(responseJson["token"].ToObject <string>());
            }
            catch (Exception exception)
            {
                CakeTubeLogger.Error(Resources_Logs.GitHubLoginError, exception);
                return(string.Empty);
            }
        }
예제 #3
0
        /// <summary>
        /// Gets GiHub OAuth token.
        /// </summary>
        /// <param name="login">User login.</param>
        /// <param name="pass">User password.</param>
        /// <returns>OAuth token or string.Empty in case of failure.</returns>
        public static async Task <string> GetGithubOAuthToken(string login, string pass)
        {
            try
            {
                var response = await LoginGithub(login, pass);

                if (!response.IsSuccessStatusCode)
                {
                    if (response.StatusCode == HttpStatusCode.Unauthorized &&
                        response.Headers.Contains(GithubOtpHeader))
                    {
                        CakeTubeLogger.Trace("Two-factor authentication enabled");

                        var requestAuthCode = ServiceLocator.Current.GetInstance <RequestAuthCode>();

                        requestAuthCode.ShowDialog();
                        if (requestAuthCode.DialogResult != true)
                        {
                            CakeTubeLogger.Trace("Cancel authorization!");
                            return(string.Empty);
                        }

                        var authCode = requestAuthCode.RequestAuthCodeViewModel.AuthCode;
                        CakeTubeLogger.Trace("Sending authentication code...");

                        response = await LoginGithub(login, pass, authCode);

                        if (!response.IsSuccessStatusCode)
                        {
                            CakeTubeLogger.Trace("Two-factor authentication failed!");
                            return(string.Empty);
                        }
                    }
                    else
                    {
                        CakeTubeLogger.Trace("Unable to get OAuth token from GitHub!");
                        return(string.Empty);
                    }
                }

                CakeTubeLogger.Trace("Got valid response from GitHub");
                var responseString = await response.Content.ReadAsStringAsync();

                var responseJson = JObject.Parse(responseString);

                return(responseJson["token"].ToObject <string>());
            }
            catch (Exception exception)
            {
                CakeTubeLogger.Error("Can not login via GitHub", exception);
                return(string.Empty);
            }
        }