1
0
Fork 0
mirror of https://github.com/Chocobozzz/PeerTube.git synced 2025-10-05 02:39:33 +02:00

Server: add video abuse support

This commit is contained in:
Chocobozzz 2017-01-04 20:59:23 +01:00
parent a6fd2b30bf
commit 55fa55a9be
32 changed files with 921 additions and 175 deletions

View file

@ -5,6 +5,7 @@ const waterfall = require('async/waterfall')
const db = require('../../initializers/database')
const logger = require('../../helpers/logger')
const utils = require('../../helpers/utils')
const friends = require('../../lib/friends')
const middlewares = require('../../middlewares')
const admin = middlewares.admin
@ -36,7 +37,7 @@ router.get('/quitfriends',
)
// Post because this is a secured request
router.post('/remove',
signatureValidator,
signatureValidator.signature,
checkSignature,
removePods
)
@ -86,7 +87,7 @@ function listPods (req, res, next) {
db.Pod.list(function (err, podsList) {
if (err) return next(err)
res.json(getFormatedPods(podsList))
res.json(utils.getFormatedObjects(podsList, podsList.length))
})
}
@ -130,15 +131,3 @@ function quitFriends (req, res, next) {
res.type('json').status(204).end()
})
}
// ---------------------------------------------------------------------------
function getFormatedPods (pods) {
const formatedPods = []
pods.forEach(function (pod) {
formatedPods.push(pod.toFormatedJSON())
})
return formatedPods
}

View file

