From 5e6d945095f0923c4fb748a8fbfe94312a7bc021 Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Wed, 27 Oct 2021 23:06:06 +1300 Subject: [PATCH 01/50] Most hacked in POC --- server/routers/api-router.js | 8 ++++++-- src/components/PublicGroupList.vue | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/server/routers/api-router.js b/server/routers/api-router.js index fbe8136e5..be186ccca 100644 --- a/server/routers/api-router.js +++ b/server/routers/api-router.js @@ -141,9 +141,13 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, await checkPublished(); const publicGroupList = []; let list = await R.find("group", " public = 1 ORDER BY weight "); - for (let groupBean of list) { - publicGroupList.push(await groupBean.toPublicJSON()); + let monitor_info = await groupBean.toPublicJSON() + monitor_info.monitorList = await Promise.all(monitor_info.monitorList.map( async (monitor)=>{ + let tags = await R.getAll("SELECT mt.monitor_id,mt.value, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [monitor.id]); + return {...monitor,tags: tags} + })) + publicGroupList.push(monitor_info); } response.json(publicGroupList); diff --git a/src/components/PublicGroupList.vue b/src/components/PublicGroupList.vue index 23d19e6cd..39fb342e2 100644 --- a/src/components/PublicGroupList.vue +++ b/src/components/PublicGroupList.vue @@ -40,6 +40,7 @@ {{ monitor.element.name }} +
@@ -59,12 +60,14 @@ import Draggable from "vuedraggable"; import HeartbeatBar from "./HeartbeatBar.vue"; import Uptime from "./Uptime.vue"; +import Tag from "./Tag.vue"; export default { components: { Draggable, HeartbeatBar, Uptime, + Tag, }, props: { editMode: { From 9143b73f844ebd1214c2160a6e1319fa91191b6f Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Thu, 28 Oct 2021 14:53:27 +1300 Subject: [PATCH 02/50] Styling for tags --- src/assets/app.scss | 4 ++++ src/components/PublicGroupList.vue | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/assets/app.scss b/src/assets/app.scss index e1a5d052d..ae1ff687c 100644 --- a/src/assets/app.scss +++ b/src/assets/app.scss @@ -346,6 +346,10 @@ textarea.form-control { &.active { background-color: #cdf8f4; } + // Removes margin to line up tags list with uptime percentage + .tags, .tag-wrapper:first-child { + margin-left: 0 !important; + } } } diff --git a/src/components/PublicGroupList.vue b/src/components/PublicGroupList.vue index 39fb342e2..97441d50e 100644 --- a/src/components/PublicGroupList.vue +++ b/src/components/PublicGroupList.vue @@ -40,6 +40,9 @@ {{ monitor.element.name }} + +
+
From 348c5ec995c34d7d17f1e44297e205f04858d787 Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Thu, 28 Oct 2021 15:07:19 +1300 Subject: [PATCH 03/50] Match lint settings --- server/routers/api-router.js | 7 ++++--- src/components/PublicGroupList.vue | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/routers/api-router.js b/server/routers/api-router.js index be186ccca..bf0cc54c8 100644 --- a/server/routers/api-router.js +++ b/server/routers/api-router.js @@ -142,12 +142,13 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, const publicGroupList = []; let list = await R.find("group", " public = 1 ORDER BY weight "); for (let groupBean of list) { - let monitor_info = await groupBean.toPublicJSON() - monitor_info.monitorList = await Promise.all(monitor_info.monitorList.map( async (monitor)=>{ + let monitorGroup = await groupBean.toPublicJSON() + monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map( async (monitor)=>{ + // Includes tags as an array in response, allows for tags to be displayed on public status page let tags = await R.getAll("SELECT mt.monitor_id,mt.value, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [monitor.id]); return {...monitor,tags: tags} })) - publicGroupList.push(monitor_info); + publicGroupList.push(monitorGroup); } response.json(publicGroupList); diff --git a/src/components/PublicGroupList.vue b/src/components/PublicGroupList.vue index 97441d50e..f30edcef5 100644 --- a/src/components/PublicGroupList.vue +++ b/src/components/PublicGroupList.vue @@ -40,7 +40,6 @@ {{ monitor.element.name }} -
From 24664cde2c204f5809c193643837b097cdce81af Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Thu, 28 Oct 2021 15:22:35 +1300 Subject: [PATCH 04/50] Smarter CSS to fix Mobile alignment --- src/assets/app.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/assets/app.scss b/src/assets/app.scss index ae1ff687c..db01e12d2 100644 --- a/src/assets/app.scss +++ b/src/assets/app.scss @@ -346,9 +346,9 @@ textarea.form-control { &.active { background-color: #cdf8f4; } - // Removes margin to line up tags list with uptime percentage - .tags, .tag-wrapper:first-child { - margin-left: 0 !important; + .tags { + // Removes margin to line up tags list with uptime percentage + margin-left: -0.25rem; } } } From b32bfb3ff1578483dd3b8f10e3a05aa83a1fc3cf Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Fri, 29 Oct 2021 18:19:24 +1300 Subject: [PATCH 05/50] Added toggle for tag visibility --- server/routers/api-router.js | 18 +++++++++++++----- src/pages/StatusPage.vue | 31 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/server/routers/api-router.js b/server/routers/api-router.js index bf0cc54c8..b58c4a002 100644 --- a/server/routers/api-router.js +++ b/server/routers/api-router.js @@ -101,6 +101,10 @@ router.get("/api/status-page/config", async (_request, response) => { config.statusPagePublished = true; } + if (! config.statusPageTags) { + config.statusPageTags = "hidden"; + } + if (! config.title) { config.title = "Uptime Kuma"; } @@ -143,11 +147,15 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, let list = await R.find("group", " public = 1 ORDER BY weight "); for (let groupBean of list) { let monitorGroup = await groupBean.toPublicJSON() - monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map( async (monitor)=>{ - // Includes tags as an array in response, allows for tags to be displayed on public status page - let tags = await R.getAll("SELECT mt.monitor_id,mt.value, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [monitor.id]); - return {...monitor,tags: tags} - })) + console.log("\n\nsettings", await getSettings("statusPage")) + if ((await getSettings("statusPage")).statusPageTags=="visible") { + monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map( async (monitor)=>{ + // Includes tags as an array in response, allows for tags to be displayed on public status page + let tags = await R.getAll("SELECT mt.monitor_id,mt.value, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [monitor.id]); + return {...monitor,tags: tags} + })) + } + publicGroupList.push(monitorGroup); } diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 87634f35a..4ee810c7f 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -77,6 +77,16 @@ {{ $t("Switch to Dark Theme") }} + + + +
@@ -292,6 +302,10 @@ export default { return this.config.statusPageTheme; }, + tagsVisible() { + return this.config.statusPageTags + }, + logoClass() { if (this.editMode) { return { @@ -472,6 +486,23 @@ export default { changeTheme(name) { this.config.statusPageTheme = name; }, + changeTagsVisibilty(newState) { + this.config.statusPageTags = newState; + + // On load, if the status page will not include tags if it's not enabled for security reasons + // Which means if we enable tags, it won't show in the UI until saved + // So we have this to enhance UX and load in the tags from the authenticated source instantly + this.$root.publicGroupList = this.$root.publicGroupList.map((group)=>{ + return {...group, + monitorList: group.monitorList.map((monitor)=> { + // We only include the tags if visible so we can reuse the logic to hide the tags on disable + return {...monitor, + tags: newState==="visible" ? this.$root.monitorList[monitor.id].tags : [] + } + }) + } + }); + }, /** * Crop Success From 74688e69aa6313c14a87bab53a5712f900bd0b20 Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Sat, 30 Oct 2021 00:58:46 +1300 Subject: [PATCH 06/50] Remove debug statement in server/routers/api-router.js Co-authored-by: Adam Stachowicz --- server/routers/api-router.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server/routers/api-router.js b/server/routers/api-router.js index b58c4a002..a5d12450c 100644 --- a/server/routers/api-router.js +++ b/server/routers/api-router.js @@ -147,7 +147,6 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, let list = await R.find("group", " public = 1 ORDER BY weight "); for (let groupBean of list) { let monitorGroup = await groupBean.toPublicJSON() - console.log("\n\nsettings", await getSettings("statusPage")) if ((await getSettings("statusPage")).statusPageTags=="visible") { monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map( async (monitor)=>{ // Includes tags as an array in response, allows for tags to be displayed on public status page From 8ec858fd1424c06ac1127f87b8dfca486a65e14b Mon Sep 17 00:00:00 2001 From: Minvinea <29579830+Minvinea@users.noreply.github.com> Date: Sun, 31 Oct 2021 21:18:36 +0100 Subject: [PATCH 07/50] Add missing translation Line 282 to 306 --- src/languages/fr-FR.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js index 062435d73..176a6150f 100644 --- a/src/languages/fr-FR.js +++ b/src/languages/fr-FR.js @@ -279,4 +279,29 @@ export default { promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).", promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)", promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base: InfoSMS, SMS Info, MaxSMS, INFO, SMS", + "Primary Base URL": "Primary Base URL", + emailCustomSubject: "Sujet personalisé", + clicksendsms: "ClickSend SMS", + checkPrice: "Vérification {0} tarifs:", + apiCredentials: "Crédentials de l'API", + octopushLegacyHint: "Vous utilisez l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?", + "Feishu WebHookUrl": "Feishu WebHookURL", + matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultatif)", + "Internal Room Id": "ID de la salle interne", + matrixDesc1: "Vous pouvez trouvez l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est sensé ressembler à: !QMdRCpUIfLwsfjxye6:home.server.", + matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Au lieu de cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}", + Method: "Méthode", + Body: "Le corps", + Headers: "En-têtes", + PushUrl: "Push URL", + HeadersInvalidFormat: "L'en-têtes de la requête n'est pas dans un format JSON valide: ", + BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide: ", + "Monitor History": "Historique de la sonde", + clearDataOlderThan: "Garder l'historique des données de la sonde durant {0} jours.", + PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.", + records: "Enregistrements", + "One record": "Un enregistrement", + steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici: ", + "Current User": "Utilisateur actuel", + recent: "Récent", }; From 8840ca618bf120fa49811e1b603a67a4f7ab01a6 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 31 Oct 2021 21:22:19 +0100 Subject: [PATCH 08/50] Update `pl.js` --- src/languages/pl.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/languages/pl.js b/src/languages/pl.js index 747ca1ad1..430224469 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -28,7 +28,7 @@ export default { confirmDisableTwoFAMsg: "Jesteś pewien, że chcesz wyłączyć 2FA?", Settings: "Ustawienia", Dashboard: "Panel", - "New Update": "Nowa Aktualizacja", + "New Update": "Nowa aktualizacja", Language: "Język", Appearance: "Wygląd", Theme: "Motyw", @@ -305,4 +305,6 @@ export default { steamApiKeyDescription: "Do monitorowania serwera gier Steam potrzebny jest klucz Steam Web-API. Możesz zarejestrować swój klucz API tutaj: ", "Current User": "Aktualny użytkownik", recent: "Ostatnie", + clicksendsms: "ClickSend SMS", + apiCredentials: "Poświadczenia API", }; From bb96a577ca66c9de771195ae27bb1300d9e7ae33 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 31 Oct 2021 21:47:07 +0100 Subject: [PATCH 09/50] Fix typos + translate `wayToGetTeamsURL` --- src/languages/pl.js | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/languages/pl.js b/src/languages/pl.js index 430224469..95d5890f3 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -37,7 +37,7 @@ export default { "Check Update On GitHub": "Sprawdź aktualizację na GitHub", List: "Lista", Add: "Dodaj", - "Add New Monitor": "Dodaj Monitor", + "Add New Monitor": "Dodaj monitor", "Quick Stats": "Szybki podgląd statystyk", Up: "Online", Down: "Offline", @@ -53,8 +53,8 @@ export default { Edit: "Edytuj", Delete: "Usuń", Current: "Aktualny", - Uptime: "Czas Pracy", - "Cert Exp.": "Certyfikat Wygasa", + Uptime: "Czas pracy", + "Cert Exp.": "Certyfikat wygasa", days: "dni", day: "dzień", "-day": " dni", @@ -62,9 +62,9 @@ export default { "-hour": " godzin", Response: "Odpowiedź", Ping: "Ping", - "Monitor Type": "Rodzaj Monitora", + "Monitor Type": "Rodzaj monitora", Keyword: "Słowo kluczowe", - "Friendly Name": "Przyjazna Nazwa", + "Friendly Name": "Przyjazna nazwa", URL: "URL", Hostname: "Hostname", Port: "Port", @@ -73,12 +73,12 @@ export default { "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca", Advanced: "Zaawansowane", "Upside Down Mode": "Tryb odwrócony", - "Max. Redirects": "Maks. Przekierowań", + "Max. Redirects": "Maks. przekierowań", "Accepted Status Codes": "Akceptowane kody statusu", Save: "Zapisz", Notifications: "Powiadomienia", "Not available, please setup.": "Niedostępne, proszę skonfigurować.", - "Setup Notification": "Skonfiguruj Powiadomienie", + "Setup Notification": "Skonfiguruj powiadomienie", Light: "Jasny", Dark: "Ciemny", Auto: "Automatyczny", @@ -122,7 +122,7 @@ export default { "Export Backup": "Eksportuj kopię zapasową", Export: "Eksportuj", Import: "Importuj", - respTime: "Czas Odp. (ms)", + respTime: "Czas odp. (ms)", notAvailableShort: "N/A", "Default enabled": "Włącz domyślnie", "Apply on all existing monitors": "Zastosuj do istniejących monitorów", @@ -183,7 +183,7 @@ export default { here: "tutaj", Required: "Wymagane", telegram: "Telegram", - "Bot Token": "Token Bota", + "Bot Token": "Token bota", wayToGetTelegramToken: "Token można uzyskać z {0}.", "Chat ID": "Identyfikator Czatu", supportTelegramChatID: "Czat wsprarcia technicznego / Bezpośrednia Rozmowa / Czat Grupowy", @@ -198,20 +198,20 @@ export default { smtp: "Email (SMTP)", secureOptionNone: "Brak / STARTTLS (25, 587)", secureOptionTLS: "TLS (465)", - "Ignore TLS Error": "Zignrouj Błędy TLS", + "Ignore TLS Error": "Zignoruj błędy TLS", "From Email": "Nadawca (OD)", "To Email": "Odbiorca (DO)", smtpCC: "DW", smtpBCC: "UDW", discord: "Discord", - "Discord Webhook URL": "URL Webhook Discorda", + "Discord Webhook URL": "URL webhook Discorda", wayToGetDiscordURL: "Możesz go uzyskać przechodząc do Ustawienia Serwera -> Integracje -> Tworzenie Webhooka", - "Bot Display Name": "Wyświetlana Nazwa Bota", - "Prefix Custom Message": "Własny Początek Wiadomości", + "Bot Display Name": "Wyświetlana nazwa bota", + "Prefix Custom Message": "Własny początek wiadomości", "Hello @everyone is...": "Hej {'@'}everyone ...", teams: "Microsoft Teams", - "Webhook URL": "URL Webhooka", - wayToGetTeamsURL: "You can learn how to create a webhook url {0}.", + "Webhook URL": "URL webhooka", + wayToGetTeamsURL: "Możesz dowiedzieć się, jak utworzyć adres url webhooka {0}.", signal: "Signal", Number: "Numer", Recipients: "Odbiorcy", @@ -219,17 +219,17 @@ export default { wayToCheckSignalURL: "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:", signalImportant: "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!", gotify: "Gotify", - "Application Token": "Token Aplikacji", + "Application Token": "Token aplikacji", "Server URL": "Server URL", Priority: "Priorytet", slack: "Slack", - "Icon Emoji": "Ikona Emoji", - "Channel Name": "Nazwa Kanału", + "Icon Emoji": "Ikona emoji", + "Channel Name": "Nazwa kanału", "Uptime Kuma URL": "Adres Uptime Kuma", aboutWebhooks: "Więcej informacji na temat webhooków: {0}", aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa Kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal", aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na Github.", - emojiCheatSheet: "Ściąga Emoji: {0}", + emojiCheatSheet: "Ściąga emoji: {0}", "rocket.chat": "Rocket.chat", pushover: "Pushover", pushy: "Pushy", @@ -240,10 +240,10 @@ export default { pushbullet: "Pushbullet", line: "Line Messenger", mattermost: "Mattermost", - "User Key": "Klucz Użytkownika", + "User Key": "Klucz użytkownika", Device: "Urządzenie", - "Message Title": "Tytuł Wiadomości", - "Notification Sound": "Dźwięk Powiadomienia", + "Message Title": "Tytuł wiadomości", + "Notification Sound": "Dźwięk powiadomienia", "More info on:": "Więcej informacji na: {0}", pushoverDesc1: "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.", pushoverDesc2: "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.", @@ -253,21 +253,21 @@ export default { "Check octopush prices": "Sprawdź ceny Octopush {0}.", octopushPhoneNumber: "Numer Telefonu (Format międzynarodowy np.: +33612345678)", octopushSMSSender: "Nadawca SMS : 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)", - "LunaSea Device ID": "Idetyfikator Urządzenia LunaSea", + "LunaSea Device ID": "Idetyfikator urządzenia LunaSea", "Apprise URL": "URL Apprise", "Example:": "Przykład: {0}", - "Read more:": "Czytaj Dalej: {0}", + "Read more:": "Czytaj dalej: {0}", "Status:": "Status: {0}", "Read more": "Czytaj dalej", appriseInstalled: "Apprise jest zostało zainstalowane.", appriseNotInstalled: "Apprise nie zostało zainstalowane. {0}", - "Access Token": "Token Dostępu", - "Channel access token": "Token Dostępu Kanału", - "Line Developers Console": "Konsola Dewelopersja Line", - lineDevConsoleTo: "Konsola Dewelopersja Line - {0}", - "Basic Settings": "Ustawienia Ogólne", - "User ID": "Idetyfikator Użytkownika", - "Messaging API": "API Wiadomości", + "Access Token": "Token dostępu", + "Channel access token": "Token dostępu kanału", + "Line Developers Console": "Konsola deweloperska Line", + lineDevConsoleTo: "Konsola deweloperska Line - {0}", + "Basic Settings": "Ustawienia ogólne", + "User ID": "Identyfikator użytkownika", + "Messaging API": "API wiadomości", wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.", "Icon URL": "Adres Ikony", aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona Emoji.", From b12b848d974683a257b0fdcaa4c272c2e1135412 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 31 Oct 2021 21:48:43 +0100 Subject: [PATCH 10/50] One more typo... --- src/languages/pl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/pl.js b/src/languages/pl.js index 95d5890f3..f672fdbf0 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -253,7 +253,7 @@ export default { "Check octopush prices": "Sprawdź ceny Octopush {0}.", octopushPhoneNumber: "Numer Telefonu (Format międzynarodowy np.: +33612345678)", octopushSMSSender: "Nadawca SMS : 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)", - "LunaSea Device ID": "Idetyfikator urządzenia LunaSea", + "LunaSea Device ID": "Identyfikator urządzenia LunaSea", "Apprise URL": "URL Apprise", "Example:": "Przykład: {0}", "Read more:": "Czytaj dalej: {0}", From d06e5ef6fa805fbfc839803176b0cdd02423d4ad Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 31 Oct 2021 21:53:11 +0100 Subject: [PATCH 11/50] More small letters --- src/languages/pl.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/languages/pl.js b/src/languages/pl.js index f672fdbf0..1144d4ebe 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -236,7 +236,7 @@ export default { octopush: "Octopush", promosms: "PromoSMS", lunasea: "LunaSea", - apprise: "Apprise (Obsługuje 50+ usług powiadomień)", + apprise: "Apprise (obsługuje 50+ usług powiadomień)", pushbullet: "Pushbullet", line: "Line Messenger", mattermost: "Mattermost", @@ -248,11 +248,11 @@ export default { pushoverDesc1: "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.", pushoverDesc2: "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.", "SMS Type": "Rodzaj SMS", - octopushTypePremium: "Premium (Szybki - rekomendowany dla powiadomień)", - octopushTypeLowCost: "Low Cost (Wolny, czasami blokowany przez operatorów)", + octopushTypePremium: "Premium (szybki - rekomendowany dla powiadomień)", + octopushTypeLowCost: "Low Cost (wolny, czasami blokowany przez operatorów)", "Check octopush prices": "Sprawdź ceny Octopush {0}.", - octopushPhoneNumber: "Numer Telefonu (Format międzynarodowy np.: +33612345678)", - octopushSMSSender: "Nadawca SMS : 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)", + octopushPhoneNumber: "Numer telefonu (format międzynarodowy np.: +33612345678)", + octopushSMSSender: "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)", "LunaSea Device ID": "Identyfikator urządzenia LunaSea", "Apprise URL": "URL Apprise", "Example:": "Przykład: {0}", @@ -271,14 +271,14 @@ export default { wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.", "Icon URL": "Adres Ikony", aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona Emoji.", - aboutMattermostChannelName: "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa Kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał", + aboutMattermostChannelName: "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał", matrix: "Matrix", - promosmsTypeEco: "SMS ECO - Tanie, lecz wolne. Dostępne tylko w Polsce", - promosmsTypeFlash: "SMS FLASH - Wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.", - promosmsTypeFull: "SMS FULL - Szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.", - promosmsTypeSpeed: "SMS SPEED - Wysyłka priorytetowa, posiada wszystkie zalety SMS FULL", - promosmsPhoneNumber: "Numer Odbiorcy", - promosmsSMSSender: "Nadawca SMS (Wcześniej zatwierdzone nazwy z panelu PromoSMS)", + promosmsTypeEco: "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce", + promosmsTypeFlash: "SMS FLASH - wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.", + promosmsTypeFull: "SMS FULL - szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.", + promosmsTypeSpeed: "SMS SPEED - wysyłka priorytetowa, posiada wszystkie zalety SMS FULL", + promosmsPhoneNumber: "Numer odbiorcy", + promosmsSMSSender: "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)", "Primary Base URL": "Główny URL", "Push URL": "Push URL", needPushEvery: "Powinieneś wywoływać ten URL co {0} sekund", From 4d3d6d6e259a92352982b39ab22333185614062d Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 31 Oct 2021 21:59:56 +0100 Subject: [PATCH 12/50] Missing this... --- src/languages/pl.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/languages/pl.js b/src/languages/pl.js index 1144d4ebe..082980d3b 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -185,8 +185,8 @@ export default { telegram: "Telegram", "Bot Token": "Token bota", wayToGetTelegramToken: "Token można uzyskać z {0}.", - "Chat ID": "Identyfikator Czatu", - supportTelegramChatID: "Czat wsprarcia technicznego / Bezpośrednia Rozmowa / Czat Grupowy", + "Chat ID": "Identyfikator czatu", + supportTelegramChatID: "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy", wayToGetTelegramChatID: "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:", "YOUR BOT TOKEN HERE": "TWOJ TOKEN BOTA", chatIDNotFound: "Identyfikator czatu nie znaleziony, najpierw napisz do bota", @@ -205,7 +205,7 @@ export default { smtpBCC: "UDW", discord: "Discord", "Discord Webhook URL": "URL webhook Discorda", - wayToGetDiscordURL: "Możesz go uzyskać przechodząc do Ustawienia Serwera -> Integracje -> Tworzenie Webhooka", + wayToGetDiscordURL: "Możesz go uzyskać przechodząc do Ustawienia serwera -> Integracje -> Tworzenie webhooka", "Bot Display Name": "Wyświetlana nazwa bota", "Prefix Custom Message": "Własny początek wiadomości", "Hello @everyone is...": "Hej {'@'}everyone ...", @@ -227,8 +227,8 @@ export default { "Channel Name": "Nazwa kanału", "Uptime Kuma URL": "Adres Uptime Kuma", aboutWebhooks: "Więcej informacji na temat webhooków: {0}", - aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa Kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal", - aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na Github.", + aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal", + aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na GitHub.", emojiCheatSheet: "Ściąga emoji: {0}", "rocket.chat": "Rocket.chat", pushover: "Pushover", @@ -270,7 +270,7 @@ export default { "Messaging API": "API wiadomości", wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.", "Icon URL": "Adres Ikony", - aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona Emoji.", + aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona emoji.", aboutMattermostChannelName: "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał", matrix: "Matrix", promosmsTypeEco: "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce", From 4004926e643e63a2a8d6915cef6af6992225aa9f Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Mon, 1 Nov 2021 12:52:21 +1300 Subject: [PATCH 13/50] Small formatting changes from code-review Co-authored-by: deef --- src/pages/StatusPage.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 4ee810c7f..06be16169 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -493,10 +493,12 @@ export default { // Which means if we enable tags, it won't show in the UI until saved // So we have this to enhance UX and load in the tags from the authenticated source instantly this.$root.publicGroupList = this.$root.publicGroupList.map((group)=>{ - return {...group, + return { + ...group, monitorList: group.monitorList.map((monitor)=> { // We only include the tags if visible so we can reuse the logic to hide the tags on disable - return {...monitor, + return { + ...monitor, tags: newState==="visible" ? this.$root.monitorList[monitor.id].tags : [] } }) From 12ef9f39c51fac03f5a18ba4182a9a81328c662f Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Mon, 1 Nov 2021 13:23:46 +1300 Subject: [PATCH 14/50] Merged buttons, cleaned up SS tag retrieval and made tagsVisible a bool. Also to note: due to the transition of tagsVisible this breaks compatibility with the previous commits, delete the tagsVisible setting in the database to fix. --- server/routers/api-router.js | 19 +++++++++++++------ src/pages/StatusPage.vue | 19 ++++++++++--------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/server/routers/api-router.js b/server/routers/api-router.js index a5d12450c..30f6a828c 100644 --- a/server/routers/api-router.js +++ b/server/routers/api-router.js @@ -102,7 +102,7 @@ router.get("/api/status-page/config", async (_request, response) => { } if (! config.statusPageTags) { - config.statusPageTags = "hidden"; + config.statusPageTags = false; } if (! config.title) { @@ -144,15 +144,22 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, try { await checkPublished(); const publicGroupList = []; - let list = await R.find("group", " public = 1 ORDER BY weight "); + const tagsVisible = (await getSettings("statusPage")).statusPageTags; + const list = await R.find("group", " public = 1 ORDER BY weight "); for (let groupBean of list) { - let monitorGroup = await groupBean.toPublicJSON() - if ((await getSettings("statusPage")).statusPageTags=="visible") { + let monitorGroup = await groupBean.toPublicJSON(); + if (tagsVisible) { monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map( async (monitor)=>{ // Includes tags as an array in response, allows for tags to be displayed on public status page - let tags = await R.getAll("SELECT mt.monitor_id,mt.value, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [monitor.id]); + const tags = await R.getAll( + `SELECT monitor_tag.monitor_id, monitor_tag.value, tag.name, tag.color + FROM monitor_tag + JOIN tag + ON monitor_tag.tag_id = tag.id + WHERE monitor_tag.monitor_id = ?`, [monitor.id] + ); return {...monitor,tags: tags} - })) + })); } publicGroupList.push(monitorGroup); diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 06be16169..1320f093b 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -78,14 +78,15 @@ {{ $t("Switch to Dark Theme") }} - - - @@ -499,7 +500,7 @@ export default { // We only include the tags if visible so we can reuse the logic to hide the tags on disable return { ...monitor, - tags: newState==="visible" ? this.$root.monitorList[monitor.id].tags : [] + tags: newState ? this.$root.monitorList[monitor.id].tags : [] } }) } From f3651a1219a12b28e66964fb4fcd90eb742d3cad Mon Sep 17 00:00:00 2001 From: Jagger <634750802@qq.com> Date: Mon, 1 Nov 2021 13:31:31 +0800 Subject: [PATCH 15/50] Add a status prefix for feishu notification --- server/notification-providers/feishu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/notification-providers/feishu.js b/server/notification-providers/feishu.js index a3e340301..05fc9c186 100644 --- a/server/notification-providers/feishu.js +++ b/server/notification-providers/feishu.js @@ -27,7 +27,7 @@ class Feishu extends NotificationProvider { content: { post: { zh_cn: { - title: "UptimeKuma Alert: " + monitorJSON["name"], + title: "UptimeKuma Alert: [Down] " + monitorJSON["name"], content: [ [ { @@ -54,7 +54,7 @@ class Feishu extends NotificationProvider { content: { post: { zh_cn: { - title: "UptimeKuma Alert: " + monitorJSON["name"], + title: "UptimeKuma Alert: [Up] " + monitorJSON["name"], content: [ [ { From 191b81ee07ab919123427d6ef1998969350b5d8f Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh Date: Mon, 1 Nov 2021 22:14:41 +1300 Subject: [PATCH 16/50] Fix grammer in comment Co-authored-by: Nelson Chan --- src/pages/StatusPage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 1320f093b..70367cc9f 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -490,7 +490,7 @@ export default { changeTagsVisibilty(newState) { this.config.statusPageTags = newState; - // On load, if the status page will not include tags if it's not enabled for security reasons + // On load, the status page will not include tags if it's not enabled for security reasons // Which means if we enable tags, it won't show in the UI until saved // So we have this to enhance UX and load in the tags from the authenticated source instantly this.$root.publicGroupList = this.$root.publicGroupList.map((group)=>{ From 60e12f4bfa55f10b0f5d90e3a6f87bf94e2cdb96 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Tue, 2 Nov 2021 01:13:05 +0800 Subject: [PATCH 17/50] fix healthcheck.js with prefix UPTIME_KUMA_ --- extra/healthcheck.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/extra/healthcheck.js b/extra/healthcheck.js index 99f748fb5..8044f654f 100644 --- a/extra/healthcheck.js +++ b/extra/healthcheck.js @@ -1,19 +1,35 @@ /* * This script should be run after a period of time (180s), because the server may need some time to prepare. */ +const { FBSD } = require("../server/util-server"); + process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; let client; -if (process.env.SSL_KEY && process.env.SSL_CERT) { +const sslKey = process.env.UPTIME_KUMA_SSL_KEY || process.env.SSL_KEY || undefined; +const sslCert = process.env.UPTIME_KUMA_SSL_CERT || process.env.SSL_CERT || undefined; + +if (sslKey && sslCert) { client = require("https"); } else { client = require("http"); } +// If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise. +// Dual-stack support for (::) +let hostname = process.env.UPTIME_KUMA_HOST; + +// Also read HOST if not FreeBSD, as HOST is a system environment variable in FreeBSD +if (!hostname && !FBSD) { + hostname = process.env.HOST; +} + +const port = parseInt(process.env.UPTIME_KUMA_PORT || process.env.PORT || 3001); + let options = { - host: process.env.HOST || "127.0.0.1", - port: parseInt(process.env.PORT) || 3001, + host: hostname || "127.0.0.1", + port: port, timeout: 28 * 1000, }; From 83ee46454a86f5d4b2e477b8972ced7d96f583b7 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Tue, 2 Nov 2021 13:12:46 +0800 Subject: [PATCH 18/50] Update bug_report.yaml --- .github/ISSUE_TEMPLATE/bug_report.yaml | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 81ea9a32d..1dcfea8c2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -16,7 +16,7 @@ body: validations: required: true attributes: - label: "👍 Expected behavior" + label: "👀 Expected behavior" description: "What did you think would happen?" placeholder: "..." - type: textarea @@ -24,13 +24,13 @@ body: validations: required: true attributes: - label: "👎 Actual Behavior" + label: "😓 Actual Behavior" description: "What actually happen?" placeholder: "..." - type: input id: uptime-kuma-version attributes: - label: "🐻 Uptime-Kuma version" + label: "🐻 Uptime-Kuma Version" description: "Which version of Uptime-Kuma are you running?" placeholder: "Ex. 1.9.x" validations: @@ -38,9 +38,9 @@ body: - type: input id: operating-system attributes: - label: "💻 Operating System" + label: "💻 Operating System and Arch" description: "Which OS is your server/device running on?" - placeholder: "Ex. Ubuntu 20.04" + placeholder: "Ex. Ubuntu 20.04 x86" validations: required: true - type: input @@ -54,17 +54,9 @@ body: - type: input id: docker-version attributes: - label: "🐋 Docker" + label: "🐋 Docker Version" description: "If running with Docker, which version are you running?" - placeholder: "Ex. 20.10.9" - validations: - required: false - - type: input - id: docker-image-tag - attributes: - label: "🏷️ Docker Image Tag" - description: "Which Docker image tag are you using? If running '1' or 'latest', please specify image hash." - placeholder: "Ex. 1.9.1" + placeholder: "Ex. 20.10.9 / K8S / Podman" validations: required: false - type: input @@ -82,7 +74,7 @@ body: description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. render: shell validations: - required: false + required: false - type: checkboxes id: no-duplicate-issues attributes: From 541068ff3bfbbba514d50f4279e0bf4b6bdb4349 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Tue, 2 Nov 2021 13:23:47 +0800 Subject: [PATCH 19/50] Update bug_report.yaml --- .github/ISSUE_TEMPLATE/bug_report.yaml | 50 +++++++++++++++----------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 1dcfea8c2..53028bf00 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,8 +1,31 @@ name: "🐛 Bug Report" description: "Submit a bug report to help us improve" -title: "[Bug]: " +title: "[Bug] " labels: [bug] body: + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "⚠️ Please verify that this bug has NOT been raised before." + description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + attributes: + label: "🛡️ Security Policy" + description: Please review the security policy before reporting security related issues/bugs. + options: + - label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy) + required: true + - type: textarea + id: description + validations: + required: false + attributes: + label: "Description" + description: "You could also upload screenshots" + placeholder: "" - type: textarea id: steps-to-reproduce validations: @@ -31,8 +54,8 @@ body: id: uptime-kuma-version attributes: label: "🐻 Uptime-Kuma Version" - description: "Which version of Uptime-Kuma are you running?" - placeholder: "Ex. 1.9.x" + description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1" + placeholder: "Ex. 1.10.0" validations: required: true - type: input @@ -48,7 +71,7 @@ body: attributes: label: "🌐 Browser" description: "Which browser are you running on?" - placeholder: "Ex. Firefox" + placeholder: "Ex. Google Chrome 95.0.4638.69" validations: required: true - type: input @@ -56,7 +79,7 @@ body: attributes: label: "🐋 Docker Version" description: "If running with Docker, which version are you running?" - placeholder: "Ex. 20.10.9 / K8S / Podman" + placeholder: "Ex. Docker 20.10.9 / K8S / Podman" validations: required: false - type: input @@ -74,19 +97,4 @@ body: description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. render: shell validations: - required: false - - type: checkboxes - id: no-duplicate-issues - attributes: - label: "⚠️ Please verify that this bug has NOT been raised before." - description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" - options: - - label: "I checked and didn't find similar issue" - required: true - - type: checkboxes - attributes: - label: "🛡️ Security Policy" - description: Please review the security policy before reporting security related issues/bugs. - options: - - label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy) - required: true + required: false From b2bc8d9db95d5b4d15d69eeb3da01fe26cb7d1c4 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 13:24:15 +0800 Subject: [PATCH 20/50] Update bug_report.yaml --- .github/ISSUE_TEMPLATE/bug_report.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 53028bf00..90296e12b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -25,7 +25,6 @@ body: attributes: label: "Description" description: "You could also upload screenshots" - placeholder: "" - type: textarea id: steps-to-reproduce validations: From da0eaddeb806e31e5264f41d29bef79384abb5ff Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 13:25:34 +0800 Subject: [PATCH 21/50] Update SECURITY.md --- SECURITY.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 7b9bfca41..3a11e8817 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,5 +1,11 @@ # Security Policy +## Reporting a Vulnerability + +Please report security issues to uptime@kuma.pet. + +Do not use the issue tracker or discuss it in the public as it will cause more damage. + ## Supported Versions Use this section to tell people about which versions of your project are @@ -23,9 +29,3 @@ currently being supported with security updates. | debian | :white_check_mark: | | alpine | :white_check_mark: | | All other tags | ❌ | - -## Reporting a Vulnerability - -Please report security issues to uptime@kuma.pet. - -Do not use the issue tracker or discuss it in the public as it will cause more damage. From 973c2bb429a93ea3ff9f85257489886ecd70558b Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 13:30:13 +0800 Subject: [PATCH 22/50] Update ask-for-help.yaml --- .github/ISSUE_TEMPLATE/ask-for-help.yaml | 56 ++++++++++-------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/ask-for-help.yaml b/.github/ISSUE_TEMPLATE/ask-for-help.yaml index a1425c9c9..a84eddae9 100644 --- a/.github/ISSUE_TEMPLATE/ask-for-help.yaml +++ b/.github/ISSUE_TEMPLATE/ask-for-help.yaml @@ -3,6 +3,21 @@ description: "Submit any question related to Uptime Kuma" title: "[Help]: <title>" labels: [help] body: + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "⚠️ Please verify that this bug has NOT been raised before." + description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + attributes: + label: "🛡️ Security Policy" + description: Please review the security policy before reporting security related issues/bugs. + options: + - label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy) + required: true - type: textarea id: steps-to-reproduce validations: @@ -14,17 +29,17 @@ body: - type: input id: uptime-kuma-version attributes: - label: "🐻 Uptime-Kuma version" - description: "Which version of Uptime-Kuma are you running?" - placeholder: "Ex. 1.9.x" + label: "🐻 Uptime-Kuma Version" + description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1" + placeholder: "Ex. 1.10.0" validations: required: true - type: input id: operating-system attributes: - label: "💻 Operating System" + label: "💻 Operating System and Arch" description: "Which OS is your server/device running on?" - placeholder: "Ex. Ubuntu 20.04" + placeholder: "Ex. Ubuntu 20.04 x86" validations: required: true - type: input @@ -32,23 +47,15 @@ body: attributes: label: "🌐 Browser" description: "Which browser are you running on?" - placeholder: "Ex. Firefox" + placeholder: "Ex. Google Chrome 95.0.4638.69" validations: required: true - type: input id: docker-version attributes: - label: "🐋 Docker" + label: "🐋 Docker Version" description: "If running with Docker, which version are you running?" - placeholder: "Ex. 20.10.9" - validations: - required: false - - type: input - id: docker-image-tag - attributes: - label: "🏷️ Docker Image Tag" - description: "Which Docker image tag are you using? If running '1' or 'latest', please specify image hash." - placeholder: "Ex. 1.9.1" + placeholder: "Ex. Docker 20.10.9 / K8S / Podman" validations: required: false - type: input @@ -56,21 +63,6 @@ body: attributes: label: "🟩 NodeJS Version" description: "If running with Node.js? which version are you running?" - placeholder: "14.x" + placeholder: "Ex. 14.18.0" validations: required: false - - type: checkboxes - id: no-duplicate-issues - attributes: - label: "⚠️ Please verify that this question has NOT been raised before." - description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" - options: - - label: "I checked and didn't find similar question" - required: true - - type: checkboxes - attributes: - label: "🛡️ Security Policy" - description: Please review the security policy before reporting security related issues/bugs. - options: - - label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy) - required: true From 17e59f1d8d3da67e798f902475375328721fc6eb Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 13:30:39 +0800 Subject: [PATCH 23/50] Update ask-for-help.yaml --- .github/ISSUE_TEMPLATE/ask-for-help.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/ask-for-help.yaml b/.github/ISSUE_TEMPLATE/ask-for-help.yaml index a84eddae9..76a78e5c3 100644 --- a/.github/ISSUE_TEMPLATE/ask-for-help.yaml +++ b/.github/ISSUE_TEMPLATE/ask-for-help.yaml @@ -1,6 +1,6 @@ name: "❓ Ask for help" description: "Submit any question related to Uptime Kuma" -title: "[Help]: <title>" +title: "[Help] " labels: [help] body: - type: checkboxes From df80f413b5bc95cd315607c36fce72fd3b629e35 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 13:31:19 +0800 Subject: [PATCH 24/50] Update feature_request.yaml --- .github/ISSUE_TEMPLATE/feature_request.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 1a3cebc09..6464e276a 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,8 +1,16 @@ name: 🚀 Feature Request description: "Submit a proposal for a new feature" -title: "[Feature]: <title>" +title: "[Feature] " labels: [enhancement] body: + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "⚠️ Please verify that this feature request has NOT been suggested before." + description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" + options: + - label: "I checked and didn't find similar feature request" + required: true - type: dropdown id: feature-area attributes: @@ -49,11 +57,3 @@ body: label: "📝 Additional Context" description: "Add any other context or screenshots about the feature request here." placeholder: "..." - - type: checkboxes - id: no-duplicate-issues - attributes: - label: "⚠️ Please verify that this feature request has NOT been suggested before." - description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" - options: - - label: "I checked and didn't find similar feature request" - required: true From dec84282ede9c8821c652b67feac2646c19867f4 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 13:31:27 +0800 Subject: [PATCH 25/50] Update bug_report.yaml --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 90296e12b..055c3a626 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -86,7 +86,7 @@ body: attributes: label: "🟩 NodeJS Version" description: "If running with Node.js? which version are you running?" - placeholder: "14.x" + placeholder: "Ex. 14.18.0" validations: required: false - type: textarea From 8e6173c05ee11a26935bed6423064cc3d2f12fa7 Mon Sep 17 00:00:00 2001 From: Your Name <you@example.com> Date: Mon, 1 Nov 2021 23:10:34 +0100 Subject: [PATCH 26/50] Fix and add new hr-HR translations --- src/languages/hr-HR.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js index 35383a0f3..2fb04bb33 100644 --- a/src/languages/hr-HR.js +++ b/src/languages/hr-HR.js @@ -10,7 +10,7 @@ export default { passwordNotMatchMsg: "Lozinke se ne poklapaju.", notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.", keywordDescription: "Ključna riječ za pretragu kao običan HTML ili u JSON formatu. Pretraga je case-sensitive.", - pauseDashboardHome: "Pauziraj", + pauseDashboardHome: "Pauzirano", deleteMonitorMsg: "Jeste li sigurni da želite izbrisati monitor?", deleteNotificationMsg: "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?", resoverserverDescription: "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.", @@ -25,7 +25,7 @@ export default { twoFAVerifyLabel: "Unesite svoj 2FA token:", tokenValidSettingsMsg: "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.", confirmEnableTwoFAMsg: "Želite li omogućiti dvofaktorsku autentikaciju?", - confirmDisableTwoFAMsg: "Are you sure you want to disable dvofaktorsku autentikaciju?", + confirmDisableTwoFAMsg: "Jeste li sigurni da želite onemogućiti dvofaktorsku autentikaciju?", Settings: "Postavke", Dashboard: "Kontrolna ploča", "New Update": "Novo ažuriranje", @@ -44,7 +44,7 @@ export default { Down: "Nedostupno", Pending: "U tijeku", Unknown: "Nepoznato", - Pause: "Pauzirano", + Pause: "Pauziraj", Name: "Naziv monitora", Status: "Status", DateTime: "Vremenska oznaka", @@ -307,4 +307,5 @@ export default { "Showing {from} to {to} of {count} records": "Prikaz zapisa {from}-{to} od sveukupno {count}", steamApiKeyDescription: "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ", "Current User": "Trenutni korisnik", + recent: "Nedavno", }; From 9a135deac2925fa0625ff100d17b44ab491dfab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Bratovi=C4=87?= <ivanbratovic4@gmail.com> Date: Tue, 2 Nov 2021 11:48:55 +0100 Subject: [PATCH 27/50] Add new translation for 'Uptime' --- src/languages/hr-HR.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js index 2fb04bb33..29d1343d1 100644 --- a/src/languages/hr-HR.js +++ b/src/languages/hr-HR.js @@ -54,7 +54,7 @@ export default { Edit: "Uredi", Delete: "Obriši", Current: "Trenutno", - Uptime: "Uptime", + Uptime: "Dostupnost", "Cert Exp.": "Istek cert.", days: "dana", day: "dan", From 1fb9b25d1357383ed720860901c3df1606d7179d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Bratovi=C4=87?= <ivanbratovic4@gmail.com> Date: Tue, 2 Nov 2021 14:09:01 +0100 Subject: [PATCH 28/50] Improve hr-HR translations --- src/languages/hr-HR.js | 50 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js index 29d1343d1..01674dce8 100644 --- a/src/languages/hr-HR.js +++ b/src/languages/hr-HR.js @@ -2,15 +2,14 @@ export default { languageName: "Hrvatski", checkEverySecond: "Provjera svake {0} sekunde", retryCheckEverySecond: "Ponovni pokušaj svake {0} sekunde", - retriesDescription: "Broj ponovnih pokušaja prije nego će se servis označiti kao DOWN te poslati obavijest", + retriesDescription: "Broj ponovnih pokušaja prije nego će se servis označiti kao nedostupan te poslati obavijest", ignoreTLSError: "Ignoriraj TLS/SSL pogreške za HTTPS web stranice", - upsideDownModeDescription: "Preokreni logiku statusa. Ako je usluga dostupna, smatra se da je DOWN.", + upsideDownModeDescription: "Preokreni logiku statusa. Ako se primi pozitivan odgovor, smatra se da je usluga nedostupna.", maxRedirectDescription: "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.", acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.", passwordNotMatchMsg: "Lozinke se ne poklapaju.", notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.", - keywordDescription: "Ključna riječ za pretragu kao običan HTML ili u JSON formatu. Pretraga je case-sensitive.", - pauseDashboardHome: "Pauzirano", + keywordDescription: "Ključna riječ za pretragu, u obliku običnog HTML-a ili u JSON formatu. Pretraga je osjetljiva na velika i mala slova.", deleteMonitorMsg: "Jeste li sigurni da želite izbrisati monitor?", deleteNotificationMsg: "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?", resoverserverDescription: "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.", @@ -44,12 +43,13 @@ export default { Down: "Nedostupno", Pending: "U tijeku", Unknown: "Nepoznato", - Pause: "Pauziraj", - Name: "Naziv monitora", + pauseDashboardHome: "Pauzirano", + Name: "Naziv", Status: "Status", DateTime: "Vremenska oznaka", Message: "Izvještaj", "No important events": "Nema važnih događaja", + Pause: "Pauziraj", Resume: "Nastavi", Edit: "Uredi", Delete: "Obriši", @@ -65,12 +65,12 @@ export default { Ping: "Odziv", "Monitor Type": "Vrsta Monitora", Keyword: "Ključna riječ", - "Friendly Name": "Lijep naziv", + "Friendly Name": "Prilagođen naziv", URL: "URL", Hostname: "Domaćin", Port: "Port", "Heartbeat Interval": "Interval provjere", - Retries: "Ponovnih pokušaja", + Retries: "Broj ponovnih pokušaja", "Heartbeat Retry Interval": "Interval ponovnih pokušaja", Advanced: "Napredne postavke", "Upside Down Mode": "Obrnuti način", @@ -86,14 +86,14 @@ export default { Light: "Svijetli način", Dark: "Tamni način", Auto: "Automatski", - "Theme - Heartbeat Bar": "Tema - Statusna traka", + "Theme - Heartbeat Bar": "Tema za traku dostupnosti", Normal: "Normalno", Bottom: "Ispod", None: "Isključeno", Timezone: "Vremenska zona", - "Search Engine Visibility": "Vidljivost pretraživačima", + "Search Engine Visibility": "Vidljivost tražilicama", "Allow indexing": "Dopusti indeksiranje", - "Discourage search engines from indexing site": "Sprječavanje indeksiranja stranice", + "Discourage search engines from indexing site": "Sprječavanje indeksiranja", "Change Password": "Promjena lozinke", "Current Password": "Trenutna lozinka", "New Password": "Nova lozinka", @@ -103,7 +103,7 @@ export default { "Enable Auth": "Omogući autentikaciju", Logout: "Odjava", Leave: "Poništi", - "I understand, please disable": "Razumijem, onemogući", + "I understand, please disable": "Razumijem, svejedno onemogući", Confirm: "Potvrda", Yes: "Da", No: "Ne", @@ -112,10 +112,10 @@ export default { "Remember me": "Zapamti me", Login: "Prijava", "No Monitors, please": "Nema monitora, ", - "add one": "dodaj jednog", + "add one": "dodaj jedan", "Notification Type": "Tip obavijesti", Email: "E-pošta", - Test: "Test", + Test: "Testiraj", "Certificate Info": "Informacije o certifikatu", "Resolver Server": "DNS poslužitelj", "Resource Record Type": "Vrsta DNS zapisa", @@ -130,14 +130,14 @@ export default { notAvailableShort: "N/A", "Default enabled": "Omogući za nove monitore", "Apply on all existing monitors": "Primijeni na postojeće monitore", - Create: "Create", - "Clear Data": "Clear Data", - Events: "Events", + Create: "Kreiraj", + "Clear Data": "Obriši podatke", + Events: "Događaji", Heartbeats: "Provjere", "Auto Get": "Automatski dohvat", backupDescription: "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti koja će biti spremljena kao JSON datoteka.", backupDescription2: "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.", - backupDescription3: "Osjetljivi podaci poput tokena za obavijesti jesu uključeni u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.", + backupDescription3: "Osjetljivi podaci poput tokena za obavijesti uključeni su u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.", alertNoFile: "Datoteka za uvoz nije odabrana.", alertWrongFileType: "Datoteka za uvoz nije u JSON formatu.", "Clear all statistics": "Obriši sve statistike", @@ -152,7 +152,7 @@ export default { "2FA Settings": "Postavke 2FA", "Two Factor Authentication": "Dvofaktorska autentikacija", Active: "Aktivna", - Inactive: "Neaktivna", + Inactive: "Neaktivno", Token: "Token", "Show URI": "Pokaži URI", Tags: "Oznake", @@ -172,7 +172,7 @@ export default { "Search...": "Pretraga...", "Avg. Ping": "Prosječni odziv", "Avg. Response": "Prosječni odgovor", - "Entry Page": "Entry Page", + "Entry Page": "Početna stranica", statusPageNothing: "Ovdje nema ničega, dodajte grupu ili monitor.", "No Services": "Nema usluga", "All Systems Operational": "Svi sustavi su operativni", @@ -183,7 +183,7 @@ export default { "Edit Status Page": "Uredi Statusnu stranicu", "Go to Dashboard": "Na Kontrolnu ploču", "Status Page": "Statusna stranica", - defaultNotificationName: "Moja {notification} obavijest ({number})", + defaultNotificationName: "Moja {number}. {notification} obavijest", here: "ovdje", Required: "Potrebno", telegram: "Telegram", @@ -195,11 +195,11 @@ export default { "YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA", chatIDNotFound: "ID razgovora nije pronađen; prvo morate poslati poruku botu", webhook: "Webhook", - "Post URL": "Post URL", + "Post URL": "URL Post zahtjeva", "Content Type": "Tip sadržaja (Content Type)", webhookJsonDesc: "{0} je dobra opcija za moderne HTTP poslužitelje poput Express.js-a", webhookFormDataDesc: "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}", - smtp: "E-pošta (SMTP)", + smtp: "E-mail (SMTP)", secureOptionNone: "Bez sigurnosti / STARTTLS (25, 587)", secureOptionTLS: "TLS (465)", "Ignore TLS Error": "Ignoriraj greške TLS-a", @@ -215,7 +215,7 @@ export default { "Prefix Custom Message": "Prefiks prilagođene poruke", "Hello @everyone is...": "Pozdrav {'@'}everyone...", teams: "Microsoft Teams", - "Webhook URL": "URL Teams webhooka", + "Webhook URL": "URL webhooka", wayToGetTeamsURL: "Više informacija o Teams webhookovima možete pročitati {0}.", signal: "Signal", Number: "Broj", @@ -242,7 +242,7 @@ export default { promosms: "PromoSMS", clicksendsms: "ClickSend SMS", lunasea: "LunaSea", - apprise: "Apprise (Support 50+ Notification services)", + apprise: "Apprise (Podržava preko 50 usluga za obavijesti)", pushbullet: "Pushbullet", line: "LINE", mattermost: "Mattermost", From c094dc0c5bd36c691869fcdc907ab87d52bf8ea9 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 21:48:46 +0800 Subject: [PATCH 29/50] speed up redirect by using 302 redirect instead of vue redirect --- server/server.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/server/server.js b/server/server.js index 0af003d13..d1fd7ff29 100644 --- a/server/server.js +++ b/server/server.js @@ -186,6 +186,15 @@ exports.entryPage = "dashboard"; // Normal Router here // *************************** + // Entry Page + app.get("/", async (_request, response) => { + if (exports.entryPage === "statusPage") { + response.redirect("/status"); + } else { + response.redirect("/dashboard"); + } + }); + // Robots.txt app.get("/robots.txt", async (_request, response) => { let txt = "User-agent: *\nDisallow:"; From e496c3b3be4a2d93332766d687294b41da9f4549 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 2 Nov 2021 22:03:02 +0800 Subject: [PATCH 30/50] update healthcheck.js --- extra/healthcheck.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/healthcheck.js b/extra/healthcheck.js index 8044f654f..c6e8a349a 100644 --- a/extra/healthcheck.js +++ b/extra/healthcheck.js @@ -35,7 +35,7 @@ let options = { let request = client.request(options, (res) => { console.log(`Health Check OK [Res Code: ${res.statusCode}]`); - if (res.statusCode === 200) { + if (res.statusCode === 302) { process.exit(0); } else { process.exit(1); From e5d6410cafc1afbff3991f37a1ffb69ad45f51f4 Mon Sep 17 00:00:00 2001 From: Jasper Miller-Waugh <contact@jmw.nz> Date: Wed, 3 Nov 2021 11:46:53 +1300 Subject: [PATCH 31/50] Apply formatting suggestions from code review Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com> --- server/routers/api-router.js | 4 ++-- src/pages/StatusPage.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/routers/api-router.js b/server/routers/api-router.js index 30f6a828c..79e828378 100644 --- a/server/routers/api-router.js +++ b/server/routers/api-router.js @@ -149,7 +149,7 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, for (let groupBean of list) { let monitorGroup = await groupBean.toPublicJSON(); if (tagsVisible) { - monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map( async (monitor)=>{ + monitorGroup.monitorList = await Promise.all(monitorGroup.monitorList.map(async (monitor) => { // Includes tags as an array in response, allows for tags to be displayed on public status page const tags = await R.getAll( `SELECT monitor_tag.monitor_id, monitor_tag.value, tag.name, tag.color @@ -158,7 +158,7 @@ router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, ON monitor_tag.tag_id = tag.id WHERE monitor_tag.monitor_id = ?`, [monitor.id] ); - return {...monitor,tags: tags} + return {...monitor, tags: tags} })); } diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 70367cc9f..ce0f94b55 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -493,10 +493,10 @@ export default { // On load, the status page will not include tags if it's not enabled for security reasons // Which means if we enable tags, it won't show in the UI until saved // So we have this to enhance UX and load in the tags from the authenticated source instantly - this.$root.publicGroupList = this.$root.publicGroupList.map((group)=>{ + this.$root.publicGroupList = this.$root.publicGroupList.map((group) => { return { ...group, - monitorList: group.monitorList.map((monitor)=> { + monitorList: group.monitorList.map((monitor) => { // We only include the tags if visible so we can reuse the logic to hide the tags on disable return { ...monitor, From dee131c25d64d36ad0b7de7cbb46bb61a86c710f Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Wed, 3 Nov 2021 13:02:44 +0800 Subject: [PATCH 32/50] fix table hover color not working after updated bootstrap to 5.1.3 --- src/assets/app.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/app.scss b/src/assets/app.scss index e1a5d052d..89639fd95 100644 --- a/src/assets/app.scss +++ b/src/assets/app.scss @@ -189,7 +189,7 @@ textarea.form-control { opacity: 1; } - .table-hover > tbody > tr:hover { + .table-hover > tbody > tr:hover > * { --bs-table-accent-bg: #070a10; color: $dark-font-color; } From 1ba203470183ee2f741898fa4971b408432d2f2d Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Wed, 3 Nov 2021 13:03:36 +0800 Subject: [PATCH 33/50] freeze bootstrap to 5.1.3 to prevent breaking changes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64be83ee1..d34531b36 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "args-parser": "~1.3.0", "axios": "~0.21.4", "bcryptjs": "~2.4.3", - "bootstrap": "~5.1.3", + "bootstrap": "5.1.3", "bree": "~6.3.1", "chardet": "^1.3.0", "chart.js": "~3.6.0", From ee2c54cfd1f619541aba35f2e3c2fae60d3fb61f Mon Sep 17 00:00:00 2001 From: MrEddX <66828538+MrEddX@users.noreply.github.com> Date: Wed, 3 Nov 2021 11:49:22 +0200 Subject: [PATCH 34/50] Update bg-BG.js - Added New Fields - Fixed Existing Fields --- src/languages/bg-BG.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js index 0d5af783a..f1d9b0784 100644 --- a/src/languages/bg-BG.js +++ b/src/languages/bg-BG.js @@ -77,7 +77,7 @@ export default { "Accepted Status Codes": "Допустими статус кодове", Save: "Запази", Notifications: "Известявания", - "Not available, please setup.": "Не е налично. Моля, настройте.", + "Not available, please setup.": "Не са налични. Моля, настройте.", "Setup Notification": "Настройки за известявания", Light: "Светла", Dark: "Тъмна", @@ -141,7 +141,7 @@ export default { Overwrite: "Презапиши", Options: "Опции", "Keep both": "Запази двете", - "Verify Token": "Проверка на токен код", + "Verify Token": "Провери токен код", "Setup 2FA": "Настройка 2FA", "Enable 2FA": "Включи 2FA", "Disable 2FA": "Изключи 2FA", @@ -298,8 +298,13 @@ export default { HeadersInvalidFormat: "Заявените хедъри не са валидни JSON: ", BodyInvalidFormat: "Заявеното съобщение не е валиден JSON: ", "Monitor History": "История на мониторите", - clearDataOlderThan: "Ще се съхранява за {0} дни.", + clearDataOlderThan: "Ще се съхранява {0} дни.", records: "записа", "One record": "Един запис", steamApiKeyDescription: "За да мониторирате Steam Gameserver се нуждаете от Steam Web-API ключ. Може да регистрирате Вашия API ключ тук: ", + clicksendsms: "ClickSend SMS", + apiCredentials: "API удостоверяване", + PasswordsDoNotMatch: "Паролите не съвпадат.", + "Current User": "Текущ потребител", + recent: "Скорошни", }; From 57389fab2c3588b671cd54d63de95c14d7ec663f Mon Sep 17 00:00:00 2001 From: Nelson Chan <chakflying@hotmail.com> Date: Wed, 3 Nov 2021 19:13:11 +0800 Subject: [PATCH 35/50] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fa0aa883b..c286db021 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -24,3 +24,5 @@ Please delete options that are not relevant. - [ ] My code needed automated testing. I have added them (this is optional task) ## Screenshots (if any) + +Please do not use any external image service. Instead, just paste in the image here and it will be uploaded automatically. From bc5f61b3ec4d29ed7ac99f48eb655be7fd364976 Mon Sep 17 00:00:00 2001 From: Nelson Chan <chakflying@hotmail.com> Date: Thu, 4 Nov 2021 10:21:57 +0800 Subject: [PATCH 36/50] Chore: Add drag and drop Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com> --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c286db021..3be229315 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -25,4 +25,4 @@ Please delete options that are not relevant. ## Screenshots (if any) -Please do not use any external image service. Instead, just paste in the image here and it will be uploaded automatically. +Please do not use any external image service. Instead, just paste in or drag and drop the image here and it will be uploaded automatically. From 210566c7af9561e2b63571c0649f0352c9a054e1 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Fri, 5 Nov 2021 11:34:50 +0800 Subject: [PATCH 37/50] remove prefix for issue title, so users need to input the title --- .github/ISSUE_TEMPLATE/ask-for-help.yaml | 2 +- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/ask-for-help.yaml b/.github/ISSUE_TEMPLATE/ask-for-help.yaml index 76a78e5c3..3442e8b73 100644 --- a/.github/ISSUE_TEMPLATE/ask-for-help.yaml +++ b/.github/ISSUE_TEMPLATE/ask-for-help.yaml @@ -1,6 +1,6 @@ name: "❓ Ask for help" description: "Submit any question related to Uptime Kuma" -title: "[Help] " +#title: "[Help] " labels: [help] body: - type: checkboxes diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 055c3a626..2dca1556a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,6 +1,6 @@ name: "🐛 Bug Report" description: "Submit a bug report to help us improve" -title: "[Bug] " +#title: "[Bug] " labels: [bug] body: - type: checkboxes diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 6464e276a..f0a92ede1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,6 +1,6 @@ name: 🚀 Feature Request description: "Submit a proposal for a new feature" -title: "[Feature] " +#title: "[Feature] " labels: [enhancement] body: - type: checkboxes From 8f44b9f6181dfd80015012cceff227fb1e521c18 Mon Sep 17 00:00:00 2001 From: Andreas Brett <github@abrett.de> Date: Fri, 5 Nov 2021 09:54:10 +0100 Subject: [PATCH 38/50] 24h tooltip on status page --- src/components/Uptime.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue index a4bf22f68..2717672c4 100644 --- a/src/components/Uptime.vue +++ b/src/components/Uptime.vue @@ -1,5 +1,5 @@ <template> - <span :class="className">{{ uptime }}</span> + <span :class="className" :title="24 + $t('-hour')">{{ uptime }}</span> </template> <script> From 222540898b3c8af5d7a25fb222b6cff54faf08c6 Mon Sep 17 00:00:00 2001 From: Zegert Boele <48018787+ZegertBoele@users.noreply.github.com> Date: Fri, 5 Nov 2021 13:57:55 +0100 Subject: [PATCH 39/50] Some translations were not translated Some translations were not translated yet. I have added them and can be contacted if you want more English-Dutch translations. --- src/languages/nl-NL.js | 72 +++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index 818893af6..f37d8405d 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -116,7 +116,7 @@ export default { "Repeat Password": "Herhaal wachtwoord", Export: "Exporteren", Import: "Importeren", - respTime: "resp. tijd (ms)", + respTime: "reactietijd (ms)", notAvailableShort: "N.v.t.", "Default enabled": "Default enabled", "Apply on all existing monitors": "Pas toe op alle bestaande monitors", @@ -138,48 +138,48 @@ export default { "Two Factor Authentication": "Two Factor Authenticatie", Active: "Actief", Inactive: "Inactief", - "Also apply to existing monitors": "Also apply to existing monitors", + "Also apply to existing monitors": "Voeg ook toe aan bestaande monitors", Token: "Token", "Show URI": "Toon URI", "Clear all statistics": "Wis alle statistieken", - retryCheckEverySecond: "Retry every {0} seconds.", - importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.", - confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.", + retryCheckEverySecond: "Probeer elke {0} seconds.", + importHandleDescription: "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.", + confirmImportMsg: "Weet je zeker dat je dit bestand wilt importeren?", "Heartbeat Retry Interval": "Heartbeat Retry Interval", - "Import Backup": "Import Backup", - "Export Backup": "Export Backup", - "Skip existing": "Skip existing", - Overwrite: "Overwrite", - Options: "Options", - "Keep both": "Keep both", - Tags: "Tags", - "Add New below or Select...": "Add New below or Select...", - "Tag with this name already exist.": "Tag with this name already exist.", - "Tag with this value already exist.": "Tag with this value already exist.", - color: "color", - "value (optional)": "value (optional)", - Gray: "Gray", - Red: "Red", - Orange: "Orange", - Green: "Green", - Blue: "Blue", + "Import Backup": "Importeer Backup", + "Export Backup": "Exporteer Backup", + "Skip existing": "Sla bestaande over", + Overwrite: "Overschrijf", + Options: "Opties", + "Keep both": "Bewaar beide", + Tags: "Labels", + "Add New below or Select...": "Voeg nieuwe toe of selecteer...", + "Tag with this name already exist.": "Label met deze naam bestaat al", + "Tag with this value already exist.": "Label met deze waarde bestaat al", + color: "Kleur", + "value (optional)": "waarde (optioneel)", + Gray: "Grijs", + Red: "Rood", + Orange: "Oranje", + Green: "Groen", + Blue: "Blauw", Indigo: "Indigo", - Purple: "Purple", - Pink: "Pink", - "Search...": "Search...", - "Avg. Ping": "Avg. Ping", - "Avg. Response": "Avg. Response", + Purple: "Paars", + Pink: "Roze", + "Search...": "Zoeken...", + "Avg. Ping": "Gemiddelde Ping", + "Avg. Response": "Gemiddelde Response", "Entry Page": "Entry Page", - statusPageNothing: "Nothing here, please add a group or a monitor.", + statusPageNothing: "Nothing here, please add a group or a monitor. Niets hier, voeg een groep of monitor toe.", "No Services": "No Services", - "All Systems Operational": "All Systems Operational", - "Partially Degraded Service": "Partially Degraded Service", - "Degraded Service": "Degraded Service", - "Add Group": "Add Group", - "Add a monitor": "Add a monitor", - "Edit Status Page": "Edit Status Page", - "Go to Dashboard": "Go to Dashboard", - "Status Page": "Status Page", + "All Systems Operational": "Alle systemen operationeel", + "Partially Degraded Service": "Gedeeltelijk verminderde prestaties", + "Degraded Service": "Verminderde prestaties", + "Add Group": "Voeg groep toe", + "Add a monitor": "Voeg monitor toe", + "Edit Status Page": "Wijzig status pagina", + "Go to Dashboard": "Ga naar Dashboard", + "Status Page": "Status Pagina", telegram: "Telegram", webhook: "Webhook", smtp: "Email (SMTP)", From bc69a331ee3f7be8ec637d47c5902fa5d496e458 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Sun, 7 Nov 2021 13:50:22 +0800 Subject: [PATCH 40/50] eslint --- src/languages/fr-FR.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js index 176a6150f..92083a387 100644 --- a/src/languages/fr-FR.js +++ b/src/languages/fr-FR.js @@ -280,17 +280,17 @@ export default { promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)", promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base: InfoSMS, SMS Info, MaxSMS, INFO, SMS", "Primary Base URL": "Primary Base URL", - emailCustomSubject: "Sujet personalisé", - clicksendsms: "ClickSend SMS", - checkPrice: "Vérification {0} tarifs:", - apiCredentials: "Crédentials de l'API", - octopushLegacyHint: "Vous utilisez l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?", + emailCustomSubject: "Sujet personalisé", + clicksendsms: "ClickSend SMS", + checkPrice: "Vérification {0} tarifs:", + apiCredentials: "Crédentials de l'API", + octopushLegacyHint: "Vous utilisez l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?", "Feishu WebHookUrl": "Feishu WebHookURL", matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultatif)", "Internal Room Id": "ID de la salle interne", matrixDesc1: "Vous pouvez trouvez l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est sensé ressembler à: !QMdRCpUIfLwsfjxye6:home.server.", - matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Au lieu de cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}", - Method: "Méthode", + matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Au lieu de cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}", + Method: "Méthode", Body: "Le corps", Headers: "En-têtes", PushUrl: "Push URL", @@ -299,9 +299,9 @@ export default { "Monitor History": "Historique de la sonde", clearDataOlderThan: "Garder l'historique des données de la sonde durant {0} jours.", PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.", - records: "Enregistrements", + records: "Enregistrements", "One record": "Un enregistrement", steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici: ", - "Current User": "Utilisateur actuel", + "Current User": "Utilisateur actuel", recent: "Récent", }; From c92153c97ed151c9759ebe63ef22d2821e5d115e Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Sun, 7 Nov 2021 21:00:47 +0800 Subject: [PATCH 41/50] add more debug msg --- server/model/monitor.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/server/model/monitor.js b/server/model/monitor.js index fc3292317..c6e09f535 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -141,6 +141,7 @@ class Monitor extends BeanModel { // Do not do any queries/high loading things before the "bean.ping" let startTime = dayjs().valueOf(); + debug(`[${this.name}] Prepare Options for axios`); const options = { url: this.url, method: (this.method || "get").toLowerCase(), @@ -160,6 +161,8 @@ class Monitor extends BeanModel { return checkStatusCode(status, this.getAcceptedStatuscodes()); }, }; + + debug(`[${this.name}] Axios Request`); let res = await axios.request(options); bean.msg = `${res.status} - ${res.statusText}`; bean.ping = dayjs().valueOf() - startTime; @@ -167,12 +170,13 @@ class Monitor extends BeanModel { // Check certificate if https is used let certInfoStartTime = dayjs().valueOf(); if (this.getUrl()?.protocol === "https:") { + debug(`[${this.name}] Check cert`); try { let tlsInfoObject = checkCertificate(res); tlsInfo = await this.updateTlsInfo(tlsInfoObject); if (!this.getIgnoreTls()) { - debug("call sendCertNotification"); + debug(`[${this.name}] call sendCertNotification`); await this.sendCertNotification(tlsInfoObject); } @@ -351,15 +355,19 @@ class Monitor extends BeanModel { let beatInterval = this.interval; + debug(`[${this.name}] Check isImportant`); let isImportant = Monitor.isImportantBeat(isFirstBeat, previousBeat?.status, bean.status); // Mark as important if status changed, ignore pending pings, // Don't notify if disrupted changes to up if (isImportant) { bean.important = true; + + debug(`[${this.name}] sendNotification`); await Monitor.sendNotification(isFirstBeat, this, bean); // Clear Status Page Cache + debug(`[${this.name}] Check isImportant`); apicache.clear(); } else { @@ -377,10 +385,14 @@ class Monitor extends BeanModel { console.warn(`Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`); } + debug(`[${this.name}] Send to socket`); io.to(this.user_id).emit("heartbeat", bean.toJSON()); Monitor.sendStats(io, this.id, this.user_id); + debug(`[${this.name}] Store`); await R.store(bean); + + debug(`[${this.name}] prometheus.update`); prometheus.update(bean, tlsInfo); previousBeat = bean; @@ -394,7 +406,10 @@ class Monitor extends BeanModel { } } + debug(`[${this.name}] SetTimeout for next check.`); this.heartbeatInterval = setTimeout(safeBeat, beatInterval * 1000); + } else { + console.log(`[${this.name}] isStop = true, no next check.`); } }; From 41a6d1b701e40c8aa2d3eae97dd56f7480c1109d Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:39:17 +0800 Subject: [PATCH 42/50] Fix parseCertificateInfo possibly in dead loop --- server/model/monitor.js | 2 +- server/util-server.js | 17 +++++- test/backend.spec.js | 122 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 2 deletions(-) diff --git a/server/model/monitor.js b/server/model/monitor.js index c6e09f535..980e0ac69 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -367,7 +367,7 @@ class Monitor extends BeanModel { await Monitor.sendNotification(isFirstBeat, this, bean); // Clear Status Page Cache - debug(`[${this.name}] Check isImportant`); + debug(`[${this.name}] apicache clear`); apicache.clear(); } else { diff --git a/server/util-server.js b/server/util-server.js index 5d65f46d3..bfb4a9cb7 100644 --- a/server/util-server.js +++ b/server/util-server.js @@ -201,8 +201,13 @@ const getDaysRemaining = (validFrom, validTo) => { // param: info - the chain obtained from getPeerCertificate() const parseCertificateInfo = function (info) { let link = info; + let i = 0; + + const existingList = {}; while (link) { + debug(`[${i}] ${link.fingerprint}`); + if (!link.valid_from || !link.valid_to) { break; } @@ -210,15 +215,24 @@ const parseCertificateInfo = function (info) { link.validFor = link.subjectaltname?.replace(/DNS:|IP Address:/g, "").split(", "); link.daysRemaining = getDaysRemaining(new Date(), link.validTo); + existingList[link.fingerprint] = true; + // Move up the chain until loop is encountered if (link.issuerCertificate == null) { break; - } else if (link.fingerprint == link.issuerCertificate.fingerprint) { + } else if (link.issuerCertificate.fingerprint in existingList) { + debug(`[Last] ${link.issuerCertificate.fingerprint}`); link.issuerCertificate = null; break; } else { link = link.issuerCertificate; } + + // Should be no use, but just in case. + if (i > 500) { + throw new Error("Dead loop occurred in parseCertificateInfo"); + } + i++; } return info; @@ -228,6 +242,7 @@ exports.checkCertificate = function (res) { const info = res.request.res.socket.getPeerCertificate(true); const valid = res.request.res.socket.authorized || false; + console.log("Parsing Certificate Info"); const parsedInfo = parseCertificateInfo(info); return { diff --git a/test/backend.spec.js b/test/backend.spec.js index bd73d2022..bbfc6897b 100644 --- a/test/backend.spec.js +++ b/test/backend.spec.js @@ -1,4 +1,125 @@ const { genSecret, sleep } = require("../src/util"); +const utilServerRewire = require("../server/util-server"); + +describe("Test parseCertificateInfo", () => { + it("should handle undefined", async () => { + const parseCertificateInfo = utilServerRewire.__get__("parseCertificateInfo"); + const info = parseCertificateInfo(undefined); + expect(info).toEqual(undefined); + }, 5000); + + it("should handle normal cert chain", async () => { + const parseCertificateInfo = utilServerRewire.__get__("parseCertificateInfo"); + + const chain1 = { + fingerprint: "CF:2C:F3:6A:FE:6B:10:EC:44:77:C8:95:BB:96:2E:06:1F:0E:15:DA", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain2 = { + fingerprint: "A0:31:C4:67:82:E6:E6:C6:62:C2:C8:7C:76:DA:9A:A6:2C:CA:BD:8E", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain3 = { + fingerprint: "5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + chain1.issuerCertificate = chain2; + chain2.issuerCertificate = chain3; + chain3.issuerCertificate = chain3; + + const info = parseCertificateInfo(chain1); + expect(chain1).toEqual(info); + }, 5000); + + it("should handle cert chain with strange circle", async () => { + const parseCertificateInfo = utilServerRewire.__get__("parseCertificateInfo"); + + const chain1 = { + fingerprint: "CF:2C:F3:6A:FE:6B:10:EC:44:77:C8:95:BB:96:2E:06:1F:0E:15:DA", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain2 = { + fingerprint: "A0:31:C4:67:82:E6:E6:C6:62:C2:C8:7C:76:DA:9A:A6:2C:CA:BD:8E", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain3 = { + fingerprint: "5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain4 = { + fingerprint: "haha", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + chain1.issuerCertificate = chain2; + chain2.issuerCertificate = chain3; + chain3.issuerCertificate = chain4; + chain4.issuerCertificate = chain2; + + const info = parseCertificateInfo(chain1); + expect(chain1).toEqual(info); + }, 5000); + + it("should handle cert chain with last undefined (should be happen in real, but just in case)", async () => { + const parseCertificateInfo = utilServerRewire.__get__("parseCertificateInfo"); + + const chain1 = { + fingerprint: "CF:2C:F3:6A:FE:6B:10:EC:44:77:C8:95:BB:96:2E:06:1F:0E:15:DA", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain2 = { + fingerprint: "A0:31:C4:67:82:E6:E6:C6:62:C2:C8:7C:76:DA:9A:A6:2C:CA:BD:8E", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain3 = { + fingerprint: "5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + const chain4 = { + fingerprint: "haha", + valid_from: "Oct 22 12:00:00 2013 GMT", + valid_to: "Oct 22 12:00:00 2028 GMT", + subjectaltname: "DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net", + }; + + chain1.issuerCertificate = chain2; + chain2.issuerCertificate = chain3; + chain3.issuerCertificate = chain4; + chain4.issuerCertificate = undefined; + + const info = parseCertificateInfo(chain1); + expect(chain1).toEqual(info); + }, 5000); +}); describe("Test genSecret", () => { @@ -42,3 +163,4 @@ describe("Test reset-password", () => { await require("../extra/reset-password").main(); }, 120000); }); + From 0275d7a42b30760e906f59e59f8fb52feb06d416 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:51:32 +0800 Subject: [PATCH 43/50] minor --- server/util-server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/util-server.js b/server/util-server.js index bfb4a9cb7..68f59f67f 100644 --- a/server/util-server.js +++ b/server/util-server.js @@ -242,7 +242,7 @@ exports.checkCertificate = function (res) { const info = res.request.res.socket.getPeerCertificate(true); const valid = res.request.res.socket.authorized || false; - console.log("Parsing Certificate Info"); + debug("Parsing Certificate Info"); const parsedInfo = parseCertificateInfo(info); return { From 733d0af75f6cec38b540f44143899358df7307c7 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Mon, 8 Nov 2021 18:03:00 +0800 Subject: [PATCH 44/50] update to 1.10.1 --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d34531b36..038d52ebd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.10.0", + "version": "1.10.1", "license": "MIT", "repository": { "type": "git", @@ -30,13 +30,13 @@ "build-docker": "npm run build-docker-debian && npm run build-docker-alpine", "build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push", "build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push", - "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.10.0-alpine --target release . --push", - "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.10.0 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.10.0-debian --target release . --push", + "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.10.1-alpine --target release . --push", + "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.10.1 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.10.1-debian --target release . --push", "build-docker-nightly": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push", "build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push", "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain", - "setup": "git checkout 1.10.0 && npm ci --production && npm run download-dist", + "setup": "git checkout 1.10.1 && npm ci --production && npm run download-dist", "download-dist": "node extra/download-dist.js", "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js", From 62222c03360d0bdd2faa7150963b85ed4d055c7f Mon Sep 17 00:00:00 2001 From: Zegert Boele <48018787+ZegertBoele@users.noreply.github.com> Date: Tue, 9 Nov 2021 09:49:42 +0100 Subject: [PATCH 45/50] Update src/languages/nl-NL.js @koen20 added this correction. Co-authored-by: Koen Habets <6172623+koen20@users.noreply.github.com> --- src/languages/nl-NL.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index f37d8405d..108c8caee 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -142,7 +142,7 @@ export default { Token: "Token", "Show URI": "Toon URI", "Clear all statistics": "Wis alle statistieken", - retryCheckEverySecond: "Probeer elke {0} seconds.", + retryCheckEverySecond: "Probeer elke {0} seconden.", importHandleDescription: "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.", confirmImportMsg: "Weet je zeker dat je dit bestand wilt importeren?", "Heartbeat Retry Interval": "Heartbeat Retry Interval", From dff1056bb1b8a871fa2998ab65c37ee28a9d1aba Mon Sep 17 00:00:00 2001 From: Zegert Boele <48018787+ZegertBoele@users.noreply.github.com> Date: Tue, 9 Nov 2021 09:52:09 +0100 Subject: [PATCH 46/50] Update nl-NL.js @deefdragon noticed a flaw, fixed in here --- src/languages/nl-NL.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index 108c8caee..ff18832d7 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -170,7 +170,7 @@ export default { "Avg. Ping": "Gemiddelde Ping", "Avg. Response": "Gemiddelde Response", "Entry Page": "Entry Page", - statusPageNothing: "Nothing here, please add a group or a monitor. Niets hier, voeg een groep of monitor toe.", + statusPageNothing: "Niets hier, voeg een groep of monitor toe.", "No Services": "No Services", "All Systems Operational": "Alle systemen operationeel", "Partially Degraded Service": "Gedeeltelijk verminderde prestaties", From 45f7c647a69aefd554e9a95843ec7992e4f6239a Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 9 Nov 2021 21:31:04 +0800 Subject: [PATCH 47/50] Update feature_request.yaml --- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index f0a92ede1..b26841c42 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,7 +1,7 @@ name: 🚀 Feature Request description: "Submit a proposal for a new feature" #title: "[Feature] " -labels: [enhancement] +labels: [feature-request] body: - type: checkboxes id: no-duplicate-issues From 95bae8289d3a391065e66673cd969c63b7101ef2 Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 9 Nov 2021 22:37:05 +0800 Subject: [PATCH 48/50] Fix setting page when disabled auth --- src/mixins/socket.js | 10 ++++++++++ src/pages/Settings.vue | 11 +++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 170a07a73..affac4f82 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -1,5 +1,6 @@ import { io } from "socket.io-client"; import { useToast } from "vue-toastification"; +import jwt_decode from "jwt-decode"; const toast = useToast(); let socket; @@ -217,6 +218,15 @@ export default { return (this.remember) ? localStorage : sessionStorage; }, + getJWTPayload() { + const jwtToken = this.$root.storage().token; + + if (jwtToken && jwtToken !== "autoLogin") { + return jwt_decode(jwtToken); + } + return undefined; + }, + getSocket() { return socket; }, diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 9312b0c24..9d501407d 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -306,7 +306,7 @@ <p>这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access</p> <p>请谨慎使用!</p> </template> - + <template v-else-if="$i18n.locale === 'zh-TW' "> <p>你是否要<strong>取消登入驗證</strong>?</p> <p>此功能是設計給已有<strong>第三方認證</strong>的使用者,例如 Cloudflare Access。</p> @@ -515,9 +515,11 @@ export default { }, loadUsername() { - const jwtToken = this.$root.storage().token; - const jwtPayload = jwt_decode(jwtToken); - this.username = jwtPayload.username; + const jwtPayload = this.$root.getJWTPayload(); + + if (jwtPayload) { + this.username = jwtPayload.username; + } }, loadSettings() { @@ -568,6 +570,7 @@ export default { this.settings.disableAuth = false; this.saveSettings(); this.$root.storage().removeItem("token"); + location.reload(); }, downloadBackup() { From bf64095ceaca78955b67ecc495b18d0500ab3ecc Mon Sep 17 00:00:00 2001 From: Louis Lam <louislam@users.noreply.github.com> Date: Tue, 9 Nov 2021 22:42:13 +0800 Subject: [PATCH 49/50] update to 1.10.2 --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 038d52ebd..c7ec3d8ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.10.1", + "version": "1.10.2", "license": "MIT", "repository": { "type": "git", @@ -30,13 +30,13 @@ "build-docker": "npm run build-docker-debian && npm run build-docker-alpine", "build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push", "build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push", - "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.10.1-alpine --target release . --push", - "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.10.1 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.10.1-debian --target release . --push", + "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.10.2-alpine --target release . --push", + "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.10.2 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.10.2-debian --target release . --push", "build-docker-nightly": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push", "build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push", "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain", - "setup": "git checkout 1.10.1 && npm ci --production && npm run download-dist", + "setup": "git checkout 1.10.2 && npm ci --production && npm run download-dist", "download-dist": "node extra/download-dist.js", "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js", From daef238a70b8b5bcd3eb7c87f0f657d653894464 Mon Sep 17 00:00:00 2001 From: Ioma Taani <iomataani@users.noreply.github.com> Date: Thu, 11 Nov 2021 18:28:22 +0100 Subject: [PATCH 50/50] Updated Italian Language (#911) Co-authored-by: Paride Barison <paride.barison@lantechlongwave.it> --- src/languages/it-IT.js | 136 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 13 deletions(-) diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js index 5ddc414f7..5257a217f 100644 --- a/src/languages/it-IT.js +++ b/src/languages/it-IT.js @@ -33,6 +33,7 @@ export default { Appearance: "Aspetto", Theme: "Tema", General: "Generali", + "Primary Base URL": "URL base primario", Version: "Versione", "Check Update On GitHub": "Controlla aggiornamenti su GitHub", List: "Lista", @@ -64,7 +65,7 @@ export default { Ping: "Ping", "Monitor Type": "Tipo di Monitoraggio", Keyword: "Parola chiave", - "Friendly Name": "Nome Amichevole", + "Friendly Name": "Nomignolo", URL: "URL", Hostname: "Nome Host", Port: "Porta", @@ -75,6 +76,9 @@ export default { "Upside Down Mode": "Modalità capovolta", "Max. Redirects": "Reindirizzamenti massimi", "Accepted Status Codes": "Codici di stato accettati", + "Push URL": "Push URL", + needPushEvery: "Notificare questo URL ogni {0} secondi.", + pushOptionalParams: "Parametri aggiuntivi: {0}", Save: "Salva", Notifications: "Notifiche", "Not available, please setup.": "Non disponibili, da impostare.", @@ -166,8 +170,8 @@ export default { Purple: "Viola", Pink: "Rosa", "Search...": "Cerca...", - "Avg. Ping": "Ping medio", - "Avg. Response": "Risposta media", + "Avg. Ping": "Tempo di risposta al ping medio", + "Avg. Response": "Tempo di risposta medio", "Entry Page": "Entry Page", statusPageNothing: "Non c'è nulla qui, aggiungere un gruppo oppure un monitoraggio.", "No Services": "Nessun Servizio", @@ -178,23 +182,129 @@ export default { "Add a monitor": "Aggiungi un monitoraggio", "Edit Status Page": "Modifica pagina di stato", "Go to Dashboard": "Vai al Cruscotto", - "Status Page": "Status Page", - telegram: "Telegram", - webhook: "Webhook", - smtp: "Email (SMTP)", - discord: "Discord", - teams: "Microsoft Teams", - signal: "Signal", - gotify: "Gotify", - slack: "Slack", + "Status Page": "Pagina di stato", + defaultNotificationName: "Allarme {notification} ({number})", + here: "qui", + "Required": "Richiesto", + "telegram": "Telegram", + "Bot Token": "Token del Bot", + "You can get a token from": "Puoi ricevere un token da", + "Chat ID": "ID Chat", + supportTelegramChatID: "Supporta Chat dirette / di Gruppo / ID Canale", + wayToGetTelegramChatID: "Puoi ricereve l'ID chat mandando un messaggio al bot andando in questo url per visualizzare il chat_id:", + "YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT", + chatIDNotFound: "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot", + "webhook": "Webhook", + "Post URL": "Post URL", + "Content Type": "Content Type", + webhookJsonDesc: "{0} va bene per qualsiasi server http moderno ad esempio express.js", + webhookFormDataDesc: "{multipart} va bene per PHP, c'è solo bisogno di analizzare il json con {decodeFunction}", + "smtp": "E-mail (SMTP)", + secureOptionNone: "Nessuno / STARTTLS (25, 587)", + secureOptionTLS: "TLS (465)", + "Ignore TLS Error": "Ignora gli errori TLS", + "From Email": "Mittente", + emailCustomSubject: "Oggetto personalizzato", + "To Email": "Destinatario", + smtpCC: "CC", + smtpBCC: "CCn", + "discord": "Discord", + "Discord Webhook URL": "URL Webhook di Discord", + wayToGetDiscordURL: "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook", + "Bot Display Name": "Nome del Bot", + "Prefix Custom Message": "Prefisso per il messaggio personalizzato", + "Hello @everyone is...": "Ciao a {'@'}everyone ...", + "teams": "Microsoft Teams", + "Webhook URL": "URL Webhook", + wayToGetTeamsURL: "È possibile imparare a creare un URL Webhook {0}.", + "signal": "Signal", + "Number": "Numero", + "Recipients": "Destinatari", + needSignalAPI: "È necessario avere un client Signal con le API REST.", + wayToCheckSignalURL: "Controllare questo url per capire come impostarne uno:", + signalImportant: "IMPORTANTE: Non è possibile mischiare gruppi e numeri all'interno dei destinatari!", + "gotify": "Gotify", + "Application Token": "Token Applicazione", + "Server URL": "URL Server", + "Priority": "Priorità", + "slack": "Slack", + "Icon Emoji": "Icona Emoji", + "Channel Name": "Nome Canale", + "Uptime Kuma URL": "Indirizzo Uptime Kuma", + aboutWebhooks: "Maggiori informazioni riguardo ai webhooks su: {0}", + aboutChannelName: "Inserire il nome del canale nel campo \"Nome Canale\" {0} se si vuole bypassare il canale webhook. Ad esempio: #altro-canale", + aboutKumaURL: "Se si lascia bianco il campo Indirizzo Uptime Kuma, la pagina GitHub sarà il valore predefinito.", + emojiCheatSheet: "Lista Emoji: {0}", "rocket.chat": "Rocket.chat", pushover: "Pushover", pushy: "Pushy", octopush: "Octopush", promosms: "PromoSMS", + clicksendsms: "ClickSend SMS", lunasea: "LunaSea", - apprise: "Apprise (Support 50+ Notification services)", + apprise: "Apprise (Supporta più di 50 servizi di notifica)", pushbullet: "Pushbullet", line: "Line Messenger", mattermost: "Mattermost", + "User Key": "Chiave Utente", + "Device": "Dispositivo", + "Message Title": "Titolo Messaggio", + "Notification Sound": "Suono di Notifica", + "More info on:": "Maggiori informazioni su: {0}", + pushoverDesc1: "Priorità di Emergenza (2) ha 30 secondi di timeout tra un tentativo e l'altro e scadrà dopo un'ora.", + pushoverDesc2: "Se si vuole inviare la notifica a dispositivi differenti, riempire il campo Dispositivi.", + "SMS Type": "Tipo di SMS", + octopushTypePremium: "Premium (Veloce - raccomandato per allertare)", + octopushTypeLowCost: "A Basso Costo (Lento - talvolta bloccato dall'operatore)", + checkPrice: "Controlla {0} prezzi:", + apiCredentials: "Credenziali API", + octopushLegacyHint: "Si vuole utilizzare la vecchia versione (2011-2020) oppure la nuova versione di Octopush?", + "Check octopush prices": "Controlla i prezzi di Octopush {0}.", + octopushPhoneNumber: "Numero di telefono (formato internazionale (p.e.): +33612345678) ", + octopushSMSSender: "Nome del mittente: 3-11 caratteri alfanumerici e spazi (a-zA-Z0-9)", + "LunaSea Device ID": "ID dispositivo LunaSea", + "Apprise URL": "URL Apprise", + "Example:": "Esempio: {0}", + "Read more:": "Maggiori informazioni: {0}", + "Status:": "Stato: {0}", + "Read more": "Maggiori informazioni", + appriseInstalled: "Apprise è installato.", + appriseNotInstalled: "Apprise non è installato. {0}", + "Access Token": "Token di accesso", + "Channel access token": "Token di accesso al canale", + "Line Developers Console": "Console sviluppatori Line", + lineDevConsoleTo: "Console sviluppatori Line - {0}", + "Basic Settings": "Impostazioni Base", + "User ID": "ID Utente", + "Messaging API": "API di Messaggistica", + wayToGetLineChannelToken: "Prima accedi a {0}, crea un provider e un canale (API di Messaggistica), dopodiché puoi avere il token di accesso e l'id utente dal menù sopra.", + "Icon URL": "URL Icona", + aboutIconURL: "È possibile impostare un collegameno a una immagine in \"URL Icona\" per modificare l'immagine di profilo. Non verrà utilizzata se è impostata l'Icona Emoji.", + aboutMattermostChannelName: "È possibile modificare il canale predefinito che dove il webhook manda messaggi immettendo il nome del canale nel campo \"Nome Canale\". Questo va abilitato nelle impostazioni webhook di Mattermost webhook. P.E.: #altro-canale", + "matrix": "Matrix", + promosmsTypeEco: "SMS ECO - economico, ma lento e spesso sovraccarico. Limitato solamente a destinatari Polacchi.", + promosmsTypeFlash: "SMS FLASH - Il messaggio sarà automaticamente mostrato sul dispositivo dei destinatari. Limitato solo a destinatari Polacchi.", + promosmsTypeFull: "SMS FULL - Premium, È possibile utilizzare il proprio come come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.", + promosmsTypeSpeed: "SMS SPEED - Maggior priorità. Rapido, affidabile, ma costoso (costa il doppio di SMS FULL).", + promosmsPhoneNumber: "Numero di Telefono (per destinatari Polacchi si può omettere il codice area)", + promosmsSMSSender: "Mittente SMS : Nome preregistrato oppure uno dei seguenti: InfoSMS, SMS Info, MaxSMS, INFO, SMS", + "Feishu WebHookUrl": "URL WebHook di Feishu", + matrixHomeserverURL: "URL Server (con http(s):// e opzionalmente la porta)", + "Internal Room Id": "ID Stanza Interna", + matrixDesc1: "È possibile recuperare l'ID della stanza all'interno delle impostazioni avanzate della stanza nel client Matrix. Dovrebbe essere simile a !QMdRCpUIfLwsfjxye6:server.di.casa.", + matrixDesc2: "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}", + Method: "Metodo", + Body: "Corpo", + Headers: "Headers", + PushUrl: "URL di Push", + HeadersInvalidFormat: "L'header di richiesta non è un JSON valido: ", + BodyInvalidFormat: "Il corpo di richiesta non è un JSON valido: ", + "Monitor History": "Storico monitoraggio", + clearDataOlderThan: "Mantieni lo storico per {0} giorni.", + PasswordsDoNotMatch: "Le password non corrispondono.", + records: "records", + "One record": "One record", + steamApiKeyDescription: "Per monitorare un server di gioco Steam si necessita della chiave Steam Web-API. È possibile registrare la propria chiave API qui: ", + "Current User": "Utente corrente", + recent: "Recenti", };