misskey icon indicating copy to clipboard operation
misskey copied to clipboard

ファイルの閲覧注意フラグをファイル単位で連合するようにし、また、フラグを変更した場合は再投稿時などでリモートにも反映するようにして欲しい

Open Sayamame-beans opened this issue 1 year ago • 10 comments

Summary

今のところ、ファイルの閲覧注意フラグを変更したとしても他のサーバーには(一度届いてから後は)一切反映されません。 これ自体は"ドライブ"システムによりファイルエントリ(?)を再利用することに起因する致し方のないことだと推測出来ます。 ですが、ドライブ画面から閲覧注意フラグを切り替えられる以上、例えば画像の閲覧注意設定を付け忘れて投稿してしまい、それを変更して、ノートを再投稿したとしてもその変更が反映されないのは非直感的で、不便であると思いました。 また、サーバーごとに規約が異なることによるモデレーション上の厄介な点もあります。(リモートで付いているがローカルで付いていない場合の対処)

<追記> 更に、閲覧注意がファイル単位ではなくノート単位で適用されているため、閲覧注意が本来付いていないファイルにも閲覧注意が付与されてしまう問題があります。 <追記終わり>

そこで、現在は以下のようになっているところ、

  • 画像の閲覧注意フラグはいつでも変更可能
  • リモートでは、ノート内の新規ファイルの1つにフラグが付いていたら、その他の新規ファイルにもフラグが付く(恐らく、ActivityPub的にノート単位でのフラグになっている)
  • ローカルではいつ変更しても反映されて、リモートでは新規ファイルが認識された時点のフラグを利用し更新されない

以下のようにするというのは実現可能でしょうか?

  • 画像の閲覧注意フラグ自体はいつでも変更可能(変わらず)
  • リモートでもファイル単位でフラグが反映されるようにする (ファイル単位のフラグ情報を、ActivityPub用のフラグ情報とは別に用意する)
  • ローカルではいつ変更しても反映されて、リモートでは新規ノート認識時の閲覧注意フラグを利用する (画像が別のノートで投稿された場合に、フラグの変化が反映されるようにする)

~~懸念点として~~

  • ~~新規投稿かRenoteかを区別することが出来るのかどうか~~ ~~(区別することが出来なければ、任意のリモートからのRenoteで更新されてしまいそうです。元サーバーからの更新だけ反映するようにしたとしても、ローカルでモデレーションとして閲覧注意を付与したものが元サーバーからのRenoteで剥がされる可能性があると推測します。)~~

~~があります。~~ 追記: ActivityPub上では、新規投稿はCreate、RenoteはAnnounceとして区別されているので、その点については大丈夫という情報を頂きました。

なお、MisskeyからMastodonへの配送の場合は、ドライブの概念が無いことから(?)再投稿されるとその時点の閲覧注意フラグが反映されるようでした。 参考: https://misskey.niri.la/notes/9gymuixsfg https://misskey.niri.la/notes/9gymz1z11e

Sayamame-beans avatar Jul 09 '23 06:07 Sayamame-beans

タイトルと説明が、issue投稿時の意図に即していなかったことに気付いたため、少し修正しました。

Sayamame-beans avatar Mar 21 '24 12:03 Sayamame-beans

このふるまいは連合結果を容易に確認できないユーザーには不本意と思われます。 実際、送信するときはこのふるまいを意識しないと個別に分けられているものだと気づかず、受信するときは送信者がすべてフラグを立てることを意図したように思えてしまいます。

KisaragiEffective avatar Mar 21 '24 12:03 KisaragiEffective

bisected: #2348:

NSFW, 非NSFWが混在している場合に、 リモートへは(Misskey向けでも)全ファイルNSFWで伝わるが 通信相手がMastodonかMisskeyを区別できないので仕方ない。

KisaragiEffective avatar Mar 21 '24 12:03 KisaragiEffective

bisected: #2348:

NSFW, 非NSFWが混在している場合に、 リモートへは(Misskey向けでも)全ファイルNSFWで伝わるが 通信相手がMastodonかMisskeyを区別できないので仕方ない。

