mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-26 13:19:42 +00:00
Adopt the MSAL broker to talk to the OS for Microsoft auth (#233739)
This adopts the `NativeBrokerPlugin` provided by `@azure/msal-node-extensions` to provide the ability to use auth state from the OS, and show native auth dialogs instead of going to the browser.
This has several pieces:
* The adoption of the broker in the microsoft-authentication extension:
* Adding `NativeBrokerPlugin` to our PCAs
* Using the proposed handle API to pass the native window handle down to MSAL calls (btw, this API will change in a follow up PR)
* Adopting an AccountAccess layer to handle:
* giving the user control of which accounts VS Code uses
* an eventing layer so that auth state can be updated across multiple windows
* Getting the extension to build properly and only build what it really needs. This required several package.json/webpack hacks:
* Use a fake keytar since we don't use the feature in `@azure/msal-node-extensions` that uses keytar
* Use a fake dpapi layer since we don't use the feature in `@azure/msal-node-extensions` that uses it
* Ensure the msal runtime `.node` and `.dll` files are included in the bundle
* Get the VS Code build to allow a native node module in an extension: by having a list of native extensions that will be built in the "ci" part of the build - in other words when VS Code is building on the target platform
There are a couple of followups:
* Refactor the `handle` API to handle (heh) Auxiliary Windows https://github.com/microsoft/vscode/issues/233106
* Separate the call to `acquireTokenSilent` and `acquireTokenInteractive` and all the usage of this native node module into a separate process or maybe in Core... we'll see. Something to experiment with after we have something working. NEEDS FOLLOW UP ISSUE
Fixes https://github.com/microsoft/vscode/issues/229431
This commit is contained in:
committed by
GitHub
parent
681164aaaa
commit
305134296c
@@ -277,6 +277,14 @@ export function fromGithub({ name, version, repo, sha256, metadata }: IExtension
|
||||
.pipe(packageJsonFilter.restore);
|
||||
}
|
||||
|
||||
/**
|
||||
* All extensions that are known to have some native component and thus must be built on the
|
||||
* platform that is being built.
|
||||
*/
|
||||
const nativeExtensions = [
|
||||
'microsoft-authentication',
|
||||
];
|
||||
|
||||
const excludedExtensions = [
|
||||
'vscode-api-tests',
|
||||
'vscode-colorize-tests',
|
||||
@@ -334,7 +342,49 @@ function isWebExtension(manifest: IExtensionManifest): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
export function packageLocalExtensionsStream(forWeb: boolean, disableMangle: boolean): Stream {
|
||||
/**
|
||||
* Package local extensions that are known to not have native dependencies. Mutually exclusive to {@link packageNativeLocalExtensionsStream}.
|
||||
* @param forWeb build the extensions that have web targets
|
||||
* @param disableMangle disable the mangler
|
||||
* @returns a stream
|
||||
*/
|
||||
export function packageNonNativeLocalExtensionsStream(forWeb: boolean, disableMangle: boolean): Stream {
|
||||
return doPackageLocalExtensionsStream(forWeb, disableMangle, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Package local extensions that are known to have native dependencies. Mutually exclusive to {@link packageNonNativeLocalExtensionsStream}.
|
||||
* @note it's possible that the extension does not have native dependencies for the current platform, especially if building for the web,
|
||||
* but we simplify the logic here by having a flat list of extensions (See {@link nativeExtensions}) that are known to have native
|
||||
* dependencies on some platform and thus should be packaged on the platform that they are building for.
|
||||
* @param forWeb build the extensions that have web targets
|
||||
* @param disableMangle disable the mangler
|
||||
* @returns a stream
|
||||
*/
|
||||
export function packageNativeLocalExtensionsStream(forWeb: boolean, disableMangle: boolean): Stream {
|
||||
return doPackageLocalExtensionsStream(forWeb, disableMangle, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Package all the local extensions... both those that are known to have native dependencies and those that are not.
|
||||
* @param forWeb build the extensions that have web targets
|
||||
* @param disableMangle disable the mangler
|
||||
* @returns a stream
|
||||
*/
|
||||
export function packageAllLocalExtensionsStream(forWeb: boolean, disableMangle: boolean): Stream {
|
||||
return es.merge([
|
||||
packageNonNativeLocalExtensionsStream(forWeb, disableMangle),
|
||||
packageNativeLocalExtensionsStream(forWeb, disableMangle)
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param forWeb build the extensions that have web targets
|
||||
* @param disableMangle disable the mangler
|
||||
* @param native build the extensions that are marked as having native dependencies
|
||||
*/
|
||||
function doPackageLocalExtensionsStream(forWeb: boolean, disableMangle: boolean, native: boolean): Stream {
|
||||
const nativeExtensionsSet = new Set(nativeExtensions);
|
||||
const localExtensionsDescriptions = (
|
||||
(<string[]>glob.sync('extensions/*/package.json'))
|
||||
.map(manifestPath => {
|
||||
@@ -343,6 +393,7 @@ export function packageLocalExtensionsStream(forWeb: boolean, disableMangle: boo
|
||||
const extensionName = path.basename(extensionPath);
|
||||
return { name: extensionName, path: extensionPath, manifestPath: absoluteManifestPath };
|
||||
})
|
||||
.filter(({ name }) => native ? nativeExtensionsSet.has(name) : !nativeExtensionsSet.has(name))
|
||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||
.filter(({ manifestPath }) => (forWeb ? isWebExtension(require(manifestPath)) : true))
|
||||
|
||||
Reference in New Issue
Block a user