From a86e8c4f7d2110c8692b80a467508fa4d2845fcc Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 23 Mar 2018 12:12:29 -0700 Subject: [PATCH 01/10] Change error log message to a trace message --- src/UnityExtension/Assets/Editor/GitHub.Unity/UI/GitPathView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/GitPathView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/GitPathView.cs index b2031f83e..56d1731b5 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/GitPathView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/GitPathView.cs @@ -253,7 +253,7 @@ private void ValidateAndSetGitInstallPath(string value) } else { - Logger.Warning("Software versions meet minimums Git:{0} GitLfs:{1}", + Logger.Trace("Software versions meet minimums Git:{0} GitLfs:{1}", result.GitVersion, result.GitLfsVersion); From ffea8132f0fd0f771ef1a44dbbb62a7257c8abbc Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 23 Mar 2018 11:06:20 -0700 Subject: [PATCH 02/10] FindOrCreateAdapter may return an Adapter with a null credential --- src/GitHub.Api/Authentication/Keychain.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GitHub.Api/Authentication/Keychain.cs b/src/GitHub.Api/Authentication/Keychain.cs index 5e93f488c..542904020 100644 --- a/src/GitHub.Api/Authentication/Keychain.cs +++ b/src/GitHub.Api/Authentication/Keychain.cs @@ -323,6 +323,6 @@ private void UpdateConnections(Connection[] conns) public Connection[] Connections => connections.Values.ToArray(); public IList Hosts => connections.Keys.ToArray(); public bool HasKeys => connections.Any(); - public bool NeedsLoad => HasKeys && !string.IsNullOrEmpty(FindOrCreateAdapter(connections.First().Value.Host).Credential.Token); + public bool NeedsLoad => HasKeys && !string.IsNullOrEmpty(FindOrCreateAdapter(connections.First().Value.Host).Credential?.Token); } } \ No newline at end of file From e0e12bab59dae9814f0198157561a318aacfca85 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Sat, 24 Mar 2018 02:05:53 -0700 Subject: [PATCH 03/10] Refactoring methods to prevent double loading of data Operational methods call the validation methods to validate data before they do their job. The validation methods load the requisite data and validate them. The operational methods then load the same data items and continue. In order to reduce the re-querying the validation methods now load the data, validate the data and returns the data if valid. Refactoring method `LoadKeychainInternal`/`ValidateKeychain` to `GetValidatedKeychainAdaper` Refactoring method `GetCurrentUserInternal` to `GetValidatedGitHubUser` --- src/GitHub.Api/Application/ApiClient.cs | 136 +++++++----------- src/GitHub.Api/Application/IApiClient.cs | 1 - .../Editor/GitHub.Unity/UI/PopupWindow.cs | 10 +- 3 files changed, 58 insertions(+), 89 deletions(-) diff --git a/src/GitHub.Api/Application/ApiClient.cs b/src/GitHub.Api/Application/ApiClient.cs index 10a01e0f3..f3cf4eecb 100644 --- a/src/GitHub.Api/Application/ApiClient.cs +++ b/src/GitHub.Api/Application/ApiClient.cs @@ -86,7 +86,9 @@ public async Task ValidateCurrentUser(Action onSuccess, Action onErro Guard.ArgumentNotNull(onSuccess, nameof(onSuccess)); try { - await ValidateCurrentUserInternal(); + var keychainConnection = keychain.Connections.First(); + var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection); + await GetValidatedGitHubUser(keychainConnection, keychainAdapter); onSuccess(); } catch (Exception e) @@ -95,13 +97,6 @@ public async Task ValidateCurrentUser(Action onSuccess, Action onErro } } - public async Task GetCurrentUser(Action callback) - { - Guard.ArgumentNotNull(callback, "callback"); - var user = await GetCurrentUserInternal(); - callback(user); - } - public async Task Login(string username, string password, Action need2faCode, Action result) { Guard.ArgumentNotNull(need2faCode, "need2faCode"); @@ -204,11 +199,10 @@ private async Task CreateRepositoryInternal(string repositoryN { logger.Trace("Creating repository"); - await ValidateKeychain(); - await ValidateCurrentUserInternal(); - - var uriString = keychain.Connections.First().Host; - var keychainAdapter = await keychain.Load(uriString); + //TODO: ONE_USER_LOGIN This assumes only ever one user can login + var keychainConnection = keychain.Connections.First(); + var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection); + await GetValidatedGitHubUser(keychainConnection, keychainAdapter); var command = new StringBuilder("publish -r \""); command.Append(repositoryName); @@ -233,7 +227,7 @@ private async Task CreateRepositoryInternal(string repositoryN command.Append(" -p"); } - var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, command.ToString(), + var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, command.ToString(), user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token) .Configure(processManager); @@ -267,11 +261,10 @@ private async Task GetOrganizationInternal(Action onSuccess, Act { logger.Trace("Getting Organizations"); - await ValidateKeychain(); - await ValidateCurrentUserInternal(); - - var uriString = keychain.Connections.First().Host; - var keychainAdapter = await keychain.Load(uriString); + //TODO: ONE_USER_LOGIN This assumes only ever one user can login + var keychainConnection = keychain.Connections.First(); + var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection); + await GetValidatedGitHubUser(keychainConnection, keychainAdapter); var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "organizations", user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token) @@ -308,27 +301,57 @@ private async Task GetOrganizationInternal(Action onSuccess, Act } } - private async Task GetCurrentUserInternal() + private async Task GetValidatedKeychainAdaper(Connection keychainConnection) { - try + if (keychain.HasKeys) { - logger.Trace("Getting Current User"); - await ValidateKeychain(); + logger.Trace("LoadKeychainInternal: Loading"); - var uriString = keychain.Connections.First().Host; - var keychainAdapter = await keychain.Load(uriString); + var keychainAdapter = await keychain.Load(keychainConnection.Host); + logger.Trace("LoadKeychainInternal: Loaded"); + + if (string.IsNullOrEmpty(keychainAdapter.Credential?.Username)) + { + logger.Trace("LoadKeychainInternal: Username is empty"); + throw new TokenUsernameMismatchException(keychainConnection.Username); + } + + if (keychainAdapter.Credential.Username != keychainConnection.Username) + { + logger.Trace("LoadKeychainInternal: Token username does not match"); + throw new TokenUsernameMismatchException(keychainConnection.Username, keychainAdapter.Credential.Username); + } + return keychainAdapter; + } + + logger.Trace("LoadKeychainInternal: No keys to load"); + throw new KeychainEmptyException(); + } + + private async Task GetValidatedGitHubUser(Connection keychainConnection, IKeychainAdapter keychainAdapter) + { + try + { var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "validate", - user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token) + user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token) .Configure(processManager); var ret = await octorunTask.StartAsAsync(); if (ret.IsSuccess) { + var login = ret.Output[1]; + + if (login != keychainConnection.Username) + { + logger.Trace("LoadKeychainInternal: Api username does not match"); + throw new TokenUsernameMismatchException(keychainConnection.Username, login); + } + return new GitHubUser { Name = ret.Output[0], - Login = ret.Output[1] + Login = login }; } @@ -350,55 +373,6 @@ private async Task GetCurrentUserInternal() throw; } } - - private async Task ValidateCurrentUserInternal() - { - logger.Trace("Validating User"); - - var apiUser = await GetCurrentUserInternal(); - var apiUsername = apiUser.Login; - - var cachedUsername = keychain.Connections.First().Username; - - if (apiUsername != cachedUsername) - { - throw new TokenUsernameMismatchException(cachedUsername, apiUsername); - } - } - - private async Task LoadKeychainInternal() - { - if (keychain.HasKeys) - { - if (!keychain.NeedsLoad) - { - logger.Trace("LoadKeychainInternal: Previously Loaded"); - return true; - } - - logger.Trace("LoadKeychainInternal: Loading"); - - //TODO: ONE_USER_LOGIN This assumes only ever one user can login - var uriString = keychain.Connections.First().Host; - - var keychainAdapter = await keychain.Load(uriString); - logger.Trace("LoadKeychainInternal: Loaded"); - - return keychainAdapter.Credential.Token != null; - } - - logger.Trace("LoadKeychainInternal: No keys to load"); - - return false; - } - - private async Task ValidateKeychain() - { - if (!await LoadKeychainInternal()) - { - throw new KeychainEmptyException(); - } - } } class GitHubUser @@ -435,7 +409,7 @@ class TokenUsernameMismatchException : ApiClientException public string CachedUsername { get; } public string CurrentUsername { get; } - public TokenUsernameMismatchException(string cachedUsername, string currentUsername) + public TokenUsernameMismatchException(string cachedUsername, string currentUsername = null) { CachedUsername = cachedUsername; CurrentUsername = currentUsername; @@ -448,12 +422,8 @@ protected TokenUsernameMismatchException(SerializationInfo info, StreamingContex class KeychainEmptyException : ApiClientException { public KeychainEmptyException() - { } - public KeychainEmptyException(string message) : base(message) - { } - - public KeychainEmptyException(string message, Exception innerException) : base(message, innerException) - { } + { + } protected KeychainEmptyException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/GitHub.Api/Application/IApiClient.cs b/src/GitHub.Api/Application/IApiClient.cs index 438e9bbf5..135923836 100644 --- a/src/GitHub.Api/Application/IApiClient.cs +++ b/src/GitHub.Api/Application/IApiClient.cs @@ -14,7 +14,6 @@ Task CreateRepository(string name, string description, bool isPrivate, Task ContinueLogin(LoginResult loginResult, string code); Task LoginAsync(string username, string password, Func need2faCode); Task Logout(UriString host); - Task GetCurrentUser(Action callback); Task ValidateCurrentUser(Action onSuccess, Action onError = null); } } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs index bfa643fb6..526ce6847 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs @@ -113,27 +113,27 @@ private void Open(PopupViewType popupViewType, Action onClose) OnClose.SafeInvoke(false); OnClose = null; - //Logger.Trace("OpenView: {0}", popupViewType.ToString()); + Logger.Trace("OpenView: {0}", popupViewType.ToString()); var viewNeedsAuthentication = popupViewType == PopupViewType.PublishView; if (viewNeedsAuthentication) { - //Logger.Trace("Validating to open view"); + Logger.Trace("Validating to open view"); Client.ValidateCurrentUser(() => { - //Logger.Trace("User validated opening view"); + Logger.Trace("User validated opening view"); OpenInternal(popupViewType, onClose); shouldCloseOnFinish = true; }, exception => { - //Logger.Trace("User required validation opening AuthenticationView"); + Logger.Error(exception, "User required validation opening AuthenticationView"); authenticationView.Initialize(exception); OpenInternal(PopupViewType.AuthenticationView, completedAuthentication => { if (completedAuthentication) { - //Logger.Trace("User completed validation opening view: {0}", popupViewType.ToString()); + Logger.Trace("User completed validation opening view: {0}", popupViewType.ToString()); Open(popupViewType, onClose); } From 63c72ad4d4568f8db09f88de7e863f1d68fa349f Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 26 Mar 2018 15:01:18 -0400 Subject: [PATCH 04/10] Undoing unintentional changes --- .../Assets/Editor/GitHub.Unity/UI/PopupWindow.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs index 526ce6847..bfa643fb6 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs @@ -113,27 +113,27 @@ private void Open(PopupViewType popupViewType, Action onClose) OnClose.SafeInvoke(false); OnClose = null; - Logger.Trace("OpenView: {0}", popupViewType.ToString()); + //Logger.Trace("OpenView: {0}", popupViewType.ToString()); var viewNeedsAuthentication = popupViewType == PopupViewType.PublishView; if (viewNeedsAuthentication) { - Logger.Trace("Validating to open view"); + //Logger.Trace("Validating to open view"); Client.ValidateCurrentUser(() => { - Logger.Trace("User validated opening view"); + //Logger.Trace("User validated opening view"); OpenInternal(popupViewType, onClose); shouldCloseOnFinish = true; }, exception => { - Logger.Error(exception, "User required validation opening AuthenticationView"); + //Logger.Trace("User required validation opening AuthenticationView"); authenticationView.Initialize(exception); OpenInternal(PopupViewType.AuthenticationView, completedAuthentication => { if (completedAuthentication) { - Logger.Trace("User completed validation opening view: {0}", popupViewType.ToString()); + //Logger.Trace("User completed validation opening view: {0}", popupViewType.ToString()); Open(popupViewType, onClose); } From 57fe7ef9ef0716e74c668094f0efa57c218dd34a Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 26 Mar 2018 15:02:10 -0400 Subject: [PATCH 05/10] Fix mispelling --- src/GitHub.Api/Application/ApiClient.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/GitHub.Api/Application/ApiClient.cs b/src/GitHub.Api/Application/ApiClient.cs index f3cf4eecb..d01b45f9e 100644 --- a/src/GitHub.Api/Application/ApiClient.cs +++ b/src/GitHub.Api/Application/ApiClient.cs @@ -87,7 +87,7 @@ public async Task ValidateCurrentUser(Action onSuccess, Action onErro try { var keychainConnection = keychain.Connections.First(); - var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection); + var keychainAdapter = await GetValidatedKeychainAdapter(keychainConnection); await GetValidatedGitHubUser(keychainConnection, keychainAdapter); onSuccess(); } @@ -201,7 +201,7 @@ private async Task CreateRepositoryInternal(string repositoryN //TODO: ONE_USER_LOGIN This assumes only ever one user can login var keychainConnection = keychain.Connections.First(); - var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection); + var keychainAdapter = await GetValidatedKeychainAdapter(keychainConnection); await GetValidatedGitHubUser(keychainConnection, keychainAdapter); var command = new StringBuilder("publish -r \""); @@ -263,7 +263,7 @@ private async Task GetOrganizationInternal(Action onSuccess, Act //TODO: ONE_USER_LOGIN This assumes only ever one user can login var keychainConnection = keychain.Connections.First(); - var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection); + var keychainAdapter = await GetValidatedKeychainAdapter(keychainConnection); await GetValidatedGitHubUser(keychainConnection, keychainAdapter); var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "organizations", @@ -301,7 +301,7 @@ private async Task GetOrganizationInternal(Action onSuccess, Act } } - private async Task GetValidatedKeychainAdaper(Connection keychainConnection) + private async Task GetValidatedKeychainAdapter(Connection keychainConnection) { if (keychain.HasKeys) { From 9fd0c2d5a04b8d87a3c06cb4474c1579ef459a7a Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 27 Mar 2018 08:22:44 -0400 Subject: [PATCH 06/10] Removing extra log messages --- src/GitHub.Api/Application/ApiClient.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/GitHub.Api/Application/ApiClient.cs b/src/GitHub.Api/Application/ApiClient.cs index d01b45f9e..056eb6d76 100644 --- a/src/GitHub.Api/Application/ApiClient.cs +++ b/src/GitHub.Api/Application/ApiClient.cs @@ -305,27 +305,24 @@ private async Task GetValidatedKeychainAdapter(Connection keyc { if (keychain.HasKeys) { - logger.Trace("LoadKeychainInternal: Loading"); - var keychainAdapter = await keychain.Load(keychainConnection.Host); - logger.Trace("LoadKeychainInternal: Loaded"); if (string.IsNullOrEmpty(keychainAdapter.Credential?.Username)) { - logger.Trace("LoadKeychainInternal: Username is empty"); + logger.Warning("LoadKeychainInternal: Username is empty"); throw new TokenUsernameMismatchException(keychainConnection.Username); } if (keychainAdapter.Credential.Username != keychainConnection.Username) { - logger.Trace("LoadKeychainInternal: Token username does not match"); + logger.Warning("LoadKeychainInternal: Token username does not match"); throw new TokenUsernameMismatchException(keychainConnection.Username, keychainAdapter.Credential.Username); } return keychainAdapter; } - logger.Trace("LoadKeychainInternal: No keys to load"); + logger.Warning("LoadKeychainInternal: No keys to load"); throw new KeychainEmptyException(); } From 492be35bceadc2a53a27671c15dbb09fbd66829d Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 27 Mar 2018 08:29:00 -0400 Subject: [PATCH 07/10] Removing NeedsLoad as it's not used anymore --- src/GitHub.Api/Authentication/IKeychain.cs | 1 - src/GitHub.Api/Authentication/Keychain.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/src/GitHub.Api/Authentication/IKeychain.cs b/src/GitHub.Api/Authentication/IKeychain.cs index dbd067aac..4aa1bcb97 100644 --- a/src/GitHub.Api/Authentication/IKeychain.cs +++ b/src/GitHub.Api/Authentication/IKeychain.cs @@ -16,7 +16,6 @@ public interface IKeychain Connection[] Connections { get; } IList Hosts { get; } bool HasKeys { get; } - bool NeedsLoad { get; } void SetToken(UriString host, string token); event Action ConnectionsChanged; diff --git a/src/GitHub.Api/Authentication/Keychain.cs b/src/GitHub.Api/Authentication/Keychain.cs index 542904020..914749fca 100644 --- a/src/GitHub.Api/Authentication/Keychain.cs +++ b/src/GitHub.Api/Authentication/Keychain.cs @@ -323,6 +323,5 @@ private void UpdateConnections(Connection[] conns) public Connection[] Connections => connections.Values.ToArray(); public IList Hosts => connections.Keys.ToArray(); public bool HasKeys => connections.Any(); - public bool NeedsLoad => HasKeys && !string.IsNullOrEmpty(FindOrCreateAdapter(connections.First().Value.Host).Credential?.Token); } } \ No newline at end of file From 8ccf997e85f652ba8c4d382a857af1a053489a0d Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 27 Mar 2018 10:02:19 -0400 Subject: [PATCH 08/10] Fixing logic error in NeedsLoad Credential might be null and we should be loading if there is no token --- src/GitHub.Api/Authentication/Keychain.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GitHub.Api/Authentication/Keychain.cs b/src/GitHub.Api/Authentication/Keychain.cs index 5e93f488c..69605e747 100644 --- a/src/GitHub.Api/Authentication/Keychain.cs +++ b/src/GitHub.Api/Authentication/Keychain.cs @@ -323,6 +323,6 @@ private void UpdateConnections(Connection[] conns) public Connection[] Connections => connections.Values.ToArray(); public IList Hosts => connections.Keys.ToArray(); public bool HasKeys => connections.Any(); - public bool NeedsLoad => HasKeys && !string.IsNullOrEmpty(FindOrCreateAdapter(connections.First().Value.Host).Credential.Token); + public bool NeedsLoad => HasKeys && string.IsNullOrEmpty(FindOrCreateAdapter(connections.First().Value.Host).Credential?.Token); } } \ No newline at end of file From 6ac6be4b2415eb132f4685ee9e4949fc7e486b84 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 27 Mar 2018 10:03:38 -0400 Subject: [PATCH 09/10] Throwing exception from LoadKeychainInternal - LoadKeychainInternal is only called from ValidateKeychain - ValidateKeychain should throw a TokenUsernameMismatchException if it can see the user does not match --- src/GitHub.Api/Application/ApiClient.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/GitHub.Api/Application/ApiClient.cs b/src/GitHub.Api/Application/ApiClient.cs index 10a01e0f3..21b047ea1 100644 --- a/src/GitHub.Api/Application/ApiClient.cs +++ b/src/GitHub.Api/Application/ApiClient.cs @@ -379,12 +379,19 @@ private async Task LoadKeychainInternal() logger.Trace("LoadKeychainInternal: Loading"); //TODO: ONE_USER_LOGIN This assumes only ever one user can login - var uriString = keychain.Connections.First().Host; + var connection = keychain.Connections.First(); + var uriString = connection.Host; var keychainAdapter = await keychain.Load(uriString); logger.Trace("LoadKeychainInternal: Loaded"); - return keychainAdapter.Credential.Token != null; + var keychainUsername = keychainAdapter.Credential?.Username; + if (keychainUsername == null || connection.Username != keychainUsername) + { + throw new TokenUsernameMismatchException(connection.Username, keychainUsername); + } + + return keychainAdapter.Credential?.Token != null; } logger.Trace("LoadKeychainInternal: No keys to load"); From 60da5eceaa8d96026e9d0b09b7a0f61d292469a4 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Tue, 27 Mar 2018 10:44:12 -0400 Subject: [PATCH 10/10] Restoring method GetCurrentUser --- src/GitHub.Api/Application/ApiClient.cs | 12 ++++++++++++ src/GitHub.Api/Application/IApiClient.cs | 1 + 2 files changed, 13 insertions(+) diff --git a/src/GitHub.Api/Application/ApiClient.cs b/src/GitHub.Api/Application/ApiClient.cs index 056eb6d76..ab1f71aca 100644 --- a/src/GitHub.Api/Application/ApiClient.cs +++ b/src/GitHub.Api/Application/ApiClient.cs @@ -97,6 +97,18 @@ public async Task ValidateCurrentUser(Action onSuccess, Action onErro } } + public async Task GetCurrentUser(Action callback) + { + Guard.ArgumentNotNull(callback, "callback"); + + //TODO: ONE_USER_LOGIN This assumes only ever one user can login + var keychainConnection = keychain.Connections.First(); + var keychainAdapter = await GetValidatedKeychainAdapter(keychainConnection); + var user = await GetValidatedGitHubUser(keychainConnection, keychainAdapter); + + callback(user); + } + public async Task Login(string username, string password, Action need2faCode, Action result) { Guard.ArgumentNotNull(need2faCode, "need2faCode"); diff --git a/src/GitHub.Api/Application/IApiClient.cs b/src/GitHub.Api/Application/IApiClient.cs index 135923836..438e9bbf5 100644 --- a/src/GitHub.Api/Application/IApiClient.cs +++ b/src/GitHub.Api/Application/IApiClient.cs @@ -14,6 +14,7 @@ Task CreateRepository(string name, string description, bool isPrivate, Task ContinueLogin(LoginResult loginResult, string code); Task LoginAsync(string username, string password, Func need2faCode); Task Logout(UriString host); + Task GetCurrentUser(Action callback); Task ValidateCurrentUser(Action onSuccess, Action onError = null); } }