Mentions in private statuses allow mentioned people to see them
This commit is contained in:
		
							parent
							
								
									00b5731ecb
								
							
						
					
					
						commit
						dc851c922e
					
				
					 4 changed files with 16 additions and 15 deletions
				
			
		| 
						 | 
					@ -107,7 +107,6 @@ class FeedManager
 | 
				
			||||||
    should_filter ||= receiver.blocking?(status.account)                                    # or it's from someone I blocked
 | 
					    should_filter ||= receiver.blocking?(status.account)                                    # or it's from someone I blocked
 | 
				
			||||||
    should_filter ||= receiver.blocking?(status.mentions.includes(:account).map(&:account)) # or if it mentions someone I blocked
 | 
					    should_filter ||= receiver.blocking?(status.mentions.includes(:account).map(&:account)) # or if it mentions someone I blocked
 | 
				
			||||||
    should_filter ||= (status.account.silenced? && !receiver.following?(status.account))    # of if the account is silenced and I'm not following them
 | 
					    should_filter ||= (status.account.silenced? && !receiver.following?(status.account))    # of if the account is silenced and I'm not following them
 | 
				
			||||||
    should_filter ||= (status.private_visibility? && !receiver.following?(status.account))  # or if the mentioned account is not permitted to see the private status
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if status.reply? && !status.in_reply_to_account_id.nil?                                 # or it's a reply
 | 
					    if status.reply? && !status.in_reply_to_account_id.nil?                                 # or it's a reply
 | 
				
			||||||
      should_filter ||= receiver.blocking?(status.in_reply_to_account)                      # to a user I blocked
 | 
					      should_filter ||= receiver.blocking?(status.in_reply_to_account)                      # to a user I blocked
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,11 @@ class Status < ApplicationRecord
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def permitted?(other_account = nil)
 | 
					  def permitted?(other_account = nil)
 | 
				
			||||||
    private_visibility? ? (account.id == other_account&.id || other_account&.following?(account)) : other_account.nil? || !account.blocking?(other_account)
 | 
					    if private_visibility?
 | 
				
			||||||
 | 
					      (account.id == other_account&.id || other_account&.following?(account) || mentions.include?(other_account))
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      other_account.nil? || !account.blocking?(other_account)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def ancestors(account = nil)
 | 
					  def ancestors(account = nil)
 | 
				
			||||||
| 
						 | 
					@ -153,6 +157,10 @@ class Status < ApplicationRecord
 | 
				
			||||||
        where('1 = 1')
 | 
					        where('1 = 1')
 | 
				
			||||||
      elsif !account.nil? && target_account.blocking?(account)
 | 
					      elsif !account.nil? && target_account.blocking?(account)
 | 
				
			||||||
        where('1 = 0')
 | 
					        where('1 = 0')
 | 
				
			||||||
 | 
					      elsif !account.nil?
 | 
				
			||||||
 | 
					        joins('LEFT OUTER JOIN mentions ON statuses.id = mentions.status_id')
 | 
				
			||||||
 | 
					          .where('mentions.account_id = ?', account.id)
 | 
				
			||||||
 | 
					          .where('statuses.visibility != ? OR mentions.id IS NOT NULL', Status.visibilities[:private])
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        where.not(visibility: :private)
 | 
					        where.not(visibility: :private)
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,7 +106,8 @@ class ProcessFeedService < BaseService
 | 
				
			||||||
        text: content(entry),
 | 
					        text: content(entry),
 | 
				
			||||||
        spoiler_text: content_warning(entry),
 | 
					        spoiler_text: content_warning(entry),
 | 
				
			||||||
        created_at: published(entry),
 | 
					        created_at: published(entry),
 | 
				
			||||||
        reply: thread?(entry)
 | 
					        reply: thread?(entry),
 | 
				
			||||||
 | 
					        visibility: visibility_scope(entry)
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if thread?(entry)
 | 
					      if thread?(entry)
 | 
				
			||||||
| 
						 | 
					@ -144,15 +145,9 @@ class ProcessFeedService < BaseService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def mentions_from_xml(parent, xml)
 | 
					    def mentions_from_xml(parent, xml)
 | 
				
			||||||
      processed_account_ids = []
 | 
					      processed_account_ids = []
 | 
				
			||||||
      public_visibility     = false
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      xml.xpath('./xmlns:link[@rel="mentioned"]', xmlns: TagManager::XMLNS).each do |link|
 | 
					      xml.xpath('./xmlns:link[@rel="mentioned"]', xmlns: TagManager::XMLNS).each do |link|
 | 
				
			||||||
        if link['ostatus:object-type'] == TagManager::TYPES[:collection] && link['href'] == TagManager::COLLECTIONS[:public]
 | 
					        next if [TagManager::TYPES[:group], TagManager::TYPES[:collection]].include? link['ostatus:object-type']
 | 
				
			||||||
          public_visibility = true
 | 
					 | 
				
			||||||
          next
 | 
					 | 
				
			||||||
        elsif link['ostatus:object-type'] == TagManager::TYPES[:group]
 | 
					 | 
				
			||||||
          next
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        url = Addressable::URI.parse(link['href'])
 | 
					        url = Addressable::URI.parse(link['href'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -172,9 +167,6 @@ class ProcessFeedService < BaseService
 | 
				
			||||||
        # So we can skip duplicate mentions
 | 
					        # So we can skip duplicate mentions
 | 
				
			||||||
        processed_account_ids << mentioned_account.id
 | 
					        processed_account_ids << mentioned_account.id
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					 | 
				
			||||||
      parent.visibility = public_visibility ? :public : :unlisted
 | 
					 | 
				
			||||||
      parent.save!
 | 
					 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def hashtags_from_xml(parent, xml)
 | 
					    def hashtags_from_xml(parent, xml)
 | 
				
			||||||
| 
						 | 
					@ -230,6 +222,10 @@ class ProcessFeedService < BaseService
 | 
				
			||||||
      xml.at_xpath('./xmlns:summary', xmlns: TagManager::XMLNS)&.content || ''
 | 
					      xml.at_xpath('./xmlns:summary', xmlns: TagManager::XMLNS)&.content || ''
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def visibility_scope(xml = @xml)
 | 
				
			||||||
 | 
					      xml.at_xpath('./mastodon:scope', mastodon: TagManager::MTDN_XMLNS)&.content&.to_sym || :public
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def published(xml = @xml)
 | 
					    def published(xml = @xml)
 | 
				
			||||||
      xml.at_xpath('./xmlns:published', xmlns: TagManager::XMLNS).content
 | 
					      xml.at_xpath('./xmlns:published', xmlns: TagManager::XMLNS).content
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,6 @@ class ProcessMentionsService < BaseService
 | 
				
			||||||
    status.mentions.each do |mention|
 | 
					    status.mentions.each do |mention|
 | 
				
			||||||
      mentioned_account = mention.account
 | 
					      mentioned_account = mention.account
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      next if status.private_visibility? && (!mentioned_account.following?(status.account) || !mentioned_account.local?)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if mentioned_account.local?
 | 
					      if mentioned_account.local?
 | 
				
			||||||
        NotifyService.new.call(mentioned_account, mention)
 | 
					        NotifyService.new.call(mentioned_account, mention)
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue