Introduce OStatus::TagManager (#5008)
This commit is contained in:
		
							parent
							
								
									df1ce2350c
								
							
						
					
					
						commit
						bb4d005a83
					
				@ -115,7 +115,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  def conversation_from_uri(uri)
 | 
					  def conversation_from_uri(uri)
 | 
				
			||||||
    return nil if uri.nil?
 | 
					    return nil if uri.nil?
 | 
				
			||||||
    return Conversation.find_by(id: TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if TagManager.instance.local_id?(uri)
 | 
					    return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
 | 
				
			||||||
    Conversation.find_by(uri: uri) || Conversation.create!(uri: uri)
 | 
					    Conversation.find_by(uri: uri) || Conversation.create!(uri: uri)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -98,8 +98,8 @@ class ActivityPub::TagManager
 | 
				
			|||||||
      else
 | 
					      else
 | 
				
			||||||
        StatusFinder.new(uri).status
 | 
					        StatusFinder.new(uri).status
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    elsif ::TagManager.instance.local_id?(uri)
 | 
					    elsif OStatus::TagManager.instance.local_id?(uri)
 | 
				
			||||||
      klass.find_by(id: ::TagManager.instance.unique_tag_to_local_id(uri, klass.to_s))
 | 
					      klass.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, klass.to_s))
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      klass.find_by(uri: uri.split('#').first)
 | 
					      klass.find_by(uri: uri.split('#').first)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
				
			|||||||
@ -11,30 +11,30 @@ class OStatus::Activity::Base
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def verb
 | 
					  def verb
 | 
				
			||||||
    raw = @xml.at_xpath('./activity:verb', activity: TagManager::AS_XMLNS).content
 | 
					    raw = @xml.at_xpath('./activity:verb', activity: OStatus::TagManager::AS_XMLNS).content
 | 
				
			||||||
    TagManager::VERBS.key(raw)
 | 
					    OStatus::TagManager::VERBS.key(raw)
 | 
				
			||||||
  rescue
 | 
					  rescue
 | 
				
			||||||
    :post
 | 
					    :post
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def type
 | 
					  def type
 | 
				
			||||||
    raw = @xml.at_xpath('./activity:object-type', activity: TagManager::AS_XMLNS).content
 | 
					    raw = @xml.at_xpath('./activity:object-type', activity: OStatus::TagManager::AS_XMLNS).content
 | 
				
			||||||
    TagManager::TYPES.key(raw)
 | 
					    OStatus::TagManager::TYPES.key(raw)
 | 
				
			||||||
  rescue
 | 
					  rescue
 | 
				
			||||||
    :activity
 | 
					    :activity
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def id
 | 
					  def id
 | 
				
			||||||
    @xml.at_xpath('./xmlns:id', xmlns: TagManager::XMLNS).content
 | 
					    @xml.at_xpath('./xmlns:id', xmlns: OStatus::TagManager::XMLNS).content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def url
 | 
					  def url
 | 
				
			||||||
    link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: TagManager::XMLNS).find { |link_candidate| link_candidate['type'] == 'text/html' }
 | 
					    link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: OStatus::TagManager::XMLNS).find { |link_candidate| link_candidate['type'] == 'text/html' }
 | 
				
			||||||
    link.nil? ? nil : link['href']
 | 
					    link.nil? ? nil : link['href']
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def activitypub_uri
 | 
					  def activitypub_uri
 | 
				
			||||||
    link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: TagManager::XMLNS).find { |link_candidate| ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(link_candidate['type']) }
 | 
					    link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: OStatus::TagManager::XMLNS).find { |link_candidate| ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(link_candidate['type']) }
 | 
				
			||||||
    link.nil? ? nil : link['href']
 | 
					    link.nil? ? nil : link['href']
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -45,8 +45,8 @@ class OStatus::Activity::Base
 | 
				
			|||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def find_status(uri)
 | 
					  def find_status(uri)
 | 
				
			||||||
    if TagManager.instance.local_id?(uri)
 | 
					    if OStatus::TagManager.instance.local_id?(uri)
 | 
				
			||||||
      local_id = TagManager.instance.unique_tag_to_local_id(uri, 'Status')
 | 
					      local_id = OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Status')
 | 
				
			||||||
      return Status.find_by(id: local_id)
 | 
					      return Status.find_by(id: local_id)
 | 
				
			||||||
    elsif ActivityPub::TagManager.instance.local_uri?(uri)
 | 
					    elsif ActivityPub::TagManager.instance.local_uri?(uri)
 | 
				
			||||||
      local_id = ActivityPub::TagManager.instance.uri_to_local_id(uri)
 | 
					      local_id = ActivityPub::TagManager.instance.uri_to_local_id(uri)
 | 
				
			||||||
 | 
				
			|||||||
@ -63,42 +63,42 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def content
 | 
					  def content
 | 
				
			||||||
    @xml.at_xpath('./xmlns:content', xmlns: TagManager::XMLNS).content
 | 
					    @xml.at_xpath('./xmlns:content', xmlns: OStatus::TagManager::XMLNS).content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def content_language
 | 
					  def content_language
 | 
				
			||||||
    @xml.at_xpath('./xmlns:content', xmlns: TagManager::XMLNS)['xml:lang']&.presence || 'en'
 | 
					    @xml.at_xpath('./xmlns:content', xmlns: OStatus::TagManager::XMLNS)['xml:lang']&.presence || 'en'
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def content_warning
 | 
					  def content_warning
 | 
				
			||||||
    @xml.at_xpath('./xmlns:summary', xmlns: TagManager::XMLNS)&.content || ''
 | 
					    @xml.at_xpath('./xmlns:summary', xmlns: OStatus::TagManager::XMLNS)&.content || ''
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def visibility_scope
 | 
					  def visibility_scope
 | 
				
			||||||
    @xml.at_xpath('./mastodon:scope', mastodon: TagManager::MTDN_XMLNS)&.content&.to_sym || :public
 | 
					    @xml.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content&.to_sym || :public
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def published
 | 
					  def published
 | 
				
			||||||
    @xml.at_xpath('./xmlns:published', xmlns: TagManager::XMLNS).content
 | 
					    @xml.at_xpath('./xmlns:published', xmlns: OStatus::TagManager::XMLNS).content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def thread?
 | 
					  def thread?
 | 
				
			||||||
    !@xml.at_xpath('./thr:in-reply-to', thr: TagManager::THR_XMLNS).nil?
 | 
					    !@xml.at_xpath('./thr:in-reply-to', thr: OStatus::TagManager::THR_XMLNS).nil?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def thread
 | 
					  def thread
 | 
				
			||||||
    thr = @xml.at_xpath('./thr:in-reply-to', thr: TagManager::THR_XMLNS)
 | 
					    thr = @xml.at_xpath('./thr:in-reply-to', thr: OStatus::TagManager::THR_XMLNS)
 | 
				
			||||||
    [thr['ref'], thr['href']]
 | 
					    [thr['ref'], thr['href']]
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def find_or_create_conversation
 | 
					  def find_or_create_conversation
 | 
				
			||||||
    uri = @xml.at_xpath('./ostatus:conversation', ostatus: TagManager::OS_XMLNS)&.attribute('ref')&.content
 | 
					    uri = @xml.at_xpath('./ostatus:conversation', ostatus: OStatus::TagManager::OS_XMLNS)&.attribute('ref')&.content
 | 
				
			||||||
    return if uri.nil?
 | 
					    return if uri.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if TagManager.instance.local_id?(uri)
 | 
					    if OStatus::TagManager.instance.local_id?(uri)
 | 
				
			||||||
      local_id = TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')
 | 
					      local_id = OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')
 | 
				
			||||||
      return Conversation.find_by(id: local_id)
 | 
					      return Conversation.find_by(id: local_id)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -108,8 +108,8 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
 | 
				
			|||||||
  def save_mentions(parent)
 | 
					  def save_mentions(parent)
 | 
				
			||||||
    processed_account_ids = []
 | 
					    processed_account_ids = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @xml.xpath('./xmlns:link[@rel="mentioned"]', xmlns: TagManager::XMLNS).each do |link|
 | 
					    @xml.xpath('./xmlns:link[@rel="mentioned"]', xmlns: OStatus::TagManager::XMLNS).each do |link|
 | 
				
			||||||
      next if [TagManager::TYPES[:group], TagManager::TYPES[:collection]].include? link['ostatus:object-type']
 | 
					      next if [OStatus::TagManager::TYPES[:group], OStatus::TagManager::TYPES[:collection]].include? link['ostatus:object-type']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      mentioned_account = account_from_href(link['href'])
 | 
					      mentioned_account = account_from_href(link['href'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -123,14 +123,14 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def save_hashtags(parent)
 | 
					  def save_hashtags(parent)
 | 
				
			||||||
    tags = @xml.xpath('./xmlns:category', xmlns: TagManager::XMLNS).map { |category| category['term'] }.select(&:present?)
 | 
					    tags = @xml.xpath('./xmlns:category', xmlns: OStatus::TagManager::XMLNS).map { |category| category['term'] }.select(&:present?)
 | 
				
			||||||
    ProcessHashtagsService.new.call(parent, tags)
 | 
					    ProcessHashtagsService.new.call(parent, tags)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def save_media(parent)
 | 
					  def save_media(parent)
 | 
				
			||||||
    do_not_download = DomainBlock.find_by(domain: parent.account.domain)&.reject_media?
 | 
					    do_not_download = DomainBlock.find_by(domain: parent.account.domain)&.reject_media?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @xml.xpath('./xmlns:link[@rel="enclosure"]', xmlns: TagManager::XMLNS).each do |link|
 | 
					    @xml.xpath('./xmlns:link[@rel="enclosure"]', xmlns: OStatus::TagManager::XMLNS).each do |link|
 | 
				
			||||||
      next unless link['href']
 | 
					      next unless link['href']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      media = MediaAttachment.where(status: parent, remote_url: link['href']).first_or_initialize(account: parent.account, status: parent, remote_url: link['href'])
 | 
					      media = MediaAttachment.where(status: parent, remote_url: link['href']).first_or_initialize(account: parent.account, status: parent, remote_url: link['href'])
 | 
				
			||||||
@ -156,7 +156,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return if do_not_download
 | 
					    return if do_not_download
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @xml.xpath('./xmlns:link[@rel="emoji"]', xmlns: TagManager::XMLNS).each do |link|
 | 
					    @xml.xpath('./xmlns:link[@rel="emoji"]', xmlns: OStatus::TagManager::XMLNS).each do |link|
 | 
				
			||||||
      next unless link['href'] && link['name']
 | 
					      next unless link['href'] && link['name']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      shortcode = link['name'].delete(':')
 | 
					      shortcode = link['name'].delete(':')
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ class OStatus::Activity::Share < OStatus::Activity::Creation
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def object
 | 
					  def object
 | 
				
			||||||
    @xml.at_xpath('.//activity:object', activity: TagManager::AS_XMLNS)
 | 
					    @xml.at_xpath('.//activity:object', activity: OStatus::TagManager::AS_XMLNS)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
				
			|||||||
@ -15,10 +15,10 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
  def author(account)
 | 
					  def author(account)
 | 
				
			||||||
    author = Ox::Element.new('author')
 | 
					    author = Ox::Element.new('author')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uri = TagManager.instance.uri_for(account)
 | 
					    uri = OStatus::TagManager.instance.uri_for(account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(author, 'id', uri)
 | 
					    append_element(author, 'id', uri)
 | 
				
			||||||
    append_element(author, 'activity:object-type', TagManager::TYPES[:person])
 | 
					    append_element(author, 'activity:object-type', OStatus::TagManager::TYPES[:person])
 | 
				
			||||||
    append_element(author, 'uri', uri)
 | 
					    append_element(author, 'uri', uri)
 | 
				
			||||||
    append_element(author, 'name', account.username)
 | 
					    append_element(author, 'name', account.username)
 | 
				
			||||||
    append_element(author, 'email', account.local? ? account.local_username_and_domain : account.acct)
 | 
					    append_element(author, 'email', account.local? ? account.local_username_and_domain : account.acct)
 | 
				
			||||||
@ -65,15 +65,15 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    add_namespaces(entry) if root
 | 
					    add_namespaces(entry) if root
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.uri_for(stream_entry.status))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.uri_for(stream_entry.status))
 | 
				
			||||||
    append_element(entry, 'published', stream_entry.created_at.iso8601)
 | 
					    append_element(entry, 'published', stream_entry.created_at.iso8601)
 | 
				
			||||||
    append_element(entry, 'updated', stream_entry.updated_at.iso8601)
 | 
					    append_element(entry, 'updated', stream_entry.updated_at.iso8601)
 | 
				
			||||||
    append_element(entry, 'title', stream_entry&.status&.title || "#{stream_entry.account.acct} deleted status")
 | 
					    append_element(entry, 'title', stream_entry&.status&.title || "#{stream_entry.account.acct} deleted status")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(stream_entry.account) if root
 | 
					    entry << author(stream_entry.account) if root
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[stream_entry.object_type])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[stream_entry.object_type])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[stream_entry.verb])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[stream_entry.verb])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << object(stream_entry.target) if stream_entry.targeted?
 | 
					    entry << object(stream_entry.target) if stream_entry.targeted?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -88,7 +88,7 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(stream_entry.status))
 | 
					    append_element(entry, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(stream_entry.status))
 | 
				
			||||||
    append_element(entry, 'link', nil, rel: :self, type: 'application/atom+xml', href: account_stream_entry_url(stream_entry.account, stream_entry, format: 'atom'))
 | 
					    append_element(entry, 'link', nil, rel: :self, type: 'application/atom+xml', href: account_stream_entry_url(stream_entry.account, stream_entry, format: 'atom'))
 | 
				
			||||||
    append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(stream_entry.thread), href: TagManager.instance.url_for(stream_entry.thread)) if stream_entry.threaded?
 | 
					    append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(stream_entry.thread), href: TagManager.instance.url_for(stream_entry.thread)) if stream_entry.threaded?
 | 
				
			||||||
    append_element(entry, 'ostatus:conversation', nil, ref: conversation_uri(stream_entry.status.conversation)) unless stream_entry&.status&.conversation_id.nil?
 | 
					    append_element(entry, 'ostatus:conversation', nil, ref: conversation_uri(stream_entry.status.conversation)) unless stream_entry&.status&.conversation_id.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry
 | 
					    entry
 | 
				
			||||||
