From d5319a66588dde11e789d9f265900571c0c69e46 Mon Sep 17 00:00:00 2001 From: Luis Deschamps Rudge Date: Wed, 29 May 2019 00:39:16 -0300 Subject: [PATCH 1/3] Add validation to new root profile attributes --- src/__tests__/field/field.test.js | 37 +++++++++++++++++ src/__tests__/field/username.test.js | 7 ++-- src/field/index.js | 24 +++++++++-- src/field/username.js | 6 +-- support/index.html | 59 +++------------------------- 5 files changed, 69 insertions(+), 64 deletions(-) create mode 100644 src/__tests__/field/field.test.js diff --git a/src/__tests__/field/field.test.js b/src/__tests__/field/field.test.js new file mode 100644 index 000000000..1d967847d --- /dev/null +++ b/src/__tests__/field/field.test.js @@ -0,0 +1,37 @@ +import Immutable from 'immutable'; +import { setField } from '../../field'; + +const createModel = field => + Immutable.fromJS({ + field: { + [field]: `old_test_${field}` + } + }); + +const testField = (field, maxLength) => { + const m = createModel(field); + expect(setField(m, field, '').toJS().field[field].valid).toBe(false); + expect(setField(m, field, 'test_value').toJS().field[field].valid).toBe(true); + if (maxLength) { + expect(setField(m, field, 'a'.repeat(maxLength + 1)).toJS().field[field].valid).toBe(false); + } +}; +describe('field/index', () => { + describe('default validation', () => { + it('validates family_name', () => { + testField('family_name', 150); + }); + it('validates family_name', () => { + testField('given_name', 150); + }); + it('validates name', () => { + testField('name', 300); + }); + it('validates nickname', () => { + testField('nickname', 300); + }); + it('validates other fields', () => { + testField('test'); + }); + }); +}); diff --git a/src/__tests__/field/username.test.js b/src/__tests__/field/username.test.js index aeb153323..71cb8f5a1 100644 --- a/src/__tests__/field/username.test.js +++ b/src/__tests__/field/username.test.js @@ -24,9 +24,10 @@ describe('field/username', () => { }); }); describe('usernameLooksLikeEmail()', () => { - it('checks for @', () => { + it('checks for @ and .', () => { expect(username.usernameLooksLikeEmail('t@t.com')).toBe(true); expect(username.usernameLooksLikeEmail('tt.com')).toBe(false); + expect(username.usernameLooksLikeEmail('t@tcom')).toBe(false); }); }); describe('getUsernameValidation()', () => { @@ -134,11 +135,11 @@ describe('field/username', () => { expectToFailWith('aaaaaa'); }); it('validates invalid chars', () => { - const invalidChars = `{}[],;?/\\!@#$%¨&*()¹²³\`~^´ªº§£¢¬<>|"' `.split(''); + const invalidChars = `{}[],;?/\\%¨&*()¹²³ªº§£¢¬<>|" `.split(''); invalidChars.forEach(i => expectToFailWith(`aa${i}`)); }); it('accepts letters, numbers, `_`, `-`, `+` and `.`', () => { - const validChars = `_-+.`.split(''); + const validChars = `_+-.!#$'^\`~@`.split(''); validChars.forEach(i => expectToSuccedWith(`aa${i}`)); }); }); diff --git a/src/field/index.js b/src/field/index.js index b067952ac..46a8d8fcf 100644 --- a/src/field/index.js +++ b/src/field/index.js @@ -4,15 +4,31 @@ import trim from 'trim'; import OptionSelectionPane from './option_selection_pane'; import * as l from '../core/index'; -export function setField(m, field, value, validator = str => trim(str).length > 0, ...args) { +const minMax = (value, min, max) => value.length >= min && value.length <= max; + +const getDefaultValidator = field => { + switch (field) { + case 'family_name': + return str => minMax(trim(str), 1, 150); + case 'given_name': + return str => minMax(trim(str), 1, 150); + case 'name': + return str => minMax(trim(str), 1, 300); + case 'nickname': + return str => minMax(trim(str), 1, 300); + + default: + return str => trim(str).length > 0; + } +}; + +export function setField(m, field, value, validator = getDefaultValidator(field), ...args) { const prevValue = m.getIn(['field', field, 'value']); const prevShowInvalid = m.getIn(['field', field, 'showInvalid'], false); const validation = validate(validator, value, ...args); - return m.mergeIn( ['field', field], - validation, - Map({ + validation.merge({ value: value, showInvalid: prevShowInvalid && prevValue === value }) diff --git a/src/field/username.js b/src/field/username.js index cbf5d9dc6..9beee9c52 100644 --- a/src/field/username.js +++ b/src/field/username.js @@ -3,8 +3,8 @@ import { validateEmail } from './email'; import { databaseConnection } from '../connection/database'; import trim from 'trim'; -const DEFAULT_CONNECTION_VALIDATION = { username: { min: 1, max: 15 } }; -const regExp = /^[a-zA-Z0-9_+\-.]+$/; +const DEFAULT_CONNECTION_VALIDATION = { username: { min: 1, max: 128 } }; +const regExp = /^[a-zA-Z0-9_+\-.!#\$\^`~@']*$/; function validateUsername(str, validateFormat, settings = DEFAULT_CONNECTION_VALIDATION.username) { // If the connection does not have validation settings, it should only check if the field is empty. @@ -55,5 +55,5 @@ export function setUsername(m, str, usernameStyle = 'username', validateUsername } export function usernameLooksLikeEmail(str) { - return str.indexOf('@') > -1; + return str.indexOf('@') > -1 && str.indexOf('.') > -1; } diff --git a/support/index.html b/support/index.html index c7736174b..7a6a5f3e6 100644 --- a/support/index.html +++ b/support/index.html @@ -126,7 +126,7 @@

usernameStyle: 'email', defaultDatabaseConnection: 'acme', prefill: { - email: 'johnfoo@gmail.com' + email: 'luis@luisrudge.net' }, passwordlessMethod: 'code', auth: { @@ -137,64 +137,15 @@

}, additionalSignUpFields: [ { - name: 'address', - placeholder: 'enter your address (optional)', + name: 'name', + placeholder: 'name', validator: function() { return true; } }, { - name: 'address221', - placeholder: 'enter your address (optional)', - validator: function() { - return true; - } - }, - { - name: 'address1', - placeholder: 'enter your address (optional)', - validator: function() { - return true; - } - }, - { - name: 'address2', - placeholder: 'enter your address (optional)', - validator: function() { - return true; - } - }, - { - name: 'address3', - placeholder: 'enter your address (optional)', - validator: function() { - return true; - } - }, - { - name: 'address4', - placeholder: 'enter your address (optional)', - validator: function() { - return true; - } - }, - { - name: 'address45', - placeholder: 'enter your address (optional)', - validator: function() { - return true; - } - }, - { - name: 'address6', - placeholder: 'enter your address (optional)', - validator: function() { - return true; - } - }, - { - name: 'address7', - placeholder: 'enter your address (optional)', + name: 'other_name', + placeholder: 'other name', validator: function() { return true; } From 00aa1ade330da0f8f713a0c9c91035125feacd40 Mon Sep 17 00:00:00 2001 From: Luis Deschamps Rudge Date: Thu, 27 Jun 2019 11:20:57 -0300 Subject: [PATCH 2/3] pr feedback --- src/__tests__/field/username.test.js | 1 + src/field/index.js | 1 - support/index.html | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/__tests__/field/username.test.js b/src/__tests__/field/username.test.js index 71cb8f5a1..0198faac2 100644 --- a/src/__tests__/field/username.test.js +++ b/src/__tests__/field/username.test.js @@ -26,6 +26,7 @@ describe('field/username', () => { describe('usernameLooksLikeEmail()', () => { it('checks for @ and .', () => { expect(username.usernameLooksLikeEmail('t@t.com')).toBe(true); + expect(username.usernameLooksLikeEmail('test.email@t.com')).toBe(true); expect(username.usernameLooksLikeEmail('tt.com')).toBe(false); expect(username.usernameLooksLikeEmail('t@tcom')).toBe(false); }); diff --git a/src/field/index.js b/src/field/index.js index 46a8d8fcf..2d9f1134a 100644 --- a/src/field/index.js +++ b/src/field/index.js @@ -9,7 +9,6 @@ const minMax = (value, min, max) => value.length >= min && value.length <= max; const getDefaultValidator = field => { switch (field) { case 'family_name': - return str => minMax(trim(str), 1, 150); case 'given_name': return str => minMax(trim(str), 1, 150); case 'name': diff --git a/support/index.html b/support/index.html index 7a6a5f3e6..62d32c229 100644 --- a/support/index.html +++ b/support/index.html @@ -126,7 +126,7 @@

usernameStyle: 'email', defaultDatabaseConnection: 'acme', prefill: { - email: 'luis@luisrudge.net' + email: 'johnfoo@gmail.com' }, passwordlessMethod: 'code', auth: { From eba5984a1aa2520424c060157d5ab8ee05ac3254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Rudge?= Date: Wed, 10 Jul 2019 13:11:46 -0300 Subject: [PATCH 3/3] rollback username validation --- src/field/username.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field/username.js b/src/field/username.js index 9beee9c52..589643dc9 100644 --- a/src/field/username.js +++ b/src/field/username.js @@ -3,7 +3,7 @@ import { validateEmail } from './email'; import { databaseConnection } from '../connection/database'; import trim from 'trim'; -const DEFAULT_CONNECTION_VALIDATION = { username: { min: 1, max: 128 } }; +const DEFAULT_CONNECTION_VALIDATION = { username: { min: 1, max: 15 } }; const regExp = /^[a-zA-Z0-9_+\-.!#\$\^`~@']*$/; function validateUsername(str, validateFormat, settings = DEFAULT_CONNECTION_VALIDATION.username) {