| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |    GoToSocial | 
					
						
							| 
									
										
										
										
											2021-12-20 18:42:19 +01:00
										 |  |  |    Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |    it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |    the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |    (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |    GNU Affero General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |    along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 13:12:00 +02:00
										 |  |  | package processing | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 	"errors" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2022-01-24 13:12:17 +01:00
										 |  |  | 	"net/url" | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	"codeberg.org/gruf/go-kv" | 
					
						
							|  |  |  | 	"codeberg.org/gruf/go-logger/v2/level" | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/ap" | 
					
						
							| 
									
										
										
										
											2022-06-11 11:01:34 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/federation/dereferencing" | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/id" | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/log" | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/messages" | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | // ProcessFromFederator reads the APActivityType and APObjectType of an incoming message from the federator, | 
					
						
							|  |  |  | // and directs the message into the appropriate side effect handler function, or simply does nothing if there's | 
					
						
							|  |  |  | // no handler function defined for the combination of Activity and Object. | 
					
						
							| 
									
										
										
										
											2021-09-04 13:29:56 +02:00
										 |  |  | func (p *processor) ProcessFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	// Allocate new log fields slice | 
					
						
							|  |  |  | 	fields := make([]kv.Field, 3, 5) | 
					
						
							|  |  |  | 	fields[0] = kv.Field{"activityType", federatorMsg.APActivityType} | 
					
						
							|  |  |  | 	fields[1] = kv.Field{"objectType", federatorMsg.APObjectType} | 
					
						
							|  |  |  | 	fields[2] = kv.Field{"toAccount", federatorMsg.ReceivingAccount.Username} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if federatorMsg.APIri != nil { | 
					
						
							|  |  |  | 		// An IRI was supplied, append to log | 
					
						
							|  |  |  | 		fields = append(fields, kv.Field{ | 
					
						
							|  |  |  | 			"iri", federatorMsg.APIri, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if federatorMsg.GTSModel != nil && | 
					
						
							|  |  |  | 		log.Level() >= level.DEBUG { | 
					
						
							|  |  |  | 		// Append converted model to log | 
					
						
							|  |  |  | 		fields = append(fields, kv.Field{ | 
					
						
							|  |  |  | 			"model", federatorMsg.GTSModel, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Log this federated message | 
					
						
							|  |  |  | 	l := log.WithFields(fields...) | 
					
						
							|  |  |  | 	l.Info("processing from federator") | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-21 15:48:26 +02:00
										 |  |  | 	switch federatorMsg.APActivityType { | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 	case ap.ActivityCreate: | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		// CREATE SOMETHING | 
					
						
							| 
									
										
										
										
											2021-05-21 15:48:26 +02:00
										 |  |  | 		switch federatorMsg.APObjectType { | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 		case ap.ObjectNote: | 
					
						
							| 
									
										
										
										
											2021-05-21 15:48:26 +02:00
										 |  |  | 			// CREATE A STATUS | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processCreateStatusFromFederator(ctx, federatorMsg) | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 		case ap.ActivityLike: | 
					
						
							| 
									
										
										
										
											2021-05-27 16:06:24 +02:00
										 |  |  | 			// CREATE A FAVE | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processCreateFaveFromFederator(ctx, federatorMsg) | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 		case ap.ActivityFollow: | 
					
						
							| 
									
										
										
										
											2021-05-27 16:06:24 +02:00
										 |  |  | 			// CREATE A FOLLOW REQUEST | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processCreateFollowRequestFromFederator(ctx, federatorMsg) | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 		case ap.ActivityAnnounce: | 
					
						
							| 
									
										
										
										
											2021-05-28 19:57:04 +02:00
										 |  |  | 			// CREATE AN ANNOUNCE | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processCreateAnnounceFromFederator(ctx, federatorMsg) | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 		case ap.ActivityBlock: | 
					
						
							| 
									
										
										
										
											2021-07-11 16:22:21 +02:00
										 |  |  | 			// CREATE A BLOCK | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processCreateBlockFromFederator(ctx, federatorMsg) | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 	case ap.ActivityUpdate: | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		// UPDATE SOMETHING | 
					
						
							| 
									
										
										
										
											2021-11-22 08:46:19 +01:00
										 |  |  | 		if federatorMsg.APObjectType == ap.ObjectProfile { | 
					
						
							| 
									
										
										
										
											2021-05-21 15:48:26 +02:00
										 |  |  | 			// UPDATE AN ACCOUNT | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processUpdateAccountFromFederator(ctx, federatorMsg) | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 	case ap.ActivityDelete: | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		// DELETE SOMETHING | 
					
						
							| 
									
										
										
										
											2021-05-23 18:07:04 +02:00
										 |  |  | 		switch federatorMsg.APObjectType { | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 		case ap.ObjectNote: | 
					
						
							| 
									
										
										
										
											2021-05-23 18:07:04 +02:00
										 |  |  | 			// DELETE A STATUS | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processDeleteStatusFromFederator(ctx, federatorMsg) | 
					
						
							| 
									
										
										
										
											2021-08-31 15:59:12 +02:00
										 |  |  | 		case ap.ObjectProfile: | 
					
						
							| 
									
										
										
										
											2021-05-23 18:07:04 +02:00
										 |  |  | 			// DELETE A PROFILE/ACCOUNT | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 			return p.processDeleteAccountFromFederator(ctx, federatorMsg) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-30 10:56:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 	// not a combination we can/need to process | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // processCreateStatusFromFederator handles Activity Create and Object Note | 
					
						
							|  |  |  | func (p *processor) processCreateStatusFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							|  |  |  | 	// check for either an IRI that we still need to dereference, OR an already dereferenced | 
					
						
							|  |  |  | 	// and converted status pinned to the message. | 
					
						
							|  |  |  | 	var status *gtsmodel.Status | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if federatorMsg.GTSModel != nil { | 
					
						
							|  |  |  | 		// there's a gts model already pinned to the message, it should be a status | 
					
						
							|  |  |  | 		var ok bool | 
					
						
							|  |  |  | 		if status, ok = federatorMsg.GTSModel.(*gtsmodel.Status); !ok { | 
					
						
							|  |  |  | 			return errors.New("ProcessFromFederator: note was not parseable as *gtsmodel.Status") | 
					
						
							| 
									
										
										
										
											2021-05-23 18:07:04 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var err error | 
					
						
							|  |  |  | 		status, err = p.federator.EnrichRemoteStatus(ctx, federatorMsg.ReceivingAccount.Username, status, true) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		// no model pinned, we need to dereference based on the IRI | 
					
						
							|  |  |  | 		if federatorMsg.APIri == nil { | 
					
						
							|  |  |  | 			return errors.New("ProcessFromFederator: status was not pinned to federatorMsg, and neither was an IRI for us to dereference") | 
					
						
							| 
									
										
										
										
											2021-05-27 16:06:24 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		var err error | 
					
						
							| 
									
										
										
										
											2022-05-23 17:40:03 +02:00
										 |  |  | 		status, _, err = p.federator.GetRemoteStatus(ctx, federatorMsg.ReceivingAccount.Username, federatorMsg.APIri, false, false) | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 	// make sure the account is pinned | 
					
						
							|  |  |  | 	if status.Account == nil { | 
					
						
							|  |  |  | 		a, err := p.db.GetAccountByID(ctx, status.AccountID) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		status.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// do a BLOCKING get of 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 { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 11:01:34 +02:00
										 |  |  | 		a, err := p.federator.GetRemoteAccount(ctx, dereferencing.GetRemoteAccountParams{ | 
					
						
							|  |  |  | 			RequestingUsername: federatorMsg.ReceivingAccount.Username, | 
					
						
							|  |  |  | 			RemoteAccountID:    remoteAccountID, | 
					
						
							|  |  |  | 			Blocking:           true, | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		status.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 	if err := p.timelineStatus(ctx, status); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := p.notifyStatus(ctx, status); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // processCreateFaveFromFederator handles Activity Create and Object Like | 
					
						
							|  |  |  | func (p *processor) processCreateFaveFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							|  |  |  | 	incomingFave, ok := federatorMsg.GTSModel.(*gtsmodel.StatusFave) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return errors.New("like was not parseable as *gtsmodel.StatusFave") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 	// make sure the account is pinned | 
					
						
							|  |  |  | 	if incomingFave.Account == nil { | 
					
						
							|  |  |  | 		a, err := p.db.GetAccountByID(ctx, incomingFave.AccountID) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		incomingFave.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// do a BLOCKING get of 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 { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 11:01:34 +02:00
										 |  |  | 		a, err := p.federator.GetRemoteAccount(ctx, dereferencing.GetRemoteAccountParams{ | 
					
						
							|  |  |  | 			RequestingUsername: federatorMsg.ReceivingAccount.Username, | 
					
						
							|  |  |  | 			RemoteAccountID:    remoteAccountID, | 
					
						
							|  |  |  | 			Blocking:           true, | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		incomingFave.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 	if err := p.notifyFave(ctx, incomingFave); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // processCreateFollowRequestFromFederator handles Activity Create and Object Follow | 
					
						
							|  |  |  | func (p *processor) processCreateFollowRequestFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							|  |  |  | 	followRequest, ok := federatorMsg.GTSModel.(*gtsmodel.FollowRequest) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return errors.New("incomingFollowRequest was not parseable as *gtsmodel.FollowRequest") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 	// make sure the account is pinned | 
					
						
							|  |  |  | 	if followRequest.Account == nil { | 
					
						
							|  |  |  | 		a, err := p.db.GetAccountByID(ctx, followRequest.AccountID) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		followRequest.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// do a BLOCKING get of 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 { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 11:01:34 +02:00
										 |  |  | 		a, err := p.federator.GetRemoteAccount(ctx, dereferencing.GetRemoteAccountParams{ | 
					
						
							|  |  |  | 			RequestingUsername: federatorMsg.ReceivingAccount.Username, | 
					
						
							|  |  |  | 			RemoteAccountID:    remoteAccountID, | 
					
						
							|  |  |  | 			Blocking:           true, | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		followRequest.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 	if followRequest.TargetAccount == nil { | 
					
						
							|  |  |  | 		a, err := p.db.GetAccountByID(ctx, followRequest.TargetAccountID) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		followRequest.TargetAccount = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-15 12:35:05 +02:00
										 |  |  | 	if *followRequest.TargetAccount.Locked { | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		// if the account is locked just notify the follow request and nothing else | 
					
						
							|  |  |  | 		return p.notifyFollowRequest(ctx, followRequest) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// if the target account isn't locked, we should already accept the follow and notify about the new follower instead | 
					
						
							|  |  |  | 	follow, err := p.db.AcceptFollowRequest(ctx, followRequest.AccountID, followRequest.TargetAccountID) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-16 13:27:43 +02:00
										 |  |  | 	if err := p.federateAcceptFollowRequest(ctx, follow); err != nil { | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 	return p.notifyFollow(ctx, follow, followRequest.TargetAccount) | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // processCreateAnnounceFromFederator handles Activity Create and Object Announce | 
					
						
							|  |  |  | func (p *processor) processCreateAnnounceFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							|  |  |  | 	incomingAnnounce, ok := federatorMsg.GTSModel.(*gtsmodel.Status) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return errors.New("announce was not parseable as *gtsmodel.Status") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 	// make sure the account is pinned | 
					
						
							|  |  |  | 	if incomingAnnounce.Account == nil { | 
					
						
							|  |  |  | 		a, err := p.db.GetAccountByID(ctx, incomingAnnounce.AccountID) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		incomingAnnounce.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// do a BLOCKING get of 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 { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 11:01:34 +02:00
										 |  |  | 		a, err := p.federator.GetRemoteAccount(ctx, dereferencing.GetRemoteAccountParams{ | 
					
						
							|  |  |  | 			RequestingUsername: federatorMsg.ReceivingAccount.Username, | 
					
						
							|  |  |  | 			RemoteAccountID:    remoteAccountID, | 
					
						
							|  |  |  | 			Blocking:           true, | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2022-01-25 13:48:13 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		incomingAnnounce.Account = a | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 	if err := p.federator.DereferenceAnnounce(ctx, incomingAnnounce, federatorMsg.ReceivingAccount.Username); err != nil { | 
					
						
							|  |  |  | 		return fmt.Errorf("error dereferencing announce from federator: %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	incomingAnnounceID, err := id.NewULIDFromTime(incomingAnnounce.CreatedAt) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	incomingAnnounce.ID = incomingAnnounceID | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := p.db.PutStatus(ctx, incomingAnnounce); err != nil { | 
					
						
							|  |  |  | 		return fmt.Errorf("error adding dereferenced announce to the db: %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := p.timelineStatus(ctx, incomingAnnounce); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := p.notifyAnnounce(ctx, incomingAnnounce); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // processCreateBlockFromFederator handles Activity Create and Object Block | 
					
						
							|  |  |  | func (p *processor) processCreateBlockFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							|  |  |  | 	block, ok := federatorMsg.GTSModel.(*gtsmodel.Block) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return errors.New("block was not parseable as *gtsmodel.Block") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// remove any of the blocking account's statuses from the blocked account's timeline, and vice versa | 
					
						
							| 
									
										
										
										
											2022-02-05 12:47:38 +01:00
										 |  |  | 	if err := p.statusTimelines.WipeItemsFromAccountID(ctx, block.AccountID, block.TargetAccountID); err != nil { | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-02-05 12:47:38 +01:00
										 |  |  | 	if err := p.statusTimelines.WipeItemsFromAccountID(ctx, block.TargetAccountID, block.AccountID); err != nil { | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// TODO: same with notifications | 
					
						
							|  |  |  | 	// TODO: same with bookmarks | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // processUpdateAccountFromFederator handles Activity Update and Object Profile | 
					
						
							|  |  |  | 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") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-24 13:12:17 +01:00
										 |  |  | 	incomingAccountURL, err := url.Parse(incomingAccount.URI) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 11:01:34 +02:00
										 |  |  | 	if _, err := p.federator.GetRemoteAccount(ctx, dereferencing.GetRemoteAccountParams{ | 
					
						
							|  |  |  | 		RequestingUsername: federatorMsg.ReceivingAccount.Username, | 
					
						
							|  |  |  | 		RemoteAccountID:    incomingAccountURL, | 
					
						
							|  |  |  | 		Blocking:           true, | 
					
						
							|  |  |  | 	}); err != nil { | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | 		return fmt.Errorf("error enriching updated account from federator: %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // processDeleteStatusFromFederator handles Activity Delete and Object Note | 
					
						
							|  |  |  | func (p *processor) processDeleteStatusFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							|  |  |  | 	statusToDelete, ok := federatorMsg.GTSModel.(*gtsmodel.Status) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return errors.New("note was not parseable as *gtsmodel.Status") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-24 17:17:40 +02:00
										 |  |  | 	// delete attachments from this status since this request | 
					
						
							|  |  |  | 	// comes from the federating API, and there's no way the | 
					
						
							|  |  |  | 	// poster can do a delete + redraft for it on our instance | 
					
						
							|  |  |  | 	deleteAttachments := true | 
					
						
							|  |  |  | 	return p.wipeStatus(ctx, statusToDelete, deleteAttachments) | 
					
						
							| 
									
										
										
										
											2021-10-10 12:39:25 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // processDeleteAccountFromFederator handles Activity Delete and Object Profile | 
					
						
							|  |  |  | func (p *processor) processDeleteAccountFromFederator(ctx context.Context, federatorMsg messages.FromFederator) error { | 
					
						
							|  |  |  | 	account, ok := federatorMsg.GTSModel.(*gtsmodel.Account) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return errors.New("account delete was not parseable as *gtsmodel.Account") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return p.accountProcessor.Delete(ctx, account, account.ID) | 
					
						
							|  |  |  | } |