@ -97,20 +97,20 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
  def object(status)
 | 
					  def object(status)
 | 
				
			||||||
    object = Ox::Element.new('activity:object')
 | 
					    object = Ox::Element.new('activity:object')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(object, 'id', TagManager.instance.uri_for(status))
 | 
					    append_element(object, 'id', OStatus::TagManager.instance.uri_for(status))
 | 
				
			||||||
    append_element(object, 'published', status.created_at.iso8601)
 | 
					    append_element(object, 'published', status.created_at.iso8601)
 | 
				
			||||||
    append_element(object, 'updated', status.updated_at.iso8601)
 | 
					    append_element(object, 'updated', status.updated_at.iso8601)
 | 
				
			||||||
    append_element(object, 'title', status.title)
 | 
					    append_element(object, 'title', status.title)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object << author(status.account)
 | 
					    object << author(status.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(object, 'activity:object-type', TagManager::TYPES[status.object_type])
 | 
					    append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[status.object_type])
 | 
				
			||||||
    append_element(object, 'activity:verb', TagManager::VERBS[status.verb])
 | 
					    append_element(object, 'activity:verb', OStatus::TagManager::VERBS[status.verb])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    serialize_status_attributes(object, status)
 | 
					    serialize_status_attributes(object, status)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(object, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(status))
 | 
					    append_element(object, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(status))
 | 
				
			||||||
    append_element(object, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(status.thread), href: TagManager.instance.url_for(status.thread)) unless status.thread.nil?
 | 
					    append_element(object, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(status.thread), href: TagManager.instance.url_for(status.thread)) unless status.thread.nil?
 | 
				
			||||||
    append_element(object, 'ostatus:conversation', nil, ref: conversation_uri(status.conversation)) unless status.conversation_id.nil?
 | 
					    append_element(object, 'ostatus:conversation', nil, ref: conversation_uri(status.conversation)) unless status.conversation_id.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object
 | 
					    object
 | 
				
			||||||
@ -122,14 +122,14 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    description = "#{follow.account.acct} started following #{follow.target_account.acct}"
 | 
					    description = "#{follow.account.acct} started following #{follow.target_account.acct}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(follow.created_at, follow.id, 'Follow'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(follow.created_at, follow.id, 'Follow'))
 | 
				
			||||||
    append_element(entry, 'title', description)
 | 
					    append_element(entry, 'title', description)
 | 
				
			||||||
    append_element(entry, 'content', description, type: :html)
 | 
					    append_element(entry, 'content', description, type: :html)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(follow.account)
 | 
					    entry << author(follow.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:follow])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:follow])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object = author(follow.target_account)
 | 
					    object = author(follow.target_account)
 | 
				
			||||||
    object.value = 'activity:object'
 | 
					    object.value = 'activity:object'
 | 
				
			||||||
@ -142,13 +142,13 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
    entry = Ox::Element.new('entry')
 | 
					    entry = Ox::Element.new('entry')
 | 
				
			||||||
    add_namespaces(entry)
 | 
					    add_namespaces(entry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(follow_request.created_at, follow_request.id, 'FollowRequest'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(follow_request.created_at, follow_request.id, 'FollowRequest'))
 | 
				
			||||||
    append_element(entry, 'title', "#{follow_request.account.acct} requested to follow #{follow_request.target_account.acct}")
 | 
					    append_element(entry, 'title', "#{follow_request.account.acct} requested to follow #{follow_request.target_account.acct}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(follow_request.account)
 | 
					    entry << author(follow_request.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:request_friend])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:request_friend])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object = author(follow_request.target_account)
 | 
					    object = author(follow_request.target_account)
 | 
				
			||||||
    object.value = 'activity:object'
 | 
					    object.value = 'activity:object'
 | 
				
			||||||
@ -161,19 +161,19 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
    entry = Ox::Element.new('entry')
 | 
					    entry = Ox::Element.new('entry')
 | 
				
			||||||
    add_namespaces(entry)
 | 
					    add_namespaces(entry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
 | 
				
			||||||
    append_element(entry, 'title', "#{follow_request.target_account.acct} authorizes follow request by #{follow_request.account.acct}")
 | 
					    append_element(entry, 'title', "#{follow_request.target_account.acct} authorizes follow request by #{follow_request.account.acct}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(follow_request.target_account)
 | 
					    entry << author(follow_request.target_account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:authorize])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:authorize])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object = Ox::Element.new('activity:object')
 | 
					    object = Ox::Element.new('activity:object')
 | 
				
			||||||
    object << author(follow_request.account)
 | 
					    object << author(follow_request.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(object, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(object, 'activity:verb', TagManager::VERBS[:request_friend])
 | 
					    append_element(object, 'activity:verb', OStatus::TagManager::VERBS[:request_friend])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inner_object = author(follow_request.target_account)
 | 
					    inner_object = author(follow_request.target_account)
 | 
				
			||||||
    inner_object.value = 'activity:object'
 | 
					    inner_object.value = 'activity:object'
 | 
				
			||||||
@ -187,19 +187,19 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
    entry = Ox::Element.new('entry')
 | 
					    entry = Ox::Element.new('entry')
 | 
				
			||||||
    add_namespaces(entry)
 | 
					    add_namespaces(entry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
 | 
				
			||||||
    append_element(entry, 'title', "#{follow_request.target_account.acct} rejects follow request by #{follow_request.account.acct}")
 | 
					    append_element(entry, 'title', "#{follow_request.target_account.acct} rejects follow request by #{follow_request.account.acct}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(follow_request.target_account)
 | 
					    entry << author(follow_request.target_account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:reject])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:reject])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object = Ox::Element.new('activity:object')
 | 
					    object = Ox::Element.new('activity:object')
 | 
				
			||||||
    object << author(follow_request.account)
 | 
					    object << author(follow_request.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(object, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(object, 'activity:verb', TagManager::VERBS[:request_friend])
 | 
					    append_element(object, 'activity:verb', OStatus::TagManager::VERBS[:request_friend])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inner_object = author(follow_request.target_account)
 | 
					    inner_object = author(follow_request.target_account)
 | 
				
			||||||
    inner_object.value = 'activity:object'
 | 
					    inner_object.value = 'activity:object'
 | 
				
			||||||
@ -215,14 +215,14 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    description = "#{follow.account.acct} is no longer following #{follow.target_account.acct}"
 | 
					    description = "#{follow.account.acct} is no longer following #{follow.target_account.acct}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow.id, 'Follow'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow.id, 'Follow'))
 | 
				
			||||||
    append_element(entry, 'title', description)
 | 
					    append_element(entry, 'title', description)
 | 
				
			||||||
    append_element(entry, 'content', description, type: :html)
 | 
					    append_element(entry, 'content', description, type: :html)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(follow.account)
 | 
					    entry << author(follow.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:unfollow])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unfollow])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object = author(follow.target_account)
 | 
					    object = author(follow.target_account)
 | 
				
			||||||
    object.value = 'activity:object'
 | 
					    object.value = 'activity:object'
 | 
				
			||||||
