Parcourir la source

Support link verification with redirects (#8735)

(e.g. URL shortener)
master
Eugen Rochko il y a 5 ans
committed by GitHub
Parent
révision
f92f1ee80a
Aucune clé connue n'a été trouvée dans la base pour cette signature ID de la clé GPG: 4AEE18F83AFDEB23
2 fichiers modifiés avec 33 ajouts et 1 suppressions
  1. +17
    -1
      app/services/verify_link_service.rb
  2. +16
    -0
      spec/services/verify_link_service_spec.rb

+ 17
- 1
app/services/verify_link_service.rb Voir le fichier

@@ -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

+ 16
- 0
spec/services/verify_link_service_spec.rb Voir le fichier

@@ -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) { '' }



Chargement…
Annuler
Enregistrer