Compare commits

..

No commits in common. "29911226685112ba30bd9c9d7bf9a50fa3eab0fc" and "08e3706df7dbbbd26cddb06409f9268c1b9243fa" have entirely different histories.

6 changed files with 3 additions and 38 deletions

View file

@ -1,6 +1,3 @@
## 2024.9.2 (eGirlskey)
- Improvements to user block: posts should now get properly hidden if they are replies to or mentions of a blocked user.
## 2024.9.1 (eGirlskey)
- Impersonate `misskey` upstream in nodeinfo to fix issues with client apps
- Fix two-factor-auth login with `secureApiMode: true` by returning a stub user to unauthorized clients.

View file

@ -1,6 +1,6 @@
{
"name": "egirlskey",
"version": "2024.9.2",
"version": "2024.9.1",
"codename": "boobdog",
"repository": {
"type": "git",

View file

@ -70,38 +70,27 @@ export class QueryService {
// ここでいうBlockedは被Blockedの意
@bindThis
public generateBlockedUserQuery(q: SelectQueryBuilder<any>, me: { id: MiUser['id'] }): void {
const blockedQuery = this.blockingsRepository.createQueryBuilder('blocking')
.select('blocking.blockeeId')
.where('blocking.blockerId = :blockerId', { blockerId: me.id });
const blockingQuery = this.blockingsRepository.createQueryBuilder('blocking')
.select('blocking.blockerId')
.where('blocking.blockeeId = :blockeeId', { blockeeId: me.id });
const mentionQuery = `SELECT COUNT(*) FROM unnest(note.mentions) mention WHERE mention IN (${blockingQuery.getQuery()}) OR mention IN (${blockedQuery.getQuery()}) LIMIT 1`;
// 投稿の作者にブロックされていない かつ
// 投稿の返信先の作者にブロックされていない かつ
// 投稿の引用元の作者にブロックされていない
q
.andWhere(`note.userId NOT IN (${ blockingQuery.getQuery() })`)
.andWhere(`note.userId NOT IN (${ blockedQuery.getQuery() })`)
.andWhere(new Brackets(qb => {
qb
.where('note.replyUserId IS NULL')
.orWhere(`note.replyUserId NOT IN (${ blockedQuery.getQuery() })`)
.orWhere(`note.replyUserId NOT IN (${ blockingQuery.getQuery() })`);
}))
.andWhere(new Brackets(qb => {
qb
.where('note.renoteUserId IS NULL')
.orWhere(`note.renoteUserId NOT IN (${ blockedQuery.getQuery() })`)
.orWhere(`note.renoteUserId NOT IN (${ blockingQuery.getQuery() })`);
}))
.andWhere(`(${mentionQuery}) = 0`);
}));
q.setParameters(blockingQuery.getParameters());
q.setParameters(blockedQuery.getParameters());
}
@bindThis

View file

@ -4,8 +4,6 @@
*/
export function isUserRelated(note: any, userIds: Set<string>, ignoreAuthor = false): boolean {
console.log(note);
if (!note) {
return false;
}
@ -22,13 +20,5 @@ export function isUserRelated(note: any, userIds: Set<string>, ignoreAuthor = fa
return true;
}
if (!ignoreAuthor && note.mentions != null && note.mentions.some(mention => userIds.has(mention))) {
return true;
}
if (!ignoreAuthor && note.renote != null && note.renote.mentions != null && note.renote.mentions.some(mention => userIds.has(mention))) {
return true;
}
return false;
}

View file

@ -42,7 +42,6 @@ export default class Connection {
public followingChannels: Set<string> = new Set();
public userIdsWhoMeMuting: Set<string> = new Set();
public userIdsWhoBlockingMe: Set<string> = new Set();
public userIdsWhoMeBlocking: Set<string> = new Set();
public userIdsWhoMeMutingRenotes: Set<string> = new Set();
public userMutedInstances: Set<string> = new Set();
private fetchIntervalId: NodeJS.Timeout | null = null;
@ -73,13 +72,12 @@ export default class Connection {
@bindThis
public async fetch() {
if (this.user == null) return;
const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoBlockingMe, userIdsWhoMeBlocking, userIdsWhoMeMutingRenotes] = await Promise.all([
const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoBlockingMe, userIdsWhoMeMutingRenotes] = await Promise.all([
this.cacheService.userProfileCache.fetch(this.user.id),
this.cacheService.userFollowingsCache.fetch(this.user.id),
this.channelFollowingService.userFollowingChannelsCache.fetch(this.user.id),
this.cacheService.userMutingsCache.fetch(this.user.id),
this.cacheService.userBlockedCache.fetch(this.user.id),
this.cacheService.userBlockingCache.fetch(this.user.id),
this.cacheService.renoteMutingsCache.fetch(this.user.id),
]);
this.userProfile = userProfile;
@ -87,7 +85,6 @@ export default class Connection {
this.followingChannels = followingChannels;
this.userIdsWhoMeMuting = userIdsWhoMeMuting;
this.userIdsWhoBlockingMe = userIdsWhoBlockingMe;
this.userIdsWhoMeBlocking = userIdsWhoMeBlocking;
this.userIdsWhoMeMutingRenotes = userIdsWhoMeMutingRenotes;
this.userMutedInstances = new Set(userProfile.mutedInstances);
}
@ -256,9 +253,6 @@ export default class Connection {
if (this.userIdsWhoBlockingMe.has(noteUserId)) {
return;
}
if (this.userIdsWhoMeBlocking.has(noteUserId)) {
return;
}
}
}

View file

@ -47,10 +47,6 @@ export default abstract class Channel {
return this.connection.userIdsWhoBlockingMe;
}
protected get userIdsWhoMeBlocking() {
return this.connection.userIdsWhoMeBlocking;
}
protected get userMutedInstances() {
return this.connection.userMutedInstances;
}
@ -74,7 +70,6 @@ export default abstract class Channel {
if (isUserRelated(note, this.userIdsWhoMeMuting)) return true;
// 流れてきたNoteがブロックされているユーザーが関わる
if (isUserRelated(note, this.userIdsWhoBlockingMe)) return true;
if (isUserRelated(note, this.userIdsWhoMeBlocking)) return true;
// 流れてきたNoteがリートをミュートしてるユーザが行ったもの
if (isRenotePacked(note) && !isQuotePacked(note) && this.userIdsWhoMeMutingRenotes.has(note.user.id)) return true;