@ -237,13 +237,13 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    description = "#{block.account.acct} no longer wishes to interact with #{block.target_account.acct}"
 | 
					    description = "#{block.account.acct} no longer wishes to interact with #{block.target_account.acct}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
 | 
				
			||||||
    append_element(entry, 'title', description)
 | 
					    append_element(entry, 'title', description)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(block.account)
 | 
					    entry << author(block.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:block])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:block])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object = author(block.target_account)
 | 
					    object = author(block.target_account)
 | 
				
			||||||
    object.value = 'activity:object'
 | 
					    object.value = 'activity:object'
 | 
				
			||||||
@ -258,13 +258,13 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    description = "#{block.account.acct} no longer blocks #{block.target_account.acct}"
 | 
					    description = "#{block.account.acct} no longer blocks #{block.target_account.acct}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
 | 
				
			||||||
    append_element(entry, 'title', description)
 | 
					    append_element(entry, 'title', description)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(block.account)
 | 
					    entry << author(block.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:unblock])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unblock])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object = author(block.target_account)
 | 
					    object = author(block.target_account)
 | 
				
			||||||
    object.value = 'activity:object'
 | 
					    object.value = 'activity:object'
 | 
				
			||||||
@ -279,18 +279,18 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    description = "#{favourite.account.acct} favourited a status by #{favourite.status.account.acct}"
 | 
					    description = "#{favourite.account.acct} favourited a status by #{favourite.status.account.acct}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(favourite.created_at, favourite.id, 'Favourite'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(favourite.created_at, favourite.id, 'Favourite'))
 | 
				
			||||||
    append_element(entry, 'title', description)
 | 
					    append_element(entry, 'title', description)
 | 
				
			||||||
    append_element(entry, 'content', description, type: :html)
 | 
					    append_element(entry, 'content', description, type: :html)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(favourite.account)
 | 
					    entry << author(favourite.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:favorite])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:favorite])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << object(favourite.status)
 | 
					    entry << object(favourite.status)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
 | 
					    append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry
 | 
					    entry
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -301,18 +301,18 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    description = "#{favourite.account.acct} no longer favourites a status by #{favourite.status.account.acct}"
 | 
					    description = "#{favourite.account.acct} no longer favourites a status by #{favourite.status.account.acct}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, favourite.id, 'Favourite'))
 | 
					    append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, favourite.id, 'Favourite'))
 | 
				
			||||||
    append_element(entry, 'title', description)
 | 
					    append_element(entry, 'title', description)
 | 
				
			||||||
    append_element(entry, 'content', description, type: :html)
 | 
					    append_element(entry, 'content', description, type: :html)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << author(favourite.account)
 | 
					    entry << author(favourite.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
 | 
					    append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
 | 
				
			||||||
    append_element(entry, 'activity:verb', TagManager::VERBS[:unfavorite])
 | 
					    append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unfavorite])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry << object(favourite.status)
 | 
					    entry << object(favourite.status)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
 | 
					    append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entry
 | 
					    entry
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -332,17 +332,17 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  def conversation_uri(conversation)
 | 
					  def conversation_uri(conversation)
 | 
				
			||||||
    return conversation.uri if conversation.uri?
 | 
					    return conversation.uri if conversation.uri?
 | 
				
			||||||
    TagManager.instance.unique_tag(conversation.created_at, conversation.id, 'Conversation')
 | 
					    OStatus::TagManager.instance.unique_tag(conversation.created_at, conversation.id, 'Conversation')
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def add_namespaces(parent)
 | 
					  def add_namespaces(parent)
 | 
				
			||||||
    parent['xmlns']          = TagManager::XMLNS
 | 
					    parent['xmlns']          = OStatus::TagManager::XMLNS
 | 
				
			||||||
    parent['xmlns:thr']      = TagManager::THR_XMLNS
 | 
					    parent['xmlns:thr']      = OStatus::TagManager::THR_XMLNS
 | 
				
			||||||
    parent['xmlns:activity'] = TagManager::AS_XMLNS
 | 
					    parent['xmlns:activity'] = OStatus::TagManager::AS_XMLNS
 | 
				
			||||||
    parent['xmlns:poco']     = TagManager::POCO_XMLNS
 | 
					    parent['xmlns:poco']     = OStatus::TagManager::POCO_XMLNS
 | 
				
			||||||
    parent['xmlns:media']    = TagManager::MEDIA_XMLNS
 | 
					    parent['xmlns:media']    = OStatus::TagManager::MEDIA_XMLNS
 | 
				
			||||||
    parent['xmlns:ostatus']  = TagManager::OS_XMLNS
 | 
					    parent['xmlns:ostatus']  = OStatus::TagManager::OS_XMLNS
 | 
				
			||||||
    parent['xmlns:mastodon'] = TagManager::MTDN_XMLNS
 | 
					    parent['xmlns:mastodon'] = OStatus::TagManager::MTDN_XMLNS
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def serialize_status_attributes(entry, status)
 | 
					  def serialize_status_attributes(entry, status)
 | 
				
			||||||
