]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/users.ts
Use same mastodon regex for usernames
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / users.ts
1 import { values } from 'lodash'
2 import validator from 'validator'
3 import { UserRole } from '@shared/models'
4 import { isEmailEnabled } from '../../initializers/config'
5 import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES } from '../../initializers/constants'
6 import { exists, isArray, isBooleanValid } from './misc'
7
8 const USERS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.USERS
9
10 function isUserPasswordValid (value: string) {
11 return validator.isLength(value, USERS_CONSTRAINTS_FIELDS.PASSWORD)
12 }
13
14 function isUserPasswordValidOrEmpty (value: string) {
15 // Empty password is only possible if emailing is enabled.
16 if (value === '') return isEmailEnabled()
17
18 return isUserPasswordValid(value)
19 }
20
21 function isUserVideoQuotaValid (value: string) {
22 return exists(value) && validator.isInt(value + '', USERS_CONSTRAINTS_FIELDS.VIDEO_QUOTA)
23 }
24
25 function isUserVideoQuotaDailyValid (value: string) {
26 return exists(value) && validator.isInt(value + '', USERS_CONSTRAINTS_FIELDS.VIDEO_QUOTA_DAILY)
27 }
28
29 function isUserUsernameValid (value: string) {
30 return exists(value) &&
31 validator.matches(value, new RegExp(`^[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?$`)) &&
32 validator.isLength(value, USERS_CONSTRAINTS_FIELDS.USERNAME)
33 }
34
35 function isUserDisplayNameValid (value: string) {
36 return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.NAME))
37 }
38
39 function isUserDescriptionValid (value: string) {
40 return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.DESCRIPTION))
41 }
42
43 function isUserEmailVerifiedValid (value: any) {
44 return isBooleanValid(value)
45 }
46
47 const nsfwPolicies = values(NSFW_POLICY_TYPES)
48 function isUserNSFWPolicyValid (value: any) {
49 return exists(value) && nsfwPolicies.includes(value)
50 }
51
52 function isUserP2PEnabledValid (value: any) {
53 return isBooleanValid(value)
54 }
55
56 function isUserVideosHistoryEnabledValid (value: any) {
57 return isBooleanValid(value)
58 }
59
60 function isUserAutoPlayVideoValid (value: any) {
61 return isBooleanValid(value)
62 }
63
64 function isUserVideoLanguages (value: any) {
65 return value === null || (isArray(value) && value.length < CONSTRAINTS_FIELDS.USERS.VIDEO_LANGUAGES.max)
66 }
67
68 function isUserAdminFlagsValid (value: any) {
69 return exists(value) && validator.isInt('' + value)
70 }
71
72 function isUserBlockedValid (value: any) {
73 return isBooleanValid(value)
74 }
75
76 function isUserAutoPlayNextVideoValid (value: any) {
77 return isBooleanValid(value)
78 }
79
80 function isUserAutoPlayNextVideoPlaylistValid (value: any) {
81 return isBooleanValid(value)
82 }
83
84 function isUserNoModal (value: any) {
85 return isBooleanValid(value)
86 }
87
88 function isUserBlockedReasonValid (value: any) {
89 return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.BLOCKED_REASON))
90 }
91
92 function isUserRoleValid (value: any) {
93 return exists(value) && validator.isInt('' + value) && [ UserRole.ADMINISTRATOR, UserRole.MODERATOR, UserRole.USER ].includes(value)
94 }
95
96 // ---------------------------------------------------------------------------
97
98 export {
99 isUserVideosHistoryEnabledValid,
100 isUserBlockedValid,
101 isUserPasswordValid,
102 isUserPasswordValidOrEmpty,
103 isUserVideoLanguages,
104 isUserBlockedReasonValid,
105 isUserRoleValid,
106 isUserVideoQuotaValid,
107 isUserVideoQuotaDailyValid,
108 isUserUsernameValid,
109 isUserAdminFlagsValid,
110 isUserEmailVerifiedValid,
111 isUserNSFWPolicyValid,
112 isUserP2PEnabledValid,
113 isUserAutoPlayVideoValid,
114 isUserAutoPlayNextVideoValid,
115 isUserAutoPlayNextVideoPlaylistValid,
116 isUserDisplayNameValid,
117 isUserDescriptionValid,
118 isUserNoModal
119 }