Plugin ActivityPub

@hellekin Merci pour le rapport. Une certaine quantité de requêtes échouées se produira toujours sur un service ActivityPub, car les acteurs du fediverse vont et viennent. Par exemple, il semble que

La verbosité des logs est là pour aider au débogage, cependant s’ils encombrent vos logs, vous pouvez les activer ou les désactiver en utilisant le paramètre du site activity pub verbose logging. La valeur par défaut est désactivée.

Nous chercherons à améliorer la gestion des erreurs dans la phase deux si nécessaire, mais jusqu’à présent, il semble que les extraits que vous avez publiés soient attendus, c’est-à-dire que les acteurs ne font effectivement plus partie du fediverse.

Actuellement, la manière dont le plugin gère les échecs de livraison est de les suivre de la même manière que Mastodon, à savoir que s’il y a 7 jours d’échec vers un point de terminaison, il sera marqué comme « indisponible » et aucune requête ne sera plus tentée.

3 « J'aime »

Oui, comme indiqué dans la ligne précédente.

En effet, mais le code d’état est 410, ce qui signifie que le compte a peut-être été déplacé (s’il y a une pierre tombale — cette condition est-elle vérifiée ?)

1 « J'aime »

Non. C’est l’erreur 410 Gone et cela signifie que la ressource a été supprimée. Qu’est-ce qui m’échappe maintenant ?

1 « J'aime »

Vous avez manqué ceci :

Salut @angus,

Je viens d’installer un tout nouveau discourse auto-hébergé avec votre plugin AP sur https://federation.cafe, et je rencontre des erreurs 403 dans les journaux d’erreurs de Discourse (et les publications ne sont pas partagées).

Je me demande si cela pourrait être dû à la présence de tirets, peut-être ?

