Normalize language code of incoming posts (#30403)
This commit is contained in:
		
					parent
					
						
							
								10ec421dd4
							
						
					
				
			
			
				commit
				
					
						133d98fb25
					
				
			
		
					 2 changed files with 59 additions and 2 deletions
				
			
		|  | @ -3,6 +3,8 @@ | |||
| class ActivityPub::Parser::StatusParser | ||||
|   include JsonLdHelper | ||||
| 
 | ||||
|   NORMALIZED_LOCALE_NAMES = LanguagesHelper::SUPPORTED_LOCALES.keys.index_by(&:downcase).freeze | ||||
| 
 | ||||
|   # @param [Hash] json | ||||
|   # @param [Hash] options | ||||
|   # @option options [String] :followers_collection | ||||
|  | @ -87,6 +89,13 @@ class ActivityPub::Parser::StatusParser | |||
|   end | ||||
| 
 | ||||
|   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? | ||||
|       @object['contentMap'].keys.first | ||||
|     elsif name_language_map? | ||||
|  | @ -96,8 +105,6 @@ class ActivityPub::Parser::StatusParser | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def audience_to | ||||
|     as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) } | ||||
|   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…
	
	Add table
		Add a link
		
	
		Reference in a new issue