Skip to content

Commit f8259c5

Browse files
committed
add filter:api.user.signup.requires-approval.result
closes Chocobozzz#6691
1 parent d16d2e6 commit f8259c5

File tree

15 files changed

+225
-57
lines changed

15 files changed

+225
-57
lines changed

client/src/app/+signup/+register/register.component.ts

+12-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { AuthService, ServerService } from '@app/core'
77
import { HooksService } from '@app/core/plugins/hooks.service'
88
import { InstanceAboutAccordionComponent } from '@app/shared/shared-instance/instance-about-accordion.component'
99
import { AlertComponent } from '@app/shared/shared-main/common/alert.component'
10-
import { PeerTubeProblemDocument, ServerConfig, ServerStats, UserRegister } from '@peertube/peertube-models'
10+
import { UserRegistrationState, PeerTubeProblemDocument, ServerConfig, ServerStats, UserRegister } from '@peertube/peertube-models'
1111
import { LoaderComponent } from '../../shared/shared-main/common/loader.component'
1212
import { SignupLabelComponent } from '../../shared/shared-main/users/signup-label.component'
1313
import { SignupStepTitleComponent } from '../shared/signup-step-title.component'
@@ -78,6 +78,7 @@ export class RegisterComponent implements OnInit {
7878
serverStats: ServerStats
7979

8080
private serverConfig: ServerConfig
81+
private _requiresApproval: boolean
8182

8283
constructor (
8384
private route: ActivatedRoute,
@@ -92,7 +93,11 @@ export class RegisterComponent implements OnInit {
9293
}
9394

9495
get requiresApproval () {
95-
return this.serverConfig.signup.requiresApproval
96+
return this._requiresApproval ?? this.serverConfig.signup.requiresApproval
97+
}
98+
99+
set requiresApproval (value: boolean) {
100+
this._requiresApproval = value
96101
}
97102

98103
get minimumAge () {
@@ -197,12 +202,13 @@ export class RegisterComponent implements OnInit {
197202
'filter:api.signup.registration.create.params'
198203
)
199204

200-
const obs = this.requiresApproval
201-
? this.signupService.requestSignup(body)
202-
: this.signupService.directSignup(body)
205+
const obs = this.signupService.signup(body)
203206

204207
obs.subscribe({
205-
next: () => {
208+
next: (registration) => {
209+
const { state } = registration
210+
this.requiresApproval = state.id === UserRegistrationState.PENDING
211+
206212
if (this.requiresEmailVerification || this.requiresApproval) {
207213
this.signupSuccess = true
208214
return

client/src/app/+signup/shared/signup.service.ts

+3-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { catchError, tap } from 'rxjs/operators'
22
import { HttpClient } from '@angular/common/http'
33
import { Injectable } from '@angular/core'
44
import { RestExtractor, UserService } from '@app/core'
5-
import { UserRegister, UserRegistrationRequest } from '@peertube/peertube-models'
5+
import { UserRegister, UserRegistration as UserRegistrationServerModel } from '@peertube/peertube-models'
66

77
@Injectable()
88
export class SignupService {
@@ -13,19 +13,14 @@ export class SignupService {
1313
private userService: UserService
1414
) { }
1515

16-
directSignup (userCreate: UserRegister) {
17-
return this.authHttp.post(UserService.BASE_USERS_URL + 'register', userCreate)
16+
signup (userCreate: UserRegister) {
17+
return this.authHttp.post<UserRegistrationServerModel>(UserService.BASE_USERS_URL + 'register', userCreate)
1818
.pipe(
1919
tap(() => this.userService.setSignupInThisSession(true)),
2020
catchError(err => this.restExtractor.handleError(err))
2121
)
2222
}
2323

24-
requestSignup (userCreate: UserRegistrationRequest) {
25-
return this.authHttp.post(UserService.BASE_USERS_URL + 'registrations/request', userCreate)
26-
.pipe(catchError(err => this.restExtractor.handleError(err)))
27-
}
28-
2924
// ---------------------------------------------------------------------------
3025

3126
verifyUserEmail (options: {

packages/models/src/plugins/server/server-hook.model.ts

+3
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ export const serverFilterHookObject = {
100100
// Filter result used to check if a user can register on the instance
101101
'filter:api.user.signup.allowed.result': true,
102102

103+
// Filter result used to check if signup requires approval on the instance
104+
'filter:api.user.signup.requires-approval.result': true,
105+
103106
// Filter result used to check if a user can send a registration request on the instance
104107
// PeerTube >= 5.1
105108
'filter:api.user.request-signup.allowed.result': true,

packages/models/src/users/registration/user-registration.model.ts

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import { UserRegistrationStateType } from './user-registration-state.model.js'
22

3+
export interface UserRegistrationResponse {
4+
state: {
5+
id: UserRegistrationStateType
6+
label: string
7+
}
8+
}
9+
310
export interface UserRegistration {
411
id: number
512

packages/server-commands/src/users/registrations-command.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ export class RegistrationsCommand extends AbstractCommand {
2020

2121
path,
2222
fields: {
23-
...pick(options, [ 'username', 'displayName', 'channel' ]),
23+
...pick(options, [ 'username', 'displayName', 'channel', 'registrationReason' ]),
2424

2525
password,
2626
email
2727
},
2828
implicitToken: false,
29-
defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
29+
defaultExpectedStatus: HttpStatusCode.OK_200
3030
})
3131
}
3232

packages/tests/fixtures/peertube-plugin-test/main.js

+10
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,16 @@ async function register ({ registerHook, registerSetting, settingsManager, stora
320320
}
321321
})
322322

323+
registerHook({
324+
target: 'filter:api.user.signup.requires-approval.result',
325+
handler: ({ requiresApproval, registrationReason }, { body, headers }) => {
326+
return {
327+
requiresApproval: body.username === 'waiting_john',
328+
registrationReason: 'Marked as spam'
329+
}
330+
}
331+
})
332+
323333
{
324334
registerHook({
325335
target: 'filter:api.user.signup.allowed.result',

packages/tests/src/api/check-params/registrations.ts

+22-11
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,10 @@ describe('Test registrations API validators', function () {
190190
const { total } = await server.users.list()
191191

192192
await server.config.enableSignup(false, total + 1)
193-
await server.registrations.register({ username: 'user43', expectedStatus: HttpStatusCode.NO_CONTENT_204 })
193+
await server.registrations.register({ username: 'user43', expectedStatus: HttpStatusCode.OK_200 })
194194

195195
await server.config.enableSignup(true, total + 2)
196-
await server.registrations.requestRegistration({
196+
await server.registrations.register({
197197
username: 'user44',
198198
registrationReason: 'reason',
199199
expectedStatus: HttpStatusCode.OK_200
@@ -214,14 +214,14 @@ describe('Test registrations API validators', function () {
214214
channel: { name: 'super_user_direct_1_channel', displayName: 'super user direct 1 channel' }
215215
}
216216

217-
await makePostBodyRequest({ url: server.url, path: registrationPath, fields, expectedStatus: HttpStatusCode.NO_CONTENT_204 })
217+
await makePostBodyRequest({ url: server.url, path: registrationPath, fields, expectedStatus: HttpStatusCode.OK_200 })
218218
})
219219

220-
it('Should fail if the instance requires approval', async function () {
220+
it('Should fail if registration reason isnt provided', async function () {
221221
this.timeout(60000)
222222

223223
await server.config.enableSignup(true)
224-
await server.registrations.register({ username: 'user42', expectedStatus: HttpStatusCode.FORBIDDEN_403 })
224+
await server.registrations.register({ username: 'user42', expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
225225
})
226226
})
227227

@@ -312,10 +312,15 @@ describe('Test registrations API validators', function () {
312312
before(async function () {
313313
this.timeout(60000)
314314

315-
await server.config.enableSignup(true);
315+
await server.config.enableSignup(true)
316+
317+
await server.registrations.requestRegistration({ username: 'request_2', registrationReason: 'toto' })
318+
await server.registrations.requestRegistration({ username: 'request_3', registrationReason: 'toto' })
316319

317-
({ id: id1 } = await server.registrations.requestRegistration({ username: 'request_2', registrationReason: 'toto' }));
318-
({ id: id2 } = await server.registrations.requestRegistration({ username: 'request_3', registrationReason: 'toto' }))
320+
const registrations = await server.registrations.list()
321+
322+
id1 = registrations.data[0].id
323+
id2 = registrations.data[1].id
319324
})
320325

321326
it('Should fail to accept/reject registration without token', async function () {
@@ -375,9 +380,15 @@ describe('Test registrations API validators', function () {
375380
let id3: number
376381

377382
before(async function () {
378-
({ id: id1 } = await server.registrations.requestRegistration({ username: 'request_4', registrationReason: 'toto' }));
379-
({ id: id2 } = await server.registrations.requestRegistration({ username: 'request_5', registrationReason: 'toto' }));
380-
({ id: id3 } = await server.registrations.requestRegistration({ username: 'request_6', registrationReason: 'toto' }))
383+
await server.registrations.requestRegistration({ username: 'request_4', registrationReason: 'toto' })
384+
await server.registrations.requestRegistration({ username: 'request_5', registrationReason: 'toto' })
385+
await server.registrations.requestRegistration({ username: 'request_6', registrationReason: 'toto' })
386+
387+
const registrations = await server.registrations.list()
388+
389+
id1 = registrations.data[0].id
390+
id2 = registrations.data[1].id
391+
id3 = registrations.data[2].id
381392

382393
await server.registrations.accept({ id: id2, moderationResponse: 'tt' })
383394
await server.registrations.reject({ id: id3, moderationResponse: 'tt' })

packages/tests/src/api/server/email.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,13 @@ describe('Test emails', function () {
314314
let registrationIdEmail: number
315315

316316
before(async function () {
317-
const { id } = await server.registrations.requestRegistration({
317+
await server.registrations.requestRegistration({
318318
username: 'request_1',
319319
320320
registrationReason: 'tt'
321321
})
322-
registrationId = id
322+
const registrations = await server.registrations.list()
323+
registrationId = registrations.data[0].id
323324
})
324325

325326
it('Should ask to send the verification email', async function () {

packages/tests/src/api/server/reverse-proxy.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ describe('Test application behind a reverse proxy', function () {
124124
await server.registrations.register({ username: 'test' + i, expectedStatus: HttpStatusCode.CONFLICT_409 })
125125
}
126126

127-
await server.registrations.register({ username: 'test43', expectedStatus: HttpStatusCode.NO_CONTENT_204 })
127+
await server.registrations.register({ username: 'test43', expectedStatus: HttpStatusCode.OK_200 })
128128

129129
})
130130

packages/tests/src/api/server/stats.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,12 @@ describe('Test stats (excluding redundancy)', function () {
316316
it('Should create registration requests, accept one and have correct stats', async function () {
317317
beforeTimestamp = new Date().getTime()
318318

319-
const { id: id1 } = await servers[0].registrations.requestRegistration({ username: 'user2', registrationReason: 'reason 1' });
320-
({ id: id2 } = await servers[0].registrations.requestRegistration({ username: 'user3', registrationReason: 'reason 2' }))
321-
await servers[0].registrations.requestRegistration({ username: 'user4', registrationReason: 'reason 3' })
319+
await servers[0].registrations.register({ username: 'user2', registrationReason: 'reason 1' })
320+
await servers[0].registrations.register({ username: 'user3', registrationReason: 'reason 2' })
321+
const registrations = await servers[0].registrations.list()
322+
const id1 = registrations.data[1].id
323+
id2 = registrations.data[0].id
324+
await servers[0].registrations.register({ username: 'user4', registrationReason: 'reason 3' })
322325

323326
await wait(1500)
324327

0 commit comments

Comments
 (0)