Plugin ActivityPub

@hellekin Grazie per la segnalazione. Si verificherà sempre un certo numero di richieste fallite su un servizio ActivityPub poiché gli attori nel fediverso vanno e vengono. Ad esempio, sembra che

La verbosità dei log è lì per aiutare nel debug, tuttavia se stanno ingombrando i tuoi log puoi attivarli/disattivarli utilizzando l’impostazione del sito activity pub verbose logging. L’impostazione predefinita è disattivata.

Stiamo cercando di apportare miglioramenti alla gestione degli errori nella fase due, se necessario, ma finora sembra che gli snippet che hai pubblicato siano attesi, cioè gli attori non sono più nel fediverso.

Attualmente, il modo in cui il plugin gestisce i fallimenti di consegna è tracciarli nello stesso modo in cui fa Mastodon, ovvero, se ci sono 7 giorni di fallimento verso un endpoint, verrà contrassegnato come “non disponibile” e non verranno più tentate richieste.

3 Mi Piace

Sì, come indicato nella riga precedente.

Infatti, ma il codice di stato è 410, il che significa che l’account potrebbe essersi spostato (se c’è una Tombstone — questa condizione viene verificata?)

1 Mi Piace

No. È l’errore 410 Gone e significa che la risorsa è stata eliminata. Cosa mi sfugge adesso?

1 Mi Piace

Hai dimenticato questo:

Ciao @angus,

Ho appena configurato un nuovo discourse self-hosted con il tuo plugin AP su https://federation.cafe e sto riscontrando alcuni errori 403 nei log degli errori di Discourse (e i post non vengono condivisi).

Mi chiedo se possa essere dovuto alla presenza di trattini, forse?

[Discourse Activity Pub] GET request to https://bofh.social/internal/fetch failed: Expected([200, 201, 202, 301, 302, 307, 308]) <=> Actual(403 Forbidden)

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:66:in `rescue in perform'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:50:in `perform'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:34:in `get_json_ld'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:106:in `get_json_ld'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/json_ld.rb:52:in `request_object'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/json_ld.rb:48:in `resolve_object'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/actor.rb:103:in `resolve_and_store'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:192:in `actor_from_key_id'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:57:in `signed_request_actor'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:27:in `ensure_verified_signature'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:400:in `block in make_lambda'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:180:in `block (2 levels) in halting_and_conditional'
actionpack-7.0.4.3/lib/abstract_controller/callbacks.rb:34:in `block (2 levels) in <module:Callbacks>'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:181:in `block in halting_and_conditional'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `block in invoke_before'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `each'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `invoke_before'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:116:in `block in run_callbacks'
/var/www/discourse/app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
i18n-1.14.1/lib/i18n.rb:322:in `with_locale'
/var/www/discourse/app/controllers/application_controller.rb:418:in `with_resolved_locale'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:127:in `block in run_callbacks'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:138:in `run_callbacks'
actionpack-7.0.4.3/lib/abstract_controller/callbacks.rb:233:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/instrumentation.rb:67:in `block in process_action'
activesupport-7.0.4.3/lib/active_support/notifications.rb:206:in `block in instrument'
activesupport-7.0.4.3/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-7.0.4.3/lib/active_support/notifications.rb:206:in `instrument'
actionpack-7.0.4.3/lib/action_controller/metal/instrumentation.rb:66:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
activerecord-7.0.4.3/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack-7.0.4.3/lib/abstract_controller/base.rb:151:in `process'
actionview-7.0.4.3/lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler-3.1.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
actionpack-7.0.4.3/lib/action_controller/metal.rb:188:in `dispatch'
actionpack-7.0.4.3/lib/action_controller/metal.rb:251:in `dispatch'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:852:in `call'
railties-7.0.4.3/lib/rails/engine.rb:530:in `call'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `public_send'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `method_missing'
actionpack-7.0.4.3/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
actionpack-7.0.4.3/lib/action_dispatch/routing/mapper.rb:48:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:852:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
rack-2.2.7/lib/rack/tempfile_reaper.rb:15:in `call'
rack-2.2.7/lib/rack/conditional_get.rb:27:in `call'
rack-2.2.7/lib/rack/head.rb:12:in `call'
actionpack-7.0.4.3/lib/action_dispatch/http/permissions_policy.rb:38:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:367:in `call'
rack-2.2.7/lib/rack/session/abstract/id.rb:266:in `context'
rack-2.2.7/lib/rack/session/abstract/id.rb:260:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/cookies.rb:704:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:99:in `run_callbacks'
actionpack-7.0.4.3/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/show_exceptions.rb:26:in `call'
logster-2.12.2/lib/logster/middleware/reporter.rb:43:in `call'
railties-7.0.4.3/lib/rails/rack/logger.rb:40:in `call_app'
railties-7.0.4.3/lib/rails/rack/logger.rb:27:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:29:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/request_id.rb:26:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:24:in `call'
rack-2.2.7/lib/rack/method_override.rb:24:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/executor.rb:14:in `call'
rack-2.2.7/lib/rack/sendfile.rb:110:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/host_authorization.rb:131:in `call'
rack-mini-profiler-3.1.0/lib/mini_profiler.rb:260:in `call'
message_bus-4.3.2/lib/message_bus/rack/middleware.rb:60:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:228:in `call'
railties-7.0.4.3/lib/rails/engine.rb:530:in `call'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `public_send'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `method_missing'
rack-2.2.7/lib/rack/urlmap.rb:74:in `block in call'
rack-2.2.7/lib/rack/urlmap.rb:58:in `each'
rack-2.2.7/lib/rack/urlmap.rb:58:in `call'
unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `load'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `<main>'

