You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
const path = require('path');
|
|
|
|
const FILE_SCHEME = /^file:\/\//;
|
|
const WINDOWS_PREFIX = /^\/[A-Z]:/;
|
|
function _urlToPath(targetUrl) {
|
|
let withoutScheme = targetUrl.replace(FILE_SCHEME, '');
|
|
if (WINDOWS_PREFIX.test(withoutScheme)) {
|
|
withoutScheme = withoutScheme.slice(1);
|
|
}
|
|
|
|
const withoutQuerystring = withoutScheme.replace(/\?.*$/, '');
|
|
const withoutHash = withoutQuerystring.replace(/#.*$/, '');
|
|
|
|
return decodeURIComponent(withoutHash);
|
|
}
|
|
|
|
function _createFileHandler({ userDataPath, installPath }) {
|
|
return (request, callback) => {
|
|
// normalize() is primarily useful here for switching / to \ on windows
|
|
const target = path.normalize(_urlToPath(request.url));
|
|
|
|
if (!path.isAbsolute(target)) {
|
|
return callback();
|
|
}
|
|
|
|
if (!target.startsWith(userDataPath) && !target.startsWith(installPath)) {
|
|
console.log(`Warning: denying request to ${target}`);
|
|
return callback();
|
|
}
|
|
|
|
return callback({
|
|
path: target,
|
|
});
|
|
};
|
|
}
|
|
|
|
function installFileHandler({ protocol, userDataPath, installPath }) {
|
|
protocol.interceptFileProtocol(
|
|
'file',
|
|
_createFileHandler({ userDataPath, installPath })
|
|
);
|
|
}
|
|
|
|
// Turn off all browser web requests since we do all web requests via Node.js
|
|
function _webHandler(request, callback) {
|
|
return callback();
|
|
}
|
|
|
|
function installWebHandler({ protocol }) {
|
|
protocol.interceptFileProtocol('http', _webHandler);
|
|
protocol.interceptFileProtocol('https', _webHandler);
|
|
protocol.interceptFileProtocol('ftp', _webHandler);
|
|
}
|
|
|
|
module.exports = {
|
|
_urlToPath,
|
|
installFileHandler,
|
|
installWebHandler,
|
|
};
|