From 22b2bc0a0f71e748acd9dcb13ad010dc16178c06 Mon Sep 17 00:00:00 2001
From: a2-imeri <alfret2.imeri@live.uwe.ac.uk>
Date: Mon, 24 Apr 2023 08:15:04 +0100
Subject: [PATCH] Remove security questions

---
 seed_database.py                              |  1 -
 store/forms.py                                |  6 --
 store/models.py                               | 15 -----
 store/routes.py                               | 62 ++++---------------
 store/templates/userContent/ChangeEmail.html  |  4 --
 .../templates/userContent/ChangePhNumber.html |  3 -
 .../templates/userContent/ChangeUsername.html |  2 -
 store/templates/userContent/login.html        |  4 +-
 store/templates/userContent/register.html     |  3 -
 9 files changed, 13 insertions(+), 87 deletions(-)

diff --git a/seed_database.py b/seed_database.py
index 6ed51f0..00d1058 100644
--- a/seed_database.py
+++ b/seed_database.py
@@ -71,7 +71,6 @@ with app.app_context():
         password="password",
         email="admin@website.com",
         phone_number="8383838",
-        securityQ1="rainbow",
     )
     user.userType = "admin"  # Because of how flasks works, once a row is created it can be further altered via its objects and changes saved on db.session.commit().
 
diff --git a/store/forms.py b/store/forms.py
index 7f088a7..25f9841 100644
--- a/store/forms.py
+++ b/store/forms.py
@@ -14,9 +14,6 @@ from wtforms.validators import DataRequired  # Basic example.#
 class RegistrationForm(FlaskForm):
     username = StringField("Username", [validators.Length(min=4, max=255)])
     email = StringField("Email Address", [validators.Length(min=6, max=255)])
-    securityQ1 = StringField(
-        "Enter your Favourite Colour", [validators.Length(min=3, max=35)]
-    )
     phone_number = StringField("Phone Number", [validators.Length(min=6, max=35)])
     password = PasswordField(
         "New Password",
@@ -36,9 +33,6 @@ class RegistrationForm(FlaskForm):
 class LoginForm(FlaskForm):
     username = StringField("Username", [validators.Length(min=4, max=255)])
     password = PasswordField("Password", [validators.Length(min=6, max=220)])
-    securityQ1 = StringField(
-        "Enter your Favourite Colour", [validators.Length(min=3, max=35)]
-    )
     submit = SubmitField("Login", render_kw={"class": "button"})
 
 
diff --git a/store/models.py b/store/models.py
index 076efd6..a5d31d2 100644
--- a/store/models.py
+++ b/store/models.py
@@ -88,7 +88,6 @@ class User(db.Model, UserMixin):
     email = db.Column(db.String(256), nullable=False)
     phone_number = db.Column(db.String(20), nullable=False)
     password_hash = db.Column(db.String(256), nullable=False)
-    securityQ1 = db.Column(db.String(30), nullable=False)
     userType = db.Column(db.String(20), default="standard")
 
     @classmethod
@@ -98,7 +97,6 @@ class User(db.Model, UserMixin):
         password: str,
         email: str,
         phone_number: str,
-        securityQ1: str,
     ):
         password_hash = generate_password_hash(password)
         user = cls(
@@ -106,7 +104,6 @@ class User(db.Model, UserMixin):
             password_hash=password_hash,
             email=email,
             phone_number=phone_number,
-            securityQ1=securityQ1,
         )
         db.session.add(user)
         db.session.commit()
@@ -119,12 +116,6 @@ class User(db.Model, UserMixin):
         user.password_hash = password_hash
         db.session.commit()
 
-    @classmethod
-    def update_security_q1(cls, user_id: int, securityQ1: str):
-        user = cls.query.get(user_id)
-        user.securityQ1 = securityQ1
-        db.session.commit()
-
     @classmethod
     def update_username(cls, user_id: int, username: str):
         user = cls.query.get(user_id)
