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

Commit 9d86313

Browse files
Loading the Keychain before it gets used in the api
1 parent 3fdec18 commit 9d86313

File tree

5 files changed

+44
-60
lines changed

5 files changed

+44
-60
lines changed

src/GitHub.Api/Application/ApiClient.cs

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public static IApiClient Create(UriString repositoryUrl, IKeychain keychain)
2929
private readonly ILoginManager loginManager;
3030
private static readonly SemaphoreSlim sem = new SemaphoreSlim(1);
3131

32-
Octokit.Repository repositoryCache = new Octokit.Repository();
3332
IList<Organization> organizationsCache;
3433
Octokit.User userCache;
3534

@@ -49,13 +48,6 @@ public ApiClient(UriString hostUrl, IKeychain keychain, IGitHubClient githubClie
4948
loginManager = new LoginManager(keychain, ApplicationInfo.ClientId, ApplicationInfo.ClientSecret);
5049
}
5150

52-
public async Task GetRepository(Action<Octokit.Repository> callback)
53-
{
54-
Guard.ArgumentNotNull(callback, "callback");
55-
var repo = await GetRepositoryInternal();
56-
callback(repo);
57-
}
58-
5951
public async Task Logout(UriString host)
6052
{
6153
await LogoutInternal(host);
@@ -182,45 +174,18 @@ public async Task<bool> ContinueLoginAsync(LoginResult loginResult, Func<LoginRe
182174
return result.Code == LoginResultCodes.Success;
183175
}
184176

185-
private async Task<Octokit.Repository> GetRepositoryInternal()
177+
private async Task CreateRepositoryInternal(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization)
186178
{
187179
try
188180
{
189-
if (owner == null)
181+
logger.Trace("Creating repository");
182+
183+
if (!await EnsureKeychainLoaded())
190184
{
191-
var ownerLogin = OriginalUrl.Owner;
192-
var repositoryName = OriginalUrl.RepositoryName;
193-
194-
if (ownerLogin != null && repositoryName != null)
195-
{
196-
var repo = await githubClient.Repository.Get(ownerLogin, repositoryName);
197-
if (repo != null)
198-
{
199-
repositoryCache = repo;
200-
}
201-
owner = ownerLogin;
202-
}
185+
callback(null, new Exception("Keychain Not Loaded"));
186+
return;
203187
}
204-
}
205-
// it'll throw if it's private or an enterprise instance requiring authentication
206-
catch (ApiException apiex)
207-
{
208-
if (!HostAddress.IsGitHubDotCom(OriginalUrl.ToRepositoryUri()))
209-
isEnterprise = apiex.IsGitHubApiException();
210-
}
211-
catch {}
212-
finally
213-
{
214-
sem.Release();
215-
}
216188

217-
return repositoryCache;
218-
}
219-
220-
private async Task CreateRepositoryInternal(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization)
221-
{
222-
try
223-
{
224189
Octokit.Repository repository;
225190
if (!string.IsNullOrEmpty(organization))
226191
{
@@ -252,6 +217,11 @@ private async Task<IList<Organization>> GetOrganizationInternal()
252217
{
253218
logger.Trace("Getting Organizations");
254219

220+
if (!await EnsureKeychainLoaded())
221+
{
222+
return null;
223+
}
224+
255225
var organizations = await githubClient.Organization.GetAllForCurrent();
256226

257227
logger.Trace("Obtained {0} Organizations", organizations?.Count.ToString() ?? "NULL");
@@ -276,6 +246,11 @@ private async Task<IList<Organization>> GetOrganizationInternal()
276246
{
277247
logger.Trace("Getting Organizations");
278248

249+
if (!await EnsureKeychainLoaded())
250+
{
251+
return null;
252+
}
253+
279254
userCache = await githubClient.User.Current();
280255
}
281256
catch(Exception ex)
@@ -287,6 +262,31 @@ private async Task<IList<Organization>> GetOrganizationInternal()
287262
return userCache;
288263
}
289264

265+
private async Task<bool> EnsureKeychainLoaded()
266+
{
267+
logger.Trace("EnsureKeychainLoaded");
268+
269+
if (keychain.HasKeys)
270+
{
271+
if (!keychain.NeedsLoad)
272+
{
273+
logger.Trace("EnsureKeychainLoaded: Has keys does not need load");
274+
return true;
275+
}
276+
277+
logger.Trace("EnsureKeychainLoaded: Loading");
278+
279+
var uriString = keychain.Connections.First().Host;
280+
var keychainAdapter = await keychain.Load(uriString);
281+
282+
return keychainAdapter.OctokitCredentials != Credentials.Anonymous;
283+
}
284+
285+
logger.Trace("EnsureKeychainLoaded: No keys to load");
286+
287+
return false;
288+
}
289+
290290
public async Task<bool> ValidateCredentials()
291291
{
292292
try

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ public virtual async Task Run(bool firstRun)
6969

7070
RestartRepository();
7171
InitializeUI();
72-
73-
new ActionTask(new Task(() => LoadKeychain().Start())).Start();
7472
}
7573

7674
public ITask InitializeRepository()
@@ -125,22 +123,6 @@ public void RestartRepository()
125123
}
126124
}
127125

128-
private async Task LoadKeychain()
129-
{
130-
Logger.Trace("Loading Keychain");
131-
132-
var firstConnection = Platform.Keychain.Hosts.FirstOrDefault();
133-
if (firstConnection == null)
134-
{
135-
Logger.Trace("No Host Found");
136-
}
137-
else
138-
{
139-
Logger.Trace("Loading Connection to Host:\"{0}\"", firstConnection);
140-
await Platform.Keychain.Load(firstConnection).SafeAwait();
141-
}
142-
}
143-
144126
private async Task<NPath> DetermineGitExecutablePath(ProgressReport progress = null)
145127
{
146128
var gitExecutablePath = SystemSettings.Get(Constants.GitInstallPathKey)?.ToNPath();

src/GitHub.Api/Application/IApiClient.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ interface IApiClient
99
{
1010
HostAddress HostAddress { get; }
1111
UriString OriginalUrl { get; }
12-
Task GetRepository(Action<Octokit.Repository> callback);
1312
Task CreateRepository(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization = null);
1413
Task GetOrganizations(Action<IList<Organization>> callback);
1514
Task Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result);

src/GitHub.Api/Authentication/IKeychain.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ interface IKeychain
1515
Connection[] Connections { get; }
1616
IList<UriString> Hosts { get; }
1717
bool HasKeys { get; }
18+
bool NeedsLoad { get; }
1819
void SetToken(UriString host, string token);
1920
}
2021
}

src/GitHub.Api/Authentication/Keychain.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,5 +230,7 @@ public void UpdateToken(UriString host, string token)
230230
public IList<UriString> Hosts => connectionCache.Keys.ToArray();
231231

232232
public bool HasKeys => connectionCache.Any();
233+
234+
public bool NeedsLoad => HasKeys && FindOrCreateAdapter(connectionCache.First().Value.Host).OctokitCredentials == Credentials.Anonymous;
233235
}
234236
}

0 commit comments

Comments
 (0)