From d2b48a648f0a253f23b03ee11029e41c97225da9 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 29 Nov 2024 10:46:27 +0100 Subject: [PATCH 01/14] Add support for user provided CA certificate to establish secure connections with a mysql/mariadb server --- server/config.js | 6 ++++++ server/database.js | 14 ++++++++++++++ server/setup-database.js | 13 +++++++++++++ 3 files changed, 33 insertions(+) diff --git a/server/config.js b/server/config.js index 515b90465..ce1e35293 100644 --- a/server/config.js +++ b/server/config.js @@ -1,3 +1,4 @@ +/* eslint-disable linebreak-style */ const isFreeBSD = /^freebsd/.test(process.platform); // Interop with browser @@ -19,6 +20,9 @@ const sslKeyPassphrase = args["ssl-key-passphrase"] || process.env.UPTIME_KUMA_S const isSSL = sslKey && sslCert; +const mariaDbSslCert = args["UPTIME_KUMA_DB_SSL_CERT"] || process.env.UPTIME_KUMA_DB_SSL_CERT || process.env.MARIADB_SSL_CERT || undefined; +const mariaDbUseSSL = mariaDbSslCert ? "true" : "false"; + /** * Get the local WebSocket URL * @returns {string} The local WebSocket URL @@ -43,4 +47,6 @@ module.exports = { isSSL, localWebSocketURL, demoMode, + mariaDbSslCert, + mariaDbUseSSL }; diff --git a/server/database.js b/server/database.js index 3b7646de8..55141faee 100644 --- a/server/database.js +++ b/server/database.js @@ -1,3 +1,4 @@ +/* eslint-disable linebreak-style */ const fs = require("fs"); const { R } = require("redbean-node"); const { setSetting, setting } = require("./util-server"); @@ -11,6 +12,7 @@ const { UptimeCalculator } = require("./uptime-calculator"); const dayjs = require("dayjs"); const { SimpleMigrationServer } = require("./utils/simple-migration-server"); const KumaColumnCompiler = require("./utils/knex/lib/dialects/mysql2/schema/mysql2-columncompiler"); +const { mariaDbSslCert, mariaDbUseSSL } = require("./config"); /** * Database & App Data Folder @@ -259,11 +261,22 @@ class Database { throw Error("Invalid database name. A database name can only consist of letters, numbers and underscores"); } + let sslConfig = null; + let serverCa = undefined; + if (mariaDbUseSSL) { + serverCa = [ fs.readFileSync(mariaDbSslCert, "utf8") ]; + sslConfig = { + rejectUnauthorized: true, + ca: serverCa + }; + } + const connection = await mysql.createConnection({ host: dbConfig.hostname, port: dbConfig.port, user: dbConfig.username, password: dbConfig.password, + ssl: sslConfig }); await connection.execute("CREATE DATABASE IF NOT EXISTS " + dbConfig.dbName + " CHARACTER SET utf8mb4"); @@ -278,6 +291,7 @@ class Database { password: dbConfig.password, database: dbConfig.dbName, timezone: "Z", + ssl: sslConfig, typeCast: function (field, next) { if (field.type === "DATETIME") { // Do not perform timezone conversion diff --git a/server/setup-database.js b/server/setup-database.js index 483f2c9a4..a73e28596 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -1,3 +1,4 @@ +/* eslint-disable linebreak-style */ const express = require("express"); const { log } = require("../src/util"); const expressStaticGzip = require("express-static-gzip"); @@ -6,6 +7,7 @@ const path = require("path"); const Database = require("./database"); const { allowDevAllOrigin } = require("./util-server"); const mysql = require("mysql2/promise"); +const { mariaDbUseSSL, mariaDbSslCert } = require("./config"); /** * A standalone express app that is used to setup a database @@ -208,11 +210,22 @@ class SetupDatabase { // Test connection try { + let sslConfig = null; + let serverCa = undefined; + if (mariaDbUseSSL) { + serverCa = [ fs.readFileSync(mariaDbSslCert, "utf8") ]; + sslConfig = { + rejectUnauthorized: true, + ca: serverCa + }; + } + const connection = await mysql.createConnection({ host: dbConfig.hostname, port: dbConfig.port, user: dbConfig.username, password: dbConfig.password, + ssl: sslConfig }); await connection.execute("SELECT 1"); connection.end(); From 98ba019cf08b3e46316763c5cefba35112131d6e Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 29 Nov 2024 11:42:06 +0100 Subject: [PATCH 02/14] Fix always true if condition --- server/database.js | 2 +- server/setup-database.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/server/database.js b/server/database.js index 55141faee..a452bfed1 100644 --- a/server/database.js +++ b/server/database.js @@ -263,7 +263,7 @@ class Database { let sslConfig = null; let serverCa = undefined; - if (mariaDbUseSSL) { + if (mariaDbUseSSL === true) { serverCa = [ fs.readFileSync(mariaDbSslCert, "utf8") ]; sslConfig = { rejectUnauthorized: true, diff --git a/server/setup-database.js b/server/setup-database.js index a73e28596..dc8486b8b 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -207,19 +207,17 @@ class SetupDatabase { this.runningSetup = false; return; } - // Test connection try { let sslConfig = null; let serverCa = undefined; - if (mariaDbUseSSL) { + if (mariaDbUseSSL === true) { serverCa = [ fs.readFileSync(mariaDbSslCert, "utf8") ]; sslConfig = { rejectUnauthorized: true, ca: serverCa }; } - const connection = await mysql.createConnection({ host: dbConfig.hostname, port: dbConfig.port, From 69896a7299a72f734ef0b719b335358f25d392f9 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 11:43:25 +0100 Subject: [PATCH 03/14] Rename the UPTIME_KUMA_DB_SSL_CERT environment variable to a more expressive name --- server/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/config.js b/server/config.js index ce1e35293..e94804b63 100644 --- a/server/config.js +++ b/server/config.js @@ -20,7 +20,7 @@ const sslKeyPassphrase = args["ssl-key-passphrase"] || process.env.UPTIME_KUMA_S const isSSL = sslKey && sslCert; -const mariaDbSslCert = args["UPTIME_KUMA_DB_SSL_CERT"] || process.env.UPTIME_KUMA_DB_SSL_CERT || process.env.MARIADB_SSL_CERT || undefined; +const mariaDbSslCert = args["UPTIME_KUMA_DB_SSL_CERT"] || process.env.UPTIME_KUMA_DB_CA_CERT || process.env.MARIADB_SSL_CERT || undefined; const mariaDbUseSSL = mariaDbSslCert ? "true" : "false"; /** From 0943e5d35407433d08cbfbd5af6838bd479864aa Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 11:43:43 +0100 Subject: [PATCH 04/14] Remove unused config --- server/database.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/server/database.js b/server/database.js index a452bfed1..26a46cf2b 100644 --- a/server/database.js +++ b/server/database.js @@ -12,7 +12,6 @@ const { UptimeCalculator } = require("./uptime-calculator"); const dayjs = require("dayjs"); const { SimpleMigrationServer } = require("./utils/simple-migration-server"); const KumaColumnCompiler = require("./utils/knex/lib/dialects/mysql2/schema/mysql2-columncompiler"); -const { mariaDbSslCert, mariaDbUseSSL } = require("./config"); /** * Database & App Data Folder @@ -186,10 +185,18 @@ class Database { /** * @typedef {string|undefined} envString - * @param {{type: "sqlite"} | {type:envString, hostname:envString, port:envString, database:envString, username:envString, password:envString}} dbConfig the database configuration that should be written + * @param {{type: "sqlite"} | {type:envString, hostname:envString, port:envString, database:envString, username:envString, password:envString, caFilePath:envString}} dbConfig the database configuration that should be written * @returns {void} */ static writeDBConfig(dbConfig) { + // Move CA file to the data directory + if (dbConfig.caFilePath) { + const dataCaFilePath = path.join(Database.dataDir, "mariadb-ca.pem"); + fs.renameSync(dbConfig.caFilePath, dataCaFilePath); + dbConfig.caFilePath = dataCaFilePath; + dbConfig.ssl = undefined; + dbConfig.caFile = undefined; + } fs.writeFileSync(path.join(Database.dataDir, "db-config.json"), JSON.stringify(dbConfig, null, 4)); } @@ -263,8 +270,8 @@ class Database { let sslConfig = null; let serverCa = undefined; - if (mariaDbUseSSL === true) { - serverCa = [ fs.readFileSync(mariaDbSslCert, "utf8") ]; + if (dbConfig.caFilePath) { + serverCa = [ fs.readFileSync(dbConfig.caFilePath, "utf8") ]; sslConfig = { rejectUnauthorized: true, ca: serverCa @@ -290,8 +297,9 @@ class Database { user: dbConfig.username, password: dbConfig.password, database: dbConfig.dbName, - timezone: "Z", ssl: sslConfig, + timezone: "Z", + //ssl: sslConfig, typeCast: function (field, next) { if (field.type === "DATETIME") { // Do not perform timezone conversion From bef4479976b730eeb295e77b3a4b004230745f78 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 11:44:24 +0100 Subject: [PATCH 05/14] Add CA file upload to the maria db ui --- src/lang/en.json | 1 + src/pages/SetupDatabase.vue | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/lang/en.json b/src/lang/en.json index e215f1031..cdea2ad9d 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -6,6 +6,7 @@ "setupDatabaseSQLite": "A simple database file, recommended for small-scale deployments. Prior to v2.0.0, Uptime Kuma used SQLite as the default database.", "settingUpDatabaseMSG": "Setting up the database. It may take a while, please be patient.", "dbName": "Database Name", + "caFile": "Database CA certificate", "Settings": "Settings", "Dashboard": "Dashboard", "Help": "Help", diff --git a/src/pages/SetupDatabase.vue b/src/pages/SetupDatabase.vue index 81738a98b..c7fef2c8c 100644 --- a/src/pages/SetupDatabase.vue +++ b/src/pages/SetupDatabase.vue @@ -90,8 +90,12 @@ <input id="floatingInput" v-model="dbConfig.dbName" type="text" class="form-control" required> <label for="floatingInput">{{ $t("dbName") }}</label> </div> - </template> + <div class="mb2 mt-3 short"> + <label for="caInput" class="mb-2">{{ $t("caFile") }}</label> + <input id="caInput" type="file" accept="application/x-pem-file, .pem" class="form-control" @change="onCaFileChange"> + </div> + </template> <button class="btn btn-primary mt-4 short" type="submit" :disabled="disabledButton"> {{ $t("Next") }} </button> @@ -117,6 +121,7 @@ export default { username: "", password: "", dbName: "kuma", + caFile: "" }, info: { needSetup: false, @@ -178,6 +183,15 @@ export default { } }, + onCaFileChange(e) { + const fileReader = new FileReader(); + fileReader.onload = () => { + this.dbConfig.caFile = fileReader.result; + console.log(this.dbConfig.caFile); + }; + fileReader.readAsDataURL(e.target.files[0]); + }, + test() { this.$root.toastError("not implemented"); } @@ -186,6 +200,22 @@ export default { </script> <style lang="scss" scoped> +@import "../assets/vars.scss"; + +.dark { + #caInput { + &::file-selector-button { + color: $primary; + background-color: $dark-bg; + } + + &:hover:not(:disabled):not([readonly])::file-selector-button { + color: $dark-font-color2; + background-color: $primary; + } + } +} + .form-container { display: flex; align-items: center; From e73c87cfae25285d6204e31daf6f81e493a24afe Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 11:45:41 +0100 Subject: [PATCH 06/14] Add support for a user provided CA file to connect to maria/mysql --- server/setup-database.js | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/server/setup-database.js b/server/setup-database.js index dc8486b8b..efd19f917 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -79,6 +79,7 @@ class SetupDatabase { dbConfig.dbName = process.env.UPTIME_KUMA_DB_NAME; dbConfig.username = process.env.UPTIME_KUMA_DB_USERNAME; dbConfig.password = process.env.UPTIME_KUMA_DB_PASSWORD; + dbConfig.caFilePath = process.env.UPTIME_KUMA_DB_CA_CERT; Database.writeDBConfig(dbConfig); } @@ -207,17 +208,44 @@ class SetupDatabase { this.runningSetup = false; return; } + + if (dbConfig.caFile) { + const base64Data = dbConfig.caFile.replace(/^data:application\/octet-stream;base64,/, ""); + console.log(dbConfig); + console.log(base64Data); + console.log(dbConfig.caFile); + const binaryData = Buffer.from(base64Data, "base64").toString("binary"); + const tempCaDirectory = fs.mkdtempSync("kuma-ca-"); + dbConfig.caFilePath = path.join(tempCaDirectory, "ca.pem"); + try { + fs.writeFileSync(dbConfig.caFilePath, binaryData, "binary"); + } catch (err) { + + response.status(400).json("Cannot write CA file: " + err.message); + this.runningSetup = false; + return; + } + dbConfig.ssl = { + rejectUnauthorized: true, + ca: [ fs.readFileSync(dbConfig.caFilePath) ] + }; + } + // Test connection try { let sslConfig = null; let serverCa = undefined; - if (mariaDbUseSSL === true) { + if (mariaDbUseSSL === true && !dbConfig.ssl) { + dbConfig.caFilePath = mariaDbSslCert; serverCa = [ fs.readFileSync(mariaDbSslCert, "utf8") ]; sslConfig = { rejectUnauthorized: true, ca: serverCa }; + } else if (dbConfig.ssl) { + sslConfig = dbConfig.ssl; } + const connection = await mysql.createConnection({ host: dbConfig.hostname, port: dbConfig.port, From 647ca7c7a93bbe0f4c904d5f914d4da58a905a88 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 12:01:27 +0100 Subject: [PATCH 07/14] Rename the translation variable for the maria db CA file and add more details on it's use --- src/lang/en.json | 2 +- src/pages/SetupDatabase.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/en.json b/src/lang/en.json index cdea2ad9d..464e89abe 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -4,9 +4,9 @@ "setupDatabaseEmbeddedMariaDB": "You don't need to set anything. This docker image has embedded and configured MariaDB for you automatically. Uptime Kuma will connect to this database via unix socket.", "setupDatabaseMariaDB": "Connect to an external MariaDB database. You need to set the database connection information.", "setupDatabaseSQLite": "A simple database file, recommended for small-scale deployments. Prior to v2.0.0, Uptime Kuma used SQLite as the default database.", + "configureMariaCaFile": "You will sometimes need to provide a CA certificate to connect to database with 'require-secure-transport' on, such as Azure MySql flexible servers. \n You can upload the CA file that will be used to enable a secure connecti", "settingUpDatabaseMSG": "Setting up the database. It may take a while, please be patient.", "dbName": "Database Name", - "caFile": "Database CA certificate", "Settings": "Settings", "Dashboard": "Dashboard", "Help": "Help", diff --git a/src/pages/SetupDatabase.vue b/src/pages/SetupDatabase.vue index c7fef2c8c..9b1a36610 100644 --- a/src/pages/SetupDatabase.vue +++ b/src/pages/SetupDatabase.vue @@ -92,7 +92,7 @@ </div> <div class="mb2 mt-3 short"> - <label for="caInput" class="mb-2">{{ $t("caFile") }}</label> + <p class="mb-2">{{ $t("configureMariaCaFile") }}</p> <input id="caInput" type="file" accept="application/x-pem-file, .pem" class="form-control" @change="onCaFileChange"> </div> </template> From a688239bb270139c5d43fb18f6e8086ace826582 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 13:07:03 +0100 Subject: [PATCH 08/14] Fix typo --- src/lang/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/en.json b/src/lang/en.json index 464e89abe..0fa0872b8 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -4,7 +4,7 @@ "setupDatabaseEmbeddedMariaDB": "You don't need to set anything. This docker image has embedded and configured MariaDB for you automatically. Uptime Kuma will connect to this database via unix socket.", "setupDatabaseMariaDB": "Connect to an external MariaDB database. You need to set the database connection information.", "setupDatabaseSQLite": "A simple database file, recommended for small-scale deployments. Prior to v2.0.0, Uptime Kuma used SQLite as the default database.", - "configureMariaCaFile": "You will sometimes need to provide a CA certificate to connect to database with 'require-secure-transport' on, such as Azure MySql flexible servers. \n You can upload the CA file that will be used to enable a secure connecti", + "configureMariaCaFile": "You will sometimes need to provide a CA certificate to connect to database with 'require-secure-transport' on, such as Azure MySql flexible servers. \n You can upload the CA file that will be used to enable a secure connection.", "settingUpDatabaseMSG": "Setting up the database. It may take a while, please be patient.", "dbName": "Database Name", "Settings": "Settings", From 8b1556b0c78caab9d759d79ae0adf979f666c134 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 13:12:50 +0100 Subject: [PATCH 09/14] Fix another typo --- src/lang/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/en.json b/src/lang/en.json index 0fa0872b8..1c92ebbb7 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -4,7 +4,7 @@ "setupDatabaseEmbeddedMariaDB": "You don't need to set anything. This docker image has embedded and configured MariaDB for you automatically. Uptime Kuma will connect to this database via unix socket.", "setupDatabaseMariaDB": "Connect to an external MariaDB database. You need to set the database connection information.", "setupDatabaseSQLite": "A simple database file, recommended for small-scale deployments. Prior to v2.0.0, Uptime Kuma used SQLite as the default database.", - "configureMariaCaFile": "You will sometimes need to provide a CA certificate to connect to database with 'require-secure-transport' on, such as Azure MySql flexible servers. \n You can upload the CA file that will be used to enable a secure connection.", + "configureMariaCaFile": "You will sometimes need to provide a CA certificate to connect to database with 'require-secure-transport' on. Such as when using Azure MySql flexible servers. You can upload the CA file that will be used to enable a secure connection.", "settingUpDatabaseMSG": "Setting up the database. It may take a while, please be patient.", "dbName": "Database Name", "Settings": "Settings", From ee6e13040301ecc89968db5f2e78d335904eb332 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 13:22:30 +0100 Subject: [PATCH 10/14] Remove unused variable --- server/config.js | 5 ----- server/setup-database.js | 11 +---------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/server/config.js b/server/config.js index e94804b63..17fad15dd 100644 --- a/server/config.js +++ b/server/config.js @@ -20,9 +20,6 @@ const sslKeyPassphrase = args["ssl-key-passphrase"] || process.env.UPTIME_KUMA_S const isSSL = sslKey && sslCert; -const mariaDbSslCert = args["UPTIME_KUMA_DB_SSL_CERT"] || process.env.UPTIME_KUMA_DB_CA_CERT || process.env.MARIADB_SSL_CERT || undefined; -const mariaDbUseSSL = mariaDbSslCert ? "true" : "false"; - /** * Get the local WebSocket URL * @returns {string} The local WebSocket URL @@ -47,6 +44,4 @@ module.exports = { isSSL, localWebSocketURL, demoMode, - mariaDbSslCert, - mariaDbUseSSL }; diff --git a/server/setup-database.js b/server/setup-database.js index efd19f917..f99167802 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -7,7 +7,6 @@ const path = require("path"); const Database = require("./database"); const { allowDevAllOrigin } = require("./util-server"); const mysql = require("mysql2/promise"); -const { mariaDbUseSSL, mariaDbSslCert } = require("./config"); /** * A standalone express app that is used to setup a database @@ -234,15 +233,7 @@ class SetupDatabase { // Test connection try { let sslConfig = null; - let serverCa = undefined; - if (mariaDbUseSSL === true && !dbConfig.ssl) { - dbConfig.caFilePath = mariaDbSslCert; - serverCa = [ fs.readFileSync(mariaDbSslCert, "utf8") ]; - sslConfig = { - rejectUnauthorized: true, - ca: serverCa - }; - } else if (dbConfig.ssl) { + if (dbConfig.ssl) { sslConfig = dbConfig.ssl; } From 30693392e05e139e7b9c7dd31998768d7b232c65 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 13:33:37 +0100 Subject: [PATCH 11/14] Remove linter comments automatically added by editor --- server/config.js | 1 - server/database.js | 1 - server/setup-database.js | 1 - 3 files changed, 3 deletions(-) diff --git a/server/config.js b/server/config.js index 17fad15dd..515b90465 100644 --- a/server/config.js +++ b/server/config.js @@ -1,4 +1,3 @@ -/* eslint-disable linebreak-style */ const isFreeBSD = /^freebsd/.test(process.platform); // Interop with browser diff --git a/server/database.js b/server/database.js index 26a46cf2b..44005d6e9 100644 --- a/server/database.js +++ b/server/database.js @@ -1,4 +1,3 @@ -/* eslint-disable linebreak-style */ const fs = require("fs"); const { R } = require("redbean-node"); const { setSetting, setting } = require("./util-server"); diff --git a/server/setup-database.js b/server/setup-database.js index f99167802..7ec9ceb05 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -1,4 +1,3 @@ -/* eslint-disable linebreak-style */ const express = require("express"); const { log } = require("../src/util"); const expressStaticGzip = require("express-static-gzip"); From 9151d991887ca1cae7f1134c62ce4f9c0e7a2a96 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 13:47:39 +0100 Subject: [PATCH 12/14] Make id kebab-cased --- src/pages/SetupDatabase.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/SetupDatabase.vue b/src/pages/SetupDatabase.vue index 9b1a36610..c4906d641 100644 --- a/src/pages/SetupDatabase.vue +++ b/src/pages/SetupDatabase.vue @@ -93,7 +93,7 @@ <div class="mb2 mt-3 short"> <p class="mb-2">{{ $t("configureMariaCaFile") }}</p> - <input id="caInput" type="file" accept="application/x-pem-file, .pem" class="form-control" @change="onCaFileChange"> + <input id="ca-input" type="file" accept="application/x-pem-file, .pem" class="form-control" @change="onCaFileChange"> </div> </template> <button class="btn btn-primary mt-4 short" type="submit" :disabled="disabledButton"> @@ -203,7 +203,7 @@ export default { @import "../assets/vars.scss"; .dark { - #caInput { + #ca-input { &::file-selector-button { color: $primary; background-color: $dark-bg; From aeffe6d5ade8264f876235c6638b1b885401540e Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 13:50:28 +0100 Subject: [PATCH 13/14] Add check to prevent user-provided `dbConfig.caFilePath`. --- server/setup-database.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/setup-database.js b/server/setup-database.js index 7ec9ceb05..d704caac5 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -207,6 +207,11 @@ class SetupDatabase { return; } + // Prevent someone from injecting a CA file path not generated by the code below + if (dbConfig.caFilePath) { + dbConfig.caFilePath = undefined; + } + if (dbConfig.caFile) { const base64Data = dbConfig.caFile.replace(/^data:application\/octet-stream;base64,/, ""); console.log(dbConfig); From 69c779b382c96e60cb494e117548b3a7a86ad600 Mon Sep 17 00:00:00 2001 From: Gabriel Ngandu-Biseba <gabriel.ngandu-biseba@tucrail.be> Date: Fri, 6 Dec 2024 13:58:21 +0100 Subject: [PATCH 14/14] Remove leftover logging from debugging --- server/setup-database.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/server/setup-database.js b/server/setup-database.js index d704caac5..ddf664a19 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -214,9 +214,6 @@ class SetupDatabase { if (dbConfig.caFile) { const base64Data = dbConfig.caFile.replace(/^data:application\/octet-stream;base64,/, ""); - console.log(dbConfig); - console.log(base64Data); - console.log(dbConfig.caFile); const binaryData = Buffer.from(base64Data, "base64").toString("binary"); const tempCaDirectory = fs.mkdtempSync("kuma-ca-"); dbConfig.caFilePath = path.join(tempCaDirectory, "ca.pem");