From 8319f89b84c91dc1ccfb062d6fe6117a932fd162 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Tue, 6 Sep 2022 10:48:32 -0700 Subject: [PATCH] AzureAccountProvider & AzureAccountProviderService strict nulls (#20543) --- .../src/account-provider/auths/azureAuth.ts | 2 +- .../account-provider/azureAccountProvider.ts | 24 ++++++++++++------- .../azureAccountProviderService.ts | 24 ++++++++----------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/extensions/azurecore/src/account-provider/auths/azureAuth.ts b/extensions/azurecore/src/account-provider/auths/azureAuth.ts index 0728c46e75..3623f941a2 100644 --- a/extensions/azurecore/src/account-provider/auths/azureAuth.ts +++ b/extensions/azurecore/src/account-provider/auths/azureAuth.ts @@ -699,7 +699,7 @@ export interface RefreshToken extends AccountKey { } export interface MultiTenantTokenResponse { - [tenantId: string]: Token + [tenantId: string]: Token | undefined; } export interface Token extends AccountKey { diff --git a/extensions/azurecore/src/account-provider/azureAccountProvider.ts b/extensions/azurecore/src/account-provider/azureAccountProvider.ts index a0fe4040f0..bd9a66846a 100644 --- a/extensions/azurecore/src/account-provider/azureAccountProvider.ts +++ b/extensions/azurecore/src/account-provider/azureAccountProvider.ts @@ -25,7 +25,7 @@ const localize = nls.loadMessageBundle(); export class AzureAccountProvider implements azdata.AccountProvider, vscode.Disposable { private static readonly CONFIGURATION_SECTION = 'accounts.azure.auth'; private readonly authMappings = new Map(); - private initComplete: Deferred; + private initComplete!: Deferred; private initCompletePromise: Promise = new Promise((resolve, reject) => this.initComplete = { resolve, reject }); constructor( @@ -58,14 +58,15 @@ export class AzureAccountProvider implements azdata.AccountProvider, vscode.Disp this.authMappings.clear(); const configuration = vscode.workspace.getConfiguration(AzureAccountProvider.CONFIGURATION_SECTION); - const codeGrantMethod: boolean = configuration.get('codeGrant'); - const deviceCodeMethod: boolean = configuration.get('deviceCode'); + const codeGrantMethod: boolean = configuration.get('codeGrant', false); + const deviceCodeMethod: boolean = configuration.get('deviceCode', false); if (codeGrantMethod === true && !this.forceDeviceCode) { this.authMappings.set(AzureAuthType.AuthCodeGrant, new AzureAuthCodeGrant(metadata, tokenCache, context, uriEventHandler)); - } - if (deviceCodeMethod === true || this.forceDeviceCode) { + } else if (deviceCodeMethod === true || this.forceDeviceCode) { this.authMappings.set(AzureAuthType.DeviceCode, new AzureDeviceCode(metadata, tokenCache, context, uriEventHandler)); + } else { + console.error('No authentication methods selected'); } } @@ -74,12 +75,17 @@ export class AzureAccountProvider implements azdata.AccountProvider, vscode.Disp return this.authMappings.values().next().value; } - const authType: AzureAuthType = account?.properties?.azureAuthType; + const authType: AzureAuthType | undefined = account?.properties?.azureAuthType; if (authType) { - return this.authMappings.get(authType); - } else { - return this.authMappings.values().next().value; + const authMapping = this.authMappings.get(authType); + if (authMapping) { + return authMapping; + } } + if (this.authMappings.size === 0) { + throw new Error('No authentication mappings selected'); + } + return this.authMappings.values().next().value; } initialize(storedAccounts: AzureAccount[]): Thenable { diff --git a/extensions/azurecore/src/account-provider/azureAccountProviderService.ts b/extensions/azurecore/src/account-provider/azureAccountProviderService.ts index ce5554027f..4db21af239 100644 --- a/extensions/azurecore/src/account-provider/azureAccountProviderService.ts +++ b/extensions/azurecore/src/account-provider/azureAccountProviderService.ts @@ -30,22 +30,15 @@ export class AzureAccountProviderService implements vscode.Disposable { // MEMBER VARIABLES //////////////////////////////////////////////////////// private _disposables: vscode.Disposable[] = []; - private _accountDisposals: { [accountProviderId: string]: vscode.Disposable }; - private _accountProviders: { [accountProviderId: string]: azdata.AccountProvider }; - private _credentialProvider: azdata.CredentialProvider; - private _configChangePromiseChain: Thenable; - private _currentConfig: vscode.WorkspaceConfiguration; - private _event: events.EventEmitter; - private readonly _uriEventHandler: UriEventHandler; + private _accountDisposals: { [accountProviderId: string]: vscode.Disposable } = {}; + private _accountProviders: { [accountProviderId: string]: azdata.AccountProvider } = {}; + private _credentialProvider: azdata.CredentialProvider | undefined = undefined; + private _configChangePromiseChain: Thenable = Promise.resolve(); + private _currentConfig: vscode.WorkspaceConfiguration | undefined = undefined; + private _event: events.EventEmitter = new events.EventEmitter(); + private readonly _uriEventHandler: UriEventHandler = new UriEventHandler(); constructor(private _context: vscode.ExtensionContext, private _userStoragePath: string) { - this._accountDisposals = {}; - this._accountProviders = {}; - this._configChangePromiseChain = Promise.resolve(); - this._currentConfig = null; - this._event = new events.EventEmitter(); - - this._uriEventHandler = new UriEventHandler(); this._disposables.push(vscode.window.registerUriHandler(this._uriEventHandler)); } @@ -148,6 +141,9 @@ export class AzureAccountProviderService implements vscode.Disposable { try { const noSystemKeychain = vscode.workspace.getConfiguration('azure').get('noSystemKeychain'); let tokenCacheKey = `azureTokenCache-${provider.metadata.id}`; + if (!this._credentialProvider) { + throw new Error('Credential provider not registered'); + } let simpleTokenCache = new SimpleTokenCache(tokenCacheKey, this._userStoragePath, noSystemKeychain, this._credentialProvider); await simpleTokenCache.init();