5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2025-03-15 03:38:17 +00:00

Merge branch 'issue-15109-1' of https://0xacab.org/sutty/sutty into production.panel.sutty.nl

This commit is contained in:
Sutty 2024-03-07 20:19:55 +00:00
commit d30be18e06
24 changed files with 237 additions and 11 deletions

View file

@ -21,7 +21,7 @@ class ActivityPub
validates :activity_pub_id, presence: true validates :activity_pub_id, presence: true
# Las actividades son únicas con respecto a su estado # Las actividades son únicas con respecto a su estado
validates :uri, presence: true, uniqueness: { scope: :activity_pub_id, message: 'estado duplicado' } validates :uri, presence: true, url: true, uniqueness: { scope: :activity_pub_id, message: 'estado duplicado' }
# Siempre en orden descendiente para saber el último estado # Siempre en orden descendiente para saber el último estado
default_scope -> { order(created_at: :desc) } default_scope -> { order(created_at: :desc) }

View file

@ -16,10 +16,16 @@ class ActivityPub
ActivityPub.transaction do ActivityPub.transaction do
object = ActivityPub::Object.find_by(uri: ActivityPub.uri_from_object(content['object'])) object = ActivityPub::Object.find_by(uri: ActivityPub.uri_from_object(content['object']))
if object if object.present?
object.activity_pubs.find_each do |activity_pub| object.activity_pubs.find_each do |activity_pub|
activity_pub.remove! if activity_pub.may_remove? activity_pub.remove! if activity_pub.may_remove?
end end
# Encontrar todas las acciones de moderación de le actore
# eliminade y moverlas a eliminar.
if object.actor_type? && object.actor.present?
ActorModeration.where(actor_id: object.actor.id).remove_all!
end
end end
activity_pub.remove! if activity_pub.may_remove? activity_pub.remove! if activity_pub.may_remove?

View file

@ -16,7 +16,7 @@ class ActivityPub
has_many :remote_flags has_many :remote_flags
# Les actores son únicxs a toda la base de datos # Les actores son únicxs a toda la base de datos
validates :uri, presence: true, uniqueness: true validates :uri, presence: true, url: true, uniqueness: true
# Obtiene el nombre de la Actor como mención, solo si obtuvimos el # Obtiene el nombre de la Actor como mención, solo si obtuvimos el
# contenido de antemano. # contenido de antemano.

View file

@ -6,7 +6,7 @@ class ActivityPub
include ActivityPub::Concerns::JsonLdConcern include ActivityPub::Concerns::JsonLdConcern
# Los objetos son únicos a toda la base de datos # Los objetos son únicos a toda la base de datos
validates :uri, presence: true, uniqueness: true validates :uri, presence: true, url: true, uniqueness: true
has_many :activity_pubs, as: :object has_many :activity_pubs, as: :object
@ -14,7 +14,20 @@ class ActivityPub
# #
# @return [ActivityPub::Actor,nil] # @return [ActivityPub::Actor,nil]
def actor def actor
ActivityPub::Actor.find_by(uri: content['actor']) ActivityPub::Actor.find_by(uri: actor_uri)
end
# @return [String]
def actor_uri
content['attributedTo']
end
def actor_type?
false
end
def object_type?
true
end end
end end
end end

View file

@ -5,6 +5,8 @@
# Una aplicación o instancia # Una aplicación o instancia
class ActivityPub class ActivityPub
class Object class Object
class Application < ActivityPub::Object; end class Application < ActivityPub::Object
include Concerns::ActorTypeConcern
end
end end
end end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Audio =
#
# Representa artículos
class ActivityPub
class Object
class Audio < ActivityPub::Object; end
end
end

View file

@ -0,0 +1,34 @@
# frozen_string_literal: true
class ActivityPub
class Object
module Concerns
module ActorTypeConcern
extend ActiveSupport::Concern
included do
# La URI de le Actor en este caso es la misma id
#
# @return [String]
def actor_uri
uri
end
# El objeto referencia a une Actor
#
# @see {https://www.w3.org/TR/activitystreams-vocabulary/#actor-types}
def actor_type?
true
end
# El objeto es un objeto
#
# @see {https://www.w3.org/TR/activitystreams-vocabulary/#object-types}
def object_type?
false
end
end
end
end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Document =
#
# Representa artículos
class ActivityPub
class Object
class Document < ActivityPub::Object; end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Event =
#
# Representa artículos
class ActivityPub
class Object
class Event < ActivityPub::Object; end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Group =
class ActivityPub
class Object
class Group < ActivityPub::Object
include Concerns::ActorTypeConcern
end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Image =
#
# Representa artículos
class ActivityPub
class Object
class Image < ActivityPub::Object; end
end
end

View file

