From ba7b7e572f0634e534320a057f4cc0a95f2a541d Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Mon, 25 Nov 2019 11:16:12 +0100 Subject: [PATCH] (plugins) adding signup scope and init hook, modifying ensureUserRegistrationAllowed allowedParams --- .../src/app/+signup/+register/register.component.ts | 11 +++++++++-- client/src/app/core/plugins/plugin.service.ts | 3 ++- server/middlewares/validators/users.ts | 3 ++- shared/models/plugins/client-hook.model.ts | 10 ++++++++-- shared/models/plugins/plugin-client-scope.type.ts | 2 +- .../models/plugins/register-server-setting.model.ts | 3 ++- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/client/src/app/+signup/+register/register.component.ts b/client/src/app/+signup/+register/register.component.ts index d470ef4dc..5a7215516 100644 --- a/client/src/app/+signup/+register/register.component.ts +++ b/client/src/app/+signup/+register/register.component.ts @@ -6,6 +6,7 @@ import { UserRegister } from '@shared/models/users/user-register.model' import { FormGroup } from '@angular/forms' import { About } from '@shared/models/server' import { InstanceService } from '@app/shared/instance/instance.service' +import { HooksService } from '@app/core/plugins/hooks.service' import { NgbAccordion } from '@ng-bootstrap/ng-bootstrap' @Component({ @@ -41,6 +42,7 @@ export class RegisterComponent implements OnInit { private serverService: ServerService, private redirectService: RedirectService, private instanceService: InstanceService, + private hooks: HooksService, private i18n: I18n ) { } @@ -60,6 +62,8 @@ export class RegisterComponent implements OnInit { err => this.notifier.error(err.message) ) + + this.hooks.runAction('action:signup.register.init', 'signup') } hasSameChannelAndAccountNames () { @@ -94,10 +98,13 @@ export class RegisterComponent implements OnInit { if (this.accordion) this.accordion.toggle('code-of-conduct') } - signup () { + async signup () { this.error = null - const body: UserRegister = Object.assign(this.formStepUser.value, { channel: this.formStepChannel.value }) + const body: UserRegister = await this.hooks.wrapObject( + Object.assign(this.formStepUser.value, { channel: this.formStepChannel.value }), + 'filter:api.signup.registration.create.params' + ) this.userService.signup(body).subscribe( () => { diff --git a/client/src/app/core/plugins/plugin.service.ts b/client/src/app/core/plugins/plugin.service.ts index 3af36765a..52ba4215a 100644 --- a/client/src/app/core/plugins/plugin.service.ts +++ b/client/src/app/core/plugins/plugin.service.ts @@ -42,7 +42,8 @@ export class PluginService implements ClientHook { pluginsLoaded: { [ scope in PluginClientScope ]: ReplaySubject } = { common: new ReplaySubject(1), search: new ReplaySubject(1), - 'video-watch': new ReplaySubject(1) + 'video-watch': new ReplaySubject(1), + signup: new ReplaySubject(1) } translationsObservable: Observable diff --git a/server/middlewares/validators/users.ts b/server/middlewares/validators/users.ts index 8615de406..c78c67a8c 100644 --- a/server/middlewares/validators/users.ts +++ b/server/middlewares/validators/users.ts @@ -283,7 +283,8 @@ const usersVideoRatingValidator = [ const ensureUserRegistrationAllowed = [ async (req: express.Request, res: express.Response, next: express.NextFunction) => { const allowedParams = { - body: req.body + body: req.body, + ip: req.ip } const allowedResult = await Hooks.wrapPromiseFun( diff --git a/shared/models/plugins/client-hook.model.ts b/shared/models/plugins/client-hook.model.ts index 07ea7eb96..91167ff8c 100644 --- a/shared/models/plugins/client-hook.model.ts +++ b/shared/models/plugins/client-hook.model.ts @@ -38,7 +38,10 @@ export const clientFilterHookObject = { 'filter:api.search.videos.list.result': true, // Filter params/result of the function that fetch video-channels according to the user search 'filter:api.search.video-channels.list.params': true, - 'filter:api.search.video-channels.list.result': true + 'filter:api.search.video-channels.list.result': true, + + // Filter form + 'filter:api.signup.registration.create.params': true } export type ClientFilterHookName = keyof typeof clientFilterHookObject @@ -58,7 +61,10 @@ export const clientActionHookObject = { 'action:search.init': true, // Fired every time Angular URL changes - 'action:router.navigation-end': true + 'action:router.navigation-end': true, + + // Fired when the registration page is being initialized + 'action:signup.register.init': true } export type ClientActionHookName = keyof typeof clientActionHookObject diff --git a/shared/models/plugins/plugin-client-scope.type.ts b/shared/models/plugins/plugin-client-scope.type.ts index 0c616c5ed..1c6d884f0 100644 --- a/shared/models/plugins/plugin-client-scope.type.ts +++ b/shared/models/plugins/plugin-client-scope.type.ts @@ -1 +1 @@ -export type PluginClientScope = 'common' | 'video-watch' | 'search' +export type PluginClientScope = 'common' | 'video-watch' | 'search' | 'signup' diff --git a/shared/models/plugins/register-server-setting.model.ts b/shared/models/plugins/register-server-setting.model.ts index 78c5abd1b..65a181705 100644 --- a/shared/models/plugins/register-server-setting.model.ts +++ b/shared/models/plugins/register-server-setting.model.ts @@ -3,7 +3,8 @@ export interface RegisterServerSettingOptions { label: string type: 'input' - // If the setting is not private, anyone can view its value + // If the setting is not private, anyone can view its value (client code included) + // If the setting is private, only server-side hooks can access it // Mainly used by the PeerTube client to get admin config private: boolean -- 2.41.0