You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mastodon/app/models
ThibG ca56527140
Add follower synchronization mechanism (#14510)
* Add support for followers synchronization on the receiving end

Check the `collectionSynchronization` attribute on `Create` and `Announce`
activities and synchronize followers from provided collection if possible.

* Add tests for followers synchronization on the receiving end

* Add support for follower synchronization on the sender's end

* Add tests for the sending end

* Switch from AS attributes to HTTP header

Replace the custom `collectionSynchronization` ActivityStreams attribute by
an HTTP header (`X-AS-Collection-Synchronization`) with the same syntax as
the `Signature` header and the following fields:
- `collectionId` to specify which collection to synchronize
- `digest` for the SHA256 hex-digest of the list of followers known on the
   receiving instance (where “receiving instance” is determined by accounts
   sharing the same host name for their ActivityPub actor `id`)
- `url` of a collection that should be fetched by the instance actor

Internally, move away from the webfinger-based `domain` attribute and use
account `uri` prefix to group accounts.

* Add environment variable to disable followers synchronization

Since the whole mechanism relies on some new preconditions that, in some
extremely rare cases, might not be met, add an environment variable
(DISABLE_FOLLOWERS_SYNCHRONIZATION) to disable the mechanism altogether and
avoid followers being incorrectly removed.

The current conditions are:
1. all managed accounts' actor `id` and inbox URL have the same URI scheme and
   netloc.
2. all accounts whose actor `id` or inbox URL share the same URI scheme and
   netloc as a managed account must be managed by the same Mastodon instance
   as well.

As far as Mastodon is concerned, breaking those preconditions require extensive
configuration changes in the reverse proxy and might also cause other issues.

Therefore, this environment variable provides a way out for people with highly
unusual configurations, and can be safely ignored for the overwhelming majority
of Mastodon administrators.

* Only set follower synchronization header on non-public statuses

This is to avoid unnecessary computations and allow Follow-related
activities to be handled by the usual codepath instead of going through
the synchronization mechanism (otherwise, any Follow/Undo/Accept activity
would trigger the synchronization mechanism even if processing the activity
itself would be enough to re-introduce synchronization)

* Change how ActivityPub::SynchronizeFollowersService handles follow requests

If the remote lists a local follower which we only know has sent a follow
request, consider the follow request as accepted instead of sending an Undo.

* Integrate review feeback

- rename X-AS-Collection-Synchronization to Collection-Synchronization
- various minor refactoring and code style changes

* Only select required fields when computing followers_hash

* Use actor URI rather than webfinger domain in synchronization endpoint

* Change hash computation to be a XOR of individual hashes

Makes it much easier to be memory-efficient, and avoid sorting discrepancy issues.

* Marginally improve followers_hash computation speed

* Further improve hash computation performances by using pluck_each
4 years ago
..
admin Change account suspensions to be reversible by default (#14726) 4 years ago
concerns Add follower synchronization mechanism (#14510) 4 years ago
form Add IP-based rules (#14963) 4 years ago
web Bump doorkeeper from 5.3.3 to 5.4.0 (#13733) 5 years ago
account.rb Add follower synchronization mechanism (#14510) 4 years ago
account_alias.rb Remove dependency on goldfinger gem (#14919) 4 years ago
account_conversation.rb allow pagination by min_id and max_id (#14776) 4 years ago
account_deletion_request.rb Change account suspensions to be reversible by default (#14726) 4 years ago
account_domain_block.rb Fix crash when saving invalid domain name (#11528) 5 years ago
account_filter.rb Add sorting by username, creation and last activity in moderation view (#13076) 5 years ago
account_identity_proof.rb Fix Keybase verification using wrong domain for remote accounts (#10547) 6 years ago
account_migration.rb Remove dependency on goldfinger gem (#14919) 4 years ago
account_moderation_note.rb
account_note.rb Add user notes on accounts (#14148) 5 years ago
account_pin.rb
account_stat.rb Fix account counters being overwritten by parallel writes (#12045) 5 years ago
account_tag_stat.rb Add profile directory (#9427) 6 years ago
account_warning.rb Add moderation warnings (#9519) 6 years ago
account_warning_preset.rb Add titles to warning presets in admin UI (#13252) 5 years ago
admin.rb
announcement.rb Change delivery failure tracking to work with hostnames instead of URLs (#13437) 5 years ago
announcement_filter.rb Add announcements (#12662) 5 years ago
announcement_mute.rb Add announcements (#12662) 5 years ago
announcement_reaction.rb Add announcements (#12662) 5 years ago
application_record.rb Fix records not being indexed sometimes (#12024) 5 years ago
backup.rb Add announcements (#12662) 5 years ago
block.rb
bookmark.rb Add announcements (#12662) 5 years ago
context.rb
conversation.rb Revert "Remove conversation URI (#11423)" (#11424) 6 years ago
conversation_mute.rb
custom_emoji.rb Add separate cache directory for non-local uploads (#12821) 5 years ago
custom_emoji_category.rb Add batch actions and categories to admin UI for custom emojis (#11793) 5 years ago
custom_emoji_filter.rb Various fixes and improvements (#12878) 5 years ago
custom_filter.rb Add “account timeline” filter category (#12918) 5 years ago
device.rb Add E2EE API (#13820) 5 years ago
domain_allow.rb Fix crash when saving invalid domain name (#11528) 5 years ago
domain_block.rb Fix admin page crashing when trying to block an invalid domain name (#13884) 5 years ago
email_domain_block.rb Add option to include resolved DNS records when blacklisting e-mail domains in admin UI (#13254) 5 years ago
encrypted_message.rb Change Redis#exists calls to Redis#exists? to avoid deprecation warning (#14191) 5 years ago
export.rb Export and import show_reblogs together with following list (#10495) 6 years ago
favourite.rb Fix records not being indexed sometimes (#12024) 5 years ago
featured_tag.rb Fix featured tags not finding the right tag on save (#11504) 6 years ago
feed.rb allow pagination by min_id and max_id (#14776) 4 years ago
follow.rb Add follower synchronization mechanism (#14510) 4 years ago
follow_request.rb Add option to be notified when a followed user posts (#13546) 4 years ago
home_feed.rb Change Redis#exists calls to Redis#exists? to avoid deprecation warning (#14191) 5 years ago
identity.rb Change identities id column to a bigint (#9371) 6 years ago
import.rb Fix csv upload (#13835) 5 years ago
instance.rb Add whitelist mode (#11291) 6 years ago
instance_filter.rb Various fixes and improvements (#12878) 5 years ago
invite.rb Change account suspensions to be reversible by default (#14726) 4 years ago
invite_filter.rb Various fixes and improvements (#12878) 5 years ago
ip_block.rb Add IP-based rules (#14963) 4 years ago
list.rb Add configuration option to filter replies in lists (#9205) 4 years ago
list_account.rb Add abilityto add oneself to lists (#12271) 5 years ago
list_feed.rb
marker.rb Add timeline read markers API (#11762) 5 years ago
media_attachment.rb Fix videos with near-60 fps being rejected (#14684) 4 years ago
mention.rb Improve support for aspects/circles (#8950) 6 years ago
message_franking.rb Add E2EE API (#13820) 5 years ago
mute.rb Add duration parameter to muting. (#13831) 4 years ago
notification.rb Add option to be notified when a followed user posts (#13546) 4 years ago
one_time_key.rb Add E2EE API (#13820) 5 years ago
poll.rb Only normalize local polls (#12515) 5 years ago
poll_vote.rb Add optimistic lock to avoid race conditions when handling votes (#10196) 6 years ago
preview_card.rb Bump rubocop from 0.86.0 to 0.88.0 (#14412) 4 years ago
public_feed.rb Refactor how public and tag timelines are queried (#14728) 4 years ago
relationship_filter.rb Fix followings list order | Issue #13538 (#13676) 5 years ago
relay.rb Fix enable/disable relay failures (#13535) 5 years ago
remote_follow.rb Remove dependency on goldfinger gem (#14919) 4 years ago
report.rb Add rate limit for reporting (#13390) 5 years ago
report_filter.rb Various fixes and improvements (#12878) 5 years ago
report_note.rb Fix scope latest of ReportNote (#9630) 6 years ago
scheduled_status.rb Fix deleting a scheduled status immediately deleting media attachments (#9728) 6 years ago
search.rb
session_activation.rb
setting.rb Remove intermediary arrays when creating hash maps from results (#9291) 6 years ago
site_upload.rb Improvements to image upload validation and creation (#10431) 6 years ago
status.rb Fix a slow query for TagFeed (#14861) 4 years ago
status_pin.rb
status_stat.rb Reset status cache when status_stat or media_attachment updates (#9119) 6 years ago
system_key.rb Add E2EE API (#13820) 5 years ago
tag.rb Changed tag most_used to recently_used (#14760) 4 years ago
tag_feed.rb Fix a slow query for TagFeed (#14861) 4 years ago
tag_filter.rb Various fixes and improvements (#12878) 5 years ago
tombstone.rb Record deleted(by mod) status to prevent re-appear (#10732) 6 years ago
trending_tags.rb Fix admin setting to auto-approve hashtags not affecting query (#12130) 5 years ago
unavailable_domain.rb Change delivery failure tracking to work with hostnames instead of URLs (#13437) 5 years ago
user.rb Add IP-based rules (#14963) 4 years ago
user_invite_request.rb Add "why do you want to join" field to invite requests (#10524) 6 years ago
web.rb
webauthn_credential.rb Fix validates :sign_count of WebauthnCredential (#14806) 4 years ago