-
Notifications
You must be signed in to change notification settings - Fork 55
Expand file tree
/
Copy pathauthApiInternal.ts
More file actions
68 lines (54 loc) · 3.82 KB
/
Copy pathauthApiInternal.ts
File metadata and controls
68 lines (54 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IActionContext, IParsedError, maskUserInfo, parseError } from '@microsoft/vscode-azext-utils';
import { l10n } from 'vscode';
import { AzExtCredentialManager } from '../../../api/src/auth/credentialManager/AzExtCredentialManager';
import { apiUtils } from '../../../api/src/utils/apiUtils';
import { azureExtensions } from '../../azureExtensions';
import { ext } from '../../extensionVariables';
import { localize } from '../../utils/localize';
const allowedExtensionIds = new Set(azureExtensions.map(extension => `${extension.publisher.toLowerCase()}.${extension.name.toLowerCase()}`));
export async function createAzureResourcesApiSessionInternal(context: IActionContext, credentialManager: AzExtCredentialManager, clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string): Promise<void> {
context.telemetry.properties.clientExtensionId = clientExtensionId;
context.telemetry.properties.clientExtensionVersion = clientExtensionVersion;
if (!allowedExtensionIds.has(clientExtensionId)) {
context.telemetry.properties.allowedExtension = 'false';
ext.outputChannel.warn(localize('createResourcesApiSession.denied', 'Azure Resources API session denied for extension "{0}".', clientExtensionId));
throw new Error('🧙 No, thank you! We don\'t want any more visitors, well-wishers, or distant relations! 🧝🦶');
}
context.telemetry.properties.allowedExtension = 'true';
try {
const clientApi = await apiUtils.getAzureExtensionApi(ext.context, clientExtensionId, clientExtensionVersion);
const azureResourcesCredential: string = await credentialManager.createCredential(clientExtensionId);
await clientApi.receiveAzureResourcesApiSession?.(azureResourcesCredential, clientExtensionCredential);
} catch (err) {
const failed: string = localize('createResourcesApiSession.failed', 'Failed to create Azure Resources API session for extension "{0}".', clientExtensionId);
ext.outputChannel.error(failed);
const perr: IParsedError = parseError(err);
const perrMessage: string = credentialManager.maskCredentials(perr.message);
context.telemetry.properties.createResourcesApiSessionError = maskUserInfo(perrMessage, []);
ext.outputChannel.error(perrMessage);
throw new Error(failed);
}
}
export const getApiVerifyError = (clientExtensionId?: string) => `${clientExtensionId || 'Unknown Extension'} - 🧙 YOU SHALL NOT PASS! 🔥`;
export async function verifyAzureResourcesApiSessionInternal(context: IActionContext, credentialManager: AzExtCredentialManager, clientExtensionId: string, azureResourcesCredential: string): Promise<boolean> {
const apiVerifyError: string = getApiVerifyError(clientExtensionId);
if (!clientExtensionId || !azureResourcesCredential) {
context.telemetry.properties.deniedReason = 'missingDetails';
throw new Error(apiVerifyError);
}
context.telemetry.properties.clientExtensionId = clientExtensionId;
let verified: boolean | undefined;
try {
verified = await credentialManager.verifyCredential(azureResourcesCredential, clientExtensionId);
} catch { /** Skip; handle below */ }
if (!verified) {
context.telemetry.properties.deniedReason = 'failedVerification';
ext.outputChannel.warn(l10n.t('Extension claiming to be "{0}" provided an access token that failed verification.', clientExtensionId));
throw new Error(apiVerifyError);
}
return verified;
}