From 4f3814808791d8f380e75d152e0e14a01b758b9a Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 23 Sep 2022 15:32:56 +0200 Subject: [PATCH] Add akismet tests --- server/lib/moderation.ts | 4 +- .../validators/videos/video-comments.ts | 5 +- server/tests/external-plugins/akismet.ts | 131 ++++++++++++++++++ server/tests/external-plugins/index.ts | 1 + 4 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 server/tests/external-plugins/akismet.ts diff --git a/server/lib/moderation.ts b/server/lib/moderation.ts index 43c58c980..3cc92ca30 100644 --- a/server/lib/moderation.ts +++ b/server/lib/moderation.ts @@ -1,4 +1,4 @@ -import { VideoUploadFile } from 'express' +import express, { VideoUploadFile } from 'express' import { PathLike } from 'fs-extra' import { Transaction } from 'sequelize/types' import { AbuseAuditView, auditLoggerFactory } from '@server/helpers/audit-logger' @@ -58,6 +58,7 @@ function isLocalLiveVideoAccepted (object: { // Stub function that can be filtered by plugins function isLocalVideoThreadAccepted (_object: { + req: express.Request commentBody: VideoCommentCreate video: VideoModel user: UserModel @@ -67,6 +68,7 @@ function isLocalVideoThreadAccepted (_object: { // Stub function that can be filtered by plugins function isLocalVideoCommentReplyAccepted (_object: { + req: express.Request commentBody: VideoCommentCreate parentComment: VideoCommentModel video: VideoModel diff --git a/server/middlewares/validators/videos/video-comments.ts b/server/middlewares/validators/videos/video-comments.ts index 69062701b..133feb7bd 100644 --- a/server/middlewares/validators/videos/video-comments.ts +++ b/server/middlewares/validators/videos/video-comments.ts @@ -208,7 +208,8 @@ async function isVideoCommentAccepted (req: express.Request, res: express.Respon const acceptParameters = { video, commentBody: req.body, - user: res.locals.oauth.token.User + user: res.locals.oauth.token.User, + req } let acceptedResult: AcceptResult @@ -234,7 +235,7 @@ async function isVideoCommentAccepted (req: express.Request, res: express.Respon res.fail({ status: HttpStatusCode.FORBIDDEN_403, - message: acceptedResult?.errorMessage || 'Refused local comment' + message: acceptedResult?.errorMessage || 'Comment has been rejected.' }) return false } diff --git a/server/tests/external-plugins/akismet.ts b/server/tests/external-plugins/akismet.ts new file mode 100644 index 000000000..557fc3daf --- /dev/null +++ b/server/tests/external-plugins/akismet.ts @@ -0,0 +1,131 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import { expect } from 'chai' +import { HttpStatusCode } from '@shared/models' +import { + cleanupTests, + createMultipleServers, + doubleFollow, + PeerTubeServer, + setAccessTokensToServers, + waitJobs +} from '@shared/server-commands' + +describe('Official plugin Akismet', function () { + let servers: PeerTubeServer[] + let videoUUID: string + + before(async function () { + this.timeout(30000) + + servers = await createMultipleServers(2) + await setAccessTokensToServers(servers) + + await servers[0].plugins.install({ npmName: 'peertube-plugin-akismet' }) + + if (!process.env.AKISMET_KEY) throw new Error('Missing AKISMET_KEY from env') + + await servers[0].plugins.updateSettings({ + npmName: 'peertube-plugin-akismet', + settings: { + 'akismet-api-key': process.env.AKISMET_KEY + } + }) + + await doubleFollow(servers[0], servers[1]) + }) + + describe('Local threads/replies', function () { + + before(async function () { + const { uuid } = await servers[0].videos.quickUpload({ name: 'video 1' }) + videoUUID = uuid + }) + + it('Should not detect a thread as spam', async function () { + await servers[0].comments.createThread({ videoId: videoUUID, text: 'comment' }) + }) + + it('Should not detect a reply as spam', async function () { + await servers[0].comments.addReplyToLastThread({ text: 'reply' }) + }) + + it('Should detect a thread as spam', async function () { + await servers[0].comments.createThread({ + videoId: videoUUID, + text: 'akismet-guaranteed-spam', + expectedStatus: HttpStatusCode.FORBIDDEN_403 + }) + }) + + it('Should detect a thread as spam', async function () { + await servers[0].comments.createThread({ videoId: videoUUID, text: 'comment' }) + await servers[0].comments.addReplyToLastThread({ text: 'akismet-guaranteed-spam', expectedStatus: HttpStatusCode.FORBIDDEN_403 }) + }) + }) + + describe('Remote threads/replies', function () { + + before(async function () { + this.timeout(60000) + + const { uuid } = await servers[0].videos.quickUpload({ name: 'video 1' }) + videoUUID = uuid + }) + + it('Should not detect a thread as spam', async function () { + this.timeout(30000) + + await servers[1].comments.createThread({ videoId: videoUUID, text: 'remote comment 1' }) + await waitJobs(servers) + + const { data } = await servers[0].comments.listThreads({ videoId: videoUUID }) + expect(data).to.have.lengthOf(1) + }) + + it('Should not detect a reply as spam', async function () { + this.timeout(30000) + + await servers[1].comments.addReplyToLastThread({ text: 'I agree with you' }) + await waitJobs(servers) + + const { data } = await servers[0].comments.listThreads({ videoId: videoUUID }) + expect(data).to.have.lengthOf(1) + + const tree = await servers[0].comments.getThread({ videoId: videoUUID, threadId: data[0].id }) + expect(tree.children).to.have.lengthOf(1) + }) + + it('Should detect a thread as spam', async function () { + this.timeout(30000) + + await servers[1].comments.createThread({ videoId: videoUUID, text: 'akismet-guaranteed-spam' }) + await waitJobs(servers) + + const { data } = await servers[0].comments.listThreads({ videoId: videoUUID }) + expect(data).to.have.lengthOf(1) + }) + + it('Should detect a thread as spam', async function () { + this.timeout(30000) + + await servers[1].comments.createThread({ videoId: videoUUID, text: 'remote comment 2' }) + await servers[1].comments.addReplyToLastThread({ text: 'akismet-guaranteed-spam' }) + await waitJobs(servers) + + const { data } = await servers[0].comments.listThreads({ videoId: videoUUID }) + expect(data).to.have.lengthOf(2) + + for (const thread of data) { + const tree = await servers[0].comments.getThread({ videoId: videoUUID, threadId: thread.id }) + if (tree.comment.text === 'remote comment 1') continue + + expect(tree.children).to.have.lengthOf(0) + } + }) + }) + + after(async function () { + await cleanupTests(servers) + }) +}) diff --git a/server/tests/external-plugins/index.ts b/server/tests/external-plugins/index.ts index 31d818b51..815bbf1da 100644 --- a/server/tests/external-plugins/index.ts +++ b/server/tests/external-plugins/index.ts @@ -1,3 +1,4 @@ +import './akismet' import './auth-ldap' import './auto-block-videos' import './auto-mute'