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
 |