From 42e393d777da8068d679b4bcd47891142f09f4d5 Mon Sep 17 00:00:00 2001 From: Yann Stepienik Date: Tue, 21 Apr 2026 14:32:43 +0100 Subject: [PATCH] [release] v0.22.10 --- api-docs/openapi.json | 2 +- api-docs/swagger.json | 2 +- api-docs/swagger.yaml | 2 +- changelog.md | 8 + client/src/pages/backups/backups.jsx | 37 ++- client/src/pages/config/configGeneral.jsx | 47 ++- client/src/pages/config/index.jsx | 1 + client/src/utils/locales/ar/translation.json | 58 +++- client/src/utils/locales/cn/translation.json | 58 +++- client/src/utils/locales/de/translation.json | 58 +++- .../en-FUNNYSHAKESPEARE/translation.json | 58 +++- client/src/utils/locales/en/translation.json | 6 + client/src/utils/locales/es/translation.json | 58 +++- client/src/utils/locales/fr/translation.json | 58 +++- client/src/utils/locales/hi/translation.json | 58 +++- client/src/utils/locales/it/translation.json | 58 +++- client/src/utils/locales/kr/translation.json | 58 +++- client/src/utils/locales/nl/translation.json | 58 +++- client/src/utils/locales/pl/translation.json | 58 +++- client/src/utils/locales/pt/translation.json | 58 +++- client/src/utils/locales/ru/translation.json | 58 +++- client/src/utils/locales/tr/translation.json | 58 +++- go-sdk/client.gen.go | 312 +++++++++--------- go-sdk/version.go | 2 +- package.json | 2 +- src/backups/API.go | 6 +- src/backups/index.go | 2 + src/backups/restic.go | 25 ++ src/configapi/get.go | 7 + src/configapi/set.go | 14 + src/constellation/NATS.go | 52 ++- src/constellation/sync.go | 4 + src/constellation/tunnels.go | 12 +- src/index.go | 2 +- 34 files changed, 1163 insertions(+), 194 deletions(-) diff --git a/api-docs/openapi.json b/api-docs/openapi.json index e65fc211..b0d31fe7 100644 --- a/api-docs/openapi.json +++ b/api-docs/openapi.json @@ -4,7 +4,7 @@ "description": "REST API for Cosmos Cloud server management", "title": "Cosmos Server API", "contact": {}, - "version": "0.22.9" + "version": "0.22.10" }, "paths": { "/_logs": { diff --git a/api-docs/swagger.json b/api-docs/swagger.json index 16343a48..2c6d9c94 100644 --- a/api-docs/swagger.json +++ b/api-docs/swagger.json @@ -4,7 +4,7 @@ "description": "REST API for Cosmos Cloud server management", "title": "Cosmos Server API", "contact": {}, - "version": "0.22.9" + "version": "0.22.10" }, "basePath": "/cosmos", "paths": { diff --git a/api-docs/swagger.yaml b/api-docs/swagger.yaml index abaa199b..8ab9ca76 100644 --- a/api-docs/swagger.yaml +++ b/api-docs/swagger.yaml @@ -1999,7 +1999,7 @@ info: contact: {} description: REST API for Cosmos Cloud server management title: Cosmos Server API - version: 0.22.9 + version: 0.22.10 paths: /_logs: get: diff --git a/changelog.md b/changelog.md index 0ed197a9..efae506c 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,11 @@ +## Version 0.22.10 + - Fix some Restic warning breaking integration + - Remove NATS when there's only one server in Constellation + - Additional safe guards for Restic password + - Add restic password logs separated from config (backup-passwords.log) + - Show config backup password on UI + - Ensure backup password needs CREDENTIALS authorization to view + ## Version 0.22.9 - Potentially fix Constellation HTTPS conflicts diff --git a/client/src/pages/backups/backups.jsx b/client/src/pages/backups/backups.jsx index b1d0590f..c510b73f 100644 --- a/client/src/pages/backups/backups.jsx +++ b/client/src/pages/backups/backups.jsx @@ -2,8 +2,8 @@ import React from "react"; import { useEffect, useState } from "react"; import * as API from "../../api"; import PrettyTableView from "../../components/tableView/prettyTableView"; -import { CloudOutlined, CloudServerOutlined, DeleteOutlined, EditOutlined, LoadingOutlined, ReloadOutlined } from "@ant-design/icons"; -import { Checkbox, CircularProgress, ListItemIcon, ListItemText, MenuItem, Stack } from "@mui/material"; +import { CloudOutlined, CloudServerOutlined, CopyOutlined, DeleteOutlined, EditOutlined, EyeInvisibleOutlined, EyeOutlined, LoadingOutlined, ReloadOutlined } from "@ant-design/icons"; +import { Checkbox, CircularProgress, IconButton, ListItemIcon, ListItemText, MenuItem, Stack, Tooltip } from "@mui/material"; import { crontabToText } from "../../utils/indexs"; import MenuButton from "../../components/MenuButton"; import ResponsiveButton from "../../components/responseiveButton"; @@ -11,13 +11,36 @@ import { useTranslation } from "react-i18next"; import { ConfirmModalDirect } from "../../components/confirmModal"; import BackupDialog, { BackupDialogInternal } from "./backupDialog"; import { useClientInfos } from "../../utils/hooks"; -import { PERM_RESOURCES } from "../../utils/permissions"; +import { PERM_RESOURCES, PERM_CREDENTIALS_READ } from "../../utils/permissions"; import PermissionGuard from "../../components/permissionGuard"; +const PasswordCell = ({ password, t }) => { + const [shown, setShown] = useState(false); + if (!password) return null; + return ( + e.stopPropagation()}> + + {shown ? password : '••••••••'} + + + setShown((s) => !s)}> + {shown ? : } + + + + navigator.clipboard.writeText(password)}> + + + + + ); +}; + export const Backups = ({pathFilters}) => { const { t } = useTranslation(); const { hasPermission } = useClientInfos(); const isAdmin = hasPermission(PERM_RESOURCES); + const canReadCredentials = hasPermission(PERM_CREDENTIALS_READ); const [config, setConfig] = useState(null); const [backups, setBackups] = useState([]); const [loading, setLoading] = useState(false); @@ -120,9 +143,15 @@ export const Backups = ({pathFilters}) => { field: (r) => (loading && r.Name == loading) ? '' : crontabToText(r.Crontab, t), underline: true, }, + ...(canReadCredentials ? [{ + title: t('mgmt.backup.passwordTitle'), + screenMin: 'md', + clickable: true, + field: (r) => (loading && r.Name == loading) ? '' : , + }] : []), { title: '', - clickable:true, + clickable:true, field: (r) => { return
diff --git a/client/src/pages/config/configGeneral.jsx b/client/src/pages/config/configGeneral.jsx index 6aa4e13c..3730a879 100644 --- a/client/src/pages/config/configGeneral.jsx +++ b/client/src/pages/config/configGeneral.jsx @@ -6,19 +6,22 @@ import { Alert, Button, Grid, + IconButton, InputLabel, Stack, FormHelperText, TextField, MenuItem, + Tooltip, } from '@mui/material'; -import { WarningFilled } from '@ant-design/icons'; +import { CopyOutlined, EyeInvisibleOutlined, EyeOutlined, WarningFilled } from '@ant-design/icons'; import { CosmosCheckbox, CosmosInputPassword, CosmosInputText } from './users/formShortcuts'; import { LoadingButton } from '@mui/lab'; import { useTranslation } from 'react-i18next'; import { FilePickerButton } from '../../components/filePicker'; import PermissionGuard from '../../components/permissionGuard'; -import { PERM_ADMIN } from '../../utils/permissions'; +import { PERM_ADMIN, PERM_CREDENTIALS_READ } from '../../utils/permissions'; +import { useClientInfos } from '../../utils/hooks'; // License issuer's public key for signature verification const LICENSE_PUBLIC_KEY = `-----BEGIN PUBLIC KEY----- @@ -53,8 +56,15 @@ const verifyJWTSignature = async (token) => { const ConfigGeneral = ({ formik, config, status, isAdmin }) => { const { t } = useTranslation(); + const { hasPermission } = useClientInfos(); + const canReadCredentials = hasPermission(PERM_CREDENTIALS_READ); const [isCheckingUpdate, setIsCheckingUpdate] = React.useState(false); const [licenseValidation, setLicenseValidation] = React.useState({ checked: false, valid: null }); + const [showInternalBackupPwd, setShowInternalBackupPwd] = React.useState(false); + + const rawInternalBackupPassword = config?.Backup?.Backups?.['Cosmos Internal Backup']?.Password; + const internalBackupPasswordMasked = rawInternalBackupPassword === '***'; + const internalBackupPassword = internalBackupPasswordMasked ? '' : rawInternalBackupPassword; return ( @@ -175,6 +185,39 @@ const ConfigGeneral = ({ formik, config, status, isAdmin }) => { /> + + {isAdmin && canReadCredentials && internalBackupPassword && ( + + + + {t('mgmt.config.general.internalBackupPasswordLabel')} + + + + + setShowInternalBackupPwd((s) => !s)}> + {showInternalBackupPwd ? : } + + + + navigator.clipboard.writeText(internalBackupPassword)}> + + + + + + {t('mgmt.config.general.internalBackupPasswordHelper')} + + + + )} diff --git a/client/src/pages/config/index.jsx b/client/src/pages/config/index.jsx index c763b0a7..fcb926f0 100644 --- a/client/src/pages/config/index.jsx +++ b/client/src/pages/config/index.jsx @@ -299,6 +299,7 @@ const ConfigManagement = () => { } return API.config.set(toSave).then(() => { + refresh(); setOpenModal(true); setSaveLabel(t('global.savedConfirmation')); setTimeout(() => { diff --git a/client/src/utils/locales/ar/translation.json b/client/src/utils/locales/ar/translation.json index faebb32d..5da52f6a 100644 --- a/client/src/utils/locales/ar/translation.json +++ b/client/src/utils/locales/ar/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "نوع الترخيص: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "انتهت صلاحية الترخيص في {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "ترخيص غير صالح: يبدو أنه لم يتم نسخه بشكل صحيح، أو أنك قمت بنسخ قيمة خاطئة.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "توقيع الترخيص غير صالح: لم يتم التحقق من الأصالة، هل نسخت الترخيص بالكامل وبشكل صحيح؟" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "توقيع الترخيص غير صالح: لم يتم التحقق من الأصالة، هل نسخت الترخيص بالكامل وبشكل صحيح؟", + "global.active": "نشط", + "global.role": "الدور", + "global.copy": "نسخ", + "global.show": "عرض", + "global.hide": "إخفاء", + "global.copied": "تم النسخ!", + "global.done": "تم", + "global.moveToBottom": "نقل إلى الأسفل", + "global.moveToTop": "نقل إلى الأعلى", + "global.monitor": "مراقب", + "global.none": "لا شيء", + "global.owner": "المالك", + "global.permissions": "الأذونات", + "mgmt.config.apiTokens.copyWarning": "انسخ هذا الرمز الآن. لن يتم عرضه مرة أخرى.", + "mgmt.config.apiTokens.createTitle": "إنشاء رمز API", + "mgmt.config.apiTokens.deleteConfirm": "هل أنت متأكد أنك تريد حذف الرمز \"{{name}}\"؟", + "mgmt.config.apiTokens.events": "الأحداث — {{name}}", + "mgmt.config.apiTokens.fullAccess": "وصول كامل", + "mgmt.config.apiTokens.ipWhitelist": "القائمة البيضاء لعناوين IP (مفصولة بفواصل)", + "mgmt.config.apiTokens.ipWhitelistHelper": "اتركه فارغًا للسماح بجميع عناوين IP", + "mgmt.config.apiTokens.newToken": "رمز جديد", + "mgmt.config.apiTokens.noTokens": "لم يتم إنشاء رموز API بعد.", + "mgmt.config.apiTokens.permAdminRead": "قراءة المدير", + "mgmt.config.apiTokens.permAdmin": "المدير", + "mgmt.config.apiTokens.permUsersRead": "قراءة المستخدمين", + "mgmt.config.apiTokens.permUsers": "المستخدمون", + "mgmt.config.apiTokens.permResourcesRead": "قراءة الموارد", + "mgmt.config.apiTokens.permResources": "الموارد", + "mgmt.config.apiTokens.permConfigRead": "قراءة الإعدادات", + "mgmt.config.apiTokens.permConfig": "الإعدادات", + "mgmt.config.apiTokens.permUnknown": "الإذن {{id}}", + "mgmt.config.apiTokens.readOnly": "قراءة فقط", + "mgmt.config.apiTokens.restrictToConstellation": "تقييد بعمل شبكة Constellation", + "mgmt.config.apiTokens.tokenCreated": "تم إنشاء الرمز", + "mgmt.config.apiTokens.tokenName": "اسم الرمز", + "mgmt.config.apiTokens.expiry": "انتهاء الصلاحية", + "mgmt.config.apiTokens.expiryColumn": "ينتهي", + "mgmt.config.apiTokens.expiryNever": "أبداً", + "mgmt.config.apiTokens.expiry7Days": "7 أيام", + "mgmt.config.apiTokens.expiry30Days": "30 يوماً", + "mgmt.config.apiTokens.expiry90Days": "90 يوماً", + "mgmt.config.apiTokens.expired": "منتهي الصلاحية", + "mgmt.config.general.internalBackupPasswordLabel": "كلمة مرور النسخ الاحتياطي الداخلي لـ Cosmos", + "mgmt.config.general.internalBackupPasswordHelper": "احفظ هذه الكلمة في مكان آمن — لا يمكن استعادتها من المستودع إذا ضاعت.", + "mgmt.constellation.setup.lighthouseInfo": "هذا مهم! إذا كنت وراء CGNAT أو لا ترغب في فتح أي منفذ على الخادم الخاص بك، يجب إلغاء تحديد هذا!", + "mgmt.storage.mount.netDisk": "هذا قرص شبكة", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "تعطيل رؤوس HTTP_* القديمة (يعطل تكرار رؤوس X-* كرؤوس HTTP_X_* مكافئة)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "رؤوس إضافية", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "أضف رؤوسًا مخصصة إلى الطلبات الموجهة إلى هذا الهدف. ستقوم هذه الرؤوس بالكتابة فوق أي رؤوس موجودة بنفس الاسم. يمكنك استخدام المتغيرات في القيم: $target، $scheme، $host، $origin، $clientIP، $user، $route، $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "اسم الرأس", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "قيمة العنوان", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "إضافة عنوان", + "mgmt.backup.passwordTitle": "كلمة المرور", + "sudo.required": "قم بتمكين امتيازات المسؤول باستخدام الزر في أعلى اليمين لاستخدام هذه الوظيفة", + "mgmt.servapps.compose.credentialsRequired": "يتطلب محرر Compose الوصول إلى بيانات اعتماد الحاوية (متغيرات البيئة، الأسرار). يرجى تمكين امتيازات المسؤول باستخدام الزر في أعلى اليمين لعرض وتعديل تكوين Compose.", + "mgmt.servapps.compose.credentialsDenied": "يتطلب محرر Compose الوصول إلى بيانات اعتماد الحاوية (متغيرات البيئة، الأسرار). ليس لديك الصلاحية الحالية لعرض بيانات الاعتماد." } \ No newline at end of file diff --git a/client/src/utils/locales/cn/translation.json b/client/src/utils/locales/cn/translation.json index fcad5fa8..5448bef4 100644 --- a/client/src/utils/locales/cn/translation.json +++ b/client/src/utils/locales/cn/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "许可证类型:{{type}}", "mgmt.config.general.licenceInput.licenseExpired": "许可证于{{date}}过期", "mgmt.config.general.licenceInput.licenseInvalid": "无效的许可证:看起来复制不正确,或您复制了错误的值。", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "无效的许可签名:无法验证真实性,您是完整复制了许可证吗?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "无效的许可签名:无法验证真实性,您是完整复制了许可证吗?", + "global.active": "激活", + "global.role": "角色", + "global.copy": "复制", + "global.show": "显示", + "global.hide": "隐藏", + "global.copied": "已复制!", + "global.done": "完成", + "global.moveToBottom": "移到底部", + "global.moveToTop": "移到顶部", + "global.monitor": "监控", + "global.none": "无", + "global.owner": "所有者", + "global.permissions": "权限", + "mgmt.config.apiTokens.copyWarning": "立即复制此令牌。它不会再次显示。", + "mgmt.config.apiTokens.createTitle": "创建 API 令牌", + "mgmt.config.apiTokens.deleteConfirm": "您确定要删除令牌 \"{{name}}\" 吗?", + "mgmt.config.apiTokens.events": "事件 — {{name}}", + "mgmt.config.apiTokens.fullAccess": "完全访问", + "mgmt.config.apiTokens.ipWhitelist": "IP 白名单(逗号分隔)", + "mgmt.config.apiTokens.ipWhitelistHelper": "留空以允许所有 IP", + "mgmt.config.apiTokens.newToken": "新令牌", + "mgmt.config.apiTokens.noTokens": "尚未创建任何 API 令牌。", + "mgmt.config.apiTokens.permAdminRead": "管理员读取", + "mgmt.config.apiTokens.permAdmin": "管理员", + "mgmt.config.apiTokens.permUsersRead": "用户读取", + "mgmt.config.apiTokens.permUsers": "用户", + "mgmt.config.apiTokens.permResourcesRead": "资源读取", + "mgmt.config.apiTokens.permResources": "资源", + "mgmt.config.apiTokens.permConfigRead": "配置读取", + "mgmt.config.apiTokens.permConfig": "配置", + "mgmt.config.apiTokens.permUnknown": "权限 {{id}}", + "mgmt.config.apiTokens.readOnly": "只读", + "mgmt.config.apiTokens.restrictToConstellation": "限制到 Constellation 网络", + "mgmt.config.apiTokens.tokenCreated": "令牌已创建", + "mgmt.config.apiTokens.tokenName": "令牌名称", + "mgmt.config.apiTokens.expiry": "到期时间", + "mgmt.config.apiTokens.expiryColumn": "到期", + "mgmt.config.apiTokens.expiryNever": "从不", + "mgmt.config.apiTokens.expiry7Days": "7 天", + "mgmt.config.apiTokens.expiry30Days": "30 天", + "mgmt.config.apiTokens.expiry90Days": "90 天", + "mgmt.config.apiTokens.expired": "已过期", + "mgmt.config.general.internalBackupPasswordLabel": "Cosmos 内部备份密码", + "mgmt.config.general.internalBackupPasswordHelper": "将此密码保存在安全的地方——如果丢失无法从存储库恢复。", + "mgmt.constellation.setup.lighthouseInfo": "这很重要!如果您在 CGNAT 后或不希望在服务器上打开任何端口,您必须取消选中此项!", + "mgmt.storage.mount.netDisk": "这是网络磁盘", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "禁用传统 HTTP_* 头(禁用将 X-* 头重复为 HTTP_X_* 等效项)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "额外头", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "向转发到此目标的请求添加自定义头。 这些头将覆盖具有相同名称的任何现有头。 您可以在值中使用变量: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path。", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "头名称", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "头部值", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "添加头部", + "mgmt.backup.passwordTitle": "密码", + "sudo.required": "使用右上角的按钮启用管理员权限以使用此功能", + "mgmt.servapps.compose.credentialsRequired": "Compose 编辑器需要访问容器凭证(环境变量,秘密)。请使用右上角的按钮启用管理员权限以查看和编辑 Compose 配置。", + "mgmt.servapps.compose.credentialsDenied": "Compose 编辑器需要访问容器凭证(环境变量,秘密)。您当前的角色没有查看凭证的权限。" } \ No newline at end of file diff --git a/client/src/utils/locales/de/translation.json b/client/src/utils/locales/de/translation.json index 67928184..643931f4 100644 --- a/client/src/utils/locales/de/translation.json +++ b/client/src/utils/locales/de/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Lizenztyp: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Lizenz abgelaufen am {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Ungültige Lizenz: Es sieht aus, als ob sie nicht richtig kopiert wurde oder dass Sie einen falschen Wert kopiert haben.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Ungültige Lizenzsignatur: Authentizität konnte nicht verifiziert werden, haben Sie die Lizenz vollständig richtig kopiert?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Ungültige Lizenzsignatur: Authentizität konnte nicht verifiziert werden, haben Sie die Lizenz vollständig richtig kopiert?", + "global.active": "Aktiv", + "global.role": "Rolle", + "global.copy": "Kopieren", + "global.show": "Anzeigen", + "global.hide": "Verbergen", + "global.copied": "Kopiert!", + "global.done": "Erledigt", + "global.moveToBottom": "Nach unten bewegen", + "global.moveToTop": "Nach oben bewegen", + "global.monitor": "Monitor", + "global.none": "Keine", + "global.owner": "Besitzer", + "global.permissions": "Berechtigungen", + "mgmt.config.apiTokens.copyWarning": "Kopieren Sie dieses Token jetzt. Es wird nicht erneut angezeigt.", + "mgmt.config.apiTokens.createTitle": "API-Token erstellen", + "mgmt.config.apiTokens.deleteConfirm": "Sind Sie sicher, dass Sie das Token \"{{name}}\" löschen möchten?", + "mgmt.config.apiTokens.events": "Ereignisse — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Voller Zugriff", + "mgmt.config.apiTokens.ipWhitelist": "IP-Whitelist (durch Komma getrennt)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Leer lassen, um alle IPs zuzulassen", + "mgmt.config.apiTokens.newToken": "Neues Token", + "mgmt.config.apiTokens.noTokens": "Noch keine API-Tokens erstellt.", + "mgmt.config.apiTokens.permAdminRead": "Admin Lesezugriff", + "mgmt.config.apiTokens.permAdmin": "Admin", + "mgmt.config.apiTokens.permUsersRead": "Nutzer Lesezugriff", + "mgmt.config.apiTokens.permUsers": "Nutzer", + "mgmt.config.apiTokens.permResourcesRead": "Ressourcen Lesezugriff", + "mgmt.config.apiTokens.permResources": "Ressourcen", + "mgmt.config.apiTokens.permConfigRead": "Konfiguration Lesezugriff", + "mgmt.config.apiTokens.permConfig": "Konfiguration", + "mgmt.config.apiTokens.permUnknown": "Berechtigung {{id}}", + "mgmt.config.apiTokens.readOnly": "Nur Lesezugriff", + "mgmt.config.apiTokens.restrictToConstellation": "Auf das Constellation-Netzwerk beschränken", + "mgmt.config.apiTokens.tokenCreated": "Token erstellt", + "mgmt.config.apiTokens.tokenName": "Token-Name", + "mgmt.config.apiTokens.expiry": "Ablauf", + "mgmt.config.apiTokens.expiryColumn": "Läuft ab", + "mgmt.config.apiTokens.expiryNever": "Nie", + "mgmt.config.apiTokens.expiry7Days": "7 Tage", + "mgmt.config.apiTokens.expiry30Days": "30 Tage", + "mgmt.config.apiTokens.expiry90Days": "90 Tage", + "mgmt.config.apiTokens.expired": "Abgelaufen", + "mgmt.config.general.internalBackupPasswordLabel": "Kosmos internes Backup-Passwort", + "mgmt.config.general.internalBackupPasswordHelper": "Speichern Sie dieses Passwort an einem sicheren Ort — es kann nicht aus dem Repository wiederhergestellt werden, wenn es verloren geht.", + "mgmt.constellation.setup.lighthouseInfo": "Dies ist wichtig! Wenn Sie hinter einem CGNAT sind oder keinen Port auf Ihrem Server öffnen möchten, müssen Sie dies deaktivieren!", + "mgmt.storage.mount.netDisk": "Dies ist ein Netzlaufwerk", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Deaktivieren Sie alte HTTP_* Header (deaktiviert das Duplizieren von X-* Headern als HTTP_X_* Entsprechungen)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Zusätzliche Header", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Fügen Sie benutzerdefinierte Header zu Anfragen hinzu, die an dieses Ziel weitergeleitet werden. Diese Header überschreiben alle vorhandenen Header mit demselben Namen. Sie können Variablen in Werten verwenden: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Header-Name", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Header-Wert", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Header hinzufügen", + "mgmt.backup.passwordTitle": "Passwort", + "sudo.required": "Aktivieren Sie Admin-Rechte mit der Schaltfläche oben rechts, um diese Funktion zu nutzen", + "mgmt.servapps.compose.credentialsRequired": "Der Compose-Editor erfordert Zugriff auf Container-Zugangsdaten (Umgebungsvariablen, Geheimnisse). Bitte aktivieren Sie Admin-Rechte mit der Schaltfläche oben rechts, um die Compose-Konfiguration anzuzeigen und zu bearbeiten.", + "mgmt.servapps.compose.credentialsDenied": "Der Compose-Editor erfordert Zugriff auf Container-Zugangsdaten (Umgebungsvariablen, Geheimnisse). Ihre aktuelle Rolle hat keine Berechtigung, Zugangsdaten anzuzeigen." } \ No newline at end of file diff --git a/client/src/utils/locales/en-FUNNYSHAKESPEARE/translation.json b/client/src/utils/locales/en-FUNNYSHAKESPEARE/translation.json index 7462f715..3623b363 100644 --- a/client/src/utils/locales/en-FUNNYSHAKESPEARE/translation.json +++ b/client/src/utils/locales/en-FUNNYSHAKESPEARE/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "License Type: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "License expiredeth on {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Invalid license: it appeareth not to have been copied prop'rly, 'r perchance thee hath copied the wrongeth value.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Invalid licen'se signat're: Could not verify authenticity, didst yonder copy the licence prop'rly in its entir'ty?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Invalid licen'se signat're: Could not verify authenticity, didst yonder copy the licence prop'rly in its entir'ty?", + "global.active": "Art thy levers pulled?", + "global.role": "Parts o' the play", + "global.copy": "Scribeth duplicate", + "global.show": "Unveil", + "global.hide": "Concealeth", + "global.copied": "Aye, 'tis scribeth duplicated!", + "global.done": "Finisheth", + "global.moveToBottom": "Takes thee to th' abyss", + "global.moveToTop": "Ascendeth to heaven", + "global.monitor": "Watcher", + "global.none": "Nay", + "global.owner": "Lord and Master", + "global.permissions": "Grants and boons", + "mgmt.config.apiTokens.copyWarning": "Lo! Mimic this token anon. 'Twill vanish ere long.", + "mgmt.config.apiTokens.createTitle": "Concoct API Emblem", + "mgmt.config.apiTokens.deleteConfirm": "Art thou certain to banish the token called \"{{name}}\"?", + "mgmt.config.apiTokens.events": "Happenings — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Yon Complete Dominion", + "mgmt.config.apiTokens.ipWhitelist": "List of Acceptable Devices (separate with commas)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Abstain from filling to welcome all devices", + "mgmt.config.apiTokens.newToken": "Fresh Emblem", + "mgmt.config.apiTokens.noTokens": "Nary an API emblem created hitherto.", + "mgmt.config.apiTokens.permAdminRead": "Highlord's Scroll Readeth", + "mgmt.config.apiTokens.permAdmin": "Highlord", + "mgmt.config.apiTokens.permUsersRead": "Mortals' Scroll Readeth", + "mgmt.config.apiTokens.permUsers": "Mortals", + "mgmt.config.apiTokens.permResourcesRead": "Essence Scroll Readeth", + "mgmt.config.apiTokens.permResources": "Essence", + "mgmt.config.apiTokens.permConfigRead": "Konfiguration Scroll Readeth", + "mgmt.config.apiTokens.permConfig": "Konfiguration", + "mgmt.config.apiTokens.permUnknown": "Undiscovered Boon {{id}}", + "mgmt.config.apiTokens.readOnly": "Only to gaze upon", + "mgmt.config.apiTokens.restrictToConstellation": "Constrain 't to Constellation's realm", + "mgmt.config.apiTokens.tokenCreated": "Emblem Wrought", + "mgmt.config.apiTokens.tokenName": "Emblem Moniker", + "mgmt.config.apiTokens.expiry": "Demises", + "mgmt.config.apiTokens.expiryColumn": "Endeth", + "mgmt.config.apiTokens.expiryNever": "Ne'er", + "mgmt.config.apiTokens.expiry7Days": "7 morrows", + "mgmt.config.apiTokens.expiry30Days": "30 morrows", + "mgmt.config.apiTokens.expiry90Days": "90 morrows", + "mgmt.config.apiTokens.expired": "Hast expired", + "mgmt.config.general.internalBackupPasswordLabel": "Cosmos Arcane Backup spellword", + "mgmt.config.general.internalBackupPasswordHelper": "Script this spellword in a nook of thine castle – irretrievable it is from the repository once vanished.", + "mgmt.constellation.setup.lighthouseInfo": "Attend! Shouldst thou live behind CGNAT or resist exposing any portal upon thy domain, untick this thou shalt!", + "mgmt.storage.mount.netDisk": "Yon Disk of the Network Realm", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Blot out timeworn HTTP_* parts (halt mirroring of X-* parts to HTTP_X_* likeness)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Additional Crowns", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Impart custom crowns to beckons sent to this nexus. These crowns shall overthrow any previous with the same moniker. Thine variables are betimes: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Crown Moniker", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Headereth Valueth", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Addeth Header", + "mgmt.backup.passwordTitle": "Passwordeth", + "sudo.required": "Enableth Admin privileges with thine button on yon top right to employ this function", + "mgmt.servapps.compose.credentialsRequired": "The Compose editor requireth access to container secrets (environment variables, secrets). Prithee enable Admin privileges using yon button on the top right to view and edit the Compose configuration.", + "mgmt.servapps.compose.credentialsDenied": "The Compose editor requireth access to container secrets (environment variables, secrets). Thy current role hath no permission to vieweth secrets." } \ No newline at end of file diff --git a/client/src/utils/locales/en/translation.json b/client/src/utils/locales/en/translation.json index 84edbe5b..899f4284 100644 --- a/client/src/utils/locales/en/translation.json +++ b/client/src/utils/locales/en/translation.json @@ -43,6 +43,9 @@ "global.role": "Role", "global.cancelAction": "Cancel", "global.close": "Close", + "global.copy": "Copy", + "global.show": "Show", + "global.hide": "Hide", "global.confirmAction": "Confirm", "global.confirmDelete": "Confirm Delete", "global.confirmDeletion": "Are you sure?", @@ -210,6 +213,8 @@ "mgmt.config.general.backupInfo2": "Both those options will allow you to backup your Cosmos config, and your docker containers' definitions. The first one will simply output your config folder to a zip on each change. The second will create a proper incremental backup (with history) in a folder. The second option requires the backup feature to be unlocked. Both options are optionals", "mgmt.config.general.logLevelInput.logLevelValidation": "Logging Level is required", "mgmt.config.general.backupTitle": "Config Backup", + "mgmt.config.general.internalBackupPasswordLabel": "Cosmos Internal Backup password", + "mgmt.config.general.internalBackupPasswordHelper": "Save this password somewhere safe — it cannot be recovered from the repository if lost.", "mgmt.config.general.mongoDbInput": "MongoDB connection string. It is advised to use Environment variable to store this securely instead. (Optional)", "mgmt.config.general.monitoringCheckbox.monitoringLabel": "Monitoring Enabled", "mgmt.config.general.notAdminWarning": "As you are not an admin, you can't edit the configuration.
This page is only here for visibility.", @@ -1023,6 +1028,7 @@ "mgmt.backup.repository.size": "Size", "mgmt.backup.repository.snapshots_count": "# Snapshots", "mgmt.backup.repository.total_file_count": "# Files", + "mgmt.backup.passwordTitle": "Password", "mgmt.backup.repositoryTitle": "Repository", "mgmt.backup.scheduleTitle": "Schedule", "mgmt.backup.rententionPolicy": "Retention Policy", diff --git a/client/src/utils/locales/es/translation.json b/client/src/utils/locales/es/translation.json index 25c3e74f..b52fe26a 100644 --- a/client/src/utils/locales/es/translation.json +++ b/client/src/utils/locales/es/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Tipo de Licencia: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Licencia expirada el {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Licencia inválida: parece que no fue copiada correctamente, o que copió el valor incorrecto.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Firma de licencia inválida: no se pudo verificar la autenticidad, ¿copió la licencia correctamente en su totalidad?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Firma de licencia inválida: no se pudo verificar la autenticidad, ¿copió la licencia correctamente en su totalidad?", + "global.active": "Activo", + "global.role": "Rol", + "global.copy": "Copiar", + "global.show": "Mostrar", + "global.hide": "Ocultar", + "global.copied": "¡Copiado!", + "global.done": "Hecho", + "global.moveToBottom": "Mover al final", + "global.moveToTop": "Mover al principio", + "global.monitor": "Monitor", + "global.none": "Ninguno", + "global.owner": "Propietario", + "global.permissions": "Permisos", + "mgmt.config.apiTokens.copyWarning": "Copia este token ahora. No se mostrará de nuevo.", + "mgmt.config.apiTokens.createTitle": "Crear Token de API", + "mgmt.config.apiTokens.deleteConfirm": "¿Estás seguro de que deseas eliminar el token \"{{name}}\"?", + "mgmt.config.apiTokens.events": "Eventos — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Acceso Completo", + "mgmt.config.apiTokens.ipWhitelist": "Lista Blanca de IPs (separadas por comas)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Dejar vacío para permitir todas las IPs", + "mgmt.config.apiTokens.newToken": "Nuevo Token", + "mgmt.config.apiTokens.noTokens": "Aún no se han creado tokens de API.", + "mgmt.config.apiTokens.permAdminRead": "Lectura de Admin", + "mgmt.config.apiTokens.permAdmin": "Admin", + "mgmt.config.apiTokens.permUsersRead": "Lectura de Usuarios", + "mgmt.config.apiTokens.permUsers": "Usuarios", + "mgmt.config.apiTokens.permResourcesRead": "Lectura de Recursos", + "mgmt.config.apiTokens.permResources": "Recursos", + "mgmt.config.apiTokens.permConfigRead": "Lectura de Configuración", + "mgmt.config.apiTokens.permConfig": "Configuración", + "mgmt.config.apiTokens.permUnknown": "Permiso {{id}}", + "mgmt.config.apiTokens.readOnly": "Solo Lectura", + "mgmt.config.apiTokens.restrictToConstellation": "Restringir a la red Constellation", + "mgmt.config.apiTokens.tokenCreated": "Token Creado", + "mgmt.config.apiTokens.tokenName": "Nombre del Token", + "mgmt.config.apiTokens.expiry": "Vencimiento", + "mgmt.config.apiTokens.expiryColumn": "Vence", + "mgmt.config.apiTokens.expiryNever": "Nunca", + "mgmt.config.apiTokens.expiry7Days": "7 días", + "mgmt.config.apiTokens.expiry30Days": "30 días", + "mgmt.config.apiTokens.expiry90Days": "90 días", + "mgmt.config.apiTokens.expired": "Expirado", + "mgmt.config.general.internalBackupPasswordLabel": "Contraseña de Respaldo Interno de Cosmos", + "mgmt.config.general.internalBackupPasswordHelper": "Guarda esta contraseña en un lugar seguro — no se puede recuperar del repositorio si se pierde.", + "mgmt.constellation.setup.lighthouseInfo": "¡Esto es importante! Si estás detrás de CGNAT o no deseas abrir ningún puerto en tu servidor, ¡debes desmarcar esto!", + "mgmt.storage.mount.netDisk": "Este es un Disco de Red", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Desactivar cabeceras HTTP_* heredadas (desactiva la duplicación de cabeceras X-* como equivalentes HTTP_X_*)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Cabeceras Extra", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Agrega cabeceras personalizadas a las solicitudes reenviadas a este destino. Estas cabeceras sobrescribirán cualquier cabecera existente con el mismo nombre. Puedes usar variables en valores: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Nombre de la Cabecera", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Valor del encabezado", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Añadir encabezado", + "mgmt.backup.passwordTitle": "Contraseña", + "sudo.required": "Habilite los privilegios de administrador con el botón en la parte superior derecha para utilizar esta función", + "mgmt.servapps.compose.credentialsRequired": "El editor de Compose requiere acceso a las credenciales del contenedor (variables de entorno, secretos). Por favor, habilite los privilegios de administrador utilizando el botón en la parte superior derecha para ver y editar la configuración de Compose.", + "mgmt.servapps.compose.credentialsDenied": "El editor de Compose requiere acceso a las credenciales del contenedor (variables de entorno, secretos). Su rol actual no tiene permiso para ver las credenciales." } \ No newline at end of file diff --git a/client/src/utils/locales/fr/translation.json b/client/src/utils/locales/fr/translation.json index d668803d..ca91e0b8 100644 --- a/client/src/utils/locales/fr/translation.json +++ b/client/src/utils/locales/fr/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Type de Licence : {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Licence expirée le {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Licence invalide : il semble qu'elle n'ait pas été copiée correctement ou que vous ayez copié la mauvaise valeur.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Signature de licence invalide : Impossible de vérifier l'authenticité, avez-vous copié la licence correctement dans son intégralité?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Signature de licence invalide : Impossible de vérifier l'authenticité, avez-vous copié la licence correctement dans son intégralité?", + "global.active": "Actif", + "global.role": "Rôle", + "global.copy": "Copier", + "global.show": "Afficher", + "global.hide": "Cacher", + "global.copied": "Copié!", + "global.done": "Fait", + "global.moveToBottom": "Déplacer en bas", + "global.moveToTop": "Déplacer en haut", + "global.monitor": "Moniteur", + "global.none": "Aucun", + "global.owner": "Propriétaire", + "global.permissions": "Autorisations", + "mgmt.config.apiTokens.copyWarning": "Copiez ce jeton maintenant. Il ne sera plus affiché.", + "mgmt.config.apiTokens.createTitle": "Créer un jeton API", + "mgmt.config.apiTokens.deleteConfirm": "Êtes-vous sûr de vouloir supprimer le jeton \"{{name}}\" ?", + "mgmt.config.apiTokens.events": "Événements — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Accès Total", + "mgmt.config.apiTokens.ipWhitelist": "Liste blanche IP (séparée par des virgules)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Laissez vide pour autoriser toutes les IPs", + "mgmt.config.apiTokens.newToken": "Nouveau Jeton", + "mgmt.config.apiTokens.noTokens": "Aucun jeton API créé pour l'instant.", + "mgmt.config.apiTokens.permAdminRead": "Lecture Admin", + "mgmt.config.apiTokens.permAdmin": "Admin", + "mgmt.config.apiTokens.permUsersRead": "Lecture Utilisateurs", + "mgmt.config.apiTokens.permUsers": "Utilisateurs", + "mgmt.config.apiTokens.permResourcesRead": "Lecture Ressources", + "mgmt.config.apiTokens.permResources": "Ressources", + "mgmt.config.apiTokens.permConfigRead": "Lecture Configuration", + "mgmt.config.apiTokens.permConfig": "Configuration", + "mgmt.config.apiTokens.permUnknown": "Autorisation {{id}}", + "mgmt.config.apiTokens.readOnly": "Lecture Seule", + "mgmt.config.apiTokens.restrictToConstellation": "Restreindre au réseau Constellation", + "mgmt.config.apiTokens.tokenCreated": "Jeton Créé", + "mgmt.config.apiTokens.tokenName": "Nom du Jeton", + "mgmt.config.apiTokens.expiry": "Expiration", + "mgmt.config.apiTokens.expiryColumn": "Expire", + "mgmt.config.apiTokens.expiryNever": "Jamais", + "mgmt.config.apiTokens.expiry7Days": "7 jours", + "mgmt.config.apiTokens.expiry30Days": "30 jours", + "mgmt.config.apiTokens.expiry90Days": "90 jours", + "mgmt.config.apiTokens.expired": "Expiré", + "mgmt.config.general.internalBackupPasswordLabel": "Mot de passe de sauvegarde interne Cosmos", + "mgmt.config.general.internalBackupPasswordHelper": "Enregistrez ce mot de passe en lieu sûr — il ne peut pas être récupéré depuis le dépôt en cas de perte.", + "mgmt.constellation.setup.lighthouseInfo": "C'est important! Si vous êtes derrière CGNAT ou si vous ne souhaitez pas ouvrir de port sur votre serveur, vous devez décocher ceci!", + "mgmt.storage.mount.netDisk": "Ceci est un disque réseau", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Désactiver les en-têtes HTTP_* hérités (désactive la duplication des en-têtes X-* en tant qu'équivalents HTTP_X_*)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "En-têtes supplémentaires", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Ajoutez des en-têtes personnalisés aux requêtes transmises à cette cible. Ces en-têtes écraseront tous les en-têtes existants portant le même nom. Vous pouvez utiliser des variables dans les valeurs : $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Nom de l'en-tête", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Valeur de l'en-tête", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Ajouter l'en-tête", + "mgmt.backup.passwordTitle": "Mot de passe", + "sudo.required": "Activez les privilèges d'administrateur avec le bouton en haut à droite pour utiliser cette fonction", + "mgmt.servapps.compose.credentialsRequired": "L'éditeur Compose nécessite un accès aux identifiants des conteneurs (variables d'environnement, secrets). Veuillez activer les privilèges d'administrateur en utilisant le bouton en haut à droite pour afficher et modifier la configuration Compose.", + "mgmt.servapps.compose.credentialsDenied": "L'éditeur Compose nécessite un accès aux identifiants des conteneurs (variables d'environnement, secrets). Votre rôle actuel n'a pas l'autorisation de voir les identifiants." } \ No newline at end of file diff --git a/client/src/utils/locales/hi/translation.json b/client/src/utils/locales/hi/translation.json index 7c0bb037..ab2356ea 100644 --- a/client/src/utils/locales/hi/translation.json +++ b/client/src/utils/locales/hi/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "लाइसेंस प्रकार: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "लाइसेंस का समापन {{date}} को हुआ", "mgmt.config.general.licenceInput.licenseInvalid": "अवैध लाइसेंस: ऐसा लगता है कि इसे सही ढंग से कॉपी नहीं किया गया था, या आपने गलत मूल्य कॉपी किया।", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "अवैध लाइसेंस हस्ताक्षर: प्रामाणिकता सत्यापित नहीं की जा सकी, क्या आपने लाइसेंस को पूरी तरह से सही ढंग से कॉपी किया?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "अवैध लाइसेंस हस्ताक्षर: प्रामाणिकता सत्यापित नहीं की जा सकी, क्या आपने लाइसेंस को पूरी तरह से सही ढंग से कॉपी किया?", + "global.active": "सक्रिय", + "global.role": "भूमिका", + "global.copy": "प्रतिलिपि", + "global.show": "दिखाएं", + "global.hide": "छुपाएं", + "global.copied": "प्रतिलिपीत!", + "global.done": "संपन्न", + "global.moveToBottom": "नीचे ले जाएँ", + "global.moveToTop": "ऊपर ले जाएँ", + "global.monitor": "निगरानी", + "global.none": "कोई नहीं", + "global.owner": "मालिक", + "global.permissions": "अनुमतियाँ", + "mgmt.config.apiTokens.copyWarning": "अब इस टोकन की प्रतिलिपि बनाएँ। यह फिर से नहीं दिखाया जाएगा।", + "mgmt.config.apiTokens.createTitle": "एपीआई टोकन बनाएं", + "mgmt.config.apiTokens.deleteConfirm": "क्या आप वाकई टोकन \"{{name}}\" को हटाना चाहते हैं?", + "mgmt.config.apiTokens.events": "घटनाएं — {{name}}", + "mgmt.config.apiTokens.fullAccess": "पूर्ण पहुंच", + "mgmt.config.apiTokens.ipWhitelist": "आईपी श्वेतसूची (कॉमा से पृथक)", + "mgmt.config.apiTokens.ipWhitelistHelper": "सभी आईपी की अनुमति देने के लिए खाली छोड़ दें", + "mgmt.config.apiTokens.newToken": "नया टोकन", + "mgmt.config.apiTokens.noTokens": "कोई एपीआई टोकन अभी तक नहीं बनाए गए हैं।", + "mgmt.config.apiTokens.permAdminRead": "प्रशासन पढ़ें", + "mgmt.config.apiTokens.permAdmin": "प्रशासन", + "mgmt.config.apiTokens.permUsersRead": "उपयोगकर्ता पढ़ें", + "mgmt.config.apiTokens.permUsers": "उपयोगकर्ता", + "mgmt.config.apiTokens.permResourcesRead": "संसाधनों को पढ़ें", + "mgmt.config.apiTokens.permResources": "संसाधन", + "mgmt.config.apiTokens.permConfigRead": "कॉन्फ़िगरेशन पढ़ें", + "mgmt.config.apiTokens.permConfig": "कॉन्फ़िगरेशन", + "mgmt.config.apiTokens.permUnknown": "अनुमति {{id}}", + "mgmt.config.apiTokens.readOnly": "केवल पढ़ने के लिए", + "mgmt.config.apiTokens.restrictToConstellation": "कंस्टीलेशन नेटवर्क तक सीमित", + "mgmt.config.apiTokens.tokenCreated": "टोकन बनाया गया", + "mgmt.config.apiTokens.tokenName": "टोकन का नाम", + "mgmt.config.apiTokens.expiry": "समाप्ति", + "mgmt.config.apiTokens.expiryColumn": "समाप्ति की तिथि", + "mgmt.config.apiTokens.expiryNever": "कभी नहीं", + "mgmt.config.apiTokens.expiry7Days": "7 दिन", + "mgmt.config.apiTokens.expiry30Days": "30 दिन", + "mgmt.config.apiTokens.expiry90Days": "90 दिन", + "mgmt.config.apiTokens.expired": "समाप्त", + "mgmt.config.general.internalBackupPasswordLabel": "कॉसमॉस आंतरिक बैकअप पासवर्ड", + "mgmt.config.general.internalBackupPasswordHelper": "इस पासवर्ड को कहीं सुरक्षित रखें — यदि खो गया तो इसे रिपॉजिटरी से पुनः प्राप्त नहीं किया जा सकता।", + "mgmt.constellation.setup.lighthouseInfo": "यह महत्वपूर्ण है! यदि आप CGNAT के पीछे हैं या अपने सर्वर पर कोई पोर्ट खोलना नहीं चाहते हैं, तो आपको इसे अनचेक करना होगा!", + "mgmt.storage.mount.netDisk": "यह एक नेटवर्क डिस्क है", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "पारंपरिक HTTP_* हेडर को अक्षम करें (X-* हेडर को HTTP_X_* समकक्षों के रूप में डुप्लिकेट करने को अक्षम करता है)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "अतिरिक्त हेडर", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "इस लक्ष्य को अग्रसारित अनुरोधों में कस्टम हेडर जोड़ें। ये हेडर समान नाम वाले मौजूदा हेडर को ओवरराइट कर देंगे। आप मूल्यों में वेरिएबल्स का उपयोग कर सकते हैं: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "हेडर नाम", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "हेडर मान", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "हेडर जोड़ें", + "mgmt.backup.passwordTitle": "पासवर्ड", + "sudo.required": "इस फ़ंक्शन का उपयोग करने के लिए शीर्ष दाएँ में बटन से व्यवस्थापक विशेषाधिकार सक्षम करें", + "mgmt.servapps.compose.credentialsRequired": "कंपोज़ संपादक को कंटेनर क्रेडेंशियल्स (पर्यावरण चर, रहस्य) तक पहुँचने की आवश्यकता होती है। कृपया कॉम्पोज़ कॉन्फ़िगरेशन को देखने और संपादित करने के लिए शीर्ष दाएँ में बटन से व्यवस्थापक विशेषाधिकार सक्षम करें।", + "mgmt.servapps.compose.credentialsDenied": "कंपोज़ संपादक को कंटेनर क्रेडेंशियल्स (पर्यावरण चर, रहस्य) तक पहुँचने की आवश्यकता होती है। आपके वर्तमान भूमिका को क्रेडेंशियल्स देखने की अनुमति नहीं है।" } \ No newline at end of file diff --git a/client/src/utils/locales/it/translation.json b/client/src/utils/locales/it/translation.json index 989a2000..2f4813b5 100644 --- a/client/src/utils/locales/it/translation.json +++ b/client/src/utils/locales/it/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Tipo di Licenza: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Licenza scaduta il {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Licenza non valida: sembra che non sia stata copiata correttamente, o che sia stato copiato il valore sbagliato.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Firma licenza non valida: Impossibile verificare l'autenticità, hai copiato correttamente l'intera licenza?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Firma licenza non valida: Impossibile verificare l'autenticità, hai copiato correttamente l'intera licenza?", + "global.active": "Attivo", + "global.role": "Ruolo", + "global.copy": "Copia", + "global.show": "Mostra", + "global.hide": "Nascondi", + "global.copied": "Copiato!", + "global.done": "Fatto", + "global.moveToBottom": "Sposta in fondo", + "global.moveToTop": "Sposta in cima", + "global.monitor": "Monitor", + "global.none": "Nessuno", + "global.owner": "Proprietario", + "global.permissions": "Permessi", + "mgmt.config.apiTokens.copyWarning": "Copia questo token ora. Non verrà più mostrato.", + "mgmt.config.apiTokens.createTitle": "Crea Token API", + "mgmt.config.apiTokens.deleteConfirm": "Sei sicuro di voler eliminare il token \"{{name}}\"?", + "mgmt.config.apiTokens.events": "Eventi — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Accesso Completo", + "mgmt.config.apiTokens.ipWhitelist": "Whitelist IP (separata da virgole)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Lascia vuoto per consentire tutti gli IP", + "mgmt.config.apiTokens.newToken": "Nuovo Token", + "mgmt.config.apiTokens.noTokens": "Nessun token API creato ancora.", + "mgmt.config.apiTokens.permAdminRead": "Amministratore Lettura", + "mgmt.config.apiTokens.permAdmin": "Amministratore", + "mgmt.config.apiTokens.permUsersRead": "Utenti Lettura", + "mgmt.config.apiTokens.permUsers": "Utenti", + "mgmt.config.apiTokens.permResourcesRead": "Risorse Lettura", + "mgmt.config.apiTokens.permResources": "Risorse", + "mgmt.config.apiTokens.permConfigRead": "Configurazione Lettura", + "mgmt.config.apiTokens.permConfig": "Configurazione", + "mgmt.config.apiTokens.permUnknown": "Permesso {{id}}", + "mgmt.config.apiTokens.readOnly": "Solo Lettura", + "mgmt.config.apiTokens.restrictToConstellation": "Limita alla rete Constellation", + "mgmt.config.apiTokens.tokenCreated": "Token Creato", + "mgmt.config.apiTokens.tokenName": "Nome del Token", + "mgmt.config.apiTokens.expiry": "Scadenza", + "mgmt.config.apiTokens.expiryColumn": "Scade", + "mgmt.config.apiTokens.expiryNever": "Mai", + "mgmt.config.apiTokens.expiry7Days": "7 giorni", + "mgmt.config.apiTokens.expiry30Days": "30 giorni", + "mgmt.config.apiTokens.expiry90Days": "90 giorni", + "mgmt.config.apiTokens.expired": "Scaduto", + "mgmt.config.general.internalBackupPasswordLabel": "Password Backup Interno Cosmos", + "mgmt.config.general.internalBackupPasswordHelper": "Salva questa password in un luogo sicuro — non può essere recuperata se persa.", + "mgmt.constellation.setup.lighthouseInfo": "Questo è importante! Se sei dietro CGNAT o non vuoi aprire alcuna porta sul tuo server, devi deselezionare questo!", + "mgmt.storage.mount.netDisk": "Questo è un Disco di Rete", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Disabilita le intestazioni HTTP_* legacy (disabilita la duplicazione delle intestazioni X-* come equivalenti HTTP_X_*)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Intestazioni Extra", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Aggiungi intestazioni personalizzate alle richieste inoltrate a questo target. Queste intestazioni sovrascriveranno qualsiasi intestazione esistente con lo stesso nome. Puoi utilizzare variabili nei valori: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Nome Intestazione", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Valore dell'intestazione", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Aggiungi intestazione", + "mgmt.backup.passwordTitle": "Password", + "sudo.required": "Abilita i privilegi di amministratore con il pulsante in alto a destra per usare questa funzione", + "mgmt.servapps.compose.credentialsRequired": "L'editor Compose richiede l'accesso alle credenziali del container (variabili d'ambiente, segreti). Si prega di abilitare i privilegi di amministratore usando il pulsante in alto a destra per visualizzare e modificare la configurazione di Compose.", + "mgmt.servapps.compose.credentialsDenied": "L'editor Compose richiede l'accesso alle credenziali del container (variabili d'ambiente, segreti). Il tuo ruolo attuale non ha il permesso di visualizzare le credenziali." } \ No newline at end of file diff --git a/client/src/utils/locales/kr/translation.json b/client/src/utils/locales/kr/translation.json index 541d49dc..8fc9e475 100644 --- a/client/src/utils/locales/kr/translation.json +++ b/client/src/utils/locales/kr/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "라이센스 유형: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "라이센스가 {{date}}에 만료되었습니다", "mgmt.config.general.licenceInput.licenseInvalid": "잘못된 라이센스: 제대로 복사되지 않았거나 잘못된 값을 복사한 것 같습니다.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "잘못된 라이센스 서명: 진위를 확인할 수 없습니다. 라이센스를 전체적으로 제대로 복사했는지 확인하십시오." + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "잘못된 라이센스 서명: 진위를 확인할 수 없습니다. 라이센스를 전체적으로 제대로 복사했는지 확인하십시오.", + "global.active": "활성", + "global.role": "역할", + "global.copy": "복사", + "global.show": "보이기", + "global.hide": "숨기기", + "global.copied": "복사됨!", + "global.done": "완료", + "global.moveToBottom": "맨 아래로 이동", + "global.moveToTop": "맨 위로 이동", + "global.monitor": "모니터", + "global.none": "없음", + "global.owner": "소유자", + "global.permissions": "권한", + "mgmt.config.apiTokens.copyWarning": "이 토큰을 지금 복사하세요. 다시는 표시되지 않습니다.", + "mgmt.config.apiTokens.createTitle": "API 토큰 생성", + "mgmt.config.apiTokens.deleteConfirm": "\"{{name}}\" 토큰을 삭제하시겠습니까?", + "mgmt.config.apiTokens.events": "이벤트 — {{name}}", + "mgmt.config.apiTokens.fullAccess": "전체 접근", + "mgmt.config.apiTokens.ipWhitelist": "IP 화이트리스트 (쉼표로 구분)", + "mgmt.config.apiTokens.ipWhitelistHelper": "모든 IP를 허용하려면 비워 두세요", + "mgmt.config.apiTokens.newToken": "새 토큰", + "mgmt.config.apiTokens.noTokens": "생성된 API 토큰이 아직 없습니다.", + "mgmt.config.apiTokens.permAdminRead": "관리자 읽기", + "mgmt.config.apiTokens.permAdmin": "관리자", + "mgmt.config.apiTokens.permUsersRead": "사용자 읽기", + "mgmt.config.apiTokens.permUsers": "사용자", + "mgmt.config.apiTokens.permResourcesRead": "리소스 읽기", + "mgmt.config.apiTokens.permResources": "리소스", + "mgmt.config.apiTokens.permConfigRead": "구성 읽기", + "mgmt.config.apiTokens.permConfig": "구성", + "mgmt.config.apiTokens.permUnknown": "권한 {{id}}", + "mgmt.config.apiTokens.readOnly": "읽기 전용", + "mgmt.config.apiTokens.restrictToConstellation": "Constellation 네트워크로 제한", + "mgmt.config.apiTokens.tokenCreated": "토큰 생성됨", + "mgmt.config.apiTokens.tokenName": "토큰 이름", + "mgmt.config.apiTokens.expiry": "만료", + "mgmt.config.apiTokens.expiryColumn": "만료일", + "mgmt.config.apiTokens.expiryNever": "없음", + "mgmt.config.apiTokens.expiry7Days": "7일", + "mgmt.config.apiTokens.expiry30Days": "30일", + "mgmt.config.apiTokens.expiry90Days": "90일", + "mgmt.config.apiTokens.expired": "만료됨", + "mgmt.config.general.internalBackupPasswordLabel": "Cosmos 내부 백업 암호", + "mgmt.config.general.internalBackupPasswordHelper": "이 암호를 안전한 곳에 저장하세요 — 잃어버리면 저장소에서 복구할 수 없습니다.", + "mgmt.constellation.setup.lighthouseInfo": "중요합니다! CGNAT 뒤에 있거나 서버에서 포트를 열고 싶지 않은 경우 이 옵션을 선택 해제해야 합니다!", + "mgmt.storage.mount.netDisk": "이것은 네트워크 디스크입니다", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "기존 HTTP_* 헤더 비활성화 (X-* 헤더를 HTTP_X_*와 동일하게 중복하는 것 비활성화)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "추가 헤더", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "이 대상에 전달되는 요청에 사용자 정의 헤더를 추가하세요. 동일한 이름의 기존 헤더를 덮어씁니다. 값에 변수를 사용할 수 있습니다: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "헤더 이름", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "헤더 값", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "헤더 추가", + "mgmt.backup.passwordTitle": "비밀번호", + "sudo.required": "이 기능을 사용하려면 오른쪽 상단의 버튼으로 관리자 권한을 활성화하세요", + "mgmt.servapps.compose.credentialsRequired": "Compose 편집기는 컨테이너 자격 증명(환경 변수, 비밀)에 대한 액세스가 필요합니다. 오른쪽 상단의 버튼으로 관리자 권한을 활성화하여 Compose 구성을 보고 편집하세요.", + "mgmt.servapps.compose.credentialsDenied": "Compose 편집기는 컨테이너 자격 증명(환경 변수, 비밀)에 대한 액세스가 필요합니다. 현재 역할은 자격 증명을 볼 수 있는 권한이 없습니다." } \ No newline at end of file diff --git a/client/src/utils/locales/nl/translation.json b/client/src/utils/locales/nl/translation.json index 5a29ab8d..997dd3a6 100644 --- a/client/src/utils/locales/nl/translation.json +++ b/client/src/utils/locales/nl/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Licentietype: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Licentie verlopen op {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Ongeldige licentie: het lijkt erop dat het niet goed is gekopieerd, of dat je de verkeerde waarde hebt gekopieerd.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Ongeldige licentiehandtekening: Kon authenticiteit niet verifiëren, heeft u de licentie correct en volledig gekopieerd?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Ongeldige licentiehandtekening: Kon authenticiteit niet verifiëren, heeft u de licentie correct en volledig gekopieerd?", + "global.active": "Actief", + "global.role": "Rol", + "global.copy": "Kopiëren", + "global.show": "Tonen", + "global.hide": "Verbergen", + "global.copied": "Gekopieerd!", + "global.done": "Klaar", + "global.moveToBottom": "Verplaats naar beneden", + "global.moveToTop": "Verplaats naar boven", + "global.monitor": "Monitor", + "global.none": "Geen", + "global.owner": "Eigenaar", + "global.permissions": "Rechten", + "mgmt.config.apiTokens.copyWarning": "Kopieer deze token nu. Het wordt niet opnieuw getoond.", + "mgmt.config.apiTokens.createTitle": "API-token aanmaken", + "mgmt.config.apiTokens.deleteConfirm": "Weet u zeker dat u de token \"{{name}}\" wilt verwijderen?", + "mgmt.config.apiTokens.events": "Evenementen — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Volledige toegang", + "mgmt.config.apiTokens.ipWhitelist": "IP-witlijst (komma-gescheiden)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Laat leeg om alle IP's toe te staan", + "mgmt.config.apiTokens.newToken": "Nieuwe token", + "mgmt.config.apiTokens.noTokens": "Nog geen API-tokens aangemaakt.", + "mgmt.config.apiTokens.permAdminRead": "Admin-lezen", + "mgmt.config.apiTokens.permAdmin": "Admin", + "mgmt.config.apiTokens.permUsersRead": "Gebruikerslezen", + "mgmt.config.apiTokens.permUsers": "Gebruikers", + "mgmt.config.apiTokens.permResourcesRead": "Hulpbronnen lezen", + "mgmt.config.apiTokens.permResources": "Hulpbronnen", + "mgmt.config.apiTokens.permConfigRead": "Configuratie lezen", + "mgmt.config.apiTokens.permConfig": "Configuratie", + "mgmt.config.apiTokens.permUnknown": "Recht {{id}}", + "mgmt.config.apiTokens.readOnly": "Alleen lezen", + "mgmt.config.apiTokens.restrictToConstellation": "Beperken tot Constellation-netwerk", + "mgmt.config.apiTokens.tokenCreated": "Token aangemaakt", + "mgmt.config.apiTokens.tokenName": "Tokennaam", + "mgmt.config.apiTokens.expiry": "Vervaldatum", + "mgmt.config.apiTokens.expiryColumn": "Verloopt", + "mgmt.config.apiTokens.expiryNever": "Nooit", + "mgmt.config.apiTokens.expiry7Days": "7 dagen", + "mgmt.config.apiTokens.expiry30Days": "30 dagen", + "mgmt.config.apiTokens.expiry90Days": "90 dagen", + "mgmt.config.apiTokens.expired": "Verlopen", + "mgmt.config.general.internalBackupPasswordLabel": "Cosmos Intern Back-upwachtwoord", + "mgmt.config.general.internalBackupPasswordHelper": "Bewaar dit wachtwoord ergens veilig — het kan niet worden teruggehaald uit de repository als het verloren is.", + "mgmt.constellation.setup.lighthouseInfo": "Dit is belangrijk! Als u achter CGNAT zit of geen poort op uw server wilt openen, moet u dit uitschakelen!", + "mgmt.storage.mount.netDisk": "Dit is een netwerkschijf", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Schakel legacy HTTP_* headers uit (schakelt dupliceren van X-* headers als HTTP_X_* equivalenten uit)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Extra headers", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Voeg aangepaste headers toe aan verzoeken die naar dit doel worden doorgestuurd. Deze headers overschrijven alle bestaande headers met dezelfde naam. U kunt variabelen in waarden gebruiken: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Titel van de header", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Kop Waarde", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Kop Toevoegen", + "mgmt.backup.passwordTitle": "Wachtwoord", + "sudo.required": "Schakel beheerderprivileges in met de knop rechtsboven om deze functie te gebruiken", + "mgmt.servapps.compose.credentialsRequired": "De Compose-editor vereist toegang tot containerreferenties (omgevingsvariabelen, geheimen). Schakel beheerderprivileges in met de knop rechtsboven om de Compose-configuratie te bekijken en te bewerken.", + "mgmt.servapps.compose.credentialsDenied": "De Compose-editor vereist toegang tot containerreferenties (omgevingsvariabelen, geheimen). Uw huidige rol heeft geen toestemming om referenties te bekijken." } \ No newline at end of file diff --git a/client/src/utils/locales/pl/translation.json b/client/src/utils/locales/pl/translation.json index 9ba4d199..5661478f 100644 --- a/client/src/utils/locales/pl/translation.json +++ b/client/src/utils/locales/pl/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Typ Licencji: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Licencja wygasła {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Nieprawidłowa licencja: wygląda na to, że nie została poprawnie skopiowana lub skopiowano złą wartość.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Nieprawidłowy podpis licencji: Nie można zweryfikować autentyczności, czy na pewno skopiowałeś licencję w całości?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Nieprawidłowy podpis licencji: Nie można zweryfikować autentyczności, czy na pewno skopiowałeś licencję w całości?", + "global.active": "Aktywny", + "global.role": "Rola", + "global.copy": "Kopiuj", + "global.show": "Pokaż", + "global.hide": "Ukryj", + "global.copied": "Skopiowano!", + "global.done": "Zrobione", + "global.moveToBottom": "Przenieś na dół", + "global.moveToTop": "Przenieś na górę", + "global.monitor": "Monitoruj", + "global.none": "Brak", + "global.owner": "Właściciel", + "global.permissions": "Uprawnienia", + "mgmt.config.apiTokens.copyWarning": "Skopiuj ten token teraz. Nie będzie już pokazany.", + "mgmt.config.apiTokens.createTitle": "Utwórz Token API", + "mgmt.config.apiTokens.deleteConfirm": "Czy na pewno chcesz usunąć token \"{{name}}\"?", + "mgmt.config.apiTokens.events": "Zdarzenia — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Pełny Dostęp", + "mgmt.config.apiTokens.ipWhitelist": "Biała lista IP (oddzielone przecinkami)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Pozostaw puste, aby zezwolić na wszystkie adresy IP", + "mgmt.config.apiTokens.newToken": "Nowy Token", + "mgmt.config.apiTokens.noTokens": "Nie utworzono jeszcze żadnych tokenów API.", + "mgmt.config.apiTokens.permAdminRead": "Administracja Odczyt", + "mgmt.config.apiTokens.permAdmin": "Administracja", + "mgmt.config.apiTokens.permUsersRead": "Użytkownicy Odczyt", + "mgmt.config.apiTokens.permUsers": "Użytkownicy", + "mgmt.config.apiTokens.permResourcesRead": "Zasoby Odczyt", + "mgmt.config.apiTokens.permResources": "Zasoby", + "mgmt.config.apiTokens.permConfigRead": "Konfiguracja Odczyt", + "mgmt.config.apiTokens.permConfig": "Konfiguracja", + "mgmt.config.apiTokens.permUnknown": "Uprawnienie {{id}}", + "mgmt.config.apiTokens.readOnly": "Tylko do odczytu", + "mgmt.config.apiTokens.restrictToConstellation": "Ogranicz do sieci Constellation", + "mgmt.config.apiTokens.tokenCreated": "Token Utworzony", + "mgmt.config.apiTokens.tokenName": "Nazwa Tokenu", + "mgmt.config.apiTokens.expiry": "Wygaśnięcie", + "mgmt.config.apiTokens.expiryColumn": "Wygasa", + "mgmt.config.apiTokens.expiryNever": "Nigdy", + "mgmt.config.apiTokens.expiry7Days": "7 dni", + "mgmt.config.apiTokens.expiry30Days": "30 dni", + "mgmt.config.apiTokens.expiry90Days": "90 dni", + "mgmt.config.apiTokens.expired": "Wygasł", + "mgmt.config.general.internalBackupPasswordLabel": "Hasło wewnętrznej kopii zapasowej Cosmos", + "mgmt.config.general.internalBackupPasswordHelper": "Zapisz to hasło w bezpiecznym miejscu — nie można go odzyskać z repozytorium, jeśli zostanie zgubione.", + "mgmt.constellation.setup.lighthouseInfo": "To jest ważne! Jeśli znajdujesz się za CGNAT lub nie chcesz otwierać żadnych portów na swoim serwerze, musisz to odznaczyć!", + "mgmt.storage.mount.netDisk": "To jest Dysk Sieciowy", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Wyłącz legacy HTTP_* nagłówki (wyłącza duplikowanie X-* nagłówków jako HTTP_X_* odpowiedników)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Dodatkowe Nagłówki", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Dodaj niestandardowe nagłówki do żądań przesyłanych do tego celu. Te nagłówki zastąpią istniejące nagłówki o tej samej nazwie. Możesz używać zmiennych w wartościach: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Nazwa Nagłówka", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Wartość nagłówka", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Dodaj nagłówek", + "mgmt.backup.passwordTitle": "Hasło", + "sudo.required": "Włącz uprawnienia administratora za pomocą przycisku w prawym górnym rogu, aby użyć tej funkcji", + "mgmt.servapps.compose.credentialsRequired": "Edytor Compose wymaga dostępu do poświadczeń kontenerów (zmienne środowiskowe, tajne dane). Proszę włączyć uprawnienia administratora, używając przycisku w prawym górnym rogu, aby przeglądać i edytować konfigurację Compose.", + "mgmt.servapps.compose.credentialsDenied": "Edytor Compose wymaga dostępu do poświadczeń kontenerów (zmienne środowiskowe, tajne dane). Twoja obecna rola nie ma uprawnień do przeglądania poświadczeń." } \ No newline at end of file diff --git a/client/src/utils/locales/pt/translation.json b/client/src/utils/locales/pt/translation.json index 955e5bec..87acc13a 100644 --- a/client/src/utils/locales/pt/translation.json +++ b/client/src/utils/locales/pt/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Tipo de Licença: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Licença expirada em {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Licença inválida: parece que não foi copiada corretamente ou que você copiou o valor errado.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Assinatura de licença inválida: não foi possível verificar a autenticidade, você copiou a licença corretamente na íntegra?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Assinatura de licença inválida: não foi possível verificar a autenticidade, você copiou a licença corretamente na íntegra?", + "global.active": "Ativo", + "global.role": "Função", + "global.copy": "Copiar", + "global.show": "Mostrar", + "global.hide": "Ocultar", + "global.copied": "Copiado!", + "global.done": "Concluído", + "global.moveToBottom": "Mover para o fundo", + "global.moveToTop": "Mover para o topo", + "global.monitor": "Monitorar", + "global.none": "Nenhum", + "global.owner": "Proprietário", + "global.permissions": "Permissões", + "mgmt.config.apiTokens.copyWarning": "Copie este token agora. Ele não será mostrado novamente.", + "mgmt.config.apiTokens.createTitle": "Criar Token de API", + "mgmt.config.apiTokens.deleteConfirm": "Tem certeza de que deseja excluir o token \"{{name}}\"?", + "mgmt.config.apiTokens.events": "Eventos — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Acesso Total", + "mgmt.config.apiTokens.ipWhitelist": "Lista Branca de IPs (separados por vírgula)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Deixe em branco para permitir todos os IPs", + "mgmt.config.apiTokens.newToken": "Novo Token", + "mgmt.config.apiTokens.noTokens": "Nenhum token de API criado ainda.", + "mgmt.config.apiTokens.permAdminRead": "Leitura de Admin", + "mgmt.config.apiTokens.permAdmin": "Admin", + "mgmt.config.apiTokens.permUsersRead": "Leitura de Usuários", + "mgmt.config.apiTokens.permUsers": "Usuários", + "mgmt.config.apiTokens.permResourcesRead": "Leitura de Recursos", + "mgmt.config.apiTokens.permResources": "Recursos", + "mgmt.config.apiTokens.permConfigRead": "Leitura de Configuração", + "mgmt.config.apiTokens.permConfig": "Configuração", + "mgmt.config.apiTokens.permUnknown": "Permissão {{id}}", + "mgmt.config.apiTokens.readOnly": "Apenas Leitura", + "mgmt.config.apiTokens.restrictToConstellation": "Restringir à rede Constellation", + "mgmt.config.apiTokens.tokenCreated": "Token Criado", + "mgmt.config.apiTokens.tokenName": "Nome do Token", + "mgmt.config.apiTokens.expiry": "Expiração", + "mgmt.config.apiTokens.expiryColumn": "Expira", + "mgmt.config.apiTokens.expiryNever": "Nunca", + "mgmt.config.apiTokens.expiry7Days": "7 dias", + "mgmt.config.apiTokens.expiry30Days": "30 dias", + "mgmt.config.apiTokens.expiry90Days": "90 dias", + "mgmt.config.apiTokens.expired": "Expirado", + "mgmt.config.general.internalBackupPasswordLabel": "Senha de Backup Interno do Cosmos", + "mgmt.config.general.internalBackupPasswordHelper": "Salve esta senha em um local seguro — ela não pode ser recuperada do repositório se perdida.", + "mgmt.constellation.setup.lighthouseInfo": "Isso é importante! Se você estiver atrás de CGNAT ou não desejar abrir nenhuma porta em seu servidor, desmarque esta opção!", + "mgmt.storage.mount.netDisk": "Este é um Disco de Rede", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Desativar cabeçalhos HTTP_* legados (desativa a duplicação de cabeçalhos X-* como equivalentes HTTP_X_*)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Cabeçalhos Extras", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Adicione cabeçalhos personalizados aos pedidos encaminhados para este alvo. Estes cabeçalhos sobrescreverão quaisquer cabeçalhos existentes com o mesmo nome. Você pode usar variáveis em valores: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Nome do Cabeçalho", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Valor do Cabeçalho", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Adicionar Cabeçalho", + "mgmt.backup.passwordTitle": "Senha", + "sudo.required": "Habilite privilégios de administrador com o botão no canto superior direito para usar esta função", + "mgmt.servapps.compose.credentialsRequired": "O editor Compose requer acesso às credenciais do contêiner (variáveis de ambiente, segredos). Por favor, ative os privilégios de administrador usando o botão no canto superior direito para visualizar e editar a configuração do Compose.", + "mgmt.servapps.compose.credentialsDenied": "O editor Compose requer acesso às credenciais do contêiner (variáveis de ambiente, segredos). Seu papel atual não tem permissão para visualizar as credenciais." } \ No newline at end of file diff --git a/client/src/utils/locales/ru/translation.json b/client/src/utils/locales/ru/translation.json index 4c63285c..6a6b9177 100644 --- a/client/src/utils/locales/ru/translation.json +++ b/client/src/utils/locales/ru/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Тип лицензии: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Лицензия истекла {{date}}", "mgmt.config.general.licenceInput.licenseInvalid": "Недействительная лицензия: похоже, она была скопирована неправильно или вы скопировали неверное значение.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Недействительная подпись лицензии: не удалось проверить подлинность, вы правильно скопировали лицензию полностью?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Недействительная подпись лицензии: не удалось проверить подлинность, вы правильно скопировали лицензию полностью?", + "global.active": "Активный", + "global.role": "Роль", + "global.copy": "Копировать", + "global.show": "Показать", + "global.hide": "Скрыть", + "global.copied": "Скопировано!", + "global.done": "Готово", + "global.moveToBottom": "Переместить в Низ", + "global.moveToTop": "Переместить в Верх", + "global.monitor": "Монитор", + "global.none": "Нет", + "global.owner": "Владелец", + "global.permissions": "Разрешения", + "mgmt.config.apiTokens.copyWarning": "Скопируйте этот токен сейчас. Он больше не будет показан.", + "mgmt.config.apiTokens.createTitle": "Создать API Токен", + "mgmt.config.apiTokens.deleteConfirm": "Вы уверены, что хотите удалить токен \"{{name}}\"?", + "mgmt.config.apiTokens.events": "События — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Полный доступ", + "mgmt.config.apiTokens.ipWhitelist": "Белый список IP (разделяются запятыми)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Оставьте пустым, чтобы разрешить все IP-адреса", + "mgmt.config.apiTokens.newToken": "Новый токен", + "mgmt.config.apiTokens.noTokens": "API токены пока не созданы.", + "mgmt.config.apiTokens.permAdminRead": "Чтение Администратора", + "mgmt.config.apiTokens.permAdmin": "Администратор", + "mgmt.config.apiTokens.permUsersRead": "Чтение Пользователей", + "mgmt.config.apiTokens.permUsers": "Пользователи", + "mgmt.config.apiTokens.permResourcesRead": "Чтение Ресурсов", + "mgmt.config.apiTokens.permResources": "Ресурсы", + "mgmt.config.apiTokens.permConfigRead": "Чтение Конфигурации", + "mgmt.config.apiTokens.permConfig": "Конфигурация", + "mgmt.config.apiTokens.permUnknown": "Разрешение {{id}}", + "mgmt.config.apiTokens.readOnly": "Только чтение", + "mgmt.config.apiTokens.restrictToConstellation": "Ограничить сетью Constellation", + "mgmt.config.apiTokens.tokenCreated": "Токен Создан", + "mgmt.config.apiTokens.tokenName": "Имя Токена", + "mgmt.config.apiTokens.expiry": "Истечение", + "mgmt.config.apiTokens.expiryColumn": "Истекает", + "mgmt.config.apiTokens.expiryNever": "Никогда", + "mgmt.config.apiTokens.expiry7Days": "7 дней", + "mgmt.config.apiTokens.expiry30Days": "30 дней", + "mgmt.config.apiTokens.expiry90Days": "90 дней", + "mgmt.config.apiTokens.expired": "Истек", + "mgmt.config.general.internalBackupPasswordLabel": "Пароль Внутренней Резервной Копии Cosmos", + "mgmt.config.general.internalBackupPasswordHelper": "Сохраните этот пароль в безопасном месте — его невозможно восстановить из репозитория, если он утерян.", + "mgmt.constellation.setup.lighthouseInfo": "Это важно! Если вы за NAT или не хотите открывать порты на вашем сервере, снимите этот флажок!", + "mgmt.storage.mount.netDisk": "Это Сетевой Диск", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Отключить устаревшие HTTP_* заголовки (отключает дублирование X-* заголовков как HTTP_X_* эквивалентов)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Дополнительные Заголовки", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Добавьте пользовательские заголовки к запросам, пересылаемым на эту цель. Эти заголовки заменят любые существующие заголовки с тем же именем. Вы можете использовать переменные в значениях: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Имя Заголовка", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Значение заголовка", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Добавить заголовок", + "mgmt.backup.passwordTitle": "Пароль", + "sudo.required": "Включите привилегии администратора с помощью кнопки в правом верхнем углу, чтобы использовать эту функцию", + "mgmt.servapps.compose.credentialsRequired": "Редактор Compose требует доступа к учетным данным контейнера (переменные окружения, секреты). Пожалуйста, включите привилегии администратора, используя кнопку в правом верхнем углу, чтобы просматривать и изменять конфигурацию Compose.", + "mgmt.servapps.compose.credentialsDenied": "Редактор Compose требует доступа к учетным данным контейнера (переменные окружения, секреты). Ваша текущая роль не имеет разрешения на просмотр учетных данных." } \ No newline at end of file diff --git a/client/src/utils/locales/tr/translation.json b/client/src/utils/locales/tr/translation.json index 35dd5f08..48ea54ba 100644 --- a/client/src/utils/locales/tr/translation.json +++ b/client/src/utils/locales/tr/translation.json @@ -1075,5 +1075,61 @@ "mgmt.config.general.licenceInput.licenseType": "Lisans Türü: {{type}}", "mgmt.config.general.licenceInput.licenseExpired": "Lisans {{date}} tarihinde sona erdi", "mgmt.config.general.licenceInput.licenseInvalid": "Geçersiz lisans: doğru kopyalanmamış gibi görünüyor veya yanlış değeri kopyalamışsınız.", - "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Geçersiz lisans imzası: Gerçekliği doğrulamanın mümkün olmadığı, lisansı doğru bir şekilde tamamıyla kopyaladınız mı?" + "mgmt.config.general.licenceInput.licenseSignatureInvalid": "Geçersiz lisans imzası: Gerçekliği doğrulamanın mümkün olmadığı, lisansı doğru bir şekilde tamamıyla kopyaladınız mı?", + "global.active": "Aktif", + "global.role": "Rol", + "global.copy": "Kopyala", + "global.show": "Göster", + "global.hide": "Gizle", + "global.copied": "Kopyalandı!", + "global.done": "Tamamlandı", + "global.moveToBottom": "En Alta Taşı", + "global.moveToTop": "En Üste Taşı", + "global.monitor": "Monitör", + "global.none": "Yok", + "global.owner": "Sahip", + "global.permissions": "İzinler", + "mgmt.config.apiTokens.copyWarning": "Bu belirteci şimdi kopyalayın. Bir daha gösterilmeyecek.", + "mgmt.config.apiTokens.createTitle": "API Belirteci Oluştur", + "mgmt.config.apiTokens.deleteConfirm": "\"{{name}}\" adlı belirteci silmek istediğinizden emin misiniz?", + "mgmt.config.apiTokens.events": "Olaylar — {{name}}", + "mgmt.config.apiTokens.fullAccess": "Tam Erişim", + "mgmt.config.apiTokens.ipWhitelist": "IP Beyaz Listesi (virgülle ayrılmış)", + "mgmt.config.apiTokens.ipWhitelistHelper": "Tüm IP'leri izin vermek için boş bırakın", + "mgmt.config.apiTokens.newToken": "Yeni Belirteç", + "mgmt.config.apiTokens.noTokens": "Henüz oluşturulmuş API belirteci yok.", + "mgmt.config.apiTokens.permAdminRead": "Yönetici Okuma", + "mgmt.config.apiTokens.permAdmin": "Yönetici", + "mgmt.config.apiTokens.permUsersRead": "Kullanıcılar Okuma", + "mgmt.config.apiTokens.permUsers": "Kullanıcılar", + "mgmt.config.apiTokens.permResourcesRead": "Kaynaklar Okuma", + "mgmt.config.apiTokens.permResources": "Kaynaklar", + "mgmt.config.apiTokens.permConfigRead": "Yapılandırma Okuma", + "mgmt.config.apiTokens.permConfig": "Yapılandırma", + "mgmt.config.apiTokens.permUnknown": "İzin {{id}}", + "mgmt.config.apiTokens.readOnly": "Salt Okunur", + "mgmt.config.apiTokens.restrictToConstellation": "Takımyıldız ağına kısıtla", + "mgmt.config.apiTokens.tokenCreated": "Belirteç Oluşturuldu", + "mgmt.config.apiTokens.tokenName": "Belirteç Adı", + "mgmt.config.apiTokens.expiry": "Son Kullanma", + "mgmt.config.apiTokens.expiryColumn": "Sona Eriyor", + "mgmt.config.apiTokens.expiryNever": "Asla", + "mgmt.config.apiTokens.expiry7Days": "7 gün", + "mgmt.config.apiTokens.expiry30Days": "30 gün", + "mgmt.config.apiTokens.expiry90Days": "90 gün", + "mgmt.config.apiTokens.expired": "Süresi Doldu", + "mgmt.config.general.internalBackupPasswordLabel": "Cosmos Dahili Yedekleme Şifresi", + "mgmt.config.general.internalBackupPasswordHelper": "Bu şifreyi güvenli bir yere kaydedin — kaybolursa depodan kurtarılamaz.", + "mgmt.constellation.setup.lighthouseInfo": "Bu önemlidir! Eğer CGNAT arkasında iseniz veya sunucunuzda herhangi bir portu açmak istemiyorsanız, bunu işaretlemeyin!", + "mgmt.storage.mount.netDisk": "Bu Bir Ağ Diski", + "mgmt.urls.edit.advancedSettings.disableLegacyHTTPHeaders": "Eski HTTP_* başlıklarını devre dışı bırak (X-* başlıklarını HTTP_X_* eşdeğerleri olarak çoğaltmayı devre dışı bırakır)", + "mgmt.urls.edit.advancedSettings.extraHeaders.title": "Ekstra Başlıklar", + "mgmt.urls.edit.advancedSettings.extraHeaders.info": "Bu hedefe yönlendirilen istekler için özel başlıklar ekleyin. Bu başlıklar, aynı adı taşıyan mevcut başlıkların yerini alacaktır. Değerlerde değişkenler kullanabilirsiniz: $target, $scheme, $host, $origin, $clientIP, $user, $route, $path.", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerName": "Başlık Adı", + "mgmt.urls.edit.advancedSettings.extraHeaders.headerValue": "Başlık Değeri", + "mgmt.urls.edit.advancedSettings.extraHeaders.add": "Başlık Ekle", + "mgmt.backup.passwordTitle": "Şifre", + "sudo.required": "Bu işlevi kullanmak için sağ üstteki düğmeyle Yönetici ayrıcalıklarını etkinleştirin", + "mgmt.servapps.compose.credentialsRequired": "Compose düzenleyici, konteyner kimlik bilgilerine (çevresel değişkenler, gizli bilgiler) erişim gerektirir. Compose yapılandırmasını görüntülemek ve düzenlemek için sağ üstteki düğmeyle Yönetici ayrıcalıklarını etkinleştirin.", + "mgmt.servapps.compose.credentialsDenied": "Compose düzenleyici, konteyner kimlik bilgilerine (çevresel değişkenler, gizli bilgiler) erişim gerektirir. Mevcut rolünüz, kimlik bilgilerini görüntüleme iznine sahip değil." } \ No newline at end of file diff --git a/go-sdk/client.gen.go b/go-sdk/client.gen.go index 283b4ad2..d7ddbdf4 100644 --- a/go-sdk/client.gen.go +++ b/go-sdk/client.gen.go @@ -24742,162 +24742,162 @@ var swaggerSpec = []string{ "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", - "ZIIO3g0OI6PTHnz7/O3/DwAA//8EJ0vMZpYCAA==", + "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", + "AJmgg3eDw8jotAffPn/7/wMAAP//pRfzk2eWAgA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/go-sdk/version.go b/go-sdk/version.go index 9b79ad38..12ad210b 100644 --- a/go-sdk/version.go +++ b/go-sdk/version.go @@ -1,4 +1,4 @@ package cosmossdk // Version is the SDK version, synced with Cosmos Server at build time. -const Version = "0.22.9" +const Version = "0.22.10" diff --git a/package.json b/package.json index 973d979c..43973fa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cosmos-server", - "version": "0.22.9", + "version": "0.22.10", "description": "", "main": "test-server.js", "bugs": { diff --git a/src/backups/API.go b/src/backups/API.go index 320e2cc8..c61299c6 100644 --- a/src/backups/API.go +++ b/src/backups/API.go @@ -384,7 +384,7 @@ func ListSnapshotsRoute(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var outputJSON []map[string]interface{} - if err := json.Unmarshal([]byte(output), &outputJSON); err != nil { + if err := json.Unmarshal([]byte(SplitJSONObjects(output)), &outputJSON); err != nil { utils.Error("ListSnapshots: Failed to parse snapshots", err) utils.HTTPError(w, "Failed to parse snapshots: "+err.Error(), http.StatusInternalServerError, "BCK007") return @@ -503,7 +503,7 @@ func RestoreBackupRoute(w http.ResponseWriter, req *http.Request) { } var snapshotsArray []map[string]interface{} - if err := json.Unmarshal([]byte(snapshots), &snapshotsArray); err != nil { + if err := json.Unmarshal([]byte(SplitJSONObjects(snapshots)), &snapshotsArray); err != nil { utils.Error("RestoreBackup: Failed to parse snapshots", err) utils.HTTPError(w, "Failed to parse snapshots: "+err.Error(), http.StatusInternalServerError, "BCK010") return @@ -578,7 +578,7 @@ func ListSnapshotsRouteFromRepo(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var outputJSON []map[string]interface{} - if err := json.Unmarshal([]byte(output), &outputJSON); err != nil { + if err := json.Unmarshal([]byte(SplitJSONObjects(output)), &outputJSON); err != nil { utils.Error("ListSnapshots: Failed to parse snapshots", err) utils.HTTPError(w, "Failed to parse snapshots: "+err.Error(), http.StatusInternalServerError, "BCK007") return diff --git a/src/backups/index.go b/src/backups/index.go index 75a2c647..c9b6776b 100644 --- a/src/backups/index.go +++ b/src/backups/index.go @@ -57,6 +57,8 @@ func InitBackups() { utils.Log("[Backup] Password not found. Creating one") password = utils.GenerateRandomString(16) CreateRepository(internalBackup, password) + } else { + logBackupPassword("recover-internal", internalBackup, password) } diff --git a/src/backups/restic.go b/src/backups/restic.go index 858b9d04..d7a17b9c 100644 --- a/src/backups/restic.go +++ b/src/backups/restic.go @@ -266,9 +266,32 @@ func CreateRepository(repository, password string) error { if !strings.Contains(output, "created restic repository") { return fmt.Errorf("[Restic] failed to create repository: %s", output) } + + logBackupPassword("create", repository, password) return nil } +// logBackupPassword appends a human-readable entry to the backup password +// recovery log so the user can manually recover passwords if the main +// config ever loses them. The file is chmod 0600 and lives next to the +// main config. +func logBackupPassword(action, repository, password string) { + path := utils.CONFIGFOLDER + "backup-passwords.log" + line := fmt.Sprintf("%s | action=%s | repository=%s | password=%s\n", + time.Now().UTC().Format(time.RFC3339), action, repository, password) + + f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) + if err != nil { + utils.Error("[Restic] failed to open backup password log", err) + return + } + defer f.Close() + + if _, err := f.WriteString(line); err != nil { + utils.Error("[Restic] failed to write backup password log", err) + } +} + // DeleteRepository removes a Restic repository func DeleteRepository(repository string) error { // if repo starts with rclone: @@ -322,6 +345,8 @@ func EditRepositoryPassword(repository, currentPassword, newPassword string) err if !strings.Contains(output, "changed password") { return fmt.Errorf("[Restic] failed to change password: %s", output) } + + logBackupPassword("edit", repository, newPassword) return nil } diff --git a/src/configapi/get.go b/src/configapi/get.go index 5c1643d6..9df6a93c 100644 --- a/src/configapi/get.go +++ b/src/configapi/get.go @@ -43,6 +43,13 @@ func ConfigApiGet(w http.ResponseWriter, req *http.Request) { config.HTTPConfig.DNSChallengeConfig = map[string]string{} config.Licence = "***" config.ServerToken = "***" + + for name, b := range config.Backup.Backups { + if b.Password != "" { + b.Password = "***" + config.Backup.Backups[name] = b + } + } } if !isAdmin { diff --git a/src/configapi/set.go b/src/configapi/set.go index 54689d63..bd1c76f2 100644 --- a/src/configapi/set.go +++ b/src/configapi/set.go @@ -86,6 +86,20 @@ func ConfigApiSet(w http.ResponseWriter, req *http.Request) { request.ServerToken = config.ServerToken } + // restore backup passwords. Users without PERM_CREDENTIALS_READ can never + // set a password — always restore from existing config. Otherwise only + // restore when the value is missing or masked, so the settings UI + // round-trip doesn't wipe it. + for name, b := range request.Backup.Backups { + shouldRestore := !canReadCredentials || b.Password == "" || b.Password == "***" + if shouldRestore { + if existing, ok := config.Backup.Backups[name]; ok && existing.Password != "" { + b.Password = existing.Password + request.Backup.Backups[name] = b + } + } + } + utils.SetBaseMainConfig(request) utils.TriggerEvent( diff --git a/src/constellation/NATS.go b/src/constellation/NATS.go index 1382c03f..a5472ad4 100644 --- a/src/constellation/NATS.go +++ b/src/constellation/NATS.go @@ -231,13 +231,10 @@ func StartNATS() { utils.Debug("[NATS] Cluster IP: " + cip.String()) } - // if only one, abort - if (len(cips) == 0) { - utils.Warn("[NATS] No cluster IPs found, NATS server will not start") - utils.Debug("[NATS] Current cached devices: ") - for _, d := range cips { - utils.Debug("[NATS] Device: " + d.String()) - } + // Abort if this server has no peer lighthouses — a single-node NATS cluster + // cannot form a JetStream quorum and every downstream op spams errors. + if IsConstellationStandalone() { + utils.Warn("[NATS] Constellation has no peer lighthouses, NATS server will not start") return } @@ -496,6 +493,28 @@ func IsClientConnected() bool { return nc.IsConnected() } +// IsConstellationStandalone reports whether this server has no peer lighthouses +// to cluster with over NATS. When true, all NATS-adjacent activity must be +// skipped — a single-node NATS cluster cannot form a JetStream quorum and +// every downstream operation spams errors. +func IsConstellationStandalone() bool { + if !utils.GetMainConfig().ConstellationConfig.Enabled { + return true + } + myIP, err := GetCurrentDeviceIP() + if err != nil { + utils.Fatal("[NATS] Failed to get current device IP", err) + return false + } + cips, _ := GetClusterIPs() + for _, u := range cips { + if u.Hostname() != myIP { + return false + } + } + return true +} + func CloseNATSClient() { utils.Log("Closing NATS client...") @@ -517,6 +536,11 @@ func CloseNATSClient() { } func SendNATSMessage(topic string, payload string) (string, error) { + if IsConstellationStandalone() { + utils.Debug("[MQ] Skipping send on standalone constellation: " + topic) + return "", nil + } + if !IsClientConnected() { utils.Warn("NATS client not connected") err := InitNATSClient() @@ -540,6 +564,11 @@ func SendNATSMessage(topic string, payload string) (string, error) { } func SendNATSMessageAllReply(topic string, payload string, timeout time.Duration, callback func(response string)) error { + if IsConstellationStandalone() { + utils.Debug("[MQ] Skipping send-all on standalone constellation: " + topic) + return nil + } + if !IsClientConnected() { utils.Warn("NATS client not connected") err := InitNATSClient() @@ -578,6 +607,11 @@ func SendNATSMessageAllReply(topic string, payload string, timeout time.Duration } func PublishNATSMessage(topic string, payload string) error { + if IsConstellationStandalone() { + utils.Debug("[MQ] Skipping publish on standalone constellation: " + topic) + return nil + } + if !IsClientConnected() { utils.Warn("NATS client not connected") err := InitNATSClient() @@ -610,6 +644,10 @@ func MasterNATSClientRouter() { } func PingNATSClient() bool { + if IsConstellationStandalone() { + return true + } + response, err := SendNATSMessage("cosmos._global_.ping", "Ping") if err != nil { utils.Error("[NATS] Error pinging NATS client", err) diff --git a/src/constellation/sync.go b/src/constellation/sync.go index 3aacb671..c531c894 100644 --- a/src/constellation/sync.go +++ b/src/constellation/sync.go @@ -310,6 +310,10 @@ func SendNewDBSyncMessage() { return } + if IsConstellationStandalone() { + return + } + utils.Log("Constellation: SendNewDBSyncMessage: sending sync payload") payload := MakeSyncPayload("") diff --git a/src/constellation/tunnels.go b/src/constellation/tunnels.go index b8e2e1b4..d3dee85e 100644 --- a/src/constellation/tunnels.go +++ b/src/constellation/tunnels.go @@ -279,9 +279,13 @@ var heartbeatStopChan chan struct{} var heartbeatTicker *time.Ticker func UpdateLocalTunnelCache() { + if IsConstellationStandalone() { + return + } + localTunnelCacheMutex.Lock() defer localTunnelCacheMutex.Unlock() - + currentDeviceName, err := GetCurrentDeviceName() if err != nil { utils.Warn("[constellation] Failed to get current device name for tunnel cache update: " + err.Error()) @@ -397,7 +401,11 @@ func GetLocalTunnelCache() []utils.ConstellationTunnel { if !utils.GetMainConfig().ConstellationConfig.Enabled { return []utils.ConstellationTunnel{} } - + + if IsConstellationStandalone() { + return []utils.ConstellationTunnel{} + } + isLB, err := GetCurrentDeviceIsLoadbalancer() if err != nil { utils.Debug("[constellation] Failed to get current device load balancer status for tunnel cache retrieval " + err.Error()) diff --git a/src/index.go b/src/index.go index aff2506b..40ef8a74 100644 --- a/src/index.go +++ b/src/index.go @@ -202,7 +202,7 @@ func main() { } // @title Cosmos Server API -// @version 0.22.9 +// @version 0.22.10 // @description REST API for Cosmos Cloud server management // @BasePath /cosmos // @securityDefinitions.apikey BearerAuth