mirror of
https://github.com/glitch-soc/mastodon.git
synced 2025-12-13 15:58:50 +00:00
Merge commit 'c58967c3bd7b7eee0b284ee2b77a48ed9ce6863e' into glitch-soc/merge-upstream
Conflicts: - `lib/sanitize_ext/sanitize_config.rb`: Conflict due to upstream adding fallback support for MathML Core while glitch-soc supported slightly more tags than upstream. Added the MathML Core fallback code to glitch-soc. - `spec/lib/sanitize/config_spec.rb`: Ditto.
This commit is contained in:
@@ -5,6 +5,7 @@ require_relative 'base'
|
||||
module Mastodon::CLI
|
||||
class Feeds < Base
|
||||
include Redisable
|
||||
include DatabaseHelper
|
||||
|
||||
option :all, type: :boolean, default: false
|
||||
option :concurrency, type: :numeric, default: 5, aliases: [:c]
|
||||
@@ -44,6 +45,38 @@ module Mastodon::CLI
|
||||
say('OK', :green)
|
||||
end
|
||||
|
||||
desc 'vacuum', 'Remove home feeds of inactive users from Redis'
|
||||
long_desc <<-LONG_DESC
|
||||
Running this task should not be needed in most cases, as Mastodon will
|
||||
automatically clean up feeds from inactive accounts every day.
|
||||
|
||||
However, this task is more aggressive in order to clean up feeds that
|
||||
may have been missed because of bugs or database mishaps.
|
||||
LONG_DESC
|
||||
def vacuum
|
||||
with_read_replica do
|
||||
say('Deleting orphaned home feeds…')
|
||||
redis.scan_each(match: 'feed:home:*').each_slice(1000) do |keys|
|
||||
ids = keys.map { |key| key.split(':')[2] }.compact_blank
|
||||
|
||||
known_ids = User.confirmed.signed_in_recently.where(account_id: ids).pluck(:account_id)
|
||||
|
||||
keys_to_delete = keys.filter { |key| known_ids.exclude?(key.split(':')[2]&.to_i) }
|
||||
redis.del(keys_to_delete)
|
||||
end
|
||||
|
||||
say('Deleting orphaned list feeds…')
|
||||
redis.scan_each(match: 'feed:list:*').each_slice(1000) do |keys|
|
||||
ids = keys.map { |key| key.split(':')[2] }.compact_blank
|
||||
|
||||
known_ids = List.where(account_id: User.confirmed.signed_in_recently.select(:account_id)).where(id: ids).pluck(:id)
|
||||
|
||||
keys_to_delete = keys.filter { |key| known_ids.exclude?(key.split(':')[2]&.to_i) }
|
||||
redis.del(keys_to_delete)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def active_user_accounts
|
||||
|
||||
@@ -74,6 +74,44 @@ class Sanitize
|
||||
current_node.replace(current_node.document.create_text_node(current_node.text)) unless LINK_PROTOCOLS.include?(scheme)
|
||||
end
|
||||
|
||||
# We assume that incomming <math> nodes are of the form
|
||||
# <math><semantics>...<annotation>...</annotation></semantics></math>
|
||||
# according to the [FEP]. We try to grab the most relevant plain-text
|
||||
# annotation from the semantics node, and use it to display a representation
|
||||
# of the mathematics.
|
||||
#
|
||||
# FEP: https://codeberg.org/fediverse/fep/src/branch/main/fep/dc88/fep-dc88.md
|
||||
MATH_TRANSFORMER = lambda do |env|
|
||||
math = env[:node]
|
||||
return if env[:is_allowlisted]
|
||||
return unless math.element? && env[:node_name] == 'math'
|
||||
|
||||
semantics = math.element_children[0]
|
||||
return if semantics.nil? || semantics.name != 'semantics'
|
||||
|
||||
# next, we find the plain-text description
|
||||
is_annotation_with_encoding = lambda do |encoding, node|
|
||||
return false unless node.name == 'annotation'
|
||||
|
||||
node.attributes['encoding'].value == encoding
|
||||
end
|
||||
|
||||
annotation = semantics.children.find(&is_annotation_with_encoding.curry['application/x-tex'])
|
||||
if annotation
|
||||
text = if math.attributes['display']&.value == 'block'
|
||||
"$$#{annotation.text}$$"
|
||||
else
|
||||
"$#{annotation.text}$"
|
||||
end
|
||||
math.replace(math.document.create_text_node(text))
|
||||
return
|
||||
end
|
||||
# Don't bother surrounding 'text/plain' annotations with dollar signs,
|
||||
# since it isn't LaTeX
|
||||
annotation = semantics.children.find(&is_annotation_with_encoding.curry['text/plain'])
|
||||
math.replace(math.document.create_text_node(annotation.text)) unless annotation.nil?
|
||||
end
|
||||
|
||||
MASTODON_STRICT = freeze_config(
|
||||
elements: %w(p br span a abbr del s pre blockquote code b strong u sub sup i em h1 h2 h3 h4 h5 ul ol li ruby rt rp),
|
||||
|
||||
@@ -102,6 +140,7 @@ class Sanitize
|
||||
ALLOWED_CLASS_TRANSFORMER,
|
||||
IMG_TAG_TRANSFORMER,
|
||||
TRANSLATE_TRANSFORMER,
|
||||
MATH_TRANSFORMER,
|
||||
UNSUPPORTED_HREF_TRANSFORMER,
|
||||
]
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user