Esempio n. 1
0
        public async Task LoginWithToken(string clientId, string clientSecret, string code, string redirect, string requestDomain, string apiDomain)
        {
            var oauthRequest = new Octokit.OauthTokenRequest(clientId, clientSecret, code)
            {
                RedirectUri = new Uri(redirect)
            };

            var client = new Octokit.GitHubClient(OctokitClientFactory.UserAgent);
            var token  = await client.Oauth.CreateAccessToken(oauthRequest);

            var credentials = new Octokit.Credentials(token.AccessToken);

            client = OctokitClientFactory.Create(new Uri(apiDomain), credentials);

            var user = await client.User.Current();

            var account = await _accountsService.Get(apiDomain, user.Login);

            account = account ?? new Account {
                Username = user.Login
            };
            account.OAuth     = token.AccessToken;
            account.AvatarUrl = user.AvatarUrl;
            account.Domain    = apiDomain;
            account.WebDomain = requestDomain;

            await _accountsService.Save(account);

            await _applicationService.LoginAccount(account);
        }
Esempio n. 2
0
        public async Task LoginAccount(Account account)
        {
            var    domain = account.Domain ?? Client.DefaultApi;
            Client client = null;

            Octokit.Credentials credentials = null;

            if (!string.IsNullOrEmpty(account.OAuth))
            {
                client      = Client.BasicOAuth(account.OAuth, domain);
                credentials = new Octokit.Credentials(account.OAuth);
            }
            else if (account.IsEnterprise || !string.IsNullOrEmpty(account.Password))
            {
                client      = Client.Basic(account.Username, account.Password, domain);
                credentials = new Octokit.Credentials(account.Username, account.Password);
            }

            var octoClient = OctokitClientFactory.Create(new Uri(domain), credentials);
            var user       = await octoClient.User.Current();

            account.Username  = user.Login;
            account.AvatarUrl = user.AvatarUrl;
            client.Username   = user.Login;

            await _accountsService.Save(account);

            await _accountsService.SetActiveAccount(account);

            Account      = account;
            Client       = client;
            GitHubClient = octoClient;
        }
Esempio n. 3
0
        public void ActivateUser(Account account, Client client)
        {
            _accountsService.SetActiveAccount(account).Wait();
            Account = account;
            Client  = client;

            var domain      = account.Domain ?? Client.DefaultApi;
            var credentials = new Octokit.Credentials(account.OAuth);
            var oldClient   = Client.BasicOAuth(account.OAuth, domain);

            GitHubClient = OctokitClientFactory.Create(new Uri(domain), credentials);
        }
Esempio n. 4
0
        public async Task <GitHubAccount> Authenticate(string apiDomain, string webDomain, string user, string pass, string twoFactor, bool enterprise)
        {
            try
            {
                string token = null;

                if (enterprise)
                {
                    var client = twoFactor == null?Client.Basic(user, pass, apiDomain) : Client.BasicTwoFactorAuthentication(user, pass, twoFactor, apiDomain);

                    var name    = string.Format("CodeHub (GitHub for iOS) - {0}", DateTime.Now.ToString("s"));
                    var request = client.Authorizations.Create(OctokitClientFactory.Scopes.ToList(), name, "http://codehub-app.com");
                    var auth    = await client.ExecuteAsync(request);

                    token = auth.Data.Token;
                }
                else
                {
                    var scopes = OctokitClientFactory.Scopes;
                    var client = OctokitClientFactory.Create(new Uri(apiDomain), new Credentials(user, pass));

                    var appAuth = await client.Authorization.GetOrCreateApplicationAuthentication("72f4fb74bdba774b759d",
                                                                                                  "9253ab615f8c00738fff5d1c665ca81e581875cb", new NewAuthorization("CodeHub", scopes));

                    if (scopes.Except(appAuth.Scopes).Any())
                    {
                        await client.Authorization.Update(appAuth.Id, new AuthorizationUpdate { Scopes = scopes });
                    }

                    token = appAuth.Token;
                }

                return(await Authenticate(apiDomain, webDomain, token, enterprise));
            }
            catch (StatusCodeException ex)
            {
                //Looks like we need to ask for the key!
                if (ex.Headers.ContainsKey("X-GitHub-OTP"))
                {
                    throw new TwoFactorRequiredException();
                }
                throw new Exception("Unable to login as user " + user + ". Please check your credentials and try again.");
            }
        }
