diff options
Diffstat (limited to 'app/controllers')
-rw-r--r-- | app/controllers/remote_follow_controller.rb | 47 |
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 |