smc-hub
Version:
CoCalc: Backend webserver component
49 lines (42 loc) • 1.73 kB
text/typescript
import Cookies from "cookies";
import { versionCookieName } from "smc-util/consts";
import base_path from "smc-util-node/base-path";
import getServerSettings from "../servers/server-settings";
import getLogger from "../logger";
let minVersion: number = 0;
const winston = getLogger("proxy: version");
// Import to wait until we know the valid min_version before serving.
export async function init(): Promise<void> {
const serverSettings = await getServerSettings();
minVersion = serverSettings.version["min_version"] ?? 0;
serverSettings.table.on("change", () => {
minVersion = serverSettings.version["min_version"] ?? 0;
});
}
// Returns true if the version check **fails**
// If res is not null, sends a message. If it is
// null, just returns true but doesn't send a response.
export function versionCheckFails(req, res?): boolean {
const cookies = new Cookies(req);
/* NOTE: The name of the cookie $VERSION_COOKIE_NAME is
also used in the frontend code file smc-webapp/set-version-cookie.js
but everybody imports it from smc-util/consts.
*/
const rawVal = cookies.get(versionCookieName(base_path));
const version = parseInt(rawVal);
winston.debug(`version check version=${version}, minVersion=${minVersion}`);
if (isNaN(version) || version < minVersion) {
if (res != null) {
// status code 4xx to indicate this is a client problem and not
// 5xx, a server problem
// 426 means "upgrade required"
res.writeHead(426, { "Content-Type": "text/html" });
res.end(
`426 (UPGRADE REQUIRED): reload CoCalc tab or restart your browser -- version=${version} < minVersion=${minVersion}`
);
}
return true;
} else {
return false;
}
}