UNPKG

smc-hub

Version:

CoCalc: Backend webserver component

79 lines (69 loc) 2.95 kB
/* * This file is part of CoCalc: Copyright © 2020 Sagemath, Inc. * License: AGPLv3 s.t. "Commons Clause" – see LICENSE.md for details */ /* Synchronized table that tracks server settings. */ import { site_settings_conf } from "smc-util/db-schema"; import { startswith } from "smc-util/misc"; import { once } from "smc-util/async-utils"; import { have_active_registration_tokens } from "../utils"; import { database } from "./database"; // Returns: // - all: a mutable javascript object that is a map from each server setting to its current value. // This includes VERY private info (e.g., stripe private key) // - pub: similar, but only subset of public info that is needed for browser UI rendering. // - version // - table: the table, so you can watch for on change events... // These get automatically updated when the database changes. interface ServerSettings { all: object; pub: object; version: object; table: any; } let serverSettings: ServerSettings | undefined = undefined; export default async function getServerSettings(): Promise<ServerSettings> { if (serverSettings != null) { return serverSettings; } const table = database.server_settings_synctable(); serverSettings = { all: {}, pub: {}, version: {}, table: table }; const { all, pub, version } = serverSettings; const update = async function () { table.get().forEach(function (record, field) { all[field] = record.get("value"); if (site_settings_conf[field]) { if (startswith(field, "version_")) { const field_val: number = (all[field] = parseInt(all[field])); if (isNaN(field_val) || field_val * 1000 >= new Date().getTime()) { // Guard against horrible error in which version is in future (so impossible) or NaN (e.g., an invalid string pasted by admin). // In this case, just use 0, which is always satisifed. all[field] = 0; } version[field] = all[field]; } pub[field] = all[field]; } }); // PRECAUTION: never make the required version bigger than version_recommended_browser. Very important // not to stupidly completely eliminate all cocalc users by a typo... for (const x of ["project", "browser"]) { const field = `version_min_${x}`; const minver = all[field] || 0; const recomm = all["version_recommended_browser"] || 0; pub[field] = version[field] = all[field] = Math.min(minver, recomm); } // finally, signal the front end if it allows users to anonymously sign in // OLD: this is currently derived from the existence of the sign up token // NEW (past july 2020): there is a regisrtation token table pub["allow_anonymous_sign_in"] = !(await have_active_registration_tokens( database )); }; table.on("change", update); table.on("init", update); await once(table, "init"); return serverSettings; }