@ -5,6 +5,8 @@
# Una organización # Una organización
class ActivityPub class ActivityPub
class Object class Object
class Organization < ActivityPub::Object; end class Organization < ActivityPub::Object
include Concerns::ActorTypeConcern
end
end end
end end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Page =
#
# Representa artículos
class ActivityPub
class Object
class Page < ActivityPub::Object; end
end
end

View file

@ -5,6 +5,8 @@
# Una persona, el perfil de une actore # Una persona, el perfil de une actore
class ActivityPub class ActivityPub
class Object class Object
class Person < ActivityPub::Object; end class Person < ActivityPub::Object
include Concerns::ActorTypeConcern
end
end end
end end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Place =
#
# Representa artículos
class ActivityPub
class Object
class Place < ActivityPub::Object; end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Profile =
#
# Representa artículos
class ActivityPub
class Object
class Profile < ActivityPub::Object; end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Relationship =
#
# Representa artículos
class ActivityPub
class Object
class Relationship < ActivityPub::Object; end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Service =
class ActivityPub
class Object
class Service < ActivityPub::Object
include Concerns::ActorTypeConcern
end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Tombstone =
#
# Representa artículos
class ActivityPub
class Object
class Tombstone < ActivityPub::Object; end
end
end

View file

@ -0,0 +1,10 @@
# frozen_string_literal: true
# = Video =
#
# Representa artículos
class ActivityPub
class Object
class Video < ActivityPub::Object; end
end
end

View file

@ -5,8 +5,8 @@ class ActorModeration < ApplicationRecord
include AASM include AASM
include AasmEventsConcern include AasmEventsConcern
IGNORED_EVENTS = [] IGNORED_EVENTS = %i[remove]
IGNORED_STATES = [] IGNORED_STATES = %i[removed]
belongs_to :site belongs_to :site
belongs_to :remote_flag, optional: true, class_name: 'ActivityPub::RemoteFlag' belongs_to :remote_flag, optional: true, class_name: 'ActivityPub::RemoteFlag'
@ -23,11 +23,16 @@ class ActorModeration < ApplicationRecord
self.update_all(aasm_state: 'paused', updated_at: Time.now) self.update_all(aasm_state: 'paused', updated_at: Time.now)
end end
def self.remove_all!
self.update_all(aasm_state: 'removed', updated_at: Time.now)
end
aasm do aasm do
state :paused, initial: true state :paused, initial: true
state :allowed state :allowed
state :blocked state :blocked
state :reported state :reported
state :removed
event :pause do event :pause do
transitions from: %i[allowed blocked reported], to: :paused transitions from: %i[allowed blocked reported], to: :paused
@ -62,6 +67,12 @@ class ActorModeration < ApplicationRecord
ActivityPub::RemoteFlagJob.perform_later(remote_flag: remote_flag) if remote_flag.waiting? ActivityPub::RemoteFlagJob.perform_later(remote_flag: remote_flag) if remote_flag.waiting?
end end
end end
# Si un perfil es eliminado remotamente, tenemos que dejar de
# mostrarlo y todas sus actividades.
event :remove do
transitions to: :removed
end
end end
def pause_remotely! def pause_remotely!

View file

@ -0,0 +1,21 @@
# frozen_string_literal: true
# Valida URLs
#
# @see {https://storck.io/posts/better-http-url-validation-in-ruby-on-rails/}
class UrlValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if value.blank?
record.errors.add(attribute, :url_missing)
return
end
uri = URI.parse(value)
record.errors.add(attribute, :scheme_missing) if uri.scheme.blank?
record.errors.add(attribute, :host_missing) if uri.host.blank?
record.errors.add(attribute, :path_missing) if uri.path.blank?
rescue URI::Error
record.errors.add(attribute, :invalid)
end
end

View file

@ -1,5 +1,7 @@
-# Componente Remote_Profile -# Componente Remote_Profile
- uri = text_plain(remote_profile['id'])
.py-2 .py-2
%dl %dl
%dt= t('.profile_name') %dt= t('.profile_name')
@ -10,7 +12,7 @@
%dt= t('.profile_id') %dt= t('.profile_id')
%dd %dd
= link_to text_plain(remote_profile['id']) = link_to uri, uri
- if remote_profile['published'].present? - if remote_profile['published'].present?
%dt= t('.profile_published') %dt= t('.profile_published')

View file

@ -0,0 +1,13 @@
# frozen_string_literal: true
# Mover todes les actores eliminades
class RemoveActorModerations < ActiveRecord::Migration[6.1]
def up
actor_ids =
ActivityPub.where(aasm_state: 'removed', object_type: 'ActivityPub::Object::Person').distinct.pluck(:actor_id)
ActorModeration.where(id: actor_ids).remove_all!
end
def down; end
end