Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/vs/workbench/browser/web.main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ import { TunnelSource } from '../services/remote/common/tunnelModel.js';
import { mainWindow } from '../../base/browser/window.js';
import { INotificationService, Severity } from '../../platform/notification/common/notification.js';
import { IDefaultAccountService } from '../../platform/defaultAccount/common/defaultAccount.js';
import { DefaultAccountService } from '../services/accounts/common/defaultAccount.js';
import { DefaultAccountService } from '../services/accounts/browser/defaultAccount.js';
import { AccountPolicyService } from '../services/policies/common/accountPolicyService.js';

export class BrowserMain extends Disposable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ import { ResourceContextKey, WorkbenchStateContext } from '../../../common/conte
import { IWorkbenchContribution, IWorkbenchContributionsRegistry, registerWorkbenchContribution2, Extensions as WorkbenchExtensions, WorkbenchPhase } from '../../../common/contributions.js';
import { EditorExtensions } from '../../../common/editor.js';
import { IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation } from '../../../common/views.js';
import { DEFAULT_ACCOUNT_SIGN_IN_COMMAND } from '../../../services/accounts/common/defaultAccount.js';
import { DEFAULT_ACCOUNT_SIGN_IN_COMMAND } from '../../../services/accounts/browser/defaultAccount.js';
import { IEditorService } from '../../../services/editor/common/editorService.js';
import { EnablementState, IExtensionManagementServerService, IPublisherInfo, IWorkbenchExtensionEnablementService, IWorkbenchExtensionManagementService } from '../../../services/extensionManagement/common/extensionManagement.js';
import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from '../../../services/extensionRecommendations/common/extensionRecommendations.js';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ import { ThemeIcon } from '../../../../base/common/themables.js';
import { Codicon } from '../../../../base/common/codicons.js';
import { IExtensionGalleryManifest, IExtensionGalleryManifestService, ExtensionGalleryManifestStatus } from '../../../../platform/extensionManagement/common/extensionGalleryManifest.js';
import { URI } from '../../../../base/common/uri.js';
import { DEFAULT_ACCOUNT_SIGN_IN_COMMAND } from '../../../services/accounts/common/defaultAccount.js';
import { DEFAULT_ACCOUNT_SIGN_IN_COMMAND } from '../../../services/accounts/browser/defaultAccount.js';
import { IHoverService } from '../../../../platform/hover/browser/hover.js';

export const ExtensionsSortByContext = new RawContextKey<string>('extensionsSortByValue', '');
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/electron-browser/desktop.main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ import { IConfigurationService } from '../../platform/configuration/common/confi
import { applyZoom } from '../../platform/window/electron-browser/window.js';
import { mainWindow } from '../../base/browser/window.js';
import { IDefaultAccountService } from '../../platform/defaultAccount/common/defaultAccount.js';
import { DefaultAccountService } from '../services/accounts/common/defaultAccount.js';
import { DefaultAccountService } from '../services/accounts/browser/defaultAccount.js';
import { AccountPolicyService } from '../services/policies/common/accountPolicyService.js';
import { MultiplexPolicyService } from '../services/policies/common/multiplexPolicyService.js';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ import { IExtensionService } from '../../extensions/common/extensions.js';
import { ILogService } from '../../../../platform/log/common/log.js';
import { IContextKey, IContextKeyService, RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../common/contributions.js';
import { Barrier, ThrottledDelayer, timeout } from '../../../../base/common/async.js';
import { Barrier, RunOnceScheduler, ThrottledDelayer, timeout } from '../../../../base/common/async.js';
import { IHostService } from '../../host/browser/host.js';
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
import { getErrorMessage } from '../../../../base/common/errors.js';
import { IDefaultAccount, IDefaultAccountAuthenticationProvider, IEntitlementsData, IPolicyData } from '../../../../base/common/defaultAccount.js';
Expand Down Expand Up @@ -58,8 +59,8 @@ const enum DefaultAccountStatus {
}

const CONTEXT_DEFAULT_ACCOUNT_STATE = new RawContextKey<string>('defaultAccountStatus', DefaultAccountStatus.Uninitialized);

const CACHED_POLICY_DATA_KEY = 'defaultAccount.cachedPolicyData';
const ACCOUNT_DATA_POLL_INTERVAL_MS = 15 * 60 * 1000; // 15 minutes

interface ITokenEntitlementsResponse {
token: string;
Expand Down Expand Up @@ -201,6 +202,7 @@ class DefaultAccountProvider extends Disposable implements IDefaultAccountProvid
private initialized = false;
private readonly initPromise: Promise<void>;
private readonly updateThrottler = this._register(new ThrottledDelayer(100));
private readonly accountDataPollScheduler = this._register(new RunOnceScheduler(() => this.updateDefaultAccount(), ACCOUNT_DATA_POLL_INTERVAL_MS));

constructor(
private readonly defaultAccountConfig: IDefaultAccountConfig,
Expand All @@ -214,6 +216,7 @@ class DefaultAccountProvider extends Disposable implements IDefaultAccountProvid
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,
@IContextKeyService contextKeyService: IContextKeyService,
@IStorageService private readonly storageService: IStorageService,
@IHostService private readonly hostService: IHostService,
) {
super();
this.accountStatusContext = CONTEXT_DEFAULT_ACCOUNT_STATE.bindTo(contextKeyService);
Expand Down Expand Up @@ -284,6 +287,15 @@ class DefaultAccountProvider extends Disposable implements IDefaultAccountProvid
this.logService.debug('[DefaultAccount] Default account provider unregistered, updating default account');
this.updateDefaultAccount();
}));

