Support SPAM detection in signup

This commit is contained in:
Chocobozzz 2022-09-23 16:14:38 +02:00
parent 681d9dc449
commit a6d8ac61c7
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
3 changed files with 69 additions and 13 deletions

View File

@ -4,3 +4,4 @@
* Check local comments and reject them if they are considered as SPAM
* Check remote comments and reject them if they are considered as SPAM
* Check registrations and reject them if they are considered as SPAM

View File

@ -68,6 +68,21 @@ async function register ({
})
}
})
registerHook({
target: 'filter:api.user.signup.allowed.result',
handler: (result, params) => {
if (!akismetClient) return result
if (!result.allowed) return result
if (!params.body) return result
return checkSignup(peertubeHelpers, {
ip: params.ip,
username: params.body.username,
email: params.body.email
})
}
})
}
async function unregister () {
@ -111,13 +126,10 @@ async function updateSettings (peertubeHelpers, settings) {
async function checkLocalComment (peertubeHelpers, options) {
const { logger } = peertubeHelpers
const accepted = { accepted: true }
const rejected = { accepted: false, errorMessage: 'SPAM detected from Akismet' }
for (const key of [ 'ip', 'text', 'commentType', 'author', 'authorEmail' ]) {
if (!options[key]) {
logger.error('Cannot check local comment from Akismet without ' + key)
return accepted
return accept()
}
}
@ -137,24 +149,21 @@ async function checkLocalComment (peertubeHelpers, options) {
const isSpam = await akismetClient.checkSpam(comment)
logger.info('Checking local comment from Akismet.', { comment, isSpam })
if (isSpam) return rejected
if (isSpam) return reject()
} catch (err) {
logger.error('Cannot reach Akismet.', { err, comment })
}
return accepted
return accept()
}
async function checkRemoteComment (peertubeHelpers, options) {
const { logger } = peertubeHelpers
const accepted = { accepted: true }
const rejected = { accepted: false }
for (const key of [ 'text' ]) {
if (!options[key]) {
logger.error('Cannot check local comment from Akismet without ' + key)
return accepted
return accept()
}
}
@ -169,10 +178,56 @@ async function checkRemoteComment (peertubeHelpers, options) {
const isSpam = await akismetClient.checkSpam(comment)
logger.info('Checking remote comment from Akismet.', { comment, isSpam })
if (isSpam) return rejected
if (isSpam) return reject()
} catch (err) {
logger.error('Cannot reach Akismet.', { err, comment })
}
return accepted
return accept()
}
async function checkSignup (peertubeHelpers, options) {
const { logger } = peertubeHelpers
for (const key of [ 'ip', 'username', 'email' ]) {
if (!options[key]) {
logger.error('Cannot check signup from Akismet without ' + key)
return allow()
}
}
// https://github.com/chrisfosterelli/akismet-api/blob/master/docs/comments.md
const payload = {
ip: options.ip,
type: 'signup',
name: options.username,
email: options.email,
}
try {
const isSpam = await akismetClient.checkSpam(payload)
logger.info('Checking signup from Akismet.', { payload, isSpam })
if (isSpam) return forbid()
} catch (err) {
logger.error('Cannot reach Akismet.', { err, payload })
}
return allow()
}
function accept () {
return { accepted: true }
}
function reject () {
return { accepted: false, errorMessage: 'SPAM detected from Akismet' }
}
function allow () {
return { allowed: true }
}
function forbid () {
return { allowed: false, errorMessage: 'SPAM detected from Akismet' }
}

View File

@ -1,7 +1,7 @@
{
"name": "peertube-plugin-akismet",
"version": "0.0.1",
"description": "Reject comments based on Akismet service",
"description": "Reject local comments, remote comments and registrations based on Akismet service",
"engine": {
"peertube": ">=4.3.0"
},