const displayAsSensitive = (note, file) => (note.fromMastodon && note.isSensitive) || 
  file.isSensitive

のような形で実現されてほしい。note.fromMastodonは今日であればnodeinfoから取得できそう

KisaragiEffective avatar Mar 21 '24 12:03 KisaragiEffective

related: https://github.com/misskey-dev/misskey/blob/831c74a25b2db0ba3f6d43a9a1a9072d342b2822/packages/backend/src/core/activitypub/models/ApNoteService.ts#L218

KisaragiEffective avatar Mar 21 '24 12:03 KisaragiEffective

ApNoteServiceにおけるイメージ (todoはホール):

		const fetchInstanceMetadataService: FederatedInstanceService = todo();
		const host: string = todo(note);
		const fromMastodon = await fetchInstanceMetadataService.fetch(host)
			// 安全性のために`true`へフォールバック
			.then(instance => instance.softwareName?.includes("mastodon") ?? true);

		const hasSensitiveFlag: (arg: unknown) => arg is { sensitive: unknown } = (x) => typeof(x) === "object" && x !== null && "sensitive" in x;

		const files = (await Promise.all(toArray(note.attachment).map(attach => {
			// if attach is IApImage, sensitive should be `attach.sensitive` instead of note.sensitive
			const markAsSensitive = (fromMastodon && note.sensitive) || (hasSensitiveFlag(attach) && attach.sensitive === true);
			
			return limit(() => this.apImageService.resolveImage(actor, {
				...attach,
				sensitive: markAsSensitive,
			}));
		})));

KisaragiEffective avatar Mar 21 '24 13:03 KisaragiEffective

bisected: #2348:

NSFW, 非NSFWが混在している場合に、 リモートへは(Misskey向けでも)全ファイルNSFWで伝わるが 通信相手がMastodonかMisskeyを区別できないので仕方ない。

const displayAsSensitive = (note, file) => (note.fromMastodon && note.isSensitive) || 
  file.isSensitive

のような形で実現されてほしい。note.fromMastodonは今日であればnodeinfoから取得できそう

個人的にはMisskey/Mastodonを判別する必要は無いと思っています。 (個別のファイル情報としてフラグ情報を追加する前提においては、)個別のファイル情報にフラグ情報があるならそこのフラグを参照して、無ければノート全体のフラグを参照する従来の方式を取れば良いかなぁと

Sayamame-beans avatar Mar 21 '24 13:03 Sayamame-beans

(確かにそっちの方が相互運用性も高そうですね)

KisaragiEffective avatar Mar 21 '24 13:03 KisaragiEffective

(確かにそっちの方が相互運用性も高そうですね)

ということで修正版:

		function hasSensitiveFlag(obj: unknown): obj is { sensitive: unknown } {
			return typeof(obj) === "object" && obj !== null && "sensitive" in obj;
		}

		const files = (await Promise.all(toArray(note.attachment).map(attach => {
			// if attach has property "sensitive" (i.e. `IApImage` returned from `ApRendererService.renderImage`), 
			// sensitive should be `attach.sensitive` instead of `note.sensitive`
			const markAsSensitive = (hasSensitiveFlag(attach) && attach.sensitive === true) || note.sensitive;

			return limit(() => this.apImageService.resolveImage(actor, {
				...attach,
				sensitive: markAsSensitive,
			}));
		})));

↑これだと引き続きnote.sensitiveが立てられていた時にmarkAsSensitivetrueになってしまうのでよくないかも

KisaragiEffective avatar Mar 21 '24 15:03 KisaragiEffective

また、フラグを変更した場合は再投稿時などでリモートにも反映するようにして欲しい

ドライブファイルをid付きのAP Object扱いで公開して (現状はNote.attachmentに付いてるidなしオブジェクト) フラグ更新時にUpdate Documentを送るようにした方がMisskey同士の連合ではいいかも。

DriveFile→添付されているNote→送信対象 を出すのがちょっと負荷高そう?

mei23 avatar Apr 28 '24 04:04 mei23