Set snowflake IDs for backdated statuses (#5260)

- Rename Mastodon::TimestampIds into Mastodon::Snowflake for clarity
- Skip for statuses coming from inbox, aka delivered in real-time
- Skip for statuses that claim to be from the future
This commit is contained in:
Eugen Rochko
2017-10-08 17:34:34 +02:00
committed by GitHub
parent 6e4046fc3f
commit 0717d9b3e6
16 changed files with 83 additions and 43 deletions

View File

@ -3,10 +3,11 @@
class ActivityPub::Activity
include JsonLdHelper
def initialize(json, account)
def initialize(json, account, options = {})
@json = json
@account = account
@object = @json['object']
@options = options
end
def perform
@ -14,9 +15,9 @@ class ActivityPub::Activity
end
class << self
def factory(json, account)
def factory(json, account, options = {})
@json = json
klass&.new(json, account)
klass&.new(json, account, options)
end
private

View File

@ -15,8 +15,9 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
account: @account,
reblog: original_status,
uri: @json['id'],
created_at: @json['published'] || Time.now.utc
created_at: @options[:override_timestamps] ? nil : @json['published']
)
distribute(status)
status
end

View File

@ -43,7 +43,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
text: text_from_content || '',
language: language_from_content,
spoiler_text: @object['summary'] || '',
created_at: @object['published'] || Time.now.utc,
created_at: @options[:override_timestamps] ? nil : @object['published'],
reply: @object['inReplyTo'].present?,
sensitive: @object['sensitive'] || false,
visibility: visibility_from_audience,

View File

@ -1,9 +1,10 @@
# frozen_string_literal: true
class OStatus::Activity::Base
def initialize(xml, account = nil)
@xml = xml
def initialize(xml, account = nil, options = {})
@xml = xml
@account = account
@options = options
end
def status?

View File

@ -34,7 +34,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
reblog: cached_reblog,
text: content,
spoiler_text: content_warning,
created_at: published,
created_at: @options[:override_timestamps] ? nil : published,
reply: thread?,
language: content_language,
visibility: visibility_scope,

View File

@ -2,7 +2,7 @@
class OStatus::Activity::General < OStatus::Activity::Base
def specialize
special_class&.new(@xml, @account)
special_class&.new(@xml, @account, @options)
end
private

View File

@ -136,6 +136,8 @@ class Status < ApplicationRecord
after_create :store_uri, if: :local?
around_create Mastodon::Snowflake::Callbacks
before_validation :prepare_contents, if: :local?
before_validation :set_reblog
before_validation :set_visibility

View File

@ -3,9 +3,10 @@
class ActivityPub::ProcessCollectionService < BaseService
include JsonLdHelper
def call(body, account)
def call(body, account, options = {})
@account = account
@json = Oj.load(body, mode: :strict)
@options = options
return unless supported_context?
return if different_actor? && verify_account!.nil?
@ -38,7 +39,7 @@ class ActivityPub::ProcessCollectionService < BaseService
end
def process_item(item)
activity = ActivityPub::Activity.factory(item, @account)
activity = ActivityPub::Activity.factory(item, @account, @options)
activity&.perform
end

View File

@ -1,7 +1,9 @@
# frozen_string_literal: true
class ProcessFeedService < BaseService
def call(body, account)
def call(body, account, options = {})
@options = options
xml = Nokogiri::XML(body)
xml.encoding = 'utf-8'
@ -20,7 +22,7 @@ class ProcessFeedService < BaseService
end
def process_entry(xml, account)
activity = OStatus::Activity::General.new(xml, account)
activity = OStatus::Activity::General.new(xml, account, @options)
activity.specialize&.perform if activity.status?
rescue ActiveRecord::RecordInvalid => e
Rails.logger.debug "Nothing was saved for #{activity.id} because: #{e}"

View File

@ -6,6 +6,6 @@ class ActivityPub::ProcessingWorker
sidekiq_options backtrace: true
def perform(account_id, body)
ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id))
ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true)
end
end

View File

@ -6,6 +6,6 @@ class ProcessingWorker
sidekiq_options backtrace: true
def perform(account_id, body)
ProcessFeedService.new.call(body, Account.find(account_id))
ProcessFeedService.new.call(body, Account.find(account_id), override_timestamps: true)
end
end