From 403202d4d424c2fb6c8d3441a11478e82ae0b65e Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Thu, 9 Sep 2021 21:10:31 +0200 Subject: [PATCH 01/23] Added simple TOTP Two Factor Authentication --- db/patch12.sql | 10 ++ package.json | 4 + server/server.js | 168 +++++++++++++++++++++++++++++-- server/util-server.js | 10 ++ src/components/Login.vue | 25 ++++- src/components/TwoFADialog.vue | 178 +++++++++++++++++++++++++++++++++ src/languages/de-DE.js | 13 +++ src/languages/en.js | 15 ++- src/mixins/socket.js | 26 ++++- src/pages/Settings.vue | 11 ++ src/pages/Setup.vue | 2 +- 11 files changed, 447 insertions(+), 15 deletions(-) create mode 100644 db/patch12.sql create mode 100644 src/components/TwoFADialog.vue diff --git a/db/patch12.sql b/db/patch12.sql new file mode 100644 index 00000000..754ffdf7 --- /dev/null +++ b/db/patch12.sql @@ -0,0 +1,10 @@ +-- You should not modify if this have pushed to Github, unless it does serious wrong with the db. +BEGIN TRANSACTION; + +ALTER TABLE user + ADD twofa_secret VARCHAR(64); + +ALTER TABLE user + ADD twofa_status BOOLEAN default 0; + +COMMIT; diff --git a/package.json b/package.json index c04be03f..e43e0094 100644 --- a/package.json +++ b/package.json @@ -56,20 +56,24 @@ "http-graceful-shutdown": "^3.1.4", "jsonwebtoken": "^8.5.1", "nodemailer": "^6.6.3", + "notp": "^2.0.3", "password-hash": "^1.2.2", "prom-client": "^13.2.0", "prometheus-api-metrics": "^3.2.0", + "qrcode": "^1.4.4", "redbean-node": "0.1.2", "socket.io": "^4.2.0", "socket.io-client": "^4.2.0", "sqlite3": "github:mapbox/node-sqlite3#593c9d", "tcp-ping": "^0.1.1", + "thirty-two": "^1.0.2", "v-pagination-3": "^0.1.6", "vue": "^3.2.8", "vue-chart-3": "^0.5.7", "vue-confirm-dialog": "^1.0.2", "vue-i18n": "^9.1.7", "vue-multiselect": "^3.0.0-alpha.2", + "vue-qrcode": "^1.0.0", "vue-router": "^4.0.11", "vue-toastification": "^2.0.0-rc.1" }, diff --git a/server/server.js b/server/server.js index 2949c4be..9319fa91 100644 --- a/server/server.js +++ b/server/server.js @@ -22,11 +22,15 @@ const gracefulShutdown = require("http-graceful-shutdown"); debug("Importing prometheus-api-metrics"); const prometheusAPIMetrics = require("prometheus-api-metrics"); +debug("2FA Modules"); +const notp = require("notp"); +const base32 = require("thirty-two"); + console.log("Importing this project modules"); debug("Importing Monitor"); const Monitor = require("./model/monitor"); debug("Importing Settings"); -const { getSettings, setSettings, setting, initJWTSecret } = require("./util-server"); +const { getSettings, setSettings, setting, initJWTSecret, genSecret } = require("./util-server"); debug("Importing Notification"); const { Notification } = require("./notification"); @@ -219,12 +223,38 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); if (user) { afterLogin(socket, user) - callback({ - ok: true, - token: jwt.sign({ - username: data.username, - }, jwtSecret), - }) + if (user.twofaStatus == 0) { + callback({ + ok: true, + token: jwt.sign({ + username: data.username, + }, jwtSecret), + }) + } + + if (user.twofaStatus == 1 && !data.token) { + callback({ + tokenRequired: true, + }) + } + + if (data.token) { + let verify = notp.totp.verify(data.token, user.twofa_secret); + + if (verify && verify.delta == 0) { + callback({ + ok: true, + token: jwt.sign({ + username: data.username, + }, jwtSecret), + }) + } else { + callback({ + ok: false, + msg: "Token Invalid!", + }) + } + } } else { callback({ ok: false, @@ -240,6 +270,130 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); callback(); }); + socket.on("prepare2FA", async (callback) => { + try { + checkLogin(socket) + + let user = await R.findOne("user", " id = ? AND active = 1 ", [ + socket.userID, + ]) + + if (user.twofa_status == 0) { + let newSecret = await genSecret() + let encodedSecret = base32.encode(newSecret); + let uri = `otpauth://totp/UptimeKuma:${user.username}?secret=${encodedSecret}`; + + await R.exec("UPDATE `user` SET twofa_secret = ? WHERE id = ? ", [ + newSecret, + socket.userID, + ]); + + callback({ + ok: true, + uri: uri, + }) + } else { + callback({ + ok: false, + msg: "2FA is already enabled.", + }) + } + } catch (error) { + callback({ + ok: false, + msg: "Error while trying to prepare 2FA.", + }) + } + }); + + socket.on("save2FA", async (callback) => { + try { + checkLogin(socket) + + await R.exec("UPDATE `user` SET twofa_status = 1 WHERE id = ? ", [ + socket.userID, + ]); + + callback({ + ok: true, + msg: "2FA Enabled.", + }) + } catch (error) { + callback({ + ok: false, + msg: "Error while trying to change 2FA.", + }) + } + }); + + socket.on("disable2FA", async (callback) => { + try { + checkLogin(socket) + + await R.exec("UPDATE `user` SET twofa_status = 0 WHERE id = ? ", [ + socket.userID, + ]); + + callback({ + ok: true, + msg: "2FA Disabled.", + }) + } catch (error) { + callback({ + ok: false, + msg: "Error while trying to change 2FA.", + }) + } + }); + + socket.on("verifyToken", async (token, callback) => { + let user = await R.findOne("user", " id = ? AND active = 1 ", [ + socket.userID, + ]) + + let verify = notp.totp.verify(token, user.twofa_secret); + + if (verify && verify.delta == 0) { + callback({ + ok: true, + valid: true, + }) + } else { + callback({ + ok: false, + msg: "Token Invalid.", + valid: false, + }) + } + }); + + socket.on("twoFAStatus", async (callback) => { + checkLogin(socket) + + try { + let user = await R.findOne("user", " id = ? AND active = 1 ", [ + socket.userID, + ]) + + if (user.twofa_status == 1) { + callback({ + ok: true, + status: true, + }) + } else { + callback({ + ok: true, + status: false, + }) + } + } catch (error) { + callback({ + ok: false, + msg: "Error while trying to get 2FA status.", + }) + } + }); + socket.on("needSetup", async (callback) => { callback(needSetup); }); diff --git a/server/util-server.js b/server/util-server.js index a2fef065..079bd82f 100644 --- a/server/util-server.js +++ b/server/util-server.js @@ -271,3 +271,13 @@ exports.getTotalClientInRoom = (io, roomName) => { return 0; } } + +exports.genSecret = () => { + let secret = ""; + let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let charsLength = chars.length; + for ( let i = 0; i < 64; i++ ) { + secret += chars.charAt(Math.floor(Math.random() * charsLength)); + } + return secret; +} diff --git a/src/components/Login.vue b/src/components/Login.vue index bd51759c..ca36fdb9 100644 --- a/src/components/Login.vue +++ b/src/components/Login.vue @@ -4,16 +4,23 @@ <form @submit.prevent="submit"> <h1 class="h3 mb-3 fw-normal" /> - <div class="form-floating"> + <div v-if="!tokenRequired" class="form-floating"> <input id="floatingInput" v-model="username" type="text" class="form-control" placeholder="Username"> <label for="floatingInput">{{ $t("Username") }}</label> </div> - <div class="form-floating mt-3"> + <div v-if="!tokenRequired" class="form-floating mt-3"> <input id="floatingPassword" v-model="password" type="password" class="form-control" placeholder="Password"> <label for="floatingPassword">{{ $t("Password") }}</label> </div> + <div v-if="tokenRequired"> + <div class="form-floating mt-3"> + <input id="floatingToken" v-model="token" type="text" maxlength="6" class="form-control" placeholder="123456"> + <label for="floatingToken">{{ $t("Token") }}</label> + </div> + </div> + <div class="form-check mb-3 mt-3 d-flex justify-content-center pe-4"> <div class="form-check"> <input id="remember" v-model="$root.remember" type="checkbox" value="remember-me" class="form-check-input"> @@ -42,16 +49,24 @@ export default { processing: false, username: "", password: "", - + token: "", res: null, + tokenRequired: false, } }, methods: { submit() { this.processing = true; - this.$root.login(this.username, this.password, (res) => { + + this.$root.login(this.username, this.password, this.token, (res) => { this.processing = false; - this.res = res; + console.log(res) + + if (res.tokenRequired) { + this.tokenRequired = true; + } else { + this.res = res; + } }) }, }, diff --git a/src/components/TwoFADialog.vue b/src/components/TwoFADialog.vue new file mode 100644 index 00000000..371462b9 --- /dev/null +++ b/src/components/TwoFADialog.vue @@ -0,0 +1,178 @@ +<template> + <form @submit.prevent="submit"> + <div ref="modal" class="modal fade" tabindex="-1" data-bs-backdrop="static"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title"> + {{ $t("Setup 2FA") }} + <span v-if="twoFAStatus == true" class="badge bg-primary">{{ $t("Active") }}</span> + <span v-if="twoFAStatus == false" class="badge bg-primary">{{ $t("Inactive") }}</span> + </h5> + <button :disabled="processing" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" /> + </div> + <div class="modal-body"> + <div class="mb-3"> + <div v-if="uri && twoFAStatus == false" class="mx-auto text-center" style="width: 210px;"> + <vue-qrcode :key="uri" :value="uri" type="image/png" :quality="1" :color="{ light: '#ffffffff' }" /> + <button v-show="!showURI" type="button" class="btn btn-outline-primary btn-sm mt-2" @click="showURI = true">Show URI</button> + </div> + <p v-if="showURI && twoFAStatus == false" class="text-break mt-2">{{ uri }}</p> + + <button v-if="uri == null && twoFAStatus == false" class="btn btn-primary" type="button" @click="prepare2FA()"> + {{ $t("Enable 2FA") }} + </button> + + <button v-if="twoFAStatus == true" class="btn btn-danger" type="button" :disabled="processing" @click="confirmDisableTwoFA()"> + {{ $t("Disable 2FA") }} + </button> + + <div v-if="uri && twoFAStatus == false" class="mt-3"> + <label for="basic-url" class="form-label">{{ $t("twoFAVerifyLabel") }}</label> + <div class="input-group"> + <input v-model="token" type="text" class="form-control"> + <button class="btn btn-outline-primary" type="button" @click="verifyToken()">{{ $t("Verify Token") }}</button> + </div> + <p v-show="tokenValid" class="mt-2" style="color: green">{{ $t("tokenValidSettingsMsg") }}</p> + </div> + </div> + </div> + + <div v-if="twoFAStatus == false" class="modal-footer"> + <button type="submit" class="btn btn-primary" :disabled="processing || tokenValid == false" @click="confirmEnableTwoFA()"> + <div v-if="processing" class="spinner-border spinner-border-sm me-1"></div> + {{ $t("Save") }} + </button> + </div> + </div> + </div> + </div> + </form> + + <Confirm ref="confirmEnableTwoFA" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="save2FA"> + {{ $t("confirmEnableTwoFAMsg") }} + </Confirm> + + <Confirm ref="confirmDisableTwoFA" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="disable2FA"> + {{ $t("confirmDisableTwoFAMsg") }} + </Confirm> +</template> + +<script lang="ts"> +import { Modal } from "bootstrap" +import Confirm from "./Confirm.vue"; +import VueQrcode from "vue-qrcode" +import { useToast } from "vue-toastification" +const toast = useToast() + +export default { + components: { + Confirm, + VueQrcode, + }, + props: {}, + data() { + return { + processing: false, + uri: null, + tokenValid: false, + twoFAStatus: null, + token: null, + showURI: false, + } + }, + mounted() { + this.modal = new Modal(this.$refs.modal) + this.getStatus(); + }, + methods: { + show() { + this.modal.show() + }, + + confirmEnableTwoFA() { + this.$refs.confirmEnableTwoFA.show() + }, + + confirmDisableTwoFA() { + this.$refs.confirmDisableTwoFA.show() + }, + + prepare2FA() { + this.processing = true; + + this.$root.getSocket().emit("prepare2FA", (res) => { + this.processing = false; + + if (res.ok) { + this.uri = res.uri; + } else { + toast.error(res.msg); + } + }) + }, + + save2FA() { + this.processing = true; + + this.$root.getSocket().emit("save2FA", (res) => { + this.processing = false; + + if (res.ok) { + this.$root.toastRes(res) + this.getStatus(); + this.modal.hide(); + } else { + toast.error(res.msg); + } + }) + }, + + disable2FA() { + this.processing = true; + + this.$root.getSocket().emit("disable2FA", (res) => { + this.processing = false; + + if (res.ok) { + this.$root.toastRes(res) + this.getStatus(); + this.modal.hide(); + } else { + toast.error(res.msg); + } + }) + }, + + verifyToken() { + this.$root.getSocket().emit("verifyToken", this.token, (res) => { + if (res.ok) { + this.tokenValid = res.valid; + } else { + toast.error(res.msg); + } + }) + }, + + getStatus() { + this.$root.getSocket().emit("twoFAStatus", (res) => { + if (res.ok) { + this.twoFAStatus = res.status; + } else { + toast.error(res.msg); + } + }) + }, + }, +} +</script> + +<style lang="scss" scoped> +@import "../assets/vars.scss"; + +.dark { + .modal-dialog .form-text, .modal-dialog p { + color: $dark-font-color; + } +} +</style> diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index cfadf170..b6bc676c 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -128,4 +128,17 @@ export default { backupDescription3: "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.", alertNoFile: "Bitte wähle eine Datei zum importieren aus.", alertWrongFileType: "Bitte wähle eine JSON Datei aus.", + twoFAVerifyLabel: "Bitte trage deinen Token ein um zu verifizieren das 2FA funktioniert", + "Verify Token": "Token verifizieren", + "Setup 2FA": "2FA Einrichten", + "Enable 2FA": "2FA Aktivieren", + "Disable 2FA": "2FA deaktivieren", + "2FA Settings": "2FA Einstellungen", + confirmEnableTwoFAMsg: "Bist du sicher das du 2FA aktivieren möchtest?", + confirmDisableTwoFAMsg: "Bist du sicher das du 2FA deaktivieren möchtest?", + tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA Einstellungen speichern.", + "Two Factor Authentication": "Zwei Faktor Authentifizierung", + Active: "Aktiv", + Inactive: "Inaktiv", + Token: "Token", } diff --git a/src/languages/en.js b/src/languages/en.js index 1272bf3e..c7facb2a 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -20,6 +20,10 @@ export default { clearEventsMsg: "Are you sure want to delete all events for this monitor?", clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?", confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", Settings: "Settings", Dashboard: "Dashboard", "New Update": "New Update", @@ -127,5 +131,14 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", } diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 22cc25bf..0cffbdc5 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -201,11 +201,15 @@ export default { } }, - login(username, password, callback) { + login(username, password, token, callback) { socket.emit("login", { username, password, + token, }, (res) => { + if (res.tokenRequired) { + callback(res) + } if (res.ok) { this.storage().token = res.token; @@ -240,6 +244,26 @@ export default { this.clearData() }, + prepare2FA(callback) { + socket.emit("prepare2FA", callback) + }, + + save2FA(secret, callback) { + socket.emit("save2FA", callback) + }, + + disable2FA(callback) { + socket.emit("disable2FA", callback) + }, + + verifyToken(token, callback) { + socket.emit("verifyToken", token, callback) + }, + + twoFAStatus(callback) { + socket.emit("twoFAStatus", callback) + }, + add(monitor, callback) { socket.emit("add", monitor, callback) }, diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 17c2630a..33992a43 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -120,6 +120,14 @@ </form> </template> + <h2 class="mt-5 mb-2"> + {{ $t("Two Factor Authentication") }} + </h2> + + <div class="mb-3"> + <button class="btn btn-primary me-2" type="button" @click="$refs.TwoFADialog.show()">{{ $t("2FA Settings") }}</button> + </div> + <h2 class="mt-5 mb-2">{{ $t("Import/Export Backup") }}</h2> <p> @@ -186,6 +194,7 @@ </footer> <NotificationDialog ref="notificationDialog" /> + <TwoFADialog ref="TwoFADialog" /> <Confirm ref="confirmDisableAuth" btn-style="btn-danger" :yes-text="$t('I understand, please disable')" :no-text="$t('Leave')" @yes="disableAuth"> <template v-if="$i18n.locale === 'es-ES' "> @@ -269,6 +278,7 @@ import dayjs from "dayjs"; import utc from "dayjs/plugin/utc" import timezone from "dayjs/plugin/timezone" import NotificationDialog from "../components/NotificationDialog.vue"; +import TwoFADialog from "../components/TwoFADialog.vue"; dayjs.extend(utc) dayjs.extend(timezone) @@ -279,6 +289,7 @@ const toast = useToast() export default { components: { NotificationDialog, + TwoFADialog, Confirm, }, data() { diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue index 9cb7c5ec..7966f9e9 100644 --- a/src/pages/Setup.vue +++ b/src/pages/Setup.vue @@ -87,7 +87,7 @@ export default { if (res.ok) { this.processing = true; - this.$root.login(this.username, this.password, (res) => { + this.$root.login(this.username, this.password, "", (res) => { this.processing = false; this.$router.push("/") }) From 59cccf8c5029724972ae325ef1f5330af3e8a713 Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Thu, 9 Sep 2021 21:10:31 +0200 Subject: [PATCH 02/23] Fixed typo --- server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index 9319fa91..7677a152 100644 --- a/server/server.js +++ b/server/server.js @@ -22,7 +22,7 @@ const gracefulShutdown = require("http-graceful-shutdown"); debug("Importing prometheus-api-metrics"); const prometheusAPIMetrics = require("prometheus-api-metrics"); -debug("2FA Modules"); +debug("Importing 2FA Modules"); const notp = require("notp"); const base32 = require("thirty-two"); From 463c385cf17859c277a9b82b31e57486accb0a89 Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Thu, 9 Sep 2021 21:38:39 +0200 Subject: [PATCH 03/23] Only show modal footer if uri was generated --- src/components/TwoFADialog.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TwoFADialog.vue b/src/components/TwoFADialog.vue index 371462b9..ca1293aa 100644 --- a/src/components/TwoFADialog.vue +++ b/src/components/TwoFADialog.vue @@ -38,7 +38,7 @@ </div> </div> - <div v-if="twoFAStatus == false" class="modal-footer"> + <div v-if="uri && twoFAStatus == false" class="modal-footer"> <button type="submit" class="btn btn-primary" :disabled="processing || tokenValid == false" @click="confirmEnableTwoFA()"> <div v-if="processing" class="spinner-border spinner-border-sm me-1"></div> {{ $t("Save") }} From d823493fad38dfa1c6679d0687974e40e93c473d Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Thu, 9 Sep 2021 22:08:34 +0200 Subject: [PATCH 04/23] Added maxlengh to token verify input --- src/components/TwoFADialog.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TwoFADialog.vue b/src/components/TwoFADialog.vue index ca1293aa..158d1f0d 100644 --- a/src/components/TwoFADialog.vue +++ b/src/components/TwoFADialog.vue @@ -30,7 +30,7 @@ <div v-if="uri && twoFAStatus == false" class="mt-3"> <label for="basic-url" class="form-label">{{ $t("twoFAVerifyLabel") }}</label> <div class="input-group"> - <input v-model="token" type="text" class="form-control"> + <input v-model="token" type="text" maxlength="6" class="form-control"> <button class="btn btn-outline-primary" type="button" @click="verifyToken()">{{ $t("Verify Token") }}</button> </div> <p v-show="tokenValid" class="mt-2" style="color: green">{{ $t("tokenValidSettingsMsg") }}</p> From c3c576bd13b6aa7a6aa2e41e38b54ba2790944c1 Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Fri, 10 Sep 2021 01:33:26 +0200 Subject: [PATCH 05/23] Added "Show URI" translation --- src/components/TwoFADialog.vue | 2 +- src/languages/de-DE.js | 1 + src/languages/en.js | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/TwoFADialog.vue b/src/components/TwoFADialog.vue index 158d1f0d..b7b9668d 100644 --- a/src/components/TwoFADialog.vue +++ b/src/components/TwoFADialog.vue @@ -15,7 +15,7 @@ <div class="mb-3"> <div v-if="uri && twoFAStatus == false" class="mx-auto text-center" style="width: 210px;"> <vue-qrcode :key="uri" :value="uri" type="image/png" :quality="1" :color="{ light: '#ffffffff' }" /> - <button v-show="!showURI" type="button" class="btn btn-outline-primary btn-sm mt-2" @click="showURI = true">Show URI</button> + <button v-show="!showURI" type="button" class="btn btn-outline-primary btn-sm mt-2" @click="showURI = true">{{ $t("Show URI") }}</button> </div> <p v-if="showURI && twoFAStatus == false" class="text-break mt-2">{{ uri }}</p> diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index b6bc676c..7f46e770 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -141,4 +141,5 @@ export default { Active: "Aktiv", Inactive: "Inaktiv", Token: "Token", + "Show URI": "URI Anzeigen" } diff --git a/src/languages/en.js b/src/languages/en.js index c7facb2a..520d4756 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -141,4 +141,5 @@ export default { Active: "Active", Inactive: "Inactive", Token: "Token", + "Show URI": "Show URI" } From 14b7688b70445392aa4a341705d13fc1e1a4a4f5 Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Sat, 11 Sep 2021 00:13:05 +0200 Subject: [PATCH 06/23] Added NOT NULL to twofa_status --- db/patch12.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/patch12.sql b/db/patch12.sql index 754ffdf7..35069d85 100644 --- a/db/patch12.sql +++ b/db/patch12.sql @@ -5,6 +5,6 @@ ALTER TABLE user ADD twofa_secret VARCHAR(64); ALTER TABLE user - ADD twofa_status BOOLEAN default 0; + ADD twofa_status BOOLEAN default 0 NOT NULL; COMMIT; From c387fb264ea19682c7038a2a5478e2fbecd79d8a Mon Sep 17 00:00:00 2001 From: Adam Stachowicz <adam.stachowicz@fingo.info> Date: Sat, 11 Sep 2021 10:50:56 +0200 Subject: [PATCH 07/23] Format JSON file before download --- src/pages/Settings.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index b91d2571..cd1a95bc 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -383,7 +383,7 @@ export default { notificationList: this.$root.notificationList, monitorList: monitorList, } - exportData = JSON.stringify(exportData); + exportData = JSON.stringify(exportData, null, 4); let downloadItem = document.createElement("a"); downloadItem.setAttribute("href", "data:application/json;charset=utf-8," + encodeURI(exportData)); downloadItem.setAttribute("download", fileName); From 9e10f7d35f306f81568f6fe9f11036de6afa7b1e Mon Sep 17 00:00:00 2001 From: Nelson Chan <chakflying@hotmail.com> Date: Sat, 11 Sep 2021 18:56:27 +0800 Subject: [PATCH 08/23] Fix: Fix events table width on mobile --- src/pages/DashboardHome.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pages/DashboardHome.vue b/src/pages/DashboardHome.vue index 9f9cda1d..186184ec 100644 --- a/src/pages/DashboardHome.vue +++ b/src/pages/DashboardHome.vue @@ -26,7 +26,7 @@ </div> </div> - <div class="shadow-box table-shadow-box" style="overflow-x: scroll;"> + <div class="shadow-box table-shadow-box" style="overflow-x: hidden;"> <table class="table table-borderless table-hover"> <thead> <tr> @@ -178,5 +178,10 @@ table { tr { transition: all ease-in-out 0.2ms; } + + @media (max-width: 550px) { + table-layout: fixed; + overflow-wrap: break-word; + } } </style> From b709857e197e680e7bd0fa1e232b15c8248bb890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20S=C3=B8rensen?= <Lrss@users.noreply.github.com> Date: Sat, 11 Sep 2021 13:17:17 +0200 Subject: [PATCH 09/23] Better wording for Danish language --- src/languages/da-DK.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index 2859655e..bbc6af0d 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -17,8 +17,8 @@ export default { Down: "Inaktiv", Pending: "Afventer", Unknown: "Ukendt", - Pause: "Pause", - pauseDashboardHome: "Pauset", + Pause: "Stands", + pauseDashboardHome: "Standset", Name: "Navn", Status: "Status", DateTime: "Dato / Tid", @@ -36,7 +36,7 @@ export default { hour: "Timer", "-hour": "-Timer", checkEverySecond: "Tjek hvert {0} sekund", - "Avg.": "Gennemsnit", + "Avg.": "Gns.", Response: " Respons", Ping: "Ping", "Monitor Type": "Overvåger Type", @@ -103,7 +103,7 @@ export default { "Resolver Server": "Navne-server", rrtypeDescription: "Vælg den type RR, du vil overvåge.", "Last Result": "Seneste resultat", - pauseMonitorMsg: "Er du sikker på, at du vil pause Overvågeren?", + pauseMonitorMsg: "Er du sikker på, at du vil standse Overvågeren?", "Create your admin account": "Opret din administratorkonto", "Repeat Password": "Gentag adgangskoden", "Resource Record Type": "Resource Record Type", From 39c7b5e748c37d926ef1362caf3fe116910770d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20S=C3=B8rensen?= <dev@lrss.dk> Date: Sat, 11 Sep 2021 13:37:53 +0200 Subject: [PATCH 10/23] Added new Strings to Danish translation --- src/languages/da-DK.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index bbc6af0d..f6e257a8 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -107,25 +107,25 @@ export default { "Create your admin account": "Opret din administratorkonto", "Repeat Password": "Gentag adgangskoden", "Resource Record Type": "Resource Record Type", - respTime: "Resp. Time (ms)", + respTime: "Resp. Tid (ms)", notAvailableShort: "N/A", - Create: "Create", - clearEventsMsg: "Are you sure want to delete all events for this monitor?", - clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?", - confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?", - "Clear Data": "Clear Data", + Create: "Opret", + clearEventsMsg: "Er du sikker på vil slette alle events for denne Overvåger?", + clearHeartbeatsMsg: "Er du sikker på vil slette alle heartbeats for denne Overvåger?", + confirmClearStatisticsMsg: "Vil du helt sikkert slette ALLE statistikker?", + "Clear Data": "Ryd Data", Events: "Events", Heartbeats: "Heartbeats", - "Auto Get": "Auto Get", - enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.", - "Default enabled": "Default enabled", - "Also apply to existing monitors": "Also apply to existing monitors", - "Import/Export Backup": "Import/Export Backup", - Export: "Export", + "Auto Get": "Auto-hent", + enableDefaultNotificationDescription: "For hver ny overvåger aktiveres denne underretning som standard. Du kan stadig deaktivere underretningen separat for hver skærm.", + "Default enabled": "Standard aktiveret", + "Also apply to existing monitors": "Anvend også på eksisterende overvågere", + "Import/Export Backup": " Importér/Eksportér sikkerhedskopi", + Export: "Eksport", Import: "Import", - backupDescription: "You can backup all monitors and all notifications into a JSON file.", - backupDescription2: "PS: History and event data is not included.", - backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", - alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + backupDescription: "Du kan sikkerhedskopiere alle Overvågere og alle underretninger til en JSON-fil.", + backupDescription2: "PS: Historik og hændelsesdata er ikke inkluderet.", + backupDescription3: "Følsom data, f.eks. underretnings-tokener, er inkluderet i eksportfilen. Gem den sikkert.", + alertNoFile: "Vælg en fil der skal importeres.", + alertWrongFileType: "Vælg venligst en JSON-fil." } From 66769e1c79e8300108f27345f0e303ae38d84dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20S=C3=B8rensen?= <dev@lrss.dk> Date: Sat, 11 Sep 2021 13:50:16 +0200 Subject: [PATCH 11/23] Fixed inconsistent white-space for the "Avg."-Ping/Response title. --- src/languages/da-DK.js | 2 +- src/languages/de-DE.js | 4 ++-- src/languages/en.js | 2 +- src/languages/es-ES.js | 2 +- src/languages/et-EE.js | 2 +- src/languages/ja.js | 2 +- src/languages/ko-KR.js | 2 +- src/languages/nl-NL.js | 2 +- src/languages/pl.js | 2 +- src/languages/ru-RU.js | 2 +- src/languages/sr-latn.js | 2 +- src/languages/sr.js | 2 +- src/languages/sv-SE.js | 2 +- src/pages/Details.vue | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index f6e257a8..6e8069aa 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -37,7 +37,7 @@ export default { "-hour": "-Timer", checkEverySecond: "Tjek hvert {0} sekund", "Avg.": "Gns.", - Response: " Respons", + Response: "Respons", Ping: "Ping", "Monitor Type": "Overvåger Type", Keyword: "Nøgleord", diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index a8cf5a7c..c1bb2b8c 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -36,8 +36,8 @@ export default { hour: "Stunde", "-hour": "-Stunden", checkEverySecond: "Überprüfe alle {0} Sekunden", - "Avg.": "Durchschn. ", - Response: " Antwortzeit", + "Avg.": "Durchschn.", + Response: "Antwortzeit", Ping: "Ping", "Monitor Type": "Monitor Typ", Keyword: "Schlüsselwort", diff --git a/src/languages/en.js b/src/languages/en.js index 58573685..d41ba308 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -1,7 +1,7 @@ export default { languageName: "English", checkEverySecond: "Check every {0} seconds.", - "Avg.": "Avg. ", + "Avg.": "Avg.", retriesDescription: "Maximum retries before the service is marked as down and a notification is sent", ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites", upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.", diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js index ba216dcf..b52c1654 100644 --- a/src/languages/es-ES.js +++ b/src/languages/es-ES.js @@ -1,7 +1,7 @@ export default { languageName: "Español", checkEverySecond: "Comprobar cada {0} segundos.", - "Avg.": "Media. ", + "Avg.": "Media.", retriesDescription: "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada.", ignoreTLSError: "Ignorar error TLS/SSL para sitios web HTTPS", upsideDownModeDescription: "Invertir el estado. Si el servicio es alcanzable, está CAÍDO.", diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js index 3992e902..6de9a3e2 100644 --- a/src/languages/et-EE.js +++ b/src/languages/et-EE.js @@ -1,7 +1,7 @@ export default { languageName: "eesti", checkEverySecond: "Kontrolli {0} sekundilise vahega.", - "Avg.": "≈ ", + "Avg.": "≈", retriesDescription: "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus.", ignoreTLSError: "Eira TLS/SSL viga HTTPS veebisaitidel.", upsideDownModeDescription: "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.", diff --git a/src/languages/ja.js b/src/languages/ja.js index 4ef10a5a..6d0693d5 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -1,7 +1,7 @@ export default { languageName: "日本語", checkEverySecond: "{0}秒ごとにチェックします。", - "Avg.": "平均 ", + "Avg.": "平均", retriesDescription: "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数", ignoreTLSError: "HTTPS ウェブサイトの TLS/SSL エラーを無視する", upsideDownModeDescription: "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。", diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index da1491a5..68479ade 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -1,7 +1,7 @@ export default { languageName: "한국어", checkEverySecond: "{0} 초마다 체크해요.", - "Avg.": "평균 ", + "Avg.": "평균", retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수", ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 에러 무시하기", upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.", diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index 2c5f1010..48e3b3a2 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -1,7 +1,7 @@ export default { languageName: "Nederlands", checkEverySecond: "Controleer elke {0} seconden.", - "Avg.": "Gem. ", + "Avg.": "Gem.", retriesDescription: "Maximum aantal nieuwe pogingen voordat de service wordt gemarkeerd als niet beschikbaar en er een melding wordt verzonden", ignoreTLSError: "Negeer TLS/SSL-fout voor HTTPS-websites", upsideDownModeDescription: "Draai de status om. Als de service bereikbaar is, is deze OFFLINE.", diff --git a/src/languages/pl.js b/src/languages/pl.js index 4863cccb..3029b349 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -1,7 +1,7 @@ export default { languageName: "Polski", checkEverySecond: "Sprawdzaj co {0} sekund.", - "Avg.": "Średnia ", + "Avg.": "Średnia", retriesDescription: "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako wyłączona i zostanie wysłane powiadomienie", ignoreTLSError: "Ignoruj błąd TLS/SSL dla stron HTTPS", upsideDownModeDescription: "Odwróć status do góry nogami. Jeśli usługa jest osiągalna, to jest oznaczona jako niedostępna.", diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js index 2dbe254e..7f5eae76 100644 --- a/src/languages/ru-RU.js +++ b/src/languages/ru-RU.js @@ -1,7 +1,7 @@ export default { languageName: "Русский", checkEverySecond: "Проверять каждые {0} секунд.", - "Avg.": "Средн. ", + "Avg.": "Средн.", retriesDescription: "Максимальное количество попыток перед пометкой сервиса как недоступного и отправкой уведомления", ignoreTLSError: "Игнорировать ошибку TLS/SSL для HTTPS сайтов", upsideDownModeDescription: "Реверс статуса сервиса. Если сервис доступен, то он помечается как НЕДОСТУПНЫЙ.", diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js index a149cb2c..3dd73d2c 100644 --- a/src/languages/sr-latn.js +++ b/src/languages/sr-latn.js @@ -1,7 +1,7 @@ export default { languageName: "Srpski", checkEverySecond: "Proveri svakih {0} sekundi.", - "Avg.": "Prosečni ", + "Avg.": "Prosečni", retriesDescription: "Maksimum pokušaja pre nego što se servis obeleži kao neaktivan i pošalje se obaveštenje.", ignoreTLSError: "Ignoriši TLS/SSL greške za HTTPS veb stranice.", upsideDownModeDescription: "Obrnite status. Ako je servis dostupan, onda je obeležen kao neaktivan.", diff --git a/src/languages/sr.js b/src/languages/sr.js index f3e24a66..6931d272 100644 --- a/src/languages/sr.js +++ b/src/languages/sr.js @@ -1,7 +1,7 @@ export default { languageName: "Српски", checkEverySecond: "Провери сваких {0} секунди.", - "Avg.": "Просечни ", + "Avg.": "Просечни", retriesDescription: "Максимум покушаја пре него што се сервис обележи као неактиван и пошаље се обавештење.", ignoreTLSError: "Игнориши TLS/SSL грешке за HTTPS веб странице.", upsideDownModeDescription: "Обрните статус. Ако је сервис доступан, онда је обележен као неактиван.", diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 0b4d02ca..f8749e28 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -1,7 +1,7 @@ export default { languageName: "Svenska", checkEverySecond: "Uppdatera var {0} sekund.", - "Avg.": "Genomsnittligt ", + "Avg.": "Genomsnittligt", retriesDescription: "Max antal försök innan tjänsten markeras som nere och en notis skickas", ignoreTLSError: "Ignorera TLS/SSL-fel för webbsidor med HTTPS", upsideDownModeDescription: "Vänd upp och ner på statusen. Om tjänsten är nåbar visas den som NERE.", diff --git a/src/pages/Details.vue b/src/pages/Details.vue index 776f1c1d..9092b179 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -55,7 +55,7 @@ </span> </div> <div class="col"> - <h4>{{ $t("Avg.") }}{{ pingTitle }}</h4> + <h4>{{ $t("Avg.") }} {{ pingTitle }}</h4> <p>(24{{ $t("-hour") }})</p> <span class="num"><CountUp :value="avgPing" /></span> </div> From 651b525d06ec45010d394b9fd8c1da3137656847 Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Sat, 11 Sep 2021 14:34:12 +0200 Subject: [PATCH 12/23] Update server/server.js Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com> --- server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index 7677a152..ad9d8cf7 100644 --- a/server/server.js +++ b/server/server.js @@ -251,7 +251,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); } else { callback({ ok: false, - msg: "Token Invalid!", + msg: "Invalid Token!", }) } } From f6d1a829892f06913c23a8497a1e5e4b28fb24eb Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Sat, 11 Sep 2021 14:34:19 +0200 Subject: [PATCH 13/23] Update server/server.js Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com> --- server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index ad9d8cf7..a35e2924 100644 --- a/server/server.js +++ b/server/server.js @@ -361,7 +361,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); } else { callback({ ok: false, - msg: "Token Invalid.", + msg: "Invalid Token.", valid: false, }) } From d003abcd604239556a908075b074ad9a2d92e5ba Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Sat, 11 Sep 2021 14:34:23 +0200 Subject: [PATCH 14/23] Update src/languages/en.js Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com> --- src/languages/en.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.js b/src/languages/en.js index 520d4756..6afa1655 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -21,7 +21,7 @@ export default { clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?", confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?", twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", - tokenValidSettingsMsg: "Token valid! You can now save the 2FA settings.", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", Settings: "Settings", From 295ccba44bde9a4eb2a5f964554e8c368ca74c01 Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Sat, 11 Sep 2021 16:37:33 +0200 Subject: [PATCH 15/23] Adjusted for new db patch management --- db/{patch12.sql => patch-2fa.sql} | 0 server/database.js | 1 + 2 files changed, 1 insertion(+) rename db/{patch12.sql => patch-2fa.sql} (100%) diff --git a/db/patch12.sql b/db/patch-2fa.sql similarity index 100% rename from db/patch12.sql rename to db/patch-2fa.sql diff --git a/server/database.js b/server/database.js index e0bb0c9b..4b3ad443 100644 --- a/server/database.js +++ b/server/database.js @@ -30,6 +30,7 @@ class Database { static patchList = { "patch-setting-value-type.sql": true, "patch-improve-performance.sql": true, + "patch-2fa.sql": true, } /** From c4f78d776e166e7372ecd13c47c9d36c9b7667a7 Mon Sep 17 00:00:00 2001 From: LouisLam <louislam@users.noreply.github.com> Date: Sun, 12 Sep 2021 02:25:51 +0800 Subject: [PATCH 16/23] [2fa] "UptimeKuma" to "Uptime Kuma" --- server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index a35e2924..a0b9a2fb 100644 --- a/server/server.js +++ b/server/server.js @@ -281,7 +281,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); if (user.twofa_status == 0) { let newSecret = await genSecret() let encodedSecret = base32.encode(newSecret); - let uri = `otpauth://totp/UptimeKuma:${user.username}?secret=${encodedSecret}`; + let uri = `otpauth://totp/Uptime%20Kuma:${user.username}?secret=${encodedSecret}`; await R.exec("UPDATE `user` SET twofa_secret = ? WHERE id = ? ", [ newSecret, From b80c88d9a0c5084518551e0f56fc587d7cb8aba0 Mon Sep 17 00:00:00 2001 From: jtagcat <git-12dbd862@jtag.cat> Date: Sun, 12 Sep 2021 00:51:03 +0300 Subject: [PATCH 17/23] i10n: update Estonian --- src/languages/et-EE.js | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js index 3992e902..67597caa 100644 --- a/src/languages/et-EE.js +++ b/src/languages/et-EE.js @@ -10,7 +10,7 @@ export default { passwordNotMatchMsg: "Salasõnad ei kattu.", notificationDescription: "Teavitusmeetodi kasutamiseks seo see seirega.", keywordDescription: "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)", - pauseDashboardHome: "Seiskamine", + pauseDashboardHome: "Seismas", deleteMonitorMsg: "Kas soovid eemaldada seire?", deleteNotificationMsg: "Kas soovid eemaldada selle teavitusmeetodi kõikidelt seiretelt?", resoverserverDescription: "Cloudflare on vaikimisi pöördserver.", @@ -109,23 +109,23 @@ export default { "Repeat Password": "korda salasõna", respTime: "Reageerimisaeg (ms)", notAvailableShort: "N/A", - enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.", - clearEventsMsg: "Are you sure want to delete all events for this monitor?", - clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?", - confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?", - "Import/Export Backup": "Import/Export Backup", - Export: "Export", + enableDefaultNotificationDescription: "Kõik järgnevalt lisatud seired kasutavad seda teavitusmeetodit. Seiretelt võib teavitusmeetodi ühekaupa eemaldada.", + clearEventsMsg: "Kas soovid seire kõik sündmused kustutada?", + clearHeartbeatsMsg: "Kas soovid seire kõik tuksed kustutada?", + confirmClearStatisticsMsg: "Kas soovid KÕIK statistika kustutada?", + "Import/Export Backup": "Impordi/Ekspordi varukoopia", + Export: "Eksport", Import: "Import", - "Default enabled": "Default enabled", - "Also apply to existing monitors": "Also apply to existing monitors", - Create: "Create", - "Clear Data": "Clear Data", - Events: "Events", - Heartbeats: "Heartbeats", - "Auto Get": "Auto Get", - backupDescription: "You can backup all monitors and all notifications into a JSON file.", - backupDescription2: "PS: History and event data is not included.", - backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", - alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + "Default enabled": "Kasuta vaikimisi", + "Also apply to existing monitors": "Aktiveeri teavitusmeetod olemasolevatel seiretel", + Create: "Loo konto", + "Clear Data": "Eemalda andmed", + Events: "Sündmused", + Heartbeats: "Tuksed", + "Auto Get": "Hangi automaatselt", + backupDescription: "Varunda kõik seired ja teavitused JSON faili.", + backupDescription2: "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.", + backupDescription3: "Varukoopiad sisaldavad teavitusmeetodite pääsuvõtmeid.", + alertNoFile: "Palun lisa fail, mida importida.", + alertWrongFileType: "Palun lisa JSON-formaadis fail." } From db14768229ea89c3c1b8c6f16401d64acfd705e5 Mon Sep 17 00:00:00 2001 From: Ponkhy <github@myon.lu> Date: Sun, 12 Sep 2021 01:44:05 +0200 Subject: [PATCH 18/23] Wording correction for notification modal --- src/components/NotificationDialog.vue | 2 +- src/languages/de-DE.js | 2 +- src/languages/en.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index ffb7ba71..d689b0c9 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -410,7 +410,7 @@ <div class="form-check form-switch"> <input v-model="notification.applyExisting" class="form-check-input" type="checkbox"> - <label class="form-check-label">{{ $t("Also apply to existing monitors") }}</label> + <label class="form-check-label">{{ $t("Apply on all existing monitors") }}</label> </div> </div> </div> diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index a8cf5a7c..ec8b9e8d 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -119,7 +119,7 @@ export default { respTime: "Antw. Zeit (ms)", notAvailableShort: "N/A", "Default enabled": "Standardmäßig aktiviert", - "Also apply to existing monitors": "Auch für alle existierenden Monitore aktivieren", + "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden", enableDefaultNotificationDescription: "Für jeden neuen Monitor wird diese Benachrichtigung standardmäßig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.", Create: "Erstellen", "Auto Get": "Auto Get", diff --git a/src/languages/en.js b/src/languages/en.js index 58573685..9e95966e 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -117,7 +117,7 @@ export default { respTime: "Resp. Time (ms)", notAvailableShort: "N/A", "Default enabled": "Default enabled", - "Also apply to existing monitors": "Also apply to existing monitors", + "Apply on all existing monitors": "Apply on all existing monitors", Create: "Create", "Clear Data": "Clear Data", Events: "Events", From 400fc13cf2b2908586cfd1bdf7c15924d1d0bc66 Mon Sep 17 00:00:00 2001 From: LouisLam <louislam@users.noreply.github.com> Date: Sun, 12 Sep 2021 12:39:22 +0800 Subject: [PATCH 19/23] add npm install script for npm7 --- package-lock.json | 823 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 + 2 files changed, 812 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index dcf5077d..54ef9a2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "uptime-kuma", - "version": "1.5.2", + "version": "1.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "uptime-kuma", - "version": "1.5.2", + "version": "1.6.0", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.36", @@ -29,20 +29,24 @@ "http-graceful-shutdown": "^3.1.4", "jsonwebtoken": "^8.5.1", "nodemailer": "^6.6.3", + "notp": "^2.0.3", "password-hash": "^1.2.2", "prom-client": "^13.2.0", "prometheus-api-metrics": "^3.2.0", + "qrcode": "^1.4.4", "redbean-node": "0.1.2", "socket.io": "^4.2.0", "socket.io-client": "^4.2.0", "sqlite3": "github:mapbox/node-sqlite3#593c9d", "tcp-ping": "^0.1.1", + "thirty-two": "^1.0.2", "v-pagination-3": "^0.1.6", "vue": "^3.2.8", "vue-chart-3": "^0.5.7", "vue-confirm-dialog": "^1.0.2", "vue-i18n": "^9.1.7", "vue-multiselect": "^3.0.0-alpha.2", + "vue-qrcode": "^1.0.0", "vue-router": "^4.0.11", "vue-toastification": "^2.0.0-rc.1" }, @@ -1576,6 +1580,25 @@ "node": ">= 0.6.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -1727,11 +1750,58 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -1753,7 +1823,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "engines": { "node": ">=6" } @@ -1880,6 +1949,61 @@ "node": ">=10" } }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -2133,7 +2257,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2203,6 +2326,11 @@ "node": ">=0.10" } }, + "node_modules/dijkstrajs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3109,6 +3237,14 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-stdin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", @@ -3492,6 +3628,25 @@ "postcss": "^8.1.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -4651,6 +4806,14 @@ "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", "dev": true }, + "node_modules/notp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", + "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=", + "engines": { + "node": "> v0.6.0" + } + }, "node_modules/npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -4733,7 +4896,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -4760,7 +4922,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -4918,6 +5079,14 @@ "node": ">= 0.4.0" } }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/postcss": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", @@ -5602,6 +5771,31 @@ "node": ">=6" } }, + "node_modules/qrcode": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", + "dependencies": { + "buffer": "^5.4.3", + "buffer-alloc": "^1.2.0", + "buffer-from": "^1.1.1", + "dijkstrajs": "^1.0.1", + "isarray": "^2.0.1", + "pngjs": "^3.3.0", + "yargs": "^13.2.4" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/qrcode/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -5929,6 +6123,14 @@ "node": ">=0.6" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -5938,6 +6140,11 @@ "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -6925,6 +7132,14 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "node_modules/thirty-two": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", + "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=", + "engines": { + "node": ">=0.2.6" + } + }, "node_modules/tildify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", @@ -6993,6 +7208,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -7413,6 +7633,50 @@ "npm": ">= 3.0.0" } }, + "node_modules/vue-qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-qrcode/-/vue-qrcode-1.0.0.tgz", + "integrity": "sha512-rzFR9bTMpsY9lhsABmQw7JbRrOV7NAUbz7E+mu6bMjYpFHoRbH1OVlPxALcxJ0veX3Njt5vfA7pMM5dx1KMLow==", + "dependencies": { + "tslib": "^2.2.0", + "vue-demi": "^0.11.3" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0", + "qrcode": "^1.0.0", + "vue": "^2.0.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-qrcode/node_modules/vue-demi": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz", + "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/vue-router": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.11.tgz", @@ -7447,6 +7711,11 @@ "node": ">= 8" } }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -7464,6 +7733,88 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7509,6 +7860,11 @@ "node": ">=0.4.0" } }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -7524,6 +7880,23 @@ "node": ">= 6" } }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -7533,6 +7906,102 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "node_modules/yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", @@ -8771,6 +9240,11 @@ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -8889,11 +9363,44 @@ "node-releases": "^1.1.75" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -8908,8 +9415,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "camelcase-keys": { "version": "6.2.2", @@ -8993,6 +9499,51 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -9187,8 +9738,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", @@ -9239,6 +9789,11 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "dijkstrajs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -9968,6 +10523,11 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, "get-stdin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", @@ -10264,6 +10824,11 @@ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -11131,6 +11696,11 @@ "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", "dev": true }, + "notp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", + "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=" + }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -11198,7 +11768,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -11215,8 +11784,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "parent-module": { "version": "1.0.1", @@ -11328,6 +11896,11 @@ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + }, "postcss": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", @@ -11859,6 +12432,27 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "devOptional": true }, + "qrcode": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", + "requires": { + "buffer": "^5.4.3", + "buffer-alloc": "^1.2.0", + "buffer-from": "^1.1.1", + "dijkstrajs": "^1.0.1", + "isarray": "^2.0.1", + "pngjs": "^3.3.0", + "yargs": "^13.2.4" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -12110,12 +12704,22 @@ } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -12894,6 +13498,11 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thirty-two": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", + "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=" + }, "tildify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", @@ -12940,6 +13549,11 @@ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "dev": true }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -13238,6 +13852,22 @@ "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz", "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==" }, + "vue-qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-qrcode/-/vue-qrcode-1.0.0.tgz", + "integrity": "sha512-rzFR9bTMpsY9lhsABmQw7JbRrOV7NAUbz7E+mu6bMjYpFHoRbH1OVlPxALcxJ0veX3Njt5vfA7pMM5dx1KMLow==", + "requires": { + "tslib": "^2.2.0", + "vue-demi": "^0.11.3" + }, + "dependencies": { + "vue-demi": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz", + "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A==" + } + } + }, "vue-router": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.11.tgz", @@ -13260,6 +13890,11 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -13274,6 +13909,72 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -13301,6 +14002,11 @@ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -13313,6 +14019,97 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", diff --git a/package.json b/package.json index e1c405cf..afa5d08f 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "node": "14.*" }, "scripts": { + "install-legacy-peer-deps": "npm install --legacy-peer-deps", + "update-legacy-peer-deps": "npm update --legacy-peer-deps", "lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .", "lint:style": "stylelint \"**/*.{vue,css,scss}\" --ignore-path .gitignore", "lint": "npm run lint:js && npm run lint:style", From c26622aa392d40c4e863500dab8e1261896656ea Mon Sep 17 00:00:00 2001 From: Bert Verhelst <verhelstbert@gmail.com> Date: Sun, 12 Sep 2021 13:40:07 +0200 Subject: [PATCH 20/23] fix(settings): add some button bottom margin for narrow screens --- src/pages/Settings.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index cd1a95bc..d52bfc95 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -446,6 +446,10 @@ export default { color: #fff; } +.me-1 { + margin-bottom: .25rem; +} + .dark { .list-group-item { background-color: $dark-bg2; From 660b969178451c21824281a9fa76f6f670ba156e Mon Sep 17 00:00:00 2001 From: Bert Verhelst <verhelstbert@gmail.com> Date: Sun, 12 Sep 2021 14:52:47 +0200 Subject: [PATCH 21/23] fix(settings): switch custom styles to bootstrap class for bottom margin --- src/pages/Settings.vue | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index d52bfc95..2f506fee 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -144,10 +144,10 @@ <h2 class="mt-5 mb-2">{{ $t("Advanced") }}</h2> <div class="mb-3"> - <button v-if="settings.disableAuth" class="btn btn-outline-primary me-1" @click="enableAuth">{{ $t("Enable Auth") }}</button> - <button v-if="! settings.disableAuth" class="btn btn-primary me-1" @click="confirmDisableAuth">{{ $t("Disable Auth") }}</button> - <button v-if="! settings.disableAuth" class="btn btn-danger me-1" @click="$root.logout">{{ $t("Logout") }}</button> - <button class="btn btn-outline-danger me-1" @click="confirmClearStatistics">{{ $t("Clear all statistics") }}</button> + <button v-if="settings.disableAuth" class="btn btn-outline-primary me-1 mb-1" @click="enableAuth">{{ $t("Enable Auth") }}</button> + <button v-if="! settings.disableAuth" class="btn btn-primary me-1 mb-1" @click="confirmDisableAuth">{{ $t("Disable Auth") }}</button> + <button v-if="! settings.disableAuth" class="btn btn-danger me-1 mb-1" @click="$root.logout">{{ $t("Logout") }}</button> + <button class="btn btn-outline-danger me-1 mb-1" @click="confirmClearStatistics">{{ $t("Clear all statistics") }}</button> </div> </template> </div> @@ -446,10 +446,6 @@ export default { color: #fff; } -.me-1 { - margin-bottom: .25rem; -} - .dark { .list-group-item { background-color: $dark-bg2; From 8205f90f3d9fb81b76e392ee13011952122d4760 Mon Sep 17 00:00:00 2001 From: LouisLam <louislam@users.noreply.github.com> Date: Mon, 13 Sep 2021 00:45:43 +0800 Subject: [PATCH 22/23] update language files --- src/languages/da-DK.js | 18 +++++++++++++++++- src/languages/es-ES.js | 18 +++++++++++++++++- src/languages/et-EE.js | 18 +++++++++++++++++- src/languages/fr-FR.js | 18 +++++++++++++++++- src/languages/it-IT.js | 18 +++++++++++++++++- src/languages/ja.js | 18 +++++++++++++++++- src/languages/ko-KR.js | 18 +++++++++++++++++- src/languages/nl-NL.js | 18 +++++++++++++++++- src/languages/pl.js | 18 +++++++++++++++++- src/languages/ru-RU.js | 18 +++++++++++++++++- src/languages/sr-latn.js | 18 +++++++++++++++++- src/languages/sr.js | 18 +++++++++++++++++- src/languages/sv-SE.js | 18 +++++++++++++++++- src/languages/zh-CN.js | 19 +++++++++++++++++-- src/languages/zh-HK.js | 19 +++++++++++++++++-- 15 files changed, 255 insertions(+), 17 deletions(-) diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index 6e8069aa..c43e3181 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: Historik og hændelsesdata er ikke inkluderet.", backupDescription3: "Følsom data, f.eks. underretnings-tokener, er inkluderet i eksportfilen. Gem den sikkert.", alertNoFile: "Vælg en fil der skal importeres.", - alertWrongFileType: "Vælg venligst en JSON-fil." + alertWrongFileType: "Vælg venligst en JSON-fil.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js index b52c1654..7b24bcd0 100644 --- a/src/languages/es-ES.js +++ b/src/languages/es-ES.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js index fca24a33..c196da13 100644 --- a/src/languages/et-EE.js +++ b/src/languages/et-EE.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.", backupDescription3: "Varukoopiad sisaldavad teavitusmeetodite pääsuvõtmeid.", alertNoFile: "Palun lisa fail, mida importida.", - alertWrongFileType: "Palun lisa JSON-formaadis fail." + alertWrongFileType: "Palun lisa JSON-formaadis fail.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js index 4821b818..13714862 100644 --- a/src/languages/fr-FR.js +++ b/src/languages/fr-FR.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js index 1d337810..5c171bec 100644 --- a/src/languages/it-IT.js +++ b/src/languages/it-IT.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/ja.js b/src/languages/ja.js index 6d0693d5..2e1b5f33 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index 68479ade..2f9a002d 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index 48e3b3a2..80b69fd9 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/pl.js b/src/languages/pl.js index 3029b349..1b5ffd13 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js index 7f5eae76..11ad5687 100644 --- a/src/languages/ru-RU.js +++ b/src/languages/ru-RU.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js index 3dd73d2c..251be155 100644 --- a/src/languages/sr-latn.js +++ b/src/languages/sr-latn.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/sr.js b/src/languages/sr.js index 6931d272..d213732f 100644 --- a/src/languages/sr.js +++ b/src/languages/sr.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index f8749e28..4ab1a739 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -127,5 +127,21 @@ export default { backupDescription2: "PS: History and event data is not included.", backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.", alertNoFile: "Please select a file to import.", - alertWrongFileType: "Please select a JSON file." + alertWrongFileType: "Please select a JSON file.", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "Apply on all existing monitors", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js index 1d15c3d9..488beaa3 100644 --- a/src/languages/zh-CN.js +++ b/src/languages/zh-CN.js @@ -119,7 +119,6 @@ export default { "Auto Get": "自动获取", enableDefaultNotificationDescription: "新的监控项将默认启用,你也可以在每个监控项中分别设置", "Default enabled": "默认开启", - "Also apply to existing monitors": "应用到所有监控项", "Import/Export Backup": "导入/导出备份", Export: "导出", Import: "导入", @@ -127,5 +126,21 @@ export default { backupDescription2: "注意: 不包括历史状态和事件数据", backupDescription3: "导出的文件中可能包含敏感信息,如消息通知的 Token 信息,请小心存放!", alertNoFile: "请选择一个文件导入", - alertWrongFileType: "请选择一个 JSON 格式的文件" + alertWrongFileType: "请选择一个 JSON 格式的文件", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "应用到所有监控项", + "Verify Token": "Verify Token", + "Setup 2FA": "Setup 2FA", + "Enable 2FA": "Enable 2FA", + "Disable 2FA": "Disable 2FA", + "2FA Settings": "2FA Settings", + "Two Factor Authentication": "Two Factor Authentication", + Active: "Active", + Inactive: "Inactive", + Token: "Token", + "Show URI": "Show URI", + "Clear all statistics": "Clear all Statistics" } diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js index 314b6e69..686f5970 100644 --- a/src/languages/zh-HK.js +++ b/src/languages/zh-HK.js @@ -119,7 +119,6 @@ export default { "Auto Get": "自動獲取", enableDefaultNotificationDescription: "新增監測器時這個通知會預設啟用,當然每個監測器亦可分別控制開關。", "Default enabled": "預設通知", - "Also apply to existing monitors": "同時取用至目前所有監測器", "Import/Export Backup": "匯入/匯出 備份", Export: "匯出", Import: "匯入", @@ -127,5 +126,21 @@ export default { backupDescription2: "註:此備份不包括歷史記錄。", backupDescription3: "此備份可能包含了一些敏感資料如通知裡的 Token,請小心保存備份。", alertNoFile: "請選擇一個檔案", - alertWrongFileType: "請選擇 JSON 檔案" + alertWrongFileType: "請選擇 JSON 檔案", + twoFAVerifyLabel: "Please type in your token to verify that 2FA is working", + tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.", + confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?", + confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?", + "Apply on all existing monitors": "套用至目前所有監測器", + "Verify Token": "驗証 Token", + "Setup 2FA": "設定 2FA", + "Enable 2FA": "開啟 2FA", + "Disable 2FA": "關閉 2FA", + "2FA Settings": "2FA 設定", + "Two Factor Authentication": "雙重認證", + Active: "生效", + Inactive: "未生效", + Token: "Token", + "Show URI": "顯示 URI", + "Clear all statistics": "清除所有歷史記錄" } From 7df9698e5d84d1458c9e2e0f3f58c48e15551d01 Mon Sep 17 00:00:00 2001 From: LouisLam <louislam@users.noreply.github.com> Date: Mon, 13 Sep 2021 00:58:45 +0800 Subject: [PATCH 23/23] eslint: comma-dangle for language files --- .eslintrc.js | 8 ++++++++ src/languages/da-DK.js | 2 +- src/languages/de-DE.js | 6 +++--- src/languages/en.js | 2 +- src/languages/es-ES.js | 2 +- src/languages/et-EE.js | 2 +- src/languages/fr-FR.js | 2 +- src/languages/it-IT.js | 2 +- src/languages/ja.js | 2 +- src/languages/ko-KR.js | 2 +- src/languages/nl-NL.js | 2 +- src/languages/pl.js | 2 +- src/languages/ru-RU.js | 2 +- src/languages/sr-latn.js | 2 +- src/languages/sr.js | 2 +- src/languages/sv-SE.js | 2 +- src/languages/zh-CN.js | 2 +- src/languages/zh-HK.js | 2 +- src/pages/EditMonitor.vue | 1 + 19 files changed, 28 insertions(+), 19 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6704a85b..398d64c8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -82,4 +82,12 @@ module.exports = { "one-var": ["error", "never"], "max-statements-per-line": ["error", { "max": 1 }] }, + "overrides": [ + { + "files": [ "src/languages/*.js" ], + "rules": { + "comma-dangle": ["error", "always-multiline"], + } + } + ] } diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index c43e3181..fa9ceac7 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index cff49cb0..223d23b9 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -114,8 +114,8 @@ export default { "Repeat Password": "Wiederhole das Passwort", "Resource Record Type": "Resource Record Type", "Import/Export Backup": "Import/Export Backup", - "Export": "Export", - "Import": "Import", + Export: "Export", + Import: "Import", respTime: "Antw. Zeit (ms)", notAvailableShort: "N/A", "Default enabled": "Standardmäßig aktiviert", @@ -142,5 +142,5 @@ export default { Inactive: "Inaktiv", Token: "Token", "Show URI": "URI Anzeigen", - "Clear all statistics": "Lösche alle Statistiken" + "Clear all statistics": "Lösche alle Statistiken", } diff --git a/src/languages/en.js b/src/languages/en.js index 9b692b51..9b3e5422 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -142,5 +142,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js index 7b24bcd0..ca3e4d75 100644 --- a/src/languages/es-ES.js +++ b/src/languages/es-ES.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js index c196da13..551e0c67 100644 --- a/src/languages/et-EE.js +++ b/src/languages/et-EE.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js index 13714862..6d61beb0 100644 --- a/src/languages/fr-FR.js +++ b/src/languages/fr-FR.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js index 5c171bec..a2e1d5b5 100644 --- a/src/languages/it-IT.js +++ b/src/languages/it-IT.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/ja.js b/src/languages/ja.js index 2e1b5f33..eff5279f 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index 2f9a002d..e730d714 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index 80b69fd9..8e61125f 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/pl.js b/src/languages/pl.js index 1b5ffd13..a63005aa 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js index 11ad5687..b1e2b1ef 100644 --- a/src/languages/ru-RU.js +++ b/src/languages/ru-RU.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js index 251be155..b0e5489f 100644 --- a/src/languages/sr-latn.js +++ b/src/languages/sr-latn.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/sr.js b/src/languages/sr.js index d213732f..e6e3ba4c 100644 --- a/src/languages/sr.js +++ b/src/languages/sr.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 4ab1a739..38f27dac 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -143,5 +143,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js index 488beaa3..a1990168 100644 --- a/src/languages/zh-CN.js +++ b/src/languages/zh-CN.js @@ -142,5 +142,5 @@ export default { Inactive: "Inactive", Token: "Token", "Show URI": "Show URI", - "Clear all statistics": "Clear all Statistics" + "Clear all statistics": "Clear all Statistics", } diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js index 686f5970..187e1a12 100644 --- a/src/languages/zh-HK.js +++ b/src/languages/zh-HK.js @@ -142,5 +142,5 @@ export default { Inactive: "未生效", Token: "Token", "Show URI": "顯示 URI", - "Clear all statistics": "清除所有歷史記錄" + "Clear all statistics": "清除所有歷史記錄", } diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 420c4900..f98bb756 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -219,6 +219,7 @@ export default { dnsresolvetypeOptions: [], // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/ + // eslint-disable-next-line ipRegexPattern: "((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))", } },