CVE-2022-24193
Description
CasaOS before v0.2.7 contains a command injection vulnerability that allows an attacker to execute arbitrary commands.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
CasaOS before v0.2.7 contains a command injection vulnerability that allows an attacker to execute arbitrary commands.
Vulnerability
CasaOS versions before v0.2.7 contain a command injection vulnerability. The issue exists in how user-supplied input is handled, allowing the injection of arbitrary commands into system calls. The exact vulnerable code path is not fully detailed in the public references, but the commit d060968 [3] suggests that the fix involved adding input sanitization for a language parameter used in constructing API requests, which indicates the vulnerability likely stems from unsanitized input being passed to a shell or command execution function [1]. The vulnerability affects all CasaOS installations running versions prior to 0.2.7.
Exploitation
An attacker can exploit this vulnerability by sending a specially crafted request to the CasaOS server, likely through the web interface or API, containing malicious command injection payloads in parameters that are not properly sanitized. No authentication is required if the vulnerable endpoint is exposed; the attacker only needs network access to the CasaOS service. The exact steps involve identifying an input field (e.g., language) that is unsafely concatenated into a command or shell execution, and injecting shell metacharacters (e.g., ;, |, ` ``) to terminate the intended command and execute arbitrary commands [1][4].
Impact
Successful exploitation allows an attacker to execute arbitrary commands on the underlying operating system with the privileges of the CasaOS process. This can lead to full compromise of the system, including data exfiltration, installation of malware, lateral movement within the network, and denial of service. The attacker gains the ability to control the CasaOS instance and potentially access sensitive data stored on the server [1][4].
Mitigation
The vulnerability is fixed in CasaOS version 0.2.7. Users should update their CasaOS installations to v0.2.7 or later immediately to remediate the issue. The fix is included in commit d060968 [3]. No workarounds are documented, so updating is the only recommended mitigation. The CVE is not listed on the CISA Known Exploited Vulnerabilities (KEV) catalog as of the publication date [1].
AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
github.com/IceWhaleTech/CasaOSGo | < 0.2.8 | 0.2.8 |
Affected products
2Patches
1d060968b7ab0Apply multilingual support
15 files changed · +3550 −1421
route/init.go+1 −1 modified@@ -35,7 +35,7 @@ func installSyncthing(appId string) { m := model.CustomizationPostData{} var dockerImage string var dockerImageVersion string - appInfo = service.MyService.OAPI().GetServerAppInfo(appId, "system") + appInfo = service.MyService.OAPI().GetServerAppInfo(appId, "system", "us_en") dockerImage = appInfo.Image dockerImageVersion = appInfo.ImageVersion
route/v1/app.go+4 −2 modified@@ -35,7 +35,8 @@ func AppList(c *gin.Context) { t := c.DefaultQuery("type", "rank") categoryId := c.DefaultQuery("category_id", "0") key := c.DefaultQuery("key", "") - recommend, list, community := service.MyService.OAPI().GetServerList(index, size, t, categoryId, key) + language := c.GetHeader("Language") + recommend, list, community := service.MyService.OAPI().GetServerList(index, size, t, categoryId, key, language) // for i := 0; i < len(recommend); i++ { // ct, _ := service.MyService.Docker().DockerListByImage(recommend[i].Image, recommend[i].ImageVersion) // if ct != nil { @@ -137,7 +138,8 @@ func AppUsageList(c *gin.Context) { func AppInfo(c *gin.Context) { id := c.Param("id") - info := service.MyService.OAPI().GetServerAppInfo(id, "") + language := c.GetHeader("Language") + info := service.MyService.OAPI().GetServerAppInfo(id, "", language) if info.NetworkModel != "host" { for i := 0; i < len(info.Ports); i++ { if p, _ := strconv.Atoi(info.Ports[i].ContainerPort); port2.IsPortAvailable(p, info.Ports[i].Protocol) {
route/v1/disk.go+1 −1 modified@@ -82,7 +82,7 @@ func GetDiskList(c *gin.Context) { continue } - if list[i].Tran == "sata" { + if list[i].Tran == "sata" || list[i].Tran == "nvme" { temp := service.MyService.Disk().SmartCTL(list[i].Path) if reflect.DeepEqual(temp, model.SmartctlA{}) { continue
route/v1/docker.go+2 −1 modified@@ -145,6 +145,7 @@ func SpeedPush(c *gin.Context) { // @Router /app/install/{id} [post] func InstallApp(c *gin.Context) { appId := c.Param("id") + language := c.GetHeader("Language") var appInfo model.ServerAppList m := model.CustomizationPostData{} c.BindJSON(&m) @@ -174,7 +175,7 @@ func InstallApp(c *gin.Context) { dockerImageVersion = "latest" } if m.Origin != "custom" { - appInfo = service.MyService.OAPI().GetServerAppInfo(appId, "") + appInfo = service.MyService.OAPI().GetServerAppInfo(appId, "", language) } else {
route/v1/system.go+1 −1 modified@@ -286,7 +286,7 @@ func Info(c *gin.Context) { findSystem += 1 continue } - if list[i].Tran == "sata" { + if list[i].Tran == "sata" || list[i].Tran == "nvme" { temp := service.MyService.Disk().SmartCTL(list[i].Path) if reflect.DeepEqual(temp, model.SmartctlA{}) { continue
route/v1/zerotier.go+21 −5 modified@@ -2,12 +2,13 @@ package v1 import ( json2 "encoding/json" + "net/http" + "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/pkg/config" oasis_err2 "github.com/IceWhaleTech/CasaOS/pkg/utils/oasis_err" "github.com/IceWhaleTech/CasaOS/service" "github.com/gin-gonic/gin" - "net/http" ) // @Summary 登录zerotier获取token @@ -432,11 +433,17 @@ func ZeroTierDeleteNetwork(c *gin.Context) { // @Router /zerotier/join/{id} [post] func ZeroTierJoinNetwork(c *gin.Context) { networkId := c.Param("id") - service.MyService.ZeroTier().ZeroTierJoinNetwork(networkId) - if len(networkId) == 0 { + if len(networkId) != 16 { c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) return } + for _, v := range networkId { + if !service.MyService.ZeroTier().NetworkIdFilter(v) { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + } + service.MyService.ZeroTier().ZeroTierJoinNetwork(networkId) c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) } @@ -450,10 +457,19 @@ func ZeroTierJoinNetwork(c *gin.Context) { // @Router /zerotier/leave/{id} [post] func ZeroTierLeaveNetwork(c *gin.Context) { networkId := c.Param("id") - service.MyService.ZeroTier().ZeroTierLeaveNetwork(networkId) - if len(networkId) == 0 { + + if len(networkId) != 16 { c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) return } + + for _, v := range networkId { + if !service.MyService.ZeroTier().NetworkIdFilter(v) { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + } + service.MyService.ZeroTier().ZeroTierLeaveNetwork(networkId) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) }
service/casa.go+7 −7 modified@@ -13,10 +13,10 @@ import ( ) type CasaService interface { - GetServerList(index, size, tp, categoryId, key string) (recommend, list, community []model.ServerAppList) + GetServerList(index, size, tp, categoryId, key, language string) (recommend, list, community []model.ServerAppList) GetServerCategoryList() []model.ServerCategoryList GetTaskList(size int) []model2.TaskDBModel - GetServerAppInfo(id, t string) model.ServerAppList + GetServerAppInfo(id, t string, language string) model.ServerAppList ShareAppFile(body []byte) string } @@ -45,9 +45,9 @@ func (o *casaService) GetTaskList(size int) []model2.TaskDBModel { return list } -func (o *casaService) GetServerList(index, size, tp, categoryId, key string) (recommend, list, community []model.ServerAppList) { +func (o *casaService) GetServerList(index, size, tp, categoryId, key, language string) (recommend, list, community []model.ServerAppList) { - keyName := fmt.Sprintf("list_%s_%s_%s_%s", index, size, tp, categoryId) + keyName := fmt.Sprintf("list_%s_%s_%s_%s_%s", index, size, tp, categoryId, language) if result, ok := Cache.Get(keyName); ok { res, ok := result.(string) @@ -63,7 +63,7 @@ func (o *casaService) GetServerList(index, size, tp, categoryId, key string) (re head["Authorization"] = GetToken() - listS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/newlist?index="+index+"&size="+size+"&rank="+tp+"&category_id="+categoryId+"&key="+key, head) + listS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/newlist?index="+index+"&size="+size+"&rank="+tp+"&category_id="+categoryId+"&key="+key+"&language="+language, head) json2.Unmarshal([]byte(gjson.Get(listS, "data.list").String()), &list) json2.Unmarshal([]byte(gjson.Get(listS, "data.recommend").String()), &recommend) @@ -88,12 +88,12 @@ func (o *casaService) GetServerCategoryList() []model.ServerCategoryList { return list } -func (o *casaService) GetServerAppInfo(id, t string) model.ServerAppList { +func (o *casaService) GetServerAppInfo(id, t string, language string) model.ServerAppList { head := make(map[string]string) head["Authorization"] = GetToken() - infoS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/info/"+id+"?t="+t, head) + infoS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/info/"+id+"?t="+t+"&language="+language, head) info := model.ServerAppList{} json2.Unmarshal([]byte(gjson.Get(infoS, "data").String()), &info)
service/zerotier.go+16 −6 modified@@ -4,18 +4,20 @@ import ( "bytes" "errors" "fmt" - "github.com/IceWhaleTech/CasaOS/pkg/config" - command2 "github.com/IceWhaleTech/CasaOS/pkg/utils/command" - httper2 "github.com/IceWhaleTech/CasaOS/pkg/utils/httper" - "github.com/IceWhaleTech/CasaOS/pkg/zerotier" - "github.com/PuerkitoBio/goquery" - "github.com/tidwall/gjson" "io/ioutil" "math/rand" "net/http" "strconv" "strings" "time" + "unicode" + + "github.com/IceWhaleTech/CasaOS/pkg/config" + command2 "github.com/IceWhaleTech/CasaOS/pkg/utils/command" + httper2 "github.com/IceWhaleTech/CasaOS/pkg/utils/httper" + "github.com/IceWhaleTech/CasaOS/pkg/zerotier" + "github.com/PuerkitoBio/goquery" + "github.com/tidwall/gjson" ) type ZeroTierService interface { @@ -33,6 +35,7 @@ type ZeroTierService interface { DeleteMember(token string, id, mId string) interface{} DeleteNetwork(token, id string) interface{} GetJoinNetworks() string + NetworkIdFilter(letter rune) bool } type zerotierStruct struct { } @@ -333,6 +336,13 @@ func (c *zerotierStruct) GetJoinNetworks() string { return json } +func (c *zerotierStruct) NetworkIdFilter(letter rune) bool { + if unicode.IsNumber(letter) || unicode.IsLetter(letter) { + return true + } else { + return false + } +} func NewZeroTierService() ZeroTierService { //初始化client client = http.Client{Timeout: 30 * time.Second, CheckRedirect: func(req *http.Request, via []*http.Request) error {
types/system.go+2 −2 modified@@ -1,5 +1,5 @@ package types -const CURRENTVERSION = "0.2.6" +const CURRENTVERSION = "0.2.7" -const BODY = "<li>Fix a disk that cannot be formatted under certain circumstances</li><li>Add a bug report panel.</li>" +const BODY = "<li>Apply multilingual support</li><li>Fix a security vulnerability</li>"
UI+1 −1 modified@@ -1 +1 @@ -Subproject commit d457b64e2656febd680e92b974a14776edfa2a7f +Subproject commit a6074812f4dc40424cf6468e47d98eb8a26f9d58
web/js/2.js+135 −157 modifiedweb/js/3.js+4 −4 modified@@ -12,15 +12,15 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vee_ /***/ }), -/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"c25436b0-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Welcome.vue?vue&type=template&id=e4731dd0&": +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"445a19f9-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Welcome.vue?vue&type=template&id=e4731dd0&": /*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"c25436b0-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/Welcome.vue?vue&type=template&id=e4731dd0& ***! + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"445a19f9-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/Welcome.vue?vue&type=template&id=e4731dd0& ***! \*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"is-flex is-justify-content-center is-align-items-center\",\n attrs: { id: \"login-page\" }\n },\n [\n !_vm.isLoading\n ? _c(\n \"div\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.initAni,\n expression: \"initAni\"\n }\n ],\n staticClass: \"login-panel is-shadow\",\n class: \"step\" + _vm.step\n },\n [\n _vm.step == 1\n ? _c(\n \"div\",\n { staticClass: \"has-text-centered\" },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s1Ani,\n expression: \"s1Ani\"\n }\n ],\n staticClass: \" is-flex is-justify-content-center\"\n },\n [\n _c(\"b-image\", {\n staticClass: \"is-128x128 mb-4\",\n attrs: { src: __webpack_require__(/*! @/assets/img/wuji.svg */ \"./src/assets/img/wuji.svg\") }\n })\n ],\n 1\n ),\n _c(\n \"h2\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s2Ani,\n expression: \"s2Ani\"\n }\n ],\n staticClass: \"title is-2 mb-5 has-text-centered\"\n },\n [_vm._v(_vm._s(_vm.$t(\"Welcome to CasaOS\")))]\n ),\n _c(\n \"h2\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s3Ani,\n expression: \"s3Ani\"\n }\n ],\n staticClass: \"subtitle has-text-centered\"\n },\n [\n _vm._v(\n _vm._s(_vm.$t(\"Let's create your initial account\"))\n )\n ]\n ),\n _c(\n \"b-button\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s4Ani,\n expression: \"s4Ani\"\n }\n ],\n staticClass: \"mt-2\",\n attrs: { type: \"is-primary\", rounded: \"\" },\n on: {\n click: function($event) {\n return _vm.goToStep(2)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"Go →\")))]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm.step == 2\n ? _c(\n \"div\",\n [\n _c(\n \"h2\",\n { staticClass: \"title is-3 has-text-centered\" },\n [_vm._v(_vm._s(_vm.$t(\"Create Account\")))]\n ),\n _c(\n \"div\",\n { staticClass: \"is-flex is-justify-content-center \" },\n [\n _c(\n \"div\",\n { staticClass: \"has-text-centered\" },\n [\n _c(\"b-image\", {\n staticClass: \"is-128x128\",\n attrs: {\n src: __webpack_require__(/*! @/assets/img/Account.png */ \"./src/assets/img/Account.png\"),\n rounded: \"\"\n }\n })\n ],\n 1\n )\n ]\n ),\n _c(\"ValidationObserver\", {\n ref: \"observer\",\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var handleSubmit = ref.handleSubmit\n return [\n _c(\"ValidationProvider\", {\n attrs: { rules: \"required\", name: \"User\" },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n attrs: {\n label: _vm.$t(\"Username\"),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: { type: \"text\" },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\n \"key\"\n ) &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(\n _vm.reg\n )\n }\n },\n model: {\n value: _vm.username,\n callback: function($$v) {\n _vm.username = $$v\n },\n expression: \"username\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\"ValidationProvider\", {\n attrs: {\n rules: \"required|min:5\",\n vid: \"password\",\n name: \"Password\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n staticClass: \"mt-4\",\n attrs: {\n label: _vm.$t(\"Password\"),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n type: \"password\",\n \"password-reveal\": \"\"\n },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\n \"key\"\n ) &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(\n _vm.reg\n )\n }\n },\n model: {\n value: _vm.password,\n callback: function($$v) {\n _vm.password = $$v\n },\n expression: \"password\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\"ValidationProvider\", {\n attrs: {\n rules: \"required|confirmed:password\",\n name: \"Password Confirmation\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n staticClass: \"mt-4\",\n attrs: {\n label: _vm.$t(\n \"Confirm Password\"\n ),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n type: \"password\",\n \"password-reveal\": \"\"\n },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\n \"key\"\n ) &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(\n _vm.reg\n )\n }\n },\n model: {\n value: _vm.confirmation,\n callback: function($$v) {\n _vm.confirmation = $$v\n },\n expression: \"confirmation\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\n \"b-button\",\n {\n staticClass: \"mt-5\",\n attrs: {\n type: \"is-primary\",\n rounded: \"\",\n expanded: \"\"\n },\n on: {\n click: function($event) {\n return handleSubmit(_vm.reg)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"Create\")))]\n )\n ]\n }\n }\n ],\n null,\n false,\n 3231920384\n )\n })\n ],\n 1\n )\n : _vm._e(),\n _vm.step == 3\n ? _c(\"div\", { staticClass: \"has-text-centered \" }, [\n _c(\"h2\", { staticClass: \"title is-3 has-text-centered\" }, [\n _vm._v(_vm._s(_vm.$t(\"All things done!\")))\n ]),\n _c(\n \"div\",\n {\n staticClass:\n \"is-flex is-align-items-center is-justify-content-center\"\n },\n [\n _c(\"lottie-animation\", {\n staticClass: \"animation\",\n attrs: {\n animationData: __webpack_require__(/*! @/assets/ani/done.json */ \"./src/assets/ani/done.json\"),\n autoPlay: true,\n loop: false\n },\n on: { complete: _vm.complete }\n })\n ],\n 1\n )\n ])\n : _vm._e()\n ]\n )\n : _vm._e()\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/Welcome.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22c25436b0-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"is-flex is-justify-content-center is-align-items-center\",\n attrs: { id: \"login-page\" }\n },\n [\n !_vm.isLoading\n ? _c(\n \"div\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.initAni,\n expression: \"initAni\"\n }\n ],\n staticClass: \"login-panel is-shadow\",\n class: \"step\" + _vm.step\n },\n [\n _vm.step == 1\n ? _c(\n \"div\",\n { staticClass: \"has-text-centered\" },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s1Ani,\n expression: \"s1Ani\"\n }\n ],\n staticClass: \" is-flex is-justify-content-center\"\n },\n [\n _c(\"b-image\", {\n staticClass: \"is-128x128 mb-4\",\n attrs: { src: __webpack_require__(/*! @/assets/img/wuji.svg */ \"./src/assets/img/wuji.svg\") }\n })\n ],\n 1\n ),\n _c(\n \"h2\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s2Ani,\n expression: \"s2Ani\"\n }\n ],\n staticClass: \"title is-2 mb-5 has-text-centered\"\n },\n [_vm._v(_vm._s(_vm.$t(\"Welcome to CasaOS\")))]\n ),\n _c(\n \"h2\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s3Ani,\n expression: \"s3Ani\"\n }\n ],\n staticClass: \"subtitle has-text-centered\"\n },\n [\n _vm._v(\n _vm._s(_vm.$t(\"Let's create your initial account\"))\n )\n ]\n ),\n _c(\n \"b-button\",\n {\n directives: [\n {\n name: \"animate-css\",\n rawName: \"v-animate-css\",\n value: _vm.s4Ani,\n expression: \"s4Ani\"\n }\n ],\n staticClass: \"mt-2\",\n attrs: { type: \"is-primary\", rounded: \"\" },\n on: {\n click: function($event) {\n return _vm.goToStep(2)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"Go →\")))]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm.step == 2\n ? _c(\n \"div\",\n [\n _c(\n \"h2\",\n { staticClass: \"title is-3 has-text-centered\" },\n [_vm._v(_vm._s(_vm.$t(\"Create Account\")))]\n ),\n _c(\n \"div\",\n { staticClass: \"is-flex is-justify-content-center \" },\n [\n _c(\n \"div\",\n { staticClass: \"has-text-centered\" },\n [\n _c(\"b-image\", {\n staticClass: \"is-128x128\",\n attrs: {\n src: __webpack_require__(/*! @/assets/img/Account.png */ \"./src/assets/img/Account.png\"),\n rounded: \"\"\n }\n })\n ],\n 1\n )\n ]\n ),\n _c(\"ValidationObserver\", {\n ref: \"observer\",\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var handleSubmit = ref.handleSubmit\n return [\n _c(\"ValidationProvider\", {\n attrs: { rules: \"required\", name: \"User\" },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n attrs: {\n label: _vm.$t(\"Username\"),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: { type: \"text\" },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\n \"key\"\n ) &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(\n _vm.reg\n )\n }\n },\n model: {\n value: _vm.username,\n callback: function($$v) {\n _vm.username = $$v\n },\n expression: \"username\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\"ValidationProvider\", {\n attrs: {\n rules: \"required|min:5\",\n vid: \"password\",\n name: \"Password\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n staticClass: \"mt-4\",\n attrs: {\n label: _vm.$t(\"Password\"),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n type: \"password\",\n \"password-reveal\": \"\"\n },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\n \"key\"\n ) &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(\n _vm.reg\n )\n }\n },\n model: {\n value: _vm.password,\n callback: function($$v) {\n _vm.password = $$v\n },\n expression: \"password\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\"ValidationProvider\", {\n attrs: {\n rules: \"required|confirmed:password\",\n name: \"Password Confirmation\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n staticClass: \"mt-4\",\n attrs: {\n label: _vm.$t(\n \"Confirm Password\"\n ),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n type: \"password\",\n \"password-reveal\": \"\"\n },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\n \"key\"\n ) &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(\n _vm.reg\n )\n }\n },\n model: {\n value: _vm.confirmation,\n callback: function($$v) {\n _vm.confirmation = $$v\n },\n expression: \"confirmation\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\n \"b-button\",\n {\n staticClass: \"mt-5\",\n attrs: {\n type: \"is-primary\",\n rounded: \"\",\n expanded: \"\"\n },\n on: {\n click: function($event) {\n return handleSubmit(_vm.reg)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"Create\")))]\n )\n ]\n }\n }\n ],\n null,\n false,\n 3231920384\n )\n })\n ],\n 1\n )\n : _vm._e(),\n _vm.step == 3\n ? _c(\"div\", { staticClass: \"has-text-centered \" }, [\n _c(\"h2\", { staticClass: \"title is-3 has-text-centered\" }, [\n _vm._v(_vm._s(_vm.$t(\"All things done!\")))\n ]),\n _c(\n \"div\",\n {\n staticClass:\n \"is-flex is-align-items-center is-justify-content-center\"\n },\n [\n _c(\"lottie-animation\", {\n staticClass: \"animation\",\n attrs: {\n animationData: __webpack_require__(/*! @/assets/ani/done.json */ \"./src/assets/ani/done.json\"),\n autoPlay: true,\n loop: false\n },\n on: { complete: _vm.complete }\n })\n ],\n 1\n )\n ])\n : _vm._e()\n ]\n )\n : _vm._e()\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/Welcome.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22445a19f9-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -101,7 +101,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_c25436b0_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Welcome_vue_vue_type_template_id_e4731dd0___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"c25436b0-vue-loader-template\"}!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib??vue-loader-options!./Welcome.vue?vue&type=template&id=e4731dd0& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"c25436b0-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Welcome.vue?vue&type=template&id=e4731dd0&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_c25436b0_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Welcome_vue_vue_type_template_id_e4731dd0___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_c25436b0_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Welcome_vue_vue_type_template_id_e4731dd0___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/Welcome.vue?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_445a19f9_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Welcome_vue_vue_type_template_id_e4731dd0___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"445a19f9-vue-loader-template\"}!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib??vue-loader-options!./Welcome.vue?vue&type=template&id=e4731dd0& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"445a19f9-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Welcome.vue?vue&type=template&id=e4731dd0&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_445a19f9_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Welcome_vue_vue_type_template_id_e4731dd0___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_445a19f9_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Welcome_vue_vue_type_template_id_e4731dd0___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/Welcome.vue?"); /***/ })
web/js/4.js+5 −5 modified@@ -8,19 +8,19 @@ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vee_validate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vee-validate */ \"./node_modules/vee-validate/dist/vee-validate.esm.js\");\n/* harmony import */ var _plugins_vee_validate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/plugins/vee-validate */ \"./src/plugins/vee-validate.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Login\",\n data: function data() {\n return {\n username: '',\n password: '',\n isLoading: true,\n message: \"\",\n notificationShow: false\n };\n },\n components: {\n ValidationObserver: vee_validate__WEBPACK_IMPORTED_MODULE_0__[\"ValidationObserver\"],\n ValidationProvider: vee_validate__WEBPACK_IMPORTED_MODULE_0__[\"ValidationProvider\"]\n },\n mounted: function mounted() {\n var _this = this;\n\n this.isLoading = false;\n this.$api.user.getUserInfo().then(function (user) {\n _this.username = user.data.data.user_name;\n });\n },\n methods: {\n login: function login() {\n var _this2 = this;\n\n this.$api.user.login({\n username: this.username,\n pwd: this.password\n }).then(function (res) {\n if (res.data.success == 200) {\n localStorage.setItem(\"user_token\", res.data.data.token);\n localStorage.setItem(\"version\", res.data.data.version);\n\n _this2.$store.commit('setToken', res.data.data.token);\n\n _this2.$api.user.getUserInfo().then(function (res) {\n if (res.data.success == 200) {\n _this2.$store.commit('changeUserInfo', res.data.data);\n\n _this2.$router.push('/');\n }\n });\n } else {\n _this2.notificationShow = true;\n _this2.message = _this2.$t(\"Password error!\");\n }\n });\n }\n }\n});\n\n//# sourceURL=webpack:///./src/views/Login.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vee_validate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vee-validate */ \"./node_modules/vee-validate/dist/vee-validate.esm.js\");\n/* harmony import */ var _plugins_vee_validate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/plugins/vee-validate */ \"./src/plugins/vee-validate.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Login\",\n data: function data() {\n return {\n username: '',\n password: '',\n isLoading: true,\n message: \"\",\n notificationShow: false,\n isInit: false\n };\n },\n components: {\n ValidationObserver: vee_validate__WEBPACK_IMPORTED_MODULE_0__[\"ValidationObserver\"],\n ValidationProvider: vee_validate__WEBPACK_IMPORTED_MODULE_0__[\"ValidationProvider\"]\n },\n mounted: function mounted() {\n var _this = this;\n\n this.$api.info.guideCheck().then(function (res) {\n if (res.data.success == 200 && res.data.data.need_init_user) {\n _this.isLoading = false;\n } else {\n _this.isLoading = true;\n }\n });\n this.$api.user.getUserInfo().then(function (user) {\n _this.username = user.data.data.user_name;\n });\n },\n methods: {\n login: function login() {\n var _this2 = this;\n\n this.$api.user.login({\n username: this.username,\n pwd: this.password\n }).then(function (res) {\n if (res.data.success == 200) {\n localStorage.setItem(\"user_token\", res.data.data.token);\n localStorage.setItem(\"version\", res.data.data.version);\n\n _this2.$store.commit('setToken', res.data.data.token);\n\n _this2.$api.user.getUserInfo().then(function (res) {\n if (res.data.success == 200) {\n _this2.$store.commit('changeUserInfo', res.data.data);\n\n _this2.$router.push('/');\n }\n });\n } else {\n _this2.notificationShow = true;\n _this2.message = _this2.$t(\"Password error!\");\n }\n });\n }\n }\n});\n\n//# sourceURL=webpack:///./src/views/Login.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), -/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"c25436b0-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Login.vue?vue&type=template&id=26084dc2&": +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"445a19f9-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Login.vue?vue&type=template&id=26084dc2&": /*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"c25436b0-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/Login.vue?vue&type=template&id=26084dc2& ***! + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"445a19f9-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/Login.vue?vue&type=template&id=26084dc2& ***! \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"is-flex is-justify-content-center is-align-items-center \",\n attrs: { id: \"login-page\" }\n },\n [\n !_vm.isLoading\n ? _c(\n \"div\",\n { staticClass: \"login-panel step4 is-shadow\" },\n [\n _c(\"div\", { staticClass: \"is-flex is-justify-content-center \" }, [\n _c(\n \"div\",\n { staticClass: \"has-text-centered\" },\n [\n _c(\"b-image\", {\n staticClass: \"is-128x128\",\n attrs: {\n src: __webpack_require__(/*! @/assets/img/Account.png */ \"./src/assets/img/Account.png\"),\n rounded: \"\"\n }\n }),\n _c(\n \"p\",\n { staticClass: \"is-size-5 has-text-weight-bold mt-3\" },\n [_vm._v(_vm._s(_vm.username))]\n )\n ],\n 1\n )\n ]),\n _c(\n \"b-notification\",\n {\n attrs: {\n \"auto-close\": \"\",\n type: \"is-danger\",\n \"aria-close-label\": \"Close notification\",\n role: \"alert\"\n },\n model: {\n value: _vm.notificationShow,\n callback: function($$v) {\n _vm.notificationShow = $$v\n },\n expression: \"notificationShow\"\n }\n },\n [_vm._v(\" \" + _vm._s(_vm.message) + \" \")]\n ),\n _c(\"ValidationObserver\", {\n ref: \"observer\",\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var handleSubmit = ref.handleSubmit\n return [\n _c(\"ValidationProvider\", {\n attrs: {\n rules: \"required|min:5\",\n vid: \"password\",\n name: \"Password\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n staticClass: \"mt-5 has-text-light\",\n attrs: {\n label: _vm.$t(\"Password\"),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n type: \"password\",\n \"password-reveal\": \"\"\n },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(_vm.login)\n }\n },\n model: {\n value: _vm.password,\n callback: function($$v) {\n _vm.password = $$v\n },\n expression: \"password\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\n \"b-button\",\n {\n staticClass: \"mt-5\",\n attrs: {\n type: \"is-primary\",\n rounded: \"\",\n expanded: \"\"\n },\n on: {\n click: function($event) {\n return handleSubmit(_vm.login)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"Login\")))]\n )\n ]\n }\n }\n ],\n null,\n false,\n 327051097\n )\n })\n ],\n 1\n )\n : _vm._e()\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/Login.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22c25436b0-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"is-flex is-justify-content-center is-align-items-center \",\n attrs: { id: \"login-page\" }\n },\n [\n !_vm.isLoading\n ? _c(\n \"div\",\n { staticClass: \"login-panel step4 is-shadow\" },\n [\n _c(\"div\", { staticClass: \"is-flex is-justify-content-center \" }, [\n _c(\n \"div\",\n { staticClass: \"has-text-centered\" },\n [\n _c(\"b-image\", {\n staticClass: \"is-128x128\",\n attrs: {\n src: __webpack_require__(/*! @/assets/img/Account.png */ \"./src/assets/img/Account.png\"),\n rounded: \"\"\n }\n }),\n _c(\n \"p\",\n { staticClass: \"is-size-5 has-text-weight-bold mt-3\" },\n [_vm._v(_vm._s(_vm.username))]\n )\n ],\n 1\n )\n ]),\n _c(\n \"b-notification\",\n {\n attrs: {\n \"auto-close\": \"\",\n type: \"is-danger\",\n \"aria-close-label\": \"Close notification\",\n role: \"alert\"\n },\n model: {\n value: _vm.notificationShow,\n callback: function($$v) {\n _vm.notificationShow = $$v\n },\n expression: \"notificationShow\"\n }\n },\n [_vm._v(\" \" + _vm._s(_vm.message) + \" \")]\n ),\n _c(\"ValidationObserver\", {\n ref: \"observer\",\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var handleSubmit = ref.handleSubmit\n return [\n _c(\"ValidationProvider\", {\n attrs: {\n rules: \"required|min:5\",\n vid: \"password\",\n name: \"Password\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n staticClass: \"mt-5 has-text-light\",\n attrs: {\n label: _vm.$t(\"Password\"),\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: _vm.$t(errors)\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n type: \"password\",\n \"password-reveal\": \"\"\n },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return handleSubmit(_vm.login)\n }\n },\n model: {\n value: _vm.password,\n callback: function($$v) {\n _vm.password = $$v\n },\n expression: \"password\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ],\n null,\n true\n )\n }),\n _c(\n \"b-button\",\n {\n staticClass: \"mt-5\",\n attrs: {\n type: \"is-primary\",\n rounded: \"\",\n expanded: \"\"\n },\n on: {\n click: function($event) {\n return handleSubmit(_vm.login)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"Login\")))]\n )\n ]\n }\n }\n ],\n null,\n false,\n 327051097\n )\n })\n ],\n 1\n )\n : _vm._e()\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/Login.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22445a19f9-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -56,7 +56,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_c25436b0_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Login_vue_vue_type_template_id_26084dc2___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"c25436b0-vue-loader-template\"}!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib??vue-loader-options!./Login.vue?vue&type=template&id=26084dc2& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"c25436b0-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Login.vue?vue&type=template&id=26084dc2&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_c25436b0_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Login_vue_vue_type_template_id_26084dc2___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_c25436b0_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Login_vue_vue_type_template_id_26084dc2___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/Login.vue?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_445a19f9_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Login_vue_vue_type_template_id_26084dc2___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"445a19f9-vue-loader-template\"}!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib??vue-loader-options!./Login.vue?vue&type=template&id=26084dc2& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"445a19f9-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/Login.vue?vue&type=template&id=26084dc2&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_445a19f9_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Login_vue_vue_type_template_id_26084dc2___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_445a19f9_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Login_vue_vue_type_template_id_26084dc2___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/Login.vue?"); /***/ })
web/js/app.js+84 −24 modifiedweb/js/chunk-vendors.js+3266 −1204 modified
Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
7- github.com/advisories/GHSA-jh63-28gx-7p26ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2022-24193ghsaADVISORY
- github.com/IceWhaleTech/CasaOS/commit/d060968b7ab08e7f8cbfe7ca9ccdfa47afe9bb06ghsax_refsource_MISCWEB
- github.com/IceWhaleTech/CasaOS/issues/84ghsax_refsource_MISCWEB
- www.star123.top/2022/01/08/A-vulnerability-in-CasaOSghsaWEB
- www.star123.top/2022/01/08/A-vulnerability-in-CasaOS/mitrex_refsource_MISC
- www.star123.top/2022/01/08/A-vulnerability-in-CasaOS/ghsax_refsource_MISCWEB
News mentions
0No linked articles in our index yet.