[master勢のみ・修正されました] Mastodon の 不完全な ActivityPub 対応を取り除く

  • 投稿日:
  • by
  • カテゴリ:

注意:この記事は、古い状態について述べています。冒頭の追加部分をお読みください。

修正されました

問題を解決するコミットが追加されました。それにより、ここに記されるパッチは、ActivityPubの相互接続性に障害を与える可能性を増加させます。このパッチは、適応せず可能な限りmasterへの追従を続けてください。(さもなくば、v1.5.1での運用を推奨します。)

以下は、アーカイブです。

8月9日に組み込まれた、"Add ActivityPub inbox (#4216)" というコミットで、 Mastodon に部分的に ActivityPub 対応が行われました。しかしながら、多くの既存の Mastodon インスタンスを ActivityPub 対応と誤認識する問題があります。(執筆時現在、まだ修正されていません。)

ここでは、この状態で運用された環境において、master運用を続けながらも、この問題を回避する手段を記します。

問題のコミット

問題となっているコミットは、以下のものです。

問題の概要

Mastodon は、現在 Ostatus から ActivityPub へ相互通信のプロトコルを置き換えようとしています。その中で、問題のコミットでは、ユーザーが "Ostatus を介するユーザー" か "ActivityPub を介するユーザー" か判定されるようになりました。

しかしながら、Mastodon v1.3.0以降の全てのユーザーが、ActivityPub を介するユーザーであると誤認識される問題があります。現在、 master を含む全ての Mastodon は、 ActivityPub に必要な機能の全ては実装していないため、そのように認識されることで、様々なやりとり(フォロー・お気に入り・ブースト・購読)が失敗し、最終的にトゥートが届いてこなくなります。

ユーザーが ActivityPub を介すると認識されるタイミング

WebFinger によるユーザー情報の取得のタイミングで情報が更新され、 Ostatus から ActivityPub に切り替わります。様々な相互のやり取り(フォロー・お気に入り・購読など...)が行われるタイミングで関係のあるユーザーの情報が更新されます。また、もともと登録されていなかったユーザーを検索などで取得した場合も ActivityPub を介するユーザーとして登録されます。(備考:GnuSocial は、大丈夫です。)

間違って登録されているリモートユーザーを確認する。

以下のSQL文を Mastodon のデータベースに行ってみることで確認できます。

SELECT id,username,domain,protocol FROM accounts WHERE protocol=1;

これで、列挙されるユーザーは、 ActivityPub を介するユーザーとして認識されており、様々な問題が起きているはずです。

問題への対応

1. 判定の修正(さらに間違いが増えないように)

まず、 ActivityPub として新たにユーザーが認識されないように対応しなくてはなりません。簡単には、以下の2通りの方法が考えられます。

  • 当該コミットのマージ以前のMastodonを利用する。
  • 判定を一時的に強制的に書き換えることで、 ActivityPub 対応を取り除く。

判定の書き換えについては、以下のようにすることで可能です。

2. ActivityPub を介するユーザーとして登録されたユーザーの情報を再取得させる。

続いて、 ActivityPub を介するユーザーとして登録されてしまった Mastodon のユーザーの情報を修復する必要があります。これには、WebFinger によるユーザー情報の再取得が必要となります。ここでは、 WebFinger 情報の有効期限を強制的に切ることで、早急に再取得を促します。

以下のSQL文を Mastodon のデータベースに行います。

UPDATE accounts SET last_webfingered_at=null WHERE protocol=1;

さらに、有効期限が切れた WebFinger 情報の更新を今すぐ行ってしまいましょう。

rails console にて以下のコードを実行します。

Account.where(protocol: :activitypub).each {|acc| ResolveRemoteAccountService.new.call(acc.acct) }

※あるユーザーの更新にエラーが生じるとそこで実行が中断されてしまうので、そのユーザーに関しては以下のように強制的に Ostatus を介するユーザーとして DB を書き換えて対処します。(なるべくしたくない)

UPDATE accounts SET protocol=0 WHERE id=<エラーの生じたユーザーのID>;

これで再度、確認のためにSQL文を実行して、何も表示されなければ正常に更新できました。

SELECT id,username,domain,protocol FROM accounts WHERE protocol=1;

3.再購読などをして、関係を修復する。

ActivityPub を介するユーザーとして判定されていた間に再購読の期限が来ていた場合、再購読に失敗します。したがって、すべてのユーザーをもう一度購読し直すことで、関係の修復をすることを推奨します。

これらについては、以下の記事の追記2などを参考にするとよいでしょう。