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.
		
		
		
		
		
			
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
| const path = require('path');
 | |
| const fs = require('fs');
 | |
| 
 | |
| function _eliminateAllAfterCharacter(string, character) {
 | |
|   const index = string.indexOf(character);
 | |
|   if (index < 0) {
 | |
|     return string;
 | |
|   }
 | |
| 
 | |
|   return string.slice(0, index);
 | |
| }
 | |
| 
 | |
| function _urlToPath(targetUrl, options = {}) {
 | |
|   const { isWindows } = options;
 | |
| 
 | |
|   const decoded = decodeURIComponent(targetUrl);
 | |
|   const withoutScheme = decoded.slice(isWindows ? 8 : 7);
 | |
|   const withoutQuerystring = _eliminateAllAfterCharacter(withoutScheme, '?');
 | |
|   const withoutHash = _eliminateAllAfterCharacter(withoutQuerystring, '#');
 | |
| 
 | |
|   return withoutHash;
 | |
| }
 | |
| 
 | |
| function _createFileHandler({ userDataPath, installPath, isWindows }) {
 | |
|   return (request, callback) => {
 | |
|     // normalize() is primarily useful here for switching / to \ on windows
 | |
|     const target = path.normalize(_urlToPath(request.url, { isWindows }));
 | |
|     // here we attempt to follow symlinks to the ultimate final path, reflective of what
 | |
|     //   we do in main.js on userDataPath and installPath
 | |
|     const realPath = fs.existsSync(target) ? fs.realpathSync(target) : target;
 | |
|     // finally we do case-insensitive checks on windows
 | |
|     const properCasing = isWindows ? realPath.toLowerCase() : realPath;
 | |
| 
 | |
|     if (!path.isAbsolute(realPath)) {
 | |
|       console.log(
 | |
|         `Warning: denying request to non-absolute path '${realPath}'`
 | |
|       );
 | |
|       return callback();
 | |
|     }
 | |
| 
 | |
|     if (
 | |
|       !properCasing.startsWith(
 | |
|         isWindows ? userDataPath.toLowerCase() : userDataPath
 | |
|       ) &&
 | |
|       !properCasing.startsWith(
 | |
|         isWindows ? installPath.toLowerCase() : installPath
 | |
|       )
 | |
|     ) {
 | |
|       console.log(
 | |
|         `Warning: denying request to path '${realPath}' (userDataPath: '${userDataPath}', installPath: '${installPath}')`
 | |
|       );
 | |
|       return callback();
 | |
|     }
 | |
| 
 | |
|     return callback({
 | |
|       path: realPath,
 | |
|     });
 | |
|   };
 | |
| }
 | |
| 
 | |
| function installFileHandler({
 | |
|   protocol,
 | |
|   userDataPath,
 | |
|   installPath,
 | |
|   isWindows,
 | |
| }) {
 | |
|   protocol.interceptFileProtocol(
 | |
|     'file',
 | |
|     _createFileHandler({ userDataPath, installPath, isWindows })
 | |
|   );
 | |
| }
 | |
| 
 | |
| // Turn off browser URI scheme since we do all network requests via Node.js
 | |
| function _disabledHandler(request, callback) {
 | |
|   return callback();
 | |
| }
 | |
| 
 | |
| function installWebHandler({ protocol }) {
 | |
|   protocol.interceptFileProtocol('about', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('content', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('chrome', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('cid', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('data', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('filesystem', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('ftp', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('gopher', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('http', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('https', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('javascript', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('mailto', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('ws', _disabledHandler);
 | |
|   protocol.interceptFileProtocol('wss', _disabledHandler);
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|   _urlToPath,
 | |
|   installFileHandler,
 | |
|   installWebHandler,
 | |
| };
 |