You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@answer.apache.org by li...@apache.org on 2026/07/07 08:27:16 UTC
(answer) 02/04: Harden avatar cleanup ownership checks
This is an automated email from the ASF dual-hosted git repository.
LinkinStars pushed a commit to branch fix/2.0.2/user
in repository https://gitbox.apache.org/repos/asf/answer.git
commit 3f30215e716e78cbfc7787d288ff22cef300fed2
Author: LinkinStars <li...@foxmail.com>
AuthorDate: Tue Jul 7 14:33:21 2026 +0800
Harden avatar cleanup ownership checks
---
internal/service/content/user_service.go | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/internal/service/content/user_service.go b/internal/service/content/user_service.go
index d0ebe875..c1f800ff 100644
--- a/internal/service/content/user_service.go
+++ b/internal/service/content/user_service.go
@@ -360,7 +360,7 @@ func (us *UserService) UpdateInfo(ctx context.Context, req *schema.UpdateInfoReq
cond := us.formatUserInfoForUpdateInfo(oldUserInfo, req)
- us.cleanUpRemovedAvatar(ctx, oldUserInfo.Avatar, cond.Avatar)
+ us.cleanUpRemovedAvatar(ctx, req.UserID, oldUserInfo.Avatar, cond.Avatar)
err = us.userRepo.UpdateInfo(ctx, cond)
if err != nil {
@@ -407,6 +407,7 @@ func (us *UserService) validateAvatarInfo(
func (us *UserService) cleanUpRemovedAvatar(
ctx context.Context,
+ updatingUserID string,
oldAvatarJSON string,
newAvatarJSON string,
) {
@@ -434,6 +435,13 @@ func (us *UserService) cleanUpRemovedAvatar(
log.Warn("no file record found for old avatar url:", oldAvatar.Custom)
return
}
+ if fileRecord.UserID != updatingUserID || fileRecord.Source != string(plugin.UserAvatar) {
+ log.Warnf(
+ "refuse to clean avatar url %q: file record owner/source mismatch (owner=%s source=%s updating_user=%s)",
+ oldAvatar.Custom, fileRecord.UserID, fileRecord.Source, updatingUserID,
+ )
+ return
+ }
if err := us.fileRecordService.DeleteAndMoveFileRecord(ctx, fileRecord); err != nil {
log.Error(err)
}