@@ -86,7 +86,9 @@ public async Task ValidateCurrentUser(Action onSuccess, Action<Exception> onErro
86
86
Guard . ArgumentNotNull ( onSuccess , nameof ( onSuccess ) ) ;
87
87
try
88
88
{
89
- await ValidateCurrentUserInternal ( ) ;
89
+ var keychainConnection = keychain . Connections . First ( ) ;
90
+ var keychainAdapter = await GetValidatedKeychainAdaper ( keychainConnection ) ;
91
+ await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
90
92
onSuccess ( ) ;
91
93
}
92
94
catch ( Exception e )
@@ -95,13 +97,6 @@ public async Task ValidateCurrentUser(Action onSuccess, Action<Exception> onErro
95
97
}
96
98
}
97
99
98
- public async Task GetCurrentUser ( Action < GitHubUser > callback )
99
- {
100
- Guard . ArgumentNotNull ( callback , "callback" ) ;
101
- var user = await GetCurrentUserInternal ( ) ;
102
- callback ( user ) ;
103
- }
104
-
105
100
public async Task Login ( string username , string password , Action < LoginResult > need2faCode , Action < bool , string > result )
106
101
{
107
102
Guard . ArgumentNotNull ( need2faCode , "need2faCode" ) ;
@@ -204,11 +199,10 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
204
199
{
205
200
logger . Trace ( "Creating repository" ) ;
206
201
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 ) ;
212
206
213
207
var command = new StringBuilder ( "publish -r \" " ) ;
214
208
command . Append ( repositoryName ) ;
@@ -233,7 +227,7 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
233
227
command . Append ( " -p" ) ;
234
228
}
235
229
236
- var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , command . ToString ( ) ,
230
+ var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , command . ToString ( ) ,
237
231
user : keychainAdapter . Credential . Username , userToken : keychainAdapter . Credential . Token )
238
232
. Configure ( processManager ) ;
239
233
@@ -267,11 +261,10 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
267
261
{
268
262
logger . Trace ( "Getting Organizations" ) ;
269
263
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 ) ;
275
268
276
269
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "organizations" ,
277
270
user : keychainAdapter . Credential . Username , userToken : keychainAdapter . Credential . Token )
@@ -308,27 +301,57 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
308
301
}
309
302
}
310
303
311
- private async Task < GitHubUser > GetCurrentUserInternal ( )
304
+ private async Task < IKeychainAdapter > GetValidatedKeychainAdaper ( Connection keychainConnection )
312
305
{
313
- try
306
+ if ( keychain . HasKeys )
314
307
{
315
- logger . Trace ( "Getting Current User" ) ;
316
- await ValidateKeychain ( ) ;
308
+ logger . Trace ( "LoadKeychainInternal: Loading" ) ;
317
309
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
+ }
320
324
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
+ {
321
336
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 )
323
338
. Configure ( processManager ) ;
324
339
325
340
var ret = await octorunTask . StartAsAsync ( ) ;
326
341
if ( ret . IsSuccess )
327
342
{
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
+
328
351
return new GitHubUser
329
352
{
330
353
Name = ret . Output [ 0 ] ,
331
- Login = ret . Output [ 1 ]
354
+ Login = login
332
355
} ;
333
356
}
334
357
@@ -350,55 +373,6 @@ private async Task<GitHubUser> GetCurrentUserInternal()
350
373
throw ;
351
374
}
352
375
}
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
- }
402
376
}
403
377
404
378
class GitHubUser
@@ -435,7 +409,7 @@ class TokenUsernameMismatchException : ApiClientException
435
409
public string CachedUsername { get ; }
436
410
public string CurrentUsername { get ; }
437
411
438
- public TokenUsernameMismatchException ( string cachedUsername , string currentUsername )
412
+ public TokenUsernameMismatchException ( string cachedUsername , string currentUsername = null )
439
413
{
440
414
CachedUsername = cachedUsername ;
441
415
CurrentUsername = currentUsername ;
@@ -448,12 +422,8 @@ protected TokenUsernameMismatchException(SerializationInfo info, StreamingContex
448
422
class KeychainEmptyException : ApiClientException
449
423
{
450
424
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
+ }
457
427
458
428
protected KeychainEmptyException ( SerializationInfo info , StreamingContext context ) : base ( info , context )
459
429
{ }
0 commit comments