diff --git a/src/data/constants.js b/src/data/constants.js index 37c9e0ae..215ac49d 100644 --- a/src/data/constants.js +++ b/src/data/constants.js @@ -27,6 +27,7 @@ export const VALID_EMAIL_REGEX = '(^[-!#$%&\'*+/=?^_`{}|~0-9A-Z]+(\\.[-!#$%&\'*+ + '|\\[(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\]$'; export const LETTER_REGEX = /[a-zA-Z]/; export const NUMBER_REGEX = /\d/; +export const VALID_NAME_REGEX = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)?/gi; // eslint-disable-line no-useless-escape // Query string parameters that can be passed to LMS to manage // things like auto-enrollment upon login and registration. diff --git a/src/register/RegistrationPage.jsx b/src/register/RegistrationPage.jsx index bf6bc8f0..bf833d44 100644 --- a/src/register/RegistrationPage.jsx +++ b/src/register/RegistrationPage.jsx @@ -38,7 +38,7 @@ import { getThirdPartyAuthContext } from '../common-components/data/actions'; import { thirdPartyAuthContextSelector } from '../common-components/data/selectors'; import EnterpriseSSO from '../common-components/EnterpriseSSO'; import { - DEFAULT_STATE, PENDING_STATE, REGISTER_PAGE, VALID_EMAIL_REGEX, LETTER_REGEX, NUMBER_REGEX, + DEFAULT_STATE, PENDING_STATE, REGISTER_PAGE, VALID_EMAIL_REGEX, LETTER_REGEX, NUMBER_REGEX, VALID_NAME_REGEX, } from '../data/constants'; import { getTpaProvider, getTpaHint, getAllPossibleQueryParam, setSurveyCookie, setCookie, @@ -305,6 +305,7 @@ class RegistrationPage extends React.Component { const { errors } = this.state; const { intl, statusCode } = this.props; const emailRegex = new RegExp(VALID_EMAIL_REGEX, 'i'); + const urlRegex = new RegExp(VALID_NAME_REGEX); switch (fieldName) { case 'email': @@ -363,6 +364,8 @@ class RegistrationPage extends React.Component { case 'name': if (!value) { errors.name = intl.formatMessage(messages['empty.name.field.error']); + } else if (value && value.match(urlRegex)) { + errors.name = intl.formatMessage(messages['name.validation.message']); } else { errors.name = ''; } diff --git a/src/register/messages.jsx b/src/register/messages.jsx index e0f38b86..e9927a9a 100644 --- a/src/register/messages.jsx +++ b/src/register/messages.jsx @@ -116,6 +116,11 @@ const messages = defineMessages({ defaultMessage: 'Username must be between 2 and 30 characters', description: 'Error message for empty username field', }, + 'name.validation.message': { + id: 'name.validation.message', + defaultMessage: 'Enter a valid name', + description: 'Validation message that appears when fullname contain URL', + }, 'password.validation.message': { id: 'password.validation.message', defaultMessage: 'Password criteria has not been met', diff --git a/src/register/tests/RegistrationPage.test.jsx b/src/register/tests/RegistrationPage.test.jsx index d9b2d7da..da71fd18 100644 --- a/src/register/tests/RegistrationPage.test.jsx +++ b/src/register/tests/RegistrationPage.test.jsx @@ -207,15 +207,16 @@ describe('RegistrationPage', () => { it('should update errors for frontend validations', () => { const registrationPage = mount(reduxWrapper()); + registrationPage.find('input#name').simulate('blur', { target: { value: 'http://test.com', name: 'name' } }); registrationPage.find('input#password').simulate('blur', { target: { value: 'pas', name: 'password' } }); expect(registrationPage.find('RegistrationPage').state('errors')).toEqual({ - email: '', name: '', username: '', password: 'Password criteria has not been met', country: '', + email: '', name: 'Enter a valid name', username: '', password: 'Password criteria has not been met', country: '', }); registrationPage.find('input#password').simulate('blur', { target: { value: 'invalid-email', name: 'email' } }); expect(registrationPage.find('RegistrationPage').state('errors')).toEqual({ - email: 'Enter a valid email address', name: '', username: '', password: 'Password criteria has not been met', country: '', + email: 'Enter a valid email address', name: 'Enter a valid name', username: '', password: 'Password criteria has not been met', country: '', }); });