diff --git a/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html b/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html index 03997ea40..1f542e458 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html @@ -158,6 +158,20 @@ Signup won't be limited to a fixed number of users. + +
+ + +
+ + {form.value['signup']['minimumAge'], plural, =1 {year old} other {years old}} +
+ +
{{ formErrors.signup.minimumAge }}
+
@@ -469,7 +483,7 @@
- + - - I am at least 16 years old and agree + + I am at least {{ minimumAge }} years old and agree to the Terms and to the Code of Conduct of this instance diff --git a/client/src/app/+signup/+register/register-step-terms.component.ts b/client/src/app/+signup/+register/register-step-terms.component.ts index db834c68d..20c1ae1c4 100644 --- a/client/src/app/+signup/+register/register-step-terms.component.ts +++ b/client/src/app/+signup/+register/register-step-terms.component.ts @@ -12,6 +12,7 @@ import { FormReactive, FormValidatorService } from '@app/shared/shared-forms' }) export class RegisterStepTermsComponent extends FormReactive implements OnInit { @Input() hasCodeOfConduct = false + @Input() minimumAge = 16 @Output() formBuilt = new EventEmitter() @Output() termsClick = new EventEmitter() diff --git a/client/src/app/+signup/+register/register.component.html b/client/src/app/+signup/+register/register.component.html index dc1c7496f..de72065d3 100644 --- a/client/src/app/+signup/+register/register.component.html +++ b/client/src/app/+signup/+register/register.component.html @@ -17,6 +17,7 @@ diff --git a/client/src/app/+signup/+register/register.component.ts b/client/src/app/+signup/+register/register.component.ts index 8e89bb01a..241ca04c6 100644 --- a/client/src/app/+signup/+register/register.component.ts +++ b/client/src/app/+signup/+register/register.component.ts @@ -56,6 +56,10 @@ export class RegisterComponent implements OnInit { return this.serverConfig.signup.requiresEmailVerification } + get minimumAge () { + return this.serverConfig.signup.minimumAge + } + ngOnInit (): void { this.serverConfig = this.route.snapshot.data.serverConfig diff --git a/client/src/app/core/server/server.service.ts b/client/src/app/core/server/server.service.ts index 5b1b7603f..6918957f4 100644 --- a/client/src/app/core/server/server.service.ts +++ b/client/src/app/core/server/server.service.ts @@ -60,7 +60,8 @@ export class ServerService { signup: { allowed: false, allowedForCurrentIP: false, - requiresEmailVerification: false + requiresEmailVerification: false, + minimumAge: 16 }, transcoding: { profile: 'default', diff --git a/client/src/app/shared/form-validators/custom-config-validators.ts b/client/src/app/shared/form-validators/custom-config-validators.ts index ef6e9b456..1ed5700ff 100644 --- a/client/src/app/shared/form-validators/custom-config-validators.ts +++ b/client/src/app/shared/form-validators/custom-config-validators.ts @@ -49,6 +49,15 @@ export const SIGNUP_LIMIT_VALIDATOR: BuildFormValidator = { } } +export const SIGNUP_MINIMUM_AGE_VALIDATOR: BuildFormValidator = { + VALIDATORS: [Validators.required, Validators.min(1), Validators.pattern('[0-9]+')], + MESSAGES: { + 'required': $localize`Signup minimum age is required.`, + 'min': $localize`Signup minimum age must be greater than 1.`, + 'pattern': $localize`Signup minimum age must be a number.` + } +} + export const ADMIN_EMAIL_VALIDATOR: BuildFormValidator = { VALIDATORS: [Validators.required, Validators.email], MESSAGES: { diff --git a/config/default.yaml b/config/default.yaml index 9b90bacfc..2a281f6c3 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -229,6 +229,7 @@ contact_form: signup: enabled: false limit: 10 # When the limit is reached, registrations are disabled. -1 == unlimited + minimum_age: 16 # Used to configure the signup form requires_email_verification: false filters: cidr: # You can specify CIDR ranges to whitelist (empty = no filtering) or blacklist diff --git a/config/production.yaml.example b/config/production.yaml.example index 47ef47279..42293b843 100644 --- a/config/production.yaml.example +++ b/config/production.yaml.example @@ -239,6 +239,7 @@ contact_form: signup: enabled: false limit: 10 # When the limit is reached, registrations are disabled. -1 == unlimited + mimimum_age: 16 requires_email_verification: false filters: cidr: # You can specify CIDR ranges to whitelist (empty = no filtering) or blacklist diff --git a/server/controllers/api/config.ts b/server/controllers/api/config.ts index c9b5c8047..1f2a5f2da 100644 --- a/server/controllers/api/config.ts +++ b/server/controllers/api/config.ts @@ -174,7 +174,8 @@ function customConfig (): CustomConfig { signup: { enabled: CONFIG.SIGNUP.ENABLED, limit: CONFIG.SIGNUP.LIMIT, - requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION + requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION, + minimumAge: CONFIG.SIGNUP.MINIMUM_AGE }, admin: { email: CONFIG.ADMIN.EMAIL diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts index 2864b0287..93c019121 100644 --- a/server/initializers/checker-before-init.ts +++ b/server/initializers/checker-before-init.ts @@ -19,7 +19,7 @@ function checkMissedConfig () { 'csp.enabled', 'csp.report_only', 'csp.report_uri', 'security.frameguard.enabled', 'cache.previews.size', 'cache.captions.size', 'cache.torrents.size', 'admin.email', 'contact_form.enabled', - 'signup.enabled', 'signup.limit', 'signup.requires_email_verification', + 'signup.enabled', 'signup.limit', 'signup.requires_email_verification', 'signup.minimum_age', 'signup.filters.cidr.whitelist', 'signup.filters.cidr.blacklist', 'redundancy.videos.strategies', 'redundancy.videos.check_interval', 'transcoding.enabled', 'transcoding.threads', 'transcoding.allow_additional_extensions', 'transcoding.hls.enabled', diff --git a/server/initializers/config.ts b/server/initializers/config.ts index 5281d3a66..30a9823b9 100644 --- a/server/initializers/config.ts +++ b/server/initializers/config.ts @@ -185,6 +185,7 @@ const CONFIG = { get ENABLED () { return config.get('signup.enabled') }, get LIMIT () { return config.get('signup.limit') }, get REQUIRES_EMAIL_VERIFICATION () { return config.get('signup.requires_email_verification') }, + get MINIMUM_AGE () { return config.get('signup.minimum_age') }, FILTERS: { CIDR: { get WHITELIST () { return config.get('signup.filters.cidr.whitelist') }, diff --git a/server/lib/server-config-manager.ts b/server/lib/server-config-manager.ts index 1aff6f446..25a770c6b 100644 --- a/server/lib/server-config-manager.ts +++ b/server/lib/server-config-manager.ts @@ -216,6 +216,7 @@ class ServerConfigManager { const signup = { allowed, allowedForCurrentIP, + minimumAge: CONFIG.SIGNUP.MINIMUM_AGE, requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION } diff --git a/server/middlewares/validators/config.ts b/server/middlewares/validators/config.ts index a85883b19..e3e0c2058 100644 --- a/server/middlewares/validators/config.ts +++ b/server/middlewares/validators/config.ts @@ -30,6 +30,7 @@ const customConfigUpdateValidator = [ body('signup.enabled').isBoolean().withMessage('Should have a valid signup enabled boolean'), body('signup.limit').isInt().withMessage('Should have a valid signup limit'), body('signup.requiresEmailVerification').isBoolean().withMessage('Should have a valid requiresEmailVerification boolean'), + body('signup.minimumAge').isInt().withMessage("Should have a valid minimum age required"), body('admin.email').isEmail().withMessage('Should have a valid administrator email'), body('contactForm.enabled').isBoolean().withMessage('Should have a valid contact form enabled boolean'), diff --git a/server/tests/api/check-params/config.ts b/server/tests/api/check-params/config.ts index 004aa65b3..9549070ef 100644 --- a/server/tests/api/check-params/config.ts +++ b/server/tests/api/check-params/config.ts @@ -73,7 +73,8 @@ describe('Test config API validators', function () { signup: { enabled: false, limit: 5, - requiresEmailVerification: false + requiresEmailVerification: false, + minimumAge: 16 }, admin: { email: 'superadmin1@example.com' diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts index 1d9ea31df..19bf9582c 100644 --- a/server/tests/api/server/config.ts +++ b/server/tests/api/server/config.ts @@ -60,6 +60,7 @@ function checkInitialConfig (server: ServerInfo, data: CustomConfig) { expect(data.signup.enabled).to.be.true expect(data.signup.limit).to.equal(4) + expect(data.signup.minimumAge).to.equal(16) expect(data.signup.requiresEmailVerification).to.be.false expect(data.admin.email).to.equal('admin' + server.internalServerNumber + '@example.com') @@ -151,6 +152,7 @@ function checkUpdatedConfig (data: CustomConfig) { expect(data.signup.enabled).to.be.false expect(data.signup.limit).to.equal(5) expect(data.signup.requiresEmailVerification).to.be.false + expect(data.signup.minimumAge).to.equal(10) // We override admin email in parallel tests, so skip this exception if (parallelTests() === false) { @@ -316,7 +318,8 @@ describe('Test config', function () { signup: { enabled: false, limit: 5, - requiresEmailVerification: false + requiresEmailVerification: false, + minimumAge: 10 }, admin: { email: 'superadmin1@example.com' diff --git a/shared/extra-utils/server/config.ts b/shared/extra-utils/server/config.ts index b70110852..9fcfb31fd 100644 --- a/shared/extra-utils/server/config.ts +++ b/shared/extra-utils/server/config.ts @@ -98,7 +98,8 @@ function updateCustomSubConfig (url: string, token: string, newConfig: DeepParti signup: { enabled: false, limit: 5, - requiresEmailVerification: false + requiresEmailVerification: false, + minimumAge: 16 }, admin: { email: 'superadmin1@example.com' diff --git a/shared/models/server/custom-config.model.ts b/shared/models/server/custom-config.model.ts index 0bccd63e3..75d04423a 100644 --- a/shared/models/server/custom-config.model.ts +++ b/shared/models/server/custom-config.model.ts @@ -69,6 +69,7 @@ export interface CustomConfig { enabled: boolean limit: number requiresEmailVerification: boolean + minimumAge: number } admin: { diff --git a/shared/models/server/server-config.model.ts b/shared/models/server/server-config.model.ts index 1667bc0e2..585e99aca 100644 --- a/shared/models/server/server-config.model.ts +++ b/shared/models/server/server-config.model.ts @@ -84,6 +84,7 @@ export interface ServerConfig { allowed: boolean allowedForCurrentIP: boolean requiresEmailVerification: boolean + minimumAge: number } transcoding: {