summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2025-06-19 15:54:55 +0000
committerdakkar <dakkar@thenautilus.net>2025-06-19 15:54:55 +0000
commit169c06d4cafbec527d99b1ceffd9ecd5d1fe5a94 (patch)
tree74c2587f78dd4c4c8398765638615f12ce55711a
parentmerge: update package list for docker (!1130) (diff)
parentrefactor(backend): Remove Useless Variable (diff)
downloadsharkey-169c06d4cafbec527d99b1ceffd9ecd5d1fe5a94.tar.gz
sharkey-169c06d4cafbec527d99b1ceffd9ecd5d1fe5a94.tar.bz2
sharkey-169c06d4cafbec527d99b1ceffd9ecd5d1fe5a94.zip
merge: fix(backend): Send Abuse Reports To Set Maintainer E-Mail (!1127)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1127 Closes #1069 Approved-by: dakkar <dakkar@thenautilus.net> Approved-by: Hazelnoot <acomputerdog@gmail.com>
-rw-r--r--packages/backend/src/core/AbuseReportNotificationService.ts32
-rw-r--r--packages/backend/test/unit/AbuseReportNotificationService.ts72
2 files changed, 95 insertions, 9 deletions
diff --git a/packages/backend/src/core/AbuseReportNotificationService.ts b/packages/backend/src/core/AbuseReportNotificationService.ts
index 9bca795479..307f22586e 100644
--- a/packages/backend/src/core/AbuseReportNotificationService.ts
+++ b/packages/backend/src/core/AbuseReportNotificationService.ts
@@ -83,6 +83,28 @@ export class AbuseReportNotificationService implements OnApplicationShutdown {
}
/**
+ * Collects all email addresses that a abuse report should be sent to.
+ */
+ @bindThis
+ public async getRecipientEMailAddresses(): Promise<string[]> {
+ const recipientEMailAddresses = await this.fetchEMailRecipients().then(it => it
+ .filter(it => it.isActive && it.userProfile?.emailVerified)
+ .map(it => it.userProfile?.email)
+ .filter(x => x != null),
+ );
+
+ if (this.meta.email) {
+ recipientEMailAddresses.push(this.meta.email);
+ }
+
+ if (this.meta.maintainerEmail) {
+ recipientEMailAddresses.push(this.meta.maintainerEmail);
+ }
+
+ return recipientEMailAddresses;
+ }
+
+ /**
* Mailを用いて{@link abuseReports}の内容を管理者各位に通知する.
* メールアドレスの送信先は以下の通り.
* - モデレータ権限所有者ユーザ(設定画面からメールアドレスの設定を行っているユーザに限る)
@@ -96,15 +118,7 @@ export class AbuseReportNotificationService implements OnApplicationShutdown {
return;
}
- const recipientEMailAddresses = await this.fetchEMailRecipients().then(it => it
- .filter(it => it.isActive && it.userProfile?.emailVerified)
- .map(it => it.userProfile?.email)
- .filter(x => x != null),
- );
-
- recipientEMailAddresses.push(
- ...(this.meta.email ? [this.meta.email] : []),
- );
+ const recipientEMailAddresses = await this.getRecipientEMailAddresses();
if (recipientEMailAddresses.length <= 0) {
return;
diff --git a/packages/backend/test/unit/AbuseReportNotificationService.ts b/packages/backend/test/unit/AbuseReportNotificationService.ts
index ee68b10f1b..a67cb3664a 100644
--- a/packages/backend/test/unit/AbuseReportNotificationService.ts
+++ b/packages/backend/test/unit/AbuseReportNotificationService.ts
@@ -11,6 +11,7 @@ import {
AbuseReportNotificationRecipientRepository,
MiAbuseReportNotificationRecipient,
MiAbuseUserReport,
+ MiMeta,
MiSystemWebhook,
MiUser,
SystemWebhooksRepository,
@@ -56,6 +57,15 @@ describe('AbuseReportNotificationService', () => {
// --------------------------------------------------------------------------------------
+ const meta = {} as MiMeta;
+
+ function updateMeta(newMeta: Partial<MiMeta>): void {
+ for (const key in meta) {
+ delete (meta as any)[key];
+ }
+ Object.assign(meta, newMeta);
+ }
+
async function createUser(data: Partial<MiUser> = {}) {
const user = await usersRepository
.insert({
@@ -66,6 +76,8 @@ describe('AbuseReportNotificationService', () => {
await userProfilesRepository.insert({
userId: user.id,
+ email: user.username + '@example.com',
+ emailVerified: true,
});
return user;
@@ -130,6 +142,9 @@ describe('AbuseReportNotificationService', () => {
{
provide: GlobalEventService, useFactory: () => ({ publishAdminStream: jest.fn() }),
},
+ {
+ provide: DI.meta, useFactory: () => meta,
+ },
],
})
.compile();
@@ -156,6 +171,8 @@ describe('AbuseReportNotificationService', () => {
systemWebhook2 = await createWebhook();
roleService.getModeratorIds.mockResolvedValue([root.id, alice.id, bob.id]);
+
+ updateMeta({} as MiMeta);
});
afterEach(async () => {
@@ -392,4 +409,59 @@ describe('AbuseReportNotificationService', () => {
expect(webhookService.enqueueSystemWebhook.mock.calls[0][2]).toEqual({ excludes: [systemWebhook2.id] });
});
});
+
+ describe('collection of recipient-mails', () => {
+ async function create() {
+ const recipient = await createRecipient({
+ method: 'email',
+ userId: alice.id,
+ });
+
+ return recipient;
+ }
+
+ test('with nothing set', async () => {
+ const mails = await service.getRecipientEMailAddresses();
+ expect(mails).toEqual([]);
+ });
+
+ test('with maintainer mail set', async () => {
+ updateMeta({ maintainerEmail: 'maintainer_mail' });
+ const mails = await service.getRecipientEMailAddresses();
+ expect(mails).toEqual(['maintainer_mail']);
+ });
+
+ test('with smtp mail set', async () => {
+ updateMeta({ email: 'smtp_mail' });
+ const mails = await service.getRecipientEMailAddresses();
+ expect(mails).toEqual(['smtp_mail']);
+ });
+
+ test('with maintainer mail and smtp mail set', async () => {
+ updateMeta({ email: 'smtp_mail', maintainerEmail: 'maintainer_mail' });
+ const mails = await service.getRecipientEMailAddresses();
+ expect(mails).toEqual(['smtp_mail', 'maintainer_mail']);
+ });
+
+ test('with recipients', async () => {
+ await create();
+
+ const mails = await service.getRecipientEMailAddresses();
+ expect(mails).toEqual([
+ 'alice@example.com',
+ ]);
+ });
+
+ test('with recipients and maintainer mail set and smtp mail set', async () => {
+ await create();
+ updateMeta({ maintainerEmail: 'maintainer_mail', email: 'smtp_mail' });
+
+ const mails = await service.getRecipientEMailAddresses();
+ expect(mails).toEqual([
+ 'alice@example.com',
+ 'smtp_mail',
+ 'maintainer_mail',
+ ]);
+ });
+ });
});