@ -352,10 +352,10 @@ class OStatus::AtomSerializer
 | 
				
			|||||||
    append_element(entry, 'content', Formatter.instance.format(status).to_str, type: 'html', 'xml:lang': status.language)
 | 
					    append_element(entry, 'content', Formatter.instance.format(status).to_str, type: 'html', 'xml:lang': status.language)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    status.mentions.each do |mentioned|
 | 
					    status.mentions.each do |mentioned|
 | 
				
			||||||
      append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': TagManager::TYPES[:person], href: TagManager.instance.uri_for(mentioned.account))
 | 
					      append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:person], href: OStatus::TagManager.instance.uri_for(mentioned.account))
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': TagManager::TYPES[:collection], href: TagManager::COLLECTIONS[:public]) if status.public_visibility?
 | 
					    append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:collection], href: OStatus::TagManager::COLLECTIONS[:public]) if status.public_visibility?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    status.tags.each do |tag|
 | 
					    status.tags.each do |tag|
 | 
				
			||||||
      append_element(entry, 'category', nil, term: tag.name)
 | 
					      append_element(entry, 'category', nil, term: tag.name)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										73
									
								
								app/lib/ostatus/tag_manager.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								app/lib/ostatus/tag_manager.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OStatus::TagManager
 | 
				
			||||||
 | 
					  include Singleton
 | 
				
			||||||
 | 
					  include RoutingHelper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  VERBS = {
 | 
				
			||||||
 | 
					    post:           'http://activitystrea.ms/schema/1.0/post',
 | 
				
			||||||
 | 
					    share:          'http://activitystrea.ms/schema/1.0/share',
 | 
				
			||||||
 | 
					    favorite:       'http://activitystrea.ms/schema/1.0/favorite',
 | 
				
			||||||
 | 
					    unfavorite:     'http://activitystrea.ms/schema/1.0/unfavorite',
 | 
				
			||||||
 | 
					    delete:         'http://activitystrea.ms/schema/1.0/delete',
 | 
				
			||||||
 | 
					    follow:         'http://activitystrea.ms/schema/1.0/follow',
 | 
				
			||||||
 | 
					    request_friend: 'http://activitystrea.ms/schema/1.0/request-friend',
 | 
				
			||||||
 | 
					    authorize:      'http://activitystrea.ms/schema/1.0/authorize',
 | 
				
			||||||
 | 
					    reject:         'http://activitystrea.ms/schema/1.0/reject',
 | 
				
			||||||
 | 
					    unfollow:       'http://ostatus.org/schema/1.0/unfollow',
 | 
				
			||||||
 | 
					    block:          'http://mastodon.social/schema/1.0/block',
 | 
				
			||||||
 | 
					    unblock:        'http://mastodon.social/schema/1.0/unblock',
 | 
				
			||||||
 | 
					  }.freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TYPES = {
 | 
				
			||||||
 | 
					    activity:   'http://activitystrea.ms/schema/1.0/activity',
 | 
				
			||||||
 | 
					    note:       'http://activitystrea.ms/schema/1.0/note',
 | 
				
			||||||
 | 
					    comment:    'http://activitystrea.ms/schema/1.0/comment',
 | 
				
			||||||
 | 
					    person:     'http://activitystrea.ms/schema/1.0/person',
 | 
				
			||||||
 | 
					    collection: 'http://activitystrea.ms/schema/1.0/collection',
 | 
				
			||||||
 | 
					    group:      'http://activitystrea.ms/schema/1.0/group',
 | 
				
			||||||
 | 
					  }.freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  COLLECTIONS = {
 | 
				
			||||||
 | 
					    public: 'http://activityschema.org/collection/public',
 | 
				
			||||||
 | 
					  }.freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  XMLNS       = 'http://www.w3.org/2005/Atom'
 | 
				
			||||||
 | 
					  MEDIA_XMLNS = 'http://purl.org/syndication/atommedia'
 | 
				
			||||||
 | 
					  AS_XMLNS    = 'http://activitystrea.ms/spec/1.0/'
 | 
				
			||||||
 | 
					  THR_XMLNS   = 'http://purl.org/syndication/thread/1.0'
 | 
				
			||||||
 | 
					  POCO_XMLNS  = 'http://portablecontacts.net/spec/1.0'
 | 
				
			||||||
 | 
					  DFRN_XMLNS  = 'http://purl.org/macgirvin/dfrn/1.0'
 | 
				
			||||||
 | 
					  OS_XMLNS    = 'http://ostatus.org/schema/1.0'
 | 
				
			||||||
 | 
					  MTDN_XMLNS  = 'http://mastodon.social/schema/1.0'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def unique_tag(date, id, type)
 | 
				
			||||||
 | 
					    "tag:#{Rails.configuration.x.local_domain},#{date.strftime('%Y-%m-%d')}:objectId=#{id}:objectType=#{type}"
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def unique_tag_to_local_id(tag, expected_type)
 | 
				
			||||||
 | 
					    return nil unless local_id?(tag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ActivityPub::TagManager.instance.local_uri?(tag)
 | 
				
			||||||
 | 
					      ActivityPub::TagManager.instance.uri_to_local_id(tag)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      matches = Regexp.new("objectId=([\\d]+):objectType=#{expected_type}").match(tag)
 | 
				
			||||||
 | 
					      return matches[1] unless matches.nil?
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def local_id?(id)
 | 
				
			||||||
 | 
					    id.start_with?("tag:#{Rails.configuration.x.local_domain}") || ActivityPub::TagManager.instance.local_uri?(id)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def uri_for(target)
 | 
				
			||||||
 | 
					    return target.uri if target.respond_to?(:local?) && !target.local?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case target.object_type
 | 
				
			||||||
 | 
					    when :person
 | 
				
			||||||
 | 
					      account_url(target)
 | 
				
			||||||
 | 
					    when :note, :comment, :activity
 | 
				
			||||||
 | 
					      target.uri || unique_tag(target.created_at, target.id, 'Status')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -6,62 +6,6 @@ class TagManager
 | 
				
			|||||||
  include Singleton
 | 
					  include Singleton
 | 
				
			||||||
  include RoutingHelper
 | 
					  include RoutingHelper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  VERBS = {
 | 
					 | 
				
			||||||
    post:           'http://activitystrea.ms/schema/1.0/post',
 | 
					 | 
				
			||||||
    share:          'http://activitystrea.ms/schema/1.0/share',
 | 
					 | 
				
			||||||
    favorite:       'http://activitystrea.ms/schema/1.0/favorite',
 | 
					 | 
				
			||||||
    unfavorite:     'http://activitystrea.ms/schema/1.0/unfavorite',
 | 
					 | 
				
			||||||
    delete:         'http://activitystrea.ms/schema/1.0/delete',
 | 
					 | 
				
			||||||
    follow:         'http://activitystrea.ms/schema/1.0/follow',
 | 
					 | 
				
			||||||
    request_friend: 'http://activitystrea.ms/schema/1.0/request-friend',
 | 
					 | 
				
			||||||
    authorize:      'http://activitystrea.ms/schema/1.0/authorize',
 | 
					 | 
				
			||||||
    reject:         'http://activitystrea.ms/schema/1.0/reject',
 | 
					 | 
				
			||||||
    unfollow:       'http://ostatus.org/schema/1.0/unfollow',
 | 
					 | 
				
			||||||
    block:          'http://mastodon.social/schema/1.0/block',
 | 
					 | 
				
			||||||
    unblock:        'http://mastodon.social/schema/1.0/unblock',
 | 
					 | 
				
			||||||
  }.freeze
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TYPES = {
 | 
					 | 
				
			||||||
    activity:   'http://activitystrea.ms/schema/1.0/activity',
 | 
					 | 
				
			||||||
    note:       'http://activitystrea.ms/schema/1.0/note',
 | 
					 | 
				
			||||||
    comment:    'http://activitystrea.ms/schema/1.0/comment',
 | 
					 | 
				
			||||||
    person:     'http://activitystrea.ms/schema/1.0/person',
 | 
					 | 
				
			||||||
    collection: 'http://activitystrea.ms/schema/1.0/collection',
 | 
					 | 
				
			||||||
    group:      'http://activitystrea.ms/schema/1.0/group',
 | 
					 | 
				
			||||||
  }.freeze
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  COLLECTIONS = {
 | 
					 | 
				
			||||||
    public: 'http://activityschema.org/collection/public',
 | 
					 | 
				
			||||||
  }.freeze
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  XMLNS       = 'http://www.w3.org/2005/Atom'
 | 
					 | 
				
			||||||
  MEDIA_XMLNS = 'http://purl.org/syndication/atommedia'
 | 
					 | 
				
			||||||
  AS_XMLNS    = 'http://activitystrea.ms/spec/1.0/'
 | 
					 | 
				
			||||||
  THR_XMLNS   = 'http://purl.org/syndication/thread/1.0'
 | 
					 | 
				
			||||||
  POCO_XMLNS  = 'http://portablecontacts.net/spec/1.0'
 | 
					 | 
				
			||||||
  DFRN_XMLNS  = 'http://purl.org/macgirvin/dfrn/1.0'
 | 
					 | 
				
			||||||
  OS_XMLNS    = 'http://ostatus.org/schema/1.0'
 | 
					 | 
				
			||||||
  MTDN_XMLNS  = 'http://mastodon.social/schema/1.0'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def unique_tag(date, id, type)
 | 
					 | 
				
			||||||
    "tag:#{Rails.configuration.x.local_domain},#{date.strftime('%Y-%m-%d')}:objectId=#{id}:objectType=#{type}"
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def unique_tag_to_local_id(tag, expected_type)
 | 
					 | 
				
			||||||
    return nil unless local_id?(tag)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ActivityPub::TagManager.instance.local_uri?(tag)
 | 
					 | 
				
			||||||
      ActivityPub::TagManager.instance.uri_to_local_id(tag)
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      matches = Regexp.new("objectId=([\\d]+):objectType=#{expected_type}").match(tag)
 | 
					 | 
				
			||||||
      return matches[1] unless matches.nil?
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def local_id?(id)
 | 
					 | 
				
			||||||
    id.start_with?("tag:#{Rails.configuration.x.local_domain}") || ActivityPub::TagManager.instance.local_uri?(id)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def web_domain?(domain)
 | 
					  def web_domain?(domain)
 | 
				
			||||||
    domain.nil? || domain.gsub(/[\/]/, '').casecmp(Rails.configuration.x.web_domain).zero?
 | 
					    domain.nil? || domain.gsub(/[\/]/, '').casecmp(Rails.configuration.x.web_domain).zero?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -90,17 +34,6 @@ class TagManager
 | 
				
			|||||||
    TagManager.instance.web_domain?(domain)
 | 
					    TagManager.instance.web_domain?(domain)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def uri_for(target)
 | 
					 | 
				
			||||||
    return target.uri if target.respond_to?(:local?) && !target.local?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    case target.object_type
 | 
					 | 
				
			||||||
    when :person
 | 
					 | 
				
			||||||
      account_url(target)
 | 
					 | 
				
			||||||
    when :note, :comment, :activity
 | 
					 | 
				
			||||||
      target.uri || unique_tag(target.created_at, target.id, 'Status')
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def url_for(target)
 | 
					  def url_for(target)
 | 
				
			||||||
    return target.url if target.respond_to?(:local?) && !target.local?
 | 
					    return target.url if target.respond_to?(:local?) && !target.local?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -10,11 +10,11 @@ class RemoteProfile
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def root
 | 
					  def root
 | 
				
			||||||
    @root ||= document.at_xpath('/atom:feed|/atom:entry', atom: TagManager::XMLNS)
 | 
					    @root ||= document.at_xpath('/atom:feed|/atom:entry', atom: OStatus::TagManager::XMLNS)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def author
 | 
					  def author
 | 
				
			||||||
    @author ||= root.at_xpath('./atom:author|./dfrn:owner', atom: TagManager::XMLNS, dfrn: TagManager::DFRN_XMLNS)
 | 
					    @author ||= root.at_xpath('./atom:author|./dfrn:owner', atom: OStatus::TagManager::XMLNS, dfrn: OStatus::TagManager::DFRN_XMLNS)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def hub_link
 | 
					  def hub_link
 | 
				
			||||||
@ -22,15 +22,15 @@ class RemoteProfile
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def display_name
 | 
					  def display_name
 | 
				
			||||||
    @display_name ||= author.at_xpath('./poco:displayName', poco: TagManager::POCO_XMLNS)&.content
 | 
					    @display_name ||= author.at_xpath('./poco:displayName', poco: OStatus::TagManager::POCO_XMLNS)&.content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def note
 | 
					  def note
 | 
				
			||||||
    @note ||= author.at_xpath('./atom:summary|./poco:note', atom: TagManager::XMLNS, poco: TagManager::POCO_XMLNS)&.content
 | 
					    @note ||= author.at_xpath('./atom:summary|./poco:note', atom: OStatus::TagManager::XMLNS, poco: OStatus::TagManager::POCO_XMLNS)&.content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def scope
 | 
					  def scope
 | 
				
			||||||
    @scope ||= author.at_xpath('./mastodon:scope', mastodon: TagManager::MTDN_XMLNS)&.content
 | 
					    @scope ||= author.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def avatar
 | 
					  def avatar
 | 
				
			||||||
@ -48,6 +48,6 @@ class RemoteProfile
 | 
				
			|||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def link_href_from_xml(xml, type)
 | 
					  def link_href_from_xml(xml, type)
 | 
				
			||||||
    xml.at_xpath(%(./atom:link[@rel="#{type}"]/@href), atom: TagManager::XMLNS)&.content
 | 
					    xml.at_xpath(%(./atom:link[@rel="#{type}"]/@href), atom: OStatus::TagManager::XMLNS)&.content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ class ActivityPub::DeleteSerializer < ActiveModel::Serializer
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def atom_uri
 | 
					    def atom_uri
 | 
				
			||||||
      ::TagManager.instance.uri_for(object)
 | 
					      OStatus::TagManager.instance.uri_for(object)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -63,13 +63,13 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
 | 
				
			|||||||
  def atom_uri
 | 
					  def atom_uri
 | 
				
			||||||
    return unless object.local?
 | 
					    return unless object.local?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ::TagManager.instance.uri_for(object)
 | 
					    OStatus::TagManager.instance.uri_for(object)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def in_reply_to_atom_uri
 | 
					  def in_reply_to_atom_uri
 | 
				
			||||||
    return unless object.reply? && !object.thread.nil?
 | 
					    return unless object.reply? && !object.thread.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ::TagManager.instance.uri_for(object.thread)
 | 
					    OStatus::TagManager.instance.uri_for(object.thread)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def conversation
 | 
					  def conversation
 | 
				
			||||||
@ -78,7 +78,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
 | 
				
			|||||||
    if object.conversation.uri?
 | 
					    if object.conversation.uri?
 | 
				
			||||||
      object.conversation.uri
 | 
					      object.conversation.uri
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      TagManager.instance.unique_tag(object.conversation.created_at, object.conversation.id, 'Conversation')
 | 
					      OStatus::TagManager.instance.unique_tag(object.conversation.created_at, object.conversation.id, 'Conversation')
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def uri
 | 
					  def uri
 | 
				
			||||||
    TagManager.instance.uri_for(object)
 | 
					    OStatus::TagManager.instance.uri_for(object)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def content
 | 
					  def content
 | 
				
			||||||
 | 
				
			|||||||
@ -5,12 +5,12 @@ module AuthorExtractor
 | 
				
			|||||||
    return nil if xml.nil?
 | 
					    return nil if xml.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Try <email> for acct
 | 
					    # Try <email> for acct
 | 
				
			||||||
    acct = xml.at_xpath('./xmlns:author/xmlns:email', xmlns: TagManager::XMLNS)&.content
 | 
					    acct = xml.at_xpath('./xmlns:author/xmlns:email', xmlns: OStatus::TagManager::XMLNS)&.content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Try <name> + <uri>
 | 
					    # Try <name> + <uri>
 | 
				
			||||||
    if acct.blank?
 | 
					    if acct.blank?
 | 
				
			||||||
      username = xml.at_xpath('./xmlns:author/xmlns:name', xmlns: TagManager::XMLNS)&.content
 | 
					      username = xml.at_xpath('./xmlns:author/xmlns:name', xmlns: OStatus::TagManager::XMLNS)&.content
 | 
				
			||||||
      uri      = xml.at_xpath('./xmlns:author/xmlns:uri', xmlns: TagManager::XMLNS)&.content
 | 
					      uri      = xml.at_xpath('./xmlns:author/xmlns:uri', xmlns: OStatus::TagManager::XMLNS)&.content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return nil if username.blank? || uri.blank?
 | 
					      return nil if username.blank? || uri.blank?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -25,7 +25,7 @@ class FetchRemoteAccountService < BaseService
 | 
				
			|||||||
    xml = Nokogiri::XML(body)
 | 
					    xml = Nokogiri::XML(body)
 | 
				
			||||||
    xml.encoding = 'utf-8'
 | 
					    xml.encoding = 'utf-8'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    account = author_from_xml(xml.at_xpath('/xmlns:feed', xmlns: TagManager::XMLNS), false)
 | 
					    account = author_from_xml(xml.at_xpath('/xmlns:feed', xmlns: OStatus::TagManager::XMLNS), false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    UpdateRemoteProfileService.new.call(xml, account) unless account.nil?
 | 
					    UpdateRemoteProfileService.new.call(xml, account) unless account.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@ class FetchRemoteStatusService < BaseService
 | 
				
			|||||||
    xml = Nokogiri::XML(body)
 | 
					    xml = Nokogiri::XML(body)
 | 
				
			||||||
    xml.encoding = 'utf-8'
 | 
					    xml.encoding = 'utf-8'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS))
 | 
					    account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: OStatus::TagManager::XMLNS))
 | 
				
			||||||
    domain  = Addressable::URI.parse(url).normalized_host
 | 
					    domain  = Addressable::URI.parse(url).normalized_host
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return nil unless !account.nil? && confirmed_domain?(domain, account)
 | 
					    return nil unless !account.nil? && confirmed_domain?(domain, account)
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,7 @@ class ProcessFeedService < BaseService
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def process_entries(xml, account)
 | 
					  def process_entries(xml, account)
 | 
				
			||||||
    xml.xpath('//xmlns:entry', xmlns: TagManager::XMLNS).reverse_each.map { |entry| process_entry(entry, account) }.compact
 | 
					    xml.xpath('//xmlns:entry', xmlns: OStatus::TagManager::XMLNS).reverse_each.map { |entry| process_entry(entry, account) }.compact
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def process_entry(xml, account)
 | 
					  def process_entry(xml, account)
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ class ProcessInteractionService < BaseService
 | 
				
			|||||||
    xml = Nokogiri::XML(body)
 | 
					    xml = Nokogiri::XML(body)
 | 
				
			||||||
    xml.encoding = 'utf-8'
 | 
					    xml.encoding = 'utf-8'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS))
 | 
					    account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: OStatus::TagManager::XMLNS))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return if account.nil? || account.suspended?
 | 
					    return if account.nil? || account.suspended?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -54,13 +54,13 @@ class ProcessInteractionService < BaseService
 | 
				
			|||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def mentions_account?(xml, account)
 | 
					  def mentions_account?(xml, account)
 | 
				
			||||||
    xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]', xmlns: TagManager::XMLNS).each { |mention_link| return true if [TagManager.instance.uri_for(account), TagManager.instance.url_for(account)].include?(mention_link.attribute('href').value) }
 | 
					    xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]', xmlns: OStatus::TagManager::XMLNS).each { |mention_link| return true if [OStatus::TagManager.instance.uri_for(account), OStatus::TagManager.instance.url_for(account)].include?(mention_link.attribute('href').value) }
 | 
				
			||||||
    false
 | 
					    false
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def verb(xml)
 | 
					  def verb(xml)
 | 
				
			||||||
    raw = xml.at_xpath('//activity:verb', activity: TagManager::AS_XMLNS).content
 | 
					    raw = xml.at_xpath('//activity:verb', activity: OStatus::TagManager::AS_XMLNS).content
 | 
				
			||||||
    TagManager::VERBS.key(raw)
 | 
					    OStatus::TagManager::VERBS.key(raw)
 | 
				
			||||||
  rescue
 | 
					  rescue
 | 
				
			||||||
    :post
 | 
					    :post
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -104,7 +104,7 @@ class ProcessInteractionService < BaseService
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def delete_post!(xml, account)
 | 
					  def delete_post!(xml, account)
 | 
				
			||||||
    status = Status.find(xml.at_xpath('//xmlns:id', xmlns: TagManager::XMLNS).content)
 | 
					    status = Status.find(xml.at_xpath('//xmlns:id', xmlns: OStatus::TagManager::XMLNS).content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return if status.nil?
 | 
					    return if status.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -137,12 +137,12 @@ class ProcessInteractionService < BaseService
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  def status(xml)
 | 
					  def status(xml)
 | 
				
			||||||
    uri = activity_id(xml)
 | 
					    uri = activity_id(xml)
 | 
				
			||||||
    return nil unless TagManager.instance.local_id?(uri)
 | 
					    return nil unless OStatus::TagManager.instance.local_id?(uri)
 | 
				
			||||||
    Status.find(TagManager.instance.unique_tag_to_local_id(uri, 'Status'))
 | 
					    Status.find(OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Status'))
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def activity_id(xml)
 | 
					  def activity_id(xml)
 | 
				
			||||||
    xml.at_xpath('//activity:object', activity: TagManager::AS_XMLNS).at_xpath('./xmlns:id', xmlns: TagManager::XMLNS).content
 | 
					    xml.at_xpath('//activity:object', activity: OStatus::TagManager::AS_XMLNS).at_xpath('./xmlns:id', xmlns: OStatus::TagManager::XMLNS).content
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def salmon
 | 
					  def salmon
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ class VerifySalmonService < BaseService
 | 
				
			|||||||
    xml = Nokogiri::XML(body)
 | 
					    xml = Nokogiri::XML(body)
 | 
				
			||||||
    xml.encoding = 'utf-8'
 | 
					    xml.encoding = 'utf-8'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS))
 | 
					    account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: OStatus::TagManager::XMLNS))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if account.nil?
 | 
					    if account.nil?
 | 
				
			||||||
      false
 | 
					      false
 | 
				
			||||||
 | 
				
			|||||||
