summaryrefslogtreecommitdiff
path: root/internal/federation
diff options
context:
space:
mode:
Diffstat (limited to 'internal/federation')
-rw-r--r--internal/federation/dereferencing/account.go44
-rw-r--r--internal/federation/dereferencing/account_test.go44
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))
}