diff --git a/app/views/admin/relays/_relay.html.haml b/app/views/admin/relays/_relay.html.haml
index d974c80..6678218 100644
--- a/app/views/admin/relays/_relay.html.haml
+++ b/app/views/admin/relays/_relay.html.haml
@@ -2,20 +2,24 @@
%td
%samp= relay.inbox_url
%td
- - if relay.enabled?
+ - if relay.accepted?
%span.positive-hint
= fa_icon('check')
= ' '
= t 'admin.relays.enabled'
+ - elsif relay.pending?
+ = fa_icon('hourglass')
+ = ' '
+ = t 'admin.relays.pending'
- else
%span.negative-hint
= fa_icon('times')
= ' '
= t 'admin.relays.disabled'
%td
- - if relay.enabled?
+ - if relay.accepted?
= table_link_to 'power-off', t('admin.relays.disable'), disable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
- - else
+ - elsif !relay.pending?
= table_link_to 'power-off', t('admin.relays.enable'), enable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
= table_link_to 'times', t('admin.relays.delete'), admin_relay_path(relay), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }
diff --git a/config/locales/en.yml b/config/locales/en.yml
index aa7efff..4f89371 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -303,6 +303,7 @@ en:
description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers.
enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it.
inbox_url: Relay URL
+ pending: Waiting for relay's approval
setup: Setup a relay connection
status: Status
title: Relays
diff --git a/spec/fabricators/relay_fabricator.rb b/spec/fabricators/relay_fabricator.rb
index 2c9df4a..3f8726f 100644
--- a/spec/fabricators/relay_fabricator.rb
+++ b/spec/fabricators/relay_fabricator.rb
@@ -1,4 +1,4 @@
Fabricator(:relay) do
inbox_url "https://example.com/inbox"
- enabled true
+ state :idle
end
diff --git a/spec/lib/activitypub/activity/accept_spec.rb b/spec/lib/activitypub/activity/accept_spec.rb
index 6503c83..883bab6 100644
--- a/spec/lib/activitypub/activity/accept_spec.rb
+++ b/spec/lib/activitypub/activity/accept_spec.rb
@@ -35,4 +35,30 @@ RSpec.describe ActivityPub::Activity::Accept do
expect(recipient.requested?(sender)).to be false
end
end
+
+ context 'given a relay' do
+ let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') }
+
+ let(:json) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ id: 'foo',
+ type: 'Accept',
+ actor: ActivityPub::TagManager.instance.uri_for(sender),
+ object: {
+ id: 'https://abc-123/456',
+ type: 'Follow',
+ actor: ActivityPub::TagManager.instance.uri_for(recipient),
+ object: ActivityPub::TagManager.instance.uri_for(sender),
+ },
+ }.with_indifferent_access
+ end
+
+ subject { described_class.new(json, sender) }
+
+ it 'marks the relay as accepted' do
+ subject.perform
+ expect(relay.reload.accepted?).to be true
+ end
+ end
end
diff --git a/spec/lib/activitypub/activity/reject_spec.rb b/spec/lib/activitypub/activity/reject_spec.rb
index 7fd95bc..e7205df 100644
--- a/spec/lib/activitypub/activity/reject_spec.rb
+++ b/spec/lib/activitypub/activity/reject_spec.rb
@@ -35,4 +35,30 @@ RSpec.describe ActivityPub::Activity::Reject do
expect(recipient.requested?(sender)).to be false
end
end
+
+ context 'given a relay' do
+ let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') }
+
+ let(:json) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ id: 'foo',
+ type: 'Reject',
+ actor: ActivityPub::TagManager.instance.uri_for(sender),
+ object: {
+ id: 'https://abc-123/456',
+ type: 'Follow',
+ actor: ActivityPub::TagManager.instance.uri_for(recipient),
+ object: ActivityPub::TagManager.instance.uri_for(sender),
+ },
+ }.with_indifferent_access
+ end
+
+ subject { described_class.new(json, sender) }
+
+ it 'marks the relay as rejected' do
+ subject.perform
+ expect(relay.reload.rejected?).to be true
+ end
+ end
end