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": {
"LABEL": "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": {
"LABEL": "Confirm Password",

View file

@ -54,14 +54,9 @@
:class="{ error: $v.credentials.password.$error }"
:label="$t('LOGIN.PASSWORD.LABEL')"
:placeholder="$t('SET_NEW_PASSWORD.PASSWORD.PLACEHOLDER')"
:error="
$v.credentials.password.$error
? $t('SET_NEW_PASSWORD.PASSWORD.ERROR')
: ''
"
:error="passwordErrorText"
@blur="$v.credentials.password.$touch"
/>
<woot-input
v-model.trim="credentials.confirmPassword"
type="password"
@ -122,6 +117,7 @@ import globalConfigMixin from 'shared/mixins/globalConfigMixin';
import alertMixin from 'shared/mixins/alertMixin';
import { DEFAULT_REDIRECT_URL } from '../../constants';
import VueHcaptcha from '@hcaptcha/vue-hcaptcha';
import { isValidPassword } from 'shared/helpers/Validators';
export default {
components: {
VueHcaptcha,
@ -158,6 +154,7 @@ export default {
},
password: {
required,
isValidPassword,
minLength: minLength(6),
},
confirmPassword: {
@ -187,6 +184,19 @@ export default {
}
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: {
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 shouldBeUrl = (value = '') =>
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 { isValidPassword } from '../Validators';
describe('#shouldBeUrl', () => {
it('should return correct url', () => {
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);
});
});