This is an automated email from the ASF dual-hosted git repository. machristie pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git
commit e93b56ec495e38b041bb61eedd5e4f16745b692a Author: Marcus Christie <machr...@iu.edu> AuthorDate: Wed Oct 24 11:20:17 2018 -0400 AIRAVATA-2888 Username, password validation --- django_airavata/apps/auth/forms.py | 28 ++++++++++++++++++---- .../django_airavata_auth/create_account.html | 12 +++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/django_airavata/apps/auth/forms.py b/django_airavata/apps/auth/forms.py index 007d05f..1077e58 100644 --- a/django_airavata/apps/auth/forms.py +++ b/django_airavata/apps/auth/forms.py @@ -1,18 +1,36 @@ from django import forms +from django.core import validators from . import iam_admin_client +USERNAME_VALIDATOR = validators.RegexValidator( + regex=r"^[a-z0-9_-]+$", + message="Username can only contain lowercase letters, numbers, " + "underscores and hyphens." +) +PASSWORD_VALIDATOR = validators.RegexValidator( + regex=r"^.*(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@!$#*&]).*$", + message="Password needs to contain at least (a) One lower case letter (b) " + "One Upper case letter and (c) One number (d) One of the following" + " special characters - !@#$&*" +) + class CreateAccountForm(forms.Form): error_css_class = "is-invalid" username = forms.CharField( label='Username', widget=forms.TextInput(attrs={'class': 'form-control', - 'placeholder': 'Username'})) + 'placeholder': 'Username'}), + min_length=6, + validators=[USERNAME_VALIDATOR]) password = forms.CharField( label='Password', widget=forms.PasswordInput(attrs={'class': 'form-control', - 'placeholder': 'Password'})) + 'placeholder': 'Password'}), + min_length=8, + max_length=48, + validators=[PASSWORD_VALIDATOR]) password_again = forms.CharField( label='Password (again)', widget=forms.PasswordInput(attrs={'class': 'form-control', @@ -41,7 +59,7 @@ class CreateAccountForm(forms.Form): password = cleaned_data.get('password') password_again = cleaned_data.get('password_again') - if password != password_again: + if password and password_again and password != password_again: self.add_error( 'password', forms.ValidationError("Passwords do not match")) @@ -51,7 +69,7 @@ class CreateAccountForm(forms.Form): email = cleaned_data.get('email') email_again = cleaned_data.get('email_again') - if email != email_again: + if email and email_again and email != email_again: self.add_error( 'email', forms.ValidationError("E-mail addresses do not match") @@ -62,7 +80,7 @@ class CreateAccountForm(forms.Form): ) username = cleaned_data.get('username') - if not iam_admin_client.is_username_available(username): + if username and not iam_admin_client.is_username_available(username): self.add_error( 'username', forms.ValidationError("That username is not available") diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html b/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html index bd8a9e7..29ff91b 100644 --- a/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html +++ b/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html @@ -48,9 +48,15 @@ {% if field.value %} value="{{ field.value }}" {% endif %} {% if field.field.required %} required {% endif %} /> <div class="invalid-feedback"> - {% for error in field.errors %} - {{ error | escape }} - {% endfor %} + {% if field.errors|length == 1 %} + {{ field.errors|first| escape }} + {% else %} + <ul> + {% for error in field.errors %} + <li>{{ error | escape }}</li> + {% endfor %} + </ul> + {% endif %} </div> </div> {% endfor %}