You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							128 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
	
	
							128 lines
						
					
					
						
							5.4 KiB
						
					
					
				| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.validateSocksClientChainOptions = exports.validateSocksClientOptions = void 0;
 | |
| const util_1 = require("./util");
 | |
| const constants_1 = require("./constants");
 | |
| const stream = require("stream");
 | |
| /**
 | |
|  * Validates the provided SocksClientOptions
 | |
|  * @param options { SocksClientOptions }
 | |
|  * @param acceptedCommands { string[] } A list of accepted SocksProxy commands.
 | |
|  */
 | |
| function validateSocksClientOptions(options, acceptedCommands = ['connect', 'bind', 'associate']) {
 | |
|     // Check SOCKs command option.
 | |
|     if (!constants_1.SocksCommand[options.command]) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommand, options);
 | |
|     }
 | |
|     // Check SocksCommand for acceptable command.
 | |
|     if (acceptedCommands.indexOf(options.command) === -1) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandForOperation, options);
 | |
|     }
 | |
|     // Check destination
 | |
|     if (!isValidSocksRemoteHost(options.destination)) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options);
 | |
|     }
 | |
|     // Check SOCKS proxy to use
 | |
|     if (!isValidSocksProxy(options.proxy)) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options);
 | |
|     }
 | |
|     // Validate custom auth (if set)
 | |
|     validateCustomProxyAuth(options.proxy, options);
 | |
|     // Check timeout
 | |
|     if (options.timeout && !isValidTimeoutValue(options.timeout)) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options);
 | |
|     }
 | |
|     // Check existing_socket (if provided)
 | |
|     if (options.existing_socket &&
 | |
|         !(options.existing_socket instanceof stream.Duplex)) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsExistingSocket, options);
 | |
|     }
 | |
| }
 | |
| exports.validateSocksClientOptions = validateSocksClientOptions;
 | |
| /**
 | |
|  * Validates the SocksClientChainOptions
 | |
|  * @param options { SocksClientChainOptions }
 | |
|  */
 | |
| function validateSocksClientChainOptions(options) {
 | |
|     // Only connect is supported when chaining.
 | |
|     if (options.command !== 'connect') {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandChain, options);
 | |
|     }
 | |
|     // Check destination
 | |
|     if (!isValidSocksRemoteHost(options.destination)) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options);
 | |
|     }
 | |
|     // Validate proxies (length)
 | |
|     if (!(options.proxies &&
 | |
|         Array.isArray(options.proxies) &&
 | |
|         options.proxies.length >= 2)) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxiesLength, options);
 | |
|     }
 | |
|     // Validate proxies
 | |
|     options.proxies.forEach((proxy) => {
 | |
|         if (!isValidSocksProxy(proxy)) {
 | |
|             throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options);
 | |
|         }
 | |
|         // Validate custom auth (if set)
 | |
|         validateCustomProxyAuth(proxy, options);
 | |
|     });
 | |
|     // Check timeout
 | |
|     if (options.timeout && !isValidTimeoutValue(options.timeout)) {
 | |
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options);
 | |
|     }
 | |
| }
 | |
| exports.validateSocksClientChainOptions = validateSocksClientChainOptions;
 | |
| function validateCustomProxyAuth(proxy, options) {
 | |
|     if (proxy.custom_auth_method !== undefined) {
 | |
|         // Invalid auth method range
 | |
|         if (proxy.custom_auth_method < constants_1.SOCKS5_CUSTOM_AUTH_START ||
 | |
|             proxy.custom_auth_method > constants_1.SOCKS5_CUSTOM_AUTH_END) {
 | |
|             throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthRange, options);
 | |
|         }
 | |
|         // Missing custom_auth_request_handler
 | |
|         if (proxy.custom_auth_request_handler === undefined ||
 | |
|             typeof proxy.custom_auth_request_handler !== 'function') {
 | |
|             throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options);
 | |
|         }
 | |
|         // Missing custom_auth_response_size
 | |
|         if (proxy.custom_auth_response_size === undefined) {
 | |
|             throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options);
 | |
|         }
 | |
|         // Missing/invalid custom_auth_response_handler
 | |
|         if (proxy.custom_auth_response_handler === undefined ||
 | |
|             typeof proxy.custom_auth_response_handler !== 'function') {
 | |
|             throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| /**
 | |
|  * Validates a SocksRemoteHost
 | |
|  * @param remoteHost { SocksRemoteHost }
 | |
|  */
 | |
| function isValidSocksRemoteHost(remoteHost) {
 | |
|     return (remoteHost &&
 | |
|         typeof remoteHost.host === 'string' &&
 | |
|         typeof remoteHost.port === 'number' &&
 | |
|         remoteHost.port >= 0 &&
 | |
|         remoteHost.port <= 65535);
 | |
| }
 | |
| /**
 | |
|  * Validates a SocksProxy
 | |
|  * @param proxy { SocksProxy }
 | |
|  */
 | |
| function isValidSocksProxy(proxy) {
 | |
|     return (proxy &&
 | |
|         (typeof proxy.host === 'string' || typeof proxy.ipaddress === 'string') &&
 | |
|         typeof proxy.port === 'number' &&
 | |
|         proxy.port >= 0 &&
 | |
|         proxy.port <= 65535 &&
 | |
|         (proxy.type === 4 || proxy.type === 5));
 | |
| }
 | |
| /**
 | |
|  * Validates a timeout value.
 | |
|  * @param value { Number }
 | |
|  */
 | |
| function isValidTimeoutValue(value) {
 | |
|     return typeof value === 'number' && value > 0;
 | |
| }
 | |
| //# sourceMappingURL=helpers.js.map
 |