hostname	LILEJAP07-app
process_id	658
application_version	1abfe2e61d12b1b559aab0132ec3fb7cc8b87232
HTTP_HOST	federation.cafe
REQUEST_URI	/ap/actor/5ce52c043e670476a1426f9a66472c07
REQUEST_METHOD	GET
HTTP_USER_AGENT	Akkoma 3.8.0-0-gccae7ef; https://bofh.social <admin@bofh.social>
HTTP_ACCEPT	application/activity+json
HTTP_X_FORWARDED_FOR	91.107.215.39, 172.71.250.70
HTTP_X_REAL_IP	172.71.250.70
time	2:16 pm

Pensieri?

Sarei anche interessato a post completi. In tal caso, dovrebbe essere utilizzato il tipo “articolo” anziché “nota”.

Infatti, gli annunci sono molto meno interessanti per me delle funzionalità del forum federato.

Esiste una roadmap e/o un luogo dove inviare donazioni per funzionalità come questa?

Ciao @gme grazie per aver provato il plugin

Ecco alcune cose da notare inizialmente

  1. Il plugin MVP è testato su Mastodon. Vedo che stai usando Pleroma. So che Pleroma è conforme ad ActivityPub e funziona con Mastodon, tuttavia non abbiamo ancora esaminato attentamente quali modifiche potrebbero essere necessarie (se presenti) per garantirne il supporto. Ma sono comunque interessato a vedere cosa sta succedendo qui.

  2. Sembra che le richieste siano fallite a causa di un errore di autenticazione sul tuo server Pleroma (questo è ciò che significa un errore 403). Dato che sono in grado di ottenere quell’endpoint utilizzando una richiesta cURL non autenticata, sospetto che possa essere l’autenticazione http che sta fallendo sul lato Pleroma.

Per testare quest’ultimo (cioè 2), potresti dare un’occhiata ai tuoi log di Pleroma (sembra che tu sia anche l’amministratore di quel server?) se possibile per vedere se riesci a ottenere maggiori dettagli su questo aspetto?

Grazie per il feedback @bmann. Potresti approfondire il caso d’uso che hai in mente qui? Con un esempio, se possibile.

Questo argomento è il posto migliore per tenersi aggiornati sugli sviluppi. Quando avremo definito un piano per la fase 2, lo condividerò qui. Nel frattempo, il modo migliore per aiutare è condividere casi d’uso specifici che stai utilizzando, o vorresti utilizzare, il plugin.

5 Mi Piace

Il caso d’uso prevede l’utilizzo di Discourse come nodo AP più completo. Esistono molti modi più semplici per pubblicare contenuti su AP (ad esempio, utilizzare i feed RSS delle categorie e Zapier o Buffer), ma lo sviluppo di funzionalità AP più complete può essere fatto solo come plugin/integrazione.

Article è il tipo ActivityStream destinato ad articoli completi. A seconda dell’interfaccia client, mostrerà un’anteprima e poi un link per mostrare l’intero articolo inline (molto simile agli avvisi di contenuto, ma con “leggi di più”).

Note è il tipo per il micro-blogging.

Avendo post Article completi, le persone potranno leggere / aumentare / rispondere direttamente nei loro client AP.

E, naturalmente, sarebbe interessante conoscere la vostra roadmap se intendete seguire un’istanza AP più orientata al micro-blogging, o andare in una direzione di forum federato come Lemmy o Kbin, soprattutto date le recenti notizie su Reddit.

1 Mi Piace

