about summary refs log tree commit diff
path: root/app/controllers
diff options
context:
space:
mode:
Diffstat (limited to 'app/controllers')
-rw-r--r--app/controllers/remote_follow_controller.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/app/controllers/remote_follow_controller.rb b/app/controllers/remote_follow_controller.rb
new file mode 100644
index 000000000..5e923c88f
--- /dev/null
+++ b/app/controllers/remote_follow_controller.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+class RemoteFollowController < ApplicationController
+  layout 'public'
+
+  before_action :set_account
+  before_action :check_account_suspension
+
+  def new
+    @remote_follow = RemoteFollow.new
+  end
+
+  def create
+    @remote_follow = RemoteFollow.new(resource_params)
+
+    if @remote_follow.valid?
+      resource          = Goldfinger.finger("acct:#{@remote_follow.acct}")
+      redirect_url_link = resource&.link('http://ostatus.org/schema/1.0/subscribe')
+
+      if redirect_url_link.nil? || redirect_url_link.template.nil?
+        @remote_follow.errors.add(:acct, I18n.t('remote_follow.missing_resource'))
+        render(:new) && return
+      end
+
+      redirect_to Addressable::Template.new(redirect_url_link.template).expand(uri: "acct:#{@account.username}@#{Rails.configuration.x.local_domain}").to_s
+    else
+      render :new
+    end
+  rescue Goldfinger::Error
+    @remote_follow.errors.add(:acct, I18n.t('remote_follow.missing_resource'))
+    render :new
+  end
+
+  private
+
+  def resource_params
+    params.require(:remote_follow).permit(:acct)
+  end
+
+  def set_account
+    @account = Account.find_local!(params[:account_username])
+  end
+
+  def check_account_suspension
+    head 410 if @account.suspended?
+  end
+end