Skip to content

Commit da6f630

Browse files
authored
implement sign in to access configured marketplace (microsoft#256101)
* implement sign in to access configured marketplace * revert
1 parent 4e6e16e commit da6f630

File tree

9 files changed

+205
-89
lines changed

9 files changed

+205
-89
lines changed

src/vs/platform/extensionManagement/common/extensionGalleryManifest.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,21 @@ export interface IExtensionGalleryManifest {
6565
};
6666
}
6767

68+
export const enum ExtensionGalleryManifestStatus {
69+
Available = 'available',
70+
RequiresSignIn = 'requiresSignIn',
71+
AccessDenied = 'accessDenied',
72+
Unavailable = 'unavailable'
73+
}
74+
6875
export const IExtensionGalleryManifestService = createDecorator<IExtensionGalleryManifestService>('IExtensionGalleryManifestService');
6976

7077
export interface IExtensionGalleryManifestService {
7178
readonly _serviceBrand: undefined;
7279

80+
readonly extensionGalleryManifestStatus: ExtensionGalleryManifestStatus;
81+
readonly onDidChangeExtensionGalleryManifestStatus: Event<ExtensionGalleryManifestStatus>;
7382
readonly onDidChangeExtensionGalleryManifest: Event<IExtensionGalleryManifest | null>;
74-
isEnabled(): boolean;
7583
getExtensionGalleryManifest(): Promise<IExtensionGalleryManifest | null>;
7684
}
7785

src/vs/platform/extensionManagement/common/extensionGalleryManifestService.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { Event } from '../../../base/common/event.js';
77
import { Disposable } from '../../../base/common/lifecycle.js';
88
import { IProductService } from '../../product/common/productService.js';
9-
import { ExtensionGalleryResourceType, Flag, IExtensionGalleryManifest, IExtensionGalleryManifestService } from './extensionGalleryManifest.js';
9+
import { ExtensionGalleryResourceType, Flag, IExtensionGalleryManifest, IExtensionGalleryManifestService, ExtensionGalleryManifestStatus } from './extensionGalleryManifest.js';
1010
import { FilterType, SortBy } from './extensionManagement.js';
1111

