This reverts commit a18ea9c9ec
.
This commit is contained in:
parent
9464d14f31
commit
7f21b1af48
5 changed files with 14 additions and 163 deletions
|
@ -183,15 +183,21 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu
|
||||||
return choice === 0;
|
return choice === 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async setTrustedExtensionAndAccountPreference(providerId: string, accountName: string, extensionId: string, extensionName: string, sessionId: string): Promise<void> {
|
||||||
|
this.authenticationService.updatedAllowedExtension(providerId, accountName, extensionId, extensionName, true);
|
||||||
|
this.storageService.store(`${extensionName}-${providerId}`, sessionId, StorageScope.GLOBAL, StorageTarget.MACHINE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private async selectSession(providerId: string, extensionId: string, extensionName: string, scopes: string[], potentialSessions: readonly modes.AuthenticationSession[], clearSessionPreference: boolean, silent: boolean): Promise<modes.AuthenticationSession | undefined> {
|
private async selectSession(providerId: string, extensionId: string, extensionName: string, scopes: string[], potentialSessions: readonly modes.AuthenticationSession[], clearSessionPreference: boolean, silent: boolean): Promise<modes.AuthenticationSession | undefined> {
|
||||||
if (!potentialSessions.length) {
|
if (!potentialSessions.length) {
|
||||||
throw new Error('No potential sessions found');
|
throw new Error('No potential sessions found');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clearSessionPreference) {
|
if (clearSessionPreference) {
|
||||||
this.storageService.remove(`${extensionName}-${providerId}-${scopes.join('-')}`, StorageScope.GLOBAL);
|
this.storageService.remove(`${extensionName}-${providerId}`, StorageScope.GLOBAL);
|
||||||
} else {
|
} else {
|
||||||
const existingSessionPreference = this.storageService.get(`${extensionName}-${providerId}-${scopes.join('-')}`, StorageScope.GLOBAL);
|
const existingSessionPreference = this.storageService.get(`${extensionName}-${providerId}`, StorageScope.GLOBAL);
|
||||||
if (existingSessionPreference) {
|
if (existingSessionPreference) {
|
||||||
const matchingSession = potentialSessions.find(session => session.id === existingSessionPreference);
|
const matchingSession = potentialSessions.find(session => session.id === existingSessionPreference);
|
||||||
if (matchingSession) {
|
if (matchingSession) {
|
||||||
|
@ -255,8 +261,7 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu
|
||||||
}
|
}
|
||||||
|
|
||||||
session = await this.authenticationService.createSession(providerId, scopes, true);
|
session = await this.authenticationService.createSession(providerId, scopes, true);
|
||||||
await this.authenticationService.updatedAllowedExtension(providerId, session.account.label, extensionId, extensionName, true);
|
await this.setTrustedExtensionAndAccountPreference(providerId, session.account.label, extensionId, extensionName, session.id);
|
||||||
this.storageService.store(`${extensionName}-${providerId}-${scopes.join('-')}`, session.id, StorageScope.GLOBAL, StorageTarget.MACHINE);
|
|
||||||
} else {
|
} else {
|
||||||
await this.authenticationService.requestNewSession(providerId, scopes, extensionId, extensionName);
|
await this.authenticationService.requestNewSession(providerId, scopes, extensionId, extensionName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,8 +68,7 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape {
|
||||||
this._inFlightRequests.set(extensionId, inFlightRequests);
|
this._inFlightRequests.set(extensionId, inFlightRequests);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const s = await session;
|
await session;
|
||||||
return s;
|
|
||||||
} finally {
|
} finally {
|
||||||
const requestIndex = inFlightRequests.findIndex(request => request.scopes === sortedScopes);
|
const requestIndex = inFlightRequests.findIndex(request => request.scopes === sortedScopes);
|
||||||
if (requestIndex > -1) {
|
if (requestIndex > -1) {
|
||||||
|
@ -77,6 +76,8 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape {
|
||||||
this._inFlightRequests.set(extensionId, inFlightRequests);
|
this._inFlightRequests.set(extensionId, inFlightRequests);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return session;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -503,7 +503,7 @@ export class AuthenticationService extends Disposable implements IAuthentication
|
||||||
this.updatedAllowedExtension(providerId, accountName, extensionId, extensionName, true);
|
this.updatedAllowedExtension(providerId, accountName, extensionId, extensionName, true);
|
||||||
|
|
||||||
this.removeAccessRequest(providerId, extensionId);
|
this.removeAccessRequest(providerId, extensionId);
|
||||||
this.storageService.store(`${extensionName}-${providerId}-${scopes.join('-')}`, session.id, StorageScope.GLOBAL, StorageTarget.MACHINE);
|
this.storageService.store(`${extensionName}-${providerId}`, session.id, StorageScope.GLOBAL, StorageTarget.MACHINE);
|
||||||
|
|
||||||
quickPick.dispose();
|
quickPick.dispose();
|
||||||
resolve(session);
|
resolve(session);
|
||||||
|
@ -638,7 +638,7 @@ export class AuthenticationService extends Disposable implements IAuthentication
|
||||||
this.updatedAllowedExtension(providerId, session.account.label, extensionId, extensionName, true);
|
this.updatedAllowedExtension(providerId, session.account.label, extensionId, extensionName, true);
|
||||||
|
|
||||||
// And also set it as the preferred account for the extension
|
// And also set it as the preferred account for the extension
|
||||||
storageService.store(`${extensionName}-${providerId}-${scopes.join('-')}`, session.id, StorageScope.GLOBAL, StorageTarget.MACHINE);
|
storageService.store(`${extensionName}-${providerId}`, session.id, StorageScope.GLOBAL, StorageTarget.MACHINE);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,136 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
import * as assert from 'assert';
|
|
||||||
import { AuthenticationProviderInformation } from 'vs/editor/common/modes';
|
|
||||||
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
|
|
||||||
import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogService';
|
|
||||||
import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService';
|
|
||||||
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
|
|
||||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
|
||||||
import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService';
|
|
||||||
import { IQuickInputHideEvent, IQuickInputService, IQuickPickDidAcceptEvent } from 'vs/platform/quickinput/common/quickInput';
|
|
||||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
|
||||||
import { MainThreadAuthentication } from 'vs/workbench/api/browser/mainThreadAuthentication';
|
|
||||||
import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol';
|
|
||||||
import { IActivityService } from 'vs/workbench/services/activity/common/activity';
|
|
||||||
import { AuthenticationService, IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService';
|
|
||||||
import { ExtensionHostKind, IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
|
||||||
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
|
|
||||||
import { TestRemoteAgentService } from 'vs/workbench/services/remote/test/common/testServices';
|
|
||||||
import { TestQuickInputService } from 'vs/workbench/test/browser/workbenchTestServices';
|
|
||||||
import { TestActivityService, TestExtensionService, TestStorageService } from 'vs/workbench/test/common/workbenchTestServices';
|
|
||||||
|
|
||||||
function createSession(id: string = '1234', scope: string[] = []) {
|
|
||||||
return {
|
|
||||||
accessToken: '1234',
|
|
||||||
account: {
|
|
||||||
id: 'test@test.com',
|
|
||||||
label: 'Test Person'
|
|
||||||
},
|
|
||||||
id: id,
|
|
||||||
scopes: scope
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
class AuthQuickPick {
|
|
||||||
private listener: ((e: IQuickPickDidAcceptEvent) => any) | undefined;
|
|
||||||
public items = [];
|
|
||||||
public get selectedItems(): string[] {
|
|
||||||
return this.items;
|
|
||||||
}
|
|
||||||
|
|
||||||
onDidAccept(listener: (e: IQuickPickDidAcceptEvent) => any) {
|
|
||||||
this.listener = listener;
|
|
||||||
}
|
|
||||||
onDidHide(listener: (e: IQuickInputHideEvent) => any) {
|
|
||||||
|
|
||||||
}
|
|
||||||
dispose() {
|
|
||||||
|
|
||||||
}
|
|
||||||
show() {
|
|
||||||
this.listener!({
|
|
||||||
inBackground: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class AuthTestQuickInputService extends TestQuickInputService {
|
|
||||||
override createQuickPick() {
|
|
||||||
return <any>new AuthQuickPick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
suite('MainThreadAuthentication', () => {
|
|
||||||
let mainThreadAuthentication: MainThreadAuthentication;
|
|
||||||
suiteSetup(async () => {
|
|
||||||
// extHostContext: IExtHostContext,
|
|
||||||
const services = new ServiceCollection();
|
|
||||||
const dialogService = new TestDialogService();
|
|
||||||
const storageService = new TestStorageService();
|
|
||||||
const quickInputService = new AuthTestQuickInputService();
|
|
||||||
const extensionService = new TestExtensionService();
|
|
||||||
|
|
||||||
const activityService = new TestActivityService();
|
|
||||||
const remoteAgentService = new TestRemoteAgentService();
|
|
||||||
|
|
||||||
services.set(IDialogService, dialogService);
|
|
||||||
services.set(IStorageService, storageService);
|
|
||||||
services.set(INotificationService, new TestNotificationService());
|
|
||||||
services.set(IQuickInputService, quickInputService);
|
|
||||||
services.set(IExtensionService, extensionService);
|
|
||||||
services.set(IActivityService, activityService);
|
|
||||||
services.set(IRemoteAgentService, remoteAgentService);
|
|
||||||
|
|
||||||
const instaService = new InstantiationService(services);
|
|
||||||
services.set(IAuthenticationService, instaService.createInstance(AuthenticationService));
|
|
||||||
|
|
||||||
mainThreadAuthentication = instaService.createInstance(MainThreadAuthentication,
|
|
||||||
new class implements IExtHostContext {
|
|
||||||
remoteAuthority = '';
|
|
||||||
extensionHostKind = ExtensionHostKind.LocalProcess;
|
|
||||||
assertRegistered() { }
|
|
||||||
set(v: any): any { return null; }
|
|
||||||
getProxy(): any {
|
|
||||||
return {
|
|
||||||
$getSessions(id: string, scopes: string[]) {
|
|
||||||
return Promise.resolve([createSession(id, scopes)]);
|
|
||||||
},
|
|
||||||
$createSession(id: string, scopes: string[]) {
|
|
||||||
return Promise.resolve(createSession(id, scopes));
|
|
||||||
},
|
|
||||||
$removeSession(id: string, sessionId: string) { return Promise.resolve(); },
|
|
||||||
$onDidChangeAuthenticationSessions(id: string, label: string) { return Promise.resolve(); },
|
|
||||||
$onDidChangeAuthenticationProviders(added: AuthenticationProviderInformation[], removed: AuthenticationProviderInformation[]) { return Promise.resolve(); },
|
|
||||||
$setProviders(providers: AuthenticationProviderInformation[]) { return Promise.resolve(); }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
drain(): any { return null; }
|
|
||||||
});
|
|
||||||
|
|
||||||
await mainThreadAuthentication.$registerAuthenticationProvider('test', 'test provider', true);
|
|
||||||
});
|
|
||||||
|
|
||||||
suiteTeardown(() => {
|
|
||||||
mainThreadAuthentication.$unregisterAuthenticationProvider('test');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Can get a session', async () => {
|
|
||||||
const session = await mainThreadAuthentication.$getSession('test', ['foo'], 'testextension', 'test extension', { createIfNone: true, clearSessionPreference: false });
|
|
||||||
assert.strictEqual(session?.id, 'test');
|
|
||||||
assert.strictEqual(session?.scopes[0], 'foo');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Can get multiple sessions (with different scopes) in one extension', async () => {
|
|
||||||
let session = await mainThreadAuthentication.$getSession('test', ['foo'], 'testextension', 'test extension', { createIfNone: true, clearSessionPreference: false });
|
|
||||||
session = await mainThreadAuthentication.$getSession('test', ['bar'], 'testextension', 'test extension', { createIfNone: true, clearSessionPreference: false });
|
|
||||||
assert.strictEqual(session?.id, 'test');
|
|
||||||
assert.strictEqual(session?.scopes[0], 'bar');
|
|
||||||
|
|
||||||
session = await mainThreadAuthentication.$getSession('test', ['foo'], 'testextension', 'test extension', { createIfNone: false, clearSessionPreference: false });
|
|
||||||
assert.strictEqual(session?.id, 'test');
|
|
||||||
assert.strictEqual(session?.scopes[0], 'foo');
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -22,7 +22,6 @@ import { IFileStatWithMetadata } from 'vs/platform/files/common/files';
|
||||||
import { ISaveOptions, IRevertOptions } from 'vs/workbench/common/editor';
|
import { ISaveOptions, IRevertOptions } from 'vs/workbench/common/editor';
|
||||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||||
import product from 'vs/platform/product/common/product';
|
import product from 'vs/platform/product/common/product';
|
||||||
import { IActivity, IActivityService } from 'vs/workbench/services/activity/common/activity';
|
|
||||||
|
|
||||||
export class TestTextResourcePropertiesService implements ITextResourcePropertiesService {
|
export class TestTextResourcePropertiesService implements ITextResourcePropertiesService {
|
||||||
|
|
||||||
|
@ -215,21 +214,3 @@ export interface Ctor<T> {
|
||||||
export class TestExtensionService extends NullExtensionService { }
|
export class TestExtensionService extends NullExtensionService { }
|
||||||
|
|
||||||
export const TestProductService = { _serviceBrand: undefined, ...product };
|
export const TestProductService = { _serviceBrand: undefined, ...product };
|
||||||
|
|
||||||
export class TestActivityService implements IActivityService {
|
|
||||||
_serviceBrand: undefined;
|
|
||||||
showViewContainerActivity(viewContainerId: string, badge: IActivity): IDisposable {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
showViewActivity(viewId: string, badge: IActivity): IDisposable {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
showAccountsActivity(activity: IActivity): IDisposable {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
showGlobalActivity(activity: IActivity): IDisposable {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() { }
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue