fix(core): Refactor certificate handling across the project
This commit is contained in:
		
							
								
								
									
										19
									
								
								assets/certs/cert.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								assets/certs/cert.pem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | -----BEGIN CERTIFICATE----- | ||||||
|  | MIIDCzCCAfOgAwIBAgIUPU4tviz3ZvsMDjCz1NZRT16b0Y4wDQYJKoZIhvcNAQEL | ||||||
|  | BQAwFTETMBEGA1UEAwwKcHVzaC5yb2NrczAeFw0yNTAyMDMyMzA5MzRaFw0yNjAy | ||||||
|  | MDMyMzA5MzRaMBUxEzARBgNVBAMMCnB1c2gucm9ja3MwggEiMA0GCSqGSIb3DQEB | ||||||
|  | AQUAA4IBDwAwggEKAoIBAQCZMkBYD/pYLBv9MiyHTLRT24kQyPeJBtZqryibi1jk | ||||||
|  | BT1ZgNl3yo5U6kjj/nYBU/oy7M4OFC0xyaJQ4wpvLHu7xzREqwT9N9WcDcxaahUi | ||||||
|  | P8+PsjGyznPrtXa1ASzGAYMNvXyWWp3351UWZHMEs6eY/Y7i8m4+0NwP5h8RNBCF | ||||||
|  | KSFS41Ee9rNAMCnQSHZv1vIzKeVYPmYnCVmL7X2kQb+gS6Rvq5sEGLLKMC5QtTwI | ||||||
|  | rdkPGpx4xZirIyf8KANbt0sShwUDpiCSuOCtpze08jMzoHLG9Nv97cJQjb/BhiES | ||||||
|  | hLL+YjfAUFjq0rQ38zFKLJ87QB9Jym05mY6IadGQLXVXAgMBAAGjUzBRMB0GA1Ud | ||||||
|  | DgQWBBQjpowWjrql/Eo2EVjl29xcjuCgkTAfBgNVHSMEGDAWgBQjpowWjrql/Eo2 | ||||||
|  | EVjl29xcjuCgkTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAY | ||||||
|  | 44vqbaf6ewFrZC0f3Kk4A10lC6qjWkcDFfw+JE8nzt+4+xPqp1eWgZKF2rONyAv2 | ||||||
|  | nG41Xygt19ByancXLU44KB24LX8F1GV5Oo7CGBA+xtoSPc0JulXw9fGclZDC6XiR | ||||||
|  | P/+vhGgCHicbfP2O+N00pOifrTtf2tmOT4iPXRRo4TxmPzuCd+ZJTlBhPlKCmICq | ||||||
|  | yGdAiEo6HsSiP+M5qVlNx8s57MhQYk5TpgmI6FU4mO7zfDfSatFonlg+aDbrnaqJ | ||||||
|  | v/+km02M+oB460GmKwsSTnThHZgLNCLiKqD8bdziiCQjx5u0GjLI6468o+Aehb8l | ||||||
|  | l/x9vWTTk/QKq41X5hFk | ||||||
|  | -----END CERTIFICATE----- | ||||||
							
								
								
									
										28
									
								
								assets/certs/key.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								assets/certs/key.pem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | -----BEGIN PRIVATE KEY----- | ||||||
