summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
authorJohann150 <johann.galle@protonmail.com>2022-01-20 19:06:38 +0100
committerGitHub <noreply@github.com>2022-01-21 03:06:38 +0900
commitcbb7e95d82d363d96462b90943bf329469ad08df (patch)
tree7515ea3c4ab8e9315265a86245af74f126701563 /packages/backend
parentfix: code url in documentation (#8117) (diff)
downloadmisskey-cbb7e95d82d363d96462b90943bf329469ad08df.tar.gz
misskey-cbb7e95d82d363d96462b90943bf329469ad08df.tar.bz2
misskey-cbb7e95d82d363d96462b90943bf329469ad08df.zip
enhance: Forward report (#8001)
* implement sending AP Flag object Optionally allow a user to select to forward a report about a remote user to the other instance. This is added in a backwards-compatible way. * add locale string * forward report only for moderators * add switch to moderator UI to forward report * fix report note url * return forwarded status from API apparently forgot to carry this over from my testing environment * object in Flag activity has to be an array For correct interoperability with Pleroma the "object" property of the Flag activity has to be an array. This array will in the future also hold the link to respective notes, so it makes sense to correct this on our side. * Update get-note-menu.ts Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to '')
-rw-r--r--packages/backend/migration/1637320813000-forwarded-report.js13
-rw-r--r--packages/backend/src/models/entities/abuse-user-report.ts5
-rw-r--r--packages/backend/src/models/repositories/abuse-user-report.ts1
-rw-r--r--packages/backend/src/remote/activitypub/renderer/flag.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts20
6 files changed, 58 insertions, 1 deletions
diff --git a/packages/backend/migration/1637320813000-forwarded-report.js b/packages/backend/migration/1637320813000-forwarded-report.js
new file mode 100644
index 0000000000..4056f7b5f4
--- /dev/null
+++ b/packages/backend/migration/1637320813000-forwarded-report.js
@@ -0,0 +1,13 @@
+const { QueryRunner } = require('typeorm');
+
+module.exports = class forwardedReport1637320813000 {
+ name = 'forwardedReport1637320813000';
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "forwarded" boolean NOT NULL DEFAULT false`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "forwarded"`);
+ }
+};
diff --git a/packages/backend/src/models/entities/abuse-user-report.ts b/packages/backend/src/models/entities/abuse-user-report.ts
index 019d613f76..27c1e47fd8 100644
--- a/packages/backend/src/models/entities/abuse-user-report.ts
+++ b/packages/backend/src/models/entities/abuse-user-report.ts
@@ -51,6 +51,11 @@ export class AbuseUserReport {
})
public resolved: boolean;
+ @Column('boolean', {
+ default: false
+ })
+ public forwarded: boolean;
+
@Column('varchar', {
length: 2048,
})
diff --git a/packages/backend/src/models/repositories/abuse-user-report.ts b/packages/backend/src/models/repositories/abuse-user-report.ts
index 5e267b3c2b..943b65eb64 100644
--- a/packages/backend/src/models/repositories/abuse-user-report.ts
+++ b/packages/backend/src/models/repositories/abuse-user-report.ts
@@ -27,6 +27,7 @@ export class AbuseUserReportRepository extends Repository<AbuseUserReport> {
assignee: report.assigneeId ? Users.pack(report.assignee || report.assigneeId, null, {
detail: true,
}) : null,
+ forwarded: report.forwarded,
});
}
diff --git a/packages/backend/src/remote/activitypub/renderer/flag.ts b/packages/backend/src/remote/activitypub/renderer/flag.ts
new file mode 100644
index 0000000000..60ac496509
--- /dev/null
+++ b/packages/backend/src/remote/activitypub/renderer/flag.ts
@@ -0,0 +1,15 @@
+import config from '@/config/index';
+import { IObject, IActivity } from '@/remote/activitypub/type';
+import { ILocalUser, IRemoteUser } from '@/models/entities/user';
+import { getInstanceActor } from '@/services/instance-actor';
+
+// to anonymise reporters, the reporting actor must be a system user
+// object has to be a uri or array of uris
+export const renderFlag = (user: ILocalUser, object: [string], content: string): IActivity => {
+ return {
+ type: 'Flag',
+ actor: `${config.url}/users/${user.id}`,
+ content,
+ object,
+ };
+};
diff --git a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
index 807afd2690..ed7b146d03 100644
--- a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
+++ b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
@@ -46,6 +46,11 @@ export const meta = {
]),
default: 'combined',
},
+
+ forwarded: {
+ validator: $.optional.bool,
+ default: false,
+ },
},
res: {
diff --git a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
index 3b47d7d35e..b00457f092 100644
--- a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
+++ b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
@@ -1,7 +1,11 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../define';
-import { AbuseUserReports } from '@/models/index';
+import { AbuseUserReports, Users } from '@/models/index';
+import { getInstanceActor } from '@/services/instance-actor';
+import { deliver } from '@/queue/index';
+import { renderActivity } from '@/remote/activitypub/renderer/index';
+import { renderFlag } from '@/remote/activitypub/renderer/flag';
export const meta = {
tags: ['admin'],
@@ -13,6 +17,12 @@ export const meta = {
reportId: {
validator: $.type(ID),
},
+
+ forward: {
+ validator: $.optional.boolean,
+ required: false,
+ default: false,
+ },
},
} as const;
@@ -24,8 +34,16 @@ export default define(meta, async (ps, me) => {
throw new Error('report not found');
}
+ if (ps.forward && report.targetUserHost != null) {
+ const actor = await getInstanceActor();
+ const targetUser = await Users.findOne(report.targetUserId);
+
+ deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri], report.comment)), targetUser.inbox);
+ }
+
await AbuseUserReports.update(report.id, {
resolved: true,
assigneeId: me.id,
+ forwarded: ps.forward && report.targetUserHost != null,
});
});