From 4aae6551808988f3e3e6cf2dcfda3aea41086a68 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Sat, 9 Jan 2021 01:00:27 +0000 Subject: [PATCH] live validation on form, change special character definition The internal array of special characters was lacking, so a character is now special when not a digit and (uppercase form) == (lowercase form). --- pwval.go | 10 ++-------- ts/form.ts | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/pwval.go b/pwval.go index 96dcbc3..85a9171 100644 --- a/pwval.go +++ b/pwval.go @@ -8,13 +8,11 @@ import ( type Validator struct { minLength, upper, lower, number, special int criteria ValidatorConf - specialChars []rune } type ValidatorConf map[string]int func (vd *Validator) init(criteria ValidatorConf) { - vd.specialChars = []rune{'[', '@', '_', '!', '#', '$', '%', '^', '&', '*', '(', ')', '<', '>', '?', '/', '\\', '|', '}', '{', '~', ':', ']'} vd.criteria = criteria } @@ -40,12 +38,8 @@ func (vd *Validator) validate(password string) map[string]bool { count["lowercase"] += 1 } else if unicode.IsNumber(c) { count["number"] += 1 - } else { - for _, s := range vd.specialChars { - if c == s { - count["special"] += 1 - } - } + } else if unicode.ToUpper(c) == unicode.ToLower(c) { + count["special"] += 1 } } results := map[string]bool{} diff --git a/ts/form.ts b/ts/form.ts index 7ea7706..f918ca8 100644 --- a/ts/form.ts +++ b/ts/form.ts @@ -117,7 +117,7 @@ form.onsubmit = create; class Requirement { private _name: string; - private _minCount: number; + protected _minCount: number; private _content: HTMLSpanElement; private _valid: HTMLSpanElement; private _li: HTMLLIElement; @@ -151,8 +151,13 @@ class Requirement { } this._content.textContent = text; } + + validate = (count: number) => { this.valid = (count >= this._minCount); } } +// Incredible code right here +const isInt = (s: string): boolean => { return (s in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]); } + const testStrings = (f: pwValString): boolean => { const testString = (s: string): boolean => { if (s == "" || !s.includes("{n}")) { return false; } @@ -161,6 +166,32 @@ const testStrings = (f: pwValString): boolean => { return testString(f.singular) && testString(f.plural); } +interface Validation { [name: string]: number } + +const validate = (s: string): Validation => { + let v: Validation = {}; + for (let criteria of ["length", "lowercase", "uppercase", "number", "special"]) { v[criteria] = 0; } + v["length"] = s.length; + for (let c of s) { + if (isInt(c)) { v["number"]++; } + else { + const upper = c.toUpperCase(); + if (upper == c.toLowerCase()) { v["special"]++; } + else { + if (upper == c) { v["uppercase"]++; } + else if (upper != c) { v["lowercase"]++; } + } + } + } + return v +} +passwordField.addEventListener("keyup", () => { + const v = validate(passwordField.value); + for (let criteria in requirements) { + requirements[criteria].validate(v[criteria]); + } +}); + var requirements: { [category: string]: Requirement} = {}; if (!window.validationStrings) {