@ -108,7 +108,7 @@ RSpec.describe ActivityPub::TagManager do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    it 'returns the local status for OStatus tag: URI' do
 | 
					    it 'returns the local status for OStatus tag: URI' do
 | 
				
			||||||
      status = Fabricate(:status)
 | 
					      status = Fabricate(:status)
 | 
				
			||||||
      expect(subject.uri_to_resource(::TagManager.instance.uri_for(status), Status)).to eq status
 | 
					      expect(subject.uri_to_resource(OStatus::TagManager.instance.uri_for(status), Status)).to eq status
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'returns the local status for OStatus StreamEntry URL' do
 | 
					    it 'returns the local status for OStatus StreamEntry URL' do
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      follow_request_salmon = serialize(follow_request)
 | 
					      follow_request_salmon = serialize(follow_request)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = follow_request_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = follow_request_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:activity]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:activity]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with request_friend type' do
 | 
					    it 'appends activity:verb element with request_friend type' do
 | 
				
			||||||
@ -26,7 +26,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      follow_request_salmon = serialize(follow_request)
 | 
					      follow_request_salmon = serialize(follow_request)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = follow_request_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = follow_request_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:request_friend]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:request_friend]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object with target account' do
 | 
					    it 'appends activity:object with target account' do
 | 
				
			||||||
