summaryrefslogtreecommitdiff
path: root/internal/processing
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2023-05-09 12:16:10 +0200
committerLibravatar GitHub <noreply@github.com>2023-05-09 11:16:10 +0100
commit0e29f1f5bb68a48d9b837d7f4e0a16370734955b (patch)
treef08d203ec8ca8aeea728e5251b1dc3956524b4f4 /internal/processing
parent[chore/performance] Make sender multiplier configurable (#1750) (diff)
downloadgotosocial-0e29f1f5bb68a48d9b837d7f4e0a16370734955b.tar.xz
[feature] Enable federation in/out of profile PropertyValue fields (#1722)
Co-authored-by: kim <grufwub@gmail.com> Co-authored-by: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>
Diffstat (limited to 'internal/processing')
-rw-r--r--internal/processing/account/get.go2
-rw-r--r--internal/processing/account/update.go178
-rw-r--r--internal/processing/account/update_test.go80
-rw-r--r--internal/processing/fedi/collections.go11
-rw-r--r--internal/processing/fedi/common.go2
-rw-r--r--internal/processing/fedi/emoji.go4
-rw-r--r--internal/processing/fedi/status.go10
-rw-r--r--internal/processing/fedi/user.go6
-rw-r--r--internal/processing/fromfederator.go36
-rw-r--r--internal/processing/search.go4
-rw-r--r--internal/processing/util.go1
11 files changed, 248 insertions, 86 deletions
diff --git a/internal/processing/account/get.go b/internal/processing/account/get.go
index d0ea96ca2..c7d271b0a 100644
--- a/internal/processing/account/get.go
+++ b/internal/processing/account/get.go
@@ -96,7 +96,7 @@ func (p *Processor) getFor(ctx context.Context, requestingAccount *gtsmodel.Acco
}
a, err := p.federator.GetAccountByURI(
- gtscontext.SetFastFail(ctx), requestingAccount.Username, targetAccountURI, true,
+ gtscontext.SetFastFail(ctx), requestingAccount.Username, targetAccountURI,
)
if err == nil {
targetAccount = a
diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go
index e88aba637..0baeebb6a 100644
--- a/internal/processing/account/update.go
+++ b/internal/processing/account/update.go
@@ -36,6 +36,14 @@ import (
"github.com/superseriousbusiness/gotosocial/internal/validate"
)
+func (p *Processor) selectNoteFormatter(contentType string) text.FormatFunc {
+ if contentType == "text/markdown" {
+ return p.formatter.FromMarkdown
+ }
+
+ return p.formatter.FromPlain
+}
+
// Update processes the update of an account with the given form.
func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form *apimodel.UpdateCredentialsRequest) (*apimodel.Account, gtserror.WithCode) {
if form.Discoverable != nil {
@@ -46,56 +54,144 @@ func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form
account.Bot = form.Bot
}
- reparseEmojis := false
+ // Via the process of updating the account,
+ // it is possible that the emojis used by
+ // that account in note/display name/fields
+ // may change; we need to keep track of this.
+ var emojisChanged bool
if form.DisplayName != nil {
- if err := validate.DisplayName(*form.DisplayName); err != nil {
- return nil, gtserror.NewErrorBadRequest(err)
+ displayName := *form.DisplayName
+ if err := validate.DisplayName(displayName); err != nil {
+ return nil, gtserror.NewErrorBadRequest(err, err.Error())
}
- account.DisplayName = text.SanitizePlaintext(*form.DisplayName)
- reparseEmojis = true
+
+ // Parse new display name (always from plaintext).
+ account.DisplayName = text.SanitizePlaintext(displayName)
+
+ // If display name has changed, account emojis may have also changed.
+ emojisChanged = true
}
if form.Note != nil {
- if err := validate.Note(*form.Note); err != nil {
- return nil, gtserror.NewErrorBadRequest(err)
+ note := *form.Note
+ if err := validate.Note(note); err != nil {
+ return nil, gtserror.NewErrorBadRequest(err, err.Error())
}
- // Set the raw note before processing
- account.NoteRaw = *form.Note
- reparseEmojis = true
+ // Store raw version of the note for now,
+ // we'll process the proper version later.
+ account.NoteRaw = note
+
+ // If note has changed, account emojis may have also changed.
+ emojisChanged = true
}
- if reparseEmojis {
- // If either DisplayName or Note changed, reparse both, because we
- // can't otherwise tell which one each emoji belongs to.
- // Deduplicate emojis between the two fields.
+ if form.FieldsAttributes != nil {
+ var (
+ fieldsAttributes = *form.FieldsAttributes
+ fieldsLen = len(fieldsAttributes)
+ fieldsRaw = make([]*gtsmodel.Field, 0, fieldsLen)
+ )
+
+ for _, updateField := range fieldsAttributes {
+ if updateField.Name == nil || updateField.Value == nil {
+ continue
+ }
+
+ var (
+ name string = *updateField.Name
+ value string = *updateField.Value
+ )
+
+ if name == "" || value == "" {
+ continue
+ }
+
+ // Sanitize raw field values.
+ fieldRaw := &gtsmodel.Field{
+ Name: text.SanitizePlaintext(name),
+ Value: text.SanitizePlaintext(value),
+ }
+ fieldsRaw = append(fieldsRaw, fieldRaw)
+ }
+
+ // Check length of parsed raw fields.
+ if err := validate.ProfileFields(fieldsRaw); err != nil {
+ return nil, gtserror.NewErrorBadRequest(err, err.Error())
+ }
+
+ // OK, new raw fields are valid.
+ account.FieldsRaw = fieldsRaw
+ account.Fields = make([]*gtsmodel.Field, 0, fieldsLen) // process these in a sec
+
+ // If fields have changed, account emojis may also have changed.
+ emojisChanged = true
+ }
+
+ if emojisChanged {
+ // Use map to deduplicate emojis by their ID.
emojis := make(map[string]*gtsmodel.Emoji)
- formatResult := p.formatter.FromPlainEmojiOnly(ctx, p.parseMention, account.ID, "", account.DisplayName)
- for _, emoji := range formatResult.Emojis {
+
+ // Retrieve display name emojis.
+ for _, emoji := range p.formatter.FromPlainEmojiOnly(
+ ctx,
+ p.parseMention,
+ account.ID,
+ "",
+ account.DisplayName,
+ ).Emojis {
emojis[emoji.ID] = emoji
}
- // Process note to generate a valid HTML representation
- var f text.FormatFunc
- if account.StatusContentType == "text/markdown" {
- f = p.formatter.FromMarkdown
- } else {
- f = p.formatter.FromPlain
- }
- formatted := f(ctx, p.parseMention, account.ID, "", account.NoteRaw)
+ // Format + set note according to user prefs.
+ f := p.selectNoteFormatter(account.StatusContentType)
+ formatNoteResult := f(ctx, p.parseMention, account.ID, "", account.NoteRaw)
+ account.Note = formatNoteResult.HTML
- // Set updated HTML-ified note
- account.Note = formatted.HTML
- for _, emoji := range formatted.Emojis {
+ // Retrieve note emojis.
+ for _, emoji := range formatNoteResult.Emojis {
emojis[emoji.ID] = emoji
}
- account.Emojis = []*gtsmodel.Emoji{}
- account.EmojiIDs = []string{}
- for eid, emoji := range emojis {
+ // Process the raw fields we stored earlier.
+ for _, fieldRaw := range account.FieldsRaw {
+ field := &gtsmodel.Field{}
+
+ // Name stays plain, but we still need to
+ // see if there are any emojis set in it.
+ field.Name = fieldRaw.Name
+ for _, emoji := range p.formatter.FromPlainEmojiOnly(
+ ctx,
+ p.parseMention,
+ account.ID,
+ "",
+ fieldRaw.Name,
+ ).Emojis {
+ emojis[emoji.ID] = emoji
+ }
+
+ // Value can be HTML, but we don't want
+ // to wrap the result in <p> tags.
+ fieldFormatValueResult := p.formatter.FromPlainNoParagraph(ctx, p.parseMention, account.ID, "", fieldRaw.Value)
+ field.Value = fieldFormatValueResult.HTML
+
+ // Retrieve field emojis.
+ for _, emoji := range fieldFormatValueResult.Emojis {
+ emojis[emoji.ID] = emoji
+ }
+
+ // We're done, append the shiny new field.
+ account.Fields = append(account.Fields, field)
+ }
+
+ emojisCount := len(emojis)
+ account.Emojis = make([]*gtsmodel.Emoji, 0, emojisCount)
+ account.EmojiIDs = make([]string, 0, emojisCount)
+
+ for id, emoji := range emojis {
account.Emojis = append(account.Emojis, emoji)
- account.EmojiIDs = append(account.EmojiIDs, eid)
+ account.EmojiIDs = append(account.EmojiIDs, id)
}
}
@@ -164,26 +260,6 @@ func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form
account.EnableRSS = form.EnableRSS
}
- if form.FieldsAttributes != nil && len(*form.FieldsAttributes) != 0 {
- if err := validate.ProfileFieldsCount(*form.FieldsAttributes); err != nil {
- return nil, gtserror.NewErrorBadRequest(err)
- }
-
- account.Fields = make([]gtsmodel.Field, 0) // reset fields
- for _, f := range *form.FieldsAttributes {
- if f.Name != nil && f.Value != nil {
- if *f.Name != "" && *f.Value != "" {
- field := gtsmodel.Field{}
-
- field.Name = validate.ProfileField(f.Name)
- field.Value = validate.ProfileField(f.Value)
-
- account.Fields = append(account.Fields, field)
- }
- }
- }
- }
-
err := p.state.DB.UpdateAccount(ctx, account)
if err != nil {
return nil, gtserror.NewErrorInternalError(fmt.Errorf("could not update account %s: %s", account.ID, err))
diff --git a/internal/processing/account/update_test.go b/internal/processing/account/update_test.go
index b8c245657..03a3d8703 100644
--- a/internal/processing/account/update_test.go
+++ b/internal/processing/account/update_test.go
@@ -148,6 +148,86 @@ func (suite *AccountUpdateTestSuite) TestAccountUpdateWithMarkdownNote() {
suite.Equal(expectedNote, dbAccount.Note)
}
+func (suite *AccountUpdateTestSuite) TestAccountUpdateWithFields() {
+ testAccount := suite.testAccounts["local_account_1"]
+
+ updateFields := []apimodel.UpdateField{
+ {
+ Name: func() *string { s := "favourite emoji"; return &s }(),
+ Value: func() *string { s := ":rainbow:"; return &s }(),
+ },
+ {
+ Name: func() *string { s := "my website"; return &s }(),
+ Value: func() *string { s := "https://example.org"; return &s }(),
+ },
+ }
+
+ form := &apimodel.UpdateCredentialsRequest{
+ FieldsAttributes: &updateFields,
+ }
+
+ // should get no error from the update function, and an api model account returned
+ apiAccount, errWithCode := suite.accountProcessor.Update(context.Background(), testAccount, form)
+
+ // reset test account to avoid breaking other tests
+ testAccount.StatusContentType = "text/plain"
+ suite.NoError(errWithCode)
+ suite.NotNil(apiAccount)
+ suite.EqualValues([]apimodel.Field{
+ {
+ Name: "favourite emoji",
+ Value: ":rainbow:",
+ VerifiedAt: (*string)(nil),
+ },
+ {
+ Name: "my website",
+ Value: "<a href=\"https://example.org\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">https://example.org</a>",
+ VerifiedAt: (*string)(nil),
+ },
+ }, apiAccount.Fields)
+ suite.EqualValues([]apimodel.Field{
+ {
+ Name: "favourite emoji",
+ Value: ":rainbow:",
+ VerifiedAt: (*string)(nil),
+ },
+ {
+ Name: "my website",
+ Value: "https://example.org",
+ VerifiedAt: (*string)(nil),
+ },
+ }, apiAccount.Source.Fields)
+ suite.EqualValues([]apimodel.Emoji{
+ {
+ Shortcode: "rainbow",
+ URL: "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png",
+ StaticURL: "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01F8MH9H8E4VG3KDYJR9EGPXCQ.png",
+ VisibleInPicker: true,
+ Category: "reactions",
+ },
+ }, apiAccount.Emojis)
+
+ // we should have an update in the client api channel
+ msg := <-suite.fromClientAPIChan
+ suite.Equal(ap.ActivityUpdate, msg.APActivityType)
+ suite.Equal(ap.ObjectProfile, msg.APObjectType)
+ suite.NotNil(msg.OriginAccount)
+ suite.Equal(testAccount.ID, msg.OriginAccount.ID)
+ suite.Nil(msg.TargetAccount)
+
+ // fields should be updated in the database as well
+ dbAccount, err := suite.db.GetAccountByID(context.Background(), testAccount.ID)
+ suite.NoError(err)
+ suite.Equal("favourite emoji", dbAccount.Fields[0].Name)
+ suite.Equal(":rainbow:", dbAccount.Fields[0].Value)
+ suite.Equal("my website", dbAccount.Fields[1].Name)
+ suite.Equal("<a href=\"https://example.org\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">https://example.org</a>", dbAccount.Fields[1].Value)
+ suite.Equal("favourite emoji", dbAccount.FieldsRaw[0].Name)
+ suite.Equal(":rainbow:", dbAccount.FieldsRaw[0].Value)
+ suite.Equal("my website", dbAccount.FieldsRaw[1].Name)
+ suite.Equal("https://example.org", dbAccount.FieldsRaw[1].Value)
+}
+
func TestAccountUpdateTestSuite(t *testing.T) {
suite.Run(t, new(AccountUpdateTestSuite))
}
diff --git a/internal/processing/fedi/collections.go b/internal/processing/fedi/collections.go
index 00367b65d..a56b001b7 100644
--- a/internal/processing/fedi/collections.go
+++ b/internal/processing/fedi/collections.go
@@ -24,7 +24,6 @@ import (
"net/http"
"net/url"
- "github.com/superseriousbusiness/activity/streams"
"github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/db"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
@@ -74,7 +73,7 @@ func (p *Processor) OutboxGet(ctx context.Context, requestedUsername string, pag
return nil, gtserror.NewErrorInternalError(err)
}
- data, err = streams.Serialize(collection)
+ data, err = ap.Serialize(collection)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
@@ -93,7 +92,7 @@ func (p *Processor) OutboxGet(ctx context.Context, requestedUsername string, pag
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
- data, err = streams.Serialize(outboxPage)
+ data, err = ap.Serialize(outboxPage)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
@@ -119,7 +118,7 @@ func (p *Processor) FollowersGet(ctx context.Context, requestedUsername string)
return nil, gtserror.NewErrorInternalError(fmt.Errorf("error fetching followers for uri %s: %s", requestedAccountURI.String(), err))
}
- data, err := streams.Serialize(requestedFollowers)
+ data, err := ap.Serialize(requestedFollowers)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
@@ -145,7 +144,7 @@ func (p *Processor) FollowingGet(ctx context.Context, requestedUsername string)
return nil, gtserror.NewErrorInternalError(fmt.Errorf("error fetching following for uri %s: %s", requestedAccountURI.String(), err))
}
- data, err := streams.Serialize(requestedFollowing)
+ data, err := ap.Serialize(requestedFollowing)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
@@ -173,7 +172,7 @@ func (p *Processor) FeaturedCollectionGet(ctx context.Context, requestedUsername
return nil, gtserror.NewErrorInternalError(err)
}
- data, err := ap.SerializeOrderedCollection(collection)
+ data, err := ap.Serialize(collection)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
diff --git a/internal/processing/fedi/common.go b/internal/processing/fedi/common.go
index 3fade397b..093a9d761 100644
--- a/internal/processing/fedi/common.go
+++ b/internal/processing/fedi/common.go
@@ -40,7 +40,7 @@ func (p *Processor) authenticate(ctx context.Context, requestedUsername string)
return
}
- if requestingAccount, err = p.federator.GetAccountByURI(gtscontext.SetFastFail(ctx), requestedUsername, requestingAccountURI, false); err != nil {
+ if requestingAccount, err = p.federator.GetAccountByURI(gtscontext.SetFastFail(ctx), requestedUsername, requestingAccountURI); err != nil {
errWithCode = gtserror.NewErrorUnauthorized(err)
return
}
diff --git a/internal/processing/fedi/emoji.go b/internal/processing/fedi/emoji.go
index d1a035668..ea7cb6082 100644
--- a/internal/processing/fedi/emoji.go
+++ b/internal/processing/fedi/emoji.go
@@ -21,7 +21,7 @@ import (
"context"
"fmt"
- "github.com/superseriousbusiness/activity/streams"
+ "github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
)
@@ -49,7 +49,7 @@ func (p *Processor) EmojiGet(ctx context.Context, requestedEmojiID string) (inte
return nil, gtserror.NewErrorInternalError(fmt.Errorf("error converting gtsmodel emoji with id %s to ap emoji: %s", requestedEmojiID, err))
}
- data, err := streams.Serialize(apEmoji)
+ data, err := ap.Serialize(apEmoji)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
diff --git a/internal/processing/fedi/status.go b/internal/processing/fedi/status.go
index 072ff6aaf..a9b3e1eee 100644
--- a/internal/processing/fedi/status.go
+++ b/internal/processing/fedi/status.go
@@ -22,7 +22,7 @@ import (
"fmt"
"net/url"
- "github.com/superseriousbusiness/activity/streams"
+ "github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
)
@@ -57,7 +57,7 @@ func (p *Processor) StatusGet(ctx context.Context, requestedUsername string, req
return nil, gtserror.NewErrorInternalError(err)
}
- data, err := streams.Serialize(asStatus)
+ data, err := ap.Serialize(asStatus)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
@@ -105,7 +105,7 @@ func (p *Processor) StatusRepliesGet(ctx context.Context, requestedUsername stri
return nil, gtserror.NewErrorInternalError(err)
}
- data, err = streams.Serialize(collection)
+ data, err = ap.Serialize(collection)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
@@ -117,7 +117,7 @@ func (p *Processor) StatusRepliesGet(ctx context.Context, requestedUsername stri
return nil, gtserror.NewErrorInternalError(err)
}
// but only return the first page
- data, err = streams.Serialize(collection.GetActivityStreamsFirst().GetActivityStreamsCollectionPage())
+ data, err = ap.Serialize(collection.GetActivityStreamsFirst().GetActivityStreamsCollectionPage())
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
@@ -166,7 +166,7 @@ func (p *Processor) StatusRepliesGet(ctx context.Context, requestedUsername stri
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
- data, err = streams.Serialize(repliesPage)
+ data, err = ap.Serialize(repliesPage)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
diff --git a/internal/processing/fedi/user.go b/internal/processing/fedi/user.go
index 28dc3c857..b78f6de9d 100644
--- a/internal/processing/fedi/user.go
+++ b/internal/processing/fedi/user.go
@@ -22,8 +22,8 @@ import (
"fmt"
"net/url"
- "github.com/superseriousbusiness/activity/streams"
"github.com/superseriousbusiness/activity/streams/vocab"
+ "github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/gtscontext"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/uris"
@@ -56,7 +56,7 @@ func (p *Processor) UserGet(ctx context.Context, requestedUsername string, reque
// if we're not already handshaking/dereferencing a remote account, dereference it now
if !p.federator.Handshaking(requestedUsername, requestingAccountURI) {
requestingAccount, err := p.federator.GetAccountByURI(
- gtscontext.SetFastFail(ctx), requestedUsername, requestingAccountURI, false,
+ gtscontext.SetFastFail(ctx), requestedUsername, requestingAccountURI,
)
if err != nil {
return nil, gtserror.NewErrorUnauthorized(err)
@@ -78,7 +78,7 @@ func (p *Processor) UserGet(ctx context.Context, requestedUsername string, reque
}
}
- data, err := streams.Serialize(requestedPerson)
+ data, err := ap.Serialize(requestedPerson)
if err != nil {
return nil, gtserror.NewErrorInternalError(err)
}
diff --git a/internal/processing/fromfederator.go b/internal/processing/fromfederator.go
index 929ef824f..82e08060c 100644
--- a/internal/processing/fromfederator.go
+++ b/internal/processing/fromfederator.go
@@ -145,7 +145,7 @@ func (p *Processor) processCreateStatusFromFederator(ctx context.Context, federa
status.Account = a
}
- // do a BLOCKING get of the remote account to make sure the avi and header are cached
+ // Get the remote account to make sure the avi and header are cached.
if status.Account.Domain != "" {
remoteAccountID, err := url.Parse(status.Account.URI)
if err != nil {
@@ -155,7 +155,6 @@ func (p *Processor) processCreateStatusFromFederator(ctx context.Context, federa
a, err := p.federator.GetAccountByURI(ctx,
federatorMsg.ReceivingAccount.Username,
remoteAccountID,
- true,
)
if err != nil {
return err
@@ -187,7 +186,7 @@ func (p *Processor) processCreateFaveFromFederator(ctx context.Context, federato
incomingFave.Account = a
}
- // do a BLOCKING get of the remote account to make sure the avi and header are cached
+ // Get the remote account to make sure the avi and header are cached.
if incomingFave.Account.Domain != "" {
remoteAccountID, err := url.Parse(incomingFave.Account.URI)
if err != nil {
@@ -197,7 +196,6 @@ func (p *Processor) processCreateFaveFromFederator(ctx context.Context, federato
a, err := p.federator.GetAccountByURI(ctx,
federatorMsg.ReceivingAccount.Username,
remoteAccountID,
- true,
)
if err != nil {
return err
@@ -229,7 +227,7 @@ func (p *Processor) processCreateFollowRequestFromFederator(ctx context.Context,
followRequest.Account = a
}
- // do a BLOCKING get of the remote account to make sure the avi and header are cached
+ // Get the remote account to make sure the avi and header are cached.
if followRequest.Account.Domain != "" {
remoteAccountID, err := url.Parse(followRequest.Account.URI)
if err != nil {
@@ -239,7 +237,6 @@ func (p *Processor) processCreateFollowRequestFromFederator(ctx context.Context,
a, err := p.federator.GetAccountByURI(ctx,
federatorMsg.ReceivingAccount.Username,
remoteAccountID,
- true,
)
if err != nil {
return err
@@ -290,7 +287,7 @@ func (p *Processor) processCreateAnnounceFromFederator(ctx context.Context, fede
incomingAnnounce.Account = a
}
- // do a BLOCKING get of the remote account to make sure the avi and header are cached
+ // Get the remote account to make sure the avi and header are cached.
if incomingAnnounce.Account.Domain != "" {
remoteAccountID, err := url.Parse(incomingAnnounce.Account.URI)
if err != nil {
@@ -300,7 +297,6 @@ func (p *Processor) processCreateAnnounceFromFederator(ctx context.Context, fede
a, err := p.federator.GetAccountByURI(ctx,
federatorMsg.ReceivingAccount.Username,
remoteAccountID,
- true,
)
if err != nil {
return err
@@ -370,16 +366,28 @@ func (p *Processor) processCreateFlagFromFederator(ctx context.Context, federato
func (p *Processor) processUpdateAccountFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error {
incomingAccount, ok := federatorMsg.GTSModel.(*gtsmodel.Account)
if !ok {
- return errors.New("profile was not parseable as *gtsmodel.Account")
+ return errors.New("*gtsmodel.Account was not parseable on update account message")
}
- // Call UpdateAccount with force to reflect that
- // we want to fetch new bio, avatar, header, etc.
- if _, err := p.federator.UpdateAccount(ctx,
+ // Because this was an Update, the new AP Object should be set on the message.
+ incomingAccountable, ok := federatorMsg.APObjectModel.(ap.Accountable)
+ if !ok {
+ return errors.New("Accountable was not parseable on update account message")
+ }
+
+ // Call RefreshAccount to fetch up-to-date bio, avatar, header, etc.
+ updatedAccount, err := p.federator.RefreshAccount(
+ ctx,
federatorMsg.ReceivingAccount.Username,
+ incomingAccountable,
incomingAccount,
- true,
- ); err != nil {
+ )
+ if err != nil {
+ return fmt.Errorf("error enriching updated account from federator: %s", err)
+ }
+
+ // RefreshAccount doesn't make DB update calls, so do that here.
+ if err := p.state.DB.UpdateAccount(ctx, updatedAccount); err != nil {
return fmt.Errorf("error enriching updated account from federator: %s", err)
}
diff --git a/internal/processing/search.go b/internal/processing/search.go
index 624537b6a..c8dc58320 100644
--- a/internal/processing/search.go
+++ b/internal/processing/search.go
@@ -270,7 +270,7 @@ func (p *Processor) searchAccountByURI(ctx context.Context, authed *oauth.Auth,
return p.federator.GetAccountByURI(
gtscontext.SetFastFail(ctx),
authed.Account.Username,
- uri, false,
+ uri,
)
}
@@ -297,6 +297,6 @@ func (p *Processor) searchAccountByUsernameDomain(ctx context.Context, authed *o
return p.federator.GetAccountByUsernameDomain(
gtscontext.SetFastFail(ctx),
authed.Account.Username,
- username, domain, false,
+ username, domain,
)
}
diff --git a/internal/processing/util.go b/internal/processing/util.go
index 967c03f9f..601d8c4de 100644
--- a/internal/processing/util.go
+++ b/internal/processing/util.go
@@ -62,7 +62,6 @@ func GetParseMentionFunc(dbConn db.DB, federator federation.Federator) gtsmodel.
requestingUsername,
username,
domain,
- false,
)
if err != nil {
return nil, fmt.Errorf("parseMentionFunc: error fetching account: %s", err)