X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fvideo-blacklist.ts;h=0984c0d7a7cef37434ca1bcc7b0f30faa987b8e8;hb=4e29f4fe23b413cc8c55ac0d8373f36bcd60b47a;hp=9bc996f5a84d0f15cf2a29a9a257ba39f551e161;hpb=89cd12756035a146bbcc4db78cd3cd64f2f3d88d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/video-blacklist.ts b/server/lib/video-blacklist.ts index 9bc996f5a..0984c0d7a 100644 --- a/server/lib/video-blacklist.ts +++ b/server/lib/video-blacklist.ts @@ -1,17 +1,39 @@ import { Transaction } from 'sequelize' +import { afterCommitIfTransaction } from '@server/helpers/database-utils' +import { sequelizeTypescript } from '@server/initializers/database' +import { + MUser, + MVideoAccountLight, + MVideoBlacklist, + MVideoBlacklistVideo, + MVideoFullLight, + MVideoWithBlacklistLight +} from '@server/types/models' +import { UserRight, VideoBlacklistCreate, VideoBlacklistType } from '../../shared/models' +import { UserAdminFlag } from '../../shared/models/users/user-flag.model' +import { logger, loggerTagsFactory } from '../helpers/logger' import { CONFIG } from '../initializers/config' -import { UserRight, VideoBlacklistType } from '../../shared/models' import { VideoBlacklistModel } from '../models/video/video-blacklist' -import { UserModel } from '../models/account/user' -import { VideoModel } from '../models/video/video' -import { logger } from '../helpers/logger' -import { UserAdminFlag } from '../../shared/models/users/user-flag.model' +import { sendDeleteVideo } from './activitypub/send' +import { federateVideoIfNeeded } from './activitypub/videos' +import { LiveManager } from './live/live-manager' +import { Notifier } from './notifier' import { Hooks } from './plugins/hooks' -async function autoBlacklistVideoIfNeeded (video: VideoModel, user?: UserModel, transaction?: Transaction) { - const doAutoBlacklist = await Hooks.wrapPromiseFun( +const lTags = loggerTagsFactory('blacklist') + +async function autoBlacklistVideoIfNeeded (parameters: { + video: MVideoWithBlacklistLight + user?: MUser + isRemote: boolean + isNew: boolean + notify?: boolean + transaction?: Transaction +}) { + const { video, user, isRemote, isNew, notify = true, transaction } = parameters + const doAutoBlacklist = await Hooks.wrapFun( autoBlacklistNeeded, - { video, user }, + { video, user, isRemote, isNew }, 'filter:video.auto-blacklist.result' ) @@ -23,25 +45,100 @@ async function autoBlacklistVideoIfNeeded (video: VideoModel, user?: UserModel, reason: 'Auto-blacklisted. Moderator review required.', type: VideoBlacklistType.AUTO_BEFORE_PUBLISHED } - await VideoBlacklistModel.create(videoBlacklistToCreate, { transaction }) + const [ videoBlacklist ] = await VideoBlacklistModel.findOrCreate({ + where: { + videoId: video.id + }, + defaults: videoBlacklistToCreate, + transaction + }) + video.VideoBlacklist = videoBlacklist + + videoBlacklist.Video = video + + if (notify) { + afterCommitIfTransaction(transaction, () => { + Notifier.Instance.notifyOnVideoAutoBlacklist(videoBlacklist) + }) + } - logger.info('Video %s auto-blacklisted.', video.uuid) + logger.info('Video %s auto-blacklisted.', video.uuid, lTags(video.uuid)) return true } -async function autoBlacklistNeeded (parameters: { video: VideoModel, user?: UserModel }) { - const { user } = parameters +async function blacklistVideo (videoInstance: MVideoAccountLight, options: VideoBlacklistCreate) { + const blacklist: MVideoBlacklistVideo = await VideoBlacklistModel.create({ + videoId: videoInstance.id, + unfederated: options.unfederate === true, + reason: options.reason, + type: VideoBlacklistType.MANUAL + } + ) + blacklist.Video = videoInstance - if (!CONFIG.AUTO_BLACKLIST.VIDEOS.OF_USERS.ENABLED || !user) return false + if (options.unfederate === true) { + await sendDeleteVideo(videoInstance, undefined) + } - if (user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) || user.hasAdminFlag(UserAdminFlag.BY_PASS_VIDEO_AUTO_BLACKLIST)) return false + if (videoInstance.isLive) { + LiveManager.Instance.stopSessionOf(videoInstance.id) + } - return true + Notifier.Instance.notifyOnVideoBlacklist(blacklist) +} + +async function unblacklistVideo (videoBlacklist: MVideoBlacklist, video: MVideoFullLight) { + const videoBlacklistType = await sequelizeTypescript.transaction(async t => { + const unfederated = videoBlacklist.unfederated + const videoBlacklistType = videoBlacklist.type + + await videoBlacklist.destroy({ transaction: t }) + video.VideoBlacklist = undefined + + // Re federate the video + if (unfederated === true) { + await federateVideoIfNeeded(video, true, t) + } + + return videoBlacklistType + }) + + Notifier.Instance.notifyOnVideoUnblacklist(video) + + if (videoBlacklistType === VideoBlacklistType.AUTO_BEFORE_PUBLISHED) { + Notifier.Instance.notifyOnVideoPublishedAfterRemovedFromAutoBlacklist(video) + + // Delete on object so new video notifications will send + delete video.VideoBlacklist + Notifier.Instance.notifyOnNewVideoIfNeeded(video) + } } // --------------------------------------------------------------------------- export { - autoBlacklistVideoIfNeeded + autoBlacklistVideoIfNeeded, + blacklistVideo, + unblacklistVideo +} + +// --------------------------------------------------------------------------- + +function autoBlacklistNeeded (parameters: { + video: MVideoWithBlacklistLight + isRemote: boolean + isNew: boolean + user?: MUser +}) { + const { user, video, isRemote, isNew } = parameters + + // Already blacklisted + if (video.VideoBlacklist) return false + if (!CONFIG.AUTO_BLACKLIST.VIDEOS.OF_USERS.ENABLED || !user) return false + if (isRemote || isNew === false) return false + + if (user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) || user.hasAdminFlag(UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST)) return false + + return true }