From 9dc3498a2a7b93cad33830d2fbe611339d429383 Mon Sep 17 00:00:00 2001 From: JustSong Date: Tue, 22 Nov 2022 12:44:41 +0800 Subject: [PATCH] chore: update token store when user updated --- channel/token-store.go | 79 +++++++++++++++++++++++++++++++++++++++--- controller/user.go | 39 +++++++++++++++++---- model/user.go | 6 ++-- 3 files changed, 109 insertions(+), 15 deletions(-) diff --git a/channel/token-store.go b/channel/token-store.go index 47664b4..c5b2c84 100644 --- a/channel/token-store.go +++ b/channel/token-store.go @@ -78,19 +78,88 @@ func TokenStoreInit() { }() } -func TokenStoreAddItem(item *TokenStoreItem) { - (*item).Refresh() +func TokenStoreAddItem(item TokenStoreItem) { + item.Refresh() s.Mutex.RLock() - s.Map[(*item).Key()] = item + s.Map[item.Key()] = &item s.Mutex.RUnlock() } -func TokenStoreRemoveItem(item *TokenStoreItem) { +func TokenStoreRemoveItem(item TokenStoreItem) { s.Mutex.RLock() - delete(s.Map, (*item).Key()) + delete(s.Map, item.Key()) s.Mutex.RUnlock() } +func TokenStoreUpdateUser(cleanUser *model.User, originUser *model.User) { + // TODO: check if this token is shared! + if cleanUser.WeChatTestAccountId == originUser.WeChatTestAccountId { + cleanUser.WeChatTestAccountId = "" + } + if cleanUser.WeChatTestAccountSecret == originUser.WeChatTestAccountSecret { + cleanUser.WeChatTestAccountSecret = "" + } + if cleanUser.WeChatTestAccountId != "" || cleanUser.WeChatTestAccountSecret != "" { + oldWeChatTestAccountTokenStoreItem := WeChatTestAccountTokenStoreItem{ + AppID: originUser.WeChatTestAccountId, + AppSecret: originUser.WeChatTestAccountSecret, + } + newWeChatTestAccountTokenStoreItem := oldWeChatTestAccountTokenStoreItem + if cleanUser.WeChatTestAccountId != "" { + newWeChatTestAccountTokenStoreItem.AppID = cleanUser.WeChatTestAccountId + } + if cleanUser.WeChatTestAccountSecret != "" { + newWeChatTestAccountTokenStoreItem.AppSecret = cleanUser.WeChatTestAccountSecret + } + TokenStoreRemoveItem(&oldWeChatTestAccountTokenStoreItem) + TokenStoreAddItem(&newWeChatTestAccountTokenStoreItem) + } + if cleanUser.WeChatCorpAccountId == originUser.WeChatCorpAccountId { + cleanUser.WeChatCorpAccountId = "" + } + if cleanUser.WeChatCorpAccountAgentId == originUser.WeChatCorpAccountAgentId { + cleanUser.WeChatCorpAccountAgentId = "" + } + if cleanUser.WeChatCorpAccountSecret == originUser.WeChatCorpAccountSecret { + cleanUser.WeChatCorpAccountSecret = "" + } + if cleanUser.WeChatCorpAccountId != "" || cleanUser.WeChatCorpAccountAgentId != "" || cleanUser.WeChatCorpAccountSecret != "" { + oldWeChatCorpAccountTokenStoreItem := WeChatCorpAccountTokenStoreItem{ + CorpId: cleanUser.WeChatCorpAccountId, + CorpSecret: cleanUser.WeChatCorpAccountSecret, + AgentId: cleanUser.WeChatCorpAccountAgentId, + } + newWeChatCorpAccountTokenStoreItem := oldWeChatCorpAccountTokenStoreItem + if cleanUser.WeChatCorpAccountId != "" { + newWeChatCorpAccountTokenStoreItem.CorpId = cleanUser.WeChatCorpAccountId + } + if cleanUser.WeChatCorpAccountSecret != "" { + newWeChatCorpAccountTokenStoreItem.CorpSecret = cleanUser.WeChatCorpAccountSecret + } + if cleanUser.WeChatCorpAccountAgentId != "" { + newWeChatCorpAccountTokenStoreItem.AgentId = cleanUser.WeChatCorpAccountAgentId + } + TokenStoreRemoveItem(&oldWeChatCorpAccountTokenStoreItem) + TokenStoreAddItem(&newWeChatCorpAccountTokenStoreItem) + } +} + +// TokenStoreRemoveUser user must be filled +func TokenStoreRemoveUser(user *model.User) { + // TODO: check if this token is shared! + testAccountTokenStoreItem := WeChatTestAccountTokenStoreItem{ + AppID: user.WeChatTestAccountId, + AppSecret: user.WeChatTestAccountSecret, + } + TokenStoreRemoveItem(&testAccountTokenStoreItem) + corpAccountTokenStoreItem := WeChatCorpAccountTokenStoreItem{ + CorpId: user.WeChatCorpAccountId, + CorpSecret: user.WeChatCorpAccountSecret, + AgentId: user.WeChatCorpAccountAgentId, + } + TokenStoreRemoveItem(&corpAccountTokenStoreItem) +} + func TokenStoreGetToken(key string) string { s.Mutex.RLock() defer s.Mutex.RUnlock() diff --git a/controller/user.go b/controller/user.go index f84d00f..69eb050 100644 --- a/controller/user.go +++ b/controller/user.go @@ -5,6 +5,7 @@ import ( "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "github.com/google/uuid" + "message-pusher/channel" "message-pusher/common" "message-pusher/model" "net/http" @@ -376,13 +377,35 @@ func UpdateSelf(c *gin.Context) { }) return } - - cleanUser := model.User{ - Id: c.GetInt("id"), - Username: user.Username, - Password: user.Password, - DisplayName: user.DisplayName, + originUser, err := model.GetUserById(c.GetInt("id"), true) + if err != nil { + c.JSON(http.StatusOK, gin.H{ + "success": false, + "message": err.Error(), + }) + return } + cleanUser := model.User{ + Id: c.GetInt("id"), + Username: user.Username, + Password: user.Password, + WeChatTestAccountId: user.WeChatTestAccountId, + WeChatTestAccountSecret: user.WeChatTestAccountSecret, + WeChatTestAccountTemplateId: user.WeChatTestAccountTemplateId, + WeChatTestAccountOpenId: user.WeChatTestAccountOpenId, + WeChatTestAccountVerificationToken: user.WeChatTestAccountVerificationToken, + WeChatCorpAccountId: user.WeChatCorpAccountId, + WeChatCorpAccountSecret: user.WeChatCorpAccountSecret, + WeChatCorpAccountAgentId: user.WeChatCorpAccountAgentId, + WeChatCorpAccountUserId: user.WeChatCorpAccountUserId, + WeChatCorpAccountClientType: user.WeChatCorpAccountClientType, + LarkWebhookURL: user.LarkWebhookURL, + LarkWebhookSecret: user.LarkWebhookSecret, + DingWebhookURL: user.DingWebhookURL, + DingWebhookSecret: user.DingWebhookSecret, + } + channel.TokenStoreUpdateUser(&cleanUser, originUser) + if user.Password == "$I_LOVE_U" { user.Password = "" // rollback to what it should be cleanUser.Password = "" @@ -428,6 +451,7 @@ func DeleteUser(c *gin.Context) { }) return } + channel.TokenStoreRemoveUser(originUser) err = model.DeleteUserById(id) if err != nil { c.JSON(http.StatusOK, gin.H{ @@ -440,6 +464,9 @@ func DeleteUser(c *gin.Context) { func DeleteSelf(c *gin.Context) { id := c.GetInt("id") + user := model.User{Id: id} + user.FillUserById() + channel.TokenStoreRemoveUser(&user) err := model.DeleteUserById(id) if err != nil { c.JSON(http.StatusOK, gin.H{ diff --git a/model/user.go b/model/user.go index ef67abd..c84136a 100644 --- a/model/user.go +++ b/model/user.go @@ -71,8 +71,7 @@ func GetUserById(id int, selectAll bool) (*User, error) { func DeleteUserById(id int) (err error) { user := User{Id: id} - err = DB.Delete(&user).Error - return err + return user.Delete() } func (user *User) Insert() error { @@ -100,8 +99,7 @@ func (user *User) Update(updatePassword bool) error { } func (user *User) Delete() error { - var err error - err = DB.Delete(user).Error + err := DB.Delete(user).Error return err }