1212
type ExtensionGalleryConfig = {
@@ -23,17 +23,18 @@ export class ExtensionGalleryManifestService extends Disposable implements IExte
2323

2424
readonly _serviceBrand: undefined;
2525
readonly onDidChangeExtensionGalleryManifest = Event.None;
26+
readonly onDidChangeExtensionGalleryManifestStatus = Event.None;
27+
28+
get extensionGalleryManifestStatus(): ExtensionGalleryManifestStatus {
29+
return !!this.productService.extensionsGallery?.serviceUrl ? ExtensionGalleryManifestStatus.Available : ExtensionGalleryManifestStatus.Unavailable;
30+
}
2631

2732
constructor(
2833
@IProductService protected readonly productService: IProductService,
2934
) {
3035
super();
3136
}
3237

33-
isEnabled(): boolean {
34-
return !!this.productService.extensionsGallery?.serviceUrl;
35-
}
36-
3738
async getExtensionGalleryManifest(): Promise<IExtensionGalleryManifest | null> {
3839
const extensionsGallery = this.productService.extensionsGallery as ExtensionGalleryConfig | undefined;
3940
if (!extensionsGallery?.serviceUrl) {

src/vs/platform/extensionManagement/common/extensionGalleryManifestServiceIpc.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Barrier } from '../../../base/common/async.js';
77
import { Emitter, Event } from '../../../base/common/event.js';
88
import { IPCServer } from '../../../base/parts/ipc/common/ipc.js';
99
import { IProductService } from '../../product/common/productService.js';
10-
import { IExtensionGalleryManifest, IExtensionGalleryManifestService } from './extensionGalleryManifest.js';
10+
import { IExtensionGalleryManifest, IExtensionGalleryManifestService, ExtensionGalleryManifestStatus } from './extensionGalleryManifest.js';
1111
import { ExtensionGalleryManifestService } from './extensionGalleryManifestService.js';
1212

1313
export class ExtensionGalleryManifestIPCService extends ExtensionGalleryManifestService implements IExtensionGalleryManifestService {
@@ -17,9 +17,16 @@ export class ExtensionGalleryManifestIPCService extends ExtensionGalleryManifest
1717
private _onDidChangeExtensionGalleryManifest = this._register(new Emitter<IExtensionGalleryManifest | null>());
1818
override readonly onDidChangeExtensionGalleryManifest = this._onDidChangeExtensionGalleryManifest.event;
1919

20-
private extensionGalleryManifest: IExtensionGalleryManifest | null | undefined;
20+
private _onDidChangeExtensionGalleryManifestStatus = this._register(new Emitter<ExtensionGalleryManifestStatus>());
21+
override readonly onDidChangeExtensionGalleryManifestStatus = this._onDidChangeExtensionGalleryManifestStatus.event;
22+
23+
private _extensionGalleryManifest: IExtensionGalleryManifest | null | undefined;
2124
private readonly barrier = new Barrier();
2225

26+
override get extensionGalleryManifestStatus(): ExtensionGalleryManifestStatus {
27+
return this._extensionGalleryManifest ? ExtensionGalleryManifestStatus.Available : ExtensionGalleryManifestStatus.Unavailable;
28+
}
29+
2330
constructor(
2431
server: IPCServer<any>,
2532
@IProductService productService: IProductService
@@ -38,12 +45,13 @@ export class ExtensionGalleryManifestIPCService extends ExtensionGalleryManifest
3845

3946
override async getExtensionGalleryManifest(): Promise<IExtensionGalleryManifest | null> {
4047
await this.barrier.wait();
41-
return this.extensionGalleryManifest ?? null;
48+
return this._extensionGalleryManifest ?? null;
4249
}
4350

4451
private setExtensionGalleryManifest(manifest: IExtensionGalleryManifest | null): void {
45-
this.extensionGalleryManifest = manifest;
52+
this._extensionGalleryManifest = manifest;
4653
this._onDidChangeExtensionGalleryManifest.fire(manifest);
54+
this._onDidChangeExtensionGalleryManifestStatus.fire(this.extensionGalleryManifestStatus);
4755
this.barrier.open();
4856
}
4957

src/vs/platform/extensionManagement/common/extensionGalleryService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { ITelemetryService } from '../../telemetry/common/telemetry.js';
3030
import { StopWatch } from '../../../base/common/stopwatch.js';
3131
import { format2 } from '../../../base/common/strings.js';
3232
import { IAssignmentService } from '../../assignment/common/assignment.js';
33-
import { ExtensionGalleryResourceType, Flag, getExtensionGalleryManifestResourceUri, IExtensionGalleryManifest, IExtensionGalleryManifestService } from './extensionGalleryManifest.js';
33+
import { ExtensionGalleryResourceType, Flag, getExtensionGalleryManifestResourceUri, IExtensionGalleryManifest, IExtensionGalleryManifestService, ExtensionGalleryManifestStatus } from './extensionGalleryManifest.js';
3434
import { TelemetryTrustedValue } from '../../telemetry/common/telemetryUtils.js';
3535

3636
const CURRENT_TARGET_PLATFORM = isWeb ? TargetPlatform.WEB : getTargetPlatform(platform, arch);
@@ -580,7 +580,7 @@ export abstract class AbstractExtensionGalleryService implements IExtensionGalle
580580
}
581581

582582
isEnabled(): boolean {
583-
return this.extensionGalleryManifestService.isEnabled();
583+
return this.extensionGalleryManifestService.extensionGalleryManifestStatus === ExtensionGalleryManifestStatus.Available;
584584
}
585585

586586
getExtensions(extensionInfos: ReadonlyArray<IExtensionInfo>, token: CancellationToken): Promise<IGalleryExtension[]>;

src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ import { EnablementState, IExtensionManagementServerService, IPublisherInfo, IWo
1414
import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from '../../../services/extensionRecommendations/common/extensionRecommendations.js';
1515
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../common/contributions.js';
1616
import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js';
17-
import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg, ExtensionRuntimeActionType, EXTENSIONS_CATEGORY, AutoRestartConfigurationKey, extensionsFilterSubMenu, DefaultViewsContext } from '../common/extensions.js';
17+
import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg, ExtensionRuntimeActionType, EXTENSIONS_CATEGORY, AutoRestartConfigurationKey, extensionsFilterSubMenu, DefaultViewsContext, CONTEXT_EXTENSIONS_GALLERY_STATUS } from '../common/extensions.js';
1818
import { InstallSpecificVersionOfExtensionAction, ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, SetColorThemeAction, SetFileIconThemeAction, SetProductIconThemeAction, ClearLanguageAction, ToggleAutoUpdateForExtensionAction, ToggleAutoUpdatesForPublisherAction, TogglePreReleaseExtensionAction, InstallAnotherVersionAction, InstallAction } from './extensionsActions.js';
1919
import { ExtensionsInput } from '../common/extensionsInput.js';
2020
import { ExtensionEditor } from './extensionEditor.js';
21-
import { StatusUpdater, MaliciousExtensionChecker, ExtensionsViewletViewsContribution, ExtensionsViewPaneContainer, BuiltInExtensionsContext, SearchMarketplaceExtensionsContext, RecommendedExtensionsContext, ExtensionsSortByContext, SearchHasTextContext, ExtensionsSearchValueContext } from './extensionsViewlet.js';
21+
import { StatusUpdater, MaliciousExtensionChecker, ExtensionsViewletViewsContribution, ExtensionsViewPaneContainer, BuiltInExtensionsContext, SearchMarketplaceExtensionsContext, RecommendedExtensionsContext, ExtensionsSortByContext, SearchHasTextContext, ExtensionsSearchValueContext, ExtensionMarketplaceStatusUpdater } from './extensionsViewlet.js';
2222
import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from '../../../../platform/configuration/common/configurationRegistry.js';
2323
import * as jsonContributionRegistry from '../../../../platform/jsonschemas/common/jsonContributionRegistry.js';
2424
import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from '../common/extensionsFileTemplate.js';
@@ -81,9 +81,10 @@ import { IConfigurationMigrationRegistry, Extensions as ConfigurationMigrationEx
8181
import { IProductService } from '../../../../platform/product/common/productService.js';
8282
import { IUserDataProfilesService } from '../../../../platform/userDataProfile/common/userDataProfile.js';
8383
import product from '../../../../platform/product/common/product.js';
84-
import { ExtensionGalleryResourceType, ExtensionGalleryServiceUrlConfigKey, getExtensionGalleryManifestResourceUri, IExtensionGalleryManifest, IExtensionGalleryManifestService } from '../../../../platform/extensionManagement/common/extensionGalleryManifest.js';
84+
import { ExtensionGalleryResourceType, ExtensionGalleryServiceUrlConfigKey, getExtensionGalleryManifestResourceUri, IExtensionGalleryManifestService, ExtensionGalleryManifestStatus, IExtensionGalleryManifest } from '../../../../platform/extensionManagement/common/extensionGalleryManifest.js';
8585
import { ILanguageModelToolsService } from '../../chat/common/languageModelToolsService.js';
8686
import { SearchExtensionsTool, SearchExtensionsToolData } from '../common/searchExtensionsTool.js';
87+
import { DEFAULT_ACCOUNT_SIGN_IN_COMMAND } from '../../../services/accounts/common/defaultAccount.js';
8788

8889
// Singletons
8990
registerSingleton(IExtensionsWorkbenchService, ExtensionsWorkbenchService, InstantiationType.Eager /* Auto updates extensions */);
@@ -523,8 +524,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
523524
constructor(
524525
@IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService,
525526
@IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService,
526-
@IExtensionGalleryService extensionGalleryService: IExtensionGalleryService,
527-
@IExtensionGalleryManifestService extensionGalleryManifestService: IExtensionGalleryManifestService,
527+
@IExtensionGalleryManifestService private readonly extensionGalleryManifestService: IExtensionGalleryManifestService,
528528
@IContextKeyService private readonly contextKeyService: IContextKeyService,
529529
@IViewsService private readonly viewsService: IViewsService,
530530
@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService,
@@ -535,11 +535,6 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
535535
@IProductService private readonly productService: IProductService,
536536
) {
537537
super();
538-
const hasGalleryContext = CONTEXT_HAS_GALLERY.bindTo(contextKeyService);
539-
if (extensionGalleryService.isEnabled()) {
540-
hasGalleryContext.set(true);
541-
}
542-
543538
const hasLocalServerContext = CONTEXT_HAS_LOCAL_SERVER.bindTo(contextKeyService);
544539
if (this.extensionManagementServerService.localExtensionManagementServer) {
545540
hasLocalServerContext.set(true);
@@ -555,17 +550,24 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
555550
hasWebServerContext.set(true);
556551
}
557552

553+
this.updateExtensionGalleryStatusContexts();
554+
this._register(extensionGalleryManifestService.onDidChangeExtensionGalleryManifestStatus(() => this.updateExtensionGalleryStatusContexts()));
558555
extensionGalleryManifestService.getExtensionGalleryManifest()
559556
.then(extensionGalleryManifest => {
560-
this.registerGalleryCapabilitiesContexts(extensionGalleryManifest);
561-
this._register(extensionGalleryManifestService.onDidChangeExtensionGalleryManifest(extensionGalleryManifest => this.registerGalleryCapabilitiesContexts(extensionGalleryManifest)));
557+
this.updateGalleryCapabilitiesContexts(extensionGalleryManifest);
558+
this._register(extensionGalleryManifestService.onDidChangeExtensionGalleryManifest(extensionGalleryManifest => this.updateGalleryCapabilitiesContexts(extensionGalleryManifest)));
562559
});
563560
this.registerGlobalActions();
564561
this.registerContextMenuActions();
565562
this.registerQuickAccessProvider();
566563
}
567564

568-
private async registerGalleryCapabilitiesContexts(extensionGalleryManifest: IExtensionGalleryManifest | null): Promise<void> {
565+
private async updateExtensionGalleryStatusContexts(): Promise<void> {
566+
CONTEXT_HAS_GALLERY.bindTo(this.contextKeyService).set(this.extensionGalleryManifestService.extensionGalleryManifestStatus === ExtensionGalleryManifestStatus.Available);
567+
CONTEXT_EXTENSIONS_GALLERY_STATUS.bindTo(this.contextKeyService).set(this.extensionGalleryManifestService.extensionGalleryManifestStatus);
568+
}
569+
570+
private async updateGalleryCapabilitiesContexts(extensionGalleryManifest: IExtensionGalleryManifest | null): Promise<void> {
569571
CONTEXT_GALLERY_SORT_CAPABILITIES.bindTo(this.contextKeyService).set(`_${extensionGalleryManifest?.capabilities.extensionQuery.sorting?.map(s => s.name)?.join('_')}_UpdateDate_`);
570572
CONTEXT_GALLERY_FILTER_CAPABILITIES.bindTo(this.contextKeyService).set(`_${extensionGalleryManifest?.capabilities.extensionQuery.filtering?.map(s => s.name)?.join('_')}_`);
571573
CONTEXT_GALLERY_ALL_PUBLIC_REPOSITORY_SIGNED.bindTo(this.contextKeyService).set(!!extensionGalleryManifest?.capabilities?.signing?.allPublicRepositorySigned);
@@ -2023,6 +2025,7 @@ workbenchRegistry.registerWorkbenchContribution(ExtensionEnablementWorkspaceTrus
20232025
workbenchRegistry.registerWorkbenchContribution(ExtensionsCompletionItemsProvider, LifecyclePhase.Restored);
20242026
workbenchRegistry.registerWorkbenchContribution(UnsupportedExtensionsMigrationContrib, LifecyclePhase.Eventually);
20252027
workbenchRegistry.registerWorkbenchContribution(TrustedPublishersInitializer, LifecyclePhase.Eventually);
2028+
workbenchRegistry.registerWorkbenchContribution(ExtensionMarketplaceStatusUpdater, LifecyclePhase.Eventually);
20262029
if (isWeb) {
20272030
workbenchRegistry.registerWorkbenchContribution(ExtensionStorageCleaner, LifecyclePhase.Eventually);
20282031
}
@@ -2033,6 +2036,22 @@ registerWorkbenchContribution2(ExtensionToolsContribution.ID, ExtensionToolsCont
20332036
// Running Extensions
20342037
registerAction2(ShowRuntimeExtensionsAction);
20352038

2039+
registerAction2(class ExtensionsGallerySignInAction extends Action2 {
2040+
constructor() {
2041+
super({
2042+
id: 'workbench.extensions.actions.gallery.signIn',
2043+
title: localize2('signInToMarketplace', 'Sign in to access Extensions Marketplace'),
2044+
menu: {
2045+
id: MenuId.AccountsContext,
2046+
when: CONTEXT_EXTENSIONS_GALLERY_STATUS.isEqualTo(ExtensionGalleryManifestStatus.RequiresSignIn)
2047+
},
2048+
});
2049+
}
2050+
run(accessor: ServicesAccessor): Promise<void> {
2051+
return accessor.get(ICommandService).executeCommand(DEFAULT_ACCOUNT_SIGN_IN_COMMAND);
2052+
}
2053+
});
2054+
20362055
Registry.as<IConfigurationMigrationRegistry>(ConfigurationMigrationExtensions.ConfigurationMigration)
20372056
.registerConfigurationMigrations([{
20382057
key: AutoUpdateConfigurationKey,

0 commit comments

Comments
 (0)