# frozen_string_literal: true
class ActivityPub::Activity::Follow < ActivityPub::Activity
+ include Payloadable
+
def perform
target_account = account_from_uri(object_uri)
end
def reject_follow_request!(target_account)
- json = ActiveModelSerializers::SerializableResource.new(FollowRequest.new(account: @account, target_account: target_account, uri: @json['id']), serializer: ActivityPub::RejectFollowSerializer, adapter: ActivityPub::Adapter).to_json
+ json = Oj.dump(serialize_payload(FollowRequest.new(account: @account, target_account: target_account, uri: @json['id']), ActivityPub::RejectFollowSerializer))
ActivityPub::DeliveryWorker.perform_async(json, target_account.id, @account.inbox_url)
end
end
end
end
+ def sign?
+ true
+ end
+
def keypair
@keypair ||= OpenSSL::PKey::RSA.new(private_key || public_key)
end
class Form::AccountBatch
include ActiveModel::Model
include Authorization
+ include Payloadable
attr_accessor :account_ids, :action, :current_account
return unless follow.account.activitypub?
- json = ActiveModelSerializers::SerializableResource.new(
- follow,
- serializer: ActivityPub::RejectFollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
-
- ActivityPub::DeliveryWorker.perform_async(json, current_account.id, follow.account.inbox_url)
+ ActivityPub::DeliveryWorker.perform_async(Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), current_account.id, follow.account.inbox_url)
end
def approve!
public_visibility? || unlisted_visibility?
end
+ alias sign? distributable?
+
def with_media?
media_attachments.any?
end
# frozen_string_literal: true
class AfterBlockDomainFromAccountService < BaseService
+ include Payloadable
+
# This service does not create an AccountDomainBlock record,
# it's meant to be called after such a record has been created
# synchronously, to "clean up"
return unless follow.account.activitypub?
- json = ActiveModelSerializers::SerializableResource.new(
- follow,
- serializer: ActivityPub::RejectFollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
-
- ActivityPub::DeliveryWorker.perform_async(json, @account.id, follow.account.inbox_url)
+ ActivityPub::DeliveryWorker.perform_async(Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), @account.id, follow.account.inbox_url)
end
end
# frozen_string_literal: true
class AuthorizeFollowService < BaseService
+ include Payloadable
+
def call(source_account, target_account, **options)
if options[:skip_follow_request]
follow_request = FollowRequest.new(account: source_account, target_account: target_account, uri: options[:follow_request_uri])
end
def build_json(follow_request)
- ActiveModelSerializers::SerializableResource.new(
- follow_request,
- serializer: ActivityPub::AcceptFollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(follow_request, ActivityPub::AcceptFollowSerializer))
end
def build_xml(follow_request)
# frozen_string_literal: true
class BlockService < BaseService
+ include Payloadable
+
def call(account, target_account)
return if account.id == target_account.id
end
def build_json(block)
- ActiveModelSerializers::SerializableResource.new(
- block,
- serializer: ActivityPub::BlockSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(block, ActivityPub::BlockSerializer))
end
def build_xml(block)
--- /dev/null
+# frozen_string_literal: true
+
+module Payloadable
+ def serialize_payload(record, serializer, options = {})
+ signer = options.delete(:signer)
+ sign_with = options.delete(:sign_with)
+ payload = ActiveModelSerializers::SerializableResource.new(record, options.merge(serializer: serializer, adapter: ActivityPub::Adapter)).as_json
+
+ if (record.respond_to?(:sign?) && record.sign?) && signer && signing_enabled?
+ ActivityPub::LinkedDataSignature.new(payload).sign!(signer, sign_with: sign_with)
+ else
+ payload
+ end
+ end
+
+ def signing_enabled?
+ true
+ end
+end
class FavouriteService < BaseService
include Authorization
+ include Payloadable
# Favourite a status and notify remote user
# @param [Account] account
end
def build_json(favourite)
- Oj.dump(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new(
- favourite,
- serializer: ActivityPub::LikeSerializer,
- adapter: ActivityPub::Adapter
- ).as_json).sign!(favourite.account))
+ Oj.dump(serialize_payload(favourite, ActivityPub::LikeSerializer))
end
def build_xml(favourite)
class FollowService < BaseService
include Redisable
+ include Payloadable
# Follow a remote user, notify remote user about the follow
# @param [Account] source_account From which to follow
end
def build_json(follow_request)
- ActiveModelSerializers::SerializableResource.new(
- follow_request,
- serializer: ActivityPub::FollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(follow_request, ActivityPub::FollowSerializer))
end
end
class ProcessMentionsService < BaseService
include StreamEntryRenderer
+ include Payloadable
# Scan status for mentions and fetch remote mentioned users, create
# local mention pointers, send Salmon notifications to mentioned
def activitypub_json
return @activitypub_json if defined?(@activitypub_json)
- payload = ActiveModelSerializers::SerializableResource.new(
- @status,
- serializer: ActivityPub::ActivitySerializer,
- adapter: ActivityPub::Adapter
- ).as_json
- @activitypub_json = Oj.dump(@status.distributable? ? ActivityPub::LinkedDataSignature.new(payload).sign!(@status.account) : payload)
+ @activitypub_json = Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @status.account))
end
def resolve_account_service
class ReblogService < BaseService
include Authorization
include StreamEntryRenderer
+ include Payloadable
# Reblog a status and notify its remote author
# @param [Account] account Account to reblog from
end
def build_json(reblog)
- Oj.dump(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new(
- reblog,
- serializer: ActivityPub::ActivitySerializer,
- adapter: ActivityPub::Adapter
- ).as_json).sign!(reblog.account))
+ Oj.dump(serialize_payload(reblog, ActivityPub::ActivitySerializer, signer: reblog.account))
end
end
# frozen_string_literal: true
class RejectFollowService < BaseService
+ include Payloadable
+
def call(source_account, target_account)
follow_request = FollowRequest.find_by!(account: source_account, target_account: target_account)
follow_request.reject!
end
def build_json(follow_request)
- ActiveModelSerializers::SerializableResource.new(
- follow_request,
- serializer: ActivityPub::RejectFollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(follow_request, ActivityPub::RejectFollowSerializer))
end
def build_xml(follow_request)
class RemoveStatusService < BaseService
include StreamEntryRenderer
include Redisable
+ include Payloadable
def call(status, **options)
@payload = Oj.dump(event: :delete, payload: status.id.to_s)
end
def signed_activity_json
- @signed_activity_json ||= Oj.dump(ActivityPub::LinkedDataSignature.new(activity_json).sign!(@account))
- end
-
- def activity_json
- @activity_json ||= ActiveModelSerializers::SerializableResource.new(
- @status,
- serializer: @status.reblog? ? ActivityPub::UndoAnnounceSerializer : ActivityPub::DeleteSerializer,
- adapter: ActivityPub::Adapter
- ).as_json
+ @signed_activity_json ||= Oj.dump(serialize_payload(@status, @status.reblog? ? ActivityPub::UndoAnnounceSerializer : ActivityPub::DeleteSerializer, signer: @account))
end
def remove_reblogs
# frozen_string_literal: true
class ReportService < BaseService
+ include Payloadable
+
def call(source_account, target_account, options = {})
@source_account = source_account
@target_account = target_account
end
def payload
- Oj.dump(ActiveModelSerializers::SerializableResource.new(
- @report,
- serializer: ActivityPub::FlagSerializer,
- adapter: ActivityPub::Adapter,
- account: some_local_account
- ).as_json)
+ Oj.dump(serialize_payload(@report, ActivityPub::FlagSerializer, account: some_local_account))
end
def some_local_account
# frozen_string_literal: true
class SuspendAccountService < BaseService
+ include Payloadable
+
ASSOCIATIONS_ON_SUSPEND = %w(
account_pins
active_relationships
end
def delete_actor_json
- return @delete_actor_json if defined?(@delete_actor_json)
-
- payload = ActiveModelSerializers::SerializableResource.new(
- @account,
- serializer: ActivityPub::DeleteActorSerializer,
- adapter: ActivityPub::Adapter
- ).as_json
-
- @delete_actor_json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(@account))
+ @delete_actor_json ||= Oj.dump(serialize_payload(@account, ActivityPub::DeleteActorSerializer, signer: @account))
end
def build_reject_json(follow)
- ActiveModelSerializers::SerializableResource.new(
- follow,
- serializer: ActivityPub::RejectFollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer))
end
def delivery_inboxes
# frozen_string_literal: true
class UnblockService < BaseService
+ include Payloadable
+
def call(account, target_account)
return unless account.blocking?(target_account)
end
def build_json(unblock)
- ActiveModelSerializers::SerializableResource.new(
- unblock,
- serializer: ActivityPub::UndoBlockSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(unblock, ActivityPub::UndoBlockSerializer))
end
def build_xml(block)
# frozen_string_literal: true
class UnfavouriteService < BaseService
+ include Payloadable
+
def call(account, status)
favourite = Favourite.find_by!(account: account, status: status)
favourite.destroy!
end
def build_json(favourite)
- Oj.dump(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new(
- favourite,
- serializer: ActivityPub::UndoLikeSerializer,
- adapter: ActivityPub::Adapter
- ).as_json).sign!(favourite.account))
+ Oj.dump(serialize_payload(favourite, ActivityPub::UndoLikeSerializer))
end
def build_xml(favourite)
# frozen_string_literal: true
class UnfollowService < BaseService
+ include Payloadable
+
# Unfollow and notify the remote user
# @param [Account] source_account Where to unfollow from
# @param [Account] target_account Which to unfollow
end
def build_json(follow)
- ActiveModelSerializers::SerializableResource.new(
- follow,
- serializer: ActivityPub::UndoFollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(follow, ActivityPub::UndoFollowSerializer))
end
def build_reject_json(follow)
- ActiveModelSerializers::SerializableResource.new(
- follow,
- serializer: ActivityPub::RejectFollowSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer))
end
def build_xml(follow)
class VoteService < BaseService
include Authorization
+ include Payloadable
def call(account, poll, choices)
authorize_with account, poll, :vote?
end
def build_json(vote)
- ActiveModelSerializers::SerializableResource.new(
- vote,
- serializer: ActivityPub::VoteSerializer,
- adapter: ActivityPub::Adapter
- ).to_json
+ Oj.dump(serialize_payload(vote, ActivityPub::VoteSerializer))
end
end
class ActivityPub::DistributePollUpdateWorker
include Sidekiq::Worker
+ include Payloadable
sidekiq_options queue: 'push', unique: :until_executed, retry: 0
@inboxes
end
- def signed_payload
- Oj.dump(ActivityPub::LinkedDataSignature.new(unsigned_payload).sign!(@account))
- end
-
- def unsigned_payload
- ActiveModelSerializers::SerializableResource.new(
- @status,
- serializer: ActivityPub::UpdatePollSerializer,
- adapter: ActivityPub::Adapter
- ).as_json
- end
-
def payload
- @payload ||= @status.distributable? ? signed_payload : Oj.dump(unsigned_payload)
+ @payload ||= Oj.dump(serialize_payload(@status, ActivityPub::UpdatePollSerializer, signer: @account))
end
def relay!
class ActivityPub::DistributionWorker
include Sidekiq::Worker
+ include Payloadable
sidekiq_options queue: 'push'
end
end
- def signed_payload
- Oj.dump(ActivityPub::LinkedDataSignature.new(unsigned_payload).sign!(@account))
- end
-
- def unsigned_payload
- ActiveModelSerializers::SerializableResource.new(
- @status,
- serializer: ActivityPub::ActivitySerializer,
- adapter: ActivityPub::Adapter
- ).as_json
- end
-
def payload
- @payload ||= @status.distributable? ? signed_payload : Oj.dump(unsigned_payload)
+ @payload ||= Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @account))
end
def relay!
class ActivityPub::ReplyDistributionWorker
include Sidekiq::Worker
+ include Payloadable
sidekiq_options queue: 'push'
@inboxes ||= @account.followers.inboxes
end
- def signed_payload
- Oj.dump(ActivityPub::LinkedDataSignature.new(unsigned_payload).sign!(@status.account))
- end
-
- def unsigned_payload
- ActiveModelSerializers::SerializableResource.new(
- @status,
- serializer: ActivityPub::ActivitySerializer,
- adapter: ActivityPub::Adapter
- ).as_json
- end
-
def payload
- @payload ||= @status.distributable? ? signed_payload : Oj.dump(unsigned_payload)
+ @payload ||= Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @status.account))
end
end
class ActivityPub::UpdateDistributionWorker
include Sidekiq::Worker
+ include Payloadable
sidekiq_options queue: 'push'
end
def signed_payload
- @signed_payload ||= Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(@account, sign_with: @options[:sign_with]))
- end
-
- def payload
- @payload ||= ActiveModelSerializers::SerializableResource.new(
- @account,
- serializer: ActivityPub::UpdateSerializer,
- adapter: ActivityPub::Adapter
- ).as_json
+ @signed_payload ||= Oj.dump(serialize_payload(@account, ActivityPub::UpdateSerializer, signer: @account, sign_with: @options[:sign_with]))
end
end