|  | MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCZMkBYD/pYLBv9 | ||||||
|  | MiyHTLRT24kQyPeJBtZqryibi1jkBT1ZgNl3yo5U6kjj/nYBU/oy7M4OFC0xyaJQ | ||||||
|  | 4wpvLHu7xzREqwT9N9WcDcxaahUiP8+PsjGyznPrtXa1ASzGAYMNvXyWWp3351UW | ||||||
|  | ZHMEs6eY/Y7i8m4+0NwP5h8RNBCFKSFS41Ee9rNAMCnQSHZv1vIzKeVYPmYnCVmL | ||||||
|  | 7X2kQb+gS6Rvq5sEGLLKMC5QtTwIrdkPGpx4xZirIyf8KANbt0sShwUDpiCSuOCt | ||||||
|  | pze08jMzoHLG9Nv97cJQjb/BhiEShLL+YjfAUFjq0rQ38zFKLJ87QB9Jym05mY6I | ||||||
|  | adGQLXVXAgMBAAECggEARGCBBq1PBHbfoUH5TQSIAlvdEEBa9+602lZG7jIioVfT | ||||||
|  | W7Uem5Ctuan+kcDcY9hbNsqqZ+9KgsvoJmlIGXoF2jjeE/4vUmRO9AHWoc5yk2Be | ||||||
|  | 4NjcxN3QMLdEfiLBnLlFCOd4CdX1ZxZ6TG3WRpV3a1pVIeeqHGB1sKT6Xd/atcwG | ||||||
|  | RvpiXzu0SutGxVb6WE9r6hovZ4fVERCyCRczUGrUH5ICbxf6E7L4u8xjEYR4uEKK | ||||||
|  | /8ZkDqrWdRASDAdPPMNqnHUEAho/WnxpNeb6B4lvvv2QWxIS9H1OikF/NzWPgVNS | ||||||
|  | oPpvtJgjyo5xdgLm3zE4lcSPNVSrh1TBXuAn9TG4WQKBgQDScPFkUNBqjC5iPMof | ||||||
|  | bqDHlhlptrHmiv9LC0lgjEDPgIEQfjLfdCugwDk32QyAcb5B60upDYeqCFDkfV/C | ||||||
|  | T536qxevYPjPAjahLPHqMxkWpjvtY6NOTgbbcpVtblU2Fj8R8qbyPNADG31LicU9 | ||||||
|  | GVPtQ4YcVaMWCYbg5107+9dFWQKBgQC6XK+foKK+81RFdrqaNNgebTWTsANnBcZe | ||||||
|  | xl0bj6oL5yY0IzroxHvgcNS7UMriWCu+K2xfkUBdMmxU773VN5JQ5k15ezjgtrvc | ||||||
|  | 8oAaEsxYP4su12JSTC/zsBANUgrNbFj8++qqKYWt2aQc2O/kbZ4MNfekIVFc8AjM | ||||||
|  | 2X9PxvxKLwKBgHXL7QO3TQLnVyt8VbQEjBFMzwriznB7i+4o8jkOKVU93IEr8zQr | ||||||
|  | 5iQElcLSR3I6uUJTALYvsaoXH5jXKVwujwL69LYiNQRDe+r6qqvrUHbiNJdsd8Rk | ||||||
|  | XuhGGqj34tD04Pcd+h+MtO+YWqmHBBZwcA9XBeIkebbjPFH2kLT8AwN5AoGAYQy9 | ||||||
|  | hMJxnkE3hIkk+gNE/OtgeE20J+Vw/ZANkrnJEzPHyGUEW41e+W2oyvdzAFZsSTdx | ||||||
|  | 037f5ujIU58Z27x53NliRT4vS4693H0Iyws5EUfeIoGVuUflvODWKymraHjhCrXh | ||||||
|  | 6cV/0R5DAabTnsCbCr7b/MRBC8YQvyUQ0KnOXo8CgYBQYGpvJnSWyvsCjtb6apTP | ||||||
|  | drjcBhVd0aSBpLGtDdtUCV4oLl9HPy+cLzcGaqckBqCwEq5DKruhMEf7on56bUMd | ||||||
|  | m/3ItFk1TnhysAeJHb3zLqmJ9CKBitpqLlsOE7MEXVNmbTYeXU10Uo9yOfyt1i7T | ||||||
|  | su+nT5VtyPkmF/l4wZl5+g== | ||||||
|  | -----END PRIVATE KEY----- | ||||||
| @@ -1,5 +1,13 @@ | |||||||
| # Changelog | # Changelog | ||||||
|  |  | ||||||
|  | ## 2025-02-04 - 3.1.2 - fix(core) | ||||||
|  | Refactor certificate handling across the project | ||||||
|  |  | ||||||
|  | - Moved certificate keys and certs to the assets/certs directory. | ||||||
|  | - Updated test utilities to load certificates from the central location. | ||||||
|  | - Cleaned up redundant code and improved error logging regarding certificates. | ||||||
|  | - Ensured correct handling of host header in ProxyRouter class. | ||||||
|  |  | ||||||
| ## 2025-02-03 - 3.1.1 - fix(workflow) | ## 2025-02-03 - 3.1.1 - fix(workflow) | ||||||
| Update Gitea workflow paths and dependencies | Update Gitea workflow paths and dependencies | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,27 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIIEljCCAn4CCQDY+ZbC9FASVjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJE |  | ||||||
| RTAeFw0xOTA5MjAxNjAxNDRaFw0yMDA5MTkxNjAxNDRaMA0xCzAJBgNVBAYTAkRF |  | ||||||
| MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4thf9JEK/epoXt8hFr8t |  | ||||||
| pkRzmaEkgbSKoOga3uGXDLvdNf3BzSIxZ8pzRhZfUnutcmW1thdz3wre/pEJR7oN |  | ||||||
| QsfixbLL8/oS5QeXKiUGX0Ssfdg4W0TsoLcRva+1AZsf38MfiUPhzh1/UW/rMywW |  | ||||||
| asazQwRZdkkXb4nKJ2IFZx22qnAD4/5Sug+sfeKoFBF/rzI2yK7rognt7kW2LHv6 |  | ||||||
| rswHnZ1Z2P/gbhlZ/EhG9hFVRZwRLDscWKcuWcxkePDt2J1pDNqD6SYa6ZjGC3AE |  | ||||||
| TJw5iEA1bLQ9YvjDNpVYcf6ZvcSilIFjSQu5cs9sUbHGeKTrS5HzfeJXh1PfJyL8 |  | ||||||
| X0Hu7UBSjfSudso3baE9FGiBFBW2cnXZKDZGtV8eq/qxPetOOgS09pVbNP6508WV |  | ||||||
| BR+rz98/VDZLZqcbZ2UpOuz4+kAKmbYE9GplxKQZZO7wWEox7Mid/uUdcqEo4QKn |  | ||||||
| no6ujOuzQzn5a2oOS0k5Hk3uHapNJWlW9YI3LHtfADpYH+6cOR+/c3JWBzQJ6AD7 |  | ||||||
| muvNzA9mWXeHqLxMMP4pkmb7otzZYrEkodUqJgAQxcYhGh6XsCPfJ/D9RN734OJc |  | ||||||
| gleVXFI8Kz455HxCW19XNfz16k7T6kqhZ/6SOBbkxEuqg7oEthAP109ZZzgx4oDo |  | ||||||
| hQsw24TjLkI4SPIc7nr60UUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAu0+zrg0C |  | ||||||
| mlSv4Yi24OwB7TBvx+WHesl1IilCUdTiiUMo3NumvsU9Dr3Jkd0jGqYI0eyH4gIt |  | ||||||
| KrhAveXfEw7tAOEHiYicmAdIFtyzh++ZWb8mgbBeqij1MP/76Jv+cc0lUqpfRo/A |  | ||||||
| qytAsPAILuyL1o1jh28JHcq+v+WYn/FEhjUlH6emhGKGlsAjhUPjzK8MEshNolhj |  | ||||||
| t2UXw9WB5B2xWvrqlNMy0F3NAZBkZ/+k21HZo6FmVi+q6OEGcOo7wJt6wrH/lko9 |  | ||||||
| LxX96GC1JoN1Pfr2FoTKy1WHzrSfyGmDIUCrbaYQ58UuMOR+5eIPPdkf/030u5eX |  | ||||||
| xXhF2fBujD57E2zQGh/l2MrOjamcSo0+wYhOqlX3WNdaKNAzPqloBnF6w7eqLYde |  | ||||||
| h9He39ySmxjENwv3miOjEP1sBeMBSRfL/ckEonfK5uJgYA5nVMQ3ojUeDMZzLfFE |  | ||||||
| Ue2WHt+uPyYk7mMZfOrK2uHzI2/Coqj7lbfRodFwj+fCArYBck2NZannDPKA6X8V |  | ||||||
| TzJTbTCteOUUJTrcfZ0gGhGkF4nYLmX5OI+TPqrDJf0fZ+mzAEHzDDVXcBYpYRDr |  | ||||||
| r8d9QwrK+WaqVi2ofbMfMByVF72jgeJNa4nxwT9bVbu/Q1T2Lt+YPb4pQ7yCoUgS |  | ||||||
| JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
| @@ -1,83 +1,37 @@ | |||||||
| export const testCertificates = { | import * as fs from 'fs'; | ||||||
|   privateKey: `-----BEGIN PRIVATE KEY----- | import * as path from 'path'; | ||||||
| MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQDi2F/0kQr96mhe | import { fileURLToPath } from 'url'; | ||||||
| 3yEWvy2mRHOZoSSBtIqg6Bre4ZcMu901/cHNIjFnynNGFl9Se61yZbW2F3PfCt7+ | import * as tls from 'tls'; | ||||||
| kQlHug1Cx+LFssvz+hLlB5cqJQZfRKx92DhbROygtxG9r7UBmx/fwx+JQ+HOHX9R |  | ||||||
| b+szLBZqxrNDBFl2SRdviconYgVnHbaqcAPj/lK6D6x94qgUEX+vMjbIruuiCe3u | const __filename = fileURLToPath(import.meta.url); | ||||||
| RbYse/quzAednVnY/+BuGVn8SEb2EVVFnBEsOxxYpy5ZzGR48O3YnWkM2oPpJhrp | const __dirname = path.dirname(__filename); | ||||||
| mMYLcARMnDmIQDVstD1i+MM2lVhx/pm9xKKUgWNJC7lyz2xRscZ4pOtLkfN94leH |  | ||||||
| U98nIvxfQe7tQFKN9K52yjdtoT0UaIEUFbZyddkoNka1Xx6r+rE96046BLT2lVs0 | export interface TestCertificates { | ||||||
| /rnTxZUFH6vP3z9UNktmpxtnZSk67Pj6QAqZtgT0amXEpBlk7vBYSjHsyJ3+5R1y |   privateKey: string; | ||||||
| oSjhAqeejq6M67NDOflrag5LSTkeTe4dqk0laVb1gjcse18AOlgf7pw5H79zclYH |   publicKey: string; | ||||||
| NAnoAPua683MD2ZZd4eovEww/imSZvui3NlisSSh1SomABDFxiEaHpewI98n8P1E | } | ||||||
| 3vfg4lyCV5VcUjwrPjnkfEJbX1c1/PXqTtPqSqFn/pI4FuTES6qDugS2EA/XT1ln |  | ||||||
| ODHigOiFCzDbhOMuQjhI8hzuevrRRQIDAQABAoICAQC7nU+HW6qmpQebZ5nbUVT1 | export function loadTestCertificates(): TestCertificates { | ||||||
| Deo6Js+lwudg+3a13ghqzLnBXNW7zkrkV8mNLxW5h3bFhZ+LMcxwrXIPQ29Udmlf |   const certPath = path.join(__dirname, '..', '..', 'assets', 'certs', 'cert.pem'); | ||||||
| USiacC1E5RBZgjSg86xYgNjU4E6EFfZLWf3/T2I6KM1s6NmdUppgOX9CoHj7grwr |   const keyPath = path.join(__dirname, '..', '..', 'assets', 'certs', 'key.pem'); | ||||||
| pZk/lUpUjVEnu+OJPQXQ6f9Y6XoeSAqtvibgmuR+bJaZFMPAqQNTqjix99Aa7JNB |  | ||||||
| nJez4R8dXUuGY8tL349pFp7bCqAdX+oq3GJ2fJigekuM+2uV6OhunUhm6Sbq8MNt |   // Read certificates | ||||||
| hUwEB27oMA4RXENAUraq2XLYQ9hfUMAH+v1vGmSxEIJg561/e//RnrDbyR9oJARr |   const publicKey = fs.readFileSync(certPath, 'utf8'); | ||||||
| SbopI3Ut5yKxVKMYOTSqcFQXVLszTExhMhQCRoOh58BpIfhb9FLCKD9LH8E6eoQf |   const privateKey = fs.readFileSync(keyPath, 'utf8'); | ||||||
| ygPWryey9AAJ7B2PQXVbitzcOML27rzC4DXS+mLe6AVL6t2IldaeMTlumlnc620d |  | ||||||
| Yuf5wSe8qe4xpKOlrE9emnBmbL0sGivsU+mpz9oSjxEpHGA7eoTIOmQiZnuzpkmi |   // Validate certificates | ||||||
| 1ZSU4OwqNavphy6cklONShQOmE8LMI0wRbunLjIFY8fme/8u+tVvWrTuJiCGPnXQ |   try { | ||||||
| F2lb0qwtDVRlexyM+GTPYstU5v7HxkQB3B+uwTgYuupCmTNmO8hjSCS/EYpHzmFe |     // Try to create a secure context with the certificates | ||||||
| YHDEN+Cj8f+vmKxN0F/6QQKCAQEA9+wTQU2GSoVX8IB0U6T+hX0BFhQq5ISH/s76 |     tls.createSecureContext({ | ||||||
| kWIEunY1MCkRL9YygvHkKW3dsXVOzsip/axiT36MhRcyZ27hF1tz3j//Z11E3Bfq |       cert: publicKey, | ||||||
| PkzyUVuU3jpWZkBE2VhXpDXlyW8xR/y1ZOaZZ//XcZTrZf57pGKFp30H/PlDPH3C |       key: privateKey | ||||||
| YtjEuQNmPCgnfz8iXx+vDYx8hwLHNv+DoX2WYuThUnul/QGSKL3xh3qWd8rotnUB |     }); | ||||||
| c8bV4ymk35fVJu/+pTZpPnMkYrFReso/uNn07y1iga/9mwkUBNrT+fWE7RzjT7H8 |   } catch (error) { | ||||||
| ykMMOGCK6bc7joCvALZaUDne714hNW3s9a7L1clehUA8/xwplQKCAQEA6jx/CIQd |     throw new Error(`Invalid certificates: ${error.message}`); | ||||||
| RVdJFihSSZbqdrOAblVdl+WkjhALWNRMoRCCRniNubbgxgKfQ0scKUeubYxScBVk |   } | ||||||
| rlUMl6/2Gr9uzuSC0WPVAE6OLvLNcQafw1mQ1UTJiEzYvczJKwipzXcgGQWO9Q9a |  | ||||||
| T3ETh6Be62si2r6fH4agQzbp4HkTEoWgPu6MJpqqcLoc8laty0d1huqU9du1TRzT |   return { | ||||||
| 3etjopWRd0I3ID+WkkGKjYWRQ1bkKjvkkj1v7bHenX17nfIp5WU1aXTMYUCMMszm |     privateKey, | ||||||
| pgVBDeJGKpPpP3scl7go5Y4KC6H+IeYaeCEk3hWW4robpHBzupkgpRLzmBopjRlN |     publicKey | ||||||
| v3+HQ7OkviX88QKCAQEAg5IJdfKKfindzYieM3WwjW8VkH4LdVLQSW3WlCkMkVgC |   }; | ||||||
| ShjBQj3OeKeeik4ABRlYRW1AqZs+YSmrsUXqPfIeCqNCDoSwKk7ZKGSYr49uWbbc | } | ||||||
| fkM/buxUnXPAryjbVddos+ds7KtkZkjkMSby9iHjxA11GLnF737pK8Uh0Atx+y3O |  | ||||||
| p8Y3j9QVjZ3m7K3NuGjFCG75kE5x7PHCkl+Ea4zV4EFNWLS5/cD1Vz8pEiRHhlKn |  | ||||||
| aPHO8OcUoOELYVUBzk6EC0IiJxukXPoc+O5JDGn48cqgDFs7vApEqBqxKTYD2jeC |  | ||||||
| AR54wNuSBDLCIylTIn016oD37DpjeoVvYBADTu/HMQKCAQEA1rFuajrVrWnMpo98 |  | ||||||
| pNC7xOLQM9DwwToOMtwH2np0ZiiAj+ENXgx+R1+95Gsiu79k5Cn6oZsqNhPkP+Bb |  | ||||||
| fba69M1EDnInmGloLyYDIbbFlsMwWhn7cn+lJYpfVJ9TK+0lMWoD1yAkUa4+DVDz |  | ||||||
| z2naf466wKWfnRvnEAVJcu+hqizxrqySzlH4GDNUhn7P/UJkGFkx+yUSGFUZdLsM |  | ||||||
| orfBWUCPXSzPttmXBJbO+Nr+rP+86KvgdI/AT0vYFNdINomEjxsfpaxjOAaW0wfz |  | ||||||
| 8jCyWKoZ0gJNEeK32GO5UA7dcgBHD3vQWa3lijo8COsznboaJe7M6PQpa/2S2H3+ |  | ||||||
| 4P5msQKCAQEAx7NP3y+5ttfTd/eQ7/cg1/0y2WxvpOYNLt6MWz4rPWyD6QwidzTG |  | ||||||
| pjuQFQ5Ods+BwJ/Jbirb7l4GMAxfIbEPAkPTHpvswO0xcncSYxl0sSP/WIA6sbcM |  | ||||||
| dp7B/scdORC8Y6i8oPdCyxyCTd2SBrmGr2krAXmQquT72eusyP5E8HFhCy1iYt22 |  | ||||||
| aL68dZLv9/sRAF08t9Wy+eYjD/hCj67t7uGCZQT8wJbKr8aJcjwVwJgghh+3EydK |  | ||||||
| h+7fBVO49PLL0NWy+8GT8y7a04calFfLvZEA2UMaunBis3dE1KMFfJL/0JO+sKnF |  | ||||||
| 2TkK01XDDJURK5Lhuvc7WrK2rSJ/fK+0GA== |  | ||||||
| -----END PRIVATE KEY----- |  | ||||||
|     `, |  | ||||||
|   publicKey: `-----BEGIN CERTIFICATE----- |  | ||||||
| MIIEljCCAn4CCQDY+ZbC9FASVjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJE |  | ||||||
| RTAeFw0xOTA5MjAxNjAxNDRaFw0yMDA5MTkxNjAxNDRaMA0xCzAJBgNVBAYTAkRF |  | ||||||
| MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4thf9JEK/epoXt8hFr8t |  | ||||||
| pkRzmaEkgbSKoOga3uGXDLvdNf3BzSIxZ8pzRhZfUnutcmW1thdz3wre/pEJR7oN |  | ||||||
| QsfixbLL8/oS5QeXKiUGX0Ssfdg4W0TsoLcRva+1AZsf38MfiUPhzh1/UW/rMywW |  | ||||||
| asazQwRZdkkXb4nKJ2IFZx22qnAD4/5Sug+sfeKoFBF/rzI2yK7rognt7kW2LHv6 |  | ||||||
| rswHnZ1Z2P/gbhlZ/EhG9hFVRZwRLDscWKcuWcxkePDt2J1pDNqD6SYa6ZjGC3AE |  | ||||||
| TJw5iEA1bLQ9YvjDNpVYcf6ZvcSilIFjSQu5cs9sUbHGeKTrS5HzfeJXh1PfJyL8 |  | ||||||
| X0Hu7UBSjfSudso3baE9FGiBFBW2cnXZKDZGtV8eq/qxPetOOgS09pVbNP6508WV |  | ||||||
| BR+rz98/VDZLZqcbZ2UpOuz4+kAKmbYE9GplxKQZZO7wWEox7Mid/uUdcqEo4QKn |  | ||||||
| no6ujOuzQzn5a2oOS0k5Hk3uHapNJWlW9YI3LHtfADpYH+6cOR+/c3JWBzQJ6AD7 |  | ||||||
| muvNzA9mWXeHqLxMMP4pkmb7otzZYrEkodUqJgAQxcYhGh6XsCPfJ/D9RN734OJc |  | ||||||
| gleVXFI8Kz455HxCW19XNfz16k7T6kqhZ/6SOBbkxEuqg7oEthAP109ZZzgx4oDo |  | ||||||
| hQsw24TjLkI4SPIc7nr60UUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAu0+zrg0C |  | ||||||
| mlSv4Yi24OwB7TBvx+WHesl1IilCUdTiiUMo3NumvsU9Dr3Jkd0jGqYI0eyH4gIt |  | ||||||
| KrhAveXfEw7tAOEHiYicmAdIFtyzh++ZWb8mgbBeqij1MP/76Jv+cc0lUqpfRo/A |  | ||||||
| qytAsPAILuyL1o1jh28JHcq+v+WYn/FEhjUlH6emhGKGlsAjhUPjzK8MEshNolhj |  | ||||||
| t2UXw9WB5B2xWvrqlNMy0F3NAZBkZ/+k21HZo6FmVi+q6OEGcOo7wJt6wrH/lko9 |  | ||||||
| LxX96GC1JoN1Pfr2FoTKy1WHzrSfyGmDIUCrbaYQ58UuMOR+5eIPPdkf/030u5eX |  | ||||||
| xXhF2fBujD57E2zQGh/l2MrOjamcSo0+wYhOqlX3WNdaKNAzPqloBnF6w7eqLYde |  | ||||||
| h9He39ySmxjENwv3miOjEP1sBeMBSRfL/ckEonfK5uJgYA5nVMQ3ojUeDMZzLfFE |  | ||||||
| Ue2WHt+uPyYk7mMZfOrK2uHzI2/Coqj7lbfRodFwj+fCArYBck2NZannDPKA6X8V |  | ||||||
| TzJTbTCteOUUJTrcfZ0gGhGkF4nYLmX5OI+TPqrDJf0fZ+mzAEHzDDVXcBYpYRDr |  | ||||||
| r8d9QwrK+WaqVi2ofbMfMByVF72jgeJNa4nxwT9bVbu/Q1T2Lt+YPb4pQ7yCoUgS |  | ||||||
| JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
|     `, |  | ||||||
| }; |  | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								test/key.pem
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								test/key.pem
									
									
									
									
									
								
							| @@ -1,52 +0,0 @@ | |||||||
| -----BEGIN PRIVATE KEY----- |  | ||||||
| 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 |  | ||||||
| 2TkK01XDDJURK5Lhuvc7WrK2rSJ/fK+0GA== |  | ||||||
| -----END PRIVATE KEY----- |  | ||||||
							
								
								
									
										276
									
								
								test/test.ts
									
									
									
									
									
								
							
							
						
						
									
										276
									
								
								test/test.ts
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| import { expect, tap } from '@push.rocks/tapbundle'; | import { expect, tap } from '@push.rocks/tapbundle'; | ||||||
| import * as smartproxy from '../ts/index.js'; | import * as smartproxy from '../ts/index.js'; | ||||||
| import { testCertificates } from './helpers/certificates.js'; | import { loadTestCertificates } from './helpers/certificates.js'; | ||||||
| import * as https from 'https'; | import * as https from 'https'; | ||||||
| import * as http from 'http'; | import * as http from 'http'; | ||||||
| import { WebSocket, WebSocketServer } from 'ws'; | import { WebSocket, WebSocketServer } from 'ws'; | ||||||
| @@ -8,6 +8,7 @@ import { WebSocket, WebSocketServer } from 'ws'; | |||||||
| let testProxy: smartproxy.NetworkProxy; | let testProxy: smartproxy.NetworkProxy; | ||||||
| let testServer: http.Server; | let testServer: http.Server; | ||||||
| let wsServer: WebSocketServer; | let wsServer: WebSocketServer; | ||||||
|  | let testCertificates: { privateKey: string; publicKey: string }; | ||||||
|  |  | ||||||
| // Helper function to make HTTPS requests | // Helper function to make HTTPS requests | ||||||
| async function makeHttpsRequest( | async function makeHttpsRequest( | ||||||
| @@ -32,28 +33,138 @@ async function makeHttpsRequest( | |||||||
|  |  | ||||||
| // Setup test environment | // Setup test environment | ||||||
| tap.test('setup test environment', async () => { | tap.test('setup test environment', async () => { | ||||||
|  |   // Load and validate certificates | ||||||
|  |   console.log('[TEST] Loading and validating certificates'); | ||||||
|  |   testCertificates = loadTestCertificates(); | ||||||
|  |   console.log('[TEST] Certificates loaded and validated'); | ||||||
|   // Create a test HTTP server |   // Create a test HTTP server | ||||||
|   testServer = http.createServer((req, res) => { |   testServer = http.createServer((req, res) => { | ||||||
|  |     console.log('[TEST SERVER] Received HTTP request:', { | ||||||
|  |       url: req.url, | ||||||
|  |       method: req.method, | ||||||
|  |       headers: req.headers | ||||||
|  |     }); | ||||||
|     res.writeHead(200, { 'Content-Type': 'text/plain' }); |     res.writeHead(200, { 'Content-Type': 'text/plain' }); | ||||||
|     res.end('Hello from test server!'); |     res.end('Hello from test server!'); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   // Create a WebSocket server |   // Handle WebSocket upgrade requests | ||||||
|   wsServer = new WebSocketServer({ noServer: true }); |  | ||||||
|   wsServer.on('connection', (ws) => { |  | ||||||
|     ws.on('message', (message) => { |  | ||||||
|       ws.send('Echo: ' + message); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   // Handle upgrade requests |  | ||||||
|   testServer.on('upgrade', (request, socket, head) => { |   testServer.on('upgrade', (request, socket, head) => { | ||||||
|  |     console.log('[TEST SERVER] Received WebSocket upgrade request:', { | ||||||
|  |       url: request.url, | ||||||
|  |       method: request.method, | ||||||
|  |       headers: { | ||||||
|  |         host: request.headers.host, | ||||||
|  |         upgrade: request.headers.upgrade, | ||||||
|  |         connection: request.headers.connection, | ||||||
|  |         'sec-websocket-key': request.headers['sec-websocket-key'], | ||||||
|  |         'sec-websocket-version': request.headers['sec-websocket-version'], | ||||||
|  |         'sec-websocket-protocol': request.headers['sec-websocket-protocol'] | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     if (request.headers.upgrade?.toLowerCase() !== 'websocket') { | ||||||
|  |       console.log('[TEST SERVER] Not a WebSocket upgrade request'); | ||||||
|  |       socket.destroy(); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     console.log('[TEST SERVER] Handling WebSocket upgrade'); | ||||||
|     wsServer.handleUpgrade(request, socket, head, (ws) => { |     wsServer.handleUpgrade(request, socket, head, (ws) => { | ||||||
|  |       console.log('[TEST SERVER] WebSocket connection upgraded'); | ||||||
|       wsServer.emit('connection', ws, request); |       wsServer.emit('connection', ws, request); | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|  |   // Create a WebSocket server | ||||||
|  |   console.log('[TEST SERVER] Creating WebSocket server'); | ||||||
|  |   wsServer = new WebSocketServer({ | ||||||
|  |     noServer: true, | ||||||
|  |     perMessageDeflate: false, | ||||||
|  |     clientTracking: true, | ||||||
|  |     handleProtocols: () => 'echo-protocol' | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   wsServer.on('connection', (ws, request) => { | ||||||
|  |     console.log('[TEST SERVER] WebSocket connection established:', { | ||||||
|  |       url: request.url, | ||||||
|  |       headers: { | ||||||
|  |         host: request.headers.host, | ||||||
|  |         upgrade: request.headers.upgrade, | ||||||
|  |         connection: request.headers.connection, | ||||||
|  |         'sec-websocket-key': request.headers['sec-websocket-key'], | ||||||
|  |         'sec-websocket-version': request.headers['sec-websocket-version'], | ||||||
|  |         'sec-websocket-protocol': request.headers['sec-websocket-protocol'] | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     // Set up connection timeout | ||||||
|  |     const connectionTimeout = setTimeout(() => { | ||||||
|  |       console.error('[TEST SERVER] WebSocket connection timed out'); | ||||||
|  |       ws.terminate(); | ||||||
|  |     }, 5000); | ||||||
|  |  | ||||||
|  |     // Clear timeout when connection is properly closed | ||||||
|  |     const clearConnectionTimeout = () => { | ||||||
|  |       clearTimeout(connectionTimeout); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     ws.on('message', (message) => { | ||||||
|  |       const msg = message.toString(); | ||||||
|  |       console.log('[TEST SERVER] Received message:', msg); | ||||||
|  |       try { | ||||||
|  |         const response = `Echo: ${msg}`; | ||||||
|  |         console.log('[TEST SERVER] Sending response:', response); | ||||||
|  |         ws.send(response); | ||||||
|  |         // Clear timeout on successful message exchange | ||||||
|  |         clearConnectionTimeout(); | ||||||
|  |       } catch (error) { | ||||||
|  |         console.error('[TEST SERVER] Error sending message:', error); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     ws.on('error', (error) => { | ||||||
|  |       console.error('[TEST SERVER] WebSocket error:', error); | ||||||
|  |       clearConnectionTimeout(); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     ws.on('close', (code, reason) => { | ||||||
|  |       console.log('[TEST SERVER] WebSocket connection closed:', { | ||||||
|  |         code, | ||||||
|  |         reason: reason.toString(), | ||||||
|  |         wasClean: code === 1000 || code === 1001 | ||||||
|  |       }); | ||||||
|  |       clearConnectionTimeout(); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     ws.on('ping', (data) => { | ||||||
|  |       try { | ||||||
|  |         console.log('[TEST SERVER] Received ping, sending pong'); | ||||||
|  |         ws.pong(data); | ||||||
|  |       } catch (error) { | ||||||
|  |         console.error('[TEST SERVER] Error sending pong:', error); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     ws.on('pong', (data) => { | ||||||
|  |       console.log('[TEST SERVER] Received pong'); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   wsServer.on('error', (error) => { | ||||||
|  |     console.error('Test server: WebSocket server error:', error); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   wsServer.on('headers', (headers) => { | ||||||
|  |     console.log('Test server: WebSocket headers:', headers); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   wsServer.on('close', () => { | ||||||
|  |     console.log('Test server: WebSocket server closed'); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|   await new Promise<void>((resolve) => testServer.listen(3000, resolve)); |   await new Promise<void>((resolve) => testServer.listen(3000, resolve)); | ||||||
|  |   console.log('Test server listening on port 3000'); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('should create proxy instance', async () => { | tap.test('should create proxy instance', async () => { | ||||||
| @@ -64,7 +175,9 @@ tap.test('should create proxy instance', async () => { | |||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('should start the proxy server', async () => { | tap.test('should start the proxy server', async () => { | ||||||
|  |   console.log('[TEST] Starting the proxy server'); | ||||||
|   await testProxy.start(); |   await testProxy.start(); | ||||||
|  |   console.log('[TEST] Proxy server started'); | ||||||
|  |  | ||||||
|   // Configure proxy with test certificates |   // Configure proxy with test certificates | ||||||
|   testProxy.updateProxyConfigs([ |   testProxy.updateProxyConfigs([ | ||||||
| @@ -74,8 +187,10 @@ tap.test('should start the proxy server', async () => { | |||||||
|       hostName: 'push.rocks', |       hostName: 'push.rocks', | ||||||
|       publicKey: testCertificates.publicKey, |       publicKey: testCertificates.publicKey, | ||||||
|       privateKey: testCertificates.privateKey, |       privateKey: testCertificates.privateKey, | ||||||
|     }, |     } | ||||||
|   ]); |   ]); | ||||||
|  |  | ||||||
|  |   console.log('[TEST] Proxy configuration updated'); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('should route HTTPS requests based on host header', async () => { | tap.test('should route HTTPS requests based on host header', async () => { | ||||||
| @@ -104,41 +219,110 @@ tap.test('should handle unknown host headers', async () => { | |||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('should support WebSocket connections', async () => { | tap.test('should support WebSocket connections', async () => { | ||||||
|  |   console.log('\n[TEST] ====== WebSocket Test Started ======'); | ||||||
|  |   console.log('[TEST] Test server port:', 3000); | ||||||
|  |   console.log('[TEST] Proxy server port:', 3001); | ||||||
|  |   console.log('\n[TEST] Starting WebSocket test'); | ||||||
|  |  | ||||||
|  |   // First configure the proxy with test certificates | ||||||
|  |   console.log('[TEST] Configuring proxy with test certificates'); | ||||||
|  |   testProxy.updateProxyConfigs([ | ||||||
|  |     { | ||||||
|  |       destinationIp: '127.0.0.1', | ||||||
|  |       destinationPort: '3000', | ||||||
|  |       hostName: 'push.rocks', | ||||||
|  |       publicKey: testCertificates.publicKey, | ||||||
|  |       privateKey: testCertificates.privateKey, | ||||||
|  |     } | ||||||
|  |   ]); | ||||||
|  |  | ||||||
|   return new Promise<void>((resolve, reject) => { |   return new Promise<void>((resolve, reject) => { | ||||||
|     console.log('Starting WebSocket test...'); |     console.log('[TEST] Creating WebSocket client'); | ||||||
|     const ws = new WebSocket('wss://localhost:3001', { |  | ||||||
|       rejectUnauthorized: false, |     // Create WebSocket client with SSL/TLS options | ||||||
|  |     const wsUrl = 'wss://push.rocks:3001'; | ||||||
|  |     console.log('[TEST] Creating WebSocket connection to:', wsUrl); | ||||||
|  |      | ||||||
|  |     const ws = new WebSocket(wsUrl, { | ||||||
|  |       rejectUnauthorized: false, // Accept self-signed certificates | ||||||
|  |       handshakeTimeout: 5000, | ||||||
|  |       perMessageDeflate: false, | ||||||
|       headers: { |       headers: { | ||||||
|         'Host': 'push.rocks' |         'Host': 'push.rocks', | ||||||
|       } |         'Connection': 'Upgrade', | ||||||
|  |         'Upgrade': 'websocket', | ||||||
|  |         'Sec-WebSocket-Version': '13' | ||||||
|  |       }, | ||||||
|  |       protocol: 'echo-protocol', | ||||||
|  |       agent: new https.Agent({ | ||||||
|  |         rejectUnauthorized: false // Also needed for the underlying HTTPS connection | ||||||
|  |       }) | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |     console.log('[TEST] WebSocket client created'); | ||||||
|  |  | ||||||
|  |     let resolved = false; | ||||||
|  |     const cleanup = () => { | ||||||
|  |       if (!resolved) { | ||||||
|  |         resolved = true; | ||||||
|  |         try { | ||||||
|  |           console.log('[TEST] Cleaning up WebSocket connection'); | ||||||
|  |           ws.close(); | ||||||
|  |           resolve(); | ||||||
|  |         } catch (error) { | ||||||
|  |           console.error('[TEST] Error during cleanup:', error); | ||||||
|  |           reject(error); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     const timeout = setTimeout(() => { |     const timeout = setTimeout(() => { | ||||||
|       ws.close(); |       console.error('[TEST] WebSocket test timed out'); | ||||||
|  |       cleanup(); | ||||||
|       reject(new Error('WebSocket test timed out after 5 seconds')); |       reject(new Error('WebSocket test timed out after 5 seconds')); | ||||||
|     }, 5000); |     }, 5000); | ||||||
|  |  | ||||||
|  |     // Connection establishment events | ||||||
|  |     ws.on('upgrade', (response) => { | ||||||
|  |       console.log('[TEST] WebSocket upgrade response received:', { | ||||||
|  |         headers: response.headers, | ||||||
|  |         statusCode: response.statusCode | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|     ws.on('open', () => { |     ws.on('open', () => { | ||||||
|       console.log('WebSocket connection opened'); |       console.log('[TEST] WebSocket connection opened'); | ||||||
|       ws.send('Hello WebSocket'); |       try { | ||||||
|  |         console.log('[TEST] Sending test message'); | ||||||
|  |         ws.send('Hello WebSocket'); | ||||||
|  |       } catch (error) { | ||||||
|  |         console.error('[TEST] Error sending message:', error); | ||||||
|  |         cleanup(); | ||||||
|  |         reject(error); | ||||||
|  |       } | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     ws.on('message', (data) => { |     ws.on('message', (message) => { | ||||||
|       console.log('Received message:', data.toString()); |       console.log('[TEST] Received message:', message.toString()); | ||||||
|       expect(data.toString()).toEqual('Echo: Hello WebSocket'); |       if (message.toString() === 'Hello WebSocket') { | ||||||
|       clearTimeout(timeout); |         console.log('[TEST] Message received correctly'); | ||||||
|       ws.close(); |         clearTimeout(timeout); | ||||||
|       resolve(); |         cleanup(); | ||||||
|  |       } | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     ws.on('error', (err) => { |     ws.on('error', (error) => { | ||||||
|       console.error('WebSocket error:', err); |       console.error('[TEST] WebSocket error:', error); | ||||||
|       clearTimeout(timeout); |       cleanup(); | ||||||
|       reject(err); |       reject(error); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     ws.on('close', () => { |     ws.on('close', (code, reason) => { | ||||||
|       console.log('WebSocket connection closed'); |       console.log('[TEST] WebSocket connection closed:', { | ||||||
|  |         code, | ||||||
|  |         reason: reason.toString() | ||||||
|  |       }); | ||||||
|  |       cleanup(); | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
| @@ -160,10 +344,36 @@ tap.test('should handle custom headers', async () => { | |||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('cleanup', async () => { | tap.test('cleanup', async () => { | ||||||
|  |   console.log('[TEST] Starting cleanup'); | ||||||
|  |  | ||||||
|   // Clean up all servers |   // Clean up all servers | ||||||
|   await new Promise<void>((resolve) => wsServer.close(() => resolve())); |   console.log('[TEST] Terminating WebSocket clients'); | ||||||
|   await new Promise<void>((resolve) => testServer.close(() => resolve())); |   wsServer.clients.forEach((client) => { | ||||||
|  |     client.terminate(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   console.log('[TEST] Closing WebSocket server'); | ||||||
|  |   await new Promise<void>((resolve) => wsServer.close(() => { | ||||||
|  |     console.log('[TEST] WebSocket server closed'); | ||||||
|  |     resolve(); | ||||||
|  |   })); | ||||||
|  |  | ||||||
|  |   console.log('[TEST] Closing test server'); | ||||||
|  |   await new Promise<void>((resolve) => testServer.close(() => { | ||||||
|  |     console.log('[TEST] Test server closed'); | ||||||
|  |     resolve(); | ||||||
|  |   })); | ||||||
|  |  | ||||||
|  |   console.log('[TEST] Stopping proxy'); | ||||||
|   await testProxy.stop(); |   await testProxy.stop(); | ||||||
|  |   console.log('[TEST] Cleanup complete'); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | process.on('exit', () => { | ||||||
|  |   console.log('[TEST] Shutting down test server'); | ||||||
|  |   testServer.close(() => console.log('[TEST] Test server shut down')); | ||||||
|  |   wsServer.close(() => console.log('[TEST] WebSocket server shut down')); | ||||||
|  |   testProxy.stop().then(() => console.log('[TEST] Proxy server stopped')); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.start(); | tap.start(); | ||||||
|   | |||||||
| @@ -3,6 +3,6 @@ | |||||||
|  */ |  */ | ||||||
| export const commitinfo = { | export const commitinfo = { | ||||||
|   name: '@push.rocks/smartproxy', |   name: '@push.rocks/smartproxy', | ||||||
|   version: '3.1.1', |   version: '3.1.2', | ||||||
|   description: 'a proxy for handling high workloads of proxying' |   description: 'a proxy for handling high workloads of proxying' | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,8 @@ | |||||||
| import * as plugins from './smartproxy.plugins.js'; | import * as plugins from './smartproxy.plugins.js'; | ||||||
| import { ProxyRouter } from './smartproxy.classes.router.js'; | import { ProxyRouter } from './smartproxy.classes.router.js'; | ||||||
|  | import * as fs from 'fs'; | ||||||
|  | import * as path from 'path'; | ||||||
|  | import { fileURLToPath } from 'url'; | ||||||
|  |  | ||||||
| export interface INetworkProxyOptions { | export interface INetworkProxyOptions { | ||||||
|   port: number; |   port: number; | ||||||
| @@ -18,6 +21,7 @@ export class NetworkProxy { | |||||||
|   public socketMap = new plugins.lik.ObjectMap<plugins.net.Socket>(); |   public socketMap = new plugins.lik.ObjectMap<plugins.net.Socket>(); | ||||||
|   public defaultHeaders: { [key: string]: string } = {}; |   public defaultHeaders: { [key: string]: string } = {}; | ||||||
|   public heartbeatInterval: NodeJS.Timeout; |   public heartbeatInterval: NodeJS.Timeout; | ||||||
|  |   private defaultCertificates: { key: string; cert: string }; | ||||||
|  |  | ||||||
|   public alreadyAddedReverseConfigs: { |   public alreadyAddedReverseConfigs: { | ||||||
|     [hostName: string]: plugins.tsclass.network.IReverseProxyConfig; |     [hostName: string]: plugins.tsclass.network.IReverseProxyConfig; | ||||||
| @@ -25,6 +29,18 @@ export class NetworkProxy { | |||||||
|  |  | ||||||
|   constructor(optionsArg: INetworkProxyOptions) { |   constructor(optionsArg: INetworkProxyOptions) { | ||||||
|     this.options = optionsArg; |     this.options = optionsArg; | ||||||
|  |     const __dirname = path.dirname(fileURLToPath(import.meta.url)); | ||||||
|  |     const certPath = path.join(__dirname, '..', 'assets', 'certs'); | ||||||
|  |      | ||||||
|  |     try { | ||||||
|  |       this.defaultCertificates = { | ||||||
|  |         key: fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8'), | ||||||
|  |         cert: fs.readFileSync(path.join(certPath, 'cert.pem'), 'utf8') | ||||||
|  |       }; | ||||||
|  |     } catch (error) { | ||||||
|  |       console.error('Error loading certificates:', error); | ||||||
|  |       throw error; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
| @@ -32,94 +48,9 @@ export class NetworkProxy { | |||||||
|    */ |    */ | ||||||
|   public async start() { |   public async start() { | ||||||
|     this.httpsServer = plugins.https.createServer( |     this.httpsServer = plugins.https.createServer( | ||||||
|       // ================ |  | ||||||
|       // Spotted this keypair in the code? |  | ||||||
|       // Don't get exited: |  | ||||||
|       // It is an invalid default keypair. |  | ||||||
|       // For proper requests custom domain level keypairs are used that are provided in the reverse config |  | ||||||
|       // ================ |  | ||||||
|       { |       { | ||||||
|         key: `-----BEGIN PRIVATE KEY----- |         key: this.defaultCertificates.key, | ||||||
| MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQDi2F/0kQr96mhe |         cert: this.defaultCertificates.cert | ||||||
| 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 |  | ||||||
| 2TkK01XDDJURK5Lhuvc7WrK2rSJ/fK+0GA== |  | ||||||
| -----END PRIVATE KEY----- |  | ||||||
|     `, |  | ||||||
|         cert: `-----BEGIN CERTIFICATE----- |  | ||||||
| MIIEljCCAn4CCQDY+ZbC9FASVjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJE |  | ||||||
| RTAeFw0xOTA5MjAxNjAxNDRaFw0yMDA5MTkxNjAxNDRaMA0xCzAJBgNVBAYTAkRF |  | ||||||
| MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4thf9JEK/epoXt8hFr8t |  | ||||||
| pkRzmaEkgbSKoOga3uGXDLvdNf3BzSIxZ8pzRhZfUnutcmW1thdz3wre/pEJR7oN |  | ||||||
| QsfixbLL8/oS5QeXKiUGX0Ssfdg4W0TsoLcRva+1AZsf38MfiUPhzh1/UW/rMywW |  | ||||||
| asazQwRZdkkXb4nKJ2IFZx22qnAD4/5Sug+sfeKoFBF/rzI2yK7rognt7kW2LHv6 |  | ||||||
| rswHnZ1Z2P/gbhlZ/EhG9hFVRZwRLDscWKcuWcxkePDt2J1pDNqD6SYa6ZjGC3AE |  | ||||||
| TJw5iEA1bLQ9YvjDNpVYcf6ZvcSilIFjSQu5cs9sUbHGeKTrS5HzfeJXh1PfJyL8 |  | ||||||
| X0Hu7UBSjfSudso3baE9FGiBFBW2cnXZKDZGtV8eq/qxPetOOgS09pVbNP6508WV |  | ||||||
| BR+rz98/VDZLZqcbZ2UpOuz4+kAKmbYE9GplxKQZZO7wWEox7Mid/uUdcqEo4QKn |  | ||||||
| no6ujOuzQzn5a2oOS0k5Hk3uHapNJWlW9YI3LHtfADpYH+6cOR+/c3JWBzQJ6AD7 |  | ||||||
| muvNzA9mWXeHqLxMMP4pkmb7otzZYrEkodUqJgAQxcYhGh6XsCPfJ/D9RN734OJc |  | ||||||
| gleVXFI8Kz455HxCW19XNfz16k7T6kqhZ/6SOBbkxEuqg7oEthAP109ZZzgx4oDo |  | ||||||
| hQsw24TjLkI4SPIc7nr60UUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAu0+zrg0C |  | ||||||
| mlSv4Yi24OwB7TBvx+WHesl1IilCUdTiiUMo3NumvsU9Dr3Jkd0jGqYI0eyH4gIt |  | ||||||
| KrhAveXfEw7tAOEHiYicmAdIFtyzh++ZWb8mgbBeqij1MP/76Jv+cc0lUqpfRo/A |  | ||||||
| qytAsPAILuyL1o1jh28JHcq+v+WYn/FEhjUlH6emhGKGlsAjhUPjzK8MEshNolhj |  | ||||||
| t2UXw9WB5B2xWvrqlNMy0F3NAZBkZ/+k21HZo6FmVi+q6OEGcOo7wJt6wrH/lko9 |  | ||||||
| LxX96GC1JoN1Pfr2FoTKy1WHzrSfyGmDIUCrbaYQ58UuMOR+5eIPPdkf/030u5eX |  | ||||||
| xXhF2fBujD57E2zQGh/l2MrOjamcSo0+wYhOqlX3WNdaKNAzPqloBnF6w7eqLYde |  | ||||||
| h9He39ySmxjENwv3miOjEP1sBeMBSRfL/ckEonfK5uJgYA5nVMQ3ojUeDMZzLfFE |  | ||||||
| Ue2WHt+uPyYk7mMZfOrK2uHzI2/Coqj7lbfRodFwj+fCArYBck2NZannDPKA6X8V |  | ||||||
| TzJTbTCteOUUJTrcfZ0gGhGkF4nYLmX5OI+TPqrDJf0fZ+mzAEHzDDVXcBYpYRDr |  | ||||||
| r8d9QwrK+WaqVi2ofbMfMByVF72jgeJNa4nxwT9bVbu/Q1T2Lt+YPb4pQ7yCoUgS |  | ||||||
| JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
|     `, |  | ||||||
|       }, |       }, | ||||||
|       async (originRequest, originResponse) => { |       async (originRequest, originResponse) => { | ||||||
|         /** |         /** | ||||||
|   | |||||||
| @@ -16,9 +16,18 @@ export class ProxyRouter { | |||||||
|    */ |    */ | ||||||
|   public routeReq(req: plugins.http.IncomingMessage): plugins.tsclass.network.IReverseProxyConfig { |   public routeReq(req: plugins.http.IncomingMessage): plugins.tsclass.network.IReverseProxyConfig { | ||||||
|     const originalHost = req.headers.host; |     const originalHost = req.headers.host; | ||||||
|  |     if (!originalHost) { | ||||||
|  |       console.error('No host header found in request'); | ||||||
|  |       return undefined; | ||||||
|  |     } | ||||||
|  |     // Strip port from host if present | ||||||
|  |     const hostWithoutPort = originalHost.split(':')[0]; | ||||||
|     const correspodingReverseProxyConfig = this.reverseProxyConfigs.find((reverseConfig) => { |     const correspodingReverseProxyConfig = this.reverseProxyConfigs.find((reverseConfig) => { | ||||||
|       return reverseConfig.hostName === originalHost; |       return reverseConfig.hostName === hostWithoutPort; | ||||||
|     }); |     }); | ||||||
|  |     if (!correspodingReverseProxyConfig) { | ||||||
|  |       console.error(`No config found for host: ${hostWithoutPort}`); | ||||||
|  |     } | ||||||
|     return correspodingReverseProxyConfig; |     return correspodingReverseProxyConfig; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								ts/smartproxy.helpers.certificates.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								ts/smartproxy.helpers.certificates.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | import * as fs from 'fs'; | ||||||
|  | import * as path from 'path'; | ||||||
|  | import { fileURLToPath } from 'url'; | ||||||
|  |  | ||||||
|  | const __dirname = path.dirname(fileURLToPath(import.meta.url)); | ||||||
|  |  | ||||||
|  | export interface ICertificates { | ||||||
|  |   privateKey: string; | ||||||
|  |   publicKey: string; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function loadDefaultCertificates(): ICertificates { | ||||||
|  |   try { | ||||||
|  |     const certPath = path.join(__dirname, '..', 'assets', 'certs'); | ||||||
|  |     const privateKey = fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8'); | ||||||
|  |     const publicKey = fs.readFileSync(path.join(certPath, 'cert.pem'), 'utf8'); | ||||||
|  |  | ||||||
|  |     if (!privateKey || !publicKey) { | ||||||
|  |       throw new Error('Failed to load default certificates'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |       privateKey, | ||||||
|  |       publicKey | ||||||
|  |     }; | ||||||
|  |   } catch (error) { | ||||||
|  |     console.error('Error loading default certificates:', error); | ||||||
|  |     throw error; | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user