diff options
Diffstat (limited to 'internal/federation')
| -rw-r--r-- | internal/federation/dereferencing/account.go | 44 | ||||
| -rw-r--r-- | internal/federation/dereferencing/account_test.go | 44 |
2 files changed, 82 insertions, 6 deletions
diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 6c9afc665..effc22c44 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -807,12 +807,12 @@ func (d *Dereferencer) enrichAccount( latestAcc.UpdatedAt = now // Ensure the account's avatar media is populated, passing in existing to check for chages. - if err := d.fetchAccountAvatar(ctx, requestUser, account, latestAcc); err != nil { + if err := d.fetchAccountAvatar(ctx, requestUser, account, latestAcc, apubAcc); err != nil { log.Errorf(ctx, "error fetching remote avatar for account %s: %v", uri, err) } // Ensure the account's avatar media is populated, passing in existing to check for chages. - if err := d.fetchAccountHeader(ctx, requestUser, account, latestAcc); err != nil { + if err := d.fetchAccountHeader(ctx, requestUser, account, latestAcc, apubAcc); err != nil { log.Errorf(ctx, "error fetching remote header for account %s: %v", uri, err) } @@ -854,6 +854,7 @@ func (d *Dereferencer) fetchAccountAvatar( requestUser string, existingAcc *gtsmodel.Account, latestAcc *gtsmodel.Account, + apubAcc ap.Accountable, ) error { if latestAcc.AvatarRemoteURL == "" { // No avatar set on newest model, leave @@ -861,6 +862,8 @@ func (d *Dereferencer) fetchAccountAvatar( return nil } + avatarDescription := ap.ExtractIconDescription(apubAcc) + // Check for an existing stored media attachment // specifically with unchanged remote URL we can use. if existingAcc.AvatarMediaAttachmentID != "" && @@ -883,6 +886,18 @@ func (d *Dereferencer) fetchAccountAvatar( nil, ) + if existing.Description != avatarDescription { + existing.Description = avatarDescription + if err := d.state.DB.UpdateAttachment( + ctx, + existing, + "description", + ); err != nil { + err := gtserror.Newf("db error updating existing avatar description: %w", err) + return gtserror.NewErrorInternalError(err) + } + } + if err != nil { log.Errorf(ctx, "error updating existing attachment: %v", err) @@ -906,8 +921,9 @@ func (d *Dereferencer) fetchAccountAvatar( latestAcc.ID, latestAcc.AvatarRemoteURL, media.AdditionalMediaInfo{ - Avatar: util.Ptr(true), - RemoteURL: &latestAcc.AvatarRemoteURL, + Avatar: util.Ptr(true), + RemoteURL: &latestAcc.AvatarRemoteURL, + Description: &avatarDescription, }, ) if err != nil { @@ -931,6 +947,7 @@ func (d *Dereferencer) fetchAccountHeader( requestUser string, existingAcc *gtsmodel.Account, latestAcc *gtsmodel.Account, + apubAcc ap.Accountable, ) error { if latestAcc.HeaderRemoteURL == "" { // No header set on newest model, leave @@ -938,6 +955,8 @@ func (d *Dereferencer) fetchAccountHeader( return nil } + headerDescription := ap.ExtractImageDescription(apubAcc) + // Check for an existing stored media attachment // specifically with unchanged remote URL we can use. if existingAcc.HeaderMediaAttachmentID != "" && @@ -951,6 +970,18 @@ func (d *Dereferencer) fetchAccountHeader( return gtserror.Newf("error getting attachment %s: %w", existingAcc.HeaderMediaAttachmentID, err) } + if existing.Description != headerDescription { + existing.Description = headerDescription + if err := d.state.DB.UpdateAttachment( + ctx, + existing, + "description", + ); err != nil { + err := gtserror.Newf("db error updating existing header description: %w", err) + return gtserror.NewErrorInternalError(err) + } + } + if existing != nil { // Ensuring existing attachment is up-to-date // and any recaching is performed if required. @@ -983,8 +1014,9 @@ func (d *Dereferencer) fetchAccountHeader( latestAcc.ID, latestAcc.HeaderRemoteURL, media.AdditionalMediaInfo{ - Header: util.Ptr(true), - RemoteURL: &latestAcc.HeaderRemoteURL, + Header: util.Ptr(true), + RemoteURL: &latestAcc.HeaderRemoteURL, + Description: &headerDescription, }, ) if err != nil { diff --git a/internal/federation/dereferencing/account_test.go b/internal/federation/dereferencing/account_test.go index 518f3e89f..0cb23f18d 100644 --- a/internal/federation/dereferencing/account_test.go +++ b/internal/federation/dereferencing/account_test.go @@ -28,6 +28,7 @@ import ( "io" "net/http" "net/url" + "strings" "testing" "time" @@ -473,6 +474,49 @@ func (suite *AccountTestSuite) TestRefreshFederatedRemoteAccountWithKeyChange() suite.True(updatedAcc.PublicKey.Equal(fetchingAcc.PublicKey)) } +func (suite *AccountTestSuite) TestDereferenceRemoteAccountWithAvatarDescription() { + ctx, cncl := context.WithCancel(suite.T().Context()) + defer cncl() + + fetchingAcc := suite.testAccounts["local_account_1"] + remoteURI := "https://shrimpnet.example.org/users/shrimp" + description := "me scrolling fedi on a laptop, there's a monster ultra white and another fedi user on my right." + + // Fetch the remote account to load into the database. + remoteAcc, _, err := suite.dereferencer.GetAccountByURI(ctx, + fetchingAcc.Username, + testrig.URLMustParse(remoteURI), + false, + ) + suite.NoError(err) + suite.NotNil(remoteAcc) + + suite.Equal(remoteAcc.AvatarMediaAttachment.Description, description) + + remotePerson := suite.client.TestRemotePeople[remoteURI] + + description = strings.TrimSuffix(description, ".") + + icon := remotePerson.GetActivityStreamsIcon() + image := icon.Begin().GetActivityStreamsImage() + nameProp := streams.NewActivityStreamsNameProperty() + nameProp.AppendXMLSchemaString(description) + image.SetActivityStreamsName(nameProp) + icon.SetActivityStreamsImage(0, image) + remotePerson.SetActivityStreamsIcon(icon) + + updatedAcc, apAcc, err := suite.dereferencer.RefreshAccount(ctx, + fetchingAcc.Username, + remoteAcc, + remotePerson, + nil, + ) + + suite.NoError(err) + suite.NotNil(apAcc) + suite.Equal(updatedAcc.AvatarMediaAttachment.Description, description) +} + func TestAccountTestSuite(t *testing.T) { suite.Run(t, new(AccountTestSuite)) } |
