1 import validator from 'validator'
2 import { UserRole } from '../../../shared'
3 import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES } from '../../initializers/constants'
4 import { exists, isArray, isBooleanValid, isFileValid } from './misc'
5 import { values } from 'lodash'
6 import { CONFIG } from '../../initializers/config'
8 const USERS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.USERS
10 function isUserPasswordValid (value: string) {
11 return validator.isLength(value, USERS_CONSTRAINTS_FIELDS.PASSWORD)
14 function isUserPasswordValidOrEmpty (value: string) {
15 // Empty password is only possible if emailing is enabled.
17 return !!CONFIG.SMTP.HOSTNAME && !!CONFIG.SMTP.PORT
19 return isUserPasswordValid(value)
22 function isUserVideoQuotaValid (value: string) {
23 return exists(value) && validator.isInt(value + '', USERS_CONSTRAINTS_FIELDS.VIDEO_QUOTA)
26 function isUserVideoQuotaDailyValid (value: string) {
27 return exists(value) && validator.isInt(value + '', USERS_CONSTRAINTS_FIELDS.VIDEO_QUOTA_DAILY)
30 function isUserUsernameValid (value: string) {
31 const max = USERS_CONSTRAINTS_FIELDS.USERNAME.max
32 const min = USERS_CONSTRAINTS_FIELDS.USERNAME.min
33 return exists(value) && validator.matches(value, new RegExp(`^[a-z0-9._]{${min},${max}}$`))
36 function isUserDisplayNameValid (value: string) {
37 return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.NAME))
40 function isUserDescriptionValid (value: string) {
41 return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.DESCRIPTION))
44 function isUserEmailVerifiedValid (value: any) {
45 return isBooleanValid(value)
48 const nsfwPolicies = values(NSFW_POLICY_TYPES)
49 function isUserNSFWPolicyValid (value: any) {
50 return exists(value) && nsfwPolicies.indexOf(value) !== -1
53 function isUserWebTorrentEnabledValid (value: any) {
54 return isBooleanValid(value)
57 function isUserVideosHistoryEnabledValid (value: any) {
58 return isBooleanValid(value)
61 function isUserAutoPlayVideoValid (value: any) {
62 return isBooleanValid(value)
65 function isUserVideoLanguages (value: any) {
66 return value === null || (isArray(value) && value.length < CONSTRAINTS_FIELDS.USERS.VIDEO_LANGUAGES.max)
69 function isUserAdminFlagsValid (value: any) {
70 return exists(value) && validator.isInt('' + value)
73 function isUserBlockedValid (value: any) {
74 return isBooleanValid(value)
77 function isUserAutoPlayNextVideoValid (value: any) {
78 return isBooleanValid(value)
81 function isUserAutoPlayNextVideoPlaylistValid (value: any) {
82 return isBooleanValid(value)
85 function isNoInstanceConfigWarningModal (value: any) {
86 return isBooleanValid(value)
89 function isNoWelcomeModal (value: any) {
90 return isBooleanValid(value)
93 function isUserBlockedReasonValid (value: any) {
94 return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.BLOCKED_REASON))
97 function isUserRoleValid (value: any) {
98 return exists(value) && validator.isInt('' + value) && UserRole[value] !== undefined
101 const avatarMimeTypes = CONSTRAINTS_FIELDS.ACTORS.AVATAR.EXTNAME
102 .map(v => v.replace('.', ''))
104 const avatarMimeTypesRegex = `image/(${avatarMimeTypes})`
105 function isAvatarFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
106 return isFileValid(files, avatarMimeTypesRegex, 'avatarfile', CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max)
109 // ---------------------------------------------------------------------------
112 isUserVideosHistoryEnabledValid,
115 isUserPasswordValidOrEmpty,
116 isUserVideoLanguages,
117 isUserBlockedReasonValid,
119 isUserVideoQuotaValid,
120 isUserVideoQuotaDailyValid,
122 isUserAdminFlagsValid,
123 isUserEmailVerifiedValid,
124 isUserNSFWPolicyValid,
125 isUserWebTorrentEnabledValid,
126 isUserAutoPlayVideoValid,
127 isUserAutoPlayNextVideoValid,
128 isUserAutoPlayNextVideoPlaylistValid,
129 isUserDisplayNameValid,
130 isUserDescriptionValid,
131 isNoInstanceConfigWarningModal,