@angus, @pmusaraj avete visto la call aperta per finanziamenti di NGI Sargasso? È un preavviso piuttosto breve ma potrebbe essere utile per sviluppare ulteriormente questo plugin (a meno che non abbiate già altri piani).

1 Mi Piace

Ciao ragazzi, sono felice di dire che la seconda fase di lavoro su questo plugin è stata approvata. Questo è ciò su cui abbiamo già iniziato a lavorare, con l’obiettivo di rilasciarlo tra circa 3,5 mesi.

Supporta la modifica delle Note post-pubblicazione

Supporta il ripristino delle Note

Supporta la pubblicazione di post sia pubblicamente che solo per i follower

  • Impostazione a livello di categoria
  • Vedi ulteriori Audience Targeting e la documentazione di Mastodon su to/cc
  • Imposta i post pubblici come predefiniti

Migliora il parsing del contenuto delle Note

  • Gestisci caratteri speciali (forse usa un parser diverso). Vedi ulteriori.

Supporta l’uso di Article invece di Note come Oggetto di un post.

  • Impostazione a livello di categoria

Supporta l’accettazione di Attività in risposta a una Nota creata su server remoti e la pubblicazione di Attività in risposta a una Nota creata su Discourse.

  • Pubblica Attività relative alle risposte create su Discourse
    • Permetti agli utenti di Discourse di essere Attori
    • Crea oggetti Nota per le risposte di Discourse (post)
    • Pubblica Attività Create/Delete/Update/Undo associate per le loro azioni equivalenti su Discourse
  • Accetta Attività relative alle risposte create su server remoti
    • Organizza gli Attori delle Attività dai server remoti come utenti di Discourse
    • Crea risposte di Discourse (post) da oggetti Nota
    • Converti Attività Create/Delete/Update/Undo associate nelle loro azioni equivalenti su Discourse
  • Aggiungi un’impostazione di categoria per passare da “Solo Primo Post” (attuale) a “Argomento Completo” che supporta le Attività di risposta.

Supporta l’Attività Like

Supporta gli utenti di Discourse che verificano la propria identità su Mastodon in modo che i post di Discourse creati dai loro Toot siano associati al loro account utente di Discourse.

  • Permetti a un utente di eseguire il flusso Mastodon OAuth Authorization con il server Mastodon in cui è archiviato il suo account. Questo viene avviato dalle impostazioni dell’account utente di Discourse.
  • Utilizzando il token di accesso Mastodon dell’utente di Discourse, ottieni e archivia l’ID AP del suo account Mastodon e archivialo con il suo account Discourse.
  • Associa tutte le attività di Discourse associate alle Attività AP di un Attore che porta l’ID AP di un utente di Discourse a quell’utente di Discourse, sia che siano state eseguite prima o dopo che l’utente abbia verificato la propria identità.
15 Mi Piace

È davvero emozionante vederlo — un livello molto alto di federazione e interattività. :tada:

State pianificando di fare rilasci intermedi, o sarà un’unica grande release tra circa 3,5 mesi?

Potrebbero esserci alcune release intermedie, ma al momento non posso promettere nulla in merito. Ti terrò aggiornato man mano che procederemo.

2 Mi Piace

Sono d’accordo al 110%: questo include molti aspetti fantastici. :tada:

C’è qualche possibilità che ci possa essere almeno una versione intermedia su questo fronte?

Ad essere onesti, l’aggiunta di una versione intermedia con “post pubblici come predefinito” sarebbe immediatamente benvenuta.

2 Mi Piace

Si noti che la pubblicazione pubblica dipenderebbe dalla federazione delle azioni di modifica (il primo punto elenco elencato), credo.

1 Mi Piace

Non posso fare promesse in questa fase, ma potrebbero esserci aggiornamenti intermedi sia per l’aggiornamento della federazione che per il targeting del pubblico (pubblicazione pubblica).

4 Mi Piace

:occhi:

1 Mi Piace

Questa è una limitazione nota. Finché le modifiche federate non saranno supportate, il plugin bloccherà le modifiche ai contenuti federati e non vi è alcuna configurazione per disabilitare questa funzionalità.

2 Mi Piace

Per essere chiari, stavo cercando di modificare un post qui su meta e ho ricevuto questo errore.

3 Mi Piace

Oh, mi dispiace di aver frainteso. @feature@meta.discourse.org e @announcements@meta.discourse.org almeno vengono federati da qui, e questa scelta è il motivo principale per cui non ho abilitato questo per Maker Forums…

2 Mi Piace

Sì, questo è il primo elemento della Fase 2 su cui ho lavorato. Infatti, c’è già una PR per questo, quindi avrai presto un po’ di sollievo su quel fronte.

2 Mi Piace