Note
このドキュメントは2026-02-27 02:05にPLaMo Translation Modelを使用して自動翻訳されました。
FEP-400e: ActivityPubにおける公開追加可能なコレクション機能
概要
ソーシャルメディアにおいて、特定のユーザーが所有するコレクションに対して、他のユーザーもコンテンツを投稿できるケースは頻繁に見られます。具体的な例として以下のようなものがあります:
- 他者が投稿を行えるウォール(掲示板)
- フォーラムおよびその中に設けられたトピック
- グループ内のフォトアルバムで、グループメンバーが写真を追加できるもの
現状では、オブジェクトが「コレクションの一部として作成されたものであり、文脈に沿ってのみ考慮されるべきである」ということを示す汎用的な方法は存在しません。
本提案では、ActivityPubサーバーとクライアントが、どのようにアクターによって作成されたオブジェクトがどのコレクションに属するかを指定できるかについて説明します。
要件
本仕様書における「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」といった用語は、[RFC-2119]の規定に従って解釈されるものとします。
公開追加可能なコレクション
公開追加可能なコレクションとは、所有者以外の第三者がアイテムを登録できる一方で、完全な管理権限は所有者が保持するタイプのコレクションを指します。例えば、ウォールは他のユーザーが投稿(Note)を追加できるコレクションですが、所有者はすべての投稿を削除したり、誰が投稿できるかを制限したりする権限を持っています。
公開追加可能なコレクションには、有効かつグローバルに一意なidを付与することが推奨されます。このidは、すべてのオブジェクトへのリンクを含むCollectionまたはOrderedCollectionオブジェクトを指すものでなければなりません。
アクターにおけるコレクション指定方法
アクターが公開追加可能なコレクションを所有している場合、そのサーバーはActivityPub表現においてこれらを追加フィールドとして含めることができます。例えば、ユーザーアクターは自分のウォールへのURLを指定でき、グループであればフォトアルバムコレクションへのリンクを指定することが可能です。
実装においては、特定のコレクションの有無を確認することで、そのアクターのサーバーがそのコレクションに依存する機能をサポートしているかどうかを判断し、それに応じてUIを変更することが許容されます。
オブジェクトにおけるtargetフィールドの使用方法
ActivityPubオブジェクトがコレクションの一部として作成される場合、当該オブジェクトには以下の内容を包含したtargetフィールドを含める必要があります:
type— 「Collection」または「OrderedCollection」id— コレクションのidattributedTo— コレクション所有者のid。これは受信側データベース設計を簡素化する上で重要です
議論事項
[Activity Vocabulary]ではtargetフィールドをアクティビティと同様の意味を持つフィールドとして規定していますが、オブジェクト自体にこのフィールドを含めることが極めて重要です。これにより、他のオブジェクトからリンクをたどってきた場合や、ユーザー提供のURIから直接取得した場合など、包含するCreateアクティビティなしでオブジェクトのみを取得したソフトウェアであっても、明確に「当該オブジェクトはコレクション内のみで考慮されるべきである」と認識できるようになります。
オブジェクトをコレクションに追加する方法
ActivityPubサーバーが受信トレイで適切に署名されたCreateアクティビティとtargetフィールドを含むオブジェクトを受け取った場合、以下の処理を行います:
attributedToまたは短縮版コレクションオブジェクトのidフィールドを使用して、コレクション所有者を取得します- コレクション所有者が存在しない場合、または
attributedTo値が実際のコレクション所有者(idで指定)と一致しない場合、あるいはその所有者がローカルアクターでない場合、サーバーは処理を中断し、必要に応じて400 Bad Requestを返すべきです - オブジェクトをコレクションに追加できない場合(例えば所有者が設定したプライバシー設定による制限がある場合)、サーバーは
403 Unauthorizedを返すか、200 OKで応答した後に元の送信者に対してReject{Create}アクティビティを送信するべきです - オブジェクト全体またはその
idのいずれかを、指定されたコレクションに属するものとしてローカルストレージに保存します - 当該オブジェクトに関心を持つ可能性のあるすべての関係者に対して、
Addアクティビティを送信します。アクティビティ内のtargetフィールドにはコレクションのidのみを含み、objectフィールドには追加するオブジェクトのidを含める必要があります。データ整合性の観点から、このアクティビティは可能な限りコレクション所有者のフォロワー全員に送信することが推奨されます。また、追加されたオブジェクトを作成したアクターに対しても必ず送信するべきです - 通知送信など、実装固有の処理を実行します
Addアクティビティを受信した場合の処理手順
ActivityPubサーバーが受信トレイで適切に署名されたAddアクティビティを受け取った場合、以下の処理を実施する必要があります:
actor情報をローカルストレージまたはネットワークから取得します- 対象オブジェクトを取得します
targetフィールドがactorが所有するコレクションのIDであることを確認します。一致しない場合は処理を中断し、400 Bad Requestを返すべきです- アクティビティ内の
target値がオブジェクト内のtarget.idと一致すること、およびオブジェクト内のtarget.attributedTo値がアクターIDと一致することを検証します。いずれかが一致しない場合、処理を中断し400 Bad Requestを返すべきです - オブジェクト全体またはその
idのいずれかを、指定されたコレクションに属するものとしてローカルストレージに保存します - 通知送信など、実装固有の処理を実行します
Addアクティビティの具体例
{
"@context": "https://www.w3.org/ns/activitystreams",
"actor": "https://example.com/users/1",
"id": "https://example.com/posts/41864/activityAdd",
"to": [
"https://www.w3.org/ns/activitystreams#Public",
"https://example.com/users/1/followers",
"https://example.com/users/6946"
],
"type": "Add",
"object": "https://example.com/posts/41864",
"target": "https://example.com/users/1/wall"
}
コレクションからオブジェクトを削除する方法
コレクション所有者はコレクションの内容に対して完全な権限を有するため、任意のオブジェクトをコレクションから削除できます。所有者がコレクション内のオブジェクトを削除した場合、そのサーバーは以下の処理を行う必要があります:少なくとも当該オブジェクトを作成したアクターのサーバーに対してはDeleteアクティビティを送信すること。さらに、Addアクティビティを送信したすべてのサーバーに対してもこのアクティビティを送信することが推奨されます。これらのサーバーは、あたかも作成者自身が削除操作を行ったかのように、該当するオブジェクトを実際に削除するべきです。
コレクション間でオブジェクトを移動する方法について
特定のユースケースにおいては、オブジェクトを異なるコレクション間で移動させることが合理的である場合があります。例えば、グループモデレーターがグループ内の異なるフォトアルバム間で写真を移動させたり、フォーラムモデレーターがいくつかのメッセージを別スレッドに分割したりする場合などです。ただし、オブジェクトを移動させることができるのは、同じアクターが所有するコレクション間に限られます。
コレクション間でオブジェクトを移動する際、コレクション所有者は以下の処理を行う必要があります:少なくとも当該オブジェクトを作成したサーバーに対して、対象コレクションとオブジェクトのidを指定した上でMoveアクティビティを送信すること。さらに、Addアクティビティを送信したすべてのサーバーに対してもこのアクティビティを送信することが推奨されます。これらのサーバーは、保存済みオブジェクトのコピーにおけるtargetフィールドを適切に更新するべきです。
セキュリティに関する考慮事項
コレクション所有者によるAddアクティビティの送信要件により、悪意のあるアクターがコレクション所有者の意思に反して効果的にコンテンツを追加することを効果的に防止できるとともに、サーバー間におけるデータ整合性の維持にも寄与します。ただし、依然として以下のケースではこの問題が発生する可能性があります。ユーザーがURLを直接検索ボックスに入力した場合や、inReplyToなどのフィールドで参照された場合など、オブジェクトが直接的にtargetフィールドを含む形で取得される状況では、当該オブジェクトが実際にコレクションに属しているかどうかを信頼性高く検証する方法が現時点では存在しません。
実装状況
本提案機能は、以下のコミット以降、Smithereenにおいてユーザーウォールとグループウォールの両方に実装されています:https://github.com/grishka/Smithereen/commit/de013593dde06a3091ecfbd32960a694d79c146e
参考文献
- [RFC-2119] S. Bradner, RFCにおける要件レベルを示すためのキーワード使用について
- [Activity Vocabulary], James M Snell, Evan Prodromou, Activity Vocabulary
著作権について
法律で認められる範囲において、本Fediverse Enhancement Proposalの著者らは、当該作品に関するすべての著作権および関連する権利を放棄し、パブリックドメインに寄贈することを宣言します。