diff --git a/backend/internal/access-list.js b/backend/internal/access-list.js index 1fdd65b6a..42f610e08 100644 --- a/backend/internal/access-list.js +++ b/backend/internal/access-list.js @@ -27,20 +27,18 @@ const getProxyHostsUsingAccessListInLocations = async (accessListId) => { let result; if (isMysql()) { const searchObj = JSON.stringify([{ access_list_id: accessListId }]); - result = await db().raw( - "SELECT id FROM proxy_host WHERE is_deleted = 0 AND JSON_CONTAINS(locations, ?, ?)", - [searchObj, "$"], - ); + result = await db().raw("SELECT id FROM proxy_host WHERE is_deleted = 0 AND JSON_CONTAINS(locations, ?, ?)", [ + searchObj, + "$", + ]); } else if (isPostgres()) { - result = await db().raw( - "SELECT id FROM proxy_host WHERE is_deleted = 0 AND locations::jsonb @> ?::jsonb", - [JSON.stringify([{ access_list_id: accessListId }])], - ); + result = await db().raw("SELECT id FROM proxy_host WHERE is_deleted = 0 AND locations::jsonb @> ?::jsonb", [ + JSON.stringify([{ access_list_id: accessListId }]), + ]); } else { - result = await db().raw( - "SELECT id FROM proxy_host WHERE is_deleted = 0 AND locations LIKE ?", - [`%"access_list_id":${accessListId}%`], - ); + result = await db().raw("SELECT id FROM proxy_host WHERE is_deleted = 0 AND locations LIKE ?", [ + `%"access_list_id":${accessListId}%`, + ]); } // knex raw() returns [rows, metadata] for MySQL, { rows } for Postgres and rows for SQLite if (!Array.isArray(result)) { @@ -225,12 +223,15 @@ const internalAccessList = { // Also regenerate configs for proxy hosts that reference this access list in their locations const locationHostRows = await getProxyHostsUsingAccessListInLocations(data.id); if (locationHostRows?.length) { - const locationHostIds = locationHostRows.map((r) => r.id).filter((id) => { - // Exclude hosts already regenerated above - return !freshRow.proxy_hosts?.find((h) => h.id === id); - }); + const locationHostIds = locationHostRows + .map((r) => r.id) + .filter((id) => { + // Exclude hosts already regenerated above + return !freshRow.proxy_hosts?.find((h) => h.id === id); + }); if (locationHostIds.length) { - const locationHosts = await proxyHostModel.query() + const locationHosts = await proxyHostModel + .query() .where("is_deleted", 0) .whereIn("id", locationHostIds) .allowGraph(proxyHostModel.defaultAllowGraph) diff --git a/backend/internal/nginx.js b/backend/internal/nginx.js index 0ba90b0e8..4efd67f6f 100644 --- a/backend/internal/nginx.js +++ b/backend/internal/nginx.js @@ -289,26 +289,28 @@ const internalNginx = { // Set the IPv6 setting for the host host.ipv6 = internalNginx.ipv6Enabled(); - locationsPromise.then(() => { - renderEngine - .parseAndRender(template, host) - .then((config_text) => { - fs.writeFileSync(filename, config_text, { encoding: "utf8" }); - debug(logger, "Wrote config:", filename, config_text); + locationsPromise + .then(() => { + renderEngine + .parseAndRender(template, host) + .then((config_text) => { + fs.writeFileSync(filename, config_text, { encoding: "utf8" }); + debug(logger, "Wrote config:", filename, config_text); - // Restore locations array - host.locations = origLocations; + // Restore locations array + host.locations = origLocations; - resolve(true); - }) - .catch((err) => { - debug(logger, `Could not write ${filename}:`, err.message); - reject(new errs.ConfigurationError(err.message)); - }); - }).catch((err) => { - debug(logger, `Could not render locations for ${filename}:`, err.message); - reject(new errs.ConfigurationError(err.message)); - }); + resolve(true); + }) + .catch((err) => { + debug(logger, `Could not write ${filename}:`, err.message); + reject(new errs.ConfigurationError(err.message)); + }); + }) + .catch((err) => { + debug(logger, `Could not render locations for ${filename}:`, err.message); + reject(new errs.ConfigurationError(err.message)); + }); }); }, diff --git a/backend/internal/proxy-host.js b/backend/internal/proxy-host.js index b148b327a..9a3cf7e66 100644 --- a/backend/internal/proxy-host.js +++ b/backend/internal/proxy-host.js @@ -86,28 +86,28 @@ const internalProxyHost = { expand: ["certificate", "owner", "access_list.[clients,items]"], }); }) - .then(async (row) => { - // Configure nginx - return internalNginx.configure(proxyHostModel, "proxy_host", row).then(() => { - return row; - }); - }) - .then((row) => { - // Audit log - thisData.meta = _.assign({}, thisData.meta || {}, row.meta); - - // Add to audit log - return internalAuditLog - .add(access, { - action: "created", - object_type: "proxy-host", - object_id: row.id, - meta: thisData, - }) - .then(() => { + .then(async (row) => { + // Configure nginx + return internalNginx.configure(proxyHostModel, "proxy_host", row).then(() => { return row; }); - }); + }) + .then((row) => { + // Audit log + thisData.meta = _.assign({}, thisData.meta || {}, row.meta); + + // Add to audit log + return internalAuditLog + .add(access, { + action: "created", + object_type: "proxy-host", + object_id: row.id, + meta: thisData, + }) + .then(() => { + return row; + }); + }); }, /** @@ -207,24 +207,24 @@ const internalProxyHost = { }); }); }) - .then(() => { - return internalProxyHost - .get(access, { - id: thisData.id, - expand: ["owner", "certificate", "access_list.[clients,items]"], - }) - .then(async (row) => { - if (!row.enabled) { - // No need to add nginx config if host is disabled - return row; - } - // Configure nginx - return internalNginx.configure(proxyHostModel, "proxy_host", row).then((new_meta) => { - row.meta = new_meta; - return _.omit(internalHost.cleanRowCertificateMeta(row), omissions()); + .then(() => { + return internalProxyHost + .get(access, { + id: thisData.id, + expand: ["owner", "certificate", "access_list.[clients,items]"], + }) + .then(async (row) => { + if (!row.enabled) { + // No need to add nginx config if host is disabled + return row; + } + // Configure nginx + return internalNginx.configure(proxyHostModel, "proxy_host", row).then((new_meta) => { + row.meta = new_meta; + return _.omit(internalHost.cleanRowCertificateMeta(row), omissions()); + }); }); - }); - }); + }); }, /** @@ -331,36 +331,33 @@ const internalProxyHost = { expand: ["certificate", "owner", "access_list.[clients,items]"], }); }) - .then(async (row) => { - if (!row?.id) { - throw new errs.ItemNotFoundError(data.id); - } - if (row.enabled) { - throw new errs.ValidationError("Host is already enabled"); - } + .then(async (row) => { + if (!row?.id) { + throw new errs.ItemNotFoundError(data.id); + } + if (row.enabled) { + throw new errs.ValidationError("Host is already enabled"); + } - row.enabled = 1; + row.enabled = 1; - await proxyHostModel - .query() - .where("id", row.id) - .patch({ + await proxyHostModel.query().where("id", row.id).patch({ enabled: 1, }); - // Configure nginx - await internalNginx.configure(proxyHostModel, "proxy_host", row); + // Configure nginx + await internalNginx.configure(proxyHostModel, "proxy_host", row); - // Add to audit log - await internalAuditLog.add(access, { - action: "enabled", - object_type: "proxy-host", - object_id: row.id, - meta: _.omit(row, omissions()), + // Add to audit log + await internalAuditLog.add(access, { + action: "enabled", + object_type: "proxy-host", + object_id: row.id, + meta: _.omit(row, omissions()), + }); + + return true; }); - - return true; - }); }, /** diff --git a/backend/routes/logs.js b/backend/routes/logs.js index 9088507b3..09841b3bd 100644 --- a/backend/routes/logs.js +++ b/backend/routes/logs.js @@ -62,7 +62,10 @@ router enum: ["system", "letsencrypt", "host"], }, host_type: { - anyOf: [{ type: "null" }, { type: "string", enum: ["proxy", "redirection", "dead", "stream"] }], + anyOf: [ + { type: "null" }, + { type: "string", enum: ["proxy", "redirection", "dead", "stream"] }, + ], }, host_id: { anyOf: [{ type: "null" }, { type: "integer", minimum: 1 }], @@ -76,7 +79,10 @@ router level: { anyOf: [ { type: "null" }, - { type: "string", enum: ["INFO", "WARN", "ERROR", "DEBUG", "SUCCESS", "FATAL", "COMPLETE"] }, + { + type: "string", + enum: ["INFO", "WARN", "ERROR", "DEBUG", "SUCCESS", "FATAL", "COMPLETE"], + }, ], }, search: {