@ -44,13 +44,13 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
    it 'adds namespaces' do
 | 
					    it 'adds namespaces' do
 | 
				
			||||||
      element = serialize
 | 
					      element = serialize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(element['xmlns']).to eq TagManager::XMLNS
 | 
					      expect(element['xmlns']).to eq OStatus::TagManager::XMLNS
 | 
				
			||||||
      expect(element['xmlns:thr']).to eq TagManager::THR_XMLNS
 | 
					      expect(element['xmlns:thr']).to eq OStatus::TagManager::THR_XMLNS
 | 
				
			||||||
      expect(element['xmlns:activity']).to eq TagManager::AS_XMLNS
 | 
					      expect(element['xmlns:activity']).to eq OStatus::TagManager::AS_XMLNS
 | 
				
			||||||
      expect(element['xmlns:poco']).to eq TagManager::POCO_XMLNS
 | 
					      expect(element['xmlns:poco']).to eq OStatus::TagManager::POCO_XMLNS
 | 
				
			||||||
      expect(element['xmlns:media']).to eq TagManager::MEDIA_XMLNS
 | 
					      expect(element['xmlns:media']).to eq OStatus::TagManager::MEDIA_XMLNS
 | 
				
			||||||
      expect(element['xmlns:ostatus']).to eq TagManager::OS_XMLNS
 | 
					      expect(element['xmlns:ostatus']).to eq OStatus::TagManager::OS_XMLNS
 | 
				
			||||||
      expect(element['xmlns:mastodon']).to eq TagManager::MTDN_XMLNS
 | 
					      expect(element['xmlns:mastodon']).to eq OStatus::TagManager::MTDN_XMLNS
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -98,7 +98,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      mentioned = element.nodes.find do |node|
 | 
					      mentioned = element.nodes.find do |node|
 | 
				
			||||||
        node.name == 'link' &&
 | 
					        node.name == 'link' &&
 | 
				
			||||||
          node[:rel] == 'mentioned' &&
 | 
					          node[:rel] == 'mentioned' &&
 | 
				
			||||||
          node['ostatus:object-type'] == TagManager::TYPES[:person]
 | 
					          node['ostatus:object-type'] == OStatus::TagManager::TYPES[:person]
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(mentioned[:href]).to eq 'https://cb6e6126.ngrok.io/users/username'
 | 
					      expect(mentioned[:href]).to eq 'https://cb6e6126.ngrok.io/users/username'
 | 
				
			||||||
@ -188,7 +188,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      author = OStatus::AtomSerializer.new.author(account)
 | 
					      author = OStatus::AtomSerializer.new.author(account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = author.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = author.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:person]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:person]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends email element with username and domain for local account' do
 | 
					    it 'appends email element with username and domain for local account' do
 | 
				
			||||||
@ -358,9 +358,9 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
        mentioned_person = entry.nodes.find do |node|
 | 
					        mentioned_person = entry.nodes.find do |node|
 | 
				
			||||||
          node.name == 'link' &&
 | 
					          node.name == 'link' &&
 | 
				
			||||||
          node[:rel] == 'mentioned' &&
 | 
					          node[:rel] == 'mentioned' &&
 | 
				
			||||||
          node['ostatus:object-type'] == TagManager::TYPES[:collection]
 | 
					          node['ostatus:object-type'] == OStatus::TagManager::TYPES[:collection]
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        expect(mentioned_person[:href]).to eq TagManager::COLLECTIONS[:public]
 | 
					        expect(mentioned_person[:href]).to eq OStatus::TagManager::COLLECTIONS[:public]
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      it 'does not append link element for the public collection if status is not publicly visible' do
 | 
					      it 'does not append link element for the public collection if status is not publicly visible' do
 | 
				
			||||||
@ -371,8 +371,8 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
        entry.nodes.each do |node|
 | 
					        entry.nodes.each do |node|
 | 
				
			||||||
          if node.name == 'link' &&
 | 
					          if node.name == 'link' &&
 | 
				
			||||||
             node[:rel] == 'mentioned' &&
 | 
					             node[:rel] == 'mentioned' &&
 | 
				
			||||||
             node['ostatus:object-type'] == TagManager::TYPES[:collection]
 | 
					             node['ostatus:object-type'] == OStatus::TagManager::TYPES[:collection]
 | 
				
			||||||
            expect(mentioned_collection[:href]).not_to eq TagManager::COLLECTIONS[:public]
 | 
					            expect(mentioned_collection[:href]).not_to eq OStatus::TagManager::COLLECTIONS[:public]
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
@ -506,7 +506,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      status = Fabricate(:status)
 | 
					      status = Fabricate(:status)
 | 
				
			||||||
      entry = OStatus::AtomSerializer.new.entry(status.stream_entry)
 | 
					      entry = OStatus::AtomSerializer.new.entry(status.stream_entry)
 | 
				
			||||||
      object_type = entry.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = entry.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:note]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:note]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with object type' do
 | 
					    it 'appends activity:verb element with object type' do
 | 
				
			||||||
@ -515,7 +515,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      entry = OStatus::AtomSerializer.new.entry(status.stream_entry)
 | 
					      entry = OStatus::AtomSerializer.new.entry(status.stream_entry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = entry.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      object_type = entry.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::VERBS[:post]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::VERBS[:post]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object element with target if present' do
 | 
					    it 'appends activity:object element with target if present' do
 | 
				
			||||||
@ -739,8 +739,8 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      time_after = Time.now
 | 
					      time_after = Time.now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(block_salmon.id.text).to(
 | 
					      expect(block_salmon.id.text).to(
 | 
				
			||||||
        eq(TagManager.instance.unique_tag(time_before.utc, block.id, 'Block'))
 | 
					        eq(OStatus::TagManager.instance.unique_tag(time_before.utc, block.id, 'Block'))
 | 
				
			||||||
          .or(eq(TagManager.instance.unique_tag(time_after.utc, block.id, 'Block')))
 | 
					          .or(eq(OStatus::TagManager.instance.unique_tag(time_after.utc, block.id, 'Block')))
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -769,7 +769,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      block_salmon = OStatus::AtomSerializer.new.block_salmon(block)
 | 
					      block_salmon = OStatus::AtomSerializer.new.block_salmon(block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = block_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = block_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:activity]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:activity]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with block' do
 | 
					    it 'appends activity:verb element with block' do
 | 
				
			||||||
@ -778,7 +778,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      block_salmon = OStatus::AtomSerializer.new.block_salmon(block)
 | 
					      block_salmon = OStatus::AtomSerializer.new.block_salmon(block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = block_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = block_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:block]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:block]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object element with target account' do
 | 
					    it 'appends activity:object element with target account' do
 | 
				
			||||||
@ -826,8 +826,8 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      time_after = Time.now
 | 
					      time_after = Time.now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(unblock_salmon.id.text).to(
 | 
					      expect(unblock_salmon.id.text).to(
 | 
				
			||||||
        eq(TagManager.instance.unique_tag(time_before.utc, block.id, 'Block'))
 | 
					        eq(OStatus::TagManager.instance.unique_tag(time_before.utc, block.id, 'Block'))
 | 
				
			||||||
          .or(eq(TagManager.instance.unique_tag(time_after.utc, block.id, 'Block')))
 | 
					          .or(eq(OStatus::TagManager.instance.unique_tag(time_after.utc, block.id, 'Block')))
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -856,7 +856,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      unblock_salmon = OStatus::AtomSerializer.new.unblock_salmon(block)
 | 
					      unblock_salmon = OStatus::AtomSerializer.new.unblock_salmon(block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = unblock_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = unblock_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:activity]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:activity]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with block' do
 | 
					    it 'appends activity:verb element with block' do
 | 
				
			||||||
@ -865,7 +865,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      unblock_salmon = OStatus::AtomSerializer.new.unblock_salmon(block)
 | 
					      unblock_salmon = OStatus::AtomSerializer.new.unblock_salmon(block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = unblock_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = unblock_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:unblock]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:unblock]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object element with target account' do
 | 
					    it 'appends activity:object element with target account' do
 | 
				
			||||||
@ -934,7 +934,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      favourite_salmon = OStatus::AtomSerializer.new.favourite_salmon(favourite)
 | 
					      favourite_salmon = OStatus::AtomSerializer.new.favourite_salmon(favourite)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = favourite_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = favourite_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:favorite]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:favorite]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object element with status' do
 | 
					    it 'appends activity:object element with status' do
 | 
				
			||||||
@ -1005,8 +1005,8 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      time_after = Time.now
 | 
					      time_after = Time.now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(unfavourite_salmon.id.text).to(
 | 
					      expect(unfavourite_salmon.id.text).to(
 | 
				
			||||||
        eq(TagManager.instance.unique_tag(time_before.utc, favourite.id, 'Favourite'))
 | 
					        eq(OStatus::TagManager.instance.unique_tag(time_before.utc, favourite.id, 'Favourite'))
 | 
				
			||||||
          .or(eq(TagManager.instance.unique_tag(time_after.utc, favourite.id, 'Favourite')))
 | 
					          .or(eq(OStatus::TagManager.instance.unique_tag(time_after.utc, favourite.id, 'Favourite')))
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1034,7 +1034,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      unfavourite_salmon = OStatus::AtomSerializer.new.unfavourite_salmon(favourite)
 | 
					      unfavourite_salmon = OStatus::AtomSerializer.new.unfavourite_salmon(favourite)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = unfavourite_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = unfavourite_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:unfavorite]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:unfavorite]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object element with status' do
 | 
					    it 'appends activity:object element with status' do
 | 
				
			||||||
@ -1117,7 +1117,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      follow_salmon = OStatus::AtomSerializer.new.follow_salmon(follow)
 | 
					      follow_salmon = OStatus::AtomSerializer.new.follow_salmon(follow)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = follow_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = follow_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:activity]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:activity]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with follow' do
 | 
					    it 'appends activity:verb element with follow' do
 | 
				
			||||||
