address activitypub notes to the streamer's follower collection (#4314)

* make a new function to generate appropriate to and cc apub objects

* use new addressing function to set "public" message addressing appropriately with the followers collection

* early return from sending federated message if federation is disabled

* cleanup old addressing code, apply new addressing mechanism to live notifications as well

* linter fix

* Update activitypub/outbox/outbox.go

---------

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
This commit is contained in:
mahmed2000
2025-05-07 17:35:12 -07:00
committed by GitHub
co-authored by Gabe Kangas
parent 6d97def04a
commit c9a69b281c
3 changed files with 43 additions and 11 deletions
+14
View File
@@ -31,6 +31,20 @@ func MakeNotePublic(note vocab.ActivityStreamsNote) vocab.ActivityStreamsNote {
return note
}
func MakeAddressingToFollowers(followers_iri *url.URL, public bool) (vocab.ActivityStreamsToProperty, vocab.ActivityStreamsCcProperty) {
to := streams.NewActivityStreamsToProperty()
cc := streams.NewActivityStreamsCcProperty()
if public {
public, _ := url.Parse(PUBLIC)
to.AppendIRI(public)
cc.AppendIRI(followers_iri)
} else {
to.AppendIRI(followers_iri)
}
return to, cc
}
// MakeNoteDirect sets the required properties to make this note seen as a
// direct message.
func MakeNoteDirect(note vocab.ActivityStreamsNote, toIRI *url.URL) vocab.ActivityStreamsNote {
+22 -11
View File
@@ -66,11 +66,11 @@ func SendLive() error {
activity, _, note, noteID := createBaseOutboundMessage(textContent)
// To the public if we're not treating ActivityPub as "private".
if !configRepository.GetFederationIsPrivate() {
note = apmodels.MakeNotePublic(note)
activity = apmodels.MakeActivityPublic(activity)
}
to, cc := getAddressingToFollowers()
note.SetActivityStreamsTo(to)
note.SetActivityStreamsCc(cc)
activity.SetActivityStreamsTo(to)
activity.SetActivityStreamsCc(cc)
note.SetActivityStreamsTag(tagProp)
@@ -153,8 +153,6 @@ func SendDirectMessageToAccount(textContent, account string) error {
// SendPublicMessage will send a public message to all followers.
func SendPublicMessage(textContent string) error {
configRepository := configrepository.Get()
originalContent := textContent
textContent = utils.RenderSimpleMarkdown(textContent)
@@ -177,10 +175,11 @@ func SendPublicMessage(textContent string) error {
activity, _, note, noteID := createBaseOutboundMessage(textContent)
note.SetActivityStreamsTag(tagProp)
if !configRepository.GetFederationIsPrivate() {
note = apmodels.MakeNotePublic(note)
activity = apmodels.MakeActivityPublic(activity)
}
to, cc := getAddressingToFollowers()
note.SetActivityStreamsTo(to)
note.SetActivityStreamsCc(cc)
activity.SetActivityStreamsTo(to)
activity.SetActivityStreamsCc(cc)
b, err := apmodels.Serialize(activity)
if err != nil {
@@ -199,6 +198,18 @@ func SendPublicMessage(textContent string) error {
return nil
}
// if public, cc the followers and to the Public uri, else private, address followers directly.
func getAddressingToFollowers() (vocab.ActivityStreamsToProperty, vocab.ActivityStreamsCcProperty) {
configRepository := configrepository.Get()
server_url := configRepository.GetServerURL()
followers_iri, _ := url.Parse(server_url)
username := configRepository.GetDefaultFederationUsername()
followers_iri = followers_iri.JoinPath("federation", "user", username, "followers")
return apmodels.MakeAddressingToFollowers(followers_iri, !configRepository.GetFederationIsPrivate())
}
// nolint: unparam
func createBaseOutboundMessage(textContent string) (vocab.ActivityStreamsCreate, string, vocab.ActivityStreamsNote, string) {
configRepository := configrepository.Get()
+7
View File
@@ -16,6 +16,13 @@ func SendFederatedMessage(w http.ResponseWriter, r *http.Request) {
return
}
configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
webutils.WriteSimpleResponse(w, false, "Federation is disabled")
return
}
configValue, success := getValueFromRequest(w, r)
if !success {
return