@@ -156,12 +147,6 @@ class User(db.Model, UserMixin):
     def check_password(self, password: str) -> bool:
         return check_password_hash(self.password_hash, password)
 
-    def securityverification(self, securityQ1: str) -> bool:
-        if self.securityQ1 == securityQ1:
-            return True
-        else:
-            return False
-
     def checkIfUserExist(self, username: str) -> bool:
         if self.username == username:
             return True
diff --git a/store/routes.py b/store/routes.py
index c281541..f78897f 100644
--- a/store/routes.py
+++ b/store/routes.py
@@ -132,7 +132,6 @@ def register():
                 form.password.data,
                 form.email.data,
                 form.phone_number.data,
-                form.securityQ1.data,
             )
 
         return redirect(url_for("index"))
@@ -145,15 +144,14 @@ def login():
     if form.validate_on_submit():
         username = form.username.data
         password = form.password.data
-        securityQ1 = form.securityQ1.data
         user = User.query.filter_by(username=username).first()
+        print("hi")
         if user and user.check_password(password):
-            if user.securityverification(securityQ1) == True:
-                login_user(user)
-                print(current_user.userType)
-                return redirect(url_for("index"))
-            else:
-                flash("Invalid security answer")
+            print("success")
+            login_user(user)
+            print(current_user.userType)
+            return redirect(url_for("index"))
+
         else:
             flash("Login unsuccessful. Please check username and password.")
     return render_template("userContent/login.html", form=form)
@@ -274,24 +272,6 @@ def verify_code_security1():
     return render_template("userContent/verify_code_security1.html")
 
 
-@app.route("/verify_code_security1_confirm", methods=["GET", "POST"])
-def verify_code_security1_confirm():
-    if "user_id" not in session:
-        return redirect(url_for("reset_security1"))
-    user_id = session["user_id"]
-    if request.method == "POST":
-        securityQ1 = request.form["securityQ1"]
-        confirm_securityQ1 = request.form["confirm_securityQ1"]
-        if securityQ1 == confirm_securityQ1:
-            User.update_security_q1(user_id, securityQ1)
-            session.pop("user_id", None)
-            flash("Your security question has been successfully reset")
-            return redirect(url_for("login"))
-        else:
-            flash("security question do not match")
-    return render_template("userContent/verify_code_security1_confirm.html")
-
-
 @app.route("/account")
 @login_required
 def account():
@@ -478,17 +458,11 @@ def ChangeUsername():
     if request.method == "POST":
         user_id = current_user.user_id
         password = request.form["password"]
-        securityQ1 = request.form["securityQ1"]
         NewUsername = request.form["NewUsername"]
         user = User.query.get(user_id)
         if user and user.check_password(password):
-            # if User.check_password(user_id, password):
-            if user.securityverification(securityQ1) == True:
-                User.update_username(user_id, NewUsername)
-                flash("username successfully changed.")
-
-            else:
-                flash("Invalid security answer")
+            User.update_username(user_id, NewUsername)
+            flash("username successfully changed.")
         else:
             flash("Wrong password.")
 
@@ -501,17 +475,11 @@ def ChangeEmail():
     if request.method == "POST":
         user_id = current_user.user_id
         password = request.form["password"]
-        securityQ1 = request.form["securityQ1"]
+
         NewEmail = request.form["NewEmail"]
         user = User.query.get(user_id)
         if user and user.check_password(password):
-            # if User.check_password(user_id, password):
-            if user.securityverification(securityQ1) == True:
-                User.update_email(user_id, NewEmail)
-                flash("email successfully changed.")
-
-            else:
-                flash("Invalid security answer")
+            User.update_email(user_id, NewEmail)
         else:
             flash("Wrong password.")
 
@@ -524,17 +492,11 @@ def ChangePhNumber():
     if request.method == "POST":
         user_id = current_user.user_id
         password = request.form["password"]
-        securityQ1 = request.form["securityQ1"]
         NewNumber = request.form["NewNumber"]
         user = User.query.get(user_id)
         if user and user.check_password(password):
-            # if User.check_password(user_id, password):
-            if user.securityverification(securityQ1) == True:
-                User.update_Number(user_id, NewNumber)
-                flash("New Number successfully changed.")
-
-            else:
-                flash("Invalid security answer")
+            User.update_Number(user_id, NewNumber)
+            flash("New Number successfully changed.")
         else:
             flash("Wrong password.")
 
diff --git a/store/templates/userContent/ChangeEmail.html b/store/templates/userContent/ChangeEmail.html
index 286607e..2a1e281 100644
--- a/store/templates/userContent/ChangeEmail.html
+++ b/store/templates/userContent/ChangeEmail.html
@@ -8,10 +8,6 @@
     <label for="password"><b>Password verification</b></label>
     <input type="password" placeholder="Enter Password" name="password" id="password" required>
 
-
-    <label for="securityQ1"><b>what is your favourite colour, for verification porpuses/b></label>
-    <input type="securityQ1" placeholder="Enter a colour" name="securityQ1" id="securityQ1" required>
-
     <label for="NewEmail"><b>New E-mail</b></label>
     <input type="NewEmail" placeholder="Enter new E-mail" name="NewEmail" id="NewEmail" required>
 
diff --git a/store/templates/userContent/ChangePhNumber.html b/store/templates/userContent/ChangePhNumber.html
index ed35cc6..76ec481 100644
--- a/store/templates/userContent/ChangePhNumber.html
+++ b/store/templates/userContent/ChangePhNumber.html
@@ -9,9 +9,6 @@
     <input type="password" placeholder="Enter Password" name="password" id="password" required>
 
 
-    <label for="securityQ1"><b>what is your favourite colour, for verification porpuses/b></label>
-    <input type="securityQ1" placeholder="Enter a colour" name="securityQ1" id="securityQ1" required>
-
     <label for="NewNumber"><b> Enter New Number</b></label>
     <input type="NewNumber" placeholder="Enter new Number" name="NewNumber" id="NewNumber" required>
 
diff --git a/store/templates/userContent/ChangeUsername.html b/store/templates/userContent/ChangeUsername.html
index d576cad..155155b 100644
--- a/store/templates/userContent/ChangeUsername.html
+++ b/store/templates/userContent/ChangeUsername.html
@@ -9,8 +9,6 @@
     <input type="password" placeholder="Enter Password" name="password" id="password" required>
 
 
-    <label for="securityQ1"><b>what is your favourite colour, for verification porpuses/b></label>
-    <input type="securityQ1" placeholder="Enter a colour" name="securityQ1" id="securityQ1" required>
 
     <label for="NewUsername"><b>New username</b></label>
     <input type="NewUsername" placeholder="Enter new Username" name="NewUsername" id="NewUsername" required>
diff --git a/store/templates/userContent/login.html b/store/templates/userContent/login.html
index e270964..a225e95 100644
--- a/store/templates/userContent/login.html
+++ b/store/templates/userContent/login.html
@@ -15,15 +15,13 @@
         </tr>
         <td>{{ render_field(form.password) }}</td>
         </tr>
-        <tr>
-          <td> {{ render_field(form.securityQ1) }}</td>
-        </tr>
       </table>
     </dl>
     <br>
     {{form.submit()}}
     <br>
   </form>
+  <td><a href="{{ url_for('reset_password')}}">I Forgot my Password!</a></td><br><br>
   <br>
 </div>
 {% endblock %}
\ No newline at end of file
diff --git a/store/templates/userContent/register.html b/store/templates/userContent/register.html
index ec31ae4..d6e4fd4 100644
--- a/store/templates/userContent/register.html
+++ b/store/templates/userContent/register.html
@@ -19,9 +19,6 @@
         <tr>
           <td>{{ render_field(form.phone_number) }}</td>
         </tr>
-        <tr>
-          <td> {{ render_field(form.securityQ1) }}</td>
-        </tr>
         <tr>
           <td>{{ render_field(form.password) }}</td>
         </tr>
-- 
GitLab