@ -7,15 +7,16 @@ const waterfall = require('async/waterfall')
const db = require('../../../initializers/database')
const middlewares = require('../../../middlewares')
const secureMiddleware = middlewares.secure
const validators = middlewares.validators.remote
const videosValidators = middlewares.validators.remote.videos
const signatureValidators = middlewares.validators.remote.signature
const logger = require('../../../helpers/logger')
const router = express.Router()
router.post('/',
validators.signature,
signatureValidators.signature,
secureMiddleware.checkSignature,
validators.remoteVideos,
videosValidators.remoteVideos,
remoteVideos
)
@ -32,19 +33,23 @@ function remoteVideos (req, res, next) {
// We need to process in the same order to keep consistency
// TODO: optimization
eachSeries(requests, function (request, callbackEach) {
const videoData = request.data
const data = request.data
switch (request.type) {
case 'add':
addRemoteVideo(videoData, fromPod, callbackEach)
addRemoteVideo(data, fromPod, callbackEach)
break
case 'update':
updateRemoteVideo(videoData, fromPod, callbackEach)
updateRemoteVideo(data, fromPod, callbackEach)
break
case 'remove':
removeRemoteVideo(videoData, fromPod, callbackEach)
removeRemoteVideo(data, fromPod, callbackEach)
break
case 'report-abuse':
reportAbuseRemoteVideo(data, fromPod, callbackEach)
break
default:
@ -164,13 +169,8 @@ function updateRemoteVideo (videoAttributesToUpdate, fromPod, finalCallback) {
},
function findVideo (t, callback) {
db.Video.loadByHostAndRemoteId(fromPod.host, videoAttributesToUpdate.remoteId, function (err, videoInstance) {
if (err || !videoInstance) {
logger.error('Cannot load video from host and remote id.', { error: err.message })
return callback(err)
}
return callback(null, t, videoInstance)
fetchVideo(fromPod.host, videoAttributesToUpdate.remoteId, function (err, videoInstance) {
return callback(err, t, videoInstance)
})
},
@ -225,13 +225,45 @@ function updateRemoteVideo (videoAttributesToUpdate, fromPod, finalCallback) {
function removeRemoteVideo (videoToRemoveData, fromPod, callback) {
// We need the instance because we have to remove some other stuffs (thumbnail etc)
db.Video.loadByHostAndRemoteId(fromPod.host, videoToRemoveData.remoteId, function (err, video) {
if (err || !video) {
logger.error('Cannot load video from host and remote id.', { error: err.message })
return callback(err)
}
fetchVideo(fromPod.host, videoToRemoveData.remoteId, function (err, video) {
if (err) return callback(err)
logger.debug('Removing remote video %s.', video.remoteId)
video.destroy().asCallback(callback)
})
}
function reportAbuseRemoteVideo (reportData, fromPod, callback) {
db.Video.load(reportData.videoRemoteId, function (err, video) {
if (err || !video) {
if (!err) err = new Error('video not found')
logger.error('Cannot load video from host and remote id.', { error: err })
return callback(err)
}
logger.debug('Reporting remote abuse for video %s.', video.id)
const videoAbuseData = {
reporterUsername: reportData.reporterUsername,
reason: reportData.reportReason,
reporterPodId: fromPod.id,
videoId: video.id
}
db.VideoAbuse.create(videoAbuseData).asCallback(callback)
})
}
function fetchVideo (podHost, remoteId, callback) {
db.Video.loadByHostAndRemoteId(podHost, remoteId, function (err, video) {
if (err || !video) {
if (!err) err = new Error('video not found')
logger.error('Cannot load video from host and remote id.', { error: err })
return callback(err)
}
return callback(null, video)
})
}

View file

@ -6,6 +6,7 @@ const waterfall = require('async/waterfall')
const constants = require('../../initializers/constants')
const db = require('../../initializers/database')
const logger = require('../../helpers/logger')
const utils = require('../../helpers/utils')
const middlewares = require('../../middlewares')
const admin = middlewares.admin
const oAuth = middlewares.oauth
@ -82,7 +83,7 @@ function listUsers (req, res, next) {
db.User.listForApi(req.query.start, req.query.count, req.query.sort, function (err, usersList, usersTotal) {
if (err) return next(err)
res.json(getFormatedUsers(usersList, usersTotal))
res.json(utils.getFormatedObjects(usersList, usersTotal))
})
}
@ -121,18 +122,3 @@ function updateUser (req, res, next) {
function success (req, res, next) {
res.end()
}
// ---------------------------------------------------------------------------
function getFormatedUsers (users, usersTotal) {
const formatedUsers = []
users.forEach(function (user) {
formatedUsers.push(user.toFormatedJSON())
})
return {
total: usersTotal,
data: formatedUsers
}
}

View file

@ -11,6 +11,7 @@ const db = require('../../initializers/database')
const logger = require('../../helpers/logger')
const friends = require('../../lib/friends')
const middlewares = require('../../middlewares')
const admin = middlewares.admin
const oAuth = middlewares.oauth
const pagination = middlewares.pagination
const validators = middlewares.validators
@ -43,6 +44,21 @@ const storage = multer.diskStorage({
const reqFiles = multer({ storage: storage }).fields([{ name: 'videofile', maxCount: 1 }])
router.get('/abuse',
oAuth.authenticate,
admin.ensureIsAdmin,
validatorsPagination.pagination,
validatorsSort.videoAbusesSort,
sort.setVideoAbusesSort,
pagination.setPagination,
listVideoAbuses
)
router.post('/:id/abuse',
oAuth.authenticate,
validatorsVideos.videoAbuseReport,
reportVideoAbuse
)
router.get('/',
validatorsPagination.pagination,
validatorsSort.videosSort,
@ -283,7 +299,7 @@ function listVideos (req, res, next) {
db.Video.listForApi(req.query.start, req.query.count, req.query.sort, function (err, videosList, videosTotal) {
if (err) return next(err)
res.json(getFormatedVideos(videosList, videosTotal))
res.json(utils.getFormatedObjects(videosList, videosTotal))
})
}
@ -306,22 +322,45 @@ function searchVideos (req, res, next) {
function (err, videosList, videosTotal) {
if (err) return next(err)
res.json(getFormatedVideos(videosList, videosTotal))
res.json(utils.getFormatedObjects(videosList, videosTotal))
}
)
}
// ---------------------------------------------------------------------------
function listVideoAbuses (req, res, next) {
db.VideoAbuse.listForApi(req.query.start, req.query.count, req.query.sort, function (err, abusesList, abusesTotal) {
if (err) return next(err)
function getFormatedVideos (videos, videosTotal) {
const formatedVideos = []
videos.forEach(function (video) {
formatedVideos.push(video.toFormatedJSON())
res.json(utils.getFormatedObjects(abusesList, abusesTotal))
})
return {
total: videosTotal,
data: formatedVideos
}
}
function reportVideoAbuse (req, res, next) {
const videoInstance = res.locals.video
const reporterUsername = res.locals.oauth.token.User.username
const abuse = {
reporterUsername,
reason: req.body.reason,
videoId: videoInstance.id,
reporterPodId: null // This is our pod that reported this abuse
}
db.VideoAbuse.create(abuse).asCallback(function (err) {
if (err) return next(err)
// We send the information to the destination pod
if (videoInstance.isOwned() === false) {
const reportData = {
reporterUsername,
reportReason: abuse.reason,
videoRemoteId: videoInstance.remoteId
}
friends.reportAbuseVideoToFriend(reportData, videoInstance)
}
return res.type('json').status(204).end()
})
}