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

Commit 60f8233

Browse files
Merge pull request #873 from github-for-unity/fix-authentication-again
Fix authentication again
2 parents 8cd7062 + b0ee14e commit 60f8233

37 files changed

+185
-220
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,5 @@ _NCrunch_GitHub.Unity
77
.DS_Store
88
build/
99
TestResult.xml
10-
submodules/
1110
*.stackdump
1211
*.lastcodeanalysissucceeded

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
[submodule "script"]
22
path = script
33
url = git@github.com:github-for-unity/UnityBuildScripts
4+
[submodule "submodules/packaging"]
5+
path = submodules/packaging
6+
url = https://github.com/github-for-unity/packaging

create-octorun-zip.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh -eu
2+
DIR=$(pwd)
3+
submodules/packaging/octorun/run.sh --path $DIR/octorun --out $DIR/src/GitHub.Api/Resources

octorun/src/api.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ function ApiWrapper() {
66
throw "appName missing";
77
}
88

9-
if (!config.user || !config.token) {
10-
throw "user and/or token missing";
9+
if (!config.token) {
10+
throw "token missing";
1111
}
1212

1313
this.octokit = octokitWrapper.createOctokit(config.appName);

octorun/src/authentication.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
var endOfLine = require('os').EOL;
21
var config = require("./configuration");
32
var octokitWrapper = require("./octokit");
43

octorun/src/bin/app-login.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var commander = require("commander");
22
var package = require('../../package.json');
33
var authentication = require('../authentication');
4-
var endOfLine = require('os').EOL;
54
var output = require('../output');
65

76
commander

octorun/src/bin/app-organizations.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var commander = require("commander");
22
var package = require('../../package.json');
33
var ApiWrapper = require('../api');
4-
var endOfLine = require('os').EOL;
54
var output = require('../output');
65

76
commander

octorun/src/bin/app-publish.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var commander = require("commander");
22
var package = require('../../package.json')
33
var ApiWrapper = require('../api')
4-
var endOfLine = require('os').EOL;
54
var output = require('../output');
65

76
commander

octorun/src/bin/app-usage.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
var commander = require("commander");
2-
var package = require('../../package.json')
3-
var config = require("../configuration");
4-
var endOfLine = require('os').EOL;
1+
var commander = require('commander');
2+
var package = require('../../package.json');
3+
var config = require('../configuration');
54
var fs = require('fs');
6-
var util = require('util');
75
var output = require('../output');
86

97
commander

octorun/src/bin/app-validate.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
var commander = require("commander");
22
var package = require('../../package.json');
3-
var endOfLine = require('os').EOL;
43
var ApiWrapper = require('../api');
54
var output = require('../output');
65

octorun/src/configuration.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ require("dotenv").config({silent: true});
33
var clientId = process.env.OCTOKIT_CLIENT_ID;
44
var clientSecret = process.env.OCTOKIT_CLIENT_SECRET;
55
var appName = process.env.OCTOKIT_USER_AGENT;
6-
var user = process.env.OCTORUN_USER;
76
var token = process.env.OCTORUN_TOKEN;
87

98
module.exports = {
109
clientId: clientId,
1110
clientSecret: clientSecret,
1211
appName: appName,
13-
user: user,
1412
token: token
1513
};

octorun/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7f160da1
1+
f497f7aa3d

script

src/GitHub.Api/Application/ApiClient.cs

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,41 @@ class ApiClient : IApiClient
1616
private readonly IKeychain keychain;
1717
private readonly IProcessManager processManager;
1818
private readonly ITaskManager taskManager;
19-
private readonly NPath nodeJsExecutablePath;
20-
private readonly NPath octorunScriptPath;
2119
private readonly ILoginManager loginManager;
20+
private readonly IEnvironment environment;
2221

23-
public ApiClient(UriString hostUrl, IKeychain keychain, IProcessManager processManager, ITaskManager taskManager, NPath nodeJsExecutablePath, NPath octorunScriptPath)
22+
public ApiClient(UriString hostUrl, IKeychain keychain, IProcessManager processManager, ITaskManager taskManager, IEnvironment environment)
2423
{
25-
Guard.ArgumentNotNull(hostUrl, nameof(hostUrl));
2624
Guard.ArgumentNotNull(keychain, nameof(keychain));
2725

28-
HostAddress = HostAddress.Create(hostUrl);
29-
OriginalUrl = hostUrl;
26+
var host = String.IsNullOrEmpty(hostUrl)
27+
? UriString.ToUriString(HostAddress.GitHubDotComHostAddress.WebUri)
28+
: new UriString(hostUrl.ToRepositoryUri()
29+
.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped));
30+
31+
HostAddress = HostAddress.Create(host);
32+
OriginalUrl = host;
3033
this.keychain = keychain;
3134
this.processManager = processManager;
3235
this.taskManager = taskManager;
33-
this.nodeJsExecutablePath = nodeJsExecutablePath;
34-
this.octorunScriptPath = octorunScriptPath;
35-
loginManager = new LoginManager(keychain, processManager, taskManager, nodeJsExecutablePath, octorunScriptPath);
36+
this.environment = environment;
37+
loginManager = new LoginManager(keychain, processManager, taskManager, environment);
3638
}
3739

3840
public ITask Logout(UriString host)
3941
{
4042
return loginManager.Logout(host);
4143
}
4244

43-
public void CreateRepository(string name, string description, bool isPrivate, Action<GitHubRepository, Exception> callback, string organization = null)
45+
public void CreateRepository(string name, string description, bool isPrivate,
46+
Action<GitHubRepository, Exception> callback, string organization = null)
4447
{
4548
Guard.ArgumentNotNull(callback, "callback");
4649

4750
new FuncTask<GitHubRepository>(taskManager.Token, () =>
4851
{
49-
var user = GetCurrentUser();
50-
var keychainAdapter = keychain.Connect(OriginalUrl);
52+
// this validates the user, again
53+
GetCurrentUser();
5154

5255
var command = new StringBuilder("publish -r \"");
5356
command.Append(name);
@@ -72,8 +75,7 @@ public void CreateRepository(string name, string description, bool isPrivate, Ac
7275
command.Append(" -p");
7376
}
7477

75-
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, command.ToString(),
76-
user: user.Login, userToken: keychainAdapter.Credential.Token)
78+
var octorunTask = new OctorunTask(taskManager.Token, keychain, environment, command.ToString())
7779
.Configure(processManager);
7880

7981
var ret = octorunTask.RunSynchronously();
@@ -106,11 +108,8 @@ public void GetOrganizations(Action<Organization[]> onSuccess, Action<Exception>
106108
Guard.ArgumentNotNull(onSuccess, nameof(onSuccess));
107109
new FuncTask<Organization[]>(taskManager.Token, () =>
108110
{
109-
var user = GetCurrentUser();
110-
var keychainAdapter = keychain.Connect(OriginalUrl);
111-
112-
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "organizations",
113-
user: user.Login, userToken: keychainAdapter.Credential.Token)
111+
var octorunTask = new OctorunTask(taskManager.Token, keychain, environment,
112+
"organizations")
114113
.Configure(processManager);
115114

116115
var ret = octorunTask.RunSynchronously();
@@ -208,8 +207,7 @@ public void ContinueLogin(LoginResult loginResult, string code)
208207

209208
private GitHubUser GetCurrentUser()
210209
{
211-
//TODO: ONE_USER_LOGIN This assumes we only support one login
212-
var keychainConnection = keychain.Connections.FirstOrDefault();
210+
var keychainConnection = keychain.Connections.FirstOrDefault(x => x.Host == OriginalUrl);
213211
if (keychainConnection == null)
214212
throw new KeychainEmptyException();
215213

@@ -227,7 +225,7 @@ private GitHubUser GetCurrentUser()
227225

228226
private IKeychainAdapter GetValidatedKeychainAdapter(Connection keychainConnection)
229227
{
230-
var keychainAdapter = keychain.Load(keychainConnection.Host);
228+
var keychainAdapter = keychain.LoadFromSystem(keychainConnection.Host);
231229
if (keychainAdapter == null)
232230
throw new KeychainEmptyException();
233231

@@ -249,8 +247,7 @@ private GitHubUser GetValidatedGitHubUser(Connection keychainConnection, IKeycha
249247
{
250248
try
251249
{
252-
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "validate",
253-
user: keychainConnection.Username, userToken: keychainAdapter.Credential.Token)
250+
var octorunTask = new OctorunTask(taskManager.Token, keychain, environment, "validate")
254251
.Configure(processManager);
255252

256253
var ret = octorunTask.RunSynchronously();

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ protected void Initialize()
5353
#if ENABLE_METRICS
5454
var metricsService = new MetricsService(ProcessManager,
5555
TaskManager,
56-
Environment.FileSystem,
57-
Environment.NodeJsExecutablePath,
58-
Environment.OctorunScriptPath);
56+
Platform.Keychain,
57+
Environment);
5958
UsageTracker.MetricsService = metricsService;
6059
#endif
6160
}

src/GitHub.Api/Authentication/Credential.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public Credential(UriString host, string username, string token)
1616
this.Token = token;
1717
}
1818

19-
public void UpdateToken(string token, string username)
19+
public void Update(string token, string username)
2020
{
2121
this.Token = token;
2222
this.Username = username;

src/GitHub.Api/Authentication/ICredentialManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public interface ICredential : IDisposable
88
UriString Host { get; }
99
string Username { get; }
1010
string Token { get; }
11-
void UpdateToken(string token, string username);
11+
void Update(string token, string username);
1212
}
1313

1414
public interface ICredentialManager

src/GitHub.Api/Authentication/IKeychain.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@ namespace GitHub.Unity
66
public interface IKeychain
77
{
88
IKeychainAdapter Connect(UriString host);
9-
IKeychainAdapter Load(UriString host);
9+
IKeychainAdapter LoadFromSystem(UriString host);
1010
void Clear(UriString host, bool deleteFromCredentialManager);
11-
void Save(UriString host);
12-
void SetCredentials(ICredential credential);
11+
void SaveToSystem(UriString host);
1312
void Initialize();
1413
Connection[] Connections { get; }
1514
IList<UriString> Hosts { get; }
1615
bool HasKeys { get; }
17-
void SetToken(UriString host, string token, string username);
1816

1917
event Action ConnectionsChanged;
2018
}

src/GitHub.Api/Authentication/Keychain.cs

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -95,32 +95,35 @@ public Keychain(IEnvironment environment, ICredentialManager credentialManager)
9595
public IKeychainAdapter Connect(UriString host)
9696
{
9797
Guard.ArgumentNotNull(host, nameof(host));
98-
9998
return FindOrCreateAdapter(host);
10099
}
101100

102-
public IKeychainAdapter Load(UriString host)
101+
public IKeychainAdapter LoadFromSystem(UriString host)
103102
{
104103
Guard.ArgumentNotNull(host, nameof(host));
105104

106-
var keychainAdapter = FindOrCreateAdapter(host);
107-
var connection = GetConnection(host);
108-
109-
var keychainItem = credentialManager.Load(host);
110-
if (keychainItem == null)
105+
var keychainAdapter = Connect(host) as KeychainAdapter;
106+
var credential = credentialManager.Load(host);
107+
if (credential == null)
111108
{
112109
logger.Warning("Cannot load host from Credential Manager; removing from cache");
113110
Clear(host, false);
114111
keychainAdapter = null;
115112
}
116113
else
117114
{
118-
if (keychainItem.Username != connection.Username)
115+
keychainAdapter.Set(credential);
116+
var connection = GetConnection(host);
117+
if (connection.Username == null)
119118
{
120-
logger.Warning("Keychain Username:\"{0}\" does not match cached Username:\"{1}\"; Hopefully it works", keychainItem.Username, connection.Username);
119+
connection.Username = credential.Username;
120+
SaveConnectionsToDisk();
121121
}
122122

123-
keychainAdapter.Set(keychainItem);
123+
if (credential.Username != connection.Username)
124+
{
125+
logger.Warning("Keychain Username:\"{0}\" does not match cached Username:\"{1}\"; Hopefully it works", credential.Username, connection.Username);
126+
}
124127
}
125128
return keychainAdapter;
126129
}
@@ -151,32 +154,14 @@ public void Clear(UriString host, bool deleteFromCredentialManager)
151154
RemoveCredential(host, deleteFromCredentialManager);
152155
}
153156

154-
public void Save(UriString host)
157+
public void SaveToSystem(UriString host)
155158
{
156159
Guard.ArgumentNotNull(host, nameof(host));
157160

158161
var keychainAdapter = AddCredential(host);
159162
AddConnection(new Connection(host, keychainAdapter.Credential.Username));
160163
}
161164

162-
public void SetCredentials(ICredential credential)
163-
{
164-
Guard.ArgumentNotNull(credential, nameof(credential));
165-
166-
var keychainAdapter = GetKeychainAdapter(credential.Host);
167-
keychainAdapter.Set(credential);
168-
}
169-
170-
public void SetToken(UriString host, string token, string username)
171-
{
172-
Guard.ArgumentNotNull(host, nameof(host));
173-
Guard.ArgumentNotNull(token, nameof(token));
174-
Guard.ArgumentNotNull(username, nameof(username));
175-
176-
var keychainAdapter = GetKeychainAdapter(host);
177-
keychainAdapter.UpdateToken(token, username);
178-
}
179-
180165
private void LoadConnectionsFromDisk()
181166
{
182167
if (cachePath.FileExists())
@@ -262,18 +247,19 @@ private void RemoveCredential(UriString host, bool deleteFromCredentialManager)
262247
private Connection GetConnection(UriString host)
263248
{
264249
if (!connections.ContainsKey(host))
265-
throw new ArgumentException($"{host} is not found", nameof(host));
250+
return AddConnection(new Connection(host, null));
266251
return connections[host];
267252
}
268253

269-
private void AddConnection(Connection connection)
254+
private Connection AddConnection(Connection connection)
270255
{
271256
// create new connection in the connection cache for this host
272257
if (connections.ContainsKey(connection.Host))
273258
connections[connection.Host] = connection;
274259
else
275260
connections.Add(connection.Host, connection);
276261
SaveConnectionsToDisk();
262+
return connection;
277263
}
278264

279265
private void RemoveConnection(UriString host)

src/GitHub.Api/Authentication/KeychainAdapter.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ public void Set(ICredential credential)
99
Credential = credential;
1010
}
1111

12-
public void UpdateToken(string token, string username)
12+
public void Update(string token, string username)
1313
{
14-
Credential.UpdateToken(token, username);
14+
Credential.Update(token, username);
1515
}
1616

1717
public void Clear()
@@ -23,5 +23,8 @@ public void Clear()
2323
public interface IKeychainAdapter
2424
{
2525
ICredential Credential { get; }
26+
void Set(ICredential credential);
27+
void Update(string token, string username);
28+
void Clear();
2629
}
2730
}

0 commit comments

Comments
 (0)