[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

Des idées ?

Je serais également intéressé par des articles complets. Dans ce cas, le type « article » devrait être utilisé plutôt que « note ».

En fait, les annonces m’intéressent beaucoup moins que les fonctionnalités de forum fédérées.

Existe-t-il une feuille de route et/ou un endroit où envoyer des dons pour de telles fonctionnalités ?

Salut @gme merci d’avoir essayé le plugin

Quelques points à noter initialement ici

  1. Le plugin MVP est testé contre Mastodon. Je vois que vous utilisez Pleroma ici. Je sais que Pleroma est conforme à ActivityPub et fonctionne avec Mastodon, cependant nous n’avons pas encore examiné de près les ajustements qui pourraient être nécessaires (le cas échéant) pour assurer sa prise en charge. Mais je suis toujours intéressé de voir ce qui se passe ici.

  2. Il semble que les requêtes aient échoué en raison d’une erreur d’authentification sur votre serveur Pleroma (c’est ce que signifie une erreur 403). Comme je suis capable de faire un GET sur ce point de terminaison en utilisant une requête cURL non authentifiée, je soupçonne que c’est l’authentification http qui échoue du côté de Pleroma.

Pour tester ce dernier point (c’est-à-dire le point 2), pourriez-vous consulter vos journaux Pleroma (il semble que vous soyez aussi l’administrateur de ce serveur ?) si possible pour voir si vous pouvez obtenir plus de détails de ce côté-là ?

Merci pour vos commentaires @bmann. Pourriez-vous développer le cas d’utilisation que vous avez en tête ici ? Avec un exemple si possible.

Ce sujet est le meilleur endroit pour se tenir au courant des développements. Lorsque nous aurons finalisé un plan de phase 2, je le partagerai ici. En attendant, la meilleure façon d’aider est de partager les cas d’utilisation spécifiques pour lesquels vous utilisez, ou aimeriez utiliser, le plugin.

5 « J'aime »

Le cas d’utilisation consiste à utiliser Discourse comme un nœud AP plus complet. Il existe de nombreuses façons plus simples de publier du contenu sur AP (par exemple, utiliser les flux RSS de catégories et Zapier ou Buffer), mais le développement d’une capacité AP plus complète ne peut se faire qu’en tant que plugin/intégration.

Article est le type ActivityStream destiné aux articles complets. Selon l’interface client, il affichera un aperçu, puis un lien pour afficher l’article entier en ligne (un peu comme les avertissements de contenu, mais avec un « lire la suite »).

Note est le type de microblogging.

En ayant des publications Article complètes, les gens peuvent lire / booster / répondre directement dans leurs clients AP.

Et bien sûr, il serait intéressant d’entendre parler de votre feuille de route si vous allez suivre une instance AP plus axée sur le microblogging, ou vous diriger vers un forum fédéré comme Lemmy ou Kbin, surtout compte tenu des récentes nouvelles de Reddit.

1 « J'aime »

@angus, @pmusaraj, avez-vous vu l’appel à projets ouvert pour NGI Sargasso ? C’est un préavis assez court, mais cela pourrait être utile pour le développement de ce plugin (sauf si vous avez déjà d’autres projets).

1 « J'aime »

Salut à tous, je suis heureux de vous annoncer que la deuxième phase de travail sur ce plugin a été approuvée. C’est sur cela que nous avons déjà commencé à travailler, avec l’objectif de le sortir dans environ 3,5 mois.

Prise en charge de la modification des Notes après publication

Prise en charge de la restauration des Notes

Prise en charge de la publication de messages publiquement ainsi qu’aux seuls abonnés

  • Paramètre au niveau de la catégorie
  • Voir plus loin Audience Targeting et la documentation de Mastodon sur to/cc
  • Passer les publications publiques comme défaut

Amélioration de l’analyse du contenu des Notes

  • Gestion des caractères spéciaux (peut-être utiliser un analyseur différent). Voir plus loin.

Prise en charge de l’utilisation de Article au lieu de Note comme Objet d’un message.

  • Paramètre au niveau de la catégorie

Prise en charge de l’acceptation des Activités en réponse à une Note faite à distance et de la publication d’Activités en réponse à une Note faite dans Discourse.

  • Publication d’Activités concernant les réponses faites dans Discourse
    • Permettre aux utilisateurs de Discourse d’être des Acteurs
    • Créer des objets Note pour les réponses Discourse (messages)
    • Publier les Activités Create/Delete/Update/Undo associées pour leurs actions Discourse équivalentes
  • Accepter les Activités concernant les réponses faites à distance
    • Mettre en scène les Acteurs des Activités provenant de serveurs distants comme utilisateurs Discourse
    • Créer des réponses Discourse (messages) à partir d’objets Note
    • Convertir les Activités Create/Delete/Update/Undo associées en leurs actions Discourse équivalentes
  • Ajouter un paramètre de catégorie pour basculer entre le Premier message uniquement (actuel) et le “Sujet complet” qui prend en charge les Activités de réponse.

Prise en charge de l’Activité Like

Prise en charge de la vérification de l’identité des utilisateurs Discourse sur Mastodon afin que les publications Discourse créées à partir de leurs Toots soient associées à leur compte utilisateur Discourse.

  • Permettre à un utilisateur d’effectuer le flux Mastodon OAuth Authorization avec le serveur Mastodon où son compte est stocké. Ceci est initié à partir des paramètres du compte Discourse de l’utilisateur.
  • En utilisant le jeton d’accès Mastodon de l’utilisateur Discourse, obtenir et stocker l’ID AP de son compte Mastodon et le stocker avec son compte Discourse.
  • Associer toutes les activités Discourse associées aux Activités AP d’un Acteur portant l’ID AP d’un utilisateur Discourse à cet utilisateur Discourse, qu’elles aient été effectuées avant ou après que l’utilisateur ait vérifié son identité.
15 « J'aime »

C’est vraiment passionnant de voir cela — un très haut niveau de fédération et d’interactivité. :tada:

Prévoyez-vous de faire des versions intermédiaires, ou s’agira-t-il d’une seule grosse version dans environ 3,5 mois ?

Il pourrait y avoir des versions intermédiaires, mais je ne peux rien promettre à ce sujet pour le moment. Je vous tiendrai au courant au fur et à mesure.

2 « J'aime »

J’approuve à 110 % — cela inclut de nombreux aspects intéressants. :tada:

Y a-t-il une chance qu’il y ait au moins une version intermédiaire sur ce front ?

Pour être honnête, l’ajout d’une version intermédiaire avec « messages publics par défaut » serait immédiatement le bienvenu.

2 « J'aime »

Il est à noter que la publication publique dépendrait de la fédération des actions de modification (la première puce énumérée), je crois.

1 « J'aime »

Je ne peux faire aucune promesse à ce stade, mais il pourrait bien y avoir des mises à jour intermédiaires pour la fédération des mises à jour et le ciblage d’audience (publication publique).

4 « J'aime »

:eyes:

1 « J'aime »

C’est une limitation connue. Tant que les modifications fédérées ne seront pas prises en charge, le plugin bloquera les modifications du contenu fédéré, et il n’y a aucune configuration pour désactiver cela.

2 « J'aime »

Pour être clair, j’essayais de modifier un message ici sur meta et j’ai obtenu cette erreur.

3 « J'aime »

Oh, je suis désolé d’avoir mal compris. @feature@meta.discourse.org et @announcements@meta.discourse.org sont au moins fédérés à partir d’ici, et ce choix est la raison numéro un pour laquelle je n’ai pas activé cela pour les forums Maker…

2 « J'aime »

Oui, c’est le premier élément de la phase 2 sur lequel j’ai travaillé. En fait, il y a déjà une PR pour cela, donc vous aurez bientôt un peu de répit de ce côté-là.

2 « J'aime »