@@ -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 ( ) ;
@@ -268,13 +260,11 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
268
260
{
269
261
logger . Trace ( "Getting Organizations" ) ;
270
262
271
- //TODO: ONE_USER_LOGIN This assumes only ever one user can login
272
- var keychainConnection = keychain . Connections . First ( ) ;
273
- var keychainAdapter = await GetValidatedKeychainAdapter ( keychainConnection ) ;
274
- await GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
263
+ var user = await GetCurrentUser ( ) ;
264
+ var keychainAdapter = keychain . Connect ( OriginalUrl ) ;
275
265
276
266
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "organizations" ,
277
- user : keychainAdapter . Credential . Username , userToken : keychainAdapter . Credential . Token )
267
+ user : user . Login , userToken : keychainAdapter . Credential . Token )
278
268
. Configure ( processManager ) ;
279
269
280
270
var ret = await octorunTask . StartAsAsync ( ) ;
@@ -305,35 +295,30 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
305
295
306
296
private async Task < IKeychainAdapter > GetValidatedKeychainAdapter ( Connection keychainConnection )
307
297
{
308
- if ( keychain . HasKeys )
309
- {
310
- var keychainAdapter = await keychain . Load ( keychainConnection . Host ) ;
311
-
312
- if ( string . IsNullOrEmpty ( keychainAdapter . Credential ? . Username ) )
313
- {
314
- logger . Warning ( "LoadKeychainInternal: Username is empty" ) ;
315
- throw new TokenUsernameMismatchException ( keychainConnection . Username ) ;
316
- }
298
+ var keychainAdapter = await keychain . Load ( keychainConnection . Host ) ;
299
+ if ( keychainAdapter == null )
300
+ throw new KeychainEmptyException ( ) ;
317
301
318
- if ( keychainAdapter . Credential . Username != keychainConnection . Username )
319
- {
320
- logger . Warning ( "LoadKeychainInternal: Token username does not match " ) ;
321
- throw new TokenUsernameMismatchException ( keychainConnection . Username , keychainAdapter . Credential . Username ) ;
322
- }
302
+ if ( string . IsNullOrEmpty ( keychainAdapter . Credential ? . Username ) )
303
+ {
304
+ logger . Warning ( "LoadKeychainInternal: Username is empty " ) ;
305
+ throw new TokenUsernameMismatchException ( keychainConnection . Username ) ;
306
+ }
323
307
324
- return keychainAdapter ;
308
+ if ( keychainAdapter . Credential . Username != keychainConnection . Username )
309
+ {
310
+ logger . Warning ( "LoadKeychainInternal: Token username does not match" ) ;
325
311
}
326
312
327
- logger . Warning ( "LoadKeychainInternal: No keys to load" ) ;
328
- throw new KeychainEmptyException ( ) ;
313
+ return keychainAdapter ;
329
314
}
330
315
331
316
private async Task < GitHubUser > GetValidatedGitHubUser ( Connection keychainConnection , IKeychainAdapter keychainAdapter )
332
317
{
333
318
try
334
319
{
335
320
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "validate" ,
336
- user : keychainAdapter . Credential . Username , userToken : keychainAdapter . Credential . Token )
321
+ user : keychainConnection . Username , userToken : keychainAdapter . Credential . Token )
337
322
. Configure ( processManager ) ;
338
323
339
324
var ret = await octorunTask . StartAsAsync ( ) ;
0 commit comments