Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit e0e12ba

Browse files
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`
1 parent ffea813 commit e0e12ba

File tree

3 files changed

+58
-89
lines changed

3 files changed

+58
-89
lines changed

src/GitHub.Api/Application/ApiClient.cs

Lines changed: 53 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ public async Task ValidateCurrentUser(Action onSuccess, Action<Exception> onErro
8686
Guard.ArgumentNotNull(onSuccess, nameof(onSuccess));
8787
try
8888
{
89-
await ValidateCurrentUserInternal();
89+
var keychainConnection = keychain.Connections.First();
90+
var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection);
91+
await GetValidatedGitHubUser(keychainConnection, keychainAdapter);
9092
onSuccess();
9193
}
9294
catch (Exception e)
@@ -95,13 +97,6 @@ public async Task ValidateCurrentUser(Action onSuccess, Action<Exception> onErro
9597
}
9698
}
9799

98-
public async Task GetCurrentUser(Action<GitHubUser> callback)
99-
{
100-
Guard.ArgumentNotNull(callback, "callback");
101-
var user = await GetCurrentUserInternal();
102-
callback(user);
103-
}
104-
105100
public async Task Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result)
106101
{
107102
Guard.ArgumentNotNull(need2faCode, "need2faCode");
@@ -204,11 +199,10 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
204199
{
205200
logger.Trace("Creating repository");
206201

207-
await ValidateKeychain();
208-
await ValidateCurrentUserInternal();
209-
210-
var uriString = keychain.Connections.First().Host;
211-
var keychainAdapter = await keychain.Load(uriString);
202+
//TODO: ONE_USER_LOGIN This assumes only ever one user can login
203+
var keychainConnection = keychain.Connections.First();
204+
var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection);
205+
await GetValidatedGitHubUser(keychainConnection, keychainAdapter);
212206

213207
var command = new StringBuilder("publish -r \"");
214208
command.Append(repositoryName);
@@ -233,7 +227,7 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
233227
command.Append(" -p");
234228
}
235229

236-
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, command.ToString(),
230+
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, command.ToString(),
237231
user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token)
238232
.Configure(processManager);
239233

@@ -267,11 +261,10 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
267261
{
268262
logger.Trace("Getting Organizations");
269263

270-
await ValidateKeychain();
271-
await ValidateCurrentUserInternal();
272-
273-
var uriString = keychain.Connections.First().Host;
274-
var keychainAdapter = await keychain.Load(uriString);
264+
//TODO: ONE_USER_LOGIN This assumes only ever one user can login
265+
var keychainConnection = keychain.Connections.First();
266+
var keychainAdapter = await GetValidatedKeychainAdaper(keychainConnection);
267+
await GetValidatedGitHubUser(keychainConnection, keychainAdapter);
275268

276269
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "organizations",
277270
user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token)
@@ -308,27 +301,57 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
308301
}
309302
}
310303

311-
private async Task<GitHubUser> GetCurrentUserInternal()
304+
private async Task<IKeychainAdapter> GetValidatedKeychainAdaper(Connection keychainConnection)
312305
{
313-
try
306+
if (keychain.HasKeys)
314307
{
315-
logger.Trace("Getting Current User");
316-
await ValidateKeychain();
308+
logger.Trace("LoadKeychainInternal: Loading");
317309

318-
var uriString = keychain.Connections.First().Host;
319-
var keychainAdapter = await keychain.Load(uriString);
310+
var keychainAdapter = await keychain.Load(keychainConnection.Host);
311+
logger.Trace("LoadKeychainInternal: Loaded");
312+
313+
if (string.IsNullOrEmpty(keychainAdapter.Credential?.Username))
314+
{
315+
logger.Trace("LoadKeychainInternal: Username is empty");
316+
throw new TokenUsernameMismatchException(keychainConnection.Username);
317+
}
318+
319+
if (keychainAdapter.Credential.Username != keychainConnection.Username)
320+
{
321+
logger.Trace("LoadKeychainInternal: Token username does not match");
322+
throw new TokenUsernameMismatchException(keychainConnection.Username, keychainAdapter.Credential.Username);
323+
}
320324

325+
return keychainAdapter;
326+
}
327+
328+
logger.Trace("LoadKeychainInternal: No keys to load");
329+
throw new KeychainEmptyException();
330+
}
331+
332+
private async Task<GitHubUser> GetValidatedGitHubUser(Connection keychainConnection, IKeychainAdapter keychainAdapter)
333+
{
334+
try
335+
{
321336
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "validate",
322-
user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token)
337+
user: keychainAdapter.Credential.Username, userToken: keychainAdapter.Credential.Token)
323338
.Configure(processManager);
324339

325340
var ret = await octorunTask.StartAsAsync();
326341
if (ret.IsSuccess)
327342
{
343+
var login = ret.Output[1];
344+
345+
if (login != keychainConnection.Username)
346+
{
347+
logger.Trace("LoadKeychainInternal: Api username does not match");
348+
throw new TokenUsernameMismatchException(keychainConnection.Username, login);
349+
}
350+
328351
return new GitHubUser
329352
{
330353
Name = ret.Output[0],
331-
Login = ret.Output[1]
354+
Login = login
332355
};
333356
}
334357

@@ -350,55 +373,6 @@ private async Task<GitHubUser> GetCurrentUserInternal()
350373
throw;
351374
}
352375
}
353-
354-
private async Task ValidateCurrentUserInternal()
355-
{
356-
logger.Trace("Validating User");
357-
358-
var apiUser = await GetCurrentUserInternal();
359-
var apiUsername = apiUser.Login;
360-
361-
var cachedUsername = keychain.Connections.First().Username;
362-
363-
if (apiUsername != cachedUsername)
364-
{
365-
throw new TokenUsernameMismatchException(cachedUsername, apiUsername);
366-
}
367-
}
368-
369-
private async Task<bool> LoadKeychainInternal()
370-
{
371-
if (keychain.HasKeys)
372-
{
373-
if (!keychain.NeedsLoad)
374-
{
375-
logger.Trace("LoadKeychainInternal: Previously Loaded");
376-
return true;
377-
}
378-
379-
logger.Trace("LoadKeychainInternal: Loading");
380-
381-
//TODO: ONE_USER_LOGIN This assumes only ever one user can login
382-
var uriString = keychain.Connections.First().Host;
383-
384-
var keychainAdapter = await keychain.Load(uriString);
385-
logger.Trace("LoadKeychainInternal: Loaded");
386-
387-
return keychainAdapter.Credential.Token != null;
388-
}
389-
390-
logger.Trace("LoadKeychainInternal: No keys to load");
391-
392-
return false;
393-
}
394-
395-
private async Task ValidateKeychain()
396-
{
397-
if (!await LoadKeychainInternal())
398-
{
399-
throw new KeychainEmptyException();
400-
}
401-
}
402376
}
403377

404378
class GitHubUser
@@ -435,7 +409,7 @@ class TokenUsernameMismatchException : ApiClientException
435409
public string CachedUsername { get; }
436410
public string CurrentUsername { get; }
437411

438-
public TokenUsernameMismatchException(string cachedUsername, string currentUsername)
412+
public TokenUsernameMismatchException(string cachedUsername, string currentUsername = null)
439413
{
440414
CachedUsername = cachedUsername;
441415
CurrentUsername = currentUsername;
@@ -448,12 +422,8 @@ protected TokenUsernameMismatchException(SerializationInfo info, StreamingContex
448422
class KeychainEmptyException : ApiClientException
449423
{
450424
public KeychainEmptyException()
451-
{ }
452-
public KeychainEmptyException(string message) : base(message)
453-
{ }
454-
455-
public KeychainEmptyException(string message, Exception innerException) : base(message, innerException)
456-
{ }
425+
{
426+
}
457427

458428
protected KeychainEmptyException(SerializationInfo info, StreamingContext context) : base(info, context)
459429
{ }

src/GitHub.Api/Application/IApiClient.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ Task CreateRepository(string name, string description, bool isPrivate,
1414
Task ContinueLogin(LoginResult loginResult, string code);
1515
Task<bool> LoginAsync(string username, string password, Func<LoginResult, string> need2faCode);
1616
Task Logout(UriString host);
17-
Task GetCurrentUser(Action<GitHubUser> callback);
1817
Task ValidateCurrentUser(Action onSuccess, Action<Exception> onError = null);
1918
}
2019
}

src/UnityExtension/Assets/Editor/GitHub.Unity/UI/PopupWindow.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,27 +113,27 @@ private void Open(PopupViewType popupViewType, Action<bool> onClose)
113113
OnClose.SafeInvoke(false);
114114
OnClose = null;
115115

116-
//Logger.Trace("OpenView: {0}", popupViewType.ToString());
116+
Logger.Trace("OpenView: {0}", popupViewType.ToString());
117117

118118
var viewNeedsAuthentication = popupViewType == PopupViewType.PublishView;
119119
if (viewNeedsAuthentication)
120120
{
121-
//Logger.Trace("Validating to open view");
121+
Logger.Trace("Validating to open view");
122122

123123
Client.ValidateCurrentUser(() => {
124124

125-
//Logger.Trace("User validated opening view");
125+
Logger.Trace("User validated opening view");
126126

127127
OpenInternal(popupViewType, onClose);
128128
shouldCloseOnFinish = true;
129129

130130
}, exception => {
131-
//Logger.Trace("User required validation opening AuthenticationView");
131+
Logger.Error(exception, "User required validation opening AuthenticationView");
132132
authenticationView.Initialize(exception);
133133
OpenInternal(PopupViewType.AuthenticationView, completedAuthentication => {
134134
if (completedAuthentication)
135135
{
136-
//Logger.Trace("User completed validation opening view: {0}", popupViewType.ToString());
136+
Logger.Trace("User completed validation opening view: {0}", popupViewType.ToString());
137137

138138
Open(popupViewType, onClose);
139139
}

0 commit comments

Comments
 (0)