Files
vscode/src/vs/base/node/unc.js
T
Benjamin Pasero 558e126e53 UNC host allow list should be case insensitive (fix #182277) (#182757)
* UNC host allow list should be case insensitive (fix #182277)

* only use `toLowerCase()`
2023-05-22 23:35:45 +09:00

138 lines
3.2 KiB
JavaScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
//@ts-check
(function () {
function factory() {
/**
* @returns {Set<string> | undefined}
*/
function processUNCHostAllowlist() {
// The property `process.uncHostAllowlist` is not available in official node.js
// releases, only in our own builds, so we have to probe for availability
return process.uncHostAllowlist;
}
/**
* @param {unknown} arg0
* @returns {string[]}
*/
function toSafeStringArray(arg0) {
const allowedUNCHosts = new Set();
if (Array.isArray(arg0)) {
for (const host of arg0) {
if (typeof host === 'string') {
allowedUNCHosts.add(host);
}
}
}
return Array.from(allowedUNCHosts);
}
/**
* @returns {string[]}
*/
function getUNCHostAllowlist() {
const allowlist = processUNCHostAllowlist();
if (allowlist) {
return Array.from(allowlist);
}
return [];
}
/**
* @param {string | string[]} allowedHost
*/
function addUNCHostToAllowlist(allowedHost) {
if (process.platform !== 'win32') {
return;
}
const allowlist = processUNCHostAllowlist();
if (allowlist) {
if (typeof allowedHost === 'string') {
allowlist.add(allowedHost.toLowerCase()); // UNC hosts are case-insensitive
} else {
for (const host of toSafeStringArray(allowedHost)) {
addUNCHostToAllowlist(host);
}
}
}
}
/**
* @param {string | undefined | null} maybeUNCPath
* @returns {string | undefined}
*/
function getUNCHost(maybeUNCPath) {
if (typeof maybeUNCPath !== 'string') {
return undefined; // require a valid string
}
const uncRoots = [
'\\\\.\\UNC\\', // DOS Device paths (https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats)
'\\\\?\\UNC\\',
'\\\\' // standard UNC path
];
let host = undefined;
for (const uncRoot of uncRoots) {
const indexOfUNCRoot = maybeUNCPath.indexOf(uncRoot);
if (indexOfUNCRoot !== 0) {
continue; // not matching any of our expected UNC roots
}
const indexOfUNCPath = maybeUNCPath.indexOf('\\', uncRoot.length);
if (indexOfUNCPath === -1) {
continue; // no path component found
}
const hostCandidate = maybeUNCPath.substring(uncRoot.length, indexOfUNCPath);
if (hostCandidate) {
host = hostCandidate;
break;
}
}
return host;
}
function disableUNCAccessRestrictions() {
if (process.platform !== 'win32') {
return;
}
process.enableUNCAccessChecks = false;
}
return {
getUNCHostAllowlist,
addUNCHostToAllowlist,
getUNCHost,
disableUNCAccessRestrictions
};
}
if (typeof define === 'function') {
// amd
define([], function () { return factory(); });
} else if (typeof module === 'object' && typeof module.exports === 'object') {
// commonjs
module.exports = factory();
} else {
console.trace('vs/base/node/unc defined in UNKNOWN context (neither requirejs or commonjs)');
}
})();