batman
This commit is contained in:
commit
66f9ce3614
33 changed files with 2271 additions and 0 deletions
95
app/auth/forms.py
Normal file
95
app/auth/forms.py
Normal file
|
@ -0,0 +1,95 @@
|
|||
"""
|
||||
Forms for authentication and user management.
|
||||
"""
|
||||
from flask_wtf import FlaskForm
|
||||
from wtforms import StringField, PasswordField, BooleanField, SubmitField
|
||||
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
|
||||
|
||||
from app.models.user import User
|
||||
|
||||
|
||||
class LoginForm(FlaskForm):
|
||||
"""Form for user login."""
|
||||
username = StringField("Username", validators=[DataRequired()])
|
||||
password = PasswordField("Password", validators=[DataRequired()])
|
||||
remember_me = BooleanField("Remember Me")
|
||||
submit = SubmitField("Sign In")
|
||||
|
||||
|
||||
class RegistrationForm(FlaskForm):
|
||||
"""Form for user registration."""
|
||||
username = StringField("Username", validators=[
|
||||
DataRequired(),
|
||||
Length(min=3, max=64)
|
||||
])
|
||||
email = StringField("Email", validators=[
|
||||
DataRequired(),
|
||||
Email(),
|
||||
Length(max=120)
|
||||
])
|
||||
password = PasswordField("Password", validators=[
|
||||
DataRequired(),
|
||||
Length(min=8, message="Password must be at least 8 characters long")
|
||||
])
|
||||
password2 = PasswordField("Confirm Password", validators=[
|
||||
DataRequired(),
|
||||
EqualTo("password", message="Passwords must match")
|
||||
])
|
||||
submit = SubmitField("Register")
|
||||
|
||||
def validate_username(self, username):
|
||||
"""Validate that the username is not already taken."""
|
||||
user = User.query.filter_by(username=username.data).first()
|
||||
if user is not None:
|
||||
raise ValidationError("Username already taken. Please choose a different one.")
|
||||
|
||||
def validate_email(self, email):
|
||||
"""Validate that the email is not already registered."""
|
||||
user = User.query.filter_by(email=email.data).first()
|
||||
if user is not None:
|
||||
raise ValidationError("Email already registered. Please use a different email or reset your password.")
|
||||
|
||||
def validate_password(self, password):
|
||||
"""Validate password complexity."""
|
||||
pwd = password.data
|
||||
|
||||
# Check for minimum complexity
|
||||
has_upper = any(c.isupper() for c in pwd)
|
||||
has_lower = any(c.islower() for c in pwd)
|
||||
has_digit = any(c.isdigit() for c in pwd)
|
||||
has_special = any(not c.isalnum() for c in pwd)
|
||||
|
||||
if not (has_upper and has_lower and has_digit):
|
||||
raise ValidationError("Password must contain uppercase, lowercase, and digit characters.")
|
||||
|
||||
|
||||
class ResetPasswordRequestForm(FlaskForm):
|
||||
"""Form to request a password reset."""
|
||||
email = StringField("Email", validators=[DataRequired(), Email()])
|
||||
submit = SubmitField("Request Password Reset")
|
||||
|
||||
|
||||
class ResetPasswordForm(FlaskForm):
|
||||
"""Form to reset password."""
|
||||
password = PasswordField("New Password", validators=[
|
||||
DataRequired(),
|
||||
Length(min=8, message="Password must be at least 8 characters long")
|
||||
])
|
||||
password2 = PasswordField("Confirm New Password", validators=[
|
||||
DataRequired(),
|
||||
EqualTo("password", message="Passwords must match")
|
||||
])
|
||||
submit = SubmitField("Reset Password")
|
||||
|
||||
def validate_password(self, password):
|
||||
"""Validate password complexity."""
|
||||
pwd = password.data
|
||||
|
||||
# Check for minimum complexity
|
||||
has_upper = any(c.isupper() for c in pwd)
|
||||
has_lower = any(c.islower() for c in pwd)
|
||||
has_digit = any(c.isdigit() for c in pwd)
|
||||
has_special = any(not c.isalnum() for c in pwd)
|
||||
|
||||
if not (has_upper and has_lower and has_digit):
|
||||
raise ValidationError("Password must contain uppercase, lowercase, and digit characters.")
|
Loading…
Add table
Add a link
Reference in a new issue