@@ -10,17 +10,6 @@ namespace GitHub.Unity
10
10
{
11
11
class ApiClient : IApiClient
12
12
{
13
- public static IApiClient Create ( UriString repositoryUrl , IKeychain keychain , IProcessManager processManager , ITaskManager taskManager , NPath nodeJsExecutablePath , NPath octorunScriptPath )
14
- {
15
- logger . Trace ( "Creating ApiClient: {0}" , repositoryUrl ) ;
16
-
17
- var credentialStore = keychain . Connect ( repositoryUrl ) ;
18
- var hostAddress = HostAddress . Create ( repositoryUrl ) ;
19
-
20
- return new ApiClient ( repositoryUrl , keychain ,
21
- processManager , taskManager , nodeJsExecutablePath , octorunScriptPath ) ;
22
- }
23
-
24
13
private static readonly ILogging logger = LogHelper . GetLogger < ApiClient > ( ) ;
25
14
public HostAddress HostAddress { get ; }
26
15
public UriString OriginalUrl { get ; }
@@ -81,34 +70,20 @@ public async Task GetOrganizations(Action<Organization[]> onSuccess, Action<Exce
81
70
await GetOrganizationInternal ( onSuccess , onError ) ;
82
71
}
83
72
84
- public async Task ValidateCurrentUser ( Action onSuccess , Action < Exception > onError = null )
73
+ public async Task GetCurrentUser ( Action < GitHubUser > onSuccess , Action < Exception > onError = null )
85
74
{
86
75
Guard . ArgumentNotNull ( onSuccess , nameof ( onSuccess ) ) ;
87
76
try
88
77
{
89
- var keychainConnection = keychain . Connections . First ( ) ;
90
- var keychainAdapter = await GetValidatedKeychainAdapter ( keychainConnection ) ;
91
- await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
92
- onSuccess ( ) ;
78
+ var user = await GetCurrentUser ( ) ;
79
+ onSuccess ( user ) ;
93
80
}
94
81
catch ( Exception e )
95
82
{
96
83
onError ? . Invoke ( e ) ;
97
84
}
98
85
}
99
86
100
- public async Task GetCurrentUser ( Action < GitHubUser > callback )
101
- {
102
- Guard . ArgumentNotNull ( callback , "callback" ) ;
103
-
104
- //TODO: ONE_USER_LOGIN This assumes only ever one user can login
105
- var keychainConnection = keychain . Connections . First ( ) ;
106
- var keychainAdapter = await GetValidatedKeychainAdapter ( keychainConnection ) ;
107
- var user = await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
108
-
109
- callback ( user ) ;
110
- }
111
-
112
87
public async Task Login ( string username , string password , Action < LoginResult > need2faCode , Action < bool , string > result )
113
88
{
114
89
Guard . ArgumentNotNull ( need2faCode , "need2faCode" ) ;
@@ -205,16 +180,33 @@ public async Task<bool> ContinueLoginAsync(LoginResult loginResult, Func<LoginRe
205
180
return result . Code == LoginResultCodes . Success ;
206
181
}
207
182
183
+ private async Task < GitHubUser > GetCurrentUser ( )
184
+ {
185
+ //TODO: ONE_USER_LOGIN This assumes we only support one login
186
+ var keychainConnection = keychain . Connections . FirstOrDefault ( ) ;
187
+ if ( keychainConnection == null )
188
+ throw new KeychainEmptyException ( ) ;
189
+
190
+ var keychainAdapter = await GetValidatedKeychainAdapter ( keychainConnection ) ;
191
+
192
+ // we can't trust that the system keychain has the username filled out correctly.
193
+ // if it doesn't, we need to grab the username from the server and check it
194
+ // unfortunately this means that things will be slower when the keychain doesn't have all the info
195
+ if ( keychainConnection . User == null || keychainAdapter . Credential . Username != keychainConnection . Username )
196
+ {
197
+ keychainConnection . User = await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
198
+ }
199
+ return keychainConnection . User ;
200
+ }
201
+
208
202
private async Task < GitHubRepository > CreateRepositoryInternal ( string repositoryName , string organization , string description , bool isPrivate )
209
203
{
210
204
try
211
205
{
212
206
logger . Trace ( "Creating repository" ) ;
213
207
214
- //TODO: ONE_USER_LOGIN This assumes only ever one user can login
215
- var keychainConnection = keychain . Connections . First ( ) ;
216
- var keychainAdapter = await GetValidatedKeychainAdapter ( keychainConnection ) ;
217
- await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
208
+ var user = await GetCurrentUser ( ) ;
209
+ var keychainAdapter = keychain . Connect ( OriginalUrl ) ;
218
210
219
211
var command = new StringBuilder ( "publish -r \" " ) ;
220
212
command . Append ( repositoryName ) ;
@@ -240,7 +232,7 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
240
232
}
241
233
242
234
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , command . ToString ( ) ,
243
- user : keychainAdapter . Credential . Username , userToken : keychainAdapter . Credential . Token )
235
+ user : user . Login , userToken : keychainAdapter . Credential . Token )
244
236
. Configure ( processManager ) ;
245
237
246
238
var ret = await octorunTask . StartAwait ( ) ;
@@ -273,13 +265,11 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
273
265
{
274
266
logger . Trace ( "Getting Organizations" ) ;
275
267
276
- //TODO: ONE_USER_LOGIN This assumes only ever one user can login
277
- var keychainConnection = keychain . Connections . First ( ) ;
278
- var keychainAdapter = await GetValidatedKeychainAdapter ( keychainConnection ) ;
279
- await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
268
+ var user = await GetCurrentUser ( ) ;
269
+ var keychainAdapter = keychain . Connect ( OriginalUrl ) ;
280
270
281
271
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "organizations" ,
282
- user : keychainAdapter . Credential . Username , userToken : keychainAdapter . Credential . Token )
272
+ user : user . Login , userToken : keychainAdapter . Credential . Token )
283
273
. Configure ( processManager ) ;
284
274
285
275
var ret = await octorunTask . StartAsAsync ( ) ;
@@ -315,35 +305,30 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
315
305
316
306
private async Task < IKeychainAdapter > GetValidatedKeychainAdapter ( Connection keychainConnection )
317
307
{
318
- if ( keychain . HasKeys )
319
- {
320
- var keychainAdapter = await keychain . Load ( keychainConnection . Host ) ;
321
-
322
- if ( string . IsNullOrEmpty ( keychainAdapter . Credential ? . Username ) )
323
- {
324
- logger . Warning ( "LoadKeychainInternal: Username is empty" ) ;
325
- throw new TokenUsernameMismatchException ( keychainConnection . Username ) ;
326
- }
308
+ var keychainAdapter = await keychain . Load ( keychainConnection . Host ) ;
309
+ if ( keychainAdapter == null )
310
+ throw new KeychainEmptyException ( ) ;
327
311
328
- if ( keychainAdapter . Credential . Username != keychainConnection . Username )
329
- {
330
- logger . Warning ( "LoadKeychainInternal: Token username does not match " ) ;
331
- throw new TokenUsernameMismatchException ( keychainConnection . Username , keychainAdapter . Credential . Username ) ;
332
- }
312
+ if ( string . IsNullOrEmpty ( keychainAdapter . Credential ? . Username ) )
313
+ {
314
+ logger . Warning ( "LoadKeychainInternal: Username is empty " ) ;
315
+ throw new TokenUsernameMismatchException ( keychainConnection . Username ) ;
316
+ }
333
317
334
- return keychainAdapter ;
318
+ if ( keychainAdapter . Credential . Username != keychainConnection . Username )
319
+ {
320
+ logger . Warning ( "LoadKeychainInternal: Token username does not match" ) ;
335
321
}
336
322
337
- logger . Warning ( "LoadKeychainInternal: No keys to load" ) ;
338
- throw new KeychainEmptyException ( ) ;
323
+ return keychainAdapter ;
339
324
}
340
325
341
326
private async Task < GitHubUser > GetValidatedGitHubUser ( Connection keychainConnection , IKeychainAdapter keychainAdapter )
342
327
{
343
328
try
344
329
{
345
330
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "validate" ,
346
- user : keychainAdapter . Credential . Username , userToken : keychainAdapter . Credential . Token )
331
+ user : keychainConnection . Username , userToken : keychainAdapter . Credential . Token )
347
332
. Configure ( processManager ) ;
348
333
349
334
var ret = await octorunTask . StartAsAsync ( ) ;
0 commit comments