]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/middlewares/validators/users.ts
Add video channels
[github/Chocobozzz/PeerTube.git] / server / middlewares / validators / users.ts
1 import { body, param } from 'express-validator/check'
2 import 'express-validator'
3 import * as express from 'express'
4 import * as Promise from 'bluebird'
5 import * as validator from 'validator'
6
7 import { database as db } from '../../initializers/database'
8 import { checkErrors } from './utils'
9 import {
10 isSignupAllowed,
11 logger,
12 isUserUsernameValid,
13 isUserPasswordValid,
14 isUserVideoQuotaValid,
15 isUserDisplayNSFWValid,
16 isIdOrUUIDValid
17 } from '../../helpers'
18 import { UserInstance, VideoInstance } from '../../models'
19
20 const usersAddValidator = [
21 body('username').custom(isUserUsernameValid).withMessage('Should have a valid username'),
22 body('password').custom(isUserPasswordValid).withMessage('Should have a valid password'),
23 body('email').isEmail().withMessage('Should have a valid email'),
24 body('videoQuota').custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'),
25
26 (req: express.Request, res: express.Response, next: express.NextFunction) => {
27 logger.debug('Checking usersAdd parameters', { parameters: req.body })
28
29 checkErrors(req, res, () => {
30 checkUserDoesNotAlreadyExist(req.body.username, req.body.email, res, next)
31 })
32 }
33 ]
34
35 const usersRegisterValidator = [
36 body('username').custom(isUserUsernameValid).withMessage('Should have a valid username'),
37 body('password').custom(isUserPasswordValid).withMessage('Should have a valid password'),
38 body('email').isEmail().withMessage('Should have a valid email'),
39
40 (req: express.Request, res: express.Response, next: express.NextFunction) => {
41 logger.debug('Checking usersRegister parameters', { parameters: req.body })
42
43 checkErrors(req, res, () => {
44 checkUserDoesNotAlreadyExist(req.body.username, req.body.email, res, next)
45 })
46 }
47 ]
48
49 const usersRemoveValidator = [
50 param('id').isInt().not().isEmpty().withMessage('Should have a valid id'),
51
52 (req: express.Request, res: express.Response, next: express.NextFunction) => {
53 logger.debug('Checking usersRemove parameters', { parameters: req.params })
54
55 checkErrors(req, res, () => {
56 checkUserExists(req.params.id, res, (err, user) => {
57 if (err) {
58 logger.error('Error in usersRemoveValidator.', err)
59 return res.sendStatus(500)
60 }
61
62 if (user.username === 'root') {
63 return res.status(400)
64 .send({ error: 'Cannot remove the root user' })
65 .end()
66 }
67
68 return next()
69 })
70 })
71 }
72 ]
73
74 const usersUpdateValidator = [
75 param('id').isInt().not().isEmpty().withMessage('Should have a valid id'),
76 body('email').optional().isEmail().withMessage('Should have a valid email attribute'),
77 body('videoQuota').optional().custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'),
78
79 (req: express.Request, res: express.Response, next: express.NextFunction) => {
80 logger.debug('Checking usersUpdate parameters', { parameters: req.body })
81
82 checkErrors(req, res, () => {
83 checkUserExists(req.params.id, res, next)
84 })
85 }
86 ]
87
88 const usersUpdateMeValidator = [
89 body('password').optional().custom(isUserPasswordValid).withMessage('Should have a valid password'),
90 body('email').optional().isEmail().withMessage('Should have a valid email attribute'),
91 body('displayNSFW').optional().custom(isUserDisplayNSFWValid).withMessage('Should have a valid display Not Safe For Work attribute'),
92
93 (req: express.Request, res: express.Response, next: express.NextFunction) => {
94 // TODO: Add old password verification
95 logger.debug('Checking usersUpdateMe parameters', { parameters: req.body })
96
97 checkErrors(req, res, next)
98 }
99 ]
100
101 const usersGetValidator = [
102 param('id').isInt().not().isEmpty().withMessage('Should have a valid id'),
103
104 (req: express.Request, res: express.Response, next: express.NextFunction) => {
105 checkErrors(req, res, () => {
106 checkUserExists(req.params.id, res, next)
107 })
108 }
109 ]
110
111 const usersVideoRatingValidator = [
112 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'),
113
114 (req: express.Request, res: express.Response, next: express.NextFunction) => {
115 logger.debug('Checking usersVideoRating parameters', { parameters: req.params })
116
117 checkErrors(req, res, () => {
118 let videoPromise: Promise<VideoInstance>
119
120 if (validator.isUUID(req.params.videoId)) {
121 videoPromise = db.Video.loadByUUID(req.params.videoId)
122 } else {
123 videoPromise = db.Video.load(req.params.videoId)
124 }
125
126 videoPromise
127 .then(video => {
128 if (!video) {
129 return res.status(404)
130 .json({ error: 'Video not found' })
131 .end()
132 }
133
134 return next()
135 })
136 .catch(err => {
137 logger.error('Error in user request validator.', err)
138 return res.sendStatus(500)
139 })
140 })
141 }
142 ]
143
144 const ensureUserRegistrationAllowed = [
145 (req: express.Request, res: express.Response, next: express.NextFunction) => {
146 isSignupAllowed().then(allowed => {
147 if (allowed === false) {
148 return res.status(403)
149 .send({ error: 'User registration is not enabled or user limit is reached.' })
150 .end()
151 }
152
153 return next()
154 })
155 }
156 ]
157
158 // ---------------------------------------------------------------------------
159
160 export {
161 usersAddValidator,
162 usersRegisterValidator,
163 usersRemoveValidator,
164 usersUpdateValidator,
165 usersUpdateMeValidator,
166 usersVideoRatingValidator,
167 ensureUserRegistrationAllowed,
168 usersGetValidator
169 }
170
171 // ---------------------------------------------------------------------------
172
173 function checkUserExists (id: number, res: express.Response, callback: (err: Error, user: UserInstance) => void) {
174 db.User.loadById(id)
175 .then(user => {
176 if (!user) {
177 return res.status(404)
178 .send({ error: 'User not found' })
179 .end()
180 }
181
182 res.locals.user = user
183 return callback(null, user)
184 })
185 .catch(err => {
186 logger.error('Error in user request validator.', err)
187 return res.sendStatus(500)
188 })
189 }
190
191 function checkUserDoesNotAlreadyExist (username: string, email: string, res: express.Response, callback: () => void) {
192 db.User.loadByUsernameOrEmail(username, email)
193 .then(user => {
194 if (user) {
195 return res.status(409)
196 .send({ error: 'User already exists.' })
197 .end()
198 }
199
200 return callback()
201 })
202 .catch(err => {
203 logger.error('Error in usersAdd request validator.', err)
204 return res.sendStatus(500)
205 })
206 }