From 87b618ab02d5265e47bd3455a41c5c31d77905a5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 10 Oct 2016 18:05:52 +0200 Subject: [PATCH] Fix namespace parsing in Atom feeds --- app/services/process_feed_service.rb | 25 +++++++++++-------- app/services/process_interaction_service.rb | 6 +++-- app/services/update_remote_profile_service.rb | 8 +++--- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb index 537c1a8ff..334cde6b1 100644 --- a/app/services/process_feed_service.rb +++ b/app/services/process_feed_service.rb @@ -1,4 +1,7 @@ class ProcessFeedService < BaseService + ACTIVITY_NS = 'http://activitystrea.ms/spec/1.0/'.freeze + THREAD_NS = 'http://purl.org/syndication/thread/1.0'.freeze + # Create local statuses from an Atom feed # @param [String] body Atom feed # @param [Account] account Account this feed belongs to @@ -42,10 +45,10 @@ class ProcessFeedService < BaseService # Also record all media attachments for the status and for the reblogged status if present unless status.new_record? record_remote_mentions(status, entry.xpath('./xmlns:link[@rel="mentioned"]')) - record_remote_mentions(status.reblog, entry.xpath('./activity:object/xmlns:link[@rel="mentioned"]')) if status.reblog? + record_remote_mentions(status.reblog, entry.xpath('./activity:object/xmlns:link[@rel="mentioned"]', activity: ACTIVITY_NS)) if status.reblog? process_attachments(entry, status) - process_attachments(entry.xpath('./activity:object'), status.reblog) if status.reblog? + process_attachments(entry.xpath('./activity:object', activity: ACTIVITY_NS), status.reblog) if status.reblog? DistributionWorker.perform_async(status.id) return status @@ -144,8 +147,8 @@ class ProcessFeedService < BaseService end def fetch_remote_status(xml) - username = xml.at_xpath('./activity:object/xmlns:author/xmlns:name').content - url = xml.at_xpath('./activity:object/xmlns:author/xmlns:uri').content + username = xml.at_xpath('./activity:object/xmlns:author/xmlns:name', activity: ACTIVITY_NS).content + url = xml.at_xpath('./activity:object/xmlns:author/xmlns:uri', activity: ACTIVITY_NS).content domain = Addressable::URI.parse(url).host account = Account.find_remote(username, domain) @@ -178,19 +181,19 @@ class ProcessFeedService < BaseService end def thread_id(xml) - xml.at_xpath('./thr:in-reply-to').attribute('ref').value + xml.at_xpath('./thr:in-reply-to', thr: THREAD_NS).attribute('ref').value rescue nil end def thread_href(xml) - xml.at_xpath('./thr:in-reply-to').attribute('href').value + xml.at_xpath('./thr:in-reply-to', thr: THREAD_NS).attribute('href').value rescue nil end def target_id(xml) - xml.at_xpath('.//activity:object/xmlns:id').content + xml.at_xpath('.//activity:object/xmlns:id', activity: ACTIVITY_NS).content rescue nil end @@ -206,21 +209,21 @@ class ProcessFeedService < BaseService end def target_content(xml) - xml.at_xpath('.//activity:object/xmlns:content').content + xml.at_xpath('.//activity:object/xmlns:content', activity: ACTIVITY_NS).content end def target_url(xml) - xml.at_xpath('.//activity:object/xmlns:link[@rel="alternate"]').attribute('href').value + xml.at_xpath('.//activity:object/xmlns:link[@rel="alternate"]', activity: ACTIVITY_NS).attribute('href').value end def object_type(xml) - xml.at_xpath('./activity:object-type').content.gsub('http://activitystrea.ms/schema/1.0/', '').to_sym + xml.at_xpath('./activity:object-type', activity: ACTIVITY_NS).content.gsub('http://activitystrea.ms/schema/1.0/', '').gsub('http://ostatus.org/schema/1.0/', '').to_sym rescue :activity end def verb(xml) - xml.at_xpath('./activity:verb').content.gsub('http://activitystrea.ms/schema/1.0/', '').to_sym + xml.at_xpath('./activity:verb', activity: ACTIVITY_NS).content.gsub('http://activitystrea.ms/schema/1.0/', '').gsub('http://ostatus.org/schema/1.0/', '').to_sym rescue :post end diff --git a/app/services/process_interaction_service.rb b/app/services/process_interaction_service.rb index 75051c5df..20ce3d00e 100644 --- a/app/services/process_interaction_service.rb +++ b/app/services/process_interaction_service.rb @@ -1,4 +1,6 @@ class ProcessInteractionService < BaseService + ACTIVITY_NS = 'http://activitystrea.ms/spec/1.0/'.freeze + # Record locally the remote interaction with our user # @param [String] envelope Salmon envelope # @param [Account] target_account Account the Salmon was addressed to @@ -53,7 +55,7 @@ class ProcessInteractionService < BaseService end def verb(xml) - xml.at_xpath('//activity:verb').content.gsub('http://activitystrea.ms/schema/1.0/', '').gsub('http://ostatus.org/schema/1.0/', '').to_sym + xml.at_xpath('//activity:verb', activity: ACTIVITY_NS).content.gsub('http://activitystrea.ms/schema/1.0/', '').gsub('http://ostatus.org/schema/1.0/', '').to_sym rescue :post end @@ -92,7 +94,7 @@ class ProcessInteractionService < BaseService end def activity_id(xml) - xml.at_xpath('//activity:object/xmlns:id').content + xml.at_xpath('//activity:object/xmlns:id', activity: ACTIVITY_NS).content end def salmon diff --git a/app/services/update_remote_profile_service.rb b/app/services/update_remote_profile_service.rb index 595fa4244..14f8cc868 100644 --- a/app/services/update_remote_profile_service.rb +++ b/app/services/update_remote_profile_service.rb @@ -1,15 +1,17 @@ class UpdateRemoteProfileService < BaseService + POCO_NS = 'http://portablecontacts.net/spec/1.0' + def call(author_xml, account) return if author_xml.nil? - if author_xml.at_xpath('./poco:displayName').nil? + if author_xml.at_xpath('./poco:displayName', poco: POCO_NS).nil? account.display_name = account.username else - account.display_name = author_xml.at_xpath('./poco:displayName').content + account.display_name = author_xml.at_xpath('./poco:displayName', poco: POCO_NS).content end unless author_xml.at_xpath('./poco:note').nil? - account.note = author_xml.at_xpath('./poco:note').content + account.note = author_xml.at_xpath('./poco:note', poco: POCO_NS).content end unless author_xml.at_xpath('./xmlns:link[@rel="avatar"]').nil?