diff --git a/api/analytic/analytic.go b/api/analytic/analytic.go index 60158b68b..3551cf5cc 100644 --- a/api/analytic/analytic.go +++ b/api/analytic/analytic.go @@ -3,6 +3,7 @@ package analytic import ( "fmt" "github.com/0xJacky/Nginx-UI/internal/analytic" + "github.com/0xJacky/Nginx-UI/internal/helper" "github.com/0xJacky/Nginx-UI/internal/logger" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/host" @@ -75,10 +76,7 @@ func Analytic(c *gin.Context) { // write err = ws.WriteJSON(stat) - if err != nil || websocket.IsUnexpectedCloseError(err, - websocket.CloseGoingAway, - websocket.CloseNoStatusReceived, - websocket.CloseNormalClosure) { + if helper.IsUnexpectedWebsocketError(err) { logger.Error(err) break } diff --git a/api/analytic/nodes.go b/api/analytic/nodes.go index 313b3c05b..b880991ca 100644 --- a/api/analytic/nodes.go +++ b/api/analytic/nodes.go @@ -2,6 +2,7 @@ package analytic import ( "github.com/0xJacky/Nginx-UI/internal/analytic" + "github.com/0xJacky/Nginx-UI/internal/helper" "github.com/0xJacky/Nginx-UI/internal/logger" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" @@ -27,10 +28,7 @@ func GetNodeStat(c *gin.Context) { for { // write err = ws.WriteJSON(analytic.GetNodeStat()) - if err != nil || websocket.IsUnexpectedCloseError(err, - websocket.CloseGoingAway, - websocket.CloseNoStatusReceived, - websocket.CloseNormalClosure) { + if helper.IsUnexpectedWebsocketError(err) { logger.Error(err) break } @@ -57,10 +55,7 @@ func GetNodesAnalytic(c *gin.Context) { for { // write err = ws.WriteJSON(analytic.NodeMap) - if err != nil || websocket.IsUnexpectedCloseError(err, - websocket.CloseGoingAway, - websocket.CloseNoStatusReceived, - websocket.CloseNormalClosure) { + if helper.IsUnexpectedWebsocketError(err) { logger.Error(err) break } diff --git a/api/certificate/issue.go b/api/certificate/issue.go index b631c6422..367248328 100644 --- a/api/certificate/issue.go +++ b/api/certificate/issue.go @@ -32,14 +32,12 @@ func handleIssueCertLogChan(conn *websocket.Conn, log *cert.Logger, logChan chan }() for logString := range logChan { - log.Info(logString) err := conn.WriteJSON(IssueCertResponse{ Status: Info, Message: logString, }) - if err != nil { logger.Error(err) return @@ -110,7 +108,6 @@ func IssueCert(c *gin.Context) { Status: Error, Message: err.Error(), }) - if err != nil { logger.Error(err) return @@ -132,7 +129,7 @@ func IssueCert(c *gin.Context) { if err != nil { logger.Error(err) - err = ws.WriteJSON(IssueCertResponse{ + _ = ws.WriteJSON(IssueCertResponse{ Status: Error, Message: err.Error(), }) @@ -149,7 +146,6 @@ func IssueCert(c *gin.Context) { SSLCertificateKey: payload.GetCertificateKeyPath(), KeyType: payload.GetKeyType(), }) - if err != nil { logger.Error(err) return diff --git a/api/settings/auth.go b/api/settings/auth.go new file mode 100644 index 000000000..1fa9144e4 --- /dev/null +++ b/api/settings/auth.go @@ -0,0 +1,45 @@ +package settings + +import ( + "github.com/0xJacky/Nginx-UI/api" + "github.com/0xJacky/Nginx-UI/query" + "github.com/0xJacky/Nginx-UI/settings" + "github.com/gin-gonic/gin" + "net/http" + "time" +) + +func GetBanLoginIP(c *gin.Context) { + b := query.BanIP + + // clear expired banned IPs + _, _ = b.Where(b.ExpiredAt.Lte(time.Now().Unix())).Delete() + + banIps, err := b.Where( + b.ExpiredAt.Gte(time.Now().Unix()), + b.Attempts.Gte(settings.AuthSettings.MaxAttempts)).Find() + if err != nil { + api.ErrHandler(c, err) + return + } + c.JSON(http.StatusOK, banIps) +} + +func RemoveBannedIP(c *gin.Context) { + var json struct { + IP string `json:"ip"` + } + if !api.BindAndValid(c, &json) { + return + } + + b := query.BanIP + _, err := b.Where(b.IP.Eq(json.IP)).Delete() + + if err != nil { + api.ErrHandler(c, err) + return + } + + c.JSON(http.StatusNoContent, nil) +} diff --git a/api/settings/router.go b/api/settings/router.go new file mode 100644 index 000000000..c74eb48d5 --- /dev/null +++ b/api/settings/router.go @@ -0,0 +1,14 @@ +package settings + +import ( + "github.com/gin-gonic/gin" +) + +func InitRouter(r *gin.RouterGroup) { + r.GET("settings/server/name", GetServerName) + r.GET("settings", GetSettings) + r.POST("settings", SaveSettings) + + r.GET("settings/auth/banned_ips", GetBanLoginIP) + r.DELETE("settings/auth/banned_ip", RemoveBannedIP) +} diff --git a/api/system/settings.go b/api/settings/settings.go similarity index 89% rename from api/system/settings.go rename to api/settings/settings.go index ea7f8c7cf..eee5e5305 100644 --- a/api/system/settings.go +++ b/api/settings/settings.go @@ -1,4 +1,4 @@ -package system +package settings import ( "github.com/0xJacky/Nginx-UI/api" @@ -20,6 +20,7 @@ func GetSettings(c *gin.Context) { "nginx": settings.NginxSettings, "openai": settings.OpenAISettings, "logrotate": settings.LogrotateSettings, + "auth": settings.AuthSettings, }) } @@ -29,6 +30,7 @@ func SaveSettings(c *gin.Context) { Nginx settings.Nginx `json:"nginx"` Openai settings.OpenAI `json:"openai"` Logrotate settings.Logrotate `json:"logrotate"` + Auth settings.Auth `json:"auth"` } if !api.BindAndValid(c, &json) { @@ -44,6 +46,7 @@ func SaveSettings(c *gin.Context) { settings.ProtectedFill(&settings.NginxSettings, &json.Nginx) settings.ProtectedFill(&settings.OpenAISettings, &json.Openai) settings.ProtectedFill(&settings.LogrotateSettings, &json.Logrotate) + settings.ProtectedFill(&settings.AuthSettings, &json.Auth) err := settings.Save() if err != nil { diff --git a/api/system/router.go b/api/system/router.go index df536442d..728c45500 100644 --- a/api/system/router.go +++ b/api/system/router.go @@ -1,21 +1,17 @@ package system import ( - "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin" ) func InitPublicRouter(r *gin.RouterGroup) { - r.GET("install", InstallLockCheck) - r.POST("install", InstallNginxUI) - r.GET("translation/:code", GetTranslation) + r.GET("install", InstallLockCheck) + r.POST("install", InstallNginxUI) + r.GET("translation/:code", GetTranslation) } func InitPrivateRouter(r *gin.RouterGroup) { - r.GET("settings/server/name", GetServerName) - r.GET("settings", GetSettings) - r.POST("settings", SaveSettings) - - r.GET("upgrade/release", GetRelease) - r.GET("upgrade/current", GetCurrentVersion) - r.GET("upgrade/perform", PerformCoreUpgrade) + r.GET("upgrade/release", GetRelease) + r.GET("upgrade/current", GetCurrentVersion) + r.GET("upgrade/perform", PerformCoreUpgrade) } diff --git a/api/system/upgrade.go b/api/system/upgrade.go index 83de6ab3b..131572d2f 100644 --- a/api/system/upgrade.go +++ b/api/system/upgrade.go @@ -41,6 +41,18 @@ func GetCurrentVersion(c *gin.Context) { c.JSON(http.StatusOK, curVer) } +const ( + UpgradeStatusInfo = "info" + UpgradeStatusError = "error" + UpgradeStatusProgress = "progress" +) + +type CoreUpgradeResp struct { + Status string `json:"status"` + Progress float64 `json:"progress"` + Message string `json:"message"` +} + func PerformCoreUpgrade(c *gin.Context) { var upGrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { @@ -67,49 +79,48 @@ func PerformCoreUpgrade(c *gin.Context) { return } - _ = ws.WriteJSON(gin.H{ - "status": "info", - "message": "Initialing core upgrader", + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusInfo, + Message: "Initialing core upgrader", }) u, err := upgrader.NewUpgrader(control.Channel) if err != nil { - _ = ws.WriteJSON(gin.H{ - "status": "error", - "message": "Initial core upgrader error", + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusError, + Message: "Initial core upgrader error", }) - _ = ws.WriteJSON(gin.H{ - "status": "error", - "message": err.Error(), + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusError, + Message: err.Error(), }) logger.Error(err) return } - _ = ws.WriteJSON(gin.H{ - "status": "info", - "message": "Downloading latest release", + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusInfo, + Message: "Downloading latest release", }) progressChan := make(chan float64) go func() { for progress := range progressChan { - _ = ws.WriteJSON(gin.H{ - "status": "progress", - "progress": progress, + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusProgress, + Progress: progress, }) } }() tarName, err := u.DownloadLatestRelease(progressChan) - if err != nil { - _ = ws.WriteJSON(gin.H{ - "status": "error", - "message": "Download latest release error", + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusError, + Message: "Download latest release error", }) - _ = ws.WriteJSON(gin.H{ - "status": "error", - "message": err.Error(), + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusError, + Message: err.Error(), }) logger.Error(err) return @@ -119,9 +130,9 @@ func PerformCoreUpgrade(c *gin.Context) { _ = os.Remove(tarName) _ = os.Remove(tarName + ".digest") }() - _ = ws.WriteJSON(gin.H{ - "status": "info", - "message": "Performing core upgrade", + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusInfo, + Message: "Performing core upgrade", }) // dry run if control.DryRun || settings.ServerSettings.Demo { @@ -132,13 +143,13 @@ func PerformCoreUpgrade(c *gin.Context) { // bye, overseer will restart nginx-ui err = u.PerformCoreUpgrade(u.ExPath, tarName) if err != nil { - _ = ws.WriteJSON(gin.H{ - "status": "error", - "message": "Perform core upgrade error", + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusError, + Message: "Perform core upgrade error", }) - _ = ws.WriteJSON(gin.H{ - "status": "error", - "message": err.Error(), + _ = ws.WriteJSON(CoreUpgradeResp{ + Status: UpgradeStatusError, + Message: err.Error(), }) logger.Error(err) return diff --git a/api/upstream/upstream.go b/api/upstream/upstream.go index e6874213c..0839b10bb 100644 --- a/api/upstream/upstream.go +++ b/api/upstream/upstream.go @@ -1,6 +1,7 @@ package upstream import ( + "github.com/0xJacky/Nginx-UI/internal/helper" "github.com/0xJacky/Nginx-UI/internal/logger" "github.com/0xJacky/Nginx-UI/internal/upstream" "github.com/gin-gonic/gin" @@ -35,11 +36,7 @@ func AvailabilityTest(c *gin.Context) { for { err = ws.WriteJSON(upstream.AvailabilityTest(body)) - - if err != nil || websocket.IsUnexpectedCloseError(err, - websocket.CloseGoingAway, - websocket.CloseNoStatusReceived, - websocket.CloseNormalClosure) { + if helper.IsUnexpectedWebsocketError(err) { logger.Error(err) break } diff --git a/api/user/auth.go b/api/user/auth.go index 2d728b02e..82feef408 100644 --- a/api/user/auth.go +++ b/api/user/auth.go @@ -2,45 +2,92 @@ package user import ( "github.com/0xJacky/Nginx-UI/api" - "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/internal/logger" + "github.com/0xJacky/Nginx-UI/internal/user" + "github.com/0xJacky/Nginx-UI/query" + "github.com/0xJacky/Nginx-UI/settings" + "github.com/gin-gonic/gin" + "github.com/pkg/errors" "net/http" + "sync" "time" - - "github.com/gin-gonic/gin" - "golang.org/x/crypto/bcrypt" ) +var mutex = &sync.Mutex{} + type LoginUser struct { Name string `json:"name" binding:"required,max=255"` Password string `json:"password" binding:"required,max=255"` } +const ( + ErrPasswordIncorrect = 4031 + ErrMaxAttempts = 4291 + ErrUserBanned = 4033 +) + type LoginResponse struct { Message string `json:"message"` - Token string `json:"token"` + Error string `json:"error,omitempty"` + Code int `json:"code"` + Token string `json:"token,omitempty"` } func Login(c *gin.Context) { - var user LoginUser - ok := api.BindAndValid(c, &user) - if !ok { + // make sure that only one request is processed at a time + mutex.Lock() + defer mutex.Unlock() + // check if the ip is banned + clientIP := c.ClientIP() + b := query.BanIP + banIP, _ := b.Where(b.IP.Eq(clientIP), + b.ExpiredAt.Gte(time.Now().Unix()), + b.Attempts.Gte(settings.AuthSettings.MaxAttempts), + ).Count() + + if banIP > 0 { + c.JSON(http.StatusTooManyRequests, LoginResponse{ + Message: "Max attempts", + Code: ErrMaxAttempts, + }) return } - u, _ := model.GetUser(user.Name) + var json LoginUser + ok := api.BindAndValid(c, &json) + if !ok { + return + } - if err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)); err != nil { - time.Sleep(5 * time.Second) - c.JSON(http.StatusForbidden, gin.H{ - "message": "The username or password is incorrect", - }) + u, err := user.Login(json.Name, json.Password) + if err != nil { + // time.Sleep(5 * time.Second) + switch { + case errors.Is(err, user.ErrPasswordIncorrect): + c.JSON(http.StatusForbidden, LoginResponse{ + Message: "Password incorrect", + Code: ErrPasswordIncorrect, + }) + case errors.Is(err, user.ErrUserBanned): + c.JSON(http.StatusForbidden, LoginResponse{ + Message: "The user is banned", + Code: ErrUserBanned, + }) + default: + api.ErrHandler(c, err) + } + user.BanIP(clientIP) return } - token, err := model.GenerateJWT(u.Name) + // login success, clear banned record + _, _ = b.Where(b.IP.Eq(clientIP)).Delete() + + logger.Info("[User Login]", u.Name) + token, err := user.GenerateJWT(u.Name) if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{ - "message": err.Error(), + c.JSON(http.StatusInternalServerError, LoginResponse{ + Message: err.Error(), }) return } @@ -54,7 +101,7 @@ func Login(c *gin.Context) { func Logout(c *gin.Context) { token := c.GetHeader("Authorization") if token != "" { - err := model.DeleteToken(token) + err := user.DeleteToken(token) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "message": err.Error(), diff --git a/api/user/casdoor.go b/api/user/casdoor.go index 26e49d07d..3fb105063 100644 --- a/api/user/casdoor.go +++ b/api/user/casdoor.go @@ -3,7 +3,7 @@ package user import ( "fmt" "github.com/0xJacky/Nginx-UI/api" - "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/internal/user" "github.com/0xJacky/Nginx-UI/settings" "github.com/casdoor/casdoor-go-sdk/casdoorsdk" "github.com/gin-gonic/gin" @@ -53,7 +53,7 @@ func CasdoorCallback(c *gin.Context) { return } - u, err := model.GetUser(claims.Name) + u, err := user.GetUser(claims.Name) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.JSON(http.StatusForbidden, gin.H{ @@ -65,7 +65,7 @@ func CasdoorCallback(c *gin.Context) { return } - userToken, err := model.GenerateJWT(u.Name) + userToken, err := user.GenerateJWT(u.Name) if err != nil { api.ErrHandler(c, err) return diff --git a/app/.eslintrc.cjs b/app/.eslintrc.cjs index 7c53c9696..bcc53524e 100644 --- a/app/.eslintrc.cjs +++ b/app/.eslintrc.cjs @@ -8,7 +8,6 @@ module.exports = { 'plugin:vue/vue3-recommended', 'plugin:import/recommended', 'plugin:import/typescript', - 'plugin:promise/recommended', 'plugin:sonarjs/recommended', 'plugin:@typescript-eslint/recommended', diff --git a/app/package.json b/app/package.json index 2057f9539..620bed04f 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "version": "2.0.0-beta.25", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --host", "typecheck": "vue-tsc --noEmit", "lint": "eslint . -c .eslintrc.cjs --fix --ext .ts,.vue,.tsx,.d.ts", "build": "vite build", @@ -13,17 +13,17 @@ "dependencies": { "@ant-design/icons-vue": "^7.0.1", "@formkit/auto-animate": "^0.8.2", - "@vue/reactivity": "^3.4.29", - "@vue/shared": "^3.4.29", + "@vue/reactivity": "^3.4.33", + "@vue/shared": "^3.4.33", "@vueuse/core": "^10.11.0", "@xterm/addon-attach": "^0.11.0", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", "ant-design-vue": "^4.2.3", - "apexcharts": "^3.49.1", + "apexcharts": "^3.50.0", "axios": "^1.7.2", - "dayjs": "^1.11.11", - "highlight.js": "^11.9.0", + "dayjs": "^1.11.12", + "highlight.js": "^11.10.0", "lodash": "^4.17.21", "marked": "^10.0.0", "nprogress": "^0.2.0", @@ -32,9 +32,9 @@ "reconnecting-websocket": "^4.4.0", "sortablejs": "^1.15.2", "vite-plugin-build-id": "^0.2.9", - "vue": "^3.4.29", + "vue": "^3.4.33", "vue-github-button": "github:0xJacky/vue-github-button", - "vue-router": "^4.3.3", + "vue-router": "^4.4.0", "vue3-ace-editor": "2.2.4", "vue3-apexcharts": "1.4.4", "vue3-gettext": "3.0.0-beta.4", @@ -42,16 +42,16 @@ }, "devDependencies": { "@antfu/eslint-config-vue": "^0.43.1", - "@types/lodash": "^4.17.5", + "@types/lodash": "^4.17.7", "@types/nprogress": "^0.2.3", "@types/sortablejs": "^1.15.8", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-vue": "^5.0.5", "@vitejs/plugin-vue-jsx": "^3.1.0", - "@vue/compiler-sfc": "^3.4.29", + "@vue/compiler-sfc": "^3.4.33", "@vue/tsconfig": "^0.5.1", - "ace-builds": "^1.35.0", + "ace-builds": "^1.35.3", "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-import-resolver-alias": "^1.1.2", @@ -59,15 +59,15 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-regex": "^1.10.0", "eslint-plugin-sonarjs": "^0.23.0", - "eslint-plugin-vue": "^9.26.0", + "eslint-plugin-vue": "^9.27.0", "less": "^4.2.0", - "postcss": "^8.4.38", - "tailwindcss": "^3.4.4", + "postcss": "^8.4.39", + "tailwindcss": "^3.4.6", "typescript": "5.3.3", - "unplugin-auto-import": "^0.17.6", + "unplugin-auto-import": "^0.17.8", "unplugin-vue-components": "^0.26.0", "unplugin-vue-define-options": "^1.4.5", - "vite": "^5.3.1", + "vite": "^5.3.4", "vite-svg-loader": "^5.1.0", "vue-tsc": "^1.8.27" }, diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index fdae1b9bb..4113a41a1 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -10,19 +10,19 @@ importers: dependencies: '@ant-design/icons-vue': specifier: ^7.0.1 - version: 7.0.1(vue@3.4.29(typescript@5.3.3)) + version: 7.0.1(vue@3.4.33(typescript@5.3.3)) '@formkit/auto-animate': specifier: ^0.8.2 version: 0.8.2 '@vue/reactivity': - specifier: ^3.4.29 - version: 3.4.29 + specifier: ^3.4.33 + version: 3.4.33 '@vue/shared': - specifier: ^3.4.29 - version: 3.4.29 + specifier: ^3.4.33 + version: 3.4.33 '@vueuse/core': specifier: ^10.11.0 - version: 10.11.0(vue@3.4.29(typescript@5.3.3)) + version: 10.11.0(vue@3.4.33(typescript@5.3.3)) '@xterm/addon-attach': specifier: ^0.11.0 version: 0.11.0(@xterm/xterm@5.5.0) @@ -34,19 +34,19 @@ importers: version: 5.5.0 ant-design-vue: specifier: ^4.2.3 - version: 4.2.3(vue@3.4.29(typescript@5.3.3)) + version: 4.2.3(vue@3.4.33(typescript@5.3.3)) apexcharts: - specifier: ^3.49.1 - version: 3.49.1 + specifier: ^3.50.0 + version: 3.50.0 axios: specifier: ^1.7.2 version: 1.7.2 dayjs: - specifier: ^1.11.11 - version: 1.11.11 + specifier: ^1.11.12 + version: 1.11.12 highlight.js: - specifier: ^11.9.0 - version: 11.9.0 + specifier: ^11.10.0 + version: 11.10.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -58,10 +58,10 @@ importers: version: 0.2.0 pinia: specifier: ^2.1.7 - version: 2.1.7(typescript@5.3.3)(vue@3.4.29(typescript@5.3.3)) + version: 2.1.7(typescript@5.3.3)(vue@3.4.33(typescript@5.3.3)) pinia-plugin-persistedstate: specifier: ^3.2.1 - version: 3.2.1(pinia@2.1.7(typescript@5.3.3)(vue@3.4.29(typescript@5.3.3))) + version: 3.2.1(pinia@2.1.7(typescript@5.3.3)(vue@3.4.33(typescript@5.3.3))) reconnecting-websocket: specifier: ^4.4.0 version: 4.4.0 @@ -72,33 +72,33 @@ importers: specifier: ^0.2.9 version: 0.2.9(less@4.2.0) vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.3.3) + specifier: ^3.4.33 + version: 3.4.33(typescript@5.3.3) vue-github-button: specifier: github:0xJacky/vue-github-button version: https://codeload.github.com/0xJacky/vue-github-button/tar.gz/fc3c93355a790d3249de6610de3ebe35949ee314 vue-router: - specifier: ^4.3.3 - version: 4.3.3(vue@3.4.29(typescript@5.3.3)) + specifier: ^4.4.0 + version: 4.4.0(vue@3.4.33(typescript@5.3.3)) vue3-ace-editor: specifier: 2.2.4 - version: 2.2.4(ace-builds@1.35.0)(vue@3.4.29(typescript@5.3.3)) + version: 2.2.4(ace-builds@1.35.3)(vue@3.4.33(typescript@5.3.3)) vue3-apexcharts: specifier: 1.4.4 - version: 1.4.4(apexcharts@3.49.1)(vue@3.4.29(typescript@5.3.3)) + version: 1.4.4(apexcharts@3.50.0)(vue@3.4.33(typescript@5.3.3)) vue3-gettext: specifier: 3.0.0-beta.4 - version: 3.0.0-beta.4(@vue/compiler-sfc@3.4.29)(typescript@5.3.3)(vue@3.4.29(typescript@5.3.3)) + version: 3.0.0-beta.4(@vue/compiler-sfc@3.4.33)(typescript@5.3.3)(vue@3.4.33(typescript@5.3.3)) vuedraggable: specifier: ^4.1.0 - version: 4.1.0(vue@3.4.29(typescript@5.3.3)) + version: 4.1.0(vue@3.4.33(typescript@5.3.3)) devDependencies: '@antfu/eslint-config-vue': specifier: ^0.43.1 version: 0.43.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0)(typescript@5.3.3) '@types/lodash': - specifier: ^4.17.5 - version: 4.17.5 + specifier: ^4.17.7 + version: 4.17.7 '@types/nprogress': specifier: ^0.2.3 version: 0.2.3 @@ -113,22 +113,22 @@ importers: version: 6.21.0(eslint@8.57.0)(typescript@5.3.3) '@vitejs/plugin-vue': specifier: ^5.0.5 - version: 5.0.5(vite@5.3.1(@types/node@20.14.2)(less@4.2.0))(vue@3.4.29(typescript@5.3.3)) + version: 5.0.5(vite@5.3.4(@types/node@20.14.11)(less@4.2.0))(vue@3.4.33(typescript@5.3.3)) '@vitejs/plugin-vue-jsx': specifier: ^3.1.0 - version: 3.1.0(vite@5.3.1(@types/node@20.14.2)(less@4.2.0))(vue@3.4.29(typescript@5.3.3)) + version: 3.1.0(vite@5.3.4(@types/node@20.14.11)(less@4.2.0))(vue@3.4.33(typescript@5.3.3)) '@vue/compiler-sfc': - specifier: ^3.4.29 - version: 3.4.29 + specifier: ^3.4.33 + version: 3.4.33 '@vue/tsconfig': specifier: ^0.5.1 version: 0.5.1 ace-builds: - specifier: ^1.35.0 - version: 1.35.0 + specifier: ^1.35.3 + version: 1.35.3 autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.39) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -148,35 +148,35 @@ importers: specifier: ^0.23.0 version: 0.23.0(eslint@8.57.0) eslint-plugin-vue: - specifier: ^9.26.0 - version: 9.26.0(eslint@8.57.0) + specifier: ^9.27.0 + version: 9.27.0(eslint@8.57.0) less: specifier: ^4.2.0 version: 4.2.0 postcss: - specifier: ^8.4.38 - version: 8.4.38 + specifier: ^8.4.39 + version: 8.4.39 tailwindcss: - specifier: ^3.4.4 - version: 3.4.4 + specifier: ^3.4.6 + version: 3.4.6 typescript: specifier: 5.3.3 version: 5.3.3 unplugin-auto-import: - specifier: ^0.17.6 - version: 0.17.6(@vueuse/core@10.11.0(vue@3.4.29(typescript@5.3.3)))(rollup@4.18.0) + specifier: ^0.17.8 + version: 0.17.8(@vueuse/core@10.11.0(vue@3.4.33(typescript@5.3.3)))(rollup@4.18.1) unplugin-vue-components: specifier: ^0.26.0 - version: 0.26.0(@babel/parser@7.24.7)(rollup@4.18.0)(vue@3.4.29(typescript@5.3.3)) + version: 0.26.0(@babel/parser@7.24.8)(rollup@4.18.1)(vue@3.4.33(typescript@5.3.3)) unplugin-vue-define-options: specifier: ^1.4.5 - version: 1.4.5(rollup@4.18.0)(vue@3.4.29(typescript@5.3.3)) + version: 1.4.5(rollup@4.18.1)(vue@3.4.33(typescript@5.3.3)) vite: - specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.2)(less@4.2.0) + specifier: ^5.3.4 + version: 5.3.4(@types/node@20.14.11)(less@4.2.0) vite-svg-loader: specifier: ^5.1.0 - version: 5.1.0(vue@3.4.29(typescript@5.3.3)) + version: 5.1.0(vue@3.4.33(typescript@5.3.3)) vue-tsc: specifier: ^1.8.27 version: 1.8.27(typescript@5.3.3) @@ -218,35 +218,35 @@ packages: peerDependencies: eslint: '>=7.4.0' - '@antfu/utils@0.7.8': - resolution: {integrity: sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==} + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} '@babel/code-frame@7.24.7': resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.7': - resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + '@babel/compat-data@7.24.9': + resolution: {integrity: sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.7': - resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + '@babel/core@7.24.9': + resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.7': - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + '@babel/generator@7.24.10': + resolution: {integrity: sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.24.7': - resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} + '@babel/helper-compilation-targets@7.24.8': + resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.24.7': - resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} + '@babel/helper-create-class-features-plugin@7.24.8': + resolution: {integrity: sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -263,8 +263,8 @@ packages: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.7': - resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.22.15': @@ -275,8 +275,8 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.7': - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + '@babel/helper-module-transforms@7.24.9': + resolution: {integrity: sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -285,8 +285,8 @@ packages: resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.7': - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} '@babel/helper-replace-supers@7.24.7': @@ -307,28 +307,28 @@ packages: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.7': - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.7': - resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.7': - resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + '@babel/helpers@7.24.8': + resolution: {integrity: sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.7': - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + '@babel/parser@7.24.8': + resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} engines: {node: '>=6.0.0'} hasBin: true @@ -344,34 +344,34 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.7': - resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} + '@babel/plugin-transform-typescript@7.24.8': + resolution: {integrity: sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.7': - resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} + '@babel/runtime@7.24.8': + resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} engines: {node: '>=6.9.0'} '@babel/template@7.24.7': resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.7': - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + '@babel/traverse@7.24.8': + resolution: {integrity: sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.7': - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + '@babel/types@7.24.9': + resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==} engines: {node: '>=6.9.0'} '@ctrl/tinycolor@3.6.1': resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} - '@emotion/hash@0.9.1': - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} '@emotion/unitless@0.8.1': resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} @@ -524,8 +524,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.1': - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -568,8 +568,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -599,83 +599,83 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + '@rollup/rollup-android-arm-eabi@4.18.1': + resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm64@4.18.1': + resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + '@rollup/rollup-darwin-arm64@4.18.1': + resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + '@rollup/rollup-darwin-x64@4.18.1': + resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + '@rollup/rollup-linux-arm-gnueabihf@4.18.1': + resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + '@rollup/rollup-linux-arm-musleabihf@4.18.1': + resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + '@rollup/rollup-linux-arm64-gnu@4.18.1': + resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + '@rollup/rollup-linux-arm64-musl@4.18.1': + resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': + resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + '@rollup/rollup-linux-riscv64-gnu@4.18.1': + resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + '@rollup/rollup-linux-s390x-gnu@4.18.1': + resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + '@rollup/rollup-linux-x64-gnu@4.18.1': + resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + '@rollup/rollup-linux-x64-musl@4.18.1': + resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + '@rollup/rollup-win32-arm64-msvc@4.18.1': + resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + '@rollup/rollup-win32-ia32-msvc@4.18.1': + resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + '@rollup/rollup-win32-x64-msvc@4.18.1': + resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} cpu: [x64] os: [win32] @@ -707,8 +707,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.5': - resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==} + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -716,8 +716,8 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/node@20.14.2': - resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} + '@types/node@20.14.11': + resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -876,17 +876,17 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@vue/compiler-core@3.4.29': - resolution: {integrity: sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==} + '@vue/compiler-core@3.4.33': + resolution: {integrity: sha512-MoIREbkdPQlnGfSKDMgzTqzqx5nmEjIc0ydLVYlTACGBsfvOJ4tHSbZXKVF536n6fB+0eZaGEOqsGThPpdvF5A==} - '@vue/compiler-dom@3.4.29': - resolution: {integrity: sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==} + '@vue/compiler-dom@3.4.33': + resolution: {integrity: sha512-GzB8fxEHKw0gGet5BKlpfXEqoBnzSVWwMnT+dc25wE7pFEfrU/QsvjZMP9rD4iVXHBBoemTct8mN0GJEI6ZX5A==} - '@vue/compiler-sfc@3.4.29': - resolution: {integrity: sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==} + '@vue/compiler-sfc@3.4.33': + resolution: {integrity: sha512-7rk7Vbkn21xMwIUpHQR4hCVejwE6nvhBOiDgoBcR03qvGqRKA7dCBSsHZhwhYUsmjlbJ7OtD5UFIyhP6BY+c8A==} - '@vue/compiler-ssr@3.4.29': - resolution: {integrity: sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==} + '@vue/compiler-ssr@3.4.33': + resolution: {integrity: sha512-0WveC9Ai+eT/1b6LCV5IfsufBZ0HP7pSSTdDjcuW302tTEgoBw8rHVHKPbGUtzGReUFCRXbv6zQDDgucnV2WzQ==} '@vue/devtools-api@6.6.3': resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} @@ -899,22 +899,22 @@ packages: typescript: optional: true - '@vue/reactivity@3.4.29': - resolution: {integrity: sha512-w8+KV+mb1a8ornnGQitnMdLfE0kXmteaxLdccm2XwdFxXst4q/Z7SEboCV5SqJNpZbKFeaRBBJBhW24aJyGINg==} + '@vue/reactivity@3.4.33': + resolution: {integrity: sha512-B24QIelahDbyHipBgbUItQblbd4w5HpG3KccL+YkGyo3maXyS253FzcTR3pSz739OTphmzlxP7JxEMWBpewilA==} - '@vue/runtime-core@3.4.29': - resolution: {integrity: sha512-s8fmX3YVR/Rk5ig0ic0NuzTNjK2M7iLuVSZyMmCzN/+Mjuqqif1JasCtEtmtoJWF32pAtUjyuT2ljNKNLeOmnQ==} + '@vue/runtime-core@3.4.33': + resolution: {integrity: sha512-6wavthExzT4iAxpe8q37/rDmf44nyOJGISJPxCi9YsQO+8w9v0gLCFLfH5TzD1V1AYrTAdiF4Y1cgUmP68jP6w==} - '@vue/runtime-dom@3.4.29': - resolution: {integrity: sha512-gI10atCrtOLf/2MPPMM+dpz3NGulo9ZZR9d1dWo4fYvm+xkfvRrw1ZmJ7mkWtiJVXSsdmPbcK1p5dZzOCKDN0g==} + '@vue/runtime-dom@3.4.33': + resolution: {integrity: sha512-iHsMCUSFJ+4z432Bn9kZzHX+zOXa6+iw36DaVRmKYZpPt9jW9riF32SxNwB124i61kp9+AZtheQ/mKoJLerAaQ==} - '@vue/server-renderer@3.4.29': - resolution: {integrity: sha512-HMLCmPI2j/k8PVkSBysrA2RxcxC5DgBiCdj7n7H2QtR8bQQPqKAe8qoaxLcInzouBmzwJ+J0x20ygN/B5mYBng==} + '@vue/server-renderer@3.4.33': + resolution: {integrity: sha512-jTH0d6gQcaYideFP/k0WdEu8PpRS9MF8d0b6SfZzNi+ap972pZ0TNIeTaESwdOtdY0XPVj54XEJ6K0wXxir4fw==} peerDependencies: - vue: 3.4.29 + vue: 3.4.33 - '@vue/shared@3.4.29': - resolution: {integrity: sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==} + '@vue/shared@3.4.33': + resolution: {integrity: sha512-aoRY0jQk3A/cuvdkodTrM4NMfxco8n55eG4H7ML/CRy7OryHfiqvug4xrCBBMbbN+dvXAetDDwZW9DXWWjBntA==} '@vue/tsconfig@0.5.1': resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} @@ -944,16 +944,16 @@ packages: '@yr/monotone-cubic-spline@1.0.3': resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} - ace-builds@1.35.0: - resolution: {integrity: sha512-bwDKqjqNccC/MSujqnYTeAS5dIR8UmGLP0R90mvsJY0FRC8NUWBSTfj34+EIzo2NWc/gV8IZTqv4fXaiZJpCtA==} + ace-builds@1.35.3: + resolution: {integrity: sha512-4cHLy+4L3FHOTis4IrDYsHZYhyYrIqtmA4HRiRXcxLTpmjQMbJ6Vutoc3c2uC9xS11g/rDwqcw+3zXHPSHD/qw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true @@ -993,8 +993,8 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - apexcharts@3.49.1: - resolution: {integrity: sha512-MqGtlq/KQuO8j0BBsUJYlRG8VBctKwYdwuBtajHgHTmSgUU3Oai+8oYN/rKCXwXzrUlYA+GiMgotAIbXY2BCGw==} + apexcharts@3.50.0: + resolution: {integrity: sha512-LJT1PNAm+NoIU3aogL2P+ViC0y/Cjik54FdzzGV54UNnGQLBoLe5ok3fxsJDTgyez45BGYT8gqNpYKqhdfy5sg==} are-docs-informative@0.0.2: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} @@ -1089,8 +1089,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1117,8 +1117,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001634: - resolution: {integrity: sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA==} + caniuse-lite@1.0.30001642: + resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1258,8 +1258,8 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.12: + resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==} de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -1336,8 +1336,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.803: - resolution: {integrity: sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==} + electron-to-chromium@1.4.831: + resolution: {integrity: sha512-6cKy9msoQGWhBF30n6y5ck80BdunKdwMRugM1lr74DMMXhjDRxSwMvrD1ncPP+n1PjF+KKmZZydvEF29skNZ1Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1458,8 +1458,8 @@ packages: eslint-plugin-antfu@0.43.1: resolution: {integrity: sha512-Nak+Qpy5qEK10dCXtVaabPTUmLBPLhsVKAFXAtxYGYRlY/SuuZUBhW2YIsLsixNROiICGuov8sN+eNOCC7Wb5g==} - eslint-plugin-es-x@7.7.0: - resolution: {integrity: sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==} + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -1530,8 +1530,8 @@ packages: resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} engines: {node: '>=5.0.0'} - eslint-plugin-promise@6.2.0: - resolution: {integrity: sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==} + eslint-plugin-promise@6.5.0: + resolution: {integrity: sha512-Sa4irPRhXB0mNjv88rWidu0WUhRLUMLAY3wj5MZyCKH/aMZKCRa3PzfIUaaLe4/U3RjAfRJvNP2rPvZ09lsmTg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -1564,8 +1564,8 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-plugin-vue@9.26.0: - resolution: {integrity: sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==} + eslint-plugin-vue@9.27.0: + resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -1601,8 +1601,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1723,8 +1723,8 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} gettext-extractor@3.8.0: resolution: {integrity: sha512-i/3mDQufQoJd2/EKm/B+VlaYrt3yGjVfLZu8DQpESKH29klNiW6z2S89FVCIEB85bDNgtGCeM/3A/yR1njr/Lw==} @@ -1741,9 +1741,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@7.2.3: @@ -1809,8 +1808,8 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - highlight.js@11.9.0: - resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} engines: {node: '>=12.0.0'} hosted-git-info@2.8.9: @@ -1891,8 +1890,9 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} @@ -1972,9 +1972,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} @@ -2088,15 +2087,14 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string-ast@0.6.1: - resolution: {integrity: sha512-eczKQUDaBpB/mcEqZZNGEUG1FQNsXCuk3uOrCpu6y7qTygIy6jnpqDa62j9MGKSoqlXhM1lCFQv1THuGDQtvUA==} + magic-string-ast@0.6.2: + resolution: {integrity: sha512-oN3Bcd7ZVt+0VGEs7402qR/tjgjbM7kPlH/z7ufJnzTLVBzXJITRHOJiwMmmYMgZfdoWQsfQcY+iKlxiBppnMA==} engines: {node: '>=16.14.0'} magic-string@0.30.10: @@ -2158,8 +2156,8 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -2200,8 +2198,8 @@ packages: engines: {node: '>= 4.4.x'} hasBin: true - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.17: + resolution: {integrity: sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -2228,8 +2226,9 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -2278,6 +2277,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2364,8 +2366,8 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} @@ -2405,21 +2407,21 @@ packages: ts-node: optional: true - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2495,13 +2497,13 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@5.0.7: - resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} - engines: {node: '>=14.18'} + rimraf@5.0.9: + resolution: {integrity: sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==} + engines: {node: 14 >=14.20 || 16 >=16.20 || >=18} hasBin: true - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + rollup@4.18.1: + resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2536,8 +2538,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -2706,8 +2708,8 @@ packages: resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} engines: {node: '>=12.20'} - tailwindcss@3.4.4: - resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} + tailwindcss@3.4.6: + resolution: {integrity: sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==} engines: {node: '>=14.0.0'} hasBin: true @@ -2725,8 +2727,8 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - throttle-debounce@5.0.0: - resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} to-fast-properties@2.0.0: @@ -2798,8 +2800,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true @@ -2807,8 +2809,8 @@ packages: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -2816,14 +2818,14 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - unimport@3.7.2: - resolution: {integrity: sha512-91mxcZTadgXyj3lFWmrGT8GyoRHWuE5fqPOjg5RVtF6vj+OfM5G6WCzXjuYtSgELE5ggB34RY4oiCSEP8I3AHw==} + unimport@3.9.0: + resolution: {integrity: sha512-H2ftTISja1BonUVdOKRos6HC6dqYDR40dQTZY3zIDJ/5/z4ihncuL0LqLvtxYqUDMib41eAtunQUhXIWTCZ8rA==} unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - unplugin-auto-import@0.17.6: - resolution: {integrity: sha512-dmX0Pex5DzMzVuALkexboOZvh51fL/BD6aoPO7qHoTYGlQp0GRKsREv2KMF1lzYI9SXKQiRxAjwzbQnrFFNydQ==} + unplugin-auto-import@0.17.8: + resolution: {integrity: sha512-CHryj6HzJ+n4ASjzwHruD8arhbdl+UXvhuAIlHDs15Y/IMecG3wrf7FVg4pVH/DIysbq/n0phIjNHAjl7TG7Iw==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': ^3.2.2 @@ -2851,12 +2853,12 @@ packages: resolution: {integrity: sha512-7c5HvC6OgE4H7uWGJnHUQ0ShdIYSH/qZuIBflDi3zfOTYSFZQ6FElQ6f+uA9gSdZiNFjF095JJ/aRwbrTrB98g==} engines: {node: '>=16.14.0'} - unplugin@1.10.1: - resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} + unplugin@1.11.0: + resolution: {integrity: sha512-3r7VWZ/webh0SGgJScpWl2/MRCZK5d3ZYFcNaeci/GQ7Teop7zf0Nl2pUuz7G21BwPd9pcUPOC5KmJ2L3WgC5g==} engines: {node: '>=14.0.0'} - update-browserslist-db@1.0.16: - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2878,8 +2880,8 @@ packages: peerDependencies: vue: '>=3.2.13' - vite@5.3.1: - resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} + vite@5.3.4: + resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2927,8 +2929,8 @@ packages: resolution: {tarball: https://codeload.github.com/0xJacky/vue-github-button/tar.gz/fc3c93355a790d3249de6610de3ebe35949ee314} version: 3.1.0 - vue-router@4.3.3: - resolution: {integrity: sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==} + vue-router@4.4.0: + resolution: {integrity: sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==} peerDependencies: vue: ^3.2.0 @@ -2967,8 +2969,8 @@ packages: '@vue/compiler-sfc': '>=3.0.0' vue: '>=3.0.0' - vue@3.4.29: - resolution: {integrity: sha512-8QUYfRcYzNlYuzKPfge1UWC6nF9ym0lx7mpGVPJYNhddxEf3DD0+kU07NTL0sXuiT2HuJuKr/iEO8WvXvT0RSQ==} + vue@3.4.33: + resolution: {integrity: sha512-VdMCWQOummbhctl4QFMcW6eNtXHsFyDlX60O/tsSQuCcuDOnJ1qPOhhVla65Niece7xq/P2zyZReIO5mP+LGTQ==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3052,11 +3054,11 @@ snapshots: '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons-vue@7.0.1(vue@3.4.29(typescript@5.3.3))': + '@ant-design/icons-vue@7.0.1(vue@3.4.33(typescript@5.3.3))': dependencies: '@ant-design/colors': 6.0.0 '@ant-design/icons-svg': 4.4.2 - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) '@antfu/eslint-config-basic@0.43.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0)(typescript@5.3.3)': dependencies: @@ -3071,7 +3073,7 @@ snapshots: eslint-plugin-markdown: 3.0.1(eslint@8.57.0) eslint-plugin-n: 16.6.2(eslint@8.57.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-promise: 6.2.0(eslint@8.57.0) + eslint-plugin-promise: 6.5.0(eslint@8.57.0) eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0) eslint-plugin-yml: 1.14.0(eslint@8.57.0) @@ -3105,7 +3107,7 @@ snapshots: '@antfu/eslint-config-basic': 0.43.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0)(typescript@5.3.3) '@antfu/eslint-config-ts': 0.43.1(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 - eslint-plugin-vue: 9.26.0(eslint@8.57.0) + eslint-plugin-vue: 9.27.0(eslint@8.57.0) local-pkg: 0.4.3 transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' @@ -3116,27 +3118,27 @@ snapshots: - supports-color - typescript - '@antfu/utils@0.7.8': {} + '@antfu/utils@0.7.10': {} '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - '@babel/compat-data@7.24.7': {} + '@babel/compat-data@7.24.9': {} - '@babel/core@7.24.7': + '@babel/core@7.24.9': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 + '@babel/generator': 7.24.10 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) + '@babel/helpers': 7.24.8 + '@babel/parser': 7.24.8 '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 convert-source-map: 2.0.0 debug: 4.3.5 gensync: 1.0.0-beta.2 @@ -3145,34 +3147,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.24.7': + '@babel/generator@7.24.10': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 - '@babel/helper-compilation-targets@7.24.7': + '@babel/helper-compilation-targets@7.24.8': dependencies: - '@babel/compat-data': 7.24.7 - '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.1 + '@babel/compat-data': 7.24.9 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7)': + '@babel/helper-create-class-features-plugin@7.24.8(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.9 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.9) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 semver: 6.3.1 @@ -3181,38 +3183,38 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 '@babel/helper-function-name@7.24.7': dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 - '@babel/helper-member-expression-to-functions@7.24.7': + '@babel/helper-member-expression-to-functions@7.24.8': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + '@babel/helper-module-transforms@7.24.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.9 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 @@ -3223,47 +3225,47 @@ snapshots: '@babel/helper-optimise-call-expression@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 - '@babel/helper-plugin-utils@7.24.7': {} + '@babel/helper-plugin-utils@7.24.8': {} - '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7)': + '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.9 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 transitivePeerDependencies: - supports-color '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 - '@babel/helper-string-parser@7.24.7': {} + '@babel/helper-string-parser@7.24.8': {} '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-option@7.24.7': {} + '@babel/helper-validator-option@7.24.8': {} - '@babel/helpers@7.24.7': + '@babel/helpers@7.24.8': dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 '@babel/highlight@7.24.7': dependencies: @@ -3272,71 +3274,71 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.24.7': + '@babel/parser@7.24.8': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.24.9 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-typescript@7.24.8(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.9 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.9) transitivePeerDependencies: - supports-color - '@babel/runtime@7.24.7': + '@babel/runtime@7.24.8': dependencies: regenerator-runtime: 0.14.1 '@babel/template@7.24.7': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 - '@babel/traverse@7.24.7': + '@babel/traverse@7.24.8': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 + '@babel/generator': 7.24.10 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.7': + '@babel/types@7.24.9': dependencies: - '@babel/helper-string-parser': 7.24.7 + '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 '@ctrl/tinycolor@3.6.1': {} - '@emotion/hash@0.9.1': {} + '@emotion/hash@0.9.2': {} '@emotion/unitless@0.8.1': {} '@es-joy/jsdoccomment@0.41.0': dependencies: comment-parser: 1.4.1 - esquery: 1.5.0 + esquery: 1.6.0 jsdoc-type-pratt-parser: 4.0.0 '@esbuild/aix-ppc64@0.21.5': @@ -3413,7 +3415,7 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.1': {} + '@eslint-community/regexpp@4.11.0': {} '@eslint/eslintrc@2.1.4': dependencies: @@ -3457,19 +3459,19 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3486,60 +3488,60 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + '@rollup/pluginutils@5.1.0(rollup@4.18.1)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/rollup-android-arm-eabi@4.18.0': + '@rollup/rollup-android-arm-eabi@4.18.1': optional: true - '@rollup/rollup-android-arm64@4.18.0': + '@rollup/rollup-android-arm64@4.18.1': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + '@rollup/rollup-darwin-arm64@4.18.1': optional: true - '@rollup/rollup-darwin-x64@4.18.0': + '@rollup/rollup-darwin-x64@4.18.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + '@rollup/rollup-linux-arm-gnueabihf@4.18.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + '@rollup/rollup-linux-arm-musleabihf@4.18.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + '@rollup/rollup-linux-arm64-gnu@4.18.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + '@rollup/rollup-linux-arm64-musl@4.18.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + '@rollup/rollup-linux-riscv64-gnu@4.18.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + '@rollup/rollup-linux-s390x-gnu@4.18.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + '@rollup/rollup-linux-x64-gnu@4.18.1': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + '@rollup/rollup-linux-x64-musl@4.18.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + '@rollup/rollup-win32-arm64-msvc@4.18.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + '@rollup/rollup-win32-ia32-msvc@4.18.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + '@rollup/rollup-win32-x64-msvc@4.18.1': optional: true '@simonwep/pickr@1.8.2': @@ -3549,7 +3551,7 @@ snapshots: '@stylistic/eslint-plugin-js@0.0.4': dependencies: - acorn: 8.12.0 + acorn: 8.12.1 escape-string-regexp: 4.0.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -3575,13 +3577,13 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.14.2 + '@types/node': 20.14.11 '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/lodash@4.17.5': {} + '@types/lodash@4.17.7': {} '@types/mdast@3.0.15': dependencies: @@ -3589,7 +3591,7 @@ snapshots: '@types/minimatch@5.1.2': {} - '@types/node@20.14.2': + '@types/node@20.14.11': dependencies: undici-types: 5.26.5 @@ -3609,7 +3611,7 @@ snapshots: '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3)': dependencies: - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) @@ -3620,7 +3622,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 @@ -3673,7 +3675,7 @@ snapshots: debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.2 + semver: 7.6.3 tsutils: 3.21.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 @@ -3688,7 +3690,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 @@ -3705,7 +3707,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -3719,7 +3721,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) eslint: 8.57.0 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -3736,20 +3738,20 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-vue-jsx@3.1.0(vite@5.3.1(@types/node@20.14.2)(less@4.2.0))(vue@3.4.29(typescript@5.3.3))': + '@vitejs/plugin-vue-jsx@3.1.0(vite@5.3.4(@types/node@20.14.11)(less@4.2.0))(vue@3.4.33(typescript@5.3.3))': dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7) - '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.7) - vite: 5.3.1(@types/node@20.14.2)(less@4.2.0) - vue: 3.4.29(typescript@5.3.3) + '@babel/core': 7.24.9 + '@babel/plugin-transform-typescript': 7.24.8(@babel/core@7.24.9) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.9) + vite: 5.3.4(@types/node@20.14.11)(less@4.2.0) + vue: 3.4.33(typescript@5.3.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.5(vite@5.3.1(@types/node@20.14.2)(less@4.2.0))(vue@3.4.29(typescript@5.3.3))': + '@vitejs/plugin-vue@5.0.5(vite@5.3.4(@types/node@20.14.11)(less@4.2.0))(vue@3.4.33(typescript@5.3.3))': dependencies: - vite: 5.3.1(@types/node@20.14.2)(less@4.2.0) - vue: 3.4.29(typescript@5.3.3) + vite: 5.3.4(@types/node@20.14.11)(less@4.2.0) + vue: 3.4.33(typescript@5.3.3) '@volar/language-core@1.11.1': dependencies: @@ -3764,77 +3766,77 @@ snapshots: '@volar/language-core': 1.11.1 path-browserify: 1.0.1 - '@vue-macros/common@1.10.4(rollup@4.18.0)(vue@3.4.29(typescript@5.3.3))': + '@vue-macros/common@1.10.4(rollup@4.18.1)(vue@3.4.33(typescript@5.3.3))': dependencies: - '@babel/types': 7.24.7 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@vue/compiler-sfc': 3.4.29 + '@babel/types': 7.24.9 + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) + '@vue/compiler-sfc': 3.4.33 ast-kit: 0.12.2 local-pkg: 0.5.0 - magic-string-ast: 0.6.1 + magic-string-ast: 0.6.2 optionalDependencies: - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) transitivePeerDependencies: - rollup '@vue/babel-helper-vue-transform-on@1.2.2': {} - '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.7)': + '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.9)': dependencies: '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 '@vue/babel-helper-vue-transform-on': 1.2.2 - '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.24.7) + '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.24.9) camelcase: 6.3.0 html-tags: 3.3.1 svg-tags: 1.0.0 optionalDependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.9 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.7)': + '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.9)': dependencies: '@babel/code-frame': 7.24.7 - '@babel/core': 7.24.7 + '@babel/core': 7.24.9 '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/parser': 7.24.7 - '@vue/compiler-sfc': 3.4.29 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/parser': 7.24.8 + '@vue/compiler-sfc': 3.4.33 - '@vue/compiler-core@3.4.29': + '@vue/compiler-core@3.4.33': dependencies: - '@babel/parser': 7.24.7 - '@vue/shared': 3.4.29 + '@babel/parser': 7.24.8 + '@vue/shared': 3.4.33 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-dom@3.4.29': + '@vue/compiler-dom@3.4.33': dependencies: - '@vue/compiler-core': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/compiler-core': 3.4.33 + '@vue/shared': 3.4.33 - '@vue/compiler-sfc@3.4.29': + '@vue/compiler-sfc@3.4.33': dependencies: - '@babel/parser': 7.24.7 - '@vue/compiler-core': 3.4.29 - '@vue/compiler-dom': 3.4.29 - '@vue/compiler-ssr': 3.4.29 - '@vue/shared': 3.4.29 + '@babel/parser': 7.24.8 + '@vue/compiler-core': 3.4.33 + '@vue/compiler-dom': 3.4.33 + '@vue/compiler-ssr': 3.4.33 + '@vue/shared': 3.4.33 estree-walker: 2.0.2 magic-string: 0.30.10 - postcss: 8.4.38 + postcss: 8.4.39 source-map-js: 1.2.0 - '@vue/compiler-ssr@3.4.29': + '@vue/compiler-ssr@3.4.33': dependencies: - '@vue/compiler-dom': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/compiler-dom': 3.4.33 + '@vue/shared': 3.4.33 '@vue/devtools-api@6.6.3': {} @@ -3842,57 +3844,57 @@ snapshots: dependencies: '@volar/language-core': 1.11.1 '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/compiler-dom': 3.4.33 + '@vue/shared': 3.4.33 computeds: 0.0.1 - minimatch: 9.0.4 + minimatch: 9.0.5 muggle-string: 0.3.1 path-browserify: 1.0.1 vue-template-compiler: 2.7.16 optionalDependencies: typescript: 5.3.3 - '@vue/reactivity@3.4.29': + '@vue/reactivity@3.4.33': dependencies: - '@vue/shared': 3.4.29 + '@vue/shared': 3.4.33 - '@vue/runtime-core@3.4.29': + '@vue/runtime-core@3.4.33': dependencies: - '@vue/reactivity': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/reactivity': 3.4.33 + '@vue/shared': 3.4.33 - '@vue/runtime-dom@3.4.29': + '@vue/runtime-dom@3.4.33': dependencies: - '@vue/reactivity': 3.4.29 - '@vue/runtime-core': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/reactivity': 3.4.33 + '@vue/runtime-core': 3.4.33 + '@vue/shared': 3.4.33 csstype: 3.1.3 - '@vue/server-renderer@3.4.29(vue@3.4.29(typescript@5.3.3))': + '@vue/server-renderer@3.4.33(vue@3.4.33(typescript@5.3.3))': dependencies: - '@vue/compiler-ssr': 3.4.29 - '@vue/shared': 3.4.29 - vue: 3.4.29(typescript@5.3.3) + '@vue/compiler-ssr': 3.4.33 + '@vue/shared': 3.4.33 + vue: 3.4.33(typescript@5.3.3) - '@vue/shared@3.4.29': {} + '@vue/shared@3.4.33': {} '@vue/tsconfig@0.5.1': {} - '@vueuse/core@10.11.0(vue@3.4.29(typescript@5.3.3))': + '@vueuse/core@10.11.0(vue@3.4.33(typescript@5.3.3))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.11.0 - '@vueuse/shared': 10.11.0(vue@3.4.29(typescript@5.3.3)) - vue-demi: 0.14.8(vue@3.4.29(typescript@5.3.3)) + '@vueuse/shared': 10.11.0(vue@3.4.33(typescript@5.3.3)) + vue-demi: 0.14.8(vue@3.4.33(typescript@5.3.3)) transitivePeerDependencies: - '@vue/composition-api' - vue '@vueuse/metadata@10.11.0': {} - '@vueuse/shared@10.11.0(vue@3.4.29(typescript@5.3.3))': + '@vueuse/shared@10.11.0(vue@3.4.33(typescript@5.3.3))': dependencies: - vue-demi: 0.14.8(vue@3.4.29(typescript@5.3.3)) + vue-demi: 0.14.8(vue@3.4.33(typescript@5.3.3)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -3909,13 +3911,13 @@ snapshots: '@yr/monotone-cubic-spline@1.0.3': {} - ace-builds@1.35.0: {} + ace-builds@1.35.3: {} - acorn-jsx@5.3.2(acorn@8.12.0): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.12.0 + acorn: 8.12.1 - acorn@8.12.0: {} + acorn@8.12.1: {} ajv@6.12.6: dependencies: @@ -3938,19 +3940,19 @@ snapshots: ansi-styles@6.2.1: {} - ant-design-vue@4.2.3(vue@3.4.29(typescript@5.3.3)): + ant-design-vue@4.2.3(vue@3.4.33(typescript@5.3.3)): dependencies: '@ant-design/colors': 6.0.0 - '@ant-design/icons-vue': 7.0.1(vue@3.4.29(typescript@5.3.3)) - '@babel/runtime': 7.24.7 + '@ant-design/icons-vue': 7.0.1(vue@3.4.33(typescript@5.3.3)) + '@babel/runtime': 7.24.8 '@ctrl/tinycolor': 3.6.1 - '@emotion/hash': 0.9.1 + '@emotion/hash': 0.9.2 '@emotion/unitless': 0.8.1 '@simonwep/pickr': 1.8.2 array-tree-filter: 2.1.0 async-validator: 4.2.5 csstype: 3.1.3 - dayjs: 1.11.11 + dayjs: 1.11.12 dom-align: 1.12.4 dom-scroll-into-view: 2.0.1 lodash: 4.17.21 @@ -3959,9 +3961,9 @@ snapshots: scroll-into-view-if-needed: 2.2.31 shallow-equal: 1.2.1 stylis: 4.3.2 - throttle-debounce: 5.0.0 - vue: 3.4.29(typescript@5.3.3) - vue-types: 3.0.2(vue@3.4.29(typescript@5.3.3)) + throttle-debounce: 5.0.2 + vue: 3.4.33(typescript@5.3.3) + vue-types: 3.0.2(vue@3.4.33(typescript@5.3.3)) warning: 4.0.3 any-promise@1.3.0: {} @@ -3971,7 +3973,7 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - apexcharts@3.49.1: + apexcharts@3.50.0: dependencies: '@yr/monotone-cubic-spline': 1.0.3 svg.draggable.js: 2.2.2 @@ -4043,26 +4045,26 @@ snapshots: ast-kit@0.12.2: dependencies: - '@babel/parser': 7.24.7 + '@babel/parser': 7.24.8 pathe: 1.1.2 ast-walker-scope@0.6.1: dependencies: - '@babel/parser': 7.24.7 + '@babel/parser': 7.24.8 ast-kit: 0.12.2 async-validator@4.2.5: {} asynckit@0.4.0: {} - autoprefixer@10.4.19(postcss@8.4.38): + autoprefixer@10.4.19(postcss@8.4.39): dependencies: - browserslist: 4.23.1 - caniuse-lite: 1.0.30001634 + browserslist: 4.23.2 + caniuse-lite: 1.0.30001642 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.1 - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -4096,18 +4098,18 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.1: + browserslist@4.23.2: dependencies: - caniuse-lite: 1.0.30001634 - electron-to-chromium: 1.4.803 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) + caniuse-lite: 1.0.30001642 + electron-to-chromium: 1.4.831 + node-releases: 2.0.17 + update-browserslist-db: 1.1.0(browserslist@4.23.2) builtin-modules@3.3.0: {} builtins@5.1.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 call-bind@1.0.7: dependencies: @@ -4123,7 +4125,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001634: {} + caniuse-lite@1.0.30001642: {} chalk@2.4.2: dependencies: @@ -4268,7 +4270,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 - dayjs@1.11.11: {} + dayjs@1.11.12: {} de-indent@1.0.2: {} @@ -4336,7 +4338,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.803: {} + electron-to-chromium@1.4.831: {} emoji-regex@8.0.0: {} @@ -4393,7 +4395,7 @@ snapshots: is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 @@ -4472,7 +4474,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@8.57.0): dependencies: eslint: 8.57.0 - semver: 7.6.2 + semver: 7.6.3 eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)): dependencies: @@ -4481,7 +4483,7 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.15.0 resolve: 1.22.8 transitivePeerDependencies: - supports-color @@ -4494,8 +4496,8 @@ snapshots: eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 - get-tsconfig: 4.7.5 - is-core-module: 2.13.1 + get-tsconfig: 4.7.6 + is-core-module: 2.15.0 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -4522,10 +4524,10 @@ snapshots: - supports-color - typescript - eslint-plugin-es-x@7.7.0(eslint@8.57.0): + eslint-plugin-es-x@7.8.0(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 eslint: 8.57.0 eslint-compat-utils: 0.5.1(eslint@8.57.0) @@ -4546,11 +4548,11 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - get-tsconfig: 4.7.5 + get-tsconfig: 4.7.6 is-glob: 4.0.3 minimatch: 3.1.2 resolve: 1.22.8 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-typescript @@ -4569,7 +4571,7 @@ snapshots: eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.15.0 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -4602,9 +4604,9 @@ snapshots: debug: 4.3.5 escape-string-regexp: 4.0.0 eslint: 8.57.0 - esquery: 1.5.0 + esquery: 1.6.0 is-builtin-module: 3.2.1 - semver: 7.6.2 + semver: 7.6.3 spdx-expression-parse: 4.0.0 transitivePeerDependencies: - supports-color @@ -4632,19 +4634,19 @@ snapshots: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) builtins: 5.1.0 eslint: 8.57.0 - eslint-plugin-es-x: 7.7.0(eslint@8.57.0) - get-tsconfig: 4.7.5 + eslint-plugin-es-x: 7.8.0(eslint@8.57.0) + get-tsconfig: 4.7.6 globals: 13.24.0 ignore: 5.3.1 is-builtin-module: 3.2.1 - is-core-module: 2.13.1 + is-core-module: 2.15.0 minimatch: 3.1.2 resolve: 1.22.8 - semver: 7.6.2 + semver: 7.6.3 eslint-plugin-no-only-tests@3.1.0: {} - eslint-plugin-promise@6.2.0(eslint@8.57.0): + eslint-plugin-promise@6.5.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -4663,7 +4665,7 @@ snapshots: ci-info: 3.9.0 clean-regexp: 1.0.0 eslint: 8.57.0 - esquery: 1.5.0 + esquery: 1.6.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 @@ -4672,7 +4674,7 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.6.2 + semver: 7.6.3 strip-indent: 3.0.0 eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0): @@ -4682,15 +4684,15 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - eslint-plugin-vue@9.26.0(eslint@8.57.0): + eslint-plugin-vue@9.27.0(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) eslint: 8.57.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.1.0 - semver: 7.6.2 + postcss-selector-parser: 6.1.1 + semver: 7.6.3 vue-eslint-parser: 9.4.3(eslint@8.57.0) xml-name-validator: 4.0.0 transitivePeerDependencies: @@ -4724,7 +4726,7 @@ snapshots: eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -4740,7 +4742,7 @@ snapshots: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -4766,11 +4768,11 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -4889,7 +4891,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.5: + get-tsconfig@4.7.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -4913,12 +4915,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.1: + glob@10.4.5: dependencies: foreground-child: 3.2.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 + package-json-from-dist: 1.0.0 path-scurry: 1.11.1 glob@7.2.3: @@ -4982,7 +4985,7 @@ snapshots: he@1.2.0: {} - highlight.js@11.9.0: {} + highlight.js@11.10.0: {} hosted-git-info@2.8.9: {} @@ -5060,7 +5063,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.13.1: + is-core-module@2.15.0: dependencies: hasown: 2.0.2 @@ -5127,7 +5130,7 @@ snapshots: isexe@2.0.0: {} - jackspeak@3.4.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -5167,10 +5170,10 @@ snapshots: jsonc-eslint-parser@2.4.0: dependencies: - acorn: 8.12.0 + acorn: 8.12.1 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.6.2 + semver: 7.6.3 keyv@4.5.4: dependencies: @@ -5206,7 +5209,7 @@ snapshots: local-pkg@0.5.0: dependencies: mlly: 1.7.1 - pkg-types: 1.1.1 + pkg-types: 1.1.3 locate-path@5.0.0: dependencies: @@ -5228,19 +5231,19 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - magic-string-ast@0.6.1: + magic-string-ast@0.6.2: dependencies: magic-string: 0.30.10 magic-string@0.30.10: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 make-dir@2.1.0: dependencies: @@ -5299,7 +5302,7 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -5309,10 +5312,10 @@ snapshots: mlly@1.7.1: dependencies: - acorn: 8.12.0 + acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 + pkg-types: 1.1.3 + ufo: 1.5.4 ms@2.1.2: {} @@ -5338,7 +5341,7 @@ snapshots: sax: 1.4.1 optional: true - node-releases@2.0.14: {} + node-releases@2.0.17: {} normalize-package-data@2.5.0: dependencies: @@ -5361,7 +5364,7 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.1: {} + object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -5422,6 +5425,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -5462,7 +5467,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.1.2 path-type@4.0.0: {} @@ -5478,21 +5483,21 @@ snapshots: pify@4.0.1: optional: true - pinia-plugin-persistedstate@3.2.1(pinia@2.1.7(typescript@5.3.3)(vue@3.4.29(typescript@5.3.3))): + pinia-plugin-persistedstate@3.2.1(pinia@2.1.7(typescript@5.3.3)(vue@3.4.33(typescript@5.3.3))): dependencies: - pinia: 2.1.7(typescript@5.3.3)(vue@3.4.29(typescript@5.3.3)) + pinia: 2.1.7(typescript@5.3.3)(vue@3.4.33(typescript@5.3.3)) - pinia@2.1.7(typescript@5.3.3)(vue@3.4.29(typescript@5.3.3)): + pinia@2.1.7(typescript@5.3.3)(vue@3.4.33(typescript@5.3.3)): dependencies: '@vue/devtools-api': 6.6.3 - vue: 3.4.29(typescript@5.3.3) - vue-demi: 0.14.8(vue@3.4.29(typescript@5.3.3)) + vue: 3.4.33(typescript@5.3.3) + vue-demi: 0.14.8(vue@3.4.33(typescript@5.3.3)) optionalDependencies: typescript: 5.3.3 pirates@4.0.6: {} - pkg-types@1.1.1: + pkg-types@1.1.3: dependencies: confbox: 0.1.7 mlly: 1.7.1 @@ -5506,38 +5511,38 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.38): + postcss-import@15.1.0(postcss@8.4.39): dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.38): + postcss-js@4.0.1(postcss@8.4.39): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.38 + postcss: 8.4.39 - postcss-load-config@4.0.2(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.39): dependencies: lilconfig: 3.1.2 yaml: 2.4.5 optionalDependencies: - postcss: 8.4.38 + postcss: 8.4.39 - postcss-nested@6.0.1(postcss@8.4.38): + postcss-nested@6.2.0(postcss@8.4.39): dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.1.0 + postcss: 8.4.39 + postcss-selector-parser: 6.1.1 - postcss-selector-parser@6.1.0: + postcss-selector-parser@6.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.4.38: + postcss@8.4.39: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -5600,7 +5605,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5610,30 +5615,30 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@5.0.7: + rimraf@5.0.9: dependencies: - glob: 10.4.1 + glob: 10.4.5 - rollup@4.18.0: + rollup@4.18.1: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.18.1 + '@rollup/rollup-android-arm64': 4.18.1 + '@rollup/rollup-darwin-arm64': 4.18.1 + '@rollup/rollup-darwin-x64': 4.18.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 + '@rollup/rollup-linux-arm-musleabihf': 4.18.1 + '@rollup/rollup-linux-arm64-gnu': 4.18.1 + '@rollup/rollup-linux-arm64-musl': 4.18.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 + '@rollup/rollup-linux-riscv64-gnu': 4.18.1 + '@rollup/rollup-linux-s390x-gnu': 4.18.1 + '@rollup/rollup-linux-x64-gnu': 4.18.1 + '@rollup/rollup-linux-x64-musl': 4.18.1 + '@rollup/rollup-win32-arm64-msvc': 4.18.1 + '@rollup/rollup-win32-ia32-msvc': 4.18.1 + '@rollup/rollup-win32-x64-msvc': 4.18.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -5669,7 +5674,7 @@ snapshots: semver@6.3.1: {} - semver@7.6.2: {} + semver@7.6.3: {} set-function-length@1.2.2: dependencies: @@ -5700,7 +5705,7 @@ snapshots: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 signal-exit@4.1.0: {} @@ -5791,7 +5796,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.4.1 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -5854,7 +5859,7 @@ snapshots: dependencies: tslib: 2.6.3 - tailwindcss@3.4.4: + tailwindcss@3.4.6: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -5870,12 +5875,12 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.1 - postcss: 8.4.38 - postcss-import: 15.1.0(postcss@8.4.38) - postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38) - postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.1.0 + postcss: 8.4.39 + postcss-import: 15.1.0(postcss@8.4.39) + postcss-js: 4.0.1(postcss@8.4.39) + postcss-load-config: 4.0.2(postcss@8.4.39) + postcss-nested: 6.2.0(postcss@8.4.39) + postcss-selector-parser: 6.1.1 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: @@ -5893,7 +5898,7 @@ snapshots: dependencies: any-promise: 1.3.0 - throttle-debounce@5.0.0: {} + throttle-debounce@5.0.2: {} to-fast-properties@2.0.0: {} @@ -5967,11 +5972,11 @@ snapshots: typescript@5.3.3: {} - typescript@5.4.5: {} + typescript@5.5.3: {} typical@4.0.0: {} - ufo@1.5.3: {} + ufo@1.5.4: {} unbox-primitive@1.0.2: dependencies: @@ -5982,10 +5987,10 @@ snapshots: undici-types@5.26.5: {} - unimport@3.7.2(rollup@4.18.0): + unimport@3.9.0(rollup@4.18.1): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - acorn: 8.12.0 + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) + acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 fast-glob: 3.3.2 @@ -5993,10 +5998,10 @@ snapshots: magic-string: 0.30.10 mlly: 1.7.1 pathe: 1.1.2 - pkg-types: 1.1.1 + pkg-types: 1.1.3 scule: 1.3.0 strip-literal: 2.1.0 - unplugin: 1.10.1 + unplugin: 1.11.0 transitivePeerDependencies: - rollup @@ -6004,59 +6009,59 @@ snapshots: dependencies: '@types/unist': 2.0.10 - unplugin-auto-import@0.17.6(@vueuse/core@10.11.0(vue@3.4.29(typescript@5.3.3)))(rollup@4.18.0): + unplugin-auto-import@0.17.8(@vueuse/core@10.11.0(vue@3.4.33(typescript@5.3.3)))(rollup@4.18.1): dependencies: - '@antfu/utils': 0.7.8 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.10 - minimatch: 9.0.4 - unimport: 3.7.2(rollup@4.18.0) - unplugin: 1.10.1 + minimatch: 9.0.5 + unimport: 3.9.0(rollup@4.18.1) + unplugin: 1.11.0 optionalDependencies: - '@vueuse/core': 10.11.0(vue@3.4.29(typescript@5.3.3)) + '@vueuse/core': 10.11.0(vue@3.4.33(typescript@5.3.3)) transitivePeerDependencies: - rollup - unplugin-vue-components@0.26.0(@babel/parser@7.24.7)(rollup@4.18.0)(vue@3.4.29(typescript@5.3.3)): + unplugin-vue-components@0.26.0(@babel/parser@7.24.8)(rollup@4.18.1)(vue@3.4.33(typescript@5.3.3)): dependencies: - '@antfu/utils': 0.7.8 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) chokidar: 3.6.0 debug: 4.3.5 fast-glob: 3.3.2 local-pkg: 0.4.3 magic-string: 0.30.10 - minimatch: 9.0.4 + minimatch: 9.0.5 resolve: 1.22.8 - unplugin: 1.10.1 - vue: 3.4.29(typescript@5.3.3) + unplugin: 1.11.0 + vue: 3.4.33(typescript@5.3.3) optionalDependencies: - '@babel/parser': 7.24.7 + '@babel/parser': 7.24.8 transitivePeerDependencies: - rollup - supports-color - unplugin-vue-define-options@1.4.5(rollup@4.18.0)(vue@3.4.29(typescript@5.3.3)): + unplugin-vue-define-options@1.4.5(rollup@4.18.1)(vue@3.4.33(typescript@5.3.3)): dependencies: - '@vue-macros/common': 1.10.4(rollup@4.18.0)(vue@3.4.29(typescript@5.3.3)) + '@vue-macros/common': 1.10.4(rollup@4.18.1)(vue@3.4.33(typescript@5.3.3)) ast-walker-scope: 0.6.1 - unplugin: 1.10.1 + unplugin: 1.11.0 transitivePeerDependencies: - rollup - vue - unplugin@1.10.1: + unplugin@1.11.0: dependencies: - acorn: 8.12.0 + acorn: 8.12.1 chokidar: 3.6.0 webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.0.16(browserslist@4.23.1): + update-browserslist-db@1.1.0(browserslist@4.23.2): dependencies: - browserslist: 4.23.1 + browserslist: 4.23.2 escalade: 3.1.2 picocolors: 1.0.1 @@ -6073,10 +6078,10 @@ snapshots: vite-plugin-build-id@0.2.9(less@4.2.0): dependencies: - '@types/node': 20.14.2 - rimraf: 5.0.7 - typescript: 5.4.5 - vite: 5.3.1(@types/node@20.14.2)(less@4.2.0) + '@types/node': 20.14.11 + rimraf: 5.0.9 + typescript: 5.5.3 + vite: 5.3.4(@types/node@20.14.11)(less@4.2.0) transitivePeerDependencies: - less - lightningcss @@ -6085,24 +6090,24 @@ snapshots: - sugarss - terser - vite-svg-loader@5.1.0(vue@3.4.29(typescript@5.3.3)): + vite-svg-loader@5.1.0(vue@3.4.33(typescript@5.3.3)): dependencies: svgo: 3.3.2 - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) - vite@5.3.1(@types/node@20.14.2)(less@4.2.0): + vite@5.3.4(@types/node@20.14.11)(less@4.2.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.38 - rollup: 4.18.0 + postcss: 8.4.39 + rollup: 4.18.1 optionalDependencies: - '@types/node': 20.14.2 + '@types/node': 20.14.11 fsevents: 2.3.3 less: 4.2.0 - vue-demi@0.14.8(vue@3.4.29(typescript@5.3.3)): + vue-demi@0.14.8(vue@3.4.33(typescript@5.3.3)): dependencies: - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) vue-eslint-parser@9.4.3(eslint@8.57.0): dependencies: @@ -6111,9 +6116,9 @@ snapshots: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 lodash: 4.17.21 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -6121,10 +6126,10 @@ snapshots: dependencies: github-buttons: 2.28.0 - vue-router@4.3.3(vue@3.4.29(typescript@5.3.3)): + vue-router@4.4.0(vue@3.4.33(typescript@5.3.3)): dependencies: '@vue/devtools-api': 6.6.3 - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) vue-template-compiler@2.7.16: dependencies: @@ -6135,28 +6140,28 @@ snapshots: dependencies: '@volar/typescript': 1.11.1 '@vue/language-core': 1.8.27(typescript@5.3.3) - semver: 7.6.2 + semver: 7.6.3 typescript: 5.3.3 - vue-types@3.0.2(vue@3.4.29(typescript@5.3.3)): + vue-types@3.0.2(vue@3.4.33(typescript@5.3.3)): dependencies: is-plain-object: 3.0.1 - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) - vue3-ace-editor@2.2.4(ace-builds@1.35.0)(vue@3.4.29(typescript@5.3.3)): + vue3-ace-editor@2.2.4(ace-builds@1.35.3)(vue@3.4.33(typescript@5.3.3)): dependencies: - ace-builds: 1.35.0 + ace-builds: 1.35.3 resize-observer-polyfill: 1.5.1 - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) - vue3-apexcharts@1.4.4(apexcharts@3.49.1)(vue@3.4.29(typescript@5.3.3)): + vue3-apexcharts@1.4.4(apexcharts@3.50.0)(vue@3.4.33(typescript@5.3.3)): dependencies: - apexcharts: 3.49.1 - vue: 3.4.29(typescript@5.3.3) + apexcharts: 3.50.0 + vue: 3.4.33(typescript@5.3.3) - vue3-gettext@3.0.0-beta.4(@vue/compiler-sfc@3.4.29)(typescript@5.3.3)(vue@3.4.29(typescript@5.3.3)): + vue3-gettext@3.0.0-beta.4(@vue/compiler-sfc@3.4.33)(typescript@5.3.3)(vue@3.4.33(typescript@5.3.3)): dependencies: - '@vue/compiler-sfc': 3.4.29 + '@vue/compiler-sfc': 3.4.33 chalk: 4.1.2 command-line-args: 5.2.1 cosmiconfig: 9.0.0(typescript@5.3.3) @@ -6166,24 +6171,24 @@ snapshots: parse5-htmlparser2-tree-adapter: 6.0.1 pofile: 1.1.4 tslib: 2.6.3 - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) transitivePeerDependencies: - typescript - vue@3.4.29(typescript@5.3.3): + vue@3.4.33(typescript@5.3.3): dependencies: - '@vue/compiler-dom': 3.4.29 - '@vue/compiler-sfc': 3.4.29 - '@vue/runtime-dom': 3.4.29 - '@vue/server-renderer': 3.4.29(vue@3.4.29(typescript@5.3.3)) - '@vue/shared': 3.4.29 + '@vue/compiler-dom': 3.4.33 + '@vue/compiler-sfc': 3.4.33 + '@vue/runtime-dom': 3.4.33 + '@vue/server-renderer': 3.4.33(vue@3.4.33(typescript@5.3.3)) + '@vue/shared': 3.4.33 optionalDependencies: typescript: 5.3.3 - vuedraggable@4.1.0(vue@3.4.29(typescript@5.3.3)): + vuedraggable@4.1.0(vue@3.4.33(typescript@5.3.3)): dependencies: sortablejs: 1.14.0 - vue: 3.4.29(typescript@5.3.3) + vue: 3.4.33(typescript@5.3.3) warning@4.0.3: dependencies: diff --git a/app/src/api/curd.ts b/app/src/api/curd.ts index acecee050..fdbce1345 100644 --- a/app/src/api/curd.ts +++ b/app/src/api/curd.ts @@ -13,7 +13,7 @@ export interface Pagination { total_pages: number } -export interface IGetListResponse { +export interface GetListResponse { data: T[] pagination: Pagination } @@ -35,7 +35,7 @@ class Curd { } // eslint-disable-next-line @typescript-eslint/no-explicit-any - _get_list(params: any = null): Promise> { + _get_list(params: any = null): Promise> { return http.get(this.plural, { params }) } diff --git a/app/src/api/settings.ts b/app/src/api/settings.ts index 09146ba9f..bf27a1586 100644 --- a/app/src/api/settings.ts +++ b/app/src/api/settings.ts @@ -1,17 +1,27 @@ import http from '@/lib/http' +export interface BannedIP { + ip: string + attempts: number + expired_at: string +} + const settings = { - get() { + get(): Promise { return http.get('/settings') }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - save(data: any) { + save(data: T) { return http.post('/settings', data) }, - - get_server_name() { + get_server_name(): Promise<{ name: string }> { return http.get('/settings/server/name') }, + get_banned_ips(): Promise { + return http.get('/settings/auth/banned_ips') + }, + remove_banned_ip(ip: string) { + return http.delete('/settings/auth/banned_ip', { data: { ip } }) + }, } export default settings diff --git a/app/src/language/LINGUAS b/app/src/language/LINGUAS index 052f2613d..1dc98da20 100644 --- a/app/src/language/LINGUAS +++ b/app/src/language/LINGUAS @@ -1 +1 @@ -es fr_FR ko_KR ru_RU vi_VN zh_CN zh_TW +en zh_CN zh_TW fr_FR es ru_RU vi_VN ko_KR \ No newline at end of file diff --git a/app/src/language/en/app.po b/app/src/language/en/app.po index 900a4a529..64336d09d 100644 --- a/app/src/language/en/app.po +++ b/app/src/language/en/app.po @@ -28,7 +28,8 @@ msgstr "Username" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "Action" @@ -51,7 +52,7 @@ msgstr "Add Directive Below" msgid "Add Location" msgstr "Add Location" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "Add Site" @@ -70,11 +71,11 @@ msgstr "Saved successfully" msgid "Additional" msgstr "Add Location" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "Advance Mode" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "" @@ -82,11 +83,11 @@ msgstr "" msgid "API Document" msgstr "" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "" @@ -94,7 +95,12 @@ msgstr "" msgid "Arch" msgstr "" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +#, fuzzy +msgid "Are you sure to delete this banned IP immediately?" +msgstr "Are you sure you want to remove this directive?" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 #, fuzzy msgid "Are you sure you want to clear all notifications?" @@ -147,6 +153,14 @@ msgstr "" msgid "Assistant" msgstr "" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +msgid "Auth" +msgstr "" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -170,8 +184,8 @@ msgstr "Auto-renewal enabled for %{name}" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "Back" @@ -180,19 +194,31 @@ msgstr "Back" msgid "Back Home" msgstr "Back" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "Base information" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 #, fuzzy msgid "Basic" msgstr "Basic Mode" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "Basic Mode" @@ -280,12 +306,12 @@ msgid "Cleaning environment variables" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 #, fuzzy msgid "Cleared successfully" @@ -312,7 +338,7 @@ msgstr "Configurations" msgid "Configuration file is test successful" msgstr "" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "Configuration Name" @@ -320,7 +346,7 @@ msgstr "Configuration Name" msgid "Configurations" msgstr "Configurations" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "Configure SSL" @@ -351,7 +377,7 @@ msgstr "CPU:" msgid "Create" msgstr "Created at" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "Create Another" @@ -390,7 +416,7 @@ msgstr "" msgid "Dashboard" msgstr "Dashboard" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "Database (Optional, default: database)" @@ -423,15 +449,15 @@ msgstr "" msgid "Deleted successfully" msgstr "Disabled successfully" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "" @@ -481,9 +507,9 @@ msgstr "Disabled" msgid "Disable auto-renewal failed for %{name}" msgstr "Disable auto-renewal failed for %{name}" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "Disabled" @@ -562,7 +588,7 @@ msgstr "Are you sure you want to remove this directive?" msgid "Domain" msgstr "" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "Domain Config Created Successfully" @@ -582,38 +608,38 @@ msgstr "" msgid "Dry run mode enabled" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 #, fuzzy msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "Saved successfully" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 #, fuzzy msgid "Duplicate failed" msgstr "Enable failed" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 #, fuzzy msgid "Duplicate successfully" msgstr "Saved successfully" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 #, fuzzy msgid "Duplicate to local successfully" msgstr "Saved successfully" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "Edit %{n}" @@ -635,25 +661,25 @@ msgstr "Edit Site" msgid "Email" msgstr "Email (*)" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "Email (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 #, fuzzy msgid "Enable" msgstr "Enabled" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "" @@ -661,12 +687,12 @@ msgstr "" msgid "Enable auto-renewal failed for %{name}" msgstr "Enable auto-renewal failed for %{name}" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "Enable failed" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 #, fuzzy msgid "Enable successfully" msgstr "Enabled successfully" @@ -677,19 +703,19 @@ msgstr "Enable TLS" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "Enabled" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "Enabled successfully" @@ -759,7 +785,7 @@ msgstr "Failed to enable %{msg}" msgid "Failed to get certificate information" msgstr "" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "" @@ -785,7 +811,7 @@ msgstr "File Not Found" msgid "Filter" msgstr "" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "Finished" @@ -857,6 +883,12 @@ msgstr "" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 msgid "Import" msgstr "" @@ -866,6 +898,10 @@ msgstr "" msgid "Import Certificate" msgstr "Certificate Status" +#: src/views/other/Login.vue:59 +msgid "Incorrect username or password" +msgstr "" + #: src/constants/index.ts:18 msgid "Info" msgstr "" @@ -878,7 +914,7 @@ msgstr "" msgid "Initialing core upgrader" msgstr "" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "Install" @@ -900,6 +936,10 @@ msgstr "" msgid "Invalid" msgstr "Invalid E-mail!" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 #, fuzzy msgid "Issue wildcard certificate" @@ -933,7 +973,7 @@ msgstr "" msgid "Leave blank for no change" msgstr "Leave blank for no change" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "" @@ -990,11 +1030,11 @@ msgstr "Locations" msgid "Log" msgstr "Login" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "Login" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "Login successful" @@ -1002,7 +1042,7 @@ msgstr "Login successful" msgid "Logout successful" msgstr "Logout successful" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "" @@ -1047,6 +1087,10 @@ msgstr "Manage Users" msgid "Managed Certificate" msgstr "Certificate is valid" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1060,7 +1104,7 @@ msgstr "Memory and Storage" msgid "Minutes" msgstr "" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 #, fuzzy msgid "Model" msgstr "Advance Mode" @@ -1077,7 +1121,7 @@ msgstr "Modify Config" msgid "Modify Certificate" msgstr "Certificate Status" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "Modify Config" @@ -1097,12 +1141,12 @@ msgstr "Single Directive" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "Name" @@ -1129,11 +1173,11 @@ msgstr "" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "Next" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 msgid "Nginx" msgstr "" @@ -1141,7 +1185,7 @@ msgstr "" msgid "Nginx Access Log Path" msgstr "" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 #, fuzzy msgid "Nginx Configuration Parse Error" msgstr "Configuration Name" @@ -1169,7 +1213,7 @@ msgid "Nginx restarted successfully" msgstr "Saved successfully" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1177,6 +1221,7 @@ msgstr "Saved successfully" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1208,7 +1253,7 @@ msgstr "" msgid "Notification" msgstr "Certificate is valid" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 #, fuzzy msgid "Notifications" msgstr "Certificate is valid" @@ -1234,7 +1279,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1264,7 +1309,7 @@ msgstr "" msgid "Online" msgstr "" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "" @@ -1277,13 +1322,13 @@ msgstr "OS:" msgid "OS:" msgstr "OS:" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "" @@ -1291,11 +1336,11 @@ msgstr "" msgid "Params" msgstr "Params" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "Password" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "Password (*)" @@ -1358,7 +1403,7 @@ msgstr "" msgid "Pre-release" msgstr "" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "" @@ -1454,7 +1499,16 @@ msgstr "" msgid "Reloading nginx" msgstr "" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +#, fuzzy +msgid "Remove successfully" +msgstr "Saved successfully" + +#: src/components/Notification/Notification.vue:52 #, fuzzy msgid "Removed successfully" msgstr "Saved successfully" @@ -1513,9 +1567,9 @@ msgstr "" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "Save" @@ -1523,7 +1577,7 @@ msgstr "Save" msgid "Save Directive" msgstr "Save Directive" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "Save error %{msg}" @@ -1531,15 +1585,15 @@ msgstr "Save error %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 #, fuzzy msgid "Save successfully" msgstr "Saved successfully" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "Saved successfully" @@ -1564,8 +1618,9 @@ msgstr "Send" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "Server error" @@ -1584,7 +1639,7 @@ msgid "server_name not found in directives" msgstr "server_name not found in directives" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "server_name parameter is required" @@ -1641,7 +1696,7 @@ msgstr "Certificate Status" msgid "SSL Certificate Path" msgstr "Certificate Status" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 #, fuzzy msgid "SSO Login" msgstr "Login" @@ -1728,8 +1783,8 @@ msgstr "" msgid "System" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "" @@ -1763,7 +1818,7 @@ msgstr "" msgid "The input is not a SSL Certificate Key" msgstr "Certificate Status" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1798,8 +1853,8 @@ msgstr "" msgid "The url is invalid" msgstr "" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 msgid "The url is invalid." msgstr "" @@ -1825,6 +1880,7 @@ msgstr "" msgid "This field should not be empty" msgstr "" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "" @@ -1841,10 +1897,14 @@ msgid "" "continue?" msgstr "" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1900,11 +1960,15 @@ msgstr "" msgid "User" msgstr "Username" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "Username" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "Username (*)" @@ -1918,7 +1982,7 @@ msgstr "" msgid "View" msgstr "" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 #, fuzzy msgid "View all notifications" msgstr "Certificate is valid" @@ -1934,7 +1998,7 @@ msgstr "Basic Mode" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "Warning" @@ -1965,6 +2029,7 @@ msgstr "" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "Yes" diff --git a/app/src/language/es/app.po b/app/src/language/es/app.po index 4676fa38e..79315d23a 100644 --- a/app/src/language/es/app.po +++ b/app/src/language/es/app.po @@ -33,7 +33,8 @@ msgstr "Usuario" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "Acción" @@ -56,7 +57,7 @@ msgstr "Añadir directiva a continuación" msgid "Add Location" msgstr "Agregar Ubicación" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "Agregar Sitio" @@ -72,11 +73,11 @@ msgstr "Agregado exitoso" msgid "Additional" msgstr "Adicional" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "Modo avanzado" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "URL Base de la API" @@ -85,11 +86,11 @@ msgstr "URL Base de la API" msgid "API Document" msgstr "Token de la API" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "Proxy de la API" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "Token de la API" @@ -97,7 +98,12 @@ msgstr "Token de la API" msgid "Arch" msgstr "Arquitectura" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +#, fuzzy +msgid "Are you sure to delete this banned IP immediately?" +msgstr "¿Está seguro de que quiere borrar?" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 msgid "Are you sure you want to clear all notifications?" msgstr "¿Está seguro de que desea borrar todas las notificaciones?" @@ -146,6 +152,15 @@ msgstr "Preguntar por ayuda a ChatGPT" msgid "Assistant" msgstr "Asistente" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +#, fuzzy +msgid "Auth" +msgstr "Autor" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -169,8 +184,8 @@ msgstr "Renovación automática habilitada por %{name}" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "Volver" @@ -178,18 +193,30 @@ msgstr "Volver" msgid "Back Home" msgstr "Volver al Inicio" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "Información general" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 msgid "Basic" msgstr "Básico" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "Modo Básico" @@ -273,12 +300,12 @@ msgid "Cleaning environment variables" msgstr "Borrar las variables de entorno" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "Borrar" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 msgid "Cleared successfully" msgstr "Limpiado exitoso" @@ -303,7 +330,7 @@ msgstr "Plantillas de configuración" msgid "Configuration file is test successful" msgstr "El archivo de configuración se probó exitosamente" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "Nombre de la configuración" @@ -311,7 +338,7 @@ msgstr "Nombre de la configuración" msgid "Configurations" msgstr "Configuraciones" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "Configurar SSL" @@ -341,7 +368,7 @@ msgstr "CPU:" msgid "Create" msgstr "Crear" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "Crear otro" @@ -380,7 +407,7 @@ msgstr "" msgid "Dashboard" msgstr "Panel" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "Base de datos (Opcional, default: database)" @@ -412,15 +439,15 @@ msgstr "Eliminar stream: %{site_name}" msgid "Deleted successfully" msgstr "Borrado exitoso" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "Desplegar" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "Falló el desplegado de %{conf_name} a %{node_name}" @@ -467,9 +494,9 @@ msgstr "Desactivar" msgid "Disable auto-renewal failed for %{name}" msgstr "No se pudo desactivar la renovación automática por %{name}" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "Desactivado" @@ -540,7 +567,7 @@ msgstr "¿Quieres eliminar esta transmisión?" msgid "Domain" msgstr "Dominio" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "Configuración de dominio creada con éxito" @@ -562,34 +589,34 @@ msgstr "Descargando la última versión" msgid "Dry run mode enabled" msgstr "Modo de ejecución de prueba habilitado" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "Duplicar" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "Duplicado con éxito de %{conf_name} a %{node_name}" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 msgid "Duplicate failed" msgstr "Duplicado fallido" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 msgid "Duplicate successfully" msgstr "Duplicado con éxito" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 msgid "Duplicate to local successfully" msgstr "Duplicado con éxito a local" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "Editar %{n}" @@ -610,24 +637,24 @@ msgstr "Editar Transmisión" msgid "Email" msgstr "Correo (*)" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "Correo (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 msgid "Enable" msgstr "Habilitar" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "Falló el habilitado de %{conf_name} en %{node_name}" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" @@ -635,12 +662,12 @@ msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" msgid "Enable auto-renewal failed for %{name}" msgstr "No se pudo activar la renovación automática por %{name}" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "Falló la habilitación" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 msgid "Enable successfully" msgstr "Habilitado con Éxito" @@ -650,19 +677,19 @@ msgstr "Habilitar TLS" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "Habilitado" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "Habilitado con éxito" @@ -731,7 +758,7 @@ msgstr "Error al habilitar %{msg}" msgid "Failed to get certificate information" msgstr "No se pudo obtener la información del certificado" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "" "No se pudo guardar, se detectó un error(es) de sintaxis en la configuración." @@ -757,7 +784,7 @@ msgstr "Archivo no encontrado" msgid "Filter" msgstr "Filtro" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "Terminado" @@ -825,6 +852,12 @@ msgstr "HTTP01" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 msgid "Import" msgstr "Importar" @@ -833,6 +866,11 @@ msgstr "Importar" msgid "Import Certificate" msgstr "Importar Certificado" +#: src/views/other/Login.vue:59 +#, fuzzy +msgid "Incorrect username or password" +msgstr "El nombre de usuario o contraseña son incorrectos" + #: src/constants/index.ts:18 msgid "Info" msgstr "Información" @@ -845,7 +883,7 @@ msgstr "Error de actualización de kernel inicial" msgid "Initialing core upgrader" msgstr "Inicializando la actualización del kernel" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "Instalar" @@ -866,6 +904,10 @@ msgstr "" msgid "Invalid" msgstr "Válido" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 msgid "Issue wildcard certificate" msgstr "Obtener certificado comodín" @@ -897,7 +939,7 @@ msgstr "Comprobado por última vez el" msgid "Leave blank for no change" msgstr "Para no modificar dejar en blanco" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "Dejar en blanco para el valor predeterminado: https://api.openai.com/" @@ -949,11 +991,11 @@ msgstr "Ubicaciones" msgid "Log" msgstr "Registro" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "Acceso" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "Acceso exitoso" @@ -961,7 +1003,7 @@ msgstr "Acceso exitoso" msgid "Logout successful" msgstr "Cierre de sesión exitoso" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "" @@ -1003,6 +1045,10 @@ msgstr "Administrar usuarios" msgid "Managed Certificate" msgstr "Certificado Administrado" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1016,7 +1062,7 @@ msgstr "Memoria y almacenamiento" msgid "Minutes" msgstr "" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 #, fuzzy msgid "Model" msgstr "Modo de ejecución" @@ -1031,7 +1077,7 @@ msgstr "Modificar" msgid "Modify Certificate" msgstr "Modificar Certificado" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "Modificar configuración" @@ -1050,12 +1096,12 @@ msgstr "Directiva multilínea" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "Nombre" @@ -1082,11 +1128,11 @@ msgstr "Se liberó una nueva versión" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "Siguiente" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 msgid "Nginx" msgstr "Nginx" @@ -1094,7 +1140,7 @@ msgstr "Nginx" msgid "Nginx Access Log Path" msgstr "Ruta de registro de acceso de Nginx" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 msgid "Nginx Configuration Parse Error" msgstr "Error de análisis de configuración de Nginx" @@ -1119,7 +1165,7 @@ msgid "Nginx restarted successfully" msgstr "Nginx reiniciado con éxito" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1127,6 +1173,7 @@ msgstr "Nginx reiniciado con éxito" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1157,7 +1204,7 @@ msgstr "Nota" msgid "Notification" msgstr "Notificación" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 msgid "Notifications" msgstr "Notificaciones" @@ -1181,7 +1228,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1211,7 +1258,7 @@ msgstr "Una vez que se complete la verificación, los registros se eliminarán." msgid "Online" msgstr "En línea" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "OpenAI" @@ -1223,13 +1270,13 @@ msgstr "SO" msgid "OS:" msgstr "SO:" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "Sobrescribir" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "Sobrescribir archivo existente" @@ -1237,11 +1284,11 @@ msgstr "Sobrescribir archivo existente" msgid "Params" msgstr "Parámetros" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "Contraseña" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "Contraseña (*)" @@ -1313,7 +1360,7 @@ msgstr "¡Seleccione al menos un nodo!" msgid "Pre-release" msgstr "Prelanzamiento" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "Configuración" @@ -1409,7 +1456,16 @@ msgstr "Recargando" msgid "Reloading nginx" msgstr "Recargando Nginx" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +#, fuzzy +msgid "Remove successfully" +msgstr "Eliminado con éxito" + +#: src/components/Notification/Notification.vue:52 msgid "Removed successfully" msgstr "Eliminado con éxito" @@ -1461,9 +1517,9 @@ msgstr "Corriendo" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "Guardar" @@ -1471,7 +1527,7 @@ msgstr "Guardar" msgid "Save Directive" msgstr "Guardar Directiva" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "Error al guardar %{msg}" @@ -1479,14 +1535,14 @@ msgstr "Error al guardar %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 msgid "Save successfully" msgstr "Guardado con éxito" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "Guardado con éxito" @@ -1511,8 +1567,9 @@ msgstr "Enviado" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "Error del servidor" @@ -1531,7 +1588,7 @@ msgid "server_name not found in directives" msgstr "No se encuentra server_name en las directivas" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "Se requiere el parámetro server_name" @@ -1583,7 +1640,7 @@ msgstr "Ruta de la llave del certificado SSL" msgid "SSL Certificate Path" msgstr "Ruta del certificado SSL" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 msgid "SSO Login" msgstr "Acceso SSO" @@ -1667,8 +1724,8 @@ msgstr "" msgid "System" msgstr "Sistema" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "Objetivo" @@ -1701,7 +1758,7 @@ msgstr "La entrada no es un Certificado SSL" msgid "The input is not a SSL Certificate Key" msgstr "La entrada no es una clave de certificado SSL" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1736,8 +1793,8 @@ msgstr "" msgid "The url is invalid" msgstr "La URL no es válida" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 #, fuzzy msgid "The url is invalid." msgstr "La URL no es válida" @@ -1764,6 +1821,7 @@ msgstr "Este campo es obligatorio" msgid "This field should not be empty" msgstr "Este campo no debe estar vacío" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "" @@ -1784,10 +1842,14 @@ msgstr "" "de la autoridad al backend, y debemos guardar este archivo y volver a cargar " "Nginx. ¿Estás seguro de que quieres continuar?" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "El token no es válido" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1840,11 +1902,15 @@ msgstr "URL" msgid "User" msgstr "Usuario" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "Nombre de usuario" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "Nombre de usuario (*)" @@ -1858,7 +1924,7 @@ msgstr "Válido" msgid "View" msgstr "Ver" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 msgid "View all notifications" msgstr "Ver todas las notificaciones" @@ -1874,7 +1940,7 @@ msgstr "Modo Básico" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "Advertencia" @@ -1909,6 +1975,7 @@ msgstr "Escribir certificado a disco" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "Si" diff --git a/app/src/language/fr_FR/app.po b/app/src/language/fr_FR/app.po index 659300a84..86dc63d6b 100644 --- a/app/src/language/fr_FR/app.po +++ b/app/src/language/fr_FR/app.po @@ -30,7 +30,8 @@ msgstr "Nom d'utilisateur" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "Action" @@ -53,7 +54,7 @@ msgstr "Ajouter une directive" msgid "Add Location" msgstr "Ajouter une localisation" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "Ajouter un site" @@ -72,11 +73,11 @@ msgstr "Mis à jour avec succés" msgid "Additional" msgstr "Supplémentaire" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "Mode avancé" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "URL de base de l'API" @@ -85,11 +86,11 @@ msgstr "URL de base de l'API" msgid "API Document" msgstr "Jeton d'API" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "Proxy d'API" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "Jeton d'API" @@ -98,7 +99,12 @@ msgstr "Jeton d'API" msgid "Arch" msgstr "Arch" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +#, fuzzy +msgid "Are you sure to delete this banned IP immediately?" +msgstr "Etes-vous sûr que vous voulez supprimer ?" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 #, fuzzy msgid "Are you sure you want to clear all notifications?" @@ -149,6 +155,15 @@ msgstr "Modèle ChatGPT" msgid "Assistant" msgstr "" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +#, fuzzy +msgid "Auth" +msgstr "Autheur" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -172,8 +187,8 @@ msgstr "Renouvellement automatique activé pour %{name}" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "Retour" @@ -181,18 +196,30 @@ msgstr "Retour" msgid "Back Home" msgstr "Retour au menu principal" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "Information générale" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 msgid "Basic" msgstr "Basique" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "Mode simple" @@ -279,12 +306,12 @@ msgid "Cleaning environment variables" msgstr "Nettoyage des variables d'environnement" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "Effacer" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 #, fuzzy msgid "Cleared successfully" @@ -310,7 +337,7 @@ msgstr "Modèles de configuration" msgid "Configuration file is test successful" msgstr "Le fichier de configuration est testé avec succès" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "Nom de la configuration" @@ -318,7 +345,7 @@ msgstr "Nom de la configuration" msgid "Configurations" msgstr "Configurations" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "Configurer SSL" @@ -349,7 +376,7 @@ msgstr "CPU :" msgid "Create" msgstr "Créé le" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "Créer un autre" @@ -388,7 +415,7 @@ msgstr "" msgid "Dashboard" msgstr "Dashboard" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "Base de données (Facultatif, par défaut : database)" @@ -422,15 +449,15 @@ msgstr "Supprimer le site : %{site_name}" msgid "Deleted successfully" msgstr "Désactivé avec succès" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "" @@ -480,9 +507,9 @@ msgstr "Désactivé" msgid "Disable auto-renewal failed for %{name}" msgstr "La désactivation du renouvellement automatique a échoué pour %{name}" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "Désactivé" @@ -557,7 +584,7 @@ msgstr "Voulez-vous supprimer ce serveur ?" msgid "Domain" msgstr "" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "La configuration du domaine a été créée avec succès" @@ -580,38 +607,38 @@ msgstr "Téléchargement de la dernière version" msgid "Dry run mode enabled" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "Dupliquer" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 #, fuzzy msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "Dupliqué avec succès" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 #, fuzzy msgid "Duplicate failed" msgstr "Dupliquer" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 #, fuzzy msgid "Duplicate successfully" msgstr "Dupliqué avec succès" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 #, fuzzy msgid "Duplicate to local successfully" msgstr "Dupliqué avec succès" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "Modifier %{n}" @@ -633,25 +660,25 @@ msgstr "Modifier le site" msgid "Email" msgstr "Email (*)" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "Email (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 #, fuzzy msgid "Enable" msgstr "Activé" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "" @@ -659,12 +686,12 @@ msgstr "" msgid "Enable auto-renewal failed for %{name}" msgstr "Échec de l'activation du renouvellement automatique pour %{name}" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "Échec de l'activation" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 #, fuzzy msgid "Enable successfully" msgstr "Activé avec succès" @@ -675,19 +702,19 @@ msgstr "Activer TLS" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "Activé" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "Activé avec succès" @@ -758,7 +785,7 @@ msgstr "Impossible d'activer %{msg}" msgid "Failed to get certificate information" msgstr "Échec de l'obtention des informations sur le certificat" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "" "Échec de l'enregistrement, une ou plusieurs erreurs de syntaxe ont été " @@ -786,7 +813,7 @@ msgstr "Fichier introuvable" msgid "Filter" msgstr "Filtrer" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "Finie" @@ -856,6 +883,12 @@ msgstr "HTTP01" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 #, fuzzy msgid "Import" @@ -866,6 +899,11 @@ msgstr "Exporter" msgid "Import Certificate" msgstr "État du certificat" +#: src/views/other/Login.vue:59 +#, fuzzy +msgid "Incorrect username or password" +msgstr "Le pseudo ou mot de passe est incorect" + #: src/constants/index.ts:18 msgid "Info" msgstr "" @@ -878,7 +916,7 @@ msgstr "Erreur du programme de mise à niveau initial du core" msgid "Initialing core upgrader" msgstr "Initialisation du programme de mise à niveau du core" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "Installer" @@ -898,6 +936,10 @@ msgstr "" msgid "Invalid" msgstr "" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 #, fuzzy msgid "Issue wildcard certificate" @@ -931,7 +973,7 @@ msgstr "Dernière vérification le" msgid "Leave blank for no change" msgstr "Laisser vide pour aucun changement" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "Laissez vide pour la valeur par défaut : https://api.openai.com/" @@ -990,11 +1032,11 @@ msgstr "Localisations" msgid "Log" msgstr "Connexion" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "Connexion" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "Connexion réussie" @@ -1002,7 +1044,7 @@ msgstr "Connexion réussie" msgid "Logout successful" msgstr "Déconnexion réussie" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "" @@ -1047,6 +1089,10 @@ msgstr "Gérer les utilisateurs" msgid "Managed Certificate" msgstr "Changer de certificat" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1060,7 +1106,7 @@ msgstr "Mémoire et stockage" msgid "Minutes" msgstr "" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 #, fuzzy msgid "Model" msgstr "Mode d'exécution" @@ -1076,7 +1122,7 @@ msgstr "Modifier" msgid "Modify Certificate" msgstr "État du certificat" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "Modifier la configuration" @@ -1095,12 +1141,12 @@ msgstr "Directive multiligne" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "Nom" @@ -1127,11 +1173,11 @@ msgstr "Nouvelle version publiée" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "Suivant" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 #, fuzzy msgid "Nginx" msgstr "Journal Nginx" @@ -1140,7 +1186,7 @@ msgstr "Journal Nginx" msgid "Nginx Access Log Path" msgstr "Chemin du journal d'accès Nginx" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 msgid "Nginx Configuration Parse Error" msgstr "Erreur d'analyse de configuration Nginx" @@ -1165,7 +1211,7 @@ msgid "Nginx restarted successfully" msgstr "Nginx a redémarré avec succès" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1173,6 +1219,7 @@ msgstr "Nginx a redémarré avec succès" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1205,7 +1252,7 @@ msgstr "Note" msgid "Notification" msgstr "Certification" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 #, fuzzy msgid "Notifications" msgstr "Certification" @@ -1230,7 +1277,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1260,7 +1307,7 @@ msgstr "" msgid "Online" msgstr "" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "OpenAI" @@ -1272,13 +1319,13 @@ msgstr "OS" msgid "OS:" msgstr "OS :" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "" @@ -1286,11 +1333,11 @@ msgstr "" msgid "Params" msgstr "Paramètres" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "Mot de passe" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "Mot de passe (*)" @@ -1360,7 +1407,7 @@ msgstr "" msgid "Pre-release" msgstr "" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "Préférence" @@ -1459,7 +1506,16 @@ msgstr "Rechargement" msgid "Reloading nginx" msgstr "Rechargement de nginx" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +#, fuzzy +msgid "Remove successfully" +msgstr "Enregistré avec succès" + +#: src/components/Notification/Notification.vue:52 #, fuzzy msgid "Removed successfully" msgstr "Enregistré avec succès" @@ -1517,9 +1573,9 @@ msgstr "En cours d'éxécution" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "Enregistrer" @@ -1527,7 +1583,7 @@ msgstr "Enregistrer" msgid "Save Directive" msgstr "Enregistrer la directive" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "Enregistrer l'erreur %{msg}" @@ -1535,14 +1591,14 @@ msgstr "Enregistrer l'erreur %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 msgid "Save successfully" msgstr "Sauvegarde réussie" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "Enregistré avec succès" @@ -1567,8 +1623,9 @@ msgstr "Envoyer" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "Erreur du serveur" @@ -1587,7 +1644,7 @@ msgid "server_name not found in directives" msgstr "server_name introuvable dans les directives" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "Le paramètre server_name est obligatoire" @@ -1643,7 +1700,7 @@ msgstr "Chemin de la clé du certificat SSL" msgid "SSL Certificate Path" msgstr "Chemin du certificat SSL" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 #, fuzzy msgid "SSO Login" msgstr "Connexion" @@ -1731,8 +1788,8 @@ msgstr "" msgid "System" msgstr "Système" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "" @@ -1766,7 +1823,7 @@ msgstr "" msgid "The input is not a SSL Certificate Key" msgstr "Chemin de la clé du certificat SSL" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1802,8 +1859,8 @@ msgstr "" msgid "The url is invalid" msgstr "" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 msgid "The url is invalid." msgstr "" @@ -1832,6 +1889,7 @@ msgstr "" msgid "This field should not be empty" msgstr "" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "" @@ -1852,10 +1910,14 @@ msgstr "" "transmettre la demande de l'autorité au backend, et nous devons enregistrer " "ce fichier et recharger le Nginx. Êtes-vous sûr de vouloir continuer?" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1909,11 +1971,15 @@ msgstr "" msgid "User" msgstr "Nom d'utilisateur" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "Nom d'utilisateur" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "Nom d'utilisateur (*)" @@ -1927,7 +1993,7 @@ msgstr "" msgid "View" msgstr "Voir" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 #, fuzzy msgid "View all notifications" msgstr "Certification" @@ -1943,7 +2009,7 @@ msgstr "Mode simple" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "Avertissement" @@ -1976,6 +2042,7 @@ msgstr "Écriture du certificat sur le disque" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "Oui" diff --git a/app/src/language/ko_KR/app.po b/app/src/language/ko_KR/app.po index 748dcf612..13dd01e1e 100644 --- a/app/src/language/ko_KR/app.po +++ b/app/src/language/ko_KR/app.po @@ -32,7 +32,8 @@ msgstr "사용자 이름" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "작업" @@ -55,7 +56,7 @@ msgstr "아래에 지시문 추가" msgid "Add Location" msgstr "위치 추가" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "사이트 추가" @@ -71,11 +72,11 @@ msgstr "성공적으로 추가됨" msgid "Additional" msgstr "추가적인" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "고급 모드" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "API 기본 URL" @@ -84,11 +85,11 @@ msgstr "API 기본 URL" msgid "API Document" msgstr "API 토큰" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "API 프록시" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "API 토큰" @@ -96,7 +97,12 @@ msgstr "API 토큰" msgid "Arch" msgstr "아키텍처" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +#, fuzzy +msgid "Are you sure to delete this banned IP immediately?" +msgstr "정말 삭제하시겠습니까?" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 msgid "Are you sure you want to clear all notifications?" msgstr "모든 알림을 지우시겠습니까?" @@ -145,6 +151,15 @@ msgstr "ChatGPT에게 도움 요청" msgid "Assistant" msgstr "조수" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +#, fuzzy +msgid "Auth" +msgstr "저자" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -168,8 +183,8 @@ msgstr "%{name}에 대한 자동 갱신 활성화됨" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "뒤로" @@ -177,18 +192,30 @@ msgstr "뒤로" msgid "Back Home" msgstr "홈으로" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "기본 정보" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 msgid "Basic" msgstr "기본" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "기본 모드" @@ -272,12 +299,12 @@ msgid "Cleaning environment variables" msgstr "환경 변수 정리" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "클리어" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 msgid "Cleared successfully" msgstr "성공적으로 제거됨" @@ -301,7 +328,7 @@ msgstr "구성 템플릿" msgid "Configuration file is test successful" msgstr "구성 파일 테스트 성공" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "구성 이름" @@ -309,7 +336,7 @@ msgstr "구성 이름" msgid "Configurations" msgstr "구성들" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "SSL 구성하기" @@ -339,7 +366,7 @@ msgstr "CPU:" msgid "Create" msgstr "생성" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "다른 것 생성하기" @@ -378,7 +405,7 @@ msgstr "" msgid "Dashboard" msgstr "대시보드" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "데이터베이스 (선택사항, 기본값: database)" @@ -410,15 +437,15 @@ msgstr "스트림 삭제: %{stream_name}" msgid "Deleted successfully" msgstr "성공적으로 삭제됨" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "배포" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패" @@ -465,9 +492,9 @@ msgstr "비활성화" msgid "Disable auto-renewal failed for %{name}" msgstr "%{name}의 자동 갱신 비활성화 실패" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "비활성화됨" @@ -538,7 +565,7 @@ msgstr "이 업스트림을 제거하시겠습니까?" msgid "Domain" msgstr "도메인" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "도메인 구성이 성공적으로 생성되었습니다" @@ -559,35 +586,35 @@ msgstr "최신 릴리스 다운로드 중" msgid "Dry run mode enabled" msgstr "드라이런 모드 활성화됨" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "복제" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 msgid "Duplicate failed" msgstr "복제 실패" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 #, fuzzy msgid "Duplicate successfully" msgstr "성공적으로 복제됨" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 msgid "Duplicate to local successfully" msgstr "로컬로 성공적으로 복제됨" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "%{n} 편집" @@ -608,24 +635,24 @@ msgstr "스트림 편집" msgid "Email" msgstr "이메일 (*)" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "이메일 (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 msgid "Enable" msgstr "활성화" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "%{node_name}에서 %{conf_name} 활성화 실패" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" @@ -633,12 +660,12 @@ msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" msgid "Enable auto-renewal failed for %{name}" msgstr "%{name}에 대한 자동 갱신 활성화 실패" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "활성화 실패" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 msgid "Enable successfully" msgstr "성공적으로 활성화" @@ -648,19 +675,19 @@ msgstr "TLS 활성화" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "활성화됨" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "성공적으로 활성화됨" @@ -730,7 +757,7 @@ msgstr "%{msg} 활성화 실패" msgid "Failed to get certificate information" msgstr "인증서 정보 가져오기 실패" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "저장 실패, 구성에서 구문 오류가 감지되었습니다." @@ -756,7 +783,7 @@ msgstr "파일을 찾을 수 없음" msgid "Filter" msgstr "필터" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "완료됨" @@ -828,6 +855,12 @@ msgstr "HTTP01" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 msgid "Import" msgstr "가져오기" @@ -837,6 +870,11 @@ msgstr "가져오기" msgid "Import Certificate" msgstr "인증서 상태" +#: src/views/other/Login.vue:59 +#, fuzzy +msgid "Incorrect username or password" +msgstr "사용자 이름 또는 비밀번호가 올바르지 않습니다" + #: src/constants/index.ts:18 msgid "Info" msgstr "정보" @@ -849,7 +887,7 @@ msgstr "초기 코어 업그레이더 오류" msgid "Initialing core upgrader" msgstr "코어 업그레이더 초기화" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "설치" @@ -871,6 +909,10 @@ msgstr "간격" msgid "Invalid" msgstr "유효함" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 #, fuzzy msgid "Issue wildcard certificate" @@ -904,7 +946,7 @@ msgstr "마지막 확인 시간" msgid "Leave blank for no change" msgstr "변경사항이 없으면 비워두세요" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "기본값을 사용하려면 비워 두세요: https://api.openai.com/" @@ -961,11 +1003,11 @@ msgstr "위치들" msgid "Log" msgstr "로그인" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "로그인" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "로그인 성공" @@ -973,7 +1015,7 @@ msgstr "로그인 성공" msgid "Logout successful" msgstr "로그아웃 성공" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "로그관리" @@ -1023,6 +1065,10 @@ msgstr "사용자 관리" msgid "Managed Certificate" msgstr "인증서 유효" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1036,7 +1082,7 @@ msgstr "메모리 및 저장소" msgid "Minutes" msgstr "분" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 #, fuzzy msgid "Model" msgstr "실행 모드" @@ -1053,7 +1099,7 @@ msgstr "설정 수정" msgid "Modify Certificate" msgstr "인증서 상태" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "설정 수정" @@ -1073,12 +1119,12 @@ msgstr "단일 지시문" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "이름" @@ -1105,11 +1151,11 @@ msgstr "새 버전 출시" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "다음" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 msgid "Nginx" msgstr "Nginx" @@ -1117,7 +1163,7 @@ msgstr "Nginx" msgid "Nginx Access Log Path" msgstr "Nginx 접근 로그 경로" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 #, fuzzy msgid "Nginx Configuration Parse Error" msgstr "Nginx 구성 오류름" @@ -1145,7 +1191,7 @@ msgid "Nginx restarted successfully" msgstr "Nginx가 성공적으로 재시작됨" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1153,6 +1199,7 @@ msgstr "Nginx가 성공적으로 재시작됨" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1184,7 +1231,7 @@ msgstr "참고" msgid "Notification" msgstr "알림" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 #, fuzzy msgid "Notifications" msgstr "알림" @@ -1210,7 +1257,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1240,7 +1287,7 @@ msgstr "검증이 완료되면, 레코드는 제거됩니다." msgid "Online" msgstr "온라인" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "오픈AI" @@ -1253,13 +1300,13 @@ msgstr "OS" msgid "OS:" msgstr "OS:" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "덮어쓰기" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "기존 파일 덮어쓰기" @@ -1267,11 +1314,11 @@ msgstr "기존 파일 덮어쓰기" msgid "Params" msgstr "파라미터" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "비밀번호" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "비밀번호 (*)" @@ -1336,7 +1383,7 @@ msgstr "적어도 하나의 노드를 선택해주세요!" msgid "Pre-release" msgstr "사전 출시" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "환경설정" @@ -1434,7 +1481,16 @@ msgstr "리로딩 중" msgid "Reloading nginx" msgstr "Nginx 리로딩 중" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +#, fuzzy +msgid "Remove successfully" +msgstr "성공적으로 제거됨" + +#: src/components/Notification/Notification.vue:52 #, fuzzy msgid "Removed successfully" msgstr "성공적으로 제거됨" @@ -1493,9 +1549,9 @@ msgstr "실행 중" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "저장" @@ -1503,7 +1559,7 @@ msgstr "저장" msgid "Save Directive" msgstr "지시문 저장" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "저장 오류 %{msg}" @@ -1511,15 +1567,15 @@ msgstr "저장 오류 %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 #, fuzzy msgid "Save successfully" msgstr "성공적으로 저장됨" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "성공적으로 저장됨" @@ -1544,8 +1600,9 @@ msgstr "보내기" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "서버 오류" @@ -1564,7 +1621,7 @@ msgid "server_name not found in directives" msgstr "directives에서 server_name을 찾을 수 없습니다" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "server_name 매개변수가 필요합니다" @@ -1620,7 +1677,7 @@ msgstr "SSL 인증서 키 경로" msgid "SSL Certificate Path" msgstr "SSL 인증서 경로" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 #, fuzzy msgid "SSO Login" msgstr "SSO 로그인" @@ -1707,8 +1764,8 @@ msgstr "" msgid "System" msgstr "시스템" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "대상" @@ -1742,7 +1799,7 @@ msgstr "입력이 SSL 인증서가 아닙니다" msgid "The input is not a SSL Certificate Key" msgstr "Certificate Status" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1778,8 +1835,8 @@ msgstr "" msgid "The url is invalid" msgstr "유효한 URL이 아닙니다" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 #, fuzzy msgid "The url is invalid." msgstr "유효한 URL이 아닙니다" @@ -1806,6 +1863,7 @@ msgstr "이 필드는 필수입니다" msgid "This field should not be empty" msgstr "이 필드는 비워둘 수 없습니다" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "팁" @@ -1825,10 +1883,14 @@ msgstr "" "시할 수 있는 위치를 추가해야 하며,이 파일을 저장하고 Nginx를 다시로드해야 합" "니다.계속하시겠습니까?" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "토큰이 유효하지 않습니다" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1884,11 +1946,15 @@ msgstr "URL" msgid "User" msgstr "사용자 이름" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "사용자 이름" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "사용자 이름 (*)" @@ -1902,7 +1968,7 @@ msgstr "유효함" msgid "View" msgstr "보기" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 #, fuzzy msgid "View all notifications" msgstr "Certificate is valid" @@ -1919,7 +1985,7 @@ msgstr "기본 모드" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "경고" @@ -1954,6 +2020,7 @@ msgstr "인증서를 디스크에 쓰기" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "예" diff --git a/app/src/language/messages.pot b/app/src/language/messages.pot index a2c396cac..8039173c1 100644 --- a/app/src/language/messages.pot +++ b/app/src/language/messages.pot @@ -24,6 +24,7 @@ msgstr "" #: src/views/domain/DomainList.vue:47 #: src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 +#: src/views/preference/AuthSettings.vue:26 #: src/views/stream/StreamList.vue:47 #: src/views/user/User.vue:43 msgid "Action" @@ -49,7 +50,7 @@ msgid "Add Location" msgstr "" #: src/routes/index.ts:64 -#: src/views/domain/DomainAdd.vue:93 +#: src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "" @@ -65,12 +66,12 @@ msgstr "" msgid "Additional" msgstr "" -#: src/views/domain/DomainEdit.vue:199 -#: src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 +#: src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "" @@ -78,11 +79,11 @@ msgstr "" msgid "API Document" msgstr "" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "" @@ -90,7 +91,11 @@ msgstr "" msgid "Arch" msgstr "" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +msgid "Are you sure to delete this banned IP immediately?" +msgstr "" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 msgid "Are you sure you want to clear all notifications?" msgstr "" @@ -136,6 +141,14 @@ msgstr "" msgid "Assistant" msgstr "" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +msgid "Auth" +msgstr "" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -160,9 +173,9 @@ msgstr "" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 #: src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 +#: src/views/domain/DomainEdit.vue:254 #: src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "" @@ -170,19 +183,31 @@ msgstr "" msgid "Back Home" msgstr "" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 msgid "Basic" msgstr "" -#: src/views/domain/DomainEdit.vue:202 -#: src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 +#: src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "" @@ -266,12 +291,12 @@ msgid "Cleaning environment variables" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 msgid "Cleared successfully" msgstr "" @@ -295,7 +320,7 @@ msgstr "" msgid "Configuration file is test successful" msgstr "" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "" @@ -303,7 +328,7 @@ msgstr "" msgid "Configurations" msgstr "" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "" @@ -333,7 +358,7 @@ msgstr "" msgid "Create" msgstr "" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "" @@ -371,7 +396,7 @@ msgstr "" msgid "Dashboard" msgstr "" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "" @@ -403,15 +428,15 @@ msgstr "" msgid "Deleted successfully" msgstr "" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "" @@ -460,10 +485,10 @@ msgid "Disable auto-renewal failed for %{name}" msgstr "" #: src/views/domain/cert/ChangeCert.vue:44 -#: src/views/domain/DomainEdit.vue:185 +#: src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 #: src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 +#: src/views/stream/StreamEdit.vue:175 #: src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "" @@ -536,7 +561,7 @@ msgstr "" msgid "Domain" msgstr "" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "" @@ -556,35 +581,35 @@ msgstr "" msgid "Dry run mode enabled" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 msgid "Duplicate failed" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 msgid "Duplicate successfully" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 msgid "Duplicate to local successfully" msgstr "" -#: src/views/domain/DomainEdit.vue:174 -#: src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 +#: src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "" @@ -605,24 +630,24 @@ msgstr "" msgid "Email" msgstr "" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 msgid "Enable" msgstr "" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "" @@ -630,12 +655,12 @@ msgstr "" msgid "Enable auto-renewal failed for %{name}" msgstr "" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 msgid "Enable successfully" msgstr "" @@ -645,22 +670,22 @@ msgstr "" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 +#: src/views/domain/DomainEdit.vue:177 #: src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 +#: src/views/stream/StreamEdit.vue:169 #: src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 #: src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "" @@ -730,8 +755,8 @@ msgstr "" msgid "Failed to get certificate information" msgstr "" -#: src/views/domain/DomainEdit.vue:132 -#: src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 +#: src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "" @@ -757,7 +782,7 @@ msgid "Filter" msgstr "" #: src/language/constants.ts:19 -#: src/views/domain/DomainAdd.vue:101 +#: src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "" @@ -825,6 +850,10 @@ msgstr "" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "If the number of login failed attempts from a ip reach the max attempts in ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 msgid "Import" msgstr "" @@ -834,6 +863,10 @@ msgstr "" msgid "Import Certificate" msgstr "" +#: src/views/other/Login.vue:59 +msgid "Incorrect username or password" +msgstr "" + #: src/constants/index.ts:18 msgid "Info" msgstr "" @@ -847,7 +880,7 @@ msgid "Initialing core upgrader" msgstr "" #: src/routes/index.ts:273 -#: src/views/other/Install.vue:136 +#: src/views/other/Install.vue:135 msgid "Install" msgstr "" @@ -867,6 +900,10 @@ msgstr "" msgid "Invalid" msgstr "" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 msgid "Issue wildcard certificate" msgstr "" @@ -897,7 +934,7 @@ msgstr "" msgid "Leave blank for no change" msgstr "" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "" @@ -949,12 +986,12 @@ msgid "Log" msgstr "" #: src/routes/index.ts:279 -#: src/views/other/Login.vue:147 +#: src/views/other/Login.vue:159 msgid "Login" msgstr "" +#: src/views/other/Login.vue:109 #: src/views/other/Login.vue:51 -#: src/views/other/Login.vue:97 msgid "Login successful" msgstr "" @@ -962,7 +999,7 @@ msgstr "" msgid "Logout successful" msgstr "" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "" @@ -997,6 +1034,10 @@ msgstr "" msgid "Managed Certificate" msgstr "" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1010,7 +1051,7 @@ msgstr "" msgid "Minutes" msgstr "" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 msgid "Model" msgstr "" @@ -1025,7 +1066,7 @@ msgstr "" msgid "Modify Certificate" msgstr "" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "" @@ -1044,12 +1085,12 @@ msgstr "" #: src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 #: src/views/stream/StreamList.vue:187 msgid "Name" @@ -1077,11 +1118,11 @@ msgstr "" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 msgid "Nginx" msgstr "" @@ -1089,8 +1130,8 @@ msgstr "" msgid "Nginx Access Log Path" msgstr "" -#: src/views/domain/DomainEdit.vue:217 -#: src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 +#: src/views/stream/StreamEdit.vue:207 msgid "Nginx Configuration Parse Error" msgstr "" @@ -1116,7 +1157,7 @@ msgid "Nginx restarted successfully" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1124,6 +1165,7 @@ msgstr "" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1154,7 +1196,7 @@ msgstr "" msgid "Notification" msgstr "" -#: src/components/Notification/Notification.vue:80 +#: src/components/Notification/Notification.vue:82 #: src/routes/index.ts:221 msgid "Notifications" msgstr "" @@ -1179,7 +1221,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1209,7 +1251,7 @@ msgstr "" msgid "Online" msgstr "" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "" @@ -1221,13 +1263,13 @@ msgstr "" msgid "OS:" msgstr "" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "" @@ -1235,12 +1277,12 @@ msgstr "" msgid "Params" msgstr "" -#: src/views/other/Login.vue:132 +#: src/views/other/Login.vue:144 #: src/views/user/User.vue:18 msgid "Password" msgstr "" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "" @@ -1300,7 +1342,7 @@ msgid "Pre-release" msgstr "" #: src/routes/index.ts:239 -#: src/views/preference/Preference.vue:96 +#: src/views/preference/Preference.vue:105 msgid "Preference" msgstr "" @@ -1391,7 +1433,15 @@ msgstr "" msgid "Reloading nginx" msgstr "" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +msgid "Remove successfully" +msgstr "" + +#: src/components/Notification/Notification.vue:52 msgid "Removed successfully" msgstr "" @@ -1444,10 +1494,10 @@ msgstr "" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 #: src/views/config/ConfigEdit.vue:96 -#: src/views/domain/DomainEdit.vue:263 +#: src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 -#: src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 +#: src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "" @@ -1456,7 +1506,7 @@ msgid "Save Directive" msgstr "" #: src/views/config/ConfigEdit.vue:57 -#: src/views/domain/DomainAdd.vue:50 +#: src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "" @@ -1464,15 +1514,15 @@ msgstr "" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 msgid "Save successfully" msgstr "" #: src/views/config/ConfigEdit.vue:55 -#: src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "" @@ -1499,8 +1549,9 @@ msgstr "" #: src/views/config/ConfigEdit.vue:40 #: src/views/domain/DomainList.vue:81 #: src/views/environment/Environment.vue:139 -#: src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 +#: src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 #: src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 #: src/views/system/Upgrade.vue:42 @@ -1520,7 +1571,7 @@ msgid "server_name not found in directives" msgstr "" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "" @@ -1570,7 +1621,7 @@ msgstr "" msgid "SSL Certificate Path" msgstr "" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 msgid "SSO Login" msgstr "" @@ -1649,8 +1700,8 @@ msgstr "" msgid "System" msgstr "" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "" @@ -1679,7 +1730,7 @@ msgstr "" msgid "The input is not a SSL Certificate Key" msgstr "" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "The model name should only contain letters, unicode, numbers, hyphens, dashes, and dots." msgstr "" @@ -1704,8 +1755,8 @@ msgstr "" msgid "The url is invalid" msgstr "" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 msgid "The url is invalid." msgstr "" @@ -1731,6 +1782,7 @@ msgstr "" msgid "This field should not be empty" msgstr "" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "" @@ -1743,10 +1795,14 @@ msgstr "" msgid "To make sure the certification auto-renewal can work normally, we need to add a location which can proxy the request from authority to backend, and we need to save this file and reload the Nginx. Are you sure you want to continue?" msgstr "" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1804,12 +1860,16 @@ msgstr "" msgid "User" msgstr "" -#: src/views/other/Login.vue:122 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 #: src/views/user/User.vue:9 msgid "Username" msgstr "" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "" @@ -1823,7 +1883,7 @@ msgstr "" msgid "View" msgstr "" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 msgid "View all notifications" msgstr "" @@ -1838,7 +1898,7 @@ msgstr "" #: src/constants/index.ts:17 #: src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "" @@ -1865,6 +1925,7 @@ msgstr "" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "" diff --git a/app/src/language/ru_RU/app.po b/app/src/language/ru_RU/app.po index 3fc4e063d..c18b26bda 100644 --- a/app/src/language/ru_RU/app.po +++ b/app/src/language/ru_RU/app.po @@ -28,7 +28,8 @@ msgstr "Пользователь" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "Действие" @@ -51,7 +52,7 @@ msgstr "Добавить директиву ниже" msgid "Add Location" msgstr "Добавить Location" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "Добавть Сайт" @@ -70,11 +71,11 @@ msgstr "Обновлено успешно" msgid "Additional" msgstr "Дополнительно" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "Расширенный режим" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "" @@ -82,11 +83,11 @@ msgstr "" msgid "API Document" msgstr "" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "" @@ -94,7 +95,12 @@ msgstr "" msgid "Arch" msgstr "" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +#, fuzzy +msgid "Are you sure to delete this banned IP immediately?" +msgstr "Вы уверены, что хотите удалить?" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 #, fuzzy msgid "Are you sure you want to clear all notifications?" @@ -147,6 +153,15 @@ msgstr "Обратитесь за помощью к ChatGPT" msgid "Assistant" msgstr "Ассистент" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +#, fuzzy +msgid "Auth" +msgstr "Автор" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -170,8 +185,8 @@ msgstr "Автообновление включено для %{name}" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "Назад" @@ -180,19 +195,31 @@ msgstr "Назад" msgid "Back Home" msgstr "Вернутся" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "Основная информация" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 #, fuzzy msgid "Basic" msgstr "Простой режим" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "Простой режим" @@ -280,12 +307,12 @@ msgid "Cleaning environment variables" msgstr "Очистка переменных среды" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "Очистить" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 #, fuzzy msgid "Cleared successfully" @@ -312,7 +339,7 @@ msgstr "Шаблоны конфигураций" msgid "Configuration file is test successful" msgstr "Проверка конфигурации успешна" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "Название конфигурации" @@ -320,7 +347,7 @@ msgstr "Название конфигурации" msgid "Configurations" msgstr "Конфигурации" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "Настроить SSL" @@ -351,7 +378,7 @@ msgstr "CPU:" msgid "Create" msgstr "Создан в" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "Создать еще" @@ -390,7 +417,7 @@ msgstr "" msgid "Dashboard" msgstr "Доска" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "База данных (Опционально, по умолчанию: database)" @@ -423,15 +450,15 @@ msgstr "" msgid "Deleted successfully" msgstr "Отключено успешно" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "" @@ -481,9 +508,9 @@ msgstr "Отключить" msgid "Disable auto-renewal failed for %{name}" msgstr "Не удалось отключить автоматическое продление для %{name}" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "Отключено" @@ -562,7 +589,7 @@ msgstr "Вы хотите удалить этот сервер?" msgid "Domain" msgstr "" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "Конфигурация домена успешно создана" @@ -584,38 +611,38 @@ msgstr "Загрузка последней версии" msgid "Dry run mode enabled" msgstr "Включен пробный режим" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "Дублировать" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 #, fuzzy msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "Продублированно %{conf_name} в %{node_name}" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 #, fuzzy msgid "Duplicate failed" msgstr "Дублировать не удалось" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 #, fuzzy msgid "Duplicate successfully" msgstr "Продублированно" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 #, fuzzy msgid "Duplicate to local successfully" msgstr "Saved successfully" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "Редактировать %{n}" @@ -637,25 +664,25 @@ msgstr "Редактировать Сайт" msgid "Email" msgstr "Email (*)" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "Email (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 #, fuzzy msgid "Enable" msgstr "Включить" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "Включение %{conf_name} in %{node_name} нипалучилася" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "Включение %{conf_name} in %{node_name} успешно" @@ -663,12 +690,12 @@ msgstr "Включение %{conf_name} in %{node_name} успешно" msgid "Enable auto-renewal failed for %{name}" msgstr "Не удалось включить автоматическое продление для %{name}" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "Включить не удалось" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 #, fuzzy msgid "Enable successfully" msgstr "Активировано успешно" @@ -679,19 +706,19 @@ msgstr "Включить TLS" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "Включено" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "Активировано успешно" @@ -762,7 +789,7 @@ msgstr "Не удалось включить %{msg}" msgid "Failed to get certificate information" msgstr "Не удалось получить информацию о сертификате" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "Не удалось сохранить, обнаружены синтаксические ошибки в конфигурации." @@ -788,7 +815,7 @@ msgstr "Файл не найден" msgid "Filter" msgstr "Фильтр" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "Готово" @@ -860,6 +887,12 @@ msgstr "" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 #, fuzzy msgid "Import" @@ -870,6 +903,11 @@ msgstr "Экспорт" msgid "Import Certificate" msgstr "Статус сертификата" +#: src/views/other/Login.vue:59 +#, fuzzy +msgid "Incorrect username or password" +msgstr "Имя пользователя или пароль неверны" + #: src/constants/index.ts:18 msgid "Info" msgstr "" @@ -882,7 +920,7 @@ msgstr "Ошибка первоначального обновления ядр msgid "Initialing core upgrader" msgstr "Инициализация программы обновления ядра" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "Установить" @@ -904,6 +942,10 @@ msgstr "" msgid "Invalid" msgstr "Действительный" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 #, fuzzy msgid "Issue wildcard certificate" @@ -938,7 +980,7 @@ msgstr "Последняя проверка в" msgid "Leave blank for no change" msgstr "Оставьте пустым без изменений" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "Оставьте пустым для значения по умолчанию: https://api.openai.com/" @@ -995,11 +1037,11 @@ msgstr "Locations" msgid "Log" msgstr "Логин" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "Логин" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "Авторизация успешна" @@ -1007,7 +1049,7 @@ msgstr "Авторизация успешна" msgid "Logout successful" msgstr "Выход выполнен успешно" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "" @@ -1052,6 +1094,10 @@ msgstr "Пользователи" msgid "Managed Certificate" msgstr "Управление сертификатами" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1065,7 +1111,7 @@ msgstr "Память и хранилище" msgid "Minutes" msgstr "" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 #, fuzzy msgid "Model" msgstr "Расширенный режим" @@ -1082,7 +1128,7 @@ msgstr "Изменить" msgid "Modify Certificate" msgstr "Статус сертификата" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "Изменить конфигурацию" @@ -1102,12 +1148,12 @@ msgstr "Одиночная директива" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "Имя" @@ -1134,11 +1180,11 @@ msgstr "Вышла новая версия" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "Дальше" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 #, fuzzy msgid "Nginx" msgstr "Журнал" @@ -1147,7 +1193,7 @@ msgstr "Журнал" msgid "Nginx Access Log Path" msgstr "Путь для Nginx Access Log" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 #, fuzzy msgid "Nginx Configuration Parse Error" msgstr "Ошибка синтаксического анализа конфигурации Nginx" @@ -1175,7 +1221,7 @@ msgid "Nginx restarted successfully" msgstr "Nginx успешно перезапущен" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1183,6 +1229,7 @@ msgstr "Nginx успешно перезапущен" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1214,7 +1261,7 @@ msgstr "Заметка" msgid "Notification" msgstr "Сертификат" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 #, fuzzy msgid "Notifications" msgstr "Уведомления" @@ -1240,7 +1287,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1270,7 +1317,7 @@ msgstr "" msgid "Online" msgstr "" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "" @@ -1283,13 +1330,13 @@ msgstr "OS:" msgid "OS:" msgstr "OS:" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "" @@ -1297,11 +1344,11 @@ msgstr "" msgid "Params" msgstr "Параметры" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "Пароль" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "Пароль (*)" @@ -1366,7 +1413,7 @@ msgstr "" msgid "Pre-release" msgstr "" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "Настройки" @@ -1464,7 +1511,16 @@ msgstr "Перезагружается" msgid "Reloading nginx" msgstr "Перезагружается nginx" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +#, fuzzy +msgid "Remove successfully" +msgstr "Успешно сохранено" + +#: src/components/Notification/Notification.vue:52 #, fuzzy msgid "Removed successfully" msgstr "Успешно сохранено" @@ -1523,9 +1579,9 @@ msgstr "Выполняется" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "Сохранить" @@ -1533,7 +1589,7 @@ msgstr "Сохранить" msgid "Save Directive" msgstr "Сохранить директиву" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "Ошибка сохранения %{msg}" @@ -1541,15 +1597,15 @@ msgstr "Ошибка сохранения %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 #, fuzzy msgid "Save successfully" msgstr "Успешно сохранено" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "Успешно сохранено" @@ -1574,8 +1630,9 @@ msgstr "Отправлено" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "Ошибка сервера" @@ -1594,7 +1651,7 @@ msgid "server_name not found in directives" msgstr "server_name не нашел в директивах" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "server_name параметр обязателен" @@ -1651,7 +1708,7 @@ msgstr "Путь к ключу сертификата SSL" msgid "SSL Certificate Path" msgstr "Путь к сертификату SSL" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 #, fuzzy msgid "SSO Login" msgstr "Логин" @@ -1738,8 +1795,8 @@ msgstr "" msgid "System" msgstr "Система" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "" @@ -1773,7 +1830,7 @@ msgstr "" msgid "The input is not a SSL Certificate Key" msgstr "Путь к ключу сертификата SSL" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1809,8 +1866,8 @@ msgstr "" msgid "The url is invalid" msgstr "URL-адрес неверный" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 #, fuzzy msgid "The url is invalid." msgstr "URL-адрес неверный" @@ -1838,6 +1895,7 @@ msgstr "" msgid "This field should not be empty" msgstr "Это поле обязательно к заполнению" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "" @@ -1854,10 +1912,14 @@ msgid "" "continue?" msgstr "" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1913,11 +1975,15 @@ msgstr "" msgid "User" msgstr "Пользователь" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "Имя пользователя" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "Имя пользователя (*)" @@ -1931,7 +1997,7 @@ msgstr "Действительный" msgid "View" msgstr "Просмотр" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 #, fuzzy msgid "View all notifications" msgstr "Просмотреть все уведомления" @@ -1947,7 +2013,7 @@ msgstr "Простой режим" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "Внимание" @@ -1980,6 +2046,7 @@ msgstr "Запись сертификата на диск" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "Да" diff --git a/app/src/language/vi_VN/app.po b/app/src/language/vi_VN/app.po index bff878963..5a03c8461 100644 --- a/app/src/language/vi_VN/app.po +++ b/app/src/language/vi_VN/app.po @@ -28,7 +28,8 @@ msgstr "Người dùng" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "Hành động" @@ -51,7 +52,7 @@ msgstr "Thêm Directive" msgid "Add Location" msgstr "Thêm Location" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "Thêm Website" @@ -70,11 +71,11 @@ msgstr "Cập nhật thành công" msgid "Additional" msgstr "Tùy chọn bổ sung" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "Nâng cao" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "" @@ -82,11 +83,11 @@ msgstr "" msgid "API Document" msgstr "" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "" @@ -94,7 +95,12 @@ msgstr "" msgid "Arch" msgstr "" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +#, fuzzy +msgid "Are you sure to delete this banned IP immediately?" +msgstr "Bạn chắc chắn muốn xóa nó " + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 #, fuzzy msgid "Are you sure you want to clear all notifications?" @@ -147,6 +153,15 @@ msgstr "Hỏi ChatGPT" msgid "Assistant" msgstr "Trợ lý" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +#, fuzzy +msgid "Auth" +msgstr "Tác giả" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -170,8 +185,8 @@ msgstr "Đã bật tự động gia hạn SSL cho %{name}" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "Quay lại" @@ -180,19 +195,31 @@ msgstr "Quay lại" msgid "Back Home" msgstr "Quay lại" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "Thông tin" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 #, fuzzy msgid "Basic" msgstr "Cơ bản" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "Cơ bản" @@ -280,12 +307,12 @@ msgid "Cleaning environment variables" msgstr "Xoá các biến môi trường" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "Xoá" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 #, fuzzy msgid "Cleared successfully" @@ -312,7 +339,7 @@ msgstr "Mẫu Cấu hình" msgid "Configuration file is test successful" msgstr "Tệp cấu hình được kiểm tra thành công" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "Tên cấu hình" @@ -320,7 +347,7 @@ msgstr "Tên cấu hình" msgid "Configurations" msgstr "Cấu hình" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "Cấu hình SSL" @@ -351,7 +378,7 @@ msgstr "CPU:" msgid "Create" msgstr "Ngày tạo" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "Tạo thêm" @@ -390,7 +417,7 @@ msgstr "" msgid "Dashboard" msgstr "Bảng điều khiển" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "Tên cơ sở dữ liệu (Tuỳ chọn, Mặc định là: database)" @@ -424,15 +451,15 @@ msgstr "Xoá trang web: %{site_name}" msgid "Deleted successfully" msgstr "Đã xoá thành công" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "Triển khai" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "Triển khai %{conf_name} tới %{node_name} thất bại" @@ -482,9 +509,9 @@ msgstr "Tắt" msgid "Disable auto-renewal failed for %{name}" msgstr "Tắt tự động gia hạn SSL cho %{name} thất bại" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "Đã tắt" @@ -563,7 +590,7 @@ msgstr "Bạn muốn xóa máy chủ này ?" msgid "Domain" msgstr "" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "Tên miền đã được tạo" @@ -585,38 +612,38 @@ msgstr "Đang tải phiên bản mới nhất" msgid "Dry run mode enabled" msgstr "Đã bật chế độ Dry run" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "Nhân bản" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 #, fuzzy msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 #, fuzzy msgid "Duplicate failed" msgstr "Nhân bản thất bại" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 #, fuzzy msgid "Duplicate successfully" msgstr "Nhân bản thành công" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 #, fuzzy msgid "Duplicate to local successfully" msgstr "Đã sao chép thành công vào máy cục bộ" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "Sửa %{n}" @@ -638,25 +665,25 @@ msgstr "Sửa trang web" msgid "Email" msgstr "Email (*)" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "Email (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 #, fuzzy msgid "Enable" msgstr "Đã bật" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "Không thể bật %{conf_name} trên %{node_name}" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "Đã bật %{conf_name} trên %{node_name}" @@ -664,12 +691,12 @@ msgstr "Đã bật %{conf_name} trên %{node_name}" msgid "Enable auto-renewal failed for %{name}" msgstr "Không thể bật tự động gia hạn SSL cho %{name}" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "Bật không thành công" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 #, fuzzy msgid "Enable successfully" msgstr "Đã bật" @@ -680,19 +707,19 @@ msgstr "Bật TLS" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "Đã bật" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "Đã bật" @@ -763,7 +790,7 @@ msgstr "Không thể bật %{msg}" msgid "Failed to get certificate information" msgstr "Không thể truy xuất thông tin chứng chỉ" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "Không lưu được, đã phát hiện thấy (các) lỗi cú pháp trong cấu hình." @@ -789,7 +816,7 @@ msgstr "Không tìm thấy tệp tin" msgid "Filter" msgstr "Lọc" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "Đã hoàn thành" @@ -862,6 +889,12 @@ msgstr "" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 #, fuzzy msgid "Import" @@ -872,6 +905,11 @@ msgstr "Xuất" msgid "Import Certificate" msgstr "Chứng chỉ" +#: src/views/other/Login.vue:59 +#, fuzzy +msgid "Incorrect username or password" +msgstr "Tên người dùng hoặc mật khẩu không chính xác" + #: src/constants/index.ts:18 msgid "Info" msgstr "Thông tin" @@ -884,7 +922,7 @@ msgstr "Không thể khởi tạo trình nâng cấp" msgid "Initialing core upgrader" msgstr "Đang khởi tạo trình nâng cấp" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "Cài đặt" @@ -906,6 +944,10 @@ msgstr "" msgid "Invalid" msgstr "Hợp lệ" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 #, fuzzy msgid "Issue wildcard certificate" @@ -940,7 +982,7 @@ msgstr "Kiểm tra lần cuối lúc" msgid "Leave blank for no change" msgstr "Bỏ trống nếu không thay đổi" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "Bỏ trống để sử dụng địa chỉ mặc định: https://api.openai.com/" @@ -997,11 +1039,11 @@ msgstr "Locations" msgid "Log" msgstr "Log" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "Đăng nhập" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "Đăng nhập thành công" @@ -1009,7 +1051,7 @@ msgstr "Đăng nhập thành công" msgid "Logout successful" msgstr "Đã đăng xuất" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "" @@ -1053,6 +1095,10 @@ msgstr "Người dùng" msgid "Managed Certificate" msgstr "" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1066,7 +1112,7 @@ msgstr "Memory và Storage" msgid "Minutes" msgstr "" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 #, fuzzy msgid "Model" msgstr "Run Mode" @@ -1083,7 +1129,7 @@ msgstr "Sửa" msgid "Modify Certificate" msgstr "Sửa chứng chỉ" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "Sửa cấu hình" @@ -1103,12 +1149,12 @@ msgstr "Single Directive" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "Tên" @@ -1135,11 +1181,11 @@ msgstr "Đã có phiên bản mới" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "Tiếp theo" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 msgid "Nginx" msgstr "" @@ -1147,7 +1193,7 @@ msgstr "" msgid "Nginx Access Log Path" msgstr "Vị trí lưu log truy cập (Access log) của Nginx" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 #, fuzzy msgid "Nginx Configuration Parse Error" msgstr "Lỗi phân tích cú pháp cấu hình Nginx" @@ -1175,7 +1221,7 @@ msgid "Nginx restarted successfully" msgstr "Restart Nginx thành công" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1183,6 +1229,7 @@ msgstr "Restart Nginx thành công" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1214,7 +1261,7 @@ msgstr "Ghi chú" msgid "Notification" msgstr "Thông báo" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 #, fuzzy msgid "Notifications" msgstr "Thông báo" @@ -1240,7 +1287,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1270,7 +1317,7 @@ msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa." msgid "Online" msgstr "Trực tuyến" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "" @@ -1283,13 +1330,13 @@ msgstr "Hệ điều hành" msgid "OS:" msgstr "Hệ điều hành:" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "Ghi đè" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "Ghi đè tập tin đã tồn tại" @@ -1297,11 +1344,11 @@ msgstr "Ghi đè tập tin đã tồn tại" msgid "Params" msgstr "Tham số" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "Mật khẩu" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "Mật khẩu (*)" @@ -1368,7 +1415,7 @@ msgstr "" msgid "Pre-release" msgstr "" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "Cài đặt" @@ -1466,7 +1513,16 @@ msgstr "Đang tải lại" msgid "Reloading nginx" msgstr "Tải lại nginx" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +#, fuzzy +msgid "Remove successfully" +msgstr "Xoá thành công" + +#: src/components/Notification/Notification.vue:52 #, fuzzy msgid "Removed successfully" msgstr "Xoá thành công" @@ -1525,9 +1581,9 @@ msgstr "Running" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "Lưu" @@ -1535,7 +1591,7 @@ msgstr "Lưu" msgid "Save Directive" msgstr "Lưu Directive" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "Đã xảy ra lỗi khi lưu %{msg}" @@ -1543,15 +1599,15 @@ msgstr "Đã xảy ra lỗi khi lưu %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 #, fuzzy msgid "Save successfully" msgstr "Lưu thành công" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "Lưu thành công" @@ -1576,8 +1632,9 @@ msgstr "Gửi" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "Lỗi máy chủ" @@ -1596,7 +1653,7 @@ msgid "server_name not found in directives" msgstr "không tìm thấy server_name trong directives" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "Tham số server_name là bắt buộc" @@ -1650,7 +1707,7 @@ msgstr "" msgid "SSL Certificate Path" msgstr "" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 msgid "SSO Login" msgstr "" @@ -1736,8 +1793,8 @@ msgstr "" msgid "System" msgstr "Thông tin" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "Mục tiêu" @@ -1770,7 +1827,7 @@ msgstr "" msgid "The input is not a SSL Certificate Key" msgstr "" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1803,8 +1860,8 @@ msgstr "" msgid "The url is invalid" msgstr "" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 msgid "The url is invalid." msgstr "" @@ -1830,6 +1887,7 @@ msgstr "" msgid "This field should not be empty" msgstr "Trường này không được để trống" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "" @@ -1850,10 +1908,14 @@ msgstr "" "quyền đến chương trình phụ trợ và chúng tôi cần lưu tệp này và tải lại " "Nginx. Bạn có chắc chắn muốn Tiếp tục?" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1909,11 +1971,15 @@ msgstr "" msgid "User" msgstr "Người dùng" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "Username" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "Username (*)" @@ -1927,7 +1993,7 @@ msgstr "Hợp lệ" msgid "View" msgstr "Xem" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 #, fuzzy msgid "View all notifications" msgstr "Xem tất cả thông báo" @@ -1944,7 +2010,7 @@ msgstr "Cơ bản" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "Lưu ý" @@ -1979,6 +2045,7 @@ msgstr "Ghi chứng chỉ vào disk" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "Có" diff --git a/app/src/language/zh_CN/app.mo b/app/src/language/zh_CN/app.mo index 0b8fd3864..63b3a4121 100644 Binary files a/app/src/language/zh_CN/app.mo and b/app/src/language/zh_CN/app.mo differ diff --git a/app/src/language/zh_CN/app.po b/app/src/language/zh_CN/app.po index fc9fed571..696961a89 100644 --- a/app/src/language/zh_CN/app.po +++ b/app/src/language/zh_CN/app.po @@ -31,7 +31,8 @@ msgstr "ACME 用户" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "操作" @@ -54,7 +55,7 @@ msgstr "在下面添加指令" msgid "Add Location" msgstr "添加 Location" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "添加站点" @@ -70,11 +71,11 @@ msgstr "添加成功" msgid "Additional" msgstr "额外选项" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "高级模式" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "API 地址" @@ -82,11 +83,11 @@ msgstr "API 地址" msgid "API Document" msgstr "API 文档" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "API 代理" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "API Token" @@ -94,7 +95,11 @@ msgstr "API Token" msgid "Arch" msgstr "架构" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +msgid "Are you sure to delete this banned IP immediately?" +msgstr "您确定要立即删除这个被禁用的 IP 吗?" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 msgid "Are you sure you want to clear all notifications?" msgstr "您确定要清除所有通知吗?" @@ -139,6 +144,14 @@ msgstr "与ChatGPT聊天" msgid "Assistant" msgstr "助手" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "尝试次数" + +#: src/views/preference/Preference.vue:116 +msgid "Auth" +msgstr "认证" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -162,8 +175,8 @@ msgstr "成功启用 %{name} 自动续签" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "返回" @@ -171,18 +184,30 @@ msgstr "返回" msgid "Back Home" msgstr "返回首页" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "禁止阈值(分钟)" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "禁止 IP 列表" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "禁用至" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "基本信息" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 msgid "Basic" msgstr "基本" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "基本模式" @@ -265,12 +290,12 @@ msgid "Cleaning environment variables" msgstr "正在清理环境变量" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "清空" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 msgid "Cleared successfully" msgstr "清除成功" @@ -294,7 +319,7 @@ msgstr "配置" msgid "Configuration file is test successful" msgstr "配置文件测试成功" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "配置名称" @@ -302,7 +327,7 @@ msgstr "配置名称" msgid "Configurations" msgstr "配置" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "配置 SSL" @@ -332,7 +357,7 @@ msgstr "CPU:" msgid "Create" msgstr "创建" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "再创建一个" @@ -371,7 +396,7 @@ msgstr "自定义显示在环境指示器中的本地服务器名称。" msgid "Dashboard" msgstr "仪表盘" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "数据库 (可选,默认: database)" @@ -403,15 +428,15 @@ msgstr "删除 Stream: %{stream_name}" msgid "Deleted successfully" msgstr "删除成功" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "部署" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "部署%{conf_name}到%{node_name}失败" @@ -458,9 +483,9 @@ msgstr "禁用" msgid "Disable auto-renewal failed for %{name}" msgstr "关闭 %{name} 自动续签失败" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "禁用" @@ -530,7 +555,7 @@ msgstr "你想删除这个 Upstream 吗?" msgid "Domain" msgstr "域名" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "域名配置文件创建成功" @@ -550,34 +575,34 @@ msgstr "下载最新版本" msgid "Dry run mode enabled" msgstr "试运行模式已启动" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "复制" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "成功地将%{conf_name}复制到%{node_name}" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 msgid "Duplicate failed" msgstr "复制失败" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 msgid "Duplicate successfully" msgstr "复制成功" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 msgid "Duplicate to local successfully" msgstr "成功复制到本地" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "编辑 %{n}" @@ -597,24 +622,24 @@ msgstr "编辑 Stream" msgid "Email" msgstr "邮箱" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "邮箱 (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 msgid "Enable" msgstr "启用" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "在%{node_name}中启用%{conf_name}失败" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "成功启用%{node_name}中的%{conf_name}" @@ -622,12 +647,12 @@ msgstr "成功启用%{node_name}中的%{conf_name}" msgid "Enable auto-renewal failed for %{name}" msgstr "启用 %{name} 自动续签失败" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "启用失败" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 msgid "Enable successfully" msgstr "启用成功" @@ -637,19 +662,19 @@ msgstr "启用 TLS" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "启用" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "启用成功" @@ -716,7 +741,7 @@ msgstr "启用失败 %{msg}" msgid "Failed to get certificate information" msgstr "获取证书信息失败" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "保存失败,在配置中检测到语法错误。" @@ -741,7 +766,7 @@ msgstr "未找到文件" msgid "Filter" msgstr "过滤" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "完成" @@ -809,6 +834,14 @@ msgstr "HTTP01" msgid "If left blank, the default CA Dir will be used." msgstr "如果留空,则使用默认 CA Dir。" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" +"如果某个 IP 的登录失败次数达到禁用阈值分钟内的最大尝试次数,该 IP 将被禁止登" +"录一段时间。" + #: src/views/certificate/Certificate.vue:136 msgid "Import" msgstr "导入" @@ -817,6 +850,10 @@ msgstr "导入" msgid "Import Certificate" msgstr "导入证书" +#: src/views/other/Login.vue:59 +msgid "Incorrect username or password" +msgstr "用户名或密码错误" + #: src/constants/index.ts:18 msgid "Info" msgstr "信息" @@ -829,7 +866,7 @@ msgstr "初始化核心升级程序错误" msgid "Initialing core upgrader" msgstr "初始化核心升级器" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "安装" @@ -849,6 +886,10 @@ msgstr "间隔" msgid "Invalid" msgstr "无效的" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "IP" + #: src/views/certificate/Certificate.vue:144 msgid "Issue wildcard certificate" msgstr "签发通配符证书" @@ -879,7 +920,7 @@ msgstr "最后检查时间" msgid "Leave blank for no change" msgstr "留空表示不修改" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "留空为默认:https://api.openai.com/" @@ -930,11 +971,11 @@ msgstr "Locations" msgid "Log" msgstr "日志" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "登录" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "登录成功" @@ -942,7 +983,7 @@ msgstr "登录成功" msgid "Logout successful" msgstr "登出成功" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "Logrotate" @@ -988,6 +1029,10 @@ msgstr "用户管理" msgid "Managed Certificate" msgstr "托管证书" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "最大尝试次数" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1001,7 +1046,7 @@ msgstr "内存与存储" msgid "Minutes" msgstr "分钟" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 msgid "Model" msgstr "模型" @@ -1015,7 +1060,7 @@ msgstr "修改" msgid "Modify Certificate" msgstr "修改证书" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "修改配置文件" @@ -1033,12 +1078,12 @@ msgstr "多行指令" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "名称" @@ -1065,11 +1110,11 @@ msgstr "新版本发布" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "下一步" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 msgid "Nginx" msgstr "Nginx" @@ -1077,7 +1122,7 @@ msgstr "Nginx" msgid "Nginx Access Log Path" msgstr "Nginx 访问日志路径" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 msgid "Nginx Configuration Parse Error" msgstr "Nginx 配置解析错误" @@ -1102,7 +1147,7 @@ msgid "Nginx restarted successfully" msgstr "Nginx 重启成功" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1110,6 +1155,7 @@ msgstr "Nginx 重启成功" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1140,7 +1186,7 @@ msgstr "注意" msgid "Notification" msgstr "通知" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 msgid "Notifications" msgstr "通知" @@ -1164,7 +1210,7 @@ msgid "Ok" msgstr "确定" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1194,7 +1240,7 @@ msgstr "一旦验证完成,这些记录将被删除。" msgid "Online" msgstr "在线" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "OpenAI" @@ -1206,13 +1252,13 @@ msgstr "OS" msgid "OS:" msgstr "OS:" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "覆盖" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "覆盖现有文件" @@ -1220,11 +1266,11 @@ msgstr "覆盖现有文件" msgid "Params" msgstr "参数" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "密码" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "密码 (*)" @@ -1289,7 +1335,7 @@ msgstr "请至少选择一个节点!" msgid "Pre-release" msgstr "预发布" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "偏好设置" @@ -1380,7 +1426,15 @@ msgstr "重载中" msgid "Reloading nginx" msgstr "正在重载 Nginx" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "删除" + +#: src/views/preference/AuthSettings.vue:47 +msgid "Remove successfully" +msgstr "移除成功" + +#: src/components/Notification/Notification.vue:52 msgid "Removed successfully" msgstr "删除成功" @@ -1432,9 +1486,9 @@ msgstr "运行中" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "保存" @@ -1442,7 +1496,7 @@ msgstr "保存" msgid "Save Directive" msgstr "保存指令" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "保存错误 %{msg}" @@ -1450,14 +1504,14 @@ msgstr "保存错误 %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 msgid "Save successfully" msgstr "保存成功" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "保存成功" @@ -1482,8 +1536,9 @@ msgstr "上传" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "服务器错误" @@ -1501,7 +1556,7 @@ msgid "server_name not found in directives" msgstr "未在指令集合中找到 server_name" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "必须为 server_name 指令指明参数" @@ -1553,7 +1608,7 @@ msgstr "SSL证书密钥路径" msgid "SSL Certificate Path" msgstr "SSL证书路径" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 msgid "SSO Login" msgstr "SSO 登录" @@ -1633,8 +1688,8 @@ msgstr "同步到" msgid "System" msgstr "系统" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "目标" @@ -1666,7 +1721,7 @@ msgstr "输入的内容不是 SSL 证书" msgid "The input is not a SSL Certificate Key" msgstr "输入的内容不是 SSL 证书密钥" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1697,8 +1752,8 @@ msgstr "当前配置中的 server_name 必须是获取证书所需的域名, msgid "The url is invalid" msgstr "URL无效" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 msgid "The url is invalid." msgstr "URL 无效." @@ -1724,6 +1779,7 @@ msgstr "此字段必填" msgid "This field should not be empty" msgstr "该字段不能为空" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "提示" @@ -1742,10 +1798,14 @@ msgstr "" "为了确保认证自动更新能够正常工作,我们需要添加一个能够代理从权威机构到后端的" "请求的 Location,并且我们需要保存这个文件并重新加载Nginx。你确定要继续吗?" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "Token 无效" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "登录失败次数过多,请稍后再试" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "回收站" @@ -1798,11 +1858,15 @@ msgstr "URL" msgid "User" msgstr "用户" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "用户被禁止" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "用户名" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "用户名 (*)" @@ -1816,7 +1880,7 @@ msgstr "有效的" msgid "View" msgstr "查看" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 msgid "View all notifications" msgstr "查看全部通知" @@ -1830,7 +1894,7 @@ msgstr "预览模式" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "警告" @@ -1862,6 +1926,7 @@ msgstr "正在将证书写入磁盘" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "是的" diff --git a/app/src/language/zh_TW/app.po b/app/src/language/zh_TW/app.po index d7bbfbb18..bd0b590d0 100644 --- a/app/src/language/zh_TW/app.po +++ b/app/src/language/zh_TW/app.po @@ -33,7 +33,8 @@ msgstr "使用者名稱" #: src/views/certificate/DNSCredential.vue:33 src/views/config/config.ts:34 #: src/views/domain/DomainList.vue:47 src/views/environment/Environment.vue:129 #: src/views/notification/Notification.vue:37 -#: src/views/stream/StreamList.vue:47 src/views/user/User.vue:43 +#: src/views/preference/AuthSettings.vue:26 src/views/stream/StreamList.vue:47 +#: src/views/user/User.vue:43 msgid "Action" msgstr "操作" @@ -56,7 +57,7 @@ msgstr "在下方新增指令" msgid "Add Location" msgstr "新增 Location" -#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:93 +#: src/routes/index.ts:64 src/views/domain/DomainAdd.vue:89 msgid "Add Site" msgstr "新增網站" @@ -74,11 +75,11 @@ msgstr "更新成功" msgid "Additional" msgstr "其他設定" -#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191 +#: src/views/domain/DomainEdit.vue:197 src/views/stream/StreamEdit.vue:189 msgid "Advance Mode" msgstr "進階模式" -#: src/views/preference/OpenAISettings.vue:42 +#: src/views/preference/OpenAISettings.vue:45 msgid "API Base Url" msgstr "API 基礎網址" @@ -87,11 +88,11 @@ msgstr "API 基礎網址" msgid "API Document" msgstr "API Token" -#: src/views/preference/OpenAISettings.vue:54 +#: src/views/preference/OpenAISettings.vue:57 msgid "API Proxy" msgstr "API 代理" -#: src/views/preference/OpenAISettings.vue:66 +#: src/views/preference/OpenAISettings.vue:69 msgid "API Token" msgstr "API Token" @@ -99,7 +100,12 @@ msgstr "API Token" msgid "Arch" msgstr "架構" -#: src/components/Notification/Notification.vue:84 +#: src/views/preference/AuthSettings.vue:94 +#, fuzzy +msgid "Are you sure to delete this banned IP immediately?" +msgstr "您確定要刪除嗎?" + +#: src/components/Notification/Notification.vue:86 #: src/views/notification/Notification.vue:72 #, fuzzy msgid "Are you sure you want to clear all notifications?" @@ -149,6 +155,15 @@ msgstr "向 ChatGPT 尋求幫助" msgid "Assistant" msgstr "助理" +#: src/views/preference/AuthSettings.vue:17 +msgid "Attempts" +msgstr "" + +#: src/views/preference/Preference.vue:116 +#, fuzzy +msgid "Auth" +msgstr "作者" + #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:106 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:120 msgid "Author" @@ -172,8 +187,8 @@ msgstr "已啟用 %{name} 的自動續簽" #: src/views/certificate/CertificateEditor.vue:242 #: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87 -#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168 -#: src/views/stream/StreamEdit.vue:247 +#: src/views/domain/DomainEdit.vue:254 src/views/nginx_log/NginxLog.vue:168 +#: src/views/stream/StreamEdit.vue:245 msgid "Back" msgstr "返回" @@ -181,18 +196,30 @@ msgstr "返回" msgid "Back Home" msgstr "返回首頁" -#: src/views/domain/DomainAdd.vue:99 +#: src/views/preference/AuthSettings.vue:68 +msgid "Ban Threshold Minutes" +msgstr "" + +#: src/views/preference/AuthSettings.vue:82 +msgid "Banned IPs" +msgstr "" + +#: src/views/preference/AuthSettings.vue:20 +msgid "Banned Until" +msgstr "" + +#: src/views/domain/DomainAdd.vue:95 msgid "Base information" msgstr "基本資訊" #: src/views/config/ConfigEdit.vue:115 #: src/views/domain/components/RightSettings.vue:75 -#: src/views/preference/Preference.vue:101 +#: src/views/preference/Preference.vue:110 #: src/views/stream/components/RightSettings.vue:74 msgid "Basic" msgstr "基本" -#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194 +#: src/views/domain/DomainEdit.vue:200 src/views/stream/StreamEdit.vue:192 msgid "Basic Mode" msgstr "基本模式" @@ -278,12 +305,12 @@ msgid "Cleaning environment variables" msgstr "清理環境變數" #: src/components/ChatGPT/ChatGPT.vue:276 -#: src/components/Notification/Notification.vue:89 +#: src/components/Notification/Notification.vue:91 #: src/views/notification/Notification.vue:77 msgid "Clear" msgstr "清除" -#: src/components/Notification/Notification.vue:40 +#: src/components/Notification/Notification.vue:42 #: src/views/notification/Notification.vue:46 #, fuzzy msgid "Cleared successfully" @@ -309,7 +336,7 @@ msgstr "設定模板" msgid "Configuration file is test successful" msgstr "設定檔案測試成功" -#: src/views/domain/DomainAdd.vue:105 +#: src/views/domain/DomainAdd.vue:101 msgid "Configuration Name" msgstr "設定名稱" @@ -317,7 +344,7 @@ msgstr "設定名稱" msgid "Configurations" msgstr "設定" -#: src/views/domain/DomainAdd.vue:100 +#: src/views/domain/DomainAdd.vue:96 msgid "Configure SSL" msgstr "設定 SSL" @@ -348,7 +375,7 @@ msgstr "中央處理器:" msgid "Create" msgstr "建立時間" -#: src/views/domain/DomainAdd.vue:158 +#: src/views/domain/DomainAdd.vue:154 msgid "Create Another" msgstr "再建立一個" @@ -387,7 +414,7 @@ msgstr "" msgid "Dashboard" msgstr "儀表板" -#: src/views/other/Install.vue:121 +#: src/views/other/Install.vue:120 msgid "Database (Optional, default: database)" msgstr "資料庫 (可選,預設: database)" @@ -421,15 +448,15 @@ msgstr "刪除網站:%{site_name}" msgid "Deleted successfully" msgstr "成功停用" -#: src/views/domain/components/Deploy.vue:106 +#: src/views/domain/components/Deploy.vue:103 #: src/views/domain/components/RightSettings.vue:93 -#: src/views/stream/components/Deploy.vue:106 +#: src/views/stream/components/Deploy.vue:103 #: src/views/stream/components/RightSettings.vue:92 msgid "Deploy" msgstr "部署" -#: src/views/domain/components/Deploy.vue:63 -#: src/views/stream/components/Deploy.vue:63 +#: src/views/domain/components/Deploy.vue:60 +#: src/views/stream/components/Deploy.vue:60 msgid "Deploy %{conf_name} to %{node_name} failed" msgstr "部署 %{conf_name} 至 %{node_name} 失敗" @@ -477,9 +504,9 @@ msgstr "停用" msgid "Disable auto-renewal failed for %{name}" msgstr "關閉 %{name} 自動續簽失敗" -#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:185 +#: src/views/domain/cert/ChangeCert.vue:44 src/views/domain/DomainEdit.vue:183 #: src/views/domain/DomainList.vue:33 src/views/environment/Environment.vue:93 -#: src/views/stream/StreamEdit.vue:177 src/views/stream/StreamList.vue:33 +#: src/views/stream/StreamEdit.vue:175 src/views/stream/StreamList.vue:33 msgid "Disabled" msgstr "停用" @@ -552,7 +579,7 @@ msgstr "您要移除此伺服器嗎?" msgid "Domain" msgstr "網域" -#: src/views/domain/DomainAdd.vue:148 +#: src/views/domain/DomainAdd.vue:144 msgid "Domain Config Created Successfully" msgstr "網域設定檔成功建立" @@ -573,34 +600,34 @@ msgstr "正在下載最新版本" msgid "Dry run mode enabled" msgstr "試運轉模式已啟用" -#: src/views/domain/components/SiteDuplicate.vue:126 +#: src/views/domain/components/SiteDuplicate.vue:122 #: src/views/domain/DomainList.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:126 +#: src/views/stream/components/StreamDuplicate.vue:122 #: src/views/stream/StreamList.vue:161 msgid "Duplicate" msgstr "複製" -#: src/views/domain/components/SiteDuplicate.vue:84 -#: src/views/stream/components/StreamDuplicate.vue:84 +#: src/views/domain/components/SiteDuplicate.vue:82 +#: src/views/stream/components/StreamDuplicate.vue:82 msgid "Duplicate %{conf_name} to %{node_name} successfully" msgstr "成功複製 %{conf_name} 到 %{node_name}" -#: src/views/domain/components/SiteDuplicate.vue:90 -#: src/views/stream/components/StreamDuplicate.vue:90 +#: src/views/domain/components/SiteDuplicate.vue:87 +#: src/views/stream/components/StreamDuplicate.vue:87 msgid "Duplicate failed" msgstr "複製失敗" -#: src/views/domain/components/SiteDuplicate.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:82 +#: src/views/domain/components/SiteDuplicate.vue:80 +#: src/views/stream/components/StreamDuplicate.vue:80 msgid "Duplicate successfully" msgstr "複製成功" -#: src/views/domain/components/SiteDuplicate.vue:64 -#: src/views/stream/components/StreamDuplicate.vue:64 +#: src/views/domain/components/SiteDuplicate.vue:63 +#: src/views/stream/components/StreamDuplicate.vue:63 msgid "Duplicate to local successfully" msgstr "成功複製至本機" -#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166 +#: src/views/domain/DomainEdit.vue:172 src/views/stream/StreamEdit.vue:164 msgid "Edit %{n}" msgstr "編輯 %{n}" @@ -622,24 +649,24 @@ msgstr "編輯網站" msgid "Email" msgstr "電子郵件 (*)" -#: src/views/other/Install.vue:90 +#: src/views/other/Install.vue:89 msgid "Email (*)" msgstr "電子郵件 (*)" -#: src/views/domain/components/Deploy.vue:86 +#: src/views/domain/components/Deploy.vue:83 #: src/views/domain/DomainList.vue:132 -#: src/views/stream/components/Deploy.vue:86 +#: src/views/stream/components/Deploy.vue:83 #: src/views/stream/StreamList.vue:153 msgid "Enable" msgstr "啟用" -#: src/views/domain/components/Deploy.vue:52 -#: src/views/stream/components/Deploy.vue:52 +#: src/views/domain/components/Deploy.vue:50 +#: src/views/stream/components/Deploy.vue:50 msgid "Enable %{conf_name} in %{node_name} failed" msgstr "在 %{node_name} 啟用 %{conf_name} 失敗" -#: src/views/domain/components/Deploy.vue:46 -#: src/views/stream/components/Deploy.vue:46 +#: src/views/domain/components/Deploy.vue:45 +#: src/views/stream/components/Deploy.vue:45 msgid "Enable %{conf_name} in %{node_name} successfully" msgstr "成功在 %{node_name} 啟用 %{conf_name}" @@ -647,12 +674,12 @@ msgstr "成功在 %{node_name} 啟用 %{conf_name}" msgid "Enable auto-renewal failed for %{name}" msgstr "啟用 %{name} 自動續簽失敗" -#: src/views/domain/DomainAdd.vue:46 +#: src/views/domain/DomainAdd.vue:43 msgid "Enable failed" msgstr "啟用失敗" -#: src/views/domain/components/Deploy.vue:44 -#: src/views/stream/components/Deploy.vue:44 +#: src/views/domain/components/Deploy.vue:43 +#: src/views/stream/components/Deploy.vue:43 msgid "Enable successfully" msgstr "啟用成功" @@ -662,19 +689,19 @@ msgstr "啟用 TLS" #: src/views/domain/cert/ChangeCert.vue:40 #: src/views/domain/components/RightSettings.vue:77 -#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29 +#: src/views/domain/DomainEdit.vue:177 src/views/domain/DomainList.vue:29 #: src/views/environment/Environment.vue:102 #: src/views/preference/LogrotateSettings.vue:20 #: src/views/stream/components/RightSettings.vue:76 -#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29 +#: src/views/stream/StreamEdit.vue:169 src/views/stream/StreamList.vue:29 msgid "Enabled" msgstr "已啟用" #: src/views/domain/components/RightSettings.vue:29 -#: src/views/domain/components/SiteDuplicate.vue:98 -#: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57 +#: src/views/domain/components/SiteDuplicate.vue:94 +#: src/views/domain/DomainAdd.vue:40 src/views/domain/DomainList.vue:57 #: src/views/stream/components/RightSettings.vue:29 -#: src/views/stream/components/StreamDuplicate.vue:98 +#: src/views/stream/components/StreamDuplicate.vue:94 #: src/views/stream/StreamList.vue:57 msgid "Enabled successfully" msgstr "成功啟用" @@ -744,7 +771,7 @@ msgstr "啟用 %{msg} 失敗" msgid "Failed to get certificate information" msgstr "取得憑證資訊失敗" -#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124 +#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122 msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "儲存失敗,在設定中檢測到語法錯誤。" @@ -770,7 +797,7 @@ msgstr "找不到檔案" msgid "Filter" msgstr "篩選" -#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:101 +#: src/language/constants.ts:19 src/views/domain/DomainAdd.vue:97 msgid "Finished" msgstr "完成" @@ -840,6 +867,12 @@ msgstr "HTTP01" msgid "If left blank, the default CA Dir will be used." msgstr "" +#: src/views/preference/AuthSettings.vue:60 +msgid "" +"If the number of login failed attempts from a ip reach the max attempts in " +"ban threshold minutes, the ip will be banned for a period of time." +msgstr "" + #: src/views/certificate/Certificate.vue:136 #, fuzzy msgid "Import" @@ -850,6 +883,11 @@ msgstr "匯出" msgid "Import Certificate" msgstr "憑證狀態" +#: src/views/other/Login.vue:59 +#, fuzzy +msgid "Incorrect username or password" +msgstr "使用者名稱或密碼不正確" + #: src/constants/index.ts:18 msgid "Info" msgstr "" @@ -862,7 +900,7 @@ msgstr "初始化核心升級程式錯誤" msgid "Initialing core upgrader" msgstr "正在初始化核心升級程式" -#: src/routes/index.ts:273 src/views/other/Install.vue:136 +#: src/routes/index.ts:273 src/views/other/Install.vue:135 msgid "Install" msgstr "安裝" @@ -883,6 +921,10 @@ msgstr "" msgid "Invalid" msgstr "無效的郵箱!" +#: src/views/preference/AuthSettings.vue:14 +msgid "IP" +msgstr "" + #: src/views/certificate/Certificate.vue:144 #, fuzzy msgid "Issue wildcard certificate" @@ -916,7 +958,7 @@ msgstr "上次檢查時間" msgid "Leave blank for no change" msgstr "留空表示不修改" -#: src/views/preference/OpenAISettings.vue:50 +#: src/views/preference/OpenAISettings.vue:53 msgid "Leave blank for the default: https://api.openai.com/" msgstr "預設留空:https://api.openai.com/" @@ -972,11 +1014,11 @@ msgstr "Locations" msgid "Log" msgstr "登入" -#: src/routes/index.ts:279 src/views/other/Login.vue:147 +#: src/routes/index.ts:279 src/views/other/Login.vue:159 msgid "Login" msgstr "登入" -#: src/views/other/Login.vue:51 src/views/other/Login.vue:97 +#: src/views/other/Login.vue:109 src/views/other/Login.vue:51 msgid "Login successful" msgstr "登入成功" @@ -984,7 +1026,7 @@ msgstr "登入成功" msgid "Logout successful" msgstr "登出成功" -#: src/views/preference/Preference.vue:119 +#: src/views/preference/Preference.vue:134 msgid "Logrotate" msgstr "" @@ -1027,6 +1069,10 @@ msgstr "管理使用者" msgid "Managed Certificate" msgstr "更換憑證" +#: src/views/preference/AuthSettings.vue:74 +msgid "Max Attempts" +msgstr "" + #: src/views/dashboard/ServerAnalytic.vue:217 #: src/views/dashboard/ServerAnalytic.vue:218 msgid "Memory" @@ -1040,7 +1086,7 @@ msgstr "記憶體與儲存" msgid "Minutes" msgstr "" -#: src/views/preference/OpenAISettings.vue:30 +#: src/views/preference/OpenAISettings.vue:33 #, fuzzy msgid "Model" msgstr "執行模式" @@ -1056,7 +1102,7 @@ msgstr "修改" msgid "Modify Certificate" msgstr "憑證狀態" -#: src/views/domain/DomainAdd.vue:155 +#: src/views/domain/DomainAdd.vue:151 msgid "Modify Config" msgstr "修改設定" @@ -1075,12 +1121,12 @@ msgstr "多行指令" #: src/views/certificate/DNSCredential.vue:11 src/views/config/config.ts:7 #: src/views/domain/cert/ChangeCert.vue:17 #: src/views/domain/components/RightSettings.vue:83 -#: src/views/domain/components/SiteDuplicate.vue:133 +#: src/views/domain/components/SiteDuplicate.vue:129 #: src/views/domain/DomainList.vue:13 #: src/views/domain/ngx_conf/NgxUpstream.vue:175 #: src/views/environment/Environment.vue:12 #: src/views/stream/components/RightSettings.vue:82 -#: src/views/stream/components/StreamDuplicate.vue:133 +#: src/views/stream/components/StreamDuplicate.vue:129 #: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187 msgid "Name" msgstr "名稱" @@ -1107,11 +1153,11 @@ msgstr "新版本發布" #: src/views/certificate/WildcardCertificate.vue:99 #: src/views/domain/cert/components/ObtainCert.vue:203 -#: src/views/domain/DomainAdd.vue:142 +#: src/views/domain/DomainAdd.vue:138 msgid "Next" msgstr "下一步" -#: src/views/preference/Preference.vue:107 +#: src/views/preference/Preference.vue:122 msgid "Nginx" msgstr "Nginx" @@ -1119,7 +1165,7 @@ msgstr "Nginx" msgid "Nginx Access Log Path" msgstr "Nginx 存取日誌路徑" -#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209 +#: src/views/domain/DomainEdit.vue:215 src/views/stream/StreamEdit.vue:207 msgid "Nginx Configuration Parse Error" msgstr "Nginx 設定解析錯誤" @@ -1144,7 +1190,7 @@ msgid "Nginx restarted successfully" msgstr "Nginx 重啟成功" #: src/components/ChatGPT/ChatGPT.vue:270 -#: src/components/Notification/Notification.vue:82 +#: src/components/Notification/Notification.vue:84 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:535 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:549 @@ -1152,6 +1198,7 @@ msgstr "Nginx 重啟成功" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90 #: src/views/domain/ngx_conf/LocationEditor.vue:71 #: src/views/notification/Notification.vue:70 +#: src/views/preference/AuthSettings.vue:96 #: src/views/preference/BasicSettings.vue:101 #: src/views/stream/StreamList.vue:165 msgid "No" @@ -1183,7 +1230,7 @@ msgstr "備註" msgid "Notification" msgstr "憑證" -#: src/components/Notification/Notification.vue:80 src/routes/index.ts:221 +#: src/components/Notification/Notification.vue:82 src/routes/index.ts:221 #, fuzzy msgid "Notifications" msgstr "憑證" @@ -1208,7 +1255,7 @@ msgid "Ok" msgstr "" #: src/components/ChatGPT/ChatGPT.vue:271 -#: src/components/Notification/Notification.vue:83 +#: src/components/Notification/Notification.vue:85 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:522 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:536 @@ -1238,7 +1285,7 @@ msgstr "" msgid "Online" msgstr "線上" -#: src/views/preference/Preference.vue:113 +#: src/views/preference/Preference.vue:128 msgid "OpenAI" msgstr "OpenAI" @@ -1250,13 +1297,13 @@ msgstr "作業系統" msgid "OS:" msgstr "作業系統:" -#: src/views/domain/components/Deploy.vue:90 -#: src/views/stream/components/Deploy.vue:90 +#: src/views/domain/components/Deploy.vue:87 +#: src/views/stream/components/Deploy.vue:87 msgid "Overwrite" msgstr "覆蓋" -#: src/views/domain/components/Deploy.vue:94 -#: src/views/stream/components/Deploy.vue:94 +#: src/views/domain/components/Deploy.vue:91 +#: src/views/stream/components/Deploy.vue:91 msgid "Overwrite exist file" msgstr "覆蓋現有檔案" @@ -1264,11 +1311,11 @@ msgstr "覆蓋現有檔案" msgid "Params" msgstr "參數" -#: src/views/other/Login.vue:132 src/views/user/User.vue:18 +#: src/views/other/Login.vue:144 src/views/user/User.vue:18 msgid "Password" msgstr "密碼" -#: src/views/other/Install.vue:110 +#: src/views/other/Install.vue:109 msgid "Password (*)" msgstr "密碼 (*)" @@ -1334,7 +1381,7 @@ msgstr "請至少選擇一個節點!" msgid "Pre-release" msgstr "預先發布" -#: src/routes/index.ts:239 src/views/preference/Preference.vue:96 +#: src/routes/index.ts:239 src/views/preference/Preference.vue:105 msgid "Preference" msgstr "偏好設定" @@ -1431,7 +1478,16 @@ msgstr "重新載入中" msgid "Reloading nginx" msgstr "正在重新載入 Nginx" -#: src/components/Notification/Notification.vue:50 +#: src/views/preference/AuthSettings.vue:101 +msgid "Remove" +msgstr "" + +#: src/views/preference/AuthSettings.vue:47 +#, fuzzy +msgid "Remove successfully" +msgstr "儲存成功" + +#: src/components/Notification/Notification.vue:52 #, fuzzy msgid "Removed successfully" msgstr "儲存成功" @@ -1489,9 +1545,9 @@ msgstr "執行中" #: src/components/ChatGPT/ChatGPT.vue:252 #: src/views/certificate/CertificateEditor.vue:249 -#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263 +#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:261 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120 -#: src/views/preference/Preference.vue:130 src/views/stream/StreamEdit.vue:254 +#: src/views/preference/Preference.vue:145 src/views/stream/StreamEdit.vue:252 msgid "Save" msgstr "儲存" @@ -1499,7 +1555,7 @@ msgstr "儲存" msgid "Save Directive" msgstr "儲存指令" -#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50 +#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:46 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41 msgid "Save error %{msg}" msgstr "儲存錯誤 %{msg}" @@ -1507,14 +1563,14 @@ msgstr "儲存錯誤 %{msg}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:104 #: src/views/certificate/CertificateEditor.vue:46 -#: src/views/preference/Preference.vue:66 +#: src/views/preference/Preference.vue:74 msgid "Save successfully" msgstr "儲存成功" -#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38 -#: src/views/domain/DomainEdit.vue:148 +#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:37 +#: src/views/domain/DomainEdit.vue:146 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39 -#: src/views/stream/StreamEdit.vue:140 +#: src/views/stream/StreamEdit.vue:138 msgid "Saved successfully" msgstr "儲存成功" @@ -1539,8 +1595,9 @@ msgstr "傳送" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:196 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:235 #: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81 -#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:70 -#: src/views/preference/Preference.vue:70 src/views/stream/StreamList.vue:113 +#: src/views/environment/Environment.vue:139 src/views/other/Install.vue:69 +#: src/views/preference/AuthSettings.vue:49 +#: src/views/preference/Preference.vue:78 src/views/stream/StreamList.vue:113 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42 msgid "Server error" msgstr "伺服器錯誤" @@ -1559,7 +1616,7 @@ msgid "server_name not found in directives" msgstr "在指令中未找到 server_name" #: src/views/domain/cert/components/AutoCertStepOne.vue:34 -#: src/views/domain/DomainAdd.vue:121 +#: src/views/domain/DomainAdd.vue:117 msgid "server_name parameter is required" msgstr "必須提供 server_name 參數" @@ -1615,7 +1672,7 @@ msgstr "SSL 憑證金鑰路徑" msgid "SSL Certificate Path" msgstr "SSL 憑證路徑" -#: src/views/other/Login.vue:158 +#: src/views/other/Login.vue:170 #, fuzzy msgid "SSO Login" msgstr "登入" @@ -1701,8 +1758,8 @@ msgstr "" msgid "System" msgstr "系統" -#: src/views/domain/components/SiteDuplicate.vue:140 -#: src/views/stream/components/StreamDuplicate.vue:140 +#: src/views/domain/components/SiteDuplicate.vue:136 +#: src/views/stream/components/StreamDuplicate.vue:136 msgid "Target" msgstr "目標" @@ -1736,7 +1793,7 @@ msgstr "" msgid "The input is not a SSL Certificate Key" msgstr "SSL 憑證金鑰路徑" -#: src/views/preference/OpenAISettings.vue:33 +#: src/views/preference/OpenAISettings.vue:36 msgid "" "The model name should only contain letters, unicode, numbers, hyphens, " "dashes, and dots." @@ -1770,8 +1827,8 @@ msgstr "注意:目前設定中的 server_name 必須為需要申請憑證的 msgid "The url is invalid" msgstr "此功能在演示中不可用。" -#: src/views/preference/OpenAISettings.vue:45 -#: src/views/preference/OpenAISettings.vue:57 +#: src/views/preference/OpenAISettings.vue:48 +#: src/views/preference/OpenAISettings.vue:60 #, fuzzy msgid "The url is invalid." msgstr "此功能在演示中不可用。" @@ -1799,6 +1856,7 @@ msgstr "" msgid "This field should not be empty" msgstr "此欄位不應為空" +#: src/views/preference/AuthSettings.vue:59 #: src/views/preference/LogrotateSettings.vue:12 msgid "Tips" msgstr "" @@ -1817,10 +1875,14 @@ msgstr "" "為了確保憑證自動續期能夠正常運作,我們需要新增一個 Location 來代理從授權後端" "的請求,我們需要儲存這個檔案並重新載入 Nginx。你確定你要繼續嗎?" -#: src/views/preference/OpenAISettings.vue:69 +#: src/views/preference/OpenAISettings.vue:72 msgid "Token is not valid" msgstr "" +#: src/views/other/Login.vue:62 +msgid "Too many login failed attempts, please try again later" +msgstr "" + #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:221 msgid "Trash" msgstr "" @@ -1873,11 +1935,15 @@ msgstr "URL" msgid "User" msgstr "使用者名稱" -#: src/views/other/Login.vue:122 src/views/user/User.vue:9 +#: src/views/other/Login.vue:65 +msgid "User is banned" +msgstr "" + +#: src/views/other/Login.vue:134 src/views/user/User.vue:9 msgid "Username" msgstr "使用者名稱" -#: src/views/other/Install.vue:100 +#: src/views/other/Install.vue:99 msgid "Username (*)" msgstr "使用者名稱 (*)" @@ -1891,7 +1957,7 @@ msgstr "" msgid "View" msgstr "檢視" -#: src/components/Notification/Notification.vue:141 +#: src/components/Notification/Notification.vue:143 #, fuzzy msgid "View all notifications" msgstr "憑證" @@ -1907,7 +1973,7 @@ msgstr "基本模式" #: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33 #: src/views/domain/cert/components/AutoCertStepOne.vue:28 -#: src/views/domain/DomainAdd.vue:116 +#: src/views/domain/DomainAdd.vue:112 msgid "Warning" msgstr "警告" @@ -1940,6 +2006,7 @@ msgstr "將憑證寫入磁碟" #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:89 #: src/views/domain/ngx_conf/LocationEditor.vue:70 +#: src/views/preference/AuthSettings.vue:95 #: src/views/preference/BasicSettings.vue:100 msgid "Yes" msgstr "是的" diff --git a/app/src/version.json b/app/src/version.json index 22462ccb8..fec5068d3 100644 --- a/app/src/version.json +++ b/app/src/version.json @@ -1 +1 @@ -{"version":"2.0.0-beta.25","build_id":139,"total_build":343} \ No newline at end of file +{"version":"2.0.0-beta.25","build_id":140,"total_build":344} \ No newline at end of file diff --git a/app/src/views/domain/DomainAdd.vue b/app/src/views/domain/DomainAdd.vue index 9a59ccb59..ce1fbc2c9 100644 --- a/app/src/views/domain/DomainAdd.vue +++ b/app/src/views/domain/DomainAdd.vue @@ -33,19 +33,15 @@ function init() { async function save() { return ngx.build_config(ngx_config).then(r => { - // eslint-disable-next-line promise/no-nesting domain.save(ngx_config.name, { name: ngx_config.name, content: r.content, overwrite: true }).then(() => { message.success($gettext('Saved successfully')) - // eslint-disable-next-line promise/no-nesting domain.enable(ngx_config.name).then(() => { message.success($gettext('Enabled successfully')) window.scroll({ top: 0, left: 0, behavior: 'smooth' }) - // eslint-disable-next-line promise/no-nesting }).catch(e => { message.error(e.message ?? $gettext('Enable failed'), 5) }) - // eslint-disable-next-line promise/no-nesting }).catch(e => { message.error($gettext('Save error %{msg}', { msg: $gettext(e.message) ?? '' }), 5) }) diff --git a/app/src/views/domain/DomainEdit.vue b/app/src/views/domain/DomainEdit.vue index c80f4e79b..cb7e9ad21 100644 --- a/app/src/views/domain/DomainEdit.vue +++ b/app/src/views/domain/DomainEdit.vue @@ -105,10 +105,8 @@ function on_mode_change(advanced: CheckedType) { build_config() } else { - // eslint-disable-next-line promise/no-nesting return ngx.tokenize_config(configText.value).then(r => { Object.assign(ngx_config, r) - // eslint-disable-next-line promise/no-nesting }).catch(handle_parse_error) } }) diff --git a/app/src/views/domain/components/Deploy.vue b/app/src/views/domain/components/Deploy.vue index 3f38d0eac..92afe1752 100644 --- a/app/src/views/domain/components/Deploy.vue +++ b/app/src/views/domain/components/Deploy.vue @@ -29,7 +29,7 @@ function deploy() { name: name.value, content: r.config, overwrite: overwrite.value, - // eslint-disable-next-line promise/no-nesting + }, { headers: { 'X-Node-ID': id } }).then(async () => { notification.success({ message: $gettext('Deploy successfully'), @@ -38,7 +38,6 @@ function deploy() { { conf_name: name.value, node_name }), }) if (enabled.value) { - // eslint-disable-next-line promise/no-nesting domain.enable(name.value).then(() => { notification.success({ message: $gettext('Enable successfully'), @@ -46,7 +45,6 @@ function deploy() { $gettext('Enable %{conf_name} in %{node_name} successfully', { conf_name: name.value, node_name }), }) - // eslint-disable-next-line promise/no-nesting }).catch(e => { notification.error({ message: $gettext('Enable %{conf_name} in %{node_name} failed', { @@ -57,7 +55,6 @@ function deploy() { }) }) } - // eslint-disable-next-line promise/no-nesting }).catch(e => { notification.error({ message: $gettext('Deploy %{conf_name} to %{node_name} failed', { diff --git a/app/src/views/domain/components/SiteDuplicate.vue b/app/src/views/domain/components/SiteDuplicate.vue index 7883232f9..118df38e6 100644 --- a/app/src/views/domain/components/SiteDuplicate.vue +++ b/app/src/views/domain/components/SiteDuplicate.vue @@ -59,24 +59,22 @@ function onSubmit() { modelRef.target.forEach(id => { if (id === 0) { - // eslint-disable-next-line promise/no-nesting domain.duplicate(props.name, { name: modelRef.name }).then(() => { message.success($gettext('Duplicate to local successfully')) show.value = false emit('duplicated') - // eslint-disable-next-line promise/no-nesting }).catch(e => { message.error($gettext(e?.message ?? 'Server error')) }) } else { // get source content - // eslint-disable-next-line promise/no-nesting + domain.get(props.name).then(r => { domain.save(modelRef.name, { name: modelRef.name, content: r.config, - // eslint-disable-next-line promise/no-nesting + }, { headers: { 'X-Node-ID': id } }).then(() => { notification.success({ message: $gettext('Duplicate successfully'), @@ -84,7 +82,6 @@ function onSubmit() { $gettext('Duplicate %{conf_name} to %{node_name} successfully', { conf_name: props.name, node_name: node_map[id] }), }) - // eslint-disable-next-line promise/no-nesting }).catch(e => { notification.error({ message: $gettext('Duplicate failed'), @@ -92,7 +89,6 @@ function onSubmit() { }) }) if (r.enabled) { - // eslint-disable-next-line promise/no-nesting domain.enable(modelRef.name, { headers: { 'X-Node-ID': id } }).then(() => { notification.success({ message: $gettext('Enabled successfully'), diff --git a/app/src/views/other/Install.vue b/app/src/views/other/Install.vue index 7a1c5f083..b6c6ee4b3 100644 --- a/app/src/views/other/Install.vue +++ b/app/src/views/other/Install.vue @@ -61,11 +61,10 @@ const onSubmit = () => { validate().then(() => { // modelRef loading.value = true - // eslint-disable-next-line promise/no-nesting + install.install_nginx_ui(modelRef).then(async () => { message.success($gettext('Install successfully')) await router.push('/login') - // eslint-disable-next-line promise/no-nesting }).catch(e => { message.error(e.message ?? $gettext('Server error')) }).finally(() => { diff --git a/app/src/views/other/Login.vue b/app/src/views/other/Login.vue index 59d0b8ca4..96bfbdf30 100644 --- a/app/src/views/other/Login.vue +++ b/app/src/views/other/Login.vue @@ -46,16 +46,28 @@ const { validate, validateInfos, clearValidate } = Form.useForm(modelRef, rulesR const onSubmit = () => { validate().then(async () => { loading.value = true - // eslint-disable-next-line promise/no-nesting + await auth.login(modelRef.username, modelRef.password).then(async () => { message.success($gettext('Login successful'), 1) const next = (route.query?.next || '').toString() || '/' await router.push(next) - // eslint-disable-next-line promise/no-nesting }).catch(e => { - message.error($gettext(e.message ?? 'Server error')) + switch (e.code) { + case 4031: + message.error($gettext('Incorrect username or password')) + break + case 4291: + message.error($gettext('Too many login failed attempts, please try again later')) + break + case 4033: + message.error($gettext('User is banned')) + break + default: + message.error($gettext(e.message ?? 'Server error')) + break + } }) loading.value = false }) diff --git a/app/src/views/preference/AuthSettings.vue b/app/src/views/preference/AuthSettings.vue new file mode 100644 index 000000000..bd7424973 --- /dev/null +++ b/app/src/views/preference/AuthSettings.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/app/src/views/preference/Preference.vue b/app/src/views/preference/Preference.vue index 3a92e1b00..3243d98db 100644 --- a/app/src/views/preference/Preference.vue +++ b/app/src/views/preference/Preference.vue @@ -10,6 +10,7 @@ import NginxSettings from '@/views/preference/NginxSettings.vue' import type { Settings } from '@/views/preference/typedef' import LogrotateSettings from '@/views/preference/LogrotateSettings.vue' import { useSettingsStore } from '@/pinia' +import AuthSettings from '@/views/preference/AuthSettings.vue' const data = ref({ server: { @@ -46,15 +47,21 @@ const data = ref({ cmd: '', interval: 1440, }, + auth: { + ip_white_list: [], + ban_threshold_minutes: 10, + max_attempts: 10, + }, }) -settings.get().then(r => { +settings.get().then(r => { data.value = r }) const settingsStore = useSettingsStore() const { server_name } = storeToRefs(settingsStore) const errors = ref({}) as Ref>> +const refAuthSettings = ref() async function save() { // fix type @@ -63,6 +70,7 @@ async function save() { if (!settingsStore.is_remote) server_name.value = r?.server?.name ?? '' data.value = r + refAuthSettings.value.getBannedIPs() message.success($gettext('Save successfully')) errors.value = {} }).catch(e => { @@ -90,6 +98,7 @@ onMounted(() => { if (route.query?.tab) activeKey.value = route.query.tab.toString() }) +