@ -1126,7 +1126,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      follow_salmon = OStatus::AtomSerializer.new.follow_salmon(follow)
 | 
					      follow_salmon = OStatus::AtomSerializer.new.follow_salmon(follow)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = follow_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = follow_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:follow]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:follow]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object element with target account' do
 | 
					    it 'appends activity:object element with target account' do
 | 
				
			||||||
@ -1190,8 +1190,8 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      time_after = Time.now
 | 
					      time_after = Time.now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(unfollow_salmon.id.text).to(
 | 
					      expect(unfollow_salmon.id.text).to(
 | 
				
			||||||
        eq(TagManager.instance.unique_tag(time_before.utc, follow.id, 'Follow'))
 | 
					        eq(OStatus::TagManager.instance.unique_tag(time_before.utc, follow.id, 'Follow'))
 | 
				
			||||||
          .or(eq(TagManager.instance.unique_tag(time_after.utc, follow.id, 'Follow')))
 | 
					          .or(eq(OStatus::TagManager.instance.unique_tag(time_after.utc, follow.id, 'Follow')))
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1234,7 +1234,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      unfollow_salmon = OStatus::AtomSerializer.new.unfollow_salmon(follow)
 | 
					      unfollow_salmon = OStatus::AtomSerializer.new.unfollow_salmon(follow)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = unfollow_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = unfollow_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:activity]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:activity]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with follow' do
 | 
					    it 'appends activity:verb element with follow' do
 | 
				
			||||||
@ -1244,7 +1244,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      unfollow_salmon = OStatus::AtomSerializer.new.unfollow_salmon(follow)
 | 
					      unfollow_salmon = OStatus::AtomSerializer.new.unfollow_salmon(follow)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = unfollow_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = unfollow_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:unfollow]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:unfollow]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:object element with target account' do
 | 
					    it 'appends activity:object element with target account' do
 | 
				
			||||||
@ -1338,8 +1338,8 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      time_after = Time.now
 | 
					      time_after = Time.now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(authorize_follow_request_salmon.id.text).to(
 | 
					      expect(authorize_follow_request_salmon.id.text).to(
 | 
				
			||||||
        eq(TagManager.instance.unique_tag(time_before.utc, follow_request.id, 'FollowRequest'))
 | 
					        eq(OStatus::TagManager.instance.unique_tag(time_before.utc, follow_request.id, 'FollowRequest'))
 | 
				
			||||||
          .or(eq(TagManager.instance.unique_tag(time_after.utc, follow_request.id, 'FollowRequest')))
 | 
					          .or(eq(OStatus::TagManager.instance.unique_tag(time_after.utc, follow_request.id, 'FollowRequest')))
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1359,7 +1359,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      authorize_follow_request_salmon = OStatus::AtomSerializer.new.authorize_follow_request_salmon(follow_request)
 | 
					      authorize_follow_request_salmon = OStatus::AtomSerializer.new.authorize_follow_request_salmon(follow_request)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = authorize_follow_request_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = authorize_follow_request_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:activity]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:activity]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with authorize' do
 | 
					    it 'appends activity:verb element with authorize' do
 | 
				
			||||||
@ -1368,7 +1368,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      authorize_follow_request_salmon = OStatus::AtomSerializer.new.authorize_follow_request_salmon(follow_request)
 | 
					      authorize_follow_request_salmon = OStatus::AtomSerializer.new.authorize_follow_request_salmon(follow_request)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      verb = authorize_follow_request_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = authorize_follow_request_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:authorize]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:authorize]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'returns element whose rendered view creates follow from follow request when processed' do
 | 
					    it 'returns element whose rendered view creates follow from follow request when processed' do
 | 
				
			||||||
@ -1407,8 +1407,8 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      time_after = Time.now
 | 
					      time_after = Time.now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(reject_follow_request_salmon.id.text).to(
 | 
					      expect(reject_follow_request_salmon.id.text).to(
 | 
				
			||||||
        eq(TagManager.instance.unique_tag(time_before.utc, follow_request.id, 'FollowRequest'))
 | 
					        eq(OStatus::TagManager.instance.unique_tag(time_before.utc, follow_request.id, 'FollowRequest'))
 | 
				
			||||||
          .or(TagManager.instance.unique_tag(time_after.utc, follow_request.id, 'FollowRequest'))
 | 
					          .or(OStatus::TagManager.instance.unique_tag(time_after.utc, follow_request.id, 'FollowRequest'))
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1424,14 +1424,14 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      follow_request = Fabricate(:follow_request)
 | 
					      follow_request = Fabricate(:follow_request)
 | 
				
			||||||
      reject_follow_request_salmon = OStatus::AtomSerializer.new.reject_follow_request_salmon(follow_request)
 | 
					      reject_follow_request_salmon = OStatus::AtomSerializer.new.reject_follow_request_salmon(follow_request)
 | 
				
			||||||
      object_type = reject_follow_request_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = reject_follow_request_salmon.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:activity]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:activity]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with authorize' do
 | 
					    it 'appends activity:verb element with authorize' do
 | 
				
			||||||
      follow_request = Fabricate(:follow_request)
 | 
					      follow_request = Fabricate(:follow_request)
 | 
				
			||||||
      reject_follow_request_salmon = OStatus::AtomSerializer.new.reject_follow_request_salmon(follow_request)
 | 
					      reject_follow_request_salmon = OStatus::AtomSerializer.new.reject_follow_request_salmon(follow_request)
 | 
				
			||||||
      verb = reject_follow_request_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      verb = reject_follow_request_salmon.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(verb.text).to eq TagManager::VERBS[:reject]
 | 
					      expect(verb.text).to eq OStatus::TagManager::VERBS[:reject]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'returns element whose rendered view deletes follow request when processed' do
 | 
					    it 'returns element whose rendered view deletes follow request when processed' do
 | 
				
			||||||
