OK, I will include this in web2py but probably merge it with CRYPT. Any reason not to?
Massimo On Jun 15, 7:31 pm, "mr.freeze" <[email protected]> wrote: > I know you said not to make one but it felt wrong mixing with CRYPT. > I settled on IS_COMPLEX. With it you can do: > db.mytable.myfield.requires = [IS_COMPLEX(min=10, max=20, upper=2, > lower=2, number=1, special=2, specials="!...@#$%^"), CRYPT()] > > It will automatically generate the error message(s) based on the reason > (s) it failed > Use 0 to disallow upper, lower, number or special characters > Use 1 or greater for the minimum upper, lower, number or special > characters > Use None to bypass checking of upper, lower, number or special > characters. > > Let me know if you're interested in a patch. Otherwise, I'll just > post it here in case it helps someone. > > class IS_COMPLEX(object): > """ > example: > > INPUT(_type='password',_name='passwd',requires=IS_COMPLEX(min=10, > special=2, upper=2)) > > enforces complexity requirements on a field > """ > > def __init__(self, min=8, max=20, upper=1, lower=1, number=1, > special=1, specials=r'~...@#$%^&*()_+-=?<>,.:;{}[]|', > error_message='Does not meet complexity > requirements', generate_errors=True): > self.min = min > self.max = max > self.upper = upper > self.lower = lower > self.number = number > self.special = special > self.specials = specials > self.error_message = error_message > self.generate_errors = generate_errors > > def __call__(self, value): > failures = [] > if type(self.min) == int and self.min > 0: > if not len(value) >= self.min: > failures.append("Minimum length is " + str(self.min)) > if type(self.max) == int and self.max > 0: > if not len(value) <= self.max: > failures.append("Maximum length is " + str(self.max)) > if type(self.special) == int: > all_special = [ch in value for ch in self.specials] > if self.special > 0: > if not all_special.count(True) >= self.special: > failures.append("Must include " + str > (self.special) + " of the following : " + self.specials) > else: > if all_special.count(True) > 0: > failures.append("Cannot include any of the > following : " + self.specials) > if type(self.upper) == int: > all_upper = re.findall("[A-Z]", value) > if self.upper > 0: > if not len(all_upper) >= self.upper: > failures.append("Must include " + str(self.upper) > + " upper case") > else: > if len(all_upper) > 0: > failures.append("Cannot include upper case > letters") > if type(self.lower) == int: > all_lower = re.findall("[a-z]", value) > if self.lower > 0: > if not len(all_lower) >= self.lower: > failures.append("Must include " + str(self.lower) > + " lower case") > else: > if len(all_lower) > 0: > failures.append("Cannot include lower case > letters") > if type(self.number) == int: > all_number = re.findall("[0-9]", value) > if self.number > 0: > if not len(all_number) >= self.number: > failures.append("Must include " + str(self.number) > + " numbers") > else: > if len(all_number) > 0: > failures.append("Cannot include any > numbers") > if len(failures) == 0: > return (value, None) > if self.generate_errors: > from gluon.html import XML > return (value, XML('<br/>'.join(failures))) > else: > return (value, self.error_message) > > On Jun 11, 8:00 pm, mdipierro <[email protected]> wrote: > > > do not make one. add the feature to crypt. client side there are > > jquery libraries that do what you need. > > > On Jun 11, 6:29 pm, "mr.freeze" <[email protected]> wrote: > > > > Does anyone already have a validator built that has options for > > > enforcing various password complexity requirements? Just wondering > > > before I make one.- Hide quoted text - > > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---

