diff --git a/README.md b/README.md index 5cadb7b..7076751 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![GitHub license](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=for-the-badge)](LICENSE) -[![GitHub license](https://img.shields.io/badge/install-MacOSX-blue.svg?style=for-the-badge&logo=apple)](https://github.com/dfinity/http-proxy/releases/download/0.0.2-alpha/ic-http-proxy-mac-universal-0.0.2-alpha.dmg) -[![GitHub license](https://img.shields.io/badge/install-Windows-blue.svg?style=for-the-badge&logo=windows)](https://github.com/dfinity/http-proxy/releases/download/0.0.2-alpha/ic-http-proxy-win-x64-0.0.2-alpha.exe) +[![GitHub license](https://img.shields.io/badge/install-MacOSX-blue.svg?style=for-the-badge&logo=apple)](https://github.com/dfinity/http-proxy/releases/download/0.0.3-alpha/ic-http-proxy-mac-universal-0.0.3-alpha.dmg) +[![GitHub license](https://img.shields.io/badge/install-Windows-blue.svg?style=for-the-badge&logo=windows)](https://github.com/dfinity/http-proxy/releases/download/0.0.3-alpha/ic-http-proxy-win-x64-0.0.3-alpha.exe) # IC HTTP Proxy > This application is currently only a proof of concept implementation and should be used at your own risk. diff --git a/package.json b/package.json index 0d469f9..1f67674 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dfinity/http-proxy", - "version": "0.0.2-alpha", + "version": "0.0.3-alpha", "description": "HTTP Proxy to enable trustless access to the Internet Computer.", "author": "Kepler Vital ", "license": "Apache-2.0", diff --git a/packages/core/package.json b/packages/core/package.json index f1ceef2..5d72a49 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@dfinity/http-proxy-core", - "version": "0.0.2-alpha", + "version": "0.0.3-alpha", "description": "Gateway server to enable trustless access to the Internet Computer.", "main": "built/main.js", "types": "built/main.d.ts", diff --git a/packages/daemon/package.json b/packages/daemon/package.json index c084913..1329816 100644 --- a/packages/daemon/package.json +++ b/packages/daemon/package.json @@ -1,6 +1,6 @@ { "name": "@dfinity/http-proxy-daemon", - "version": "0.0.2-alpha", + "version": "0.0.3-alpha", "description": "Daemon process to enable trustless access to the Internet Computer.", "main": "built/main.js", "types": "built/main.d.ts", @@ -59,7 +59,7 @@ "typescript": "^4.9.5" }, "dependencies": { - "@dfinity/http-proxy-core": "0.0.2-alpha", + "@dfinity/http-proxy-core": "0.0.3-alpha", "http-proxy": "^1.18.1", "node-cache": "^5.1.2", "node-forge": "^1.3.1", diff --git a/packages/daemon/src/daemon.ts b/packages/daemon/src/daemon.ts index 5f7810a..3116c7e 100644 --- a/packages/daemon/src/daemon.ts +++ b/packages/daemon/src/daemon.ts @@ -59,6 +59,7 @@ export class Daemon { host: message.host, port: message.port, }, + pac: message.pac, }); await this.platform.attach(); diff --git a/packages/daemon/src/platforms/factory.ts b/packages/daemon/src/platforms/factory.ts index a491e0d..d3b0082 100644 --- a/packages/daemon/src/platforms/factory.ts +++ b/packages/daemon/src/platforms/factory.ts @@ -13,11 +13,13 @@ export class PlatformFactory { return new MacPlatform({ ca: configs.ca, proxy: configs.proxy, + pac: configs.pac, }); case SupportedPlatforms.Windows: return new WindowsPlatform({ ca: configs.ca, proxy: configs.proxy, + pac: configs.pac, }); default: throw new UnsupportedPlatformError('unknown'); diff --git a/packages/daemon/src/platforms/mac/mac.ts b/packages/daemon/src/platforms/mac/mac.ts index 37e634a..fd12db2 100644 --- a/packages/daemon/src/platforms/mac/mac.ts +++ b/packages/daemon/src/platforms/mac/mac.ts @@ -2,15 +2,11 @@ import { execAsync, getFile, logger, saveFile } from '@dfinity/http-proxy-core'; import { exec } from 'child_process'; import { resolve } from 'path'; import { Platform } from '../typings'; -import { - PlatformConfigs, - PlatformProxyInfo, - WebProxyConfiguration, -} from './typings'; +import { PlatformConfigs, PlatformProxyInfo } from './typings'; import { CURL_RC_FILE, SHELL_SCRIPT_SEPARATOR, - resolveNetworkInfo, + getActiveNetworkService, } from './utils'; export class MacPlatform implements Platform { @@ -114,9 +110,8 @@ export class MacPlatform implements Platform { encoding: 'utf-8', }); - // configure proxy in all network interfaces - const networkInfo = await resolveNetworkInfo({ host, port }); - await this.tooggleNetworkWebProxy(networkInfo, enable); + // configure proxy to the active network interface + await this.tooggleNetworkWebProxy(enable); ok(); } catch (e) { @@ -126,48 +121,28 @@ export class MacPlatform implements Platform { }); } - private async tooggleNetworkWebProxy( - networkPorts: Map, - enable: boolean - ): Promise { - const hasIncorrectStatus = Array.from(networkPorts.values()).some( - (proxy) => proxy.http.enabled !== enable || proxy.https.enabled !== enable - ); + private async tooggleNetworkWebProxy(enable: boolean): Promise { + const networkService = getActiveNetworkService(); - if (!hasIncorrectStatus) { - return; + if (!networkService) { + throw new Error('no active network service found'); } + const status = enable ? 'on' : 'off'; const commands: string[] = []; // enable admin privileges commands.push( `security authorizationdb write com.apple.trust-settings.admin allow` ); - // set proxy host configuration - for (const [port, proxyStatus] of networkPorts.entries()) { - if (!proxyStatus.http.enabled) { - commands.push( - `networksetup -setwebproxy "${port}" ${this.configs.proxy.host} ${this.configs.proxy.port}` - ); - } - if (!proxyStatus.https.enabled) { - commands.push( - `networksetup -setsecurewebproxy "${port}" ${this.configs.proxy.host} ${this.configs.proxy.port}` - ); - } - } - const status = enable ? 'on' : 'off'; - // toggle web proxy for all network interfaces - for (const [port, proxyStatus] of networkPorts.entries()) { - if (proxyStatus.http.enabled !== enable) { - commands.push(`networksetup -setwebproxystate "${port}" ${status}`); - } - if (proxyStatus.https.enabled !== enable) { - commands.push( - `networksetup -setsecurewebproxystate "${port}" ${status}` - ); - } + // toggle web proxy for the active network interface + if (enable) { + commands.push( + `networksetup -setautoproxyurl "${networkService}" "http://${this.configs.pac.host}:${this.configs.pac.port}/proxy.pac"` + ); } + commands.push( + `networksetup -setautoproxystate "${networkService}" ${status}` + ); // remove admin privileges commands.push( `security authorizationdb remove com.apple.trust-settings.admin` diff --git a/packages/daemon/src/platforms/mac/typings.ts b/packages/daemon/src/platforms/mac/typings.ts index 09a0f4a..66c6a94 100644 --- a/packages/daemon/src/platforms/mac/typings.ts +++ b/packages/daemon/src/platforms/mac/typings.ts @@ -1,4 +1,4 @@ -import { PlatformRootCA } from '../typings'; +import { PlatformPacInfo, PlatformRootCA } from '../typings'; export interface PlatformProxyInfo { host: string; @@ -8,6 +8,7 @@ export interface PlatformProxyInfo { export interface PlatformConfigs { ca: PlatformRootCA; proxy: PlatformProxyInfo; + pac: PlatformPacInfo; } export interface SystemWebProxyInfo { diff --git a/packages/daemon/src/platforms/mac/utils.ts b/packages/daemon/src/platforms/mac/utils.ts index 9f96cd5..c954294 100644 --- a/packages/daemon/src/platforms/mac/utils.ts +++ b/packages/daemon/src/platforms/mac/utils.ts @@ -1,92 +1,25 @@ -import { exec } from 'child_process'; -import { WebProxyConfiguration } from './typings'; -import { PlatformProxyInfo } from '../typings'; +import { execSync } from 'child_process'; export const SHELL_SCRIPT_SEPARATOR = ' ; '; export const CURL_RC_FILE = '.curlrc'; export const PROXY_GET_SEPARATOR = ':ic-separator:'; -export const resolveNetworkInfo = async ( - proxy: PlatformProxyInfo -): Promise> => { - const ports = await fetchHardwarePorts(); - const networkInfo = new Map(); - for (const port of ports) { - const webProxyState = await fetchNetworkWebProxy(port, proxy); - networkInfo.set(port, webProxyState); +export const getActiveNetworkService = (): string | null => { + const networkServices = execSync( + `networksetup -listallnetworkservices | tail -n +2` + ) + .toString() + .split('\n'); + for (const networkService of networkServices) { + const assignedIpAddress = execSync( + `networksetup -getinfo "${networkService}" | awk '/^IP address:/{print $3}'` + ) + .toString() + .trim(); + if (assignedIpAddress.length > 0) { + return networkService; + } } - return networkInfo; -}; - -export const fetchHardwarePorts = async (): Promise => { - return new Promise((ok, err) => { - exec( - `networksetup -listnetworkserviceorder | grep 'Hardware Port'`, - (error, stdout) => { - if (error) { - return err(error); - } - - const ports = stdout - .split('\n') - .map((line) => { - const [, port] = - line.match(new RegExp(/Hardware Port:\s(.*),.*/)) ?? []; - - return port; - }) - .filter((port) => !!port) as string[]; - - ok(ports); - } - ); - }); -}; - -export const fetchNetworkWebProxy = async ( - networkHardwarePort = 'wi-fi', - proxy: PlatformProxyInfo -): Promise => { - return new Promise(async (ok, err) => { - const shellScript = - `networksetup -getwebproxy "${networkHardwarePort}"` + - SHELL_SCRIPT_SEPARATOR + - `echo "${PROXY_GET_SEPARATOR}"` + - SHELL_SCRIPT_SEPARATOR + - `networksetup -getsecurewebproxy "${networkHardwarePort}"`; - - exec(`${shellScript}`, (error, stdout) => { - if (error) { - return err(error); - } - - const [rawHttpProxy, rawHttpsProxy] = stdout.split(PROXY_GET_SEPARATOR); - - const isEnabled = (parts: string[]): boolean => { - const sameProxyHost = parts.some((part) => { - const [, host] = - part.trim().match(new RegExp(/^Server:\s+(.*)/)) ?? []; - return host ? host === proxy.host : false; - }); - const sameProxyPort = parts.some((part) => { - const [, port] = part.trim().match(new RegExp(/^Port:\s+(.*)/)) ?? []; - return port ? Number(port) === proxy.port : false; - }); - const isEnabled = parts.some((part) => { - const [, enabled] = - part.trim().match(new RegExp(/^Enabled:\s+(.*)/)) ?? []; - - return enabled ? enabled.toLowerCase() === 'yes' : false; - }); - - return sameProxyHost && sameProxyPort && isEnabled; - }; - - ok({ - http: { enabled: isEnabled(rawHttpProxy.split('\n')) }, - https: { enabled: isEnabled(rawHttpsProxy.split('\n')) }, - }); - }); - }); + return null; }; diff --git a/packages/daemon/src/platforms/typings.ts b/packages/daemon/src/platforms/typings.ts index 1c14698..72b4392 100644 --- a/packages/daemon/src/platforms/typings.ts +++ b/packages/daemon/src/platforms/typings.ts @@ -13,8 +13,11 @@ export interface PlatformProxyInfo { port: number; } +export type PlatformPacInfo = PlatformProxyInfo; + export interface PlatformBuildConfigs { platform: string; ca: PlatformRootCA; proxy: PlatformProxyInfo; + pac: PlatformPacInfo; } diff --git a/packages/daemon/src/platforms/utils.ts b/packages/daemon/src/platforms/utils.ts new file mode 100644 index 0000000..b47f705 --- /dev/null +++ b/packages/daemon/src/platforms/utils.ts @@ -0,0 +1,14 @@ +export const PAC_FILE_NAME = 'ic-proxy.pac'; + +export const getProxyAutoConfiguration = ( + proxyHost: string, + proxyPort: number +): string => { + return `function FindProxyForURL(url, host) { + if (url.startsWith("https:") || url.startsWith("http:")) { + return "PROXY ${proxyHost}:${proxyPort}; DIRECT"; + } + + return "DIRECT"; + }`; +}; diff --git a/packages/daemon/src/platforms/windows/typings.ts b/packages/daemon/src/platforms/windows/typings.ts index 09a0f4a..66c6a94 100644 --- a/packages/daemon/src/platforms/windows/typings.ts +++ b/packages/daemon/src/platforms/windows/typings.ts @@ -1,4 +1,4 @@ -import { PlatformRootCA } from '../typings'; +import { PlatformPacInfo, PlatformRootCA } from '../typings'; export interface PlatformProxyInfo { host: string; @@ -8,6 +8,7 @@ export interface PlatformProxyInfo { export interface PlatformConfigs { ca: PlatformRootCA; proxy: PlatformProxyInfo; + pac: PlatformPacInfo; } export interface SystemWebProxyInfo { diff --git a/packages/daemon/src/platforms/windows/windows.ts b/packages/daemon/src/platforms/windows/windows.ts index 1b0e957..13d3511 100644 --- a/packages/daemon/src/platforms/windows/windows.ts +++ b/packages/daemon/src/platforms/windows/windows.ts @@ -20,8 +20,8 @@ export class WindowsPlatform implements Platform { this.configs.ca.commonName ); await this.configureWebProxy(true, { - host: this.configs.proxy.host, - port: this.configs.proxy.port, + host: this.configs.pac.host, + port: this.configs.pac.port, }); } @@ -39,8 +39,8 @@ export class WindowsPlatform implements Platform { this.configs.ca.commonName ); await this.configureWebProxy(false, { - host: this.configs.proxy.host, - port: this.configs.proxy.port, + host: this.configs.pac.host, + port: this.configs.pac.port, }); } @@ -74,8 +74,8 @@ export class WindowsPlatform implements Platform { return new Promise(async (ok, err) => { try { const updateInternetSettingsProxy = enable - ? `powershell -command "Set-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings' -name ProxyServer -Value 'http://${host}:${port}'"` - : `powershell -command "Set-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings' -name ProxyServer -Value ''"`; + ? `powershell -command "Set-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings' -name AutoConfigURL -Value 'http://${host}:${port}/proxy.pac'"` + : `powershell -command "Set-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings' -name AutoConfigURL -Value ''"`; const updateInternetSettingsEnabled = enable ? `powershell -command "Set-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings' ProxyEnable -value 1"` diff --git a/packages/daemon/src/typings.ts b/packages/daemon/src/typings.ts index 8d6d52d..55992be 100644 --- a/packages/daemon/src/typings.ts +++ b/packages/daemon/src/typings.ts @@ -15,6 +15,10 @@ export interface EnableProxyMessage { type: MessageType.EnableProxy; host: string; port: number; + pac: { + host: string; + port: number; + }; certificatePath: string; commonName: string; } diff --git a/packages/server/package.json b/packages/server/package.json index 394a2aa..61017a5 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@dfinity/http-proxy-server", - "version": "0.0.2-alpha", + "version": "0.0.3-alpha", "description": "Gateway server to enable trustless access to the Internet Computer.", "main": "built/main.js", "types": "built/main.d.ts", @@ -51,8 +51,8 @@ "dependencies": { "@dfinity/agent": "^0.15.6", "@dfinity/candid": "^0.15.6", - "@dfinity/http-proxy-core": "0.0.2-alpha", - "@dfinity/http-proxy-daemon": "0.0.2-alpha", + "@dfinity/http-proxy-core": "0.0.3-alpha", + "@dfinity/http-proxy-daemon": "0.0.3-alpha", "@dfinity/principal": "^0.15.6", "@dfinity/response-verification": "^0.2.1", "http-proxy": "^1.18.1", diff --git a/packages/server/src/commons/configs.ts b/packages/server/src/commons/configs.ts index 10d5414..0aa9cec 100644 --- a/packages/server/src/commons/configs.ts +++ b/packages/server/src/commons/configs.ts @@ -3,7 +3,7 @@ import { EnvironmentConfiguration } from './typings'; const environment: EnvironmentConfiguration = { platform: os.platform(), - userAgent: 'ICHttpProxy/0.0.2-alpha', + userAgent: 'ICHttpProxy/0.0.3-alpha', certificate: { storage: { folder: 'certs', @@ -15,6 +15,10 @@ const environment: EnvironmentConfiguration = { organizationUnit: 'IC', }, }, + proxyConfigServer: { + host: '127.0.0.1', + port: 4049, + }, netServer: { host: '127.0.0.1', port: 4050, diff --git a/packages/server/src/commons/typings.ts b/packages/server/src/commons/typings.ts index 2c5f76e..f2aacd2 100644 --- a/packages/server/src/commons/typings.ts +++ b/packages/server/src/commons/typings.ts @@ -10,10 +10,13 @@ export interface NetServerConfiguration { port: number; } +export type ProxyConfigServerConfiguration = NetServerConfiguration; + export interface EnvironmentConfiguration { userAgent: string; platform: string; certificate: CertificateConfiguration; + proxyConfigServer: ProxyConfigServerConfiguration; netServer: NetServerConfiguration; icpServer: ICPServerConfiguration; } diff --git a/packages/server/src/servers/config/index.ts b/packages/server/src/servers/config/index.ts new file mode 100644 index 0000000..a8f100a --- /dev/null +++ b/packages/server/src/servers/config/index.ts @@ -0,0 +1,70 @@ +import { logger } from '@dfinity/http-proxy-core'; +import http from 'http'; +import { ProxyConfigOpts } from './typings'; + +export class ProxyConfigurationServer { + private constructor( + private readonly server: http.Server, + private readonly opts: ProxyConfigOpts + ) {} + + public static create(opts: ProxyConfigOpts): ProxyConfigurationServer { + const server = new ProxyConfigurationServer(http.createServer(), opts); + server.init(); + + return server; + } + + private init(): void { + this.server.on('close', this.onClose.bind(this)); + this.server.on('request', (req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'application/x-ns-proxy-autoconfig'); + // use the proxy for all http and https requests, + // if the proxy server goes down fallback to a direct connection + res.end( + `function FindProxyForURL(url, host) { + if (url.startsWith("https:") || url.startsWith("http:")) { + return "PROXY ${this.opts.proxyServer.host}:${this.opts.proxyServer.port}; DIRECT"; + } + + return "DIRECT"; + }`.trim() + ); + }); + } + + public async shutdown(): Promise { + logger.info('Shutting down proxy configuration server.'); + return new Promise((ok) => this.server.close(() => ok())); + } + + public async start(): Promise { + return new Promise((ok, err) => { + const onListenError = (e: Error) => { + if ('code' in e && e.code === 'EADDRINUSE') { + this.server.close(); + } + + return err(e); + }; + + this.server.addListener('error', onListenError); + + this.server.listen(this.opts.port, this.opts.host, () => { + this.server.removeListener('error', onListenError); + this.server.addListener('error', this.onError.bind(this)); + + ok(); + }); + }); + } + + private async onClose(): Promise { + logger.info('Client disconnected'); + } + + private async onError(err: Error): Promise { + logger.error(`NetProxy error: (${String(err)})`); + } +} diff --git a/packages/server/src/servers/config/typings.ts b/packages/server/src/servers/config/typings.ts new file mode 100644 index 0000000..ea10c6b --- /dev/null +++ b/packages/server/src/servers/config/typings.ts @@ -0,0 +1,8 @@ +export interface ProxyConfigOpts { + host: string; + port: number; + proxyServer: { + host: string; + port: number; + }; +} diff --git a/packages/server/src/servers/daemon/index.ts b/packages/server/src/servers/daemon/index.ts index 89a0360..1c7be42 100644 --- a/packages/server/src/servers/daemon/index.ts +++ b/packages/server/src/servers/daemon/index.ts @@ -51,6 +51,10 @@ export class DaemonProcess { commonName: opts.certificate.commonName, host: opts.proxy.host, port: opts.proxy.port, + pac: { + host: opts.pac.host, + port: opts.pac.port, + }, }; return this.ipcClient.sendMessage(message); diff --git a/packages/server/src/servers/daemon/typings.ts b/packages/server/src/servers/daemon/typings.ts index c202968..111a6e3 100644 --- a/packages/server/src/servers/daemon/typings.ts +++ b/packages/server/src/servers/daemon/typings.ts @@ -7,4 +7,8 @@ export interface EnableProxyOptions { host: string; port: number; }; + pac: { + host: string; + port: number; + }; } diff --git a/packages/server/src/servers/index.ts b/packages/server/src/servers/index.ts index 093b37c..7f994e3 100644 --- a/packages/server/src/servers/index.ts +++ b/packages/server/src/servers/index.ts @@ -19,6 +19,7 @@ import { } from '~src/servers/typings'; import { ICPServer } from './icp'; import { NetProxy } from './net'; +import { ProxyConfigurationServer } from '~src/servers/config'; export * from './typings'; @@ -26,6 +27,7 @@ export class ProxyServers { private icpServer!: ICPServer; private netServer!: NetProxy; private ipcServer!: IPCServer; + private proxyConfigServer!: ProxyConfigurationServer; private isEnabled = false; private shuttingDown = false; private inflighMessages = new Map>(); @@ -46,6 +48,7 @@ export class ProxyServers { await this.ipcServer.start(); await this.icpServer.start(); await this.netServer.start(); + await this.proxyConfigServer.start(); if (this.configs?.autoEnable) { await this.enableSecureEnvironment(); @@ -101,6 +104,10 @@ export class ProxyServers { host: this.configs.netServer.host, port: this.configs.netServer.port, }, + pac: { + host: this.configs.proxyConfigServer.host, + port: this.configs.proxyConfigServer.port, + }, }); if (!enabledProxyResult.processed) { @@ -118,6 +125,7 @@ export class ProxyServers { logger.info('Proxy is shutting down.'); await this.daemon.shutdown(); + await this.proxyConfigServer.shutdown(); await this.netServer.shutdown(); await this.icpServer.shutdown(); await this.ipcServer.shutdown(); @@ -192,6 +200,15 @@ export class ProxyServers { } private async initServers(): Promise { + this.proxyConfigServer = await ProxyConfigurationServer.create({ + host: this.configs.proxyConfigServer.host, + port: this.configs.proxyConfigServer.port, + proxyServer: { + host: this.configs.netServer.host, + port: this.configs.netServer.port, + }, + }); + this.ipcServer = await IPCServer.create({ path: this.configs.ipcChannels.proxy, onMessage: async (event: EventMessage): Promise => { diff --git a/packages/server/src/servers/net/index.ts b/packages/server/src/servers/net/index.ts index 87e5a35..71af2f9 100644 --- a/packages/server/src/servers/net/index.ts +++ b/packages/server/src/servers/net/index.ts @@ -97,6 +97,12 @@ export class NetProxy { const connectionInfo = this.getConnectionInfo(socketData); info = connectionInfo; + // prevent loop connection passthrough to self + if (info.host === this.opts.host && info.port === this.opts.port) { + this.handleProxySameConnection(socket); + return; + } + const icRequest = await this.shouldHandleAsICPRequest(connectionInfo); logger.info( @@ -136,7 +142,7 @@ export class NetProxy { const body = 'Error: ENOTFOUND - The requested resource could not be found.'; socket.write( - 'HTTP/1.1 404 Not Found\r\n\r\n' + + 'HTTP/1.1 404 Not Found\r\n' + 'Server: IC HTTP Proxy\r\n' + 'Content-Type: text/plain\r\n' + 'Connection: close\r\n' + @@ -149,6 +155,23 @@ export class NetProxy { }); } + private handleProxySameConnection(socket: net.Socket): void { + const body = + 'The IC HTTP Proxy is running and will proxy your requests to the Internet Computer.'; + + socket.write( + 'HTTP/1.1 200 Ok\r\n' + + 'Server: IC HTTP Proxy\r\n' + + 'Content-Type: text/plain\r\n' + + 'Connection: close\r\n' + + `Content-Length: ${Buffer.byteLength(body)}\r\n` + + `\r\n` + + body + ); + + socket.end(); + } + private handleInternetComputerConnection( connection: ConnectionInfo, clientSocket: net.Socket, diff --git a/packages/server/src/servers/typings.ts b/packages/server/src/servers/typings.ts index ebe079e..5b9c479 100644 --- a/packages/server/src/servers/typings.ts +++ b/packages/server/src/servers/typings.ts @@ -2,10 +2,15 @@ import { CertificateConfiguration, IpcChannels, } from '@dfinity/http-proxy-core'; -import { ICPServerConfiguration, NetServerConfiguration } from '~src/commons'; +import { + ICPServerConfiguration, + NetServerConfiguration, + ProxyConfigServerConfiguration, +} from '~src/commons'; export interface ProxyServersOptions { certificate: CertificateConfiguration; + proxyConfigServer: ProxyConfigServerConfiguration; netServer: NetServerConfiguration; icpServer: ICPServerConfiguration; ipcChannels: IpcChannels; diff --git a/packages/server/src/start.ts b/packages/server/src/start.ts index 40b8f46..798a283 100644 --- a/packages/server/src/start.ts +++ b/packages/server/src/start.ts @@ -31,6 +31,7 @@ process.on('unhandledRejection', (reason) => { logger.info('Preparing system requirements'); servers = await ProxyServers.create({ certificate: environment.certificate, + proxyConfigServer: environment.proxyConfigServer, icpServer: environment.icpServer, netServer: environment.netServer, ipcChannels: coreConfigs.ipcChannels, diff --git a/packages/ui/package.json b/packages/ui/package.json index b3b8a16..437d592 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@dfinity/http-proxy-ui", - "version": "0.0.2-alpha", + "version": "0.0.3-alpha", "description": "Desktop interface to facilitate user interaction with the HTTP Proxy server.", "main": "built/main.js", "scripts": { @@ -37,8 +37,8 @@ }, "homepage": "https://github.com/dfinity/http-proxy/tree/main/packages/ui#readme", "dependencies": { - "@dfinity/http-proxy-core": "0.0.2-alpha", - "@dfinity/http-proxy-server": "0.0.2-alpha" + "@dfinity/http-proxy-core": "0.0.3-alpha", + "@dfinity/http-proxy-server": "0.0.3-alpha" }, "devDependencies": { "@types/node": "^18.14.0", diff --git a/yarn.lock b/yarn.lock index e98b34a..994ec28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,7 +113,7 @@ __metadata: languageName: node linkType: hard -"@dfinity/http-proxy-core@0.0.2-alpha, @dfinity/http-proxy-core@workspace:packages/core": +"@dfinity/http-proxy-core@0.0.3-alpha, @dfinity/http-proxy-core@workspace:packages/core": version: 0.0.0-use.local resolution: "@dfinity/http-proxy-core@workspace:packages/core" dependencies: @@ -138,11 +138,11 @@ __metadata: languageName: unknown linkType: soft -"@dfinity/http-proxy-daemon@0.0.2-alpha, @dfinity/http-proxy-daemon@workspace:packages/daemon": +"@dfinity/http-proxy-daemon@0.0.3-alpha, @dfinity/http-proxy-daemon@workspace:packages/daemon": version: 0.0.0-use.local resolution: "@dfinity/http-proxy-daemon@workspace:packages/daemon" dependencies: - "@dfinity/http-proxy-core": 0.0.2-alpha + "@dfinity/http-proxy-core": 0.0.3-alpha "@types/node": ^18.14.0 "@types/node-forge": ^1.3.1 "@types/pako": ^2.0.0 @@ -166,14 +166,14 @@ __metadata: languageName: unknown linkType: soft -"@dfinity/http-proxy-server@0.0.2-alpha, @dfinity/http-proxy-server@workspace:packages/server": +"@dfinity/http-proxy-server@0.0.3-alpha, @dfinity/http-proxy-server@workspace:packages/server": version: 0.0.0-use.local resolution: "@dfinity/http-proxy-server@workspace:packages/server" dependencies: "@dfinity/agent": ^0.15.6 "@dfinity/candid": ^0.15.6 - "@dfinity/http-proxy-core": 0.0.2-alpha - "@dfinity/http-proxy-daemon": 0.0.2-alpha + "@dfinity/http-proxy-core": 0.0.3-alpha + "@dfinity/http-proxy-daemon": 0.0.3-alpha "@dfinity/principal": ^0.15.6 "@dfinity/response-verification": ^0.2.1 "@types/isomorphic-fetch": ^0.0.36 @@ -202,8 +202,8 @@ __metadata: version: 0.0.0-use.local resolution: "@dfinity/http-proxy-ui@workspace:packages/ui" dependencies: - "@dfinity/http-proxy-core": 0.0.2-alpha - "@dfinity/http-proxy-server": 0.0.2-alpha + "@dfinity/http-proxy-core": 0.0.3-alpha + "@dfinity/http-proxy-server": 0.0.3-alpha "@types/node": ^18.14.0 "@typescript-eslint/eslint-plugin": ^5.54.1 "@typescript-eslint/parser": ^5.54.1