about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-09-20 00:10:35 +0200
committerGitHub <noreply@github.com>2018-09-20 00:10:35 +0200
commitf92f1ee80a90fcc88afc4519c0b70f369fef6f62 (patch)
tree56bba13d3b9e81adefd71c6ff5e298a1c13605d4
parent554f659f2aa1eb9c0ca64ec1c9c177538434826c (diff)
Support link verification with redirects (#8735)
(e.g. URL shortener)
-rw-r--r--app/services/verify_link_service.rb18
-rw-r--r--spec/services/verify_link_service_spec.rb16
2 files changed, 33 insertions, 1 deletions
diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb
index 846751cd5..7d53bc255 100644
--- a/app/services/verify_link_service.rb
+++ b/app/services/verify_link_service.rb
@@ -27,6 +27,22 @@ class VerifyLinkService < BaseService
   def link_back_present?
     return false if @body.empty?
 
-    Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]').any? { |link| link['href'] == @link_back }
+    links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]')
+
+    if links.any? { |link| link['href'] == @link_back }
+      true
+    elsif links.empty?
+      false
+    else
+      link_redirects_back?(links.first['href'])
+    end
+  end
+
+  def link_redirects_back?(test_url)
+    redirect_to_url = Request.new(:head, test_url, follow: false).perform do |res|
+      res.headers['Location']
+    end
+
+    redirect_to_url == @link_back
   end
 end
diff --git a/spec/services/verify_link_service_spec.rb b/spec/services/verify_link_service_spec.rb
index acd4e851e..9b04d6136 100644
--- a/spec/services/verify_link_service_spec.rb
+++ b/spec/services/verify_link_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe VerifyLinkService, type: :service do
   let(:field)   { Account::Field.new(account, 'name' => 'Website', 'value' => 'http://example.com') }
 
   before do
+    stub_request(:head, 'https://redirect.me/abc').to_return(status: 301, headers: { 'Location' => ActivityPub::TagManager.instance.url_for(account) })
     stub_request(:get, 'http://example.com').to_return(status: 200, body: html)
     subject.call(field)
   end
@@ -56,6 +57,21 @@ RSpec.describe VerifyLinkService, type: :service do
     end
   end
 
+  context 'when a link goes through a redirect back' do
+    let(:html) do
+      <<-HTML
+        <!doctype html>
+        <head>
+          <link type="text/html" href="https://redirect.me/abc" rel="me" />
+        </head>
+      HTML
+    end
+
+    it 'marks the field as verified' do
+      expect(field.verified?).to be true
+    end
+  end
+
   context 'when a link does not contain a link back' do
     let(:html) { '' }