Normalize language code of incoming posts (#30403)
This commit is contained in:
		
							parent
							
								
									b8edc95e8a
								
							
						
					
					
						commit
						f9c41ae43b
					
				@ -3,6 +3,8 @@
 | 
				
			|||||||
class ActivityPub::Parser::StatusParser
 | 
					class ActivityPub::Parser::StatusParser
 | 
				
			||||||
  include JsonLdHelper
 | 
					  include JsonLdHelper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  NORMALIZED_LOCALE_NAMES = LanguagesHelper::SUPPORTED_LOCALES.keys.index_by(&:downcase).freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # @param [Hash] json
 | 
					  # @param [Hash] json
 | 
				
			||||||
  # @param [Hash] magic_values
 | 
					  # @param [Hash] magic_values
 | 
				
			||||||
  # @option magic_values [String] :followers_collection
 | 
					  # @option magic_values [String] :followers_collection
 | 
				
			||||||
@ -86,6 +88,13 @@ class ActivityPub::Parser::StatusParser
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def language
 | 
					  def language
 | 
				
			||||||
 | 
					    lang = raw_language_code
 | 
				
			||||||
 | 
					    lang.presence && NORMALIZED_LOCALE_NAMES.fetch(lang.downcase.to_sym, lang)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def raw_language_code
 | 
				
			||||||
    if content_language_map?
 | 
					    if content_language_map?
 | 
				
			||||||
      @object['contentMap'].keys.first
 | 
					      @object['contentMap'].keys.first
 | 
				
			||||||
    elsif name_language_map?
 | 
					    elsif name_language_map?
 | 
				
			||||||
@ -95,8 +104,6 @@ class ActivityPub::Parser::StatusParser
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def audience_to
 | 
					  def audience_to
 | 
				
			||||||
    as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) }
 | 
					    as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) }
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										50
									
								
								spec/lib/activitypub/parser/status_parser_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								spec/lib/activitypub/parser/status_parser_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RSpec.describe ActivityPub::Parser::StatusParser do
 | 
				
			||||||
 | 
					  subject { described_class.new(json) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers', domain: 'example.com', uri: 'https://example.com/actor') }
 | 
				
			||||||
 | 
					  let(:follower) { Fabricate(:account, username: 'bob') }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:json) do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      '@context': 'https://www.w3.org/ns/activitystreams',
 | 
				
			||||||
 | 
					      id: [ActivityPub::TagManager.instance.uri_for(sender), '#foo'].join,
 | 
				
			||||||
 | 
					      type: 'Create',
 | 
				
			||||||
 | 
					      actor: ActivityPub::TagManager.instance.uri_for(sender),
 | 
				
			||||||
 | 
					      object: object_json,
 | 
				
			||||||
 | 
					    }.with_indifferent_access
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:object_json) do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      id: [ActivityPub::TagManager.instance.uri_for(sender), 'post1'].join('/'),
 | 
				
			||||||
 | 
					      type: 'Note',
 | 
				
			||||||
 | 
					      to: [
 | 
				
			||||||
 | 
					        'https://www.w3.org/ns/activitystreams#Public',
 | 
				
			||||||
 | 
					        ActivityPub::TagManager.instance.uri_for(follower),
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      content: '@bob lorem ipsum',
 | 
				
			||||||
 | 
					      contentMap: {
 | 
				
			||||||
 | 
					        EN: '@bob lorem ipsum',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      published: 1.hour.ago.utc.iso8601,
 | 
				
			||||||
 | 
					      updated: 1.hour.ago.utc.iso8601,
 | 
				
			||||||
 | 
					      tag: {
 | 
				
			||||||
 | 
					        type: 'Mention',
 | 
				
			||||||
 | 
					        href: ActivityPub::TagManager.instance.uri_for(follower),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it 'correctly parses status' do
 | 
				
			||||||
 | 
					    expect(subject).to have_attributes(
 | 
				
			||||||
 | 
					      text: '@bob lorem ipsum',
 | 
				
			||||||
 | 
					      uri: [ActivityPub::TagManager.instance.uri_for(sender), 'post1'].join('/'),
 | 
				
			||||||
 | 
					      reply: false,
 | 
				
			||||||
 | 
					      language: :en
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user