@ -1503,7 +1503,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      entry = OStatus::AtomSerializer.new.object(status)
 | 
					      entry = OStatus::AtomSerializer.new.object(status)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = entry.nodes.find { |node| node.name == 'activity:object-type' }
 | 
					      object_type = entry.nodes.find { |node| node.name == 'activity:object-type' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::TYPES[:note]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::TYPES[:note]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends activity:verb element with verb' do
 | 
					    it 'appends activity:verb element with verb' do
 | 
				
			||||||
@ -1512,7 +1512,7 @@ RSpec.describe OStatus::AtomSerializer do
 | 
				
			|||||||
      entry = OStatus::AtomSerializer.new.object(status)
 | 
					      entry = OStatus::AtomSerializer.new.object(status)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      object_type = entry.nodes.find { |node| node.name == 'activity:verb' }
 | 
					      object_type = entry.nodes.find { |node| node.name == 'activity:verb' }
 | 
				
			||||||
      expect(object_type.text).to eq TagManager::VERBS[:post]
 | 
					      expect(object_type.text).to eq OStatus::TagManager::VERBS[:post]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'appends link element for an alternative' do
 | 
					    it 'appends link element for an alternative' do
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										70
									
								
								spec/lib/ostatus/tag_manager_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								spec/lib/ostatus/tag_manager_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe OStatus::TagManager do
 | 
				
			||||||
 | 
					  describe '#unique_tag' do
 | 
				
			||||||
 | 
					    it 'returns a unique tag' do
 | 
				
			||||||
 | 
					      expect(OStatus::TagManager.instance.unique_tag(Time.utc(2000), 12, 'Status')).to eq 'tag:cb6e6126.ngrok.io,2000-01-01:objectId=12:objectType=Status'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe '#unique_tag_to_local_id' do
 | 
				
			||||||
 | 
					    it 'returns the ID part' do
 | 
				
			||||||
 | 
					      expect(OStatus::TagManager.instance.unique_tag_to_local_id('tag:cb6e6126.ngrok.io,2000-01-01:objectId=12:objectType=Status', 'Status')).to eql '12'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'returns nil if it is not local id' do
 | 
				
			||||||
 | 
					      expect(OStatus::TagManager.instance.unique_tag_to_local_id('tag:remote,2000-01-01:objectId=12:objectType=Status', 'Status')).to eq nil
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'returns nil if it is not expected type' do
 | 
				
			||||||
 | 
					      expect(OStatus::TagManager.instance.unique_tag_to_local_id('tag:cb6e6126.ngrok.io,2000-01-01:objectId=12:objectType=Block', 'Status')).to eq nil
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'returns nil if it does not have object ID' do
 | 
				
			||||||
 | 
					      expect(OStatus::TagManager.instance.unique_tag_to_local_id('tag:cb6e6126.ngrok.io,2000-01-01:objectType=Status', 'Status')).to eq nil
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe '#local_id?' do
 | 
				
			||||||
 | 
					    it 'returns true for a local ID' do
 | 
				
			||||||
 | 
					      expect(OStatus::TagManager.instance.local_id?('tag:cb6e6126.ngrok.io;objectId=12:objectType=Status')).to be true
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'returns false for a foreign ID' do
 | 
				
			||||||
 | 
					      expect(OStatus::TagManager.instance.local_id?('tag:foreign.tld;objectId=12:objectType=Status')).to be false
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe '#uri_for' do
 | 
				
			||||||
 | 
					    subject { OStatus::TagManager.instance.uri_for(target) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'comment object' do
 | 
				
			||||||
 | 
					      let(:target) { Fabricate(:status, created_at: '2000-01-01T00:00:00Z', reply: true) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns the unique tag for status' do
 | 
				
			||||||
 | 
					        expect(target.object_type).to eq :comment
 | 
				
			||||||
 | 
					        is_expected.to eq target.uri
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'note object' do
 | 
				
			||||||
 | 
					      let(:target) { Fabricate(:status, created_at: '2000-01-01T00:00:00Z', reply: false, thread: nil) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns the unique tag for status' do
 | 
				
			||||||
 | 
					        expect(target.object_type).to eq :note
 | 
				
			||||||
 | 
					        is_expected.to eq target.uri
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'person object' do
 | 
				
			||||||
 | 
					      let(:target) { Fabricate(:account, username: 'alice') }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns the URL for account' do
 | 
				
			||||||
 | 
					        expect(target.object_type).to eq :person
 | 
				
			||||||
 | 
					        is_expected.to eq 'https://cb6e6126.ngrok.io/users/alice'
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -120,71 +120,6 @@ RSpec.describe TagManager do
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe '#unique_tag' do
 | 
					 | 
				
			||||||
    it 'returns a unique tag' do
 | 
					 | 
				
			||||||
      expect(TagManager.instance.unique_tag(Time.utc(2000), 12, 'Status')).to eq 'tag:cb6e6126.ngrok.io,2000-01-01:objectId=12:objectType=Status'
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe '#unique_tag_to_local_id' do
 | 
					 | 
				
			||||||
    it 'returns the ID part' do
 | 
					 | 
				
			||||||
      expect(TagManager.instance.unique_tag_to_local_id('tag:cb6e6126.ngrok.io,2000-01-01:objectId=12:objectType=Status', 'Status')).to eql '12'
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    it 'returns nil if it is not local id' do
 | 
					 | 
				
			||||||
      expect(TagManager.instance.unique_tag_to_local_id('tag:remote,2000-01-01:objectId=12:objectType=Status', 'Status')).to eq nil
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    it 'returns nil if it is not expected type' do
 | 
					 | 
				
			||||||
      expect(TagManager.instance.unique_tag_to_local_id('tag:cb6e6126.ngrok.io,2000-01-01:objectId=12:objectType=Block', 'Status')).to eq nil
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    it 'returns nil if it does not have object ID' do
 | 
					 | 
				
			||||||
      expect(TagManager.instance.unique_tag_to_local_id('tag:cb6e6126.ngrok.io,2000-01-01:objectType=Status', 'Status')).to eq nil
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe '#local_id?' do
 | 
					 | 
				
			||||||
    it 'returns true for a local ID' do
 | 
					 | 
				
			||||||
      expect(TagManager.instance.local_id?('tag:cb6e6126.ngrok.io;objectId=12:objectType=Status')).to be true
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    it 'returns false for a foreign ID' do
 | 
					 | 
				
			||||||
      expect(TagManager.instance.local_id?('tag:foreign.tld;objectId=12:objectType=Status')).to be false
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe '#uri_for' do
 | 
					 | 
				
			||||||
    subject { TagManager.instance.uri_for(target) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    context 'comment object' do
 | 
					 | 
				
			||||||
      let(:target) { Fabricate(:status, created_at: '2000-01-01T00:00:00Z', reply: true) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns the unique tag for status' do
 | 
					 | 
				
			||||||
        expect(target.object_type).to eq :comment
 | 
					 | 
				
			||||||
        is_expected.to eq target.uri
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    context 'note object' do
 | 
					 | 
				
			||||||
      let(:target) { Fabricate(:status, created_at: '2000-01-01T00:00:00Z', reply: false, thread: nil) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns the unique tag for status' do
 | 
					 | 
				
			||||||
        expect(target.object_type).to eq :note
 | 
					 | 
				
			||||||
        is_expected.to eq target.uri
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    context 'person object' do
 | 
					 | 
				
			||||||
      let(:target) { Fabricate(:account, username: 'alice') }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns the URL for account' do
 | 
					 | 
				
			||||||
        expect(target.object_type).to eq :person
 | 
					 | 
				
			||||||
        is_expected.to eq 'https://cb6e6126.ngrok.io/users/alice'
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe '#url_for' do
 | 
					  describe '#url_for' do
 | 
				
			||||||
    let(:alice) { Fabricate(:account, username: 'alice') }
 | 
					    let(:alice) { Fabricate(:account, username: 'alice') }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -42,7 +42,7 @@ RSpec.describe AuthorizeFollowService do
 | 
				
			|||||||
    it 'sends a follow request authorization salmon slap' do
 | 
					    it 'sends a follow request authorization salmon slap' do
 | 
				
			||||||
      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
        xml.match(TagManager::VERBS[:authorize])
 | 
					        xml.match(OStatus::TagManager::VERBS[:authorize])
 | 
				
			||||||
      }).to have_been_made.once
 | 
					      }).to have_been_made.once
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -50,14 +50,14 @@ RSpec.describe BatchedRemoveStatusService do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  it 'sends PuSH update to PuSH subscribers' do
 | 
					  it 'sends PuSH update to PuSH subscribers' do
 | 
				
			||||||
    expect(a_request(:post, 'http://example.com/push').with { |req|
 | 
					    expect(a_request(:post, 'http://example.com/push').with { |req|
 | 
				
			||||||
      matches = req.body.match(TagManager::VERBS[:delete])
 | 
					      matches = req.body.match(OStatus::TagManager::VERBS[:delete])
 | 
				
			||||||
    }).to have_been_made.at_least_once
 | 
					    }).to have_been_made.at_least_once
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it 'sends Salmon slap to previously mentioned users' do
 | 
					  it 'sends Salmon slap to previously mentioned users' do
 | 
				
			||||||
    expect(a_request(:post, "http://example.com/salmon").with { |req|
 | 
					    expect(a_request(:post, "http://example.com/salmon").with { |req|
 | 
				
			||||||
      xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					      xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
      xml.match(TagManager::VERBS[:delete])
 | 
					      xml.match(OStatus::TagManager::VERBS[:delete])
 | 
				
			||||||
    }).to have_been_made.once
 | 
					    }).to have_been_made.once
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -32,7 +32,7 @@ RSpec.describe BlockService do
 | 
				
			|||||||
    it 'sends a block salmon slap' do
 | 
					    it 'sends a block salmon slap' do
 | 
				
			||||||
      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
        xml.match(TagManager::VERBS[:block])
 | 
					        xml.match(OStatus::TagManager::VERBS[:block])
 | 
				
			||||||
      }).to have_been_made.once
 | 
					      }).to have_been_made.once
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ RSpec.describe FavouriteService do
 | 
				
			|||||||
    it 'sends a salmon slap' do
 | 
					    it 'sends a salmon slap' do
 | 
				
			||||||
      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
        xml.match(TagManager::VERBS[:favorite])
 | 
					        xml.match(OStatus::TagManager::VERBS[:favorite])
 | 
				
			||||||
      }).to have_been_made.once
 | 
					      }).to have_been_made.once
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -60,7 +60,7 @@ RSpec.describe FollowService do
 | 
				
			|||||||
      it 'sends a follow request salmon slap' do
 | 
					      it 'sends a follow request salmon slap' do
 | 
				
			||||||
        expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					        expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
          xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					          xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
          xml.match(TagManager::VERBS[:request_friend])
 | 
					          xml.match(OStatus::TagManager::VERBS[:request_friend])
 | 
				
			||||||
        }).to have_been_made.once
 | 
					        }).to have_been_made.once
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
@ -81,7 +81,7 @@ RSpec.describe FollowService do
 | 
				
			|||||||
      it 'sends a follow salmon slap' do
 | 
					      it 'sends a follow salmon slap' do
 | 
				
			||||||
        expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					        expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
          xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					          xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
          xml.match(TagManager::VERBS[:follow])
 | 
					          xml.match(OStatus::TagManager::VERBS[:follow])
 | 
				
			||||||
        }).to have_been_made.once
 | 
					        }).to have_been_made.once
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -42,7 +42,7 @@ RSpec.describe RejectFollowService do
 | 
				
			|||||||
    it 'sends a follow request rejection salmon slap' do
 | 
					    it 'sends a follow request rejection salmon slap' do
 | 
				
			||||||
      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
        xml.match(TagManager::VERBS[:reject])
 | 
					        xml.match(OStatus::TagManager::VERBS[:reject])
 | 
				
			||||||
      }).to have_been_made.once
 | 
					      }).to have_been_made.once
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ RSpec.describe RemoveStatusService do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  it 'sends PuSH update to PuSH subscribers' do
 | 
					  it 'sends PuSH update to PuSH subscribers' do
 | 
				
			||||||
    expect(a_request(:post, 'http://example.com/push').with { |req|
 | 
					    expect(a_request(:post, 'http://example.com/push').with { |req|
 | 
				
			||||||
      req.body.match(TagManager::VERBS[:delete])
 | 
					      req.body.match(OStatus::TagManager::VERBS[:delete])
 | 
				
			||||||
    }).to have_been_made
 | 
					    }).to have_been_made
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -45,7 +45,7 @@ RSpec.describe RemoveStatusService do
 | 
				
			|||||||
  it 'sends Salmon slap to previously mentioned users' do
 | 
					  it 'sends Salmon slap to previously mentioned users' do
 | 
				
			||||||
    expect(a_request(:post, "http://example.com/salmon").with { |req|
 | 
					    expect(a_request(:post, "http://example.com/salmon").with { |req|
 | 
				
			||||||
      xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					      xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
      xml.match(TagManager::VERBS[:delete])
 | 
					      xml.match(OStatus::TagManager::VERBS[:delete])
 | 
				
			||||||
    }).to have_been_made.once
 | 
					    }).to have_been_made.once
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ RSpec.describe UnblockService do
 | 
				
			|||||||
    it 'sends an unblock salmon slap' do
 | 
					    it 'sends an unblock salmon slap' do
 | 
				
			||||||
      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
        xml.match(TagManager::VERBS[:unblock])
 | 
					        xml.match(OStatus::TagManager::VERBS[:unblock])
 | 
				
			||||||
      }).to have_been_made.once
 | 
					      }).to have_been_made.once
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ RSpec.describe UnfollowService do
 | 
				
			|||||||
    it 'sends an unfollow salmon slap' do
 | 
					    it 'sends an unfollow salmon slap' do
 | 
				
			||||||
      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
					      expect(a_request(:post, "http://salmon.example.com/").with { |req|
 | 
				
			||||||
        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
					        xml = OStatus2::Salmon.new.unpack(req.body)
 | 
				
			||||||
        xml.match(TagManager::VERBS[:unfollow])
 | 
					        xml.match(OStatus::TagManager::VERBS[:unfollow])
 | 
				
			||||||
      }).to have_been_made.once
 | 
					      }).to have_been_made.once
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user