Sanitize remote html in atom feeds, API (not just UI), use cached mention
relations on Status#mentions
This commit is contained in:
		@@ -12,6 +12,14 @@ module ApplicationHelper
 | 
			
		||||
    id.start_with?("tag:#{Rails.configuration.x.local_domain}")
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def content_for_status(actual_status)
 | 
			
		||||
    if actual_status.local?
 | 
			
		||||
      linkify(actual_status)
 | 
			
		||||
    else
 | 
			
		||||
      sanitize(actual_status.content, tags: %w(a br p), attributes: %w(href rel))
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def linkify(status)
 | 
			
		||||
    mention_hash = {}
 | 
			
		||||
    status.mentions.each { |m| mention_hash[m.acct] = m }
 | 
			
		||||
 
 | 
			
		||||
@@ -137,13 +137,7 @@ module AtomBuilderHelper
 | 
			
		||||
 | 
			
		||||
  def conditionally_formatted(activity)
 | 
			
		||||
    if activity.is_a?(Status)
 | 
			
		||||
      if activity.reblog? && activity.reblog.local?
 | 
			
		||||
        linkify(activity.reblog)
 | 
			
		||||
      elsif !activity.reblog? && activity.local?
 | 
			
		||||
        linkify(activity)
 | 
			
		||||
      else
 | 
			
		||||
        activity.content
 | 
			
		||||
      end
 | 
			
		||||
      content_for_status(activity.reblog? ? activity.reblog : activity)
 | 
			
		||||
    elsif activity.nil?
 | 
			
		||||
      nil
 | 
			
		||||
    else
 | 
			
		||||
 
 | 
			
		||||
@@ -27,12 +27,4 @@ module StreamEntriesHelper
 | 
			
		||||
  def favourited_by_me_class(status)
 | 
			
		||||
    user_signed_in? && current_user.account.favourited?(status) ? 'favourited' : ''
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def content_for_status(actual_status)
 | 
			
		||||
    if actual_status.local?
 | 
			
		||||
      linkify(actual_status)
 | 
			
		||||
    else
 | 
			
		||||
      sanitize(actual_status.content, tags: %w(a br p), attributes: %w(href rel))
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -60,22 +60,15 @@ class Status < ActiveRecord::Base
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def mentions
 | 
			
		||||
    m = []
 | 
			
		||||
 | 
			
		||||
    m << thread.account if reply?
 | 
			
		||||
    m << reblog.account if reblog?
 | 
			
		||||
 | 
			
		||||
    unless reblog?
 | 
			
		||||
      self.text.scan(Account::MENTION_RE).each do |match|
 | 
			
		||||
        uri = match.first
 | 
			
		||||
        username, domain = uri.split('@')
 | 
			
		||||
        account = Account.find_by(username: username, domain: domain)
 | 
			
		||||
 | 
			
		||||
        m << account unless account.nil?
 | 
			
		||||
      end
 | 
			
		||||
    if @mentions.nil?
 | 
			
		||||
      @mentions = []
 | 
			
		||||
      @mentions << thread.account if reply?
 | 
			
		||||
      @mentions << reblog.account if reblog?
 | 
			
		||||
      self.mentioned_accounts.each { |mention| @mentions << mention.account } unless reblog?
 | 
			
		||||
      @mentions = @mentions.uniq
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    m.uniq
 | 
			
		||||
    @mentions
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def ancestors
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ object @status
 | 
			
		||||
attributes :id, :created_at, :in_reply_to_id
 | 
			
		||||
 | 
			
		||||
node(:uri)              { |status| uri_for_target(status) }
 | 
			
		||||
node(:content)          { |status| status.local? ? linkify(status) : status.content }
 | 
			
		||||
node(:content)          { |status| content_for_status(status) }
 | 
			
		||||
node(:url)              { |status| url_for_target(status) }
 | 
			
		||||
node(:reblogs_count)    { |status| status.reblogs_count }
 | 
			
		||||
node(:favourites_count) { |status| status.favourites_count }
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ RSpec.describe Status, type: :model do
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'returns mentioned accounts' do
 | 
			
		||||
      subject.text = 'Hello @bob!'
 | 
			
		||||
      subject.mentioned_accounts.create!(account: bob)
 | 
			
		||||
      expect(subject.mentions).to include bob
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user