Ejemplo n.º 1
0
class GetSetForm(forms.Form):
    firstname = forms.StringField("First name")
    lastname = forms.StringField("Last name")
    company = forms.StringField("Company")  # Test for NOT having get_/set_company
    password = forms.PasswordField("Password")
    confirm_password = forms.PasswordField("Confirm password")

    def get_firstname(self, obj):
        return obj.fullname.split(' ', 1)[0]

    def get_lastname(self, obj):
        parts = obj.fullname.split(' ', 1)
        if len(parts) > 1:
            return parts[-1]
        return ''

    def get_password(self, obj):
        return ''

    def get_confirm_password(self, obj):
        return ''

    def set_firstname(self, obj):
        pass

    def set_lastname(self, obj):
        obj.fullname = self.firstname.data + " " + self.lastname.data

    def set_password(self, obj):
        obj.password = self.password.data

    def set_confirm_password(self, obj):
        pass
Ejemplo n.º 2
0
class PasswordChangeForm(forms.Form):
    __returns__ = ('password_strength', )
    __expects__ = ('edit_user', )

    old_password = forms.PasswordField(
        __("Current password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=40)
        ],
    )
    password = forms.PasswordField(
        __("New password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            PasswordStrengthValidator(),
        ],
    )
    confirm_password = forms.PasswordField(
        __("Confirm password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            forms.validators.EqualTo('password'),
        ],
    )

    def validate_old_password(self, field):
        if self.edit_user is None:
            raise forms.ValidationError(_("Not logged in"))
        if not self.edit_user.password_is(field.data):
            raise forms.ValidationError(_("Incorrect password"))
Ejemplo n.º 3
0
class PasswordChangeForm(forms.Form):
    old_password = forms.PasswordField(__("Current password"), validators=[forms.validators.DataRequired()])
    password = forms.PasswordField(__("New password"), validators=[forms.validators.DataRequired()])
    confirm_password = forms.PasswordField(__("Confirm password"),
        validators=[forms.validators.DataRequired(), forms.validators.EqualTo('password')])

    def validate_old_password(self, field):
        if self.edit_user is None:
            raise forms.ValidationError(_("Not logged in"))
        if not self.edit_user.password_is(field.data):
            raise forms.ValidationError(_("Incorrect password"))
Ejemplo n.º 4
0
class RegisterForm(forms.Form):
    fullname = forms.StringField(__("Full name"),
                                 validators=[forms.validators.DataRequired()])
    email = forms.EmailField(__("Email address"),
                             validators=[
                                 forms.validators.DataRequired(),
                                 forms.validators.ValidEmail()
                             ],
                             widget_attrs={
                                 'autocorrect': 'none',
                                 'autocapitalize': 'none'
                             })
    username = forms.StringField(
        __("Username"),
        validators=[forms.validators.DataRequired()],
        description=__(
            "Single word that can contain letters, numbers and dashes"),
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        })
    password = forms.PasswordField(
        __("Password"), validators=[forms.validators.DataRequired()])
    confirm_password = forms.PasswordField(
        __("Confirm password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.EqualTo('password')
        ])
    recaptcha = wtf.RecaptchaField(
        __("Are you human?"),
        description=__(
            "Type both words into the text box to prove that you are a human and not a computer program"
        ))

    def validate_username(self, field):
        if field.data in current_app.config['RESERVED_USERNAMES']:
            raise forms.ValidationError, _("This name is reserved")
        if not valid_username(field.data):
            raise forms.ValidationError(
                _(u"Invalid characters in name. Names must be made of ‘a-z’, ‘0-9’ and ‘-’, without trailing dashes"
                  ))
        existing = User.get(username=field.data)
        if existing is not None:
            raise forms.ValidationError(_("This username is taken"))

    def validate_email(self, field):
        field.data = field.data.lower()  # Convert to lowercase
        existing = UserEmail.get(email=field.data)
        if existing is not None:
            raise forms.ValidationError(
                Markup(
                    _(u"This email address is already registered. Do you want to <a href=\"{loginurl}\">login</a> instead?"
                      ).format(loginurl=escape(url_for('.login')))))
Ejemplo n.º 5
0
class PasswordResetForm(forms.Form):
    username = forms.StringField(__("Username or Email"), validators=[forms.validators.DataRequired()],
        description=__("Please reconfirm your username or email address"),
        widget_attrs={'autocorrect': 'none', 'autocapitalize': 'none'})
    password = forms.PasswordField(__("New password"), validators=[forms.validators.DataRequired()])
    confirm_password = forms.PasswordField(__("Confirm password"),
        validators=[forms.validators.DataRequired(), forms.validators.EqualTo('password')])

    def validate_username(self, field):
        user = getuser(field.data)
        if user is None or user != self.edit_user:
            raise forms.ValidationError(
                _("This username or email does not match the user the reset code is for"))
Ejemplo n.º 6
0
class LoginForm(forms.Form):
    username = forms.StringField(
        __("Username or Email"),
        validators=[forms.validators.DataRequired()],
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )
    password = forms.PasswordField(
        __("Password"), validators=[forms.validators.DataRequired()])

    def validate_username(self, field):
        existing = getuser(field.data)
        if existing is None:
            raise forms.ValidationError(_("User does not exist"))

    def validate_password(self, field):
        if not self.username.data:
            # Can't validate password without a user
            return
        user = getuser(self.username.data)
        if user and not user.pw_hash:
            raise LoginPasswordResetException()
        if user is None or not user.password_is(field.data):
            if not self.username.errors:
                raise forms.ValidationError(_("Incorrect password"))
        self.user = user
