mirror of
https://github.com/AikidoSec/safe-chain.git
synced 2026-05-26 12:10:49 +00:00
WIP
This commit is contained in:
parent
2e1ee0dfa4
commit
d6dda73fb9
3 changed files with 22 additions and 2 deletions
|
|
@ -26,6 +26,10 @@ function writeError(message, ...optionalParams) {
|
||||||
console.error(message, ...optionalParams);
|
console.error(message, ...optionalParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function writeVerboseInformation(message, ...optionalParams) {
|
||||||
|
writeInformation(message, ...optionalParams);
|
||||||
|
}
|
||||||
|
|
||||||
function startProcess(message) {
|
function startProcess(message) {
|
||||||
if (isCi()) {
|
if (isCi()) {
|
||||||
return {
|
return {
|
||||||
|
|
@ -89,6 +93,7 @@ async function confirm(config) {
|
||||||
|
|
||||||
export const ui = {
|
export const ui = {
|
||||||
writeInformation,
|
writeInformation,
|
||||||
|
writeVerboseInformation,
|
||||||
writeWarning,
|
writeWarning,
|
||||||
writeError,
|
writeError,
|
||||||
emptyLine,
|
emptyLine,
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,16 @@
|
||||||
import https from "https";
|
import https from "https";
|
||||||
import { generateCertForHost } from "./certUtils.js";
|
import { generateCertForHost } from "./certUtils.js";
|
||||||
import { HttpsProxyAgent } from "https-proxy-agent";
|
import { HttpsProxyAgent } from "https-proxy-agent";
|
||||||
|
import { ui } from "../environment/userInteraction.js";
|
||||||
|
|
||||||
export function mitmConnect(req, clientSocket, isAllowed) {
|
export function mitmConnect(req, clientSocket, isAllowed) {
|
||||||
|
ui.writeVerboseInformation(`Safe-chain: Set up MITM tunnel for ${req.url}`);
|
||||||
const { hostname } = new URL(`http://${req.url}`);
|
const { hostname } = new URL(`http://${req.url}`);
|
||||||
|
|
||||||
clientSocket.on("error", () => {
|
clientSocket.on("error", (err) => {
|
||||||
|
ui.writeVerboseInformation(
|
||||||
|
`Safe-chain: Client socket error for ${req.url}: ${err.message}`
|
||||||
|
);
|
||||||
// NO-OP
|
// NO-OP
|
||||||
// This can happen if the client TCP socket sends RST instead of FIN.
|
// This can happen if the client TCP socket sends RST instead of FIN.
|
||||||
// Not subscribing to 'close' event will cause node to throw and crash.
|
// Not subscribing to 'close' event will cause node to throw and crash.
|
||||||
|
|
@ -28,6 +33,9 @@ function createHttpsServer(hostname, isAllowed) {
|
||||||
const targetUrl = `https://${hostname}${pathAndQuery}`;
|
const targetUrl = `https://${hostname}${pathAndQuery}`;
|
||||||
|
|
||||||
if (!(await isAllowed(targetUrl))) {
|
if (!(await isAllowed(targetUrl))) {
|
||||||
|
ui.writeVerboseInformation(
|
||||||
|
`Safe-chain: Blocking request to ${targetUrl}`
|
||||||
|
);
|
||||||
res.writeHead(403, "Forbidden - blocked by safe-chain");
|
res.writeHead(403, "Forbidden - blocked by safe-chain");
|
||||||
res.end("Blocked by safe-chain");
|
res.end("Blocked by safe-chain");
|
||||||
return;
|
return;
|
||||||
|
|
@ -57,7 +65,10 @@ function getRequestPathAndQuery(url) {
|
||||||
function forwardRequest(req, hostname, res) {
|
function forwardRequest(req, hostname, res) {
|
||||||
const proxyReq = createProxyRequest(hostname, req, res);
|
const proxyReq = createProxyRequest(hostname, req, res);
|
||||||
|
|
||||||
proxyReq.on("error", () => {
|
proxyReq.on("error", (err) => {
|
||||||
|
ui.writeVerboseInformation(
|
||||||
|
`Safe-chain: Error occurred while proxying request: ${err.message}`
|
||||||
|
);
|
||||||
res.writeHead(502);
|
res.writeHead(502);
|
||||||
res.end("Bad Gateway");
|
res.end("Bad Gateway");
|
||||||
});
|
});
|
||||||
|
|
@ -67,6 +78,9 @@ function forwardRequest(req, hostname, res) {
|
||||||
});
|
});
|
||||||
|
|
||||||
req.on("end", () => {
|
req.on("end", () => {
|
||||||
|
ui.writeVerboseInformation(
|
||||||
|
`Safe-chain: Finished proxying request to ${req.url} for ${hostname}`
|
||||||
|
);
|
||||||
proxyReq.end();
|
proxyReq.end();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,7 @@ function handleConnect(req, clientSocket, head) {
|
||||||
mitmConnect(req, clientSocket, isAllowedUrl);
|
mitmConnect(req, clientSocket, isAllowedUrl);
|
||||||
} else {
|
} else {
|
||||||
// For other hosts, just tunnel the request to the destination tcp socket
|
// For other hosts, just tunnel the request to the destination tcp socket
|
||||||
|
ui.writeVerboseInformation(`Safe-chain: Tunneling request to ${req.url}`);
|
||||||
tunnelRequest(req, clientSocket, head);
|
tunnelRequest(req, clientSocket, head);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue