From 85847b5d39f1ca7158f320891f1d707a240be2f6 Mon Sep 17 00:00:00 2001 From: Jens Luedicke Date: Tue, 1 Jul 2025 23:45:03 +0200 Subject: [PATCH] Add setting to disable user email verification. --- app.py | 46 +++++++++++++++++++++++++++++------ migrate_db.py | 13 ++++++++++ templates/admin_settings.html | 12 ++++++++- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/app.py b/app.py index 0d86876..9c03ecc 100644 --- a/app.py +++ b/app.py @@ -235,6 +235,16 @@ def init_system_settings(): ) db.session.add(reg_setting) db.session.commit() + + if not SystemSettings.query.filter_by(key='email_verification_required').first(): + print("Adding email_verification_required system setting...") + email_setting = SystemSettings( + key='email_verification_required', + value='true', + description='Controls whether email verification is required for new user accounts' + ) + db.session.add(email_setting) + db.session.commit() def migrate_data(): """Handle data migrations and setup""" @@ -350,6 +360,11 @@ def admin_required(f): return f(*args, **kwargs) return decorated_function +def get_system_setting(key, default='false'): + """Helper function to get system setting value""" + setting = SystemSettings.query.filter_by(key=key).first() + return setting.value if setting else default + # Add this decorator function after your existing decorators def role_required(min_role): """ @@ -492,8 +507,7 @@ def logout(): @app.route('/register', methods=['GET', 'POST']) def register(): # Check if registration is enabled - reg_setting = SystemSettings.query.filter_by(key='registration_enabled').first() - registration_enabled = reg_setting and reg_setting.value == 'true' + registration_enabled = get_system_setting('registration_enabled', 'true') == 'true' if not registration_enabled: flash('Registration is currently disabled by the administrator.', 'error') @@ -524,6 +538,9 @@ def register(): try: # Check if this is the first user account is_first_user = User.query.count() == 0 + + # Check if email verification is required + email_verification_required = get_system_setting('email_verification_required', 'true') == 'true' new_user = User(username=username, email=email, is_verified=False) new_user.set_password(password) @@ -533,8 +550,11 @@ def register(): new_user.is_admin = True new_user.role = Role.ADMIN new_user.is_verified = True # Auto-verify first user + elif not email_verification_required: + # If email verification is disabled, auto-verify new users + new_user.is_verified = True - # Generate verification token + # Generate verification token (even if not needed, for consistency) token = new_user.generate_verification_token() db.session.add(new_user) @@ -544,8 +564,12 @@ def register(): # First user gets admin privileges and is auto-verified logger.info(f"First user account created: {username} with admin privileges") flash('Welcome! You are the first user and have been granted administrator privileges. You can now log in.', 'success') + elif not email_verification_required: + # Email verification is disabled, user can log in immediately + logger.info(f"User account created with auto-verification: {username}") + flash('Registration successful! You can now log in.', 'success') else: - # Send verification email for regular users + # Send verification email for regular users when verification is required verification_url = url_for('verify_email', token=token, _external=True) msg = Message('Verify your TimeTrack account', recipients=[email]) msg.body = f'''Hello {username}, @@ -1333,18 +1357,26 @@ def admin_settings(): if request.method == 'POST': # Update registration setting registration_enabled = 'registration_enabled' in request.form - reg_setting = SystemSettings.query.filter_by(key='registration_enabled').first() if reg_setting: reg_setting.value = 'true' if registration_enabled else 'false' - db.session.commit() - flash('System settings updated successfully!', 'success') + + # Update email verification setting + email_verification_required = 'email_verification_required' in request.form + email_setting = SystemSettings.query.filter_by(key='email_verification_required').first() + if email_setting: + email_setting.value = 'true' if email_verification_required else 'false' + + db.session.commit() + flash('System settings updated successfully!', 'success') # Get current settings settings = {} for setting in SystemSettings.query.all(): if setting.key == 'registration_enabled': settings['registration_enabled'] = setting.value == 'true' + elif setting.key == 'email_verification_required': + settings['email_verification_required'] = setting.value == 'true' return render_template('admin_settings.html', title='System Settings', settings=settings) diff --git a/migrate_db.py b/migrate_db.py index af61e0b..df24de8 100644 --- a/migrate_db.py +++ b/migrate_db.py @@ -316,6 +316,19 @@ def init_system_settings(): db.session.add(reg_setting) db.session.commit() print("Registration setting initialized to enabled") + + # Check if email_verification_required setting exists + email_verification_setting = SystemSettings.query.filter_by(key='email_verification_required').first() + if not email_verification_setting: + print("Adding email_verification_required system setting...") + email_verification_setting = SystemSettings( + key='email_verification_required', + value='true', # Default to enabled for security + description='Controls whether email verification is required for new user accounts' + ) + db.session.add(email_verification_setting) + db.session.commit() + print("Email verification setting initialized to enabled") if __name__ == "__main__": migrate_database() diff --git a/templates/admin_settings.html b/templates/admin_settings.html index c076d38..68805c7 100644 --- a/templates/admin_settings.html +++ b/templates/admin_settings.html @@ -20,7 +20,17 @@

- +
+ +

+ When enabled, new users must verify their email address before accessing the application. When disabled, new users can log in immediately after registration. +

+