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:
parent
a6fd2b30bf
commit
55fa55a9be
32 changed files with 921 additions and 175 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue