fix:ロールタイムライン無効に関する修正 (#10843)

* 修正

* note visibility change

* public投稿のみ

* update changelog

* RN非表示機能がうごかないところだった
This commit is contained in:
nenohi 2023-05-19 17:12:22 +09:00 committed by GitHub
parent 02715f5d14
commit bd6666173a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 2 deletions

View file

@ -29,6 +29,8 @@
- AiScriptを0.13.3に更新 - AiScriptを0.13.3に更新
- Fix: URLプレビューで情報が取得できなかった際の挙動を修正 - Fix: URLプレビューで情報が取得できなかった際の挙動を修正
- Fix: Safari、Firefoxでの新規登録時、パスワードマネージャーにメールアドレスが登録されていた挙動を修正 - Fix: Safari、Firefoxでの新規登録時、パスワードマネージャーにメールアドレスが登録されていた挙動を修正
- fix:ロールタイムラインが無効でも投稿が流れてしまう問題の修正
- fix:ロールタイムラインにて全ての投稿が流れてしまう問題の修正
## 13.12.2 ## 13.12.2

View file

@ -306,6 +306,14 @@ export class RoleService implements OnApplicationShutdown {
return user.isRoot || (await this.getUserRoles(user.id)).some(r => r.isAdministrator); return user.isRoot || (await this.getUserRoles(user.id)).some(r => r.isAdministrator);
} }
@bindThis
public async isExplorable(role: { id: Role['id']} | null): Promise<boolean> {
if (role == null) return false;
const check = await this.rolesRepository.findOneBy({ id: role.id });
if (check == null) return false;
return check.isExplorable;
}
@bindThis @bindThis
public async getModeratorIds(includeAdmins = true): Promise<User['id'][]> { public async getModeratorIds(includeAdmins = true): Promise<User['id'][]> {
const roles = await this.rolesCache.fetch(() => this.rolesRepository.findBy({})); const roles = await this.rolesCache.fetch(() => this.rolesRepository.findBy({}));

View file

@ -93,6 +93,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
const query = this.notesRepository.createQueryBuilder('note') const query = this.notesRepository.createQueryBuilder('note')
.where('note.id IN (:...noteIds)', { noteIds: noteIds }) .where('note.id IN (:...noteIds)', { noteIds: noteIds })
.andWhere('(note.visibility = \'public\')')
.innerJoinAndSelect('note.user', 'user') .innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('note.reply', 'reply') .leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote') .leftJoinAndSelect('note.renote', 'renote')

View file

@ -5,15 +5,17 @@ import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import Channel from '../channel.js'; import Channel from '../channel.js';
import { StreamMessages } from '../types.js'; import { StreamMessages } from '../types.js';
import { RoleService } from '@/core/RoleService.js';
class RoleTimelineChannel extends Channel { class RoleTimelineChannel extends Channel {
public readonly chName = 'roleTimeline'; public readonly chName = 'roleTimeline';
public static shouldShare = false; public static shouldShare = false;
public static requireCredential = false; public static requireCredential = false;
private roleId: string; private roleId: string;
constructor( constructor(
private noteEntityService: NoteEntityService, private noteEntityService: NoteEntityService,
private roleservice: RoleService,
id: string, id: string,
connection: Channel['connection'], connection: Channel['connection'],
@ -34,6 +36,11 @@ class RoleTimelineChannel extends Channel {
if (data.type === 'note') { if (data.type === 'note') {
const note = data.body; const note = data.body;
if (!(await this.roleservice.isExplorable({ id: this.roleId }))) {
return;
}
if (note.visibility !== 'public') return;
// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
if (isUserRelated(note, this.userIdsWhoMeMuting)) return; if (isUserRelated(note, this.userIdsWhoMeMuting)) return;
// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する // 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
@ -61,6 +68,7 @@ export class RoleTimelineChannelService {
constructor( constructor(
private noteEntityService: NoteEntityService, private noteEntityService: NoteEntityService,
private roleservice: RoleService,
) { ) {
} }
@ -68,6 +76,7 @@ export class RoleTimelineChannelService {
public create(id: string, connection: Channel['connection']): RoleTimelineChannel { public create(id: string, connection: Channel['connection']): RoleTimelineChannel {
return new RoleTimelineChannel( return new RoleTimelineChannel(
this.noteEntityService, this.noteEntityService,
this.roleservice,
id, id,
connection, connection,
); );

View file

@ -35,7 +35,7 @@ onMounted(() => {
}); });
async function setRole() { async function setRole() {
const roles = await os.api('roles/list'); const roles = (await os.api('roles/list')).filter(x => x.isExplorable);
const { canceled, result: role } = await os.select({ const { canceled, result: role } = await os.select({
title: i18n.ts.role, title: i18n.ts.role,
items: roles.map(x => ({ items: roles.map(x => ({