feat: Add missing password validation at signup (#4441)
Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
This commit is contained in:
parent
c64e2e3bc5
commit
14503b5fe0
4 changed files with 49 additions and 7 deletions
|
@ -21,7 +21,8 @@
|
||||||
"PASSWORD": {
|
"PASSWORD": {
|
||||||
"LABEL": "Password",
|
"LABEL": "Password",
|
||||||
"PLACEHOLDER": "Password",
|
"PLACEHOLDER": "Password",
|
||||||
"ERROR": "Password is too short"
|
"ERROR": "Password is too short",
|
||||||
|
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
|
||||||
},
|
},
|
||||||
"CONFIRM_PASSWORD": {
|
"CONFIRM_PASSWORD": {
|
||||||
"LABEL": "Confirm Password",
|
"LABEL": "Confirm Password",
|
||||||
|
|
|
@ -54,14 +54,9 @@
|
||||||
:class="{ error: $v.credentials.password.$error }"
|
:class="{ error: $v.credentials.password.$error }"
|
||||||
:label="$t('LOGIN.PASSWORD.LABEL')"
|
:label="$t('LOGIN.PASSWORD.LABEL')"
|
||||||
:placeholder="$t('SET_NEW_PASSWORD.PASSWORD.PLACEHOLDER')"
|
:placeholder="$t('SET_NEW_PASSWORD.PASSWORD.PLACEHOLDER')"
|
||||||
:error="
|
:error="passwordErrorText"
|
||||||
$v.credentials.password.$error
|
|
||||||
? $t('SET_NEW_PASSWORD.PASSWORD.ERROR')
|
|
||||||
: ''
|
|
||||||
"
|
|
||||||
@blur="$v.credentials.password.$touch"
|
@blur="$v.credentials.password.$touch"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<woot-input
|
<woot-input
|
||||||
v-model.trim="credentials.confirmPassword"
|
v-model.trim="credentials.confirmPassword"
|
||||||
type="password"
|
type="password"
|
||||||
|
@ -122,6 +117,7 @@ import globalConfigMixin from 'shared/mixins/globalConfigMixin';
|
||||||
import alertMixin from 'shared/mixins/alertMixin';
|
import alertMixin from 'shared/mixins/alertMixin';
|
||||||
import { DEFAULT_REDIRECT_URL } from '../../constants';
|
import { DEFAULT_REDIRECT_URL } from '../../constants';
|
||||||
import VueHcaptcha from '@hcaptcha/vue-hcaptcha';
|
import VueHcaptcha from '@hcaptcha/vue-hcaptcha';
|
||||||
|
import { isValidPassword } from 'shared/helpers/Validators';
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
VueHcaptcha,
|
VueHcaptcha,
|
||||||
|
@ -158,6 +154,7 @@ export default {
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
required,
|
required,
|
||||||
|
isValidPassword,
|
||||||
minLength: minLength(6),
|
minLength: minLength(6),
|
||||||
},
|
},
|
||||||
confirmPassword: {
|
confirmPassword: {
|
||||||
|
@ -187,6 +184,19 @@ export default {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
passwordErrorText() {
|
||||||
|
const { password } = this.$v.credentials;
|
||||||
|
if (!password.$error) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (!password.minLength) {
|
||||||
|
return this.$t('REGISTER.PASSWORD.ERROR');
|
||||||
|
}
|
||||||
|
if (!password.isValidPassword) {
|
||||||
|
return this.$t('REGISTER.PASSWORD.IS_INVALID_PASSWORD');
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async submit() {
|
async submit() {
|
||||||
|
|
|
@ -2,3 +2,17 @@ export const isPhoneE164 = value => !!value.match(/^\+[1-9]\d{1,14}$/);
|
||||||
export const isPhoneE164OrEmpty = value => isPhoneE164(value) || value === '';
|
export const isPhoneE164OrEmpty = value => isPhoneE164(value) || value === '';
|
||||||
export const shouldBeUrl = (value = '') =>
|
export const shouldBeUrl = (value = '') =>
|
||||||
value ? value.startsWith('http') : true;
|
value ? value.startsWith('http') : true;
|
||||||
|
export const isValidPassword = value => {
|
||||||
|
const containsUppercase = /[A-Z]/.test(value);
|
||||||
|
const containsLowercase = /[a-z]/.test(value);
|
||||||
|
const containsNumber = /[0-9]/.test(value);
|
||||||
|
const containsSpecialCharacter = /[!@#$%^&*()_+\-=[\]{}|'"/\\.,`<>:;?~]/.test(
|
||||||
|
value
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
containsUppercase &&
|
||||||
|
containsLowercase &&
|
||||||
|
containsNumber &&
|
||||||
|
containsSpecialCharacter
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
|
@ -1,7 +1,24 @@
|
||||||
import { shouldBeUrl } from '../Validators';
|
import { shouldBeUrl } from '../Validators';
|
||||||
|
import { isValidPassword } from '../Validators';
|
||||||
|
|
||||||
describe('#shouldBeUrl', () => {
|
describe('#shouldBeUrl', () => {
|
||||||
it('should return correct url', () => {
|
it('should return correct url', () => {
|
||||||
expect(shouldBeUrl('http')).toEqual(true);
|
expect(shouldBeUrl('http')).toEqual(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#isValidPassword', () => {
|
||||||
|
it('should return correct password', () => {
|
||||||
|
expect(isValidPassword('testPass4!')).toEqual(true);
|
||||||
|
expect(isValidPassword('testPass4-')).toEqual(true);
|
||||||
|
expect(isValidPassword('testPass4\\')).toEqual(true);
|
||||||
|
expect(isValidPassword("testPass4'")).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return wrong password', () => {
|
||||||
|
expect(isValidPassword('testpass4')).toEqual(false);
|
||||||
|
expect(isValidPassword('testPass4')).toEqual(false);
|
||||||
|
expect(isValidPassword('testpass4!')).toEqual(false);
|
||||||
|
expect(isValidPassword('testPass!')).toEqual(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue