|
|
@ -4,7 +4,7 @@ const fs = require("fs");
|
|
|
|
const http = require("http");
|
|
|
|
const http = require("http");
|
|
|
|
const { Server } = require("socket.io");
|
|
|
|
const { Server } = require("socket.io");
|
|
|
|
const { R } = require("redbean-node");
|
|
|
|
const { R } = require("redbean-node");
|
|
|
|
const { log } = require("../src/util");
|
|
|
|
const { log, isDev } = require("../src/util");
|
|
|
|
const Database = require("./database");
|
|
|
|
const Database = require("./database");
|
|
|
|
const util = require("util");
|
|
|
|
const util = require("util");
|
|
|
|
const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
|
|
|
|
const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
|
|
|
@ -103,7 +103,41 @@ class UptimeKumaServer {
|
|
|
|
UptimeKumaServer.monitorTypeList["real-browser"] = new RealBrowserMonitorType();
|
|
|
|
UptimeKumaServer.monitorTypeList["real-browser"] = new RealBrowserMonitorType();
|
|
|
|
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
|
|
|
|
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
|
|
|
|
|
|
|
|
|
|
|
|
this.io = new Server(this.httpServer);
|
|
|
|
this.io = new Server(this.httpServer, {
|
|
|
|
|
|
|
|
allowRequest: (req, callback) => {
|
|
|
|
|
|
|
|
let isOriginValid = true;
|
|
|
|
|
|
|
|
const bypass = isDev || process.env.UPTIME_KUMA_WS_ORIGIN_CHECK === "bypass";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!bypass) {
|
|
|
|
|
|
|
|
let host = req.headers.host;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If this is set, it means the request is from the browser
|
|
|
|
|
|
|
|
let origin = req.headers.origin;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If this is from the browser, check if the origin is allowed
|
|
|
|
|
|
|
|
if (origin) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
let originURL = new URL(origin);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (host !== originURL.host) {
|
|
|
|
|
|
|
|
isOriginValid = false;
|
|
|
|
|
|
|
|
log.error("auth", `Origin (${origin}) does not match host (${host}), IP: ${req.socket.remoteAddress}`);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
// Invalid origin url, probably not from browser
|
|
|
|
|
|
|
|
isOriginValid = false;
|
|
|
|
|
|
|
|
log.error("auth", `Invalid origin url (${origin}), IP: ${req.socket.remoteAddress}`);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
log.info("auth", `Origin is not set, IP: ${req.socket.remoteAddress}`);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
log.debug("auth", "Origin check is bypassed");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
callback(null, isOriginValid);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Initialise app after the database has been set up */
|
|
|
|
/** Initialise app after the database has been set up */
|
|
|
|