From 2f79a5d093a9b3513753a5c37182b40a0c6c0d46 Mon Sep 17 00:00:00 2001 From: yanghuanglin Date: Sat, 16 Sep 2023 13:53:53 +0800 Subject: [PATCH] preliminary write tokens to config with toml --- assets/static/js/index-user-list.js | 48 ++++++++------ pkg/server/controller/controller.go | 98 ++++++++++++----------------- pkg/server/controller/variables.go | 13 +--- 3 files changed, 74 insertions(+), 85 deletions(-) diff --git a/assets/static/js/index-user-list.js b/assets/static/js/index-user-list.js index af4d93b..80ef350 100644 --- a/assets/static/js/index-user-list.js +++ b/assets/static/js/index-user-list.js @@ -277,13 +277,14 @@ var loadUserList = (function ($) { } /** - * bind event of layui.form + * bind event of {{@link layui.form}} */ function bindFormEvent() { layui.table.on('edit(tokenTable)', function (obj) { var field = obj.field; var value = obj.value; var oldValue = obj.oldValue; + var before = $.extend(true, {}, obj.data); var after = $.extend(true, {}, obj.data); var verifyMsg = false; @@ -344,24 +345,34 @@ var loadUserList = (function ($) { after.subdomains = value; } + before.ports = before.ports.split(',') + before.domains = before.domains.split(',') + before.subdomains = before.subdomains.split(',') + + after.ports = after.ports.split(',') + after.domains = after.domains.split(',') + after.subdomains = after.subdomains.split(',') + update(before, after); }); layui.table.on('toolbar(tokenTable)', function (obj) { var id = obj.config.id; var checkStatus = layui.table.checkStatus(id); + + var data = checkStatus.data; switch (obj.event) { case 'add': addPopup(); break case 'remove': - batchRemovePopup(checkStatus.data); + batchRemovePopup(data); break case 'disable': - batchDisablePopup(checkStatus.data); + batchDisablePopup(data); break case 'enable': - batchEnablePopup(checkStatus.data); + batchEnablePopup(data); break } }); @@ -406,7 +417,11 @@ var loadUserList = (function ($) { btn: [i18n['Confirm'], i18n['Cancel']], btn1: function (index) { if (layui.form.validate('#addUserForm')) { - add(layui.form.val('addUserForm'), index); + var formData = layui.form.val('addUserForm'); + formData.ports = formData.ports.split(',') + formData.domains = formData.domains.split(',') + formData.subdomains = formData.subdomains.split(',') + add(formData, index); } }, btn2: function (index) { @@ -417,14 +432,11 @@ var loadUserList = (function ($) { /** * add user action - * @param data {{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}} user data + * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data * @param index popup index */ function add(data, index) { var loading = layui.layer.load(); - data.ports = data.ports.split(',') - data.domains = data.domains.split(',') - data.subdomains = data.subdomains.split(',') $.ajax({ url: '/add', type: 'post', @@ -449,8 +461,8 @@ var loadUserList = (function ($) { /** * update user action - * @param before {{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}} data before update - * @param after {{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}} data after update + * @param before {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} data before update + * @param after {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} data after update */ function update(before, after) { var loading = layui.layer.load(); @@ -477,7 +489,7 @@ var loadUserList = (function ($) { /** * batch remove user popup - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}]} user data list + * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list */ function batchRemovePopup(data) { if (data.length === 0) { @@ -494,7 +506,7 @@ var loadUserList = (function ($) { /** * batch disable user popup - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}]} user data list + * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list */ function batchDisablePopup(data) { if (data.length === 0) { @@ -511,7 +523,7 @@ var loadUserList = (function ($) { /** * batch enable user popup - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}]} user data list + * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list */ function batchEnablePopup(data) { if (data.length === 0) { @@ -528,7 +540,7 @@ var loadUserList = (function ($) { /** * remove one user popup - * @param data {{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}} user data + * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data */ function removePopup(data) { layui.layer.confirm(i18n['ConfirmRemoveUser'], { @@ -541,7 +553,7 @@ var loadUserList = (function ($) { /** * disable one user popup - * @param data {{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}} user data + * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data */ function disablePopup(data) { layui.layer.confirm(i18n['ConfirmDisableUser'], { @@ -554,7 +566,7 @@ var loadUserList = (function ($) { /** * enable one user popup - * @param data {{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}} user data + * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data */ function enablePopup(data) { layui.layer.confirm(i18n['ConfirmEnableUser'], { @@ -568,7 +580,7 @@ var loadUserList = (function ($) { /** * operate actions * @param type {apiType} action type - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:string, domains:string, subdomains:string}]} user data list + * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list * @param index popup index */ function operate(type, data, index) { diff --git a/pkg/server/controller/controller.go b/pkg/server/controller/controller.go index 386aa50..2abbafa 100644 --- a/pkg/server/controller/controller.go +++ b/pkg/server/controller/controller.go @@ -311,6 +311,28 @@ func filter(main TokenInfo, sub TokenInfo) bool { return true } +func TokensList(tokens map[string]TokenInfo) Tokens { + return Tokens{ + tokens, + } +} + +func (c *HandleController) SaveToken() error { + tokenFile, err := os.Create(c.TokensFile) + if err != nil { + log.Printf("error to crate file %v: %v", c.TokensFile, err) + } + + if err = toml.NewEncoder(tokenFile).Encode(TokensList(c.Tokens)); err != nil { + log.Printf("error to encode tokens: %v", err) + } + if err = tokenFile.Close(); err != nil { + log.Printf("error to close file %v: %v", c.TokensFile, err) + } + + return err +} + func (c *HandleController) MakeAddTokenFunc() func(context *gin.Context) { return func(context *gin.Context) { info := TokenInfo{ @@ -357,18 +379,7 @@ func (c *HandleController) MakeAddTokenFunc() func(context *gin.Context) { c.Tokens[info.User] = info - tokenFile, err := os.Create(c.TokensFile) - if err != nil { - log.Printf("error to crate file %v: %v", c.TokensFile, err) - } - - if err = toml.NewEncoder(tokenFile).Encode(c.TokensList()); err != nil { - log.Printf("error to encode tokens: %v", err) - } - if err = tokenFile.Close(); err != nil { - log.Printf("error to close file %v: %v", c.TokensFile, err) - } - + err = c.SaveToken() if err != nil { log.Printf("add failed, error : %v", err) response.Success = false @@ -395,36 +406,35 @@ func (c *HandleController) MakeUpdateTokensFunc() func(context *gin.Context) { log.Printf("update failed, param error : %v", err) response.Success = false response.Code = ParamError - response.Message = "user update failed, param error " + response.Message = "user update failed, param error" context.JSON(http.StatusOK, &response) return } + before := update.Before after := update.After - _ = update.Before + + if after.User != before.User { + log.Printf("update failed, user not match") + response.Success = false + response.Code = ParamError + response.Message = "update failed, user not match" + context.JSON(http.StatusOK, &response) + return + } if !TokenFormatReg.MatchString(after.Token) { log.Printf("update failed, token format error") response.Success = false response.Code = TokenFormatError - response.Message = "user update failed, token format error " + response.Message = "user update failed, token format error" context.JSON(http.StatusOK, &response) return } c.Tokens[after.User] = after - tokenFile, err := os.Create(c.TokensFile) - if err != nil { - log.Printf("error to crate file %v: %v", c.TokensFile, err) - } - if err = toml.NewEncoder(tokenFile).Encode(c.Tokens); err != nil { - log.Printf("error to encode tokens: %v", err) - } - if err = tokenFile.Close(); err != nil { - log.Printf("error to close file %v: %v", c.TokensFile, err) - } - + err = c.SaveToken() if err != nil { log.Printf("user update failed, error : %v", err) response.Success = false @@ -460,17 +470,7 @@ func (c *HandleController) MakeRemoveTokensFunc() func(context *gin.Context) { delete(c.Tokens, user.User) } - tokenFile, err := os.Create(c.TokensFile) - if err != nil { - log.Printf("error to crate file %v: %v", c.TokensFile, err) - } - if err = toml.NewEncoder(tokenFile).Encode(c.Tokens); err != nil { - log.Printf("error to encode tokens: %v", err) - } - if err = tokenFile.Close(); err != nil { - log.Printf("error to close file %v: %v", c.TokensFile, err) - } - + err = c.SaveToken() if err != nil { log.Printf("user update failed, error : %v", err) response.Success = false @@ -505,18 +505,10 @@ func (c *HandleController) MakeDisableTokensFunc() func(context *gin.Context) { for _, user := range disable.Users { token := c.Tokens[user.User] token.Status = false + c.Tokens[user.User] = token } - tokenFile, err := os.Create(c.TokensFile) - if err != nil { - log.Printf("error to crate file %v: %v", c.TokensFile, err) - } - if err = toml.NewEncoder(tokenFile).Encode(c.Tokens); err != nil { - log.Printf("error to encode tokens: %v", err) - } - if err = tokenFile.Close(); err != nil { - log.Printf("error to close file %v: %v", c.TokensFile, err) - } + err = c.SaveToken() if err != nil { log.Printf("disable failed, error : %v", err) @@ -552,18 +544,10 @@ func (c *HandleController) MakeEnableTokensFunc() func(context *gin.Context) { for _, user := range enable.Users { token := c.Tokens[user.User] token.Status = true + c.Tokens[user.User] = token } - tokenFile, err := os.Create(c.TokensFile) - if err != nil { - log.Printf("error to crate file %v: %v", c.TokensFile, err) - } - if err = toml.NewEncoder(tokenFile).Encode(c.Tokens); err != nil { - log.Printf("error to encode tokens: %v", err) - } - if err = tokenFile.Close(); err != nil { - log.Printf("error to close file %v: %v", c.TokensFile, err) - } + err = c.SaveToken() if err != nil { log.Printf("enable failed, error : %v", err) diff --git a/pkg/server/controller/variables.go b/pkg/server/controller/variables.go index 080f437..0d40038 100644 --- a/pkg/server/controller/variables.go +++ b/pkg/server/controller/variables.go @@ -22,10 +22,9 @@ const ( ) var ( - UserFormatReg = regexp.MustCompile("^\\w+$") - TokenFormatReg = regexp.MustCompile("^[\\w!@#$%^&*()]+$") - TrimAllSpaceReg = regexp.MustCompile("[\\n\\t\\r\\s]") - TrimBreakLineReg = regexp.MustCompile("[\\n\\t\\r]") + UserFormatReg = regexp.MustCompile("^\\w+$") + TokenFormatReg = regexp.MustCompile("^[\\w!@#$%^&*()]+$") + TrimAllSpaceReg = regexp.MustCompile("[\\n\\t\\r\\s]") ) type Response struct { @@ -116,9 +115,3 @@ type TokenEnable struct { func (e *HTTPError) Error() string { return e.Err.Error() } - -func (c *HandleController) TokensList() Tokens { - return Tokens{ - c.Tokens, - } -}