Update to 4.6.6
This commit is contained in:
parent
4b629f2670
commit
5321ef52f6
236
app/lib/activitypub/parser/status_parser.rb.orig
Normal file
236
app/lib/activitypub/parser/status_parser.rb.orig
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ActivityPub::Parser::StatusParser
|
||||||
|
include FormattingHelper
|
||||||
|
include JsonLdHelper
|
||||||
|
|
||||||
|
NORMALIZED_LOCALE_NAMES = LanguagesHelper::SUPPORTED_LOCALES.keys.index_by(&:downcase).freeze
|
||||||
|
|
||||||
|
# @param [Hash] json
|
||||||
|
# @param [Hash] options
|
||||||
|
# @option options [String] :followers_collection
|
||||||
|
# @option options [String] :following_collection
|
||||||
|
# @option options [String] :actor_uri
|
||||||
|
# @option options [Hash] :object
|
||||||
|
def initialize(json, **options)
|
||||||
|
@json = json
|
||||||
|
@object = options[:object] || json['object'] || json
|
||||||
|
@options = options
|
||||||
|
end
|
||||||
|
|
||||||
|
def uri
|
||||||
|
id = @object['id']
|
||||||
|
|
||||||
|
if id&.start_with?('bear:')
|
||||||
|
Addressable::URI.parse(id).query_values['u']
|
||||||
|
else
|
||||||
|
id
|
||||||
|
end
|
||||||
|
rescue Addressable::URI::InvalidURIError
|
||||||
|
id
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
return if @object['url'].blank?
|
||||||
|
|
||||||
|
url = url_to_href(@object['url'], 'text/html')
|
||||||
|
url unless unsupported_uri_scheme?(url)
|
||||||
|
end
|
||||||
|
|
||||||
|
def text
|
||||||
|
if @object['content'].present?
|
||||||
|
@object['content']
|
||||||
|
elsif content_language_map?
|
||||||
|
@object['contentMap'].values.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def processed_text
|
||||||
|
return text || '' unless converted_object_type?
|
||||||
|
|
||||||
|
[
|
||||||
|
title.presence && "<h2>#{title}</h2>",
|
||||||
|
spoiler_text.presence,
|
||||||
|
linkify(url || uri),
|
||||||
|
].compact.join("\n\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
def spoiler_text
|
||||||
|
if @object['summary'].present?
|
||||||
|
@object['summary']
|
||||||
|
elsif summary_language_map?
|
||||||
|
@object['summaryMap'].values.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def processed_spoiler_text
|
||||||
|
return '' if converted_object_type?
|
||||||
|
|
||||||
|
spoiler_text || ''
|
||||||
|
end
|
||||||
|
|
||||||
|
def title
|
||||||
|
if @object['name'].present?
|
||||||
|
@object['name']
|
||||||
|
elsif name_language_map?
|
||||||
|
@object['nameMap'].values.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def created_at
|
||||||
|
datetime = @object['published']&.to_datetime
|
||||||
|
datetime if datetime.present? && (0..9999).cover?(datetime.year)
|
||||||
|
rescue ArgumentError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def edited_at
|
||||||
|
@object['updated']&.to_datetime
|
||||||
|
rescue ArgumentError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def reply
|
||||||
|
@object['inReplyTo'].present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def sensitive
|
||||||
|
@object['sensitive']
|
||||||
|
end
|
||||||
|
|
||||||
|
def visibility
|
||||||
|
if audience_to.any? { |to| ActivityPub::TagManager.instance.public_collection?(to) }
|
||||||
|
:public
|
||||||
|
elsif audience_cc.any? { |cc| ActivityPub::TagManager.instance.public_collection?(cc) }
|
||||||
|
:unlisted
|
||||||
|
elsif audience_to.include?(@options[:followers_collection])
|
||||||
|
:private
|
||||||
|
elsif direct_message == false
|
||||||
|
:limited
|
||||||
|
else
|
||||||
|
:direct
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def language
|
||||||
|
lang = raw_language_code
|
||||||
|
lang.presence && NORMALIZED_LOCALE_NAMES.fetch(lang.downcase.to_sym, lang)
|
||||||
|
end
|
||||||
|
|
||||||
|
def favourites_count
|
||||||
|
@object['likes']['totalItems'] if @object.is_a?(Hash) && @object['likes'].is_a?(Hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
def reblogs_count
|
||||||
|
@object['shares']['totalItems'] if @object.is_a?(Hash) && @object['shares'].is_a?(Hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
def quote_policy
|
||||||
|
flags = 0
|
||||||
|
policy = @object.dig('interactionPolicy', 'canQuote')
|
||||||
|
return flags if policy.blank?
|
||||||
|
|
||||||
|
flags |= quote_subpolicy(policy['automaticApproval'])
|
||||||
|
flags <<= 16
|
||||||
|
flags |= quote_subpolicy(policy['manualApproval'])
|
||||||
|
|
||||||
|
flags
|
||||||
|
end
|
||||||
|
|
||||||
|
def quote?
|
||||||
|
%w(quote _misskey_quote quoteUrl quoteUri).any? { |key| @object[key].present? }
|
||||||
|
end
|
||||||
|
|
||||||
|
def deleted_quote?
|
||||||
|
@object['quote'].is_a?(Hash) && @object['quote']['type'] == 'Tombstone'
|
||||||
|
end
|
||||||
|
|
||||||
|
def quote_uri
|
||||||
|
%w(quote _misskey_quote quoteUrl quoteUri).filter_map do |key|
|
||||||
|
value_or_id(as_array(@object[key]).first)
|
||||||
|
end.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def legacy_quote?
|
||||||
|
!@object.key?('quote')
|
||||||
|
end
|
||||||
|
|
||||||
|
# The inlined quote; out of the attributes we support, only `https://w3id.org/fep/044f#quote` explicitly supports inlined objects
|
||||||
|
def quoted_object
|
||||||
|
as_array(@object['quote']).first
|
||||||
|
end
|
||||||
|
|
||||||
|
def quote_approval_uri
|
||||||
|
as_array(@object['quoteAuthorization']).first
|
||||||
|
end
|
||||||
|
|
||||||
|
def converted_object_type?
|
||||||
|
equals_or_includes_any?(@object['type'], ActivityPub::Activity::CONVERTED_TYPES)
|
||||||
|
end
|
||||||
|
|
||||||
|
def audience_to
|
||||||
|
as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def audience_cc
|
||||||
|
as_array(@object['cc'] || @json['cc']).map { |x| value_or_id(x) }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def quote_subpolicy(subpolicy)
|
||||||
|
flags = 0
|
||||||
|
|
||||||
|
allowed_actors = as_array(subpolicy).dup
|
||||||
|
allowed_actors.uniq!
|
||||||
|
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:public] if allowed_actors.delete('as:Public') || allowed_actors.delete('Public') || allowed_actors.delete('https://www.w3.org/ns/activitystreams#Public')
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:followers] if allowed_actors.delete(@options[:followers_collection])
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:following] if allowed_actors.delete(@options[:following_collection])
|
||||||
|
|
||||||
|
# Remove the special-meaning actor URI
|
||||||
|
allowed_actors.delete(@options[:actor_uri])
|
||||||
|
|
||||||
|
# Any unrecognized actor is marked as unsupported
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:unsupported_policy] unless allowed_actors.empty?
|
||||||
|
|
||||||
|
flags
|
||||||
|
end
|
||||||
|
|
||||||
|
def raw_language_code
|
||||||
|
if content_language_map?
|
||||||
|
@object['contentMap'].keys.first
|
||||||
|
elsif name_language_map?
|
||||||
|
@object['nameMap'].keys.first
|
||||||
|
elsif summary_language_map?
|
||||||
|
@object['summaryMap'].keys.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
def direct_message
|
||||||
|
@object['directMessage']
|
||||||
|
end
|
||||||
|
|
||||||
|
def audience_to
|
||||||
|
as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def audience_cc
|
||||||
|
as_array(@object['cc'] || @json['cc']).map { |x| value_or_id(x) }
|
||||||
|
end
|
||||||
|
|
||||||
|
=======
|
||||||
|
>>>>>>> 61a1238bd7 (Fix lax relevancy check in inbound activity processing (#39892))
|
||||||
|
def summary_language_map?
|
||||||
|
@object['summaryMap'].is_a?(Hash) && !@object['summaryMap'].empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
def content_language_map?
|
||||||
|
@object['contentMap'].is_a?(Hash) && !@object['contentMap'].empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
def name_language_map?
|
||||||
|
@object['nameMap'].is_a?(Hash) && !@object['nameMap'].empty?
|
||||||
|
end
|
||||||
|
end
|
||||||
153
docker-compose.yml.orig
Normal file
153
docker-compose.yml.orig
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
# This file is designed for production server deployment, not local development work
|
||||||
|
# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/docs/DEVELOPMENT.md#docker
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
restart: always
|
||||||
|
image: postgres:14-alpine
|
||||||
|
shm_size: 256mb
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres']
|
||||||
|
volumes:
|
||||||
|
- ./postgres14:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
- 'POSTGRES_HOST_AUTH_METHOD=trust'
|
||||||
|
|
||||||
|
redis:
|
||||||
|
restart: always
|
||||||
|
image: redis:7-alpine
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'redis-cli', 'ping']
|
||||||
|
volumes:
|
||||||
|
- ./redis:/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: always
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch:8.19.15
|
||||||
|
# environment:
|
||||||
|
# - "ELASTIC_PASSWORD=password" #Username is elastic. Do not change the username.
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
|
||||||
|
# - "xpack.license.self_generated.type=basic"
|
||||||
|
# - "xpack.security.enabled=false"
|
||||||
|
# - "xpack.watcher.enabled=false"
|
||||||
|
# - "xpack.graph.enabled=false"
|
||||||
|
# - "xpack.ml.enabled=false"
|
||||||
|
# - "bootstrap.memory_lock=true"
|
||||||
|
# - "cluster.name=es-mastodon"
|
||||||
|
# - "discovery.type=single-node"
|
||||||
|
# - "thread_pool.write.queue_size=1000"
|
||||||
|
# networks:
|
||||||
|
# - external_network
|
||||||
|
# - internal_network
|
||||||
|
# healthcheck:
|
||||||
|
# test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
# ulimits:
|
||||||
|
# memlock:
|
||||||
|
# soft: -1
|
||||||
|
# hard: -1
|
||||||
|
# nofile:
|
||||||
|
# soft: 65536
|
||||||
|
# hard: 65536
|
||||||
|
# ports:
|
||||||
|
# - '127.0.0.1:9200:9200'
|
||||||
|
|
||||||
|
web:
|
||||||
|
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
|
# build: .
|
||||||
|
<<<<<<< HEAD
|
||||||
|
image: ghcr.io/glitch-soc/mastodon:v4.6.3
|
||||||
|
=======
|
||||||
|
image: ghcr.io/mastodon/mastodon:v4.6.6
|
||||||
|
>>>>>>> d74bbd9a3c (Bump version to v4.6.6)
|
||||||
|
restart: always
|
||||||
|
env_file: .env.production
|
||||||
|
command: bundle exec puma -C config/puma.rb
|
||||||
|
networks:
|
||||||
|
- external_network
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
# prettier-ignore
|
||||||
|
test: ['CMD-SHELL',"curl -s --noproxy localhost localhost:3000/health | grep -q 'OK' || exit 1"]
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:3000:3000'
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
# - es
|
||||||
|
volumes:
|
||||||
|
- ./public/system:/mastodon/public/system
|
||||||
|
|
||||||
|
streaming:
|
||||||
|
# You can uncomment the following lines if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
|
# build:
|
||||||
|
# dockerfile: ./streaming/Dockerfile
|
||||||
|
# context: .
|
||||||
|
<<<<<<< HEAD
|
||||||
|
image: ghcr.io/glitch-soc/mastodon-streaming:v4.6.3
|
||||||
|
=======
|
||||||
|
image: ghcr.io/mastodon/mastodon-streaming:v4.6.6
|
||||||
|
>>>>>>> d74bbd9a3c (Bump version to v4.6.6)
|
||||||
|
restart: always
|
||||||
|
env_file: .env.production
|
||||||
|
command: node ./streaming/index.js
|
||||||
|
networks:
|
||||||
|
- external_network
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
# prettier-ignore
|
||||||
|
test: ['CMD-SHELL', "curl -s --noproxy localhost localhost:4000/api/v1/streaming/health | grep -q 'OK' || exit 1"]
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:4000:4000'
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
|
||||||
|
sidekiq:
|
||||||
|
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
|
# build: .
|
||||||
|
<<<<<<< HEAD
|
||||||
|
image: ghcr.io/glitch-soc/mastodon:v4.6.3
|
||||||
|
=======
|
||||||
|
image: ghcr.io/mastodon/mastodon:v4.6.6
|
||||||
|
>>>>>>> d74bbd9a3c (Bump version to v4.6.6)
|
||||||
|
restart: always
|
||||||
|
env_file: .env.production
|
||||||
|
command: bundle exec sidekiq
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
networks:
|
||||||
|
- external_network
|
||||||
|
- internal_network
|
||||||
|
volumes:
|
||||||
|
- ./public/system:/mastodon/public/system
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 8' || false"]
|
||||||
|
|
||||||
|
## Uncomment to enable federation with tor instances along with adding the following ENV variables
|
||||||
|
## http_hidden_proxy=http://privoxy:8118
|
||||||
|
## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
|
||||||
|
# tor:
|
||||||
|
# image: sirboops/tor
|
||||||
|
# networks:
|
||||||
|
# - external_network
|
||||||
|
# - internal_network
|
||||||
|
#
|
||||||
|
# privoxy:
|
||||||
|
# image: sirboops/privoxy
|
||||||
|
# volumes:
|
||||||
|
# - ./priv-config:/opt/config
|
||||||
|
# networks:
|
||||||
|
# - external_network
|
||||||
|
# - internal_network
|
||||||
|
|
||||||
|
networks:
|
||||||
|
external_network:
|
||||||
|
internal_network:
|
||||||
|
internal: true
|
||||||
1461
spec/lib/activitypub/activity/create_spec.rb.orig
Normal file
1461
spec/lib/activitypub/activity/create_spec.rb.orig
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user