Esempio n. 5
0
        public async Task SetSessionAccount(GitHubAccount account)
        {
            if (account == null)
            {
                Account      = null;
                Client       = null;
                GitHubClient = null;
                return;
            }

            try
            {
                var domain      = account.Domain ?? Client.DefaultApi;
                var credentials = new Credentials(account.OAuth);
                var oldClient   = Client.BasicOAuth(account.OAuth, domain);
                var newClient   = OctokitClientFactory.Create(new Uri(domain), credentials);

                var userInfo = await newClient.User.Current();

                account.Name      = userInfo.Name;
                account.Email     = userInfo.Email;
                account.AvatarUrl = userInfo.AvatarUrl;
                await _accountsRepository.Update(account);

                // Set all the good stuff.
                Client       = oldClient;
                GitHubClient = newClient;
                Account      = account;

                // Identify for the analytics service
                _analyticsService.Identify(Account.Username);
                _analyticsService.Track("login");
            }
            catch
            {
                Account      = null;
                GitHubClient = null;
                Client       = null;
                throw;
            }
        }
Esempio n. 6
0
        public async Task LoginWithBasic(string domain, string user, string pass, string twoFactor = null)
        {
            if (string.IsNullOrEmpty(user))
            {
                throw new ArgumentException("Username is invalid");
            }
            if (string.IsNullOrEmpty(pass))
            {
                throw new ArgumentException("Password is invalid");
            }
            if (domain == null || !Uri.IsWellFormedUriString(domain, UriKind.Absolute))
            {
                throw new ArgumentException("Domain is invalid");
            }

            var newAuthorization = new Octokit.NewAuthorization(
                $"CodeHub: {user}", Scopes, Guid.NewGuid().ToString());

            var credentials = new Octokit.Credentials(user, pass);
            var client      = OctokitClientFactory.Create(new Uri(domain), credentials);

            var authorization = await(twoFactor == null
                                ? client.Authorization.Create(newAuthorization)
                                : client.Authorization.Create(newAuthorization, twoFactor));

            var existingAccount = await _accountsService.Get(domain, user);

            var account = existingAccount ?? new Account
            {
                Username     = user,
                IsEnterprise = true,
                WebDomain    = domain,
                Domain       = domain
            };

            account.OAuth = authorization.Token;

            await _applicationService.LoginAccount(account);
        }
Esempio n. 7
0
        public async Task LoginWithToken(string apiDomain, string webDomain, string token, bool enterprise)
        {
            if (string.IsNullOrEmpty(token))
            {
                throw new ArgumentException("Token is invalid");
            }
            if (apiDomain != null && !Uri.IsWellFormedUriString(apiDomain, UriKind.Absolute))
            {
                throw new ArgumentException("API Domain is invalid");
            }
            if (webDomain != null && !Uri.IsWellFormedUriString(webDomain, UriKind.Absolute))
            {
                throw new ArgumentException("Web Domain is invalid");
            }

            var credentials = new Octokit.Credentials(token);
            var client      = OctokitClientFactory.Create(new Uri(apiDomain), credentials);
            var userInfo    = await client.User.Current();

            var scopes = await GetScopes(apiDomain, userInfo.Login, token);

            CheckScopes(scopes);

            var account = (await _accountsService.Get(apiDomain, userInfo.Login)) ?? new Account();

            account.Username     = userInfo.Login;
            account.Domain       = apiDomain;
            account.WebDomain    = webDomain;
            account.IsEnterprise = enterprise;
            account.OAuth        = token;
            account.AvatarUrl    = userInfo.AvatarUrl;

            await _accountsService.Save(account);

            await _applicationService.LoginAccount(account);
        }