]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/middlewares/validators/config.ts
Translated using Weblate (Japanese)
[github/Chocobozzz/PeerTube.git] / server / middlewares / validators / config.ts
1 import express from 'express'
2 import { body } from 'express-validator'
3 import { isIntOrNull } from '@server/helpers/custom-validators/misc'
4 import { CONFIG, isEmailEnabled } from '@server/initializers/config'
5 import { HttpStatusCode } from '@shared/models/http/http-error-codes'
6 import { CustomConfig } from '../../../shared/models/server/custom-config.model'
7 import { isThemeNameValid } from '../../helpers/custom-validators/plugins'
8 import { isUserNSFWPolicyValid, isUserVideoQuotaDailyValid, isUserVideoQuotaValid } from '../../helpers/custom-validators/users'
9 import { isThemeRegistered } from '../../lib/plugins/theme-utils'
10 import { areValidationErrors } from './shared'
11
12 const customConfigUpdateValidator = [
13 body('instance.name').exists(),
14 body('instance.shortDescription').exists(),
15 body('instance.description').exists(),
16 body('instance.terms').exists(),
17 body('instance.defaultNSFWPolicy').custom(isUserNSFWPolicyValid),
18 body('instance.defaultClientRoute').exists(),
19 body('instance.customizations.css').exists(),
20 body('instance.customizations.javascript').exists(),
21
22 body('services.twitter.username').exists(),
23 body('services.twitter.whitelisted').isBoolean(),
24
25 body('cache.previews.size').isInt(),
26 body('cache.captions.size').isInt(),
27 body('cache.torrents.size').isInt(),
28
29 body('signup.enabled').isBoolean(),
30 body('signup.limit').isInt(),
31 body('signup.requiresEmailVerification').isBoolean(),
32 body('signup.requiresApproval').isBoolean(),
33 body('signup.minimumAge').isInt(),
34
35 body('admin.email').isEmail(),
36 body('contactForm.enabled').isBoolean(),
37
38 body('user.videoQuota').custom(isUserVideoQuotaValid),
39 body('user.videoQuotaDaily').custom(isUserVideoQuotaDailyValid),
40
41 body('videoChannels.maxPerUser').isInt(),
42
43 body('transcoding.enabled').isBoolean(),
44 body('transcoding.allowAdditionalExtensions').isBoolean(),
45 body('transcoding.threads').isInt(),
46 body('transcoding.concurrency').isInt({ min: 1 }),
47 body('transcoding.resolutions.0p').isBoolean(),
48 body('transcoding.resolutions.144p').isBoolean(),
49 body('transcoding.resolutions.240p').isBoolean(),
50 body('transcoding.resolutions.360p').isBoolean(),
51 body('transcoding.resolutions.480p').isBoolean(),
52 body('transcoding.resolutions.720p').isBoolean(),
53 body('transcoding.resolutions.1080p').isBoolean(),
54 body('transcoding.resolutions.1440p').isBoolean(),
55 body('transcoding.resolutions.2160p').isBoolean(),
56
57 body('transcoding.alwaysTranscodeOriginalResolution').isBoolean(),
58
59 body('transcoding.webtorrent.enabled').isBoolean(),
60 body('transcoding.hls.enabled').isBoolean(),
61
62 body('videoStudio.enabled').isBoolean(),
63
64 body('import.videos.concurrency').isInt({ min: 0 }),
65 body('import.videos.http.enabled').isBoolean(),
66 body('import.videos.torrent.enabled').isBoolean(),
67
68 body('import.videoChannelSynchronization.enabled').isBoolean(),
69
70 body('trending.videos.algorithms.default').exists(),
71 body('trending.videos.algorithms.enabled').exists(),
72
73 body('followers.instance.enabled').isBoolean(),
74 body('followers.instance.manualApproval').isBoolean(),
75
76 body('theme.default').custom(v => isThemeNameValid(v) && isThemeRegistered(v)),
77
78 body('broadcastMessage.enabled').isBoolean(),
79 body('broadcastMessage.message').exists(),
80 body('broadcastMessage.level').exists(),
81 body('broadcastMessage.dismissable').isBoolean(),
82
83 body('live.enabled').isBoolean(),
84 body('live.allowReplay').isBoolean(),
85 body('live.maxDuration').isInt(),
86 body('live.maxInstanceLives').custom(isIntOrNull),
87 body('live.maxUserLives').custom(isIntOrNull),
88 body('live.transcoding.enabled').isBoolean(),
89 body('live.transcoding.threads').isInt(),
90 body('live.transcoding.resolutions.144p').isBoolean(),
91 body('live.transcoding.resolutions.240p').isBoolean(),
92 body('live.transcoding.resolutions.360p').isBoolean(),
93 body('live.transcoding.resolutions.480p').isBoolean(),
94 body('live.transcoding.resolutions.720p').isBoolean(),
95 body('live.transcoding.resolutions.1080p').isBoolean(),
96 body('live.transcoding.resolutions.1440p').isBoolean(),
97 body('live.transcoding.resolutions.2160p').isBoolean(),
98 body('live.transcoding.alwaysTranscodeOriginalResolution').isBoolean(),
99
100 body('search.remoteUri.users').isBoolean(),
101 body('search.remoteUri.anonymous').isBoolean(),
102 body('search.searchIndex.enabled').isBoolean(),
103 body('search.searchIndex.url').exists(),
104 body('search.searchIndex.disableLocalSearch').isBoolean(),
105 body('search.searchIndex.isDefaultSearch').isBoolean(),
106
107 (req: express.Request, res: express.Response, next: express.NextFunction) => {
108 if (areValidationErrors(req, res)) return
109 if (!checkInvalidConfigIfEmailDisabled(req.body, res)) return
110 if (!checkInvalidTranscodingConfig(req.body, res)) return
111 if (!checkInvalidSynchronizationConfig(req.body, res)) return
112 if (!checkInvalidLiveConfig(req.body, res)) return
113 if (!checkInvalidVideoStudioConfig(req.body, res)) return
114
115 return next()
116 }
117 ]
118
119 function ensureConfigIsEditable (req: express.Request, res: express.Response, next: express.NextFunction) {
120 if (!CONFIG.WEBADMIN.CONFIGURATION.EDITION.ALLOWED) {
121 return res.fail({
122 status: HttpStatusCode.METHOD_NOT_ALLOWED_405,
123 message: 'Server configuration is static and cannot be edited'
124 })
125 }
126
127 return next()
128 }
129
130 // ---------------------------------------------------------------------------
131
132 export {
133 customConfigUpdateValidator,
134 ensureConfigIsEditable
135 }
136
137 function checkInvalidConfigIfEmailDisabled (customConfig: CustomConfig, res: express.Response) {
138 if (isEmailEnabled()) return true
139
140 if (customConfig.signup.requiresEmailVerification === true) {
141 res.fail({ message: 'Emailer is disabled but you require signup email verification.' })
142 return false
143 }
144
145 return true
146 }
147
148 function checkInvalidTranscodingConfig (customConfig: CustomConfig, res: express.Response) {
149 if (customConfig.transcoding.enabled === false) return true
150
151 if (customConfig.transcoding.webtorrent.enabled === false && customConfig.transcoding.hls.enabled === false) {
152 res.fail({ message: 'You need to enable at least webtorrent transcoding or hls transcoding' })
153 return false
154 }
155
156 return true
157 }
158
159 function checkInvalidSynchronizationConfig (customConfig: CustomConfig, res: express.Response) {
160 if (customConfig.import.videoChannelSynchronization.enabled && !customConfig.import.videos.http.enabled) {
161 res.fail({ message: 'You need to enable HTTP video import in order to enable channel synchronization' })
162 return false
163 }
164 return true
165 }
166
167 function checkInvalidLiveConfig (customConfig: CustomConfig, res: express.Response) {
168 if (customConfig.live.enabled === false) return true
169
170 if (customConfig.live.allowReplay === true && customConfig.transcoding.enabled === false) {
171 res.fail({ message: 'You cannot allow live replay if transcoding is not enabled' })
172 return false
173 }
174
175 return true
176 }
177
178 function checkInvalidVideoStudioConfig (customConfig: CustomConfig, res: express.Response) {
179 if (customConfig.videoStudio.enabled === false) return true
180
181 if (customConfig.videoStudio.enabled === true && customConfig.transcoding.enabled === false) {
182 res.fail({ message: 'You cannot enable video studio if transcoding is not enabled' })
183 return false
184 }
185
186 return true
187 }