diff --git a/src/_style.scss b/src/_style.scss
index aa09d670..32edf162 100644
--- a/src/_style.scss
+++ b/src/_style.scss
@@ -514,7 +514,7 @@ select.form-control {
}
.one-rem-font {
- font-size: 1rem;
+ font-size: 0.99rem;
}
@media (max-width: 767px) {
diff --git a/src/forgot-password/ForgotPasswordPage.jsx b/src/forgot-password/ForgotPasswordPage.jsx
index ba3221f6..95a736c4 100644
--- a/src/forgot-password/ForgotPasswordPage.jsx
+++ b/src/forgot-password/ForgotPasswordPage.jsx
@@ -143,10 +143,8 @@ const ForgotPasswordPage = (props) => {
{intl.formatMessage(messages['need.help.sign.in.text'])}
-
{intl.formatMessage(
- messages['additional.help.text'],
- { infoEmail: process.env.INFO_EMAIL },
- )}
+
{intl.formatMessage(messages['additional.help.text'])}
+ {getConfig().INFO_EMAIL}
diff --git a/src/forgot-password/messages.js b/src/forgot-password/messages.js
index ea5caf9f..55a44307 100644
--- a/src/forgot-password/messages.js
+++ b/src/forgot-password/messages.js
@@ -86,7 +86,7 @@ const messages = defineMessages({
},
'additional.help.text': {
id: 'additional.help.text',
- defaultMessage: 'For additional help, contact edX support at {infoEmail}',
+ defaultMessage: 'For additional help, contact edX support at ',
description: 'additional help text on forgot password page',
},
'sign.in.text': {
diff --git a/src/login/LoginFailure.jsx b/src/login/LoginFailure.jsx
index 06cdb1f1..60e48341 100644
--- a/src/login/LoginFailure.jsx
+++ b/src/login/LoginFailure.jsx
@@ -23,7 +23,7 @@ const LoginFailureMessage = (props) => {
const { context, errorCode, value } = props.loginError;
let errorList;
let link;
- const resetLink = (
+ let resetLink = (
<>
{intl.formatMessage(messages['login.incorrect.credentials.error.reset.link.text'])}
@@ -94,18 +94,23 @@ const LoginFailureMessage = (props) => {
);
break;
case FAILED_LOGIN_ATTEMPT: {
+ resetLink = (
+ <>
+
+ {intl.formatMessage(messages['login.incorrect.credentials.error.before.account.blocked.text'])}
+
+ >
+ );
errorList = (
,
- remainingAttempts: {context.remainingAttempts},
- warning: Warning: ,
- allowedFailureAttempts: {context.allowedFailureAttempts} consecutive,
+ remainingAttempts: context.remainingAttempts,
resetLink,
}}
/>
@@ -117,12 +122,11 @@ const LoginFailureMessage = (props) => {
,
resetLink,
- blockText: Your account {props.loginError.email} is blocked for 30 minutes due to reaching the maximum {context.allowedFailureAttempts} failed login attempts.
,
}}
/>
);
@@ -169,7 +173,7 @@ const LoginFailureMessage = (props) => {
{intl.formatMessage(messages['login.failure.header.title'])}
- { errorList }
+ { errorList }
);
};
diff --git a/src/login/LoginPage.jsx b/src/login/LoginPage.jsx
index 2925fb1e..42765177 100644
--- a/src/login/LoginPage.jsx
+++ b/src/login/LoginPage.jsx
@@ -31,7 +31,7 @@ import { getThirdPartyAuthContext } from '../common-components/data/actions';
import { thirdPartyAuthContextSelector } from '../common-components/data/selectors';
import EnterpriseSSO from '../common-components/EnterpriseSSO';
import {
- DEFAULT_STATE, ENTERPRISE_LOGIN_URL, PENDING_STATE, RESET_PAGE, VALID_EMAIL_REGEX,
+ DEFAULT_STATE, ENTERPRISE_LOGIN_URL, PENDING_STATE, RESET_PAGE,
} from '../data/constants';
import {
getTpaHint,
@@ -91,21 +91,18 @@ class LoginPage extends React.Component {
}
const payload = {
- email: emailOrUsername, password, ...this.queryParams,
+ email_or_username: emailOrUsername, password, ...this.queryParams,
};
this.props.loginRequest(payload);
}
validateEmail(email) {
const { errors } = this.state;
- const regex = new RegExp(VALID_EMAIL_REGEX, 'i');
if (email === '') {
errors.emailOrUsername = this.props.intl.formatMessage(messages['email.validation.message']);
} else if (email.length < 3) {
errors.emailOrUsername = this.props.intl.formatMessage(messages['email.format.validation.less.chars.message']);
- } else if (!regex.test(email)) {
- errors.emailOrUsername = this.props.intl.formatMessage(messages['email.format.validation.message']);
} else {
errors.emailOrUsername = '';
}
diff --git a/src/login/data/service.js b/src/login/data/service.js
index 24923d3c..72a721f0 100644
--- a/src/login/data/service.js
+++ b/src/login/data/service.js
@@ -11,7 +11,7 @@ export async function loginRequest(creds) {
const { data } = await getAuthenticatedHttpClient()
.post(
- `${getConfig().LMS_BASE_URL}/user_api/v1/account/login_session/`,
+ `${getConfig().LMS_BASE_URL}/api/user/v2/account/login_session/`,
querystring.stringify(creds),
requestConfig,
)
diff --git a/src/login/messages.jsx b/src/login/messages.jsx
index 4826020a..d82dfa51 100644
--- a/src/login/messages.jsx
+++ b/src/login/messages.jsx
@@ -208,6 +208,11 @@ const messages = defineMessages({
defaultMessage: 'reset your password',
description: 'Reset password link text for incorrect email or password credentials',
},
+ 'login.incorrect.credentials.error.before.account.blocked.text': {
+ id: 'login.incorrect.credentials.error.before.account.blocked.text',
+ defaultMessage: 'click here to reset it.',
+ description: 'Reset password link text for incorrect email or password credentials before blocking account',
+ },
});
export default messages;
diff --git a/src/login/tests/LoginFailure.test.jsx b/src/login/tests/LoginFailure.test.jsx
index bbae064c..6011b851 100644
--- a/src/login/tests/LoginFailure.test.jsx
+++ b/src/login/tests/LoginFailure.test.jsx
@@ -84,8 +84,8 @@ describe('LoginFailureMessage', () => {
,
);
- const expectedMessage = 'We couldn\'t sign you in.The username, email or password you entered is incorrect. Please try again or '
- + 'reset your password Attempts remaining: 3 Warning: After 6 consecutive unsuccessful login attempts, your account will be locked.';
+ const expectedMessage = 'We couldn\'t sign you in.The username, email or password you entered is incorrect. '
+ + 'You have 3 more sign in attempts before your account is temporarily locked. If you\'ve forgotten your password, click here to reset it.';
expect(loginFailureMessage.find('#login-failure-alert').first().text()).toEqual(expectedMessage);
});
diff --git a/src/login/tests/LoginPage.test.jsx b/src/login/tests/LoginPage.test.jsx
index 9905d827..ba1dd355 100644
--- a/src/login/tests/LoginPage.test.jsx
+++ b/src/login/tests/LoginPage.test.jsx
@@ -91,7 +91,7 @@ describe('LoginPage', () => {
loginPage.find('input#password').simulate('change', { target: { value: 'password' } });
loginPage.find('button.btn-brand').simulate('click');
- expect(store.dispatch).toHaveBeenCalledWith(loginRequest({ email: 'test@example.com', password: 'password' }));
+ expect(store.dispatch).toHaveBeenCalledWith(loginRequest({ email_or_username: 'test@example.com', password: 'password' }));
});
it('should not dispatch loginRequest on empty form submission', () => {
@@ -129,19 +129,6 @@ describe('LoginPage', () => {
expect(loginPage.state('errors')).toEqual(errorState);
});
- it('should match the state for invalid email format on form submission', () => {
- const errorState = { emailOrUsername: 'The email address you\'ve provided isn\'t formatted correctly.', password: '' };
- store.dispatch = jest.fn(store.dispatch);
-
- const loginPage = (mount(reduxWrapper())).find('LoginPage');
-
- loginPage.find('input#password').simulate('change', { target: { value: 'test', name: 'password' } });
- loginPage.find('input#email').simulate('change', { target: { value: 'test@', name: 'email' } });
- loginPage.find('button.btn-brand').simulate('click');
-
- expect(loginPage.state('errors')).toEqual(errorState);
- });
-
// ******** test form buttons and links ********
it('should match default button state', () => {
diff --git a/src/register/RegistrationPage.jsx b/src/register/RegistrationPage.jsx
index e02bd0b4..7afd6ab1 100644
--- a/src/register/RegistrationPage.jsx
+++ b/src/register/RegistrationPage.jsx
@@ -252,6 +252,7 @@ class RegistrationPage extends React.Component {
} else if (value.length <= 2 || !emailRegex.test(value)) {
errors.email = intl.formatMessage(messages['email.invalid.format.error']);
} else if (emailRegex.test(value)) {
+ errors.email = '';
let emailLexemes = value.split('@');
let domainLexemes = emailLexemes[1].split('.');
const serviceProvider = domainLexemes[0];