From 3d775e51373af4bc5cedb46da19932c09a07d6ca Mon Sep 17 00:00:00 2001 From: MunyDev Date: Mon, 12 Aug 2024 18:58:31 -0400 Subject: [PATCH] Initial commit --- .gitignore | 3 + extfile | 8 + generate_ssl_certificate.sh | 23 ++ handlers.js | 9 + in.csr | 28 ++ myCA.der | Bin 0 -> 1543 bytes myCA.key | 52 +++ myCA.pem | 35 ++ package-lock.json | 693 ++++++++++++++++++++++++++++++++++++ package.json | 5 + proxy.d.ts | 23 ++ proxy.js | 253 +++++++++++++ tsconfig.json | 5 + 13 files changed, 1137 insertions(+) create mode 100644 .gitignore create mode 100644 extfile create mode 100644 generate_ssl_certificate.sh create mode 100644 handlers.js create mode 100644 in.csr create mode 100644 myCA.der create mode 100644 myCA.key create mode 100644 myCA.pem create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 proxy.d.ts create mode 100644 proxy.js create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..033edc8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +*_cert +configs \ No newline at end of file diff --git a/extfile b/extfile new file mode 100644 index 0000000..eb86816 --- /dev/null +++ b/extfile @@ -0,0 +1,8 @@ + +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment +subjectAltName = @alt_names + +[alt_names] +DNS.1 = www.google.com diff --git a/generate_ssl_certificate.sh b/generate_ssl_certificate.sh new file mode 100644 index 0000000..0955dd9 --- /dev/null +++ b/generate_ssl_certificate.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Arguments: +DIR=. +mkdir -p "$DIR" +SCRIPTDIR=$(dirname "$(readlink -f "$0")") + + +openssl genrsa -out "$DIR/$1".key 4096 +openssl req -new -key "$1".key -out "$DIR/in.csr" -subj "/C=US/ST=PRIVATE/L=PRIVATE/O=Success!/OU=Success/CN=$1" +cat > "$DIR/extfile" <6O~_ueJRl91MA9%BR&@PZKcUW#iOp^Jx3d%gD&h z%3#nq!I0a4lZ`o)g-w_#G}utkfFH!+;Nb{zb#ZhKadm+Su_Fm78pwlGaq&oa=9Q!t z<)xM=glDFtXO`m=3K;N#lrZzK`R8% zn46gR84Q}3xR{!l7#Ws6w|$d*){8A(vs6;_nZ#Pp6Y^dUbpmek`j#Y>UOPFlbcy}t z$BkT<8gIBWeii;&wr$z0;={kfR2#M&yvJQ+)FQh0hX2oLAG9nQ7ACHq$5pK|x6|~LQ6}5GNqn9P?%AJj%0HTyKU4F$?uo2=-?YNpiJxWG z?ag3ZBzo%M;;sp$#y1UKZB__7y)|(bdqd0Q_Vuv`Hm*$k7@`%W^>b^xq)={%wdtY9 zWyU>sxUJ7-h3;7Y`QrC&%NP}c7@x$IY`f#|>(UXWi4A|vdy534WGz*siv@U|@}!)O zl$cTcI$eI|mVFF~$+I&muM2I|dNJjD_uu&U65;my*6(JDi+!_9a;Lx%&aVsacKIIV zkrmvizb@-(v48v843n2@R5s3^q|`Kx?fvST9quY+G0W9&Pi5{mJ+ty&slmKS`4jeg z#$7x*@6%cBxUz;(YtX(OYnRC!OP zZgAtA^(D)T{k%Df|87qE%bBBLi>kzJAJ^}N>-Ug!a%G6y8=+|loe)V{LjK_zzn32lN~TW z1Ct#iL(7xeWqgX?qh^**Uin9=e8RK!)3k4B-^$f|!C}U4AKBHV8GYW!^Y!8KfYd(K z_lCEQ^#8SLQfVrh^2%s8$FX@%EUPCpMU~mqKHR+H|EmAZD%}&Nu2$nxxH4&xSj`b_ zX^yu#MW!c?^StJI-#KY+3R7;c^W?}=DUXj_6!WLe|SpxY~IWh zL7IKi>Aa$s^VODaap|?qzo*vZDK<$j&&u;t+*uw#^9&_8-z2o4e&- z)$O-DNSnL3>yX}0vlQXFnaW&qe{NiKjgz-RWk18KfVAw(8YR&m{?%N4WTVh1@h<0# zT5Dj8j`}aY6{&(7{N+#Y*gbVd-#Jw-&Wx=kxrwaDznnSDm%7X--YVSsNNVlbS+5ve z-n?jhXX%-fCb~`IaMTy0uc))sl0*0N;pk>i_@% literal 0 HcmV?d00001 diff --git a/myCA.key b/myCA.key new file mode 100644 index 0000000..c58209e --- /dev/null +++ b/myCA.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +675STYMV063eeR0k5spd7ca6TNgFvQ== +-----END PRIVATE KEY----- diff --git a/myCA.pem b/myCA.pem new file mode 100644 index 0000000..2b29960 --- /dev/null +++ b/myCA.pem @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +MIIGAzCCA+ugAwIBAgIUdV4i6iaX9X2PVAgAbsx3ln07lhAwDQYJKoZIhvcNAQEL +BQAwgZAxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhSRURBQ1RFRDERMA8GA1UEBwwI +UkVEQUNURUQxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEQMA4G +A1UEAwwHTXVueURldjEmMCQGCSqGSIb3DQEJARYXamVmZnBsYXlzMTI5MkBnbWFp +bC5jb20wHhcNMjQwODExMTAzMTIwWhcNMjkwODEwMTAzMTIwWjCBkDELMAkGA1UE +BhMCVVMxETAPBgNVBAgMCFJFREFDVEVEMREwDwYDVQQHDAhSRURBQ1RFRDEhMB8G +A1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYDVQQDDAdNdW55RGV2 +MSYwJAYJKoZIhvcNAQkBFhdqZWZmcGxheXMxMjkyQGdtYWlsLmNvbTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXnPexjzUoGXyl1GRXmGK1JyB9K4SxQ +2Q1NdGJ11smRdaQ/0+OBCtKB2EcB9RP1drammnPD+lYlgLTB3gtyMoQVo9hP+Zbw +KjiAoWGrngp7JJj6oamk29zRnQUuiyMsD+RU/DtFbMNCZvquhoE97DHf0YlTO6X7 ++aCf3sPfTDSM7jOhTJZObxabkJ5M0mx4dS9mPyconYk1yjJpBp6SDkkgR2vz2R/i +nm+ZKectyGp/TWZx22HzHK69aAGiFcrho4qQdTPZMOqzIFbLtWGaB4CEk4evXcCx +qWHxVCpaKvm1hxkSbVQ7NcLjdjOM3As7zWpVuK/z0fe2pgEgUgHkXnS23ED60sQi +kYD9N41yEVodOSQbcxAM5Qxky1kYmHPrZx+ZtL4AYWObaHnXErEq6JT3i/1f7xhX +P76vuwJeXeymGbkQxAn1od2KTcUMHRGxL65q5XNPh61oNOmsJLGfkiKClgbvq9mI +RyR2XKcn25UDjzXMqd51MJ6Sb5C/SV7RxZ7yrTo6zKiQ6QYeDZbDDKs0V0UJmpEb +JErs9ED2Hg0WhTXQCt+AIrEBRRp3jGktU4Gcr3Snc05LCHP9syIVR6oxCOtwdAC3 +3wFohlQAhUWP0FdUDqtLx4UBuOwXWu46CpKEzk3glEbJuiDdf/LVVxZJHTGUMZvU +VYxxFxJdNswxAgMBAAGjUzBRMB0GA1UdDgQWBBQZ5esAn4rQsgF3llXzZKE/4d2J +TDAfBgNVHSMEGDAWgBQZ5esAn4rQsgF3llXzZKE/4d2JTDAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCE5H2mDiH3Wpl3k6n8GneQ5q+WK9gr2m0p +6Ag2Dz9ZioopW88ySevDd1BljiXvMdrEj/06giSCcpTqMrsIxp5CBKuQglp2PH3h +s7j/qv+DJIuQlasmCiDUkqIWfMQrGwjtLHI1yMcM6wrviZKdZAJtjUOTWcpk48TR +FkzQVBxw6g+mVr9zhQH6taNUlcqyxBcwBd3gJEQuyVWREXd93zV5Ho/KirU1oY9W +EXJbZHtPocxky++xZ3UUMUXixyb80vsh0B7+yJzUxjd7xnvQ5TeyK4k5tmoQnz87 +04IaJrdNIGShbcCzZeA5ORy/4coTzW6ZyFIpjhtnDRXTbyaltESNPW/eJoJJFpIu +bjpJ8l7NMkA/B0SSRpgXPw3EMfiltKn54sBLbLVu7pWeiZ4Dhs1Rnmec1XEfxyxb +pLozw/JdVGVRRsbH1RrsieKCE30Er/H0PN139Sc/tOBmnaOKwi75NmQTfpkjCp35 +saLWCQ14JL8A6lBma9ModFvw/nzV4jwggRjubMwmhVFcLCf6DqhlEbBPH8u4u5WY +js4lCglotXRtYQXH9MzDDmWmMl86VzvEZX3NmuoAROzoge45SWxmFbYow1r0MlaL +UIjwjqCtBSYpQUZze7I9HREcMpvOxW6Be58BUPST4TEqbr/580wSz17yr/EuvJJA +Bd3/qqTOTQ== +-----END CERTIFICATE----- diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b6ddc5d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,693 @@ +{ + "name": "httpmitm", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "express": "^4.19.2" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4c70953 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "express": "^4.19.2" + } +} diff --git a/proxy.d.ts b/proxy.d.ts new file mode 100644 index 0000000..911ccd9 --- /dev/null +++ b/proxy.d.ts @@ -0,0 +1,23 @@ +interface ServerConfig { + + filters: FilterType[], + filterPath?: string, + proxyPath?: string, + reverseProxyUrl?: string + +} + +interface FilterInfo { + tls: boolean, + host: string, + path?: string // Only valid if tls is false +} + +declare global { + type FilterType = "http"|"https" + +} + + +declare type FilterFunction = (filterInfo: FilterInfo)=>Promise|boolean +export { ServerConfig, FilterInfo, FilterFunction } \ No newline at end of file diff --git a/proxy.js b/proxy.js new file mode 100644 index 0000000..633e04f --- /dev/null +++ b/proxy.js @@ -0,0 +1,253 @@ +const fs = require('fs') +const express = require('express'); +const https = require('https'); +const path = require('path'); +// var hostBucket = []; +// https.createServer({ +// cert: fs.readFileSync('./oobeservermain.pem'), +// key: fs.readFileSync('./oobeservermain.key') +// },async (req, res)=>{ +// console.log("Serving request for " + req.headers.host); +// if (req.headers.host === 'accounts.google.com') { +// res.writeHead(200, '', { +// "Content-Type": "text/html", +// "x-manage-chrome-accounts": "incognito=1" +// }); +// res.end('Intercepting google accounts.'); +// return; +// }; + +// if (req.headers.host === 'play.google.com') { +// res.writeHead(200, '', { +// "Content-Type": "text/html", +// }); +// res.end("This exploit was written by CRZero and Chromium Labs.\nPrimary Developer: MCRideable#3693.\n Combination of k1llswitch and certain chromium vulnerabilities. We will be shortly pwning your browser and placing a shell in the current page. Link to incognito? link1"); +// return; +// }; +// let url = req.url; +// console.log(req.url); +// let resp; +// try { +// resp = await axios.request({ +// url: url, +// headers: req.headers, +// responseType: "arraybuffer" +// }); +// }catch { +// res.writeHead(404); +// res.end("Failed"); +// return; +// } + +// res.writeHead(resp.status, resp.statusText, resp.headers); +// if (resp.data) { +// res.end(resp.data); +// } + +// }).listen(3000); +//Credits to https://medium.com/@nimit95/a-simple-http-https-proxy-in-node-js-4eb0444f38fc or @nimit95 +const net = require('net'); +const server = net.createServer(); +// miniServerMap[host] = new MiniServer(); +/** + * @type {Object} + */ +var miniServerMap = {}; + +// manifest.json is per website +// Location: configs//manifest.json (ex. www.google.com/manifest.json) + + +/** + * @type {import('./proxy').ServerConfig} + */ +let a; + +/** + * @type {Objectvoid>} + */ +let serverCallbackMap = {}; + + + +/** + * + * @param {import('./proxy').ServerConfig} config + */ +function readServerConfig(address, config) { + /** + * + * @returns {import('./proxy').FilterFunction} + */ + const defaultServerFilterGetter = function () { + if (config.filterPath) { // Filter path takes precedence as it handles all cases + return require(filterPath).filter; + } + else if (config.filters) { + + return function ({tls}) { + if (tls) { + return config.filters.includes('https'); + } + else { + return config.filters.includes('http'); + } + } + } + } + const defaultServerProxyGetter = function () { + if (config.proxyPath) { // Proxypath takes precedence over rev proxy due to js handling nature + return require(config.proxyPath).proxy; + }else if (config.reverseProxyUrl) { + const url = config.reverseProxyUrl; + const a = url + req.path; + const x = new URL(a); + const socketDNS = x.host; + + + /** + * @param {net.Socket} clientsock + */ + return function (config, clientsock) { + const as = net.createConnection({ + host: x.host, + port: parseInt(x.port) + }); + clientsock.pipe(as); + + } + } + + } + const configData = {filter: defaultServerFilterGetter, proxy: defaultServerProxyGetter, config}; + return configData; +} +function getAllServerConfigs() { + const allConfigDir = path.resolve(__dirname, 'configs'); + const a = fs.readdirSync(allConfigDir); + for (const server of a){ + console.info("Reading config for: ", server); + const serverPath = null; + const files = fs.readdirSync((serverPath = path.resolve(allConfigDir, server))); + if (!files.includes("manifest.json")) { + console.error(`Could not read config for ${server}. Moving on to next server`); + } + const manifestData = fs.readFileSync(path.resolve(serverPath, 'manifest.json'), {encoding: 'utf8'}); + + /** + * @type {import('./proxy').ServerConfig} + */ + const serverConfig = JSON.parse(manifestData); + const funcs = readServerConfig(serverConfig); + serverCallbackMap[server] = funcs; + } +} +getAllServerConfigs() +// FilterInfo: { +// host: string, +// tls: boolean, +//} +server.on('connection', (clientToProxySocket) => { + // We need only the data once, the starting packet + console.log("client connected"); + clientToProxySocket.once('data', (data) => { + let isTLSConnection = data.toString().indexOf('CONNECT') !== -1; + + //Considering Port as 80 by default + let serverPort = 80; + let serverAddress; + var useMiniServer= false; + if (isTLSConnection) { + // Port changed to 443, parsing the host from CONNECT + serverPort = 443; + serverAddress = data.toString() + .split('CONNECT ')[1] + .split(' ')[0].split(':')[0]; + console.log(serverAddress); + if (miniServerMap[serverAddress]) { + console.log("USING Miniserver") + serverPort = miniServerMap[serverAddress].port; + serverAddress= "localhost"; + } + + else if (serverAddress.includes("googleapis.com")) { + console.log("USING Miniserver") + + const a = new MiniServer(""); + + miniServerMap[serverAddress] = a; + serverAddress = "localhost"; + serverPort = a.port; + } + } else { + // Parsing HOST from HTTP + serverAddress = data.toString() + .split('Host: ')[1].split('\r\n')[0]; + console.log(serverAddress); + } + let proxyToServerSocket = net.createConnection({ + host: serverAddress, + port: serverPort + }, () => { + // console.log('PROXY TO SERVER SET UP'); + + if (isTLSConnection) { + //Send Back OK to HTTPS CONNECT Request + clientToProxySocket.write('HTTP/1.1 200 OK\r\n\n'); + } else { + proxyToServerSocket.write(data); + } + // Piping the sockets + clientToProxySocket.pipe(proxyToServerSocket); + proxyToServerSocket.pipe(clientToProxySocket); + + proxyToServerSocket.on('error', (err) => { + // console.log('PROXY TO SERVER may have disconnected.'); + // console.log(err); + }); + }); + proxyToServerSocket.on('error', (e)=>{ + console.log(e); + }) + clientToProxySocket.on('error', err => { + console.log('CLIENT TO PROXY may have disconnected.'); + }); + }); + }); +server.on('error', (err) => { + console.log('SERVER ERROR'); + console.log(err); +}); +server.on('close', () => { + console.log('Client Disconnected'); +}); +server.listen(8125, () => { + console.log('Server running at http://localhost:' + 8125); +}); +//Source code below is for creating a mini server or a server that serves requests within memory.(or not) +class MiniServer { + static pInitial = 3001; + internalServer; + expressApp; + port; + constructor(staticDir,port=MiniServer.pInitial++) { + console.log("miniserver creating") + this.expressApp = express(); + this.expressApp.use(function (req, res) { + + res.writeHead(200, "OK"); + res.end("hi"); + }); + this.internalServer = https.createServer({ + cert: fs.readFileSync('google.pem'), + key: fs.readFileSync("google.key"), + },(req, res)=>{ + console.log(`[DEBUG] Serving request ${req.url} for ${req.headers.host}`); + + this.expressApp(req, res); + + }); + this.internalServer.listen(port); + this.port = port; + } + } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ad10dfa --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,5 @@ +{ + "typeAcquisition": { + "enable": true + } +} \ No newline at end of file