Ejemplo n.º 7
0
class PasswordPolicyForm(forms.Form):
    password = forms.PasswordField(
        __("Password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=40)
        ],
    )
Ejemplo n.º 8
0
class PasswordCreateForm(forms.Form):
    __returns__ = ('password_strength', )
    __expects__ = ('edit_user', )

    password = forms.PasswordField(
        __("New password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            PasswordStrengthValidator(),
        ],
    )
    confirm_password = forms.PasswordField(
        __("Confirm password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            forms.validators.EqualTo('password'),
        ],
    )
Ejemplo n.º 9
0
class RegisterForm(forms.RecaptchaForm):
    __returns__ = ('password_strength', )  # Set by PasswordStrengthValidator

    fullname = forms.StringField(
        __("Full name"),
        description=__(
            "This account is for you as an individual. We’ll make one for your organization later"
        ),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=80)
        ],
    )
    email = forms.EmailField(
        __("Email address"),
        validators=[
            forms.validators.DataRequired(),
            EmailAddressAvailable(purpose='register'),
        ],
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )
    password = forms.PasswordField(
        __("Password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            PasswordStrengthValidator(user_input_fields=['fullname', 'email']),
        ],
    )
    confirm_password = forms.PasswordField(
        __("Confirm password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            forms.validators.EqualTo('password'),
        ],
    )
Ejemplo n.º 10
0
class LoginForm(forms.Form):
    __returns__ = ('user', 'weak_password')

    username = forms.StringField(
        __("Username or Email"),
        validators=[forms.validators.DataRequired()],
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )
    password = forms.PasswordField(
        __("Password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=40)
        ],
    )

    # These two validators depend on being called in sequence
    def validate_username(self, field):
        self.user = getuser(field.data)
        if self.user is None:
            raise forms.ValidationError(_("User does not exist"))

    def validate_password(self, field):
        if not self.user:
            # Can't validate password without a user
            return
        if not self.user.pw_hash:
            raise LoginPasswordResetException()
        if not self.user.password_is(field.data, upgrade_hash=True):
            if not self.username.errors:
                raise forms.ValidationError(_("Incorrect password"))

        # Test for weak password. This gives us two options:
        #
        # 1. Flag it but allow login to proceed. Let the view ask the user nicely.
        #    The user may ignore it or may comply and change their password.
        #
        # 2. Block the login and force the user to reset their password. Makes for
        #    stronger policy, with the risk the user will (a) abandon the login, or
        #    (b) not have a valid email address on file (for example, an expired
        #    employer-owned email address they can no longer access).
        #
        # We're using option 1 here, but can switch to option 2 by raising
        # LoginPasswordWeakException after the test. The calling code in views/login.py
        # supports both outcomes.

        # password_policy.test_password(<password>)['is_weak'] returns True/False
        self.weak_password = password_policy.test_password(
            field.data)['is_weak']
Ejemplo n.º 11
0
class PasswordForm(forms.Form):
    __expects__ = ('edit_user', )

    password = forms.PasswordField(
        __("Password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=40)
        ],
    )

    def validate_password(self, field):
        if not self.edit_user.password_is(field.data):
            raise forms.ValidationError(_("Incorrect password"))
Ejemplo n.º 12
0
class RegisterForm(forms.RecaptchaForm):
    fullname = forms.StringField(
        __("Full name"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(max=80)
        ],
    )
    email = forms.EmailField(
        __("Email address"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.ValidEmail()
        ],
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )
    password = forms.PasswordField(
        __("Password"), validators=[forms.validators.DataRequired()])
    confirm_password = forms.PasswordField(
        __("Confirm password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.EqualTo('password'),
        ],
    )

    def validate_email(self, field):
        field.data = field.data.lower()  # Convert to lowercase
        existing = UserEmail.get(email=field.data)
        if existing is not None:
            raise forms.ValidationError(
                Markup(
                    _("This email address is already registered. Do you want to <a href=\"{loginurl}\">login</a> instead?"
                      ).format(loginurl=escape(url_for('.login')))))
Ejemplo n.º 13
0
class PasswordResetForm(forms.RecaptchaForm):
    __returns__ = ('password_strength', )

    username = forms.StringField(
        __("Username or Email"),
        validators=[forms.validators.DataRequired()],
        description=__("Please reconfirm your username or email address"),
        widget_attrs={
            'autocorrect': 'none',
            'autocapitalize': 'none'
        },
    )

    password = forms.PasswordField(
        __("New password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            PasswordStrengthValidator(user_input_fields=['username']),
        ],
    )
    confirm_password = forms.PasswordField(
        __("Confirm password"),
        validators=[
            forms.validators.DataRequired(),
            forms.validators.Length(min=8, max=40),
            forms.validators.EqualTo('password'),
        ],
    )

    def validate_username(self, field):
        user = getuser(field.data)
        if user is None or user != self.edit_user:
            raise forms.ValidationError(
                _("This username or email does not match the user the reset code is "
                  "for"))