2024-02-27 16:43:46 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2024-02-28 19:04:37 +00:00
|
|
|
# Relación entre Fediblocks y Sites.
|
|
|
|
#
|
|
|
|
# Cuando se habilita un Fediblock, tenemos que asociar todas sus
|
|
|
|
# instancias con el sitio y bloquearlas. Cuando se deshabilita, la
|
|
|
|
# relación ya está creada y se va actualizando.
|
|
|
|
#
|
|
|
|
# @see ActivityPub::FediblockUpdatedJob
|
2024-02-27 16:43:46 +00:00
|
|
|
class FediblockState < ApplicationRecord
|
|
|
|
include AASM
|
|
|
|
|
|
|
|
belongs_to :site
|
|
|
|
belongs_to :fediblock, class_name: 'ActivityPub::Fediblock'
|
|
|
|
|
|
|
|
# El efecto secundario de esta máquina de estados es modificar el
|
|
|
|
# estado de moderación de cada instancia en el sitio. Nos salteamos
|
|
|
|
# los hooks de los eventos individuales.
|
|
|
|
aasm do
|
|
|
|
# Aunque queramos las listas habilitadas por defecto, tenemos que
|
|
|
|
# habilitarlas luego de crearlas para poder generar la lista de
|
|
|
|
# bloqueo en la Social Inbox.
|
|
|
|
state :disabled, initial: true
|
|
|
|
state :enabled
|
|
|
|
|
|
|
|
event :enable do
|
|
|
|
transitions from: :disabled, to: :enabled
|
|
|
|
|
|
|
|
before do
|
|
|
|
enable_remotely!
|
2024-02-28 19:04:37 +00:00
|
|
|
|
|
|
|
# Al actualizar el estado en masa garantizamos que las
|
|
|
|
# instancias que ya existen queden sincronizadas con el bloqueo
|
|
|
|
# en masa que acabamos de hacer.
|
|
|
|
instance_moderations.block_all!
|
|
|
|
|
|
|
|
# Luego esta tarea crea las que falten e ignora las que ya se
|
|
|
|
# bloquearon.
|
2024-02-28 19:36:50 +00:00
|
|
|
ActivityPub::InstanceModerationJob.perform_now(site: site, hostnames: fediblock.hostnames)
|
2024-02-29 19:45:06 +00:00
|
|
|
|
|
|
|
# Bloquear a todes les Actores de las instancias bloqueadas para
|
|
|
|
# indicarle a le usuarie que les tiene que desbloquear
|
|
|
|
# manualmente.
|
|
|
|
ActorModeration.where(actor_id: actor_ids).paused.block_all!
|
2024-02-27 16:43:46 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Al deshabilitar, las listas pasan a modo pausa.
|
|
|
|
#
|
|
|
|
# @todo No cambiar el estado si se habían habilitado manualmente,
|
|
|
|
# pero esto implica que tenemos que encontrar las que sí y quitarlas
|
|
|
|
# de list_names
|
|
|
|
event :disable do
|
|
|
|
transitions from: :enabled, to: :disabled
|
|
|
|
|
|
|
|
before do
|
|
|
|
disable_remotely!
|
2024-02-28 19:04:37 +00:00
|
|
|
|
|
|
|
instance_moderations.pause_all!
|
2024-02-29 19:45:06 +00:00
|
|
|
|
|
|
|
# Volver a pausar todes les actores de esta instancia que fueron
|
|
|
|
# bloqueades.
|
|
|
|
ActorModeration.where(actor_id: actor_ids).blocked.pause_all!
|
2024-02-27 16:43:46 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2024-02-29 19:45:06 +00:00
|
|
|
def actor_ids
|
|
|
|
ActivityPub::Actor.where(instance_id: instance_ids).pluck(:id)
|
|
|
|
end
|
|
|
|
|
|
|
|
def instance_ids
|
|
|
|
fediblock.instances.pluck(:id)
|
|
|
|
end
|
|
|
|
|
2024-02-28 19:04:37 +00:00
|
|
|
# Todas las instancias de moderación de este sitio
|
|
|
|
def instance_moderations
|
2024-02-29 19:45:06 +00:00
|
|
|
site.instance_moderations.where(instance_id: instance_ids)
|
2024-02-27 16:43:46 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# @return [Array<String>]
|
|
|
|
def list_names
|
2024-03-06 18:03:17 +00:00
|
|
|
@list_names ||= fediblock.hostnames.map do |hostname|
|
|
|
|
"@*@#{hostname}"
|
2024-02-27 16:43:46 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Al deshabilitar, las instancias pasan a ser analizadas caso por caso
|
|
|
|
def disable_remotely!
|
2024-03-06 17:31:32 +00:00
|
|
|
raise unless
|
2024-02-27 16:43:46 +00:00
|
|
|
site.social_inbox.blocklist.delete(list: list_names).ok? &&
|
|
|
|
site.social_inbox.allowlist.delete(list: list_names).ok?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Al habilitar, se bloquean todas las instancias de la lista
|
|
|
|
def enable_remotely!
|
2024-03-06 17:31:32 +00:00
|
|
|
raise unless
|
2024-02-27 16:43:46 +00:00
|
|
|
site.social_inbox.blocklist.post(list: list_names).ok? &&
|
|
|
|
site.social_inbox.allowlist.delete(list: list_names).ok?
|
|
|
|
end
|
|
|
|
end
|