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
			| 
								 
											3 years ago
										 
									 | 
							
								"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
							 |