feat: Add installationId, ip, resendRequest to arguments passed to verifyUserEmails on verification email request (#8873)
BREAKING CHANGE: The `Parse.User` passed as argument if `verifyUserEmails` is set to a function is renamed from `user` to `object` for consistency with invocations of `verifyUserEmails` on signup or login; the user object is not a plain JavaScript object anymore but an instance of `Parse.User`
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
const Auth = require('../lib/Auth');
|
const Auth = require('../lib/Auth');
|
||||||
const Config = require('../lib/Config');
|
const Config = require('../lib/Config');
|
||||||
const request = require('../lib/request');
|
const request = require('../lib/request');
|
||||||
|
const MockEmailAdapterWithOptions = require('./support/MockEmailAdapterWithOptions');
|
||||||
|
|
||||||
describe('Email Verification Token Expiration: ', () => {
|
describe('Email Verification Token Expiration: ', () => {
|
||||||
it('show the invalid verification link page, if the user clicks on the verify email link after the email verify token expires', done => {
|
it('show the invalid verification link page, if the user clicks on the verify email link after the email verify token expires', done => {
|
||||||
@@ -794,6 +795,41 @@ describe('Email Verification Token Expiration: ', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('provides function arguments in verifyUserEmails on verificationEmailRequest', async () => {
|
||||||
|
const user = new Parse.User();
|
||||||
|
user.setUsername('user');
|
||||||
|
user.setPassword('pass');
|
||||||
|
user.set('email', 'test@example.com');
|
||||||
|
await user.signUp();
|
||||||
|
|
||||||
|
const verifyUserEmails = {
|
||||||
|
method: async (params) => {
|
||||||
|
expect(params.object).toBeInstanceOf(Parse.User);
|
||||||
|
expect(params.ip).toBeDefined();
|
||||||
|
expect(params.master).toBeDefined();
|
||||||
|
expect(params.installationId).toBeDefined();
|
||||||
|
expect(params.resendRequest).toBeTrue();
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const verifyUserEmailsSpy = spyOn(verifyUserEmails, 'method').and.callThrough();
|
||||||
|
await reconfigureServer({
|
||||||
|
appName: 'test',
|
||||||
|
publicServerURL: 'http://localhost:1337/1',
|
||||||
|
verifyUserEmails: verifyUserEmails.method,
|
||||||
|
preventLoginWithUnverifiedEmail: verifyUserEmails.method,
|
||||||
|
preventSignupWithUnverifiedEmail: true,
|
||||||
|
emailAdapter: MockEmailAdapterWithOptions({
|
||||||
|
fromAddress: 'parse@example.com',
|
||||||
|
apiKey: 'k',
|
||||||
|
domain: 'd',
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
await expectAsync(Parse.User.requestEmailVerification('test@example.com')).toBeResolved();
|
||||||
|
expect(verifyUserEmailsSpy).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
it('should throw with invalid emailVerifyTokenReuseIfValid', async done => {
|
it('should throw with invalid emailVerifyTokenReuseIfValid', async done => {
|
||||||
const sendEmailOptions = [];
|
const sendEmailOptions = [];
|
||||||
const emailAdapter = {
|
const emailAdapter = {
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ export class UserController extends AdaptableController {
|
|||||||
* @param user
|
* @param user
|
||||||
* @returns {*}
|
* @returns {*}
|
||||||
*/
|
*/
|
||||||
async regenerateEmailVerifyToken(user, master) {
|
async regenerateEmailVerifyToken(user, master, installationId, ip) {
|
||||||
const { _email_verify_token } = user;
|
const { _email_verify_token } = user;
|
||||||
let { _email_verify_token_expires_at } = user;
|
let { _email_verify_token_expires_at } = user;
|
||||||
if (_email_verify_token_expires_at && _email_verify_token_expires_at.__type === 'Date') {
|
if (_email_verify_token_expires_at && _email_verify_token_expires_at.__type === 'Date') {
|
||||||
@@ -211,7 +211,13 @@ export class UserController extends AdaptableController {
|
|||||||
) {
|
) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
const shouldSend = await this.setEmailVerifyToken(user, { user, master });
|
const shouldSend = await this.setEmailVerifyToken(user, {
|
||||||
|
object: Parse.User.fromJSON(Object.assign({ className: '_User' }, user)),
|
||||||
|
master,
|
||||||
|
installationId,
|
||||||
|
ip,
|
||||||
|
resendRequest: true
|
||||||
|
});
|
||||||
if (!shouldSend) {
|
if (!shouldSend) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -223,7 +229,7 @@ export class UserController extends AdaptableController {
|
|||||||
if (!aUser || aUser.emailVerified) {
|
if (!aUser || aUser.emailVerified) {
|
||||||
throw undefined;
|
throw undefined;
|
||||||
}
|
}
|
||||||
const generate = await this.regenerateEmailVerifyToken(aUser, req.auth?.isMaster);
|
const generate = await this.regenerateEmailVerifyToken(aUser, req.auth?.isMaster, req.auth?.installationId, req.ip);
|
||||||
if (generate) {
|
if (generate) {
|
||||||
this.sendVerificationEmail(aUser, req);
|
this.sendVerificationEmail(aUser, req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -490,7 +490,7 @@ export class UsersRouter extends ClassesRouter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const userController = req.config.userController;
|
const userController = req.config.userController;
|
||||||
const send = await userController.regenerateEmailVerifyToken(user, req.auth.isMaster);
|
const send = await userController.regenerateEmailVerifyToken(user, req.auth.isMaster, req.auth.installationId, req.ip);
|
||||||
if (send) {
|
if (send) {
|
||||||
userController.sendVerificationEmail(user, req);
|
userController.sendVerificationEmail(user, req);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user