Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/microsoft-authentication/src/extension.ts
5237 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Environment, EnvironmentParameters } from '@azure/ms-rest-azure-env';
7
import Logger from './logger';
8
import { MsalAuthProvider } from './node/authProvider';
9
import { UriEventHandler } from './UriEventHandler';
10
import { authentication, commands, ExtensionContext, l10n, window, workspace, Disposable, Uri } from 'vscode';
11
import { MicrosoftAuthenticationTelemetryReporter, MicrosoftSovereignCloudAuthenticationTelemetryReporter } from './common/telemetryReporter';
12
13
let implementation: 'msal' | 'msal-no-broker' = 'msal';
14
const getImplementation = () => workspace.getConfiguration('microsoft-authentication').get<'msal' | 'msal-no-broker'>('implementation') ?? 'msal';
15
16
async function initMicrosoftSovereignCloudAuthProvider(
17
context: ExtensionContext,
18
uriHandler: UriEventHandler
19
): Promise<Disposable | undefined> {
20
const environment = workspace.getConfiguration('microsoft-sovereign-cloud').get<string | undefined>('environment');
21
let authProviderName: string | undefined;
22
if (!environment) {
23
return undefined;
24
}
25
26
if (environment === 'custom') {
27
const customEnv = workspace.getConfiguration('microsoft-sovereign-cloud').get<EnvironmentParameters>('customEnvironment');
28
if (!customEnv) {
29
const res = await window.showErrorMessage(l10n.t('You must also specify a custom environment in order to use the custom environment auth provider.'), l10n.t('Open settings'));
30
if (res) {
31
await commands.executeCommand('workbench.action.openSettingsJson', 'microsoft-sovereign-cloud.customEnvironment');
32
}
33
return undefined;
34
}
35
try {
36
Environment.add(customEnv);
37
} catch (e) {
38
const res = await window.showErrorMessage(l10n.t('Error validating custom environment setting: {0}', e.message), l10n.t('Open settings'));
39
if (res) {
40
await commands.executeCommand('workbench.action.openSettings', 'microsoft-sovereign-cloud.customEnvironment');
41
}
42
return undefined;
43
}
44
authProviderName = customEnv.name;
45
} else {
46
authProviderName = environment;
47
}
48
49
const env = Environment.get(authProviderName);
50
if (!env) {
51
await window.showErrorMessage(l10n.t('The environment `{0}` is not a valid environment.', authProviderName), l10n.t('Open settings'));
52
return undefined;
53
}
54
55
const authProvider = await MsalAuthProvider.create(
56
context,
57
new MicrosoftSovereignCloudAuthenticationTelemetryReporter(context.extension.packageJSON.aiKey),
58
window.createOutputChannel(l10n.t('Microsoft Sovereign Cloud Authentication'), { log: true }),
59
uriHandler,
60
env
61
);
62
const disposable = authentication.registerAuthenticationProvider(
63
'microsoft-sovereign-cloud',
64
authProviderName,
65
authProvider,
66
{ supportsMultipleAccounts: true, supportsChallenges: true }
67
);
68
context.subscriptions.push(disposable);
69
return disposable;
70
}
71
72
export async function activate(context: ExtensionContext) {
73
const mainTelemetryReporter = new MicrosoftAuthenticationTelemetryReporter(context.extension.packageJSON.aiKey);
74
implementation = getImplementation();
75
context.subscriptions.push(workspace.onDidChangeConfiguration(async e => {
76
if (!e.affectsConfiguration('microsoft-authentication')) {
77
return;
78
}
79
if (implementation === getImplementation()) {
80
return;
81
}
82
83
// Allow for the migration to be re-attempted if the user switches back to the MSAL implementation
84
context.globalState.update('msalMigration', undefined);
85
86
const reload = l10n.t('Reload');
87
const result = await window.showInformationMessage(
88
'Reload required',
89
{
90
modal: true,
91
detail: l10n.t('Microsoft Account configuration has been changed.'),
92
},
93
reload
94
);
95
96
if (result === reload) {
97
commands.executeCommand('workbench.action.reloadWindow');
98
}
99
}));
100
101
switch (implementation) {
102
case 'msal-no-broker':
103
mainTelemetryReporter.sendActivatedWithMsalNoBrokerEvent();
104
break;
105
case 'msal':
106
default:
107
break;
108
}
109
110
const uriHandler = new UriEventHandler();
111
context.subscriptions.push(uriHandler);
112
const authProvider = await MsalAuthProvider.create(
113
context,
114
mainTelemetryReporter,
115
Logger,
116
uriHandler
117
);
118
context.subscriptions.push(authentication.registerAuthenticationProvider(
119
'microsoft',
120
'Microsoft',
121
authProvider,
122
{
123
supportsMultipleAccounts: true,
124
supportsChallenges: true,
125
supportedAuthorizationServers: [
126
Uri.parse('https://login.microsoftonline.com/*'),
127
Uri.parse('https://login.microsoftonline.com/*/v2.0')
128
]
129
}
130
));
131
132
let microsoftSovereignCloudAuthProviderDisposable = await initMicrosoftSovereignCloudAuthProvider(context, uriHandler);
133
134
context.subscriptions.push(workspace.onDidChangeConfiguration(async e => {
135
if (e.affectsConfiguration('microsoft-sovereign-cloud')) {
136
microsoftSovereignCloudAuthProviderDisposable?.dispose();
137
microsoftSovereignCloudAuthProviderDisposable = await initMicrosoftSovereignCloudAuthProvider(context, uriHandler);
138
}
139
}));
140
}
141
142
export function deactivate() {
143
Logger.info('Microsoft Authentication is deactivating...');
144
}
145
146