Download avatar from URL and set it with user_service.UploadAvatar

This commit is contained in:
Anthony Wang 2022-08-15 12:00:14 -05:00
parent d945e6ac72
commit 6b73c097ed
No known key found for this signature in database
GPG key ID: BC96B00AEC5F2D76
5 changed files with 31 additions and 13 deletions

View file

@ -2273,7 +2273,7 @@ ROUTER = console
;SHARE_USER_STATISTICS = true ;SHARE_USER_STATISTICS = true
;; ;;
;; Maximum federation request and response size (MB) ;; Maximum federation request and response size (MB)
;MAX_SIZE = 4 ;MAX_SIZE = 8
;; ;;
;; WARNING: Changing the settings below can break federation. ;; WARNING: Changing the settings below can break federation.
;; ;;

View file

@ -98,6 +98,15 @@ func (u *User) AvatarLink() string {
return link return link
} }
// AvatarFullLinkWithSize returns the full avatar link with size and http host
func (u *User) AvatarFullLinkWithSize(size int) string {
link := u.AvatarLinkWithSize(size)
if !strings.HasPrefix(link, "//") && !strings.Contains(link, "://") {
return setting.AppURL + strings.TrimPrefix(link, setting.AppSubURL+"/")
}
return link
}
// IsUploadAvatarChanged returns true if the current user's avatar would be changed with the provided data // IsUploadAvatarChanged returns true if the current user's avatar would be changed with the provided data
func (u *User) IsUploadAvatarChanged(data []byte) bool { func (u *User) IsUploadAvatarChanged(data []byte) bool {
if !u.UseCustomAvatar || len(u.Avatar) == 0 { if !u.UseCustomAvatar || len(u.Avatar) == 0 {

View file

@ -12,6 +12,7 @@ import (
"code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/models/auth"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
user_service "code.gitea.io/gitea/services/user"
ap "github.com/go-ap/activitypub" ap "github.com/go-ap/activitypub"
) )
@ -39,15 +40,6 @@ func FederatedUserNew(ctx context.Context, person *ap.Person) error {
email = strings.ReplaceAll(name, "@", "+") + "@" + setting.Service.NoReplyAddress email = strings.ReplaceAll(name, "@", "+") + "@" + setting.Service.NoReplyAddress
} }
var avatar string
if person.Icon != nil {
icon := person.Icon.(*ap.Image)
// Currently doesn't work
avatar = icon.URL.GetLink().String()
} else {
avatar = ""
}
if person.PublicKey.PublicKeyPem == "" { if person.PublicKey.PublicKeyPem == "" {
return errors.New("person public key not found") return errors.New("person public key not found")
} }
@ -56,7 +48,6 @@ func FederatedUserNew(ctx context.Context, person *ap.Person) error {
Name: name, Name: name,
FullName: person.Name.String(), // May not exist!! FullName: person.Name.String(), // May not exist!!
Email: email, Email: email,
Avatar: avatar,
LoginType: auth.Federated, LoginType: auth.Federated,
LoginName: person.GetLink().String(), LoginName: person.GetLink().String(),
} }
@ -65,6 +56,24 @@ func FederatedUserNew(ctx context.Context, person *ap.Person) error {
return err return err
} }
if person.Icon != nil {
icon := person.Icon.(*ap.Image)
iconURL, err := icon.URL.GetLink().URL()
if err != nil {
return err
}
body, err := Fetch(iconURL)
if err != nil {
return err
}
err = user_service.UploadAvatar(user, body)
if err != nil {
return err
}
}
err = user_model.SetUserSetting(user.ID, user_model.UserActivityPubPrivPem, "") err = user_model.SetUserSetting(user.ID, user_model.UserActivityPubPrivPem, "")
if err != nil { if err != nil {
return err return err

View file

@ -23,7 +23,7 @@ var (
}{ }{
Enabled: false, Enabled: false,
ShareUserStatistics: true, ShareUserStatistics: true,
MaxSize: 4, MaxSize: 8,
Algorithms: []string{"rsa-sha256", "rsa-sha512", "ed25519"}, Algorithms: []string{"rsa-sha256", "rsa-sha512", "ed25519"},
DigestAlgorithm: "SHA-256", DigestAlgorithm: "SHA-256",
GetHeaders: []string{"(request-target)", "Date"}, GetHeaders: []string{"(request-target)", "Date"},

View file

@ -63,7 +63,7 @@ func Person(ctx *context.APIContext) {
person.Icon = ap.Image{ person.Icon = ap.Image{
Type: ap.ImageType, Type: ap.ImageType,
MediaType: "image/png", MediaType: "image/png",
URL: ap.IRI(ctx.ContextUser.AvatarLink()), URL: ap.IRI(ctx.ContextUser.AvatarFullLinkWithSize(2048)),
} }
person.Inbox = ap.IRI(link + "/inbox") person.Inbox = ap.IRI(link + "/inbox")