this._register(this.hostService.onDidChangeFocus(focused => {
if (focused && this._defaultAccount) {
// Update default account when window gets focused
this.accountDataPollScheduler.cancel();
this.logService.debug('[DefaultAccount] Window focused, updating default account');
this.updateDefaultAccount();
}
}));
}

async refresh(): Promise<IDefaultAccount | null> {
Expand All @@ -305,6 +317,7 @@ class DefaultAccountProvider extends Disposable implements IDefaultAccountProvid
try {
const defaultAccount = await this.fetchDefaultAccount();
this.setDefaultAccount(defaultAccount);
this.scheduleAccountDataPoll();
} catch (error) {
this.logService.error('[DefaultAccount] Error while updating default account', getErrorMessage(error));
}
Expand All @@ -320,7 +333,7 @@ class DefaultAccountProvider extends Disposable implements IDefaultAccountProvid
return null;
}

return await this.getDefaultAccountFromAuthenticatedSessions(defaultAccountProvider, this.defaultAccountConfig.authenticationProvider.scopes);
return await this.getDefaultAccountForAuthenticationProvider(defaultAccountProvider);
}

private setDefaultAccount(account: IDefaultAccount | null): void {
Expand All @@ -335,11 +348,19 @@ class DefaultAccountProvider extends Disposable implements IDefaultAccountProvid
this.accountStatusContext.set(DefaultAccountStatus.Available);
this.logService.debug('[DefaultAccount] Account status set to Available');
} else {
this.accountDataPollScheduler.cancel();
this.accountStatusContext.set(DefaultAccountStatus.Unavailable);
this.logService.debug('[DefaultAccount] Account status set to Unavailable');
}
}

private scheduleAccountDataPoll(): void {
if (!this._defaultAccount) {
return;
}
this.accountDataPollScheduler.schedule(ACCOUNT_DATA_POLL_INTERVAL_MS);
}

private extractFromToken(token: string): Map<string, string> {
const result = new Map<string, string>();
const firstPart = token?.split(':')[0];
Expand All @@ -352,16 +373,25 @@ class DefaultAccountProvider extends Disposable implements IDefaultAccountProvid
return result;
}

private async getDefaultAccountFromAuthenticatedSessions(authenticationProvider: IDefaultAccountAuthenticationProvider, scopes: string[][]): Promise<IDefaultAccount | null> {
private async getDefaultAccountForAuthenticationProvider(authenticationProvider: IDefaultAccountAuthenticationProvider): Promise<IDefaultAccount | null> {
try {
this.logService.debug('[DefaultAccount] Getting Default Account from authenticated sessions for provider:', authenticationProvider.id);
const sessions = await this.findMatchingProviderSession(authenticationProvider.id, scopes);
const sessions = await this.findMatchingProviderSession(authenticationProvider.id, this.defaultAccountConfig.authenticationProvider.scopes);

if (!sessions?.length) {
this.logService.debug('[DefaultAccount] No matching session found for provider:', authenticationProvider.id);
return null;
}

return this.getDefaultAccountFromAuthenticatedSessions(authenticationProvider, sessions);
} catch (error) {
this.logService.error('[DefaultAccount] Failed to get default account for provider:', authenticationProvider.id, getErrorMessage(error));
return null;
}
}

private async getDefaultAccountFromAuthenticatedSessions(authenticationProvider: IDefaultAccountAuthenticationProvider, sessions: AuthenticationSession[]): Promise<IDefaultAccount | null> {
try {
const accountId = sessions[0].account.id;
const [entitlementsData, tokenEntitlementsData] = await Promise.all([
this.getEntitlements(sessions),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import assert from 'assert';
import { Event } from '../../../../../base/common/event.js';
import { NullLogService } from '../../../../../platform/log/common/log.js';
import { IDefaultAccountProvider, IDefaultAccountService } from '../../../../../platform/defaultAccount/common/defaultAccount.js';
import { DefaultAccountService } from '../../../accounts/common/defaultAccount.js';
import { DefaultAccountService } from '../../../accounts/browser/defaultAccount.js';
import { AccountPolicyService } from '../../common/accountPolicyService.js';
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
import { Registry } from '../../../../../platform/registry/common/platform.js';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import assert from 'assert';
import { Event } from '../../../../../base/common/event.js';
import { NullLogService } from '../../../../../platform/log/common/log.js';
import { IDefaultAccountProvider, IDefaultAccountService } from '../../../../../platform/defaultAccount/common/defaultAccount.js';
import { DefaultAccountService } from '../../../accounts/common/defaultAccount.js';
import { DefaultAccountService } from '../../../accounts/browser/defaultAccount.js';
import { AccountPolicyService } from '../../common/accountPolicyService.js';
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
import { Registry } from '../../../../../platform/registry/common/platform.js';
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/workbench.common.main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ registerSingleton(IAllowedMcpServersService, AllowedMcpServersService, Instantia
//#region --- workbench contributions

// Default Account
import './services/accounts/common/defaultAccount.js';
import './services/accounts/browser/defaultAccount.js';

// Telemetry
import './contrib/telemetry/browser/telemetry.contribution.js';
Expand Down
Loading