From 27db78400c558e19bfac0da885fe0b7d0a3e6a0c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 5 Aug 2021 13:54:35 +0200 Subject: [PATCH] Fix backend channel name validator consistency --- .../form-validators/video-channel-validators.ts | 10 ++++------ server/helpers/custom-validators/video-channels.ts | 11 +++++++++-- server/middlewares/validators/users.ts | 12 +++++++----- .../validators/videos/video-channels.ts | 14 +++++++------- server/models/video/video-channel.ts | 4 ++-- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/client/src/app/shared/form-validators/video-channel-validators.ts b/client/src/app/shared/form-validators/video-channel-validators.ts index 0daab22ce..ba502ed01 100644 --- a/client/src/app/shared/form-validators/video-channel-validators.ts +++ b/client/src/app/shared/form-validators/video-channel-validators.ts @@ -1,13 +1,11 @@ import { Validators } from '@angular/forms' import { BuildFormValidator } from './form-validator.model' +import { USER_USERNAME_VALIDATOR } from './user-validators' export const VIDEO_CHANNEL_NAME_VALIDATOR: BuildFormValidator = { - VALIDATORS: [ - Validators.required, - Validators.minLength(1), - Validators.maxLength(50), - Validators.pattern(/^[a-z0-9][a-z0-9._]*$/) - ], + // Use the same constraints than user usernmae + VALIDATORS: USER_USERNAME_VALIDATOR.VALIDATORS, + MESSAGES: { 'required': $localize`Name is required.`, 'minlength': $localize`Name must be at least 1 character long.`, diff --git a/server/helpers/custom-validators/video-channels.ts b/server/helpers/custom-validators/video-channels.ts index ded5d5171..249083f39 100644 --- a/server/helpers/custom-validators/video-channels.ts +++ b/server/helpers/custom-validators/video-channels.ts @@ -1,14 +1,20 @@ import validator from 'validator' import { CONSTRAINTS_FIELDS } from '../../initializers/constants' import { exists } from './misc' +import { isUserUsernameValid } from './users' const VIDEO_CHANNELS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_CHANNELS +function isVideoChannelUsernameValid (value: string) { + // Use the same constraints than user username + return isUserUsernameValid(value) +} + function isVideoChannelDescriptionValid (value: string) { return value === null || validator.isLength(value, VIDEO_CHANNELS_CONSTRAINTS_FIELDS.DESCRIPTION) } -function isVideoChannelNameValid (value: string) { +function isVideoChannelDisplayNameValid (value: string) { return exists(value) && validator.isLength(value, VIDEO_CHANNELS_CONSTRAINTS_FIELDS.NAME) } @@ -19,7 +25,8 @@ function isVideoChannelSupportValid (value: string) { // --------------------------------------------------------------------------- export { + isVideoChannelUsernameValid, isVideoChannelDescriptionValid, - isVideoChannelNameValid, + isVideoChannelDisplayNameValid, isVideoChannelSupportValid } diff --git a/server/middlewares/validators/users.ts b/server/middlewares/validators/users.ts index 748b89f8f..bc8607523 100644 --- a/server/middlewares/validators/users.ts +++ b/server/middlewares/validators/users.ts @@ -6,7 +6,6 @@ import { MUserDefault } from '@server/types/models' import { HttpStatusCode } from '../../../shared/models/http/http-error-codes' import { UserRole } from '../../../shared/models/users' import { UserRegister } from '../../../shared/models/users/user-register.model' -import { isActorPreferredUsernameValid } from '../../helpers/custom-validators/activitypub/actor' import { toBooleanOrNull, toIntOrNull } from '../../helpers/custom-validators/misc' import { isThemeNameValid } from '../../helpers/custom-validators/plugins' import { @@ -28,7 +27,7 @@ import { isUserVideoQuotaValid, isUserVideosHistoryEnabledValid } from '../../helpers/custom-validators/users' -import { isVideoChannelNameValid } from '../../helpers/custom-validators/video-channels' +import { isVideoChannelDisplayNameValid, isVideoChannelUsernameValid } from '../../helpers/custom-validators/video-channels' import { logger } from '../../helpers/logger' import { isThemeRegistered } from '../../lib/plugins/theme-utils' import { Redis } from '../../lib/redis' @@ -56,9 +55,12 @@ const usersAddValidator = [ body('username').custom(isUserUsernameValid).withMessage('Should have a valid username (lowercase alphanumeric characters)'), body('password').custom(isUserPasswordValidOrEmpty).withMessage('Should have a valid password'), body('email').isEmail().withMessage('Should have a valid email'), - body('channelName').optional().custom(isActorPreferredUsernameValid).withMessage('Should have a valid channel name'), + + body('channelName').optional().custom(isVideoChannelUsernameValid).withMessage('Should have a valid channel name'), + body('videoQuota').custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'), body('videoQuotaDaily').custom(isUserVideoQuotaDailyValid).withMessage('Should have a valid daily user quota'), + body('role') .customSanitizer(toIntOrNull) .custom(isUserRoleValid).withMessage('Should have a valid role'), @@ -106,10 +108,10 @@ const usersRegisterValidator = [ body('channel.name') .optional() - .custom(isActorPreferredUsernameValid).withMessage('Should have a valid channel name'), + .custom(isVideoChannelUsernameValid).withMessage('Should have a valid channel name'), body('channel.displayName') .optional() - .custom(isVideoChannelNameValid).withMessage('Should have a valid display name'), + .custom(isVideoChannelDisplayNameValid).withMessage('Should have a valid display name'), async (req: express.Request, res: express.Response, next: express.NextFunction) => { logger.debug('Checking usersRegister parameters', { parameters: omit(req.body, 'password') }) diff --git a/server/middlewares/validators/videos/video-channels.ts b/server/middlewares/validators/videos/video-channels.ts index ea10fe425..3b5693d23 100644 --- a/server/middlewares/validators/videos/video-channels.ts +++ b/server/middlewares/validators/videos/video-channels.ts @@ -4,12 +4,12 @@ import { VIDEO_CHANNELS } from '@server/initializers/constants' import { MChannelAccountDefault, MUser } from '@server/types/models' import { UserRight } from '../../../../shared' import { HttpStatusCode } from '../../../../shared/models/http/http-error-codes' -import { isActorPreferredUsernameValid } from '../../../helpers/custom-validators/activitypub/actor' import { isBooleanValid, toBooleanOrNull } from '../../../helpers/custom-validators/misc' import { isVideoChannelDescriptionValid, - isVideoChannelNameValid, - isVideoChannelSupportValid + isVideoChannelDisplayNameValid, + isVideoChannelSupportValid, + isVideoChannelUsernameValid } from '../../../helpers/custom-validators/video-channels' import { logger } from '../../../helpers/logger' import { ActorModel } from '../../../models/actor/actor' @@ -17,8 +17,8 @@ import { VideoChannelModel } from '../../../models/video/video-channel' import { areValidationErrors, doesLocalVideoChannelNameExist, doesVideoChannelNameWithHostExist } from '../shared' const videoChannelsAddValidator = [ - body('name').custom(isActorPreferredUsernameValid).withMessage('Should have a valid channel name'), - body('displayName').custom(isVideoChannelNameValid).withMessage('Should have a valid display name'), + body('name').custom(isVideoChannelUsernameValid).withMessage('Should have a valid channel name'), + body('displayName').custom(isVideoChannelDisplayNameValid).withMessage('Should have a valid display name'), body('description').optional().custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'), body('support').optional().custom(isVideoChannelSupportValid).withMessage('Should have a valid support text'), @@ -50,7 +50,7 @@ const videoChannelsUpdateValidator = [ param('nameWithHost').exists().withMessage('Should have an video channel name with host'), body('displayName') .optional() - .custom(isVideoChannelNameValid).withMessage('Should have a valid display name'), + .custom(isVideoChannelDisplayNameValid).withMessage('Should have a valid display name'), body('description') .optional() .custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'), @@ -117,7 +117,7 @@ const videoChannelsNameWithHostValidator = [ ] const localVideoChannelValidator = [ - param('name').custom(isVideoChannelNameValid).withMessage('Should have a valid video channel name'), + param('name').custom(isVideoChannelDisplayNameValid).withMessage('Should have a valid video channel name'), async (req: express.Request, res: express.Response, next: express.NextFunction) => { logger.debug('Checking localVideoChannelValidator parameters', { parameters: req.params }) diff --git a/server/models/video/video-channel.ts b/server/models/video/video-channel.ts index 9f04a57c6..278149d60 100644 --- a/server/models/video/video-channel.ts +++ b/server/models/video/video-channel.ts @@ -23,7 +23,7 @@ import { ActivityPubActor } from '../../../shared/models/activitypub' import { VideoChannel, VideoChannelSummary } from '../../../shared/models/videos' import { isVideoChannelDescriptionValid, - isVideoChannelNameValid, + isVideoChannelDisplayNameValid, isVideoChannelSupportValid } from '../../helpers/custom-validators/video-channels' import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants' @@ -308,7 +308,7 @@ export type SummaryOptions = { export class VideoChannelModel extends Model>> { @AllowNull(false) - @Is('VideoChannelName', value => throwIfNotValid(value, isVideoChannelNameValid, 'name')) + @Is('VideoChannelName', value => throwIfNotValid(value, isVideoChannelDisplayNameValid, 'name')) @Column name: string -- 2.41.0