Return cancelled, not undefined for azure login (#11656)

* Return cancelled, not undefined.

* fallback to reject

* Add type to the rejection

* add default
This commit is contained in:
Amir Omidi
2020-08-05 14:48:47 -07:00
committed by GitHub
parent 28f1321ad7
commit 9c67832880
5 changed files with 15 additions and 11 deletions

View File

@@ -78,7 +78,7 @@ export abstract class AzureAuth implements vscode.Disposable {
} }
public async startLogin(): Promise<AzureAccount | azdata.PromptFailedResult> { public async startLogin(): Promise<AzureAccount | azdata.PromptFailedResult> {
let loginComplete: Deferred<void>; let loginComplete: Deferred<void, Error>;
try { try {
const result = await this.login(this.commonTenant, this.metadata.settings.microsoftResource); const result = await this.login(this.commonTenant, this.metadata.settings.microsoftResource);
loginComplete = result.authComplete; loginComplete = result.authComplete;
@@ -94,13 +94,17 @@ export abstract class AzureAuth implements vscode.Disposable {
} catch (ex) { } catch (ex) {
if (ex instanceof AzureAuthError) { if (ex instanceof AzureAuthError) {
if (loginComplete) { if (loginComplete) {
loginComplete.reject(ex.getPrintableString()); loginComplete.reject(ex);
} else { } else {
vscode.window.showErrorMessage(ex.getPrintableString()); vscode.window.showErrorMessage(ex.getPrintableString());
} }
} }
Logger.error(ex); Logger.error(ex);
return undefined; return {
canceled: false
};
} finally {
loginComplete?.reject(new AzureAuthError(localize('azureAuth.unidentifiedError', "Unidentified error with azure authentication"), 'Unidentified error with azure auth', undefined));
} }
} }
@@ -210,7 +214,7 @@ export abstract class AzureAuth implements vscode.Disposable {
protected abstract async login(tenant: Tenant, resource: Resource): Promise<{ response: OAuthTokenResponse, authComplete: Deferred<void> }>; protected abstract async login(tenant: Tenant, resource: Resource): Promise<{ response: OAuthTokenResponse, authComplete: Deferred<void, Error> }>;
/** /**
* Refreshes a token, if a refreshToken is passed in then we use that. If it is not passed in then we will prompt the user for consent. * Refreshes a token, if a refreshToken is passed in then we use that. If it is not passed in then we will prompt the user for consent.

View File

@@ -46,8 +46,8 @@ export class AzureAuthCodeGrant extends AzureAuth {
} }
protected async login(tenant: Tenant, resource: Resource): Promise<{ response: OAuthTokenResponse, authComplete: Deferred<void> }> { protected async login(tenant: Tenant, resource: Resource): Promise<{ response: OAuthTokenResponse, authComplete: Deferred<void, Error> }> {
let authCompleteDeferred: Deferred<void>; let authCompleteDeferred: Deferred<void, Error>;
let authCompletePromise = new Promise<void>((resolve, reject) => authCompleteDeferred = { resolve, reject }); let authCompletePromise = new Promise<void>((resolve, reject) => authCompleteDeferred = { resolve, reject });
let authResponse: AuthCodeResponse; let authResponse: AuthCodeResponse;

View File

@@ -58,8 +58,8 @@ export class AzureDeviceCode extends AzureAuth {
this.pageTitle = localize('addAccount', "Add {0} account", this.metadata.displayName); this.pageTitle = localize('addAccount', "Add {0} account", this.metadata.displayName);
} }
protected async login(tenant: Tenant, resource: Resource): Promise<{ response: OAuthTokenResponse, authComplete: Deferred<void> }> { protected async login(tenant: Tenant, resource: Resource): Promise<{ response: OAuthTokenResponse, authComplete: Deferred<void, Error> }> {
let authCompleteDeferred: Deferred<void>; let authCompleteDeferred: Deferred<void, Error>;
let authCompletePromise = new Promise<void>((resolve, reject) => authCompleteDeferred = { resolve, reject }); let authCompletePromise = new Promise<void>((resolve, reject) => authCompleteDeferred = { resolve, reject });
const uri = `${this.loginEndpointUrl}/${this.commonTenant.id}/oauth2/devicecode`; const uri = `${this.loginEndpointUrl}/${this.commonTenant.id}/oauth2/devicecode`;

View File

@@ -25,7 +25,7 @@ const localize = nls.loadMessageBundle();
export class AzureAccountProvider implements azdata.AccountProvider, vscode.Disposable { export class AzureAccountProvider implements azdata.AccountProvider, vscode.Disposable {
private static readonly CONFIGURATION_SECTION = 'accounts.azure.auth'; private static readonly CONFIGURATION_SECTION = 'accounts.azure.auth';
private readonly authMappings = new Map<AzureAuthType, AzureAuth>(); private readonly authMappings = new Map<AzureAuthType, AzureAuth>();
private initComplete: Deferred<void>; private initComplete: Deferred<void, Error>;
private initCompletePromise: Promise<void> = new Promise<void>((resolve, reject) => this.initComplete = { resolve, reject }); private initCompletePromise: Promise<void> = new Promise<void>((resolve, reject) => this.initComplete = { resolve, reject });
constructor( constructor(

View File

@@ -221,7 +221,7 @@ export interface AzureAccountSecurityToken {
*/ */
export type AzureAccountSecurityTokenCollection = { [tenantId: string]: AzureAccountSecurityToken }; export type AzureAccountSecurityTokenCollection = { [tenantId: string]: AzureAccountSecurityToken };
export interface Deferred<T> { export interface Deferred<T, E extends Error = Error> {
resolve: (result: T | Promise<T>) => void; resolve: (result: T | Promise<T>) => void;
reject: (reason: any) => void; reject: (reason: E) => void;
} }