feat: Add missing password validation at signup (#4441)

Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
This commit is contained in:
Sivin Varghese 2022-04-12 11:08:12 +05:30 committed by GitHub
parent c64e2e3bc5
commit 14503b5fe0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 7 deletions

View file

@ -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",

View file

@ -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() {

View file

@ -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
);
};

View file

@ -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);
});
});