From 7c81a7a6f65f8a24bf4a2be5174b46fdcb47f426 Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Tue, 25 Aug 2026 13:29:12 +0200 Subject: [PATCH] imlementation of a user management --- Website/main.py | 66 ++++++++++ Website/modules/emailservice/email.py | 33 +++++ Website/templates/base.html | 8 +- Website/templates/user_profile.html | 176 ++++++++++++++++++++++++++ Website/user.py | 22 ++++ 5 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 Website/templates/user_profile.html diff --git a/Website/main.py b/Website/main.py index 4a81871..817e6a3 100644 --- a/Website/main.py +++ b/Website/main.py @@ -2064,6 +2064,72 @@ def change_email_and_resend(): return redirect(url_for("verify_account", username=username)) +@app.route('/user/profile', methods=['GET', 'POST']) +def user_profile(): + if 'username' not in session: + flash("Bitte melden Sie sich an, um auf Ihr Profil zuzugreifen.", "warning") + return redirect(url_for('login')) + + username = session['username'] + + user = user_store.get_user(username) + if not user: + flash("Benutzer nicht gefunden. Bitte loggen Sie sich erneut ein.", "danger") + session.clear() + return redirect(url_for('login')) + + if request.method == 'POST': + action = request.form.get('action') + + if action == 'update_info': + email = request.form.get('email') + full_name = request.form.get('full_name') + + user_store.update_user_profile(username, full_name, email) + + session['email'] = email + session['full_name'] = full_name + + flash("Ihre Profilinformationen wurden erfolgreich aktualisiert.", "success") + return redirect(url_for('user_profile')) + + elif action == 'change_password': + current_password = request.form.get('current_password') + new_password = request.form.get('new_password') + confirm_password = request.form.get('confirm_password') + + if not user_store.check_nm_pwd(username, current_password): + flash("Das aktuelle Passwort ist nicht korrekt.", "danger") + return redirect(url_for('user_profile')) + + if new_password != confirm_password: + flash("Die neuen Passwörter stimmen nicht überein.", "danger") + return redirect(url_for('user_profile')) + + if user_store.update_password(username, new_password): + flash("Ihr Passwort wurde erfolgreich geändert.", "success") + else: + flash("Das Passwort ist zu schwach. Bitte verwenden Sie mindestens 6 Zeichen.", "warning") + + return redirect(url_for('user_profile')) + + elif action == 'delete_account': + current_password = request.form.get('current_password') + + if not user_store.check_nm_pwd(username, current_password): + flash("Das Passwort ist nicht korrekt. Konto konnte nicht gelöscht werden.", "danger") + return redirect(url_for('user_profile')) + + if user_store.delete_user(username): + session.clear() + flash("Ihr Konto wurde erfolgreich gelöscht.", "info") + return redirect(url_for('default')) + else: + flash("Fehler beim Löschen des Kontos. Bitte versuchen Sie es später erneut.", "danger") + return redirect(url_for('user_profile')) + + return render_template('user_profile.html', user=user) + @app.route('/download-sample') def download_sample(): # Ensure the file is only served from the specific directory diff --git a/Website/modules/emailservice/email.py b/Website/modules/emailservice/email.py index f9f086f..4526678 100644 --- a/Website/modules/emailservice/email.py +++ b/Website/modules/emailservice/email.py @@ -133,4 +133,37 @@ def send_register_token(email: str, token: str) -> bool: """ + return send(email, subject, text_body=text_note, html_body=html_note) + +def send_password_reset_token(email: str, token: str) -> bool: + """Sends a professionally styled password reset token to the user.""" + + subject = "Aktion erforderlich: Ihr Passwort-Zurücksetzungs-Code für Invario" + + text_note = ( + "Sie haben eine Anfrage zum Zurücksetzen Ihres Passworts gestellt.\n\n" + "Um Ihr Passwort zurückzusetzen, geben Sie bitte den folgenden Sicherheitscode ein:\n\n" + f"Code: {token}\n\n" + "Dieser Code ist aus Sicherheitsgründen nur für begrenzte Zeit gültig. " + "Falls Sie diese Anfrage nicht gestellt haben, können Sie diese E-Mail einfach ignorieren." + ) + + html_note = f""" +
+

Passwort zurücksetzen

+

+ Sie haben eine Anfrage zum Zurücksetzen Ihres Passworts gestellt. Um fortzufahren, verwenden Sie bitte den folgenden Bestätigungscode: +

+ +
+ {token} +
+ +

+ Dieser Code ist aus Sicherheitsgründen nur für eine begrenzte Zeit gültig.
+ Falls Sie kein Zurücksetzen des Passworts angefordert haben, können Sie diese E-Mail sicher ignorieren. +

+
+ """ + return send(email, subject, text_body=text_note, html_body=html_note) \ No newline at end of file diff --git a/Website/templates/base.html b/Website/templates/base.html index 4d0a2c7..af2e7bc 100644 --- a/Website/templates/base.html +++ b/Website/templates/base.html @@ -512,13 +512,17 @@ Module Preise Kontakt + {% if session.get('is_admin') %} + + Userverwaltung Rechnungsverwaltung Blog verwalten Admin-Chat Support-Center System-Tools {% elif 'username' in session %} + Mein Profil Tutorials Meine Rechnungen Meine Instanz @@ -536,7 +540,7 @@