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