]> git.lizzy.rs Git - cheatdb.git/commitdiff
Fix password issues caused by Flask-User migration
authorrubenwardy <rw@rubenwardy.com>
Sun, 19 Jan 2020 19:48:41 +0000 (19:48 +0000)
committerrubenwardy <rw@rubenwardy.com>
Sun, 19 Jan 2020 19:48:41 +0000 (19:48 +0000)
app/blueprints/users/githublogin.py
app/blueprints/users/profile.py
app/models.py
app/templates/flask_user/login.html
app/templates/flask_user/public_base.html [deleted file]
app/templates/flask_user_layout.html [new file with mode: 0644]
migrations/versions/a0f6c8743362_.py [new file with mode: 0644]
utils/run_migrations.sh

index 56c44128f69b655cc49456d87d166b785eaa3fea..a029361dfc22f892a8fdcce8607a2679e3742131 100644 (file)
@@ -65,7 +65,7 @@ def github_authorized(oauth_token):
                        flash("Unable to find an account for that Github user", "error")
                        return redirect(url_for("users.claim"))
                elif loginUser(userByGithub):
-                       if current_user.password is None:
+                       if not current_user.hasPassword():
                                return redirect(next_url or url_for("users.set_password", optional=True))
                        else:
                                return redirect(next_url or url_for("homepage.home"))
index 8e6bfe945f69bf97d00ac35b5546026016058309..37ea992178b08d46118d7b55acc76a75135204f9 100644 (file)
@@ -170,7 +170,7 @@ class SetPasswordForm(FlaskForm):
 @bp.route("/user/set-password/", methods=["GET", "POST"])
 @login_required
 def set_password():
-       if current_user.password is not None:
+       if current_user.hasPassword():
                return redirect(url_for("user.change_password"))
 
        form = SetPasswordForm(request.form)
@@ -185,10 +185,11 @@ def set_password():
                        hashed_password = user_manager.hash_password(form.password.data)
 
                        # Change password
-                       user_manager.update_password(current_user, hashed_password)
+                       current_user.password = hashed_password
+                       db.session.commit()
 
                        # Send 'password_changed' email
-                       if user_manager.enable_email and user_manager.send_password_changed_email and current_user.email:
+                       if user_manager.USER_ENABLE_EMAIL and current_user.email:
                                emails.send_password_changed_email(current_user)
 
                        # Send password_changed signal
@@ -211,7 +212,7 @@ def set_password():
                                task = sendVerifyEmail.delay(newEmail, token)
                                return redirect(url_for("tasks.check", id=task.id, r=url_for("users.profile", username=current_user.username)))
                        else:
-                               return redirect(url_for("users.profile", username=current_user.username))
+                               return redirect(url_for("user.login"))
                else:
                        flash("Passwords do not match", "error")
 
index 1ff2904d2d83df5c92c57a813d0ce043914cf832..69eca7c22de5c3e8c439942df6135ee808de3272 100644 (file)
@@ -146,7 +146,7 @@ class User(db.Model, UserMixin):
        tokens        = db.relationship("APIToken", backref="owner", lazy="dynamic")
        replies       = db.relationship("ThreadReply", backref="author", lazy="dynamic")
 
-       def __init__(self, username, active=False, email=None, password=None):
+       def __init__(self, username, active=False, email=None, password=""):
                self.username = username
                self.email_confirmed_at = datetime.datetime.now() - datetime.timedelta(days=6000)
                self.display_name = username
@@ -155,6 +155,9 @@ class User(db.Model, UserMixin):
                self.password = password
                self.rank = UserRank.NOT_JOINED
 
+       def hasPassword(self):
+               return self.password != ""
+
        def canAccessTodoList(self):
                return Permission.APPROVE_NEW.check(self) or \
                                Permission.APPROVE_RELEASE.check(self) or \
@@ -203,6 +206,13 @@ class User(db.Model, UserMixin):
                return Thread.query.filter_by(author=self) \
                        .filter(Thread.created_at > hour_ago).count() < 2
 
+       def __eq__(self, other):
+               if not self.is_authenticated or not other.is_authenticated:
+                       return False
+
+               assert self.id > 0
+               return self.id == other.id
+
 class UserEmailVerification(db.Model):
        id      = db.Column(db.Integer, primary_key=True)
        user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
index a13438844f7035531a3b83786fe21b2e24076422..3e93d38785ea479cc9be94adc8851bf054beff6b 100644 (file)
@@ -15,7 +15,7 @@ Sign in
                                {{ form.hidden_tag() }}
 
                                {# Username or Email field #}
-                               {% set field = form.username if user_manager.USER_ENABLE_REGISTER else form.email %}
+                               {% set field = form.username if user_manager.USER_ENABLE_USERNAME else form.email %}
                                <div class="form-group {% if field.errors %}has-error{% endif %}">
                                        {# Label on left, "New here? Register." on right #}
                                        <label for="{{ field.id }}" class="control-label">{{ field.label.text }}</label>
diff --git a/app/templates/flask_user/public_base.html b/app/templates/flask_user/public_base.html
deleted file mode 100644 (file)
index 272e1ec..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block container %}
-       <main class="container mt-4">
-               <div class="card">
-                       <!-- <h2 class="card-header">{{ self.title() }}</h2> -->
-                       <div class="card-body">
-                               {% block content %}
-                               {% endblock %}
-                       </div>
-               </div>
-       </main>
-{% endblock %}
diff --git a/app/templates/flask_user_layout.html b/app/templates/flask_user_layout.html
new file mode 100644 (file)
index 0000000..272e1ec
--- /dev/null
@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+
+{% block container %}
+       <main class="container mt-4">
+               <div class="card">
+                       <!-- <h2 class="card-header">{{ self.title() }}</h2> -->
+                       <div class="card-body">
+                               {% block content %}
+                               {% endblock %}
+                       </div>
+               </div>
+       </main>
+{% endblock %}
diff --git a/migrations/versions/a0f6c8743362_.py b/migrations/versions/a0f6c8743362_.py
new file mode 100644 (file)
index 0000000..2d23538
--- /dev/null
@@ -0,0 +1,31 @@
+"""empty message
+
+Revision ID: a0f6c8743362
+Revises: 64fee8e5ab34
+Create Date: 2020-01-19 19:12:39.402679
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import postgresql
+
+# revision identifiers, used by Alembic.
+revision = 'a0f6c8743362'
+down_revision = '64fee8e5ab34'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+       op.alter_column('user', 'password',
+                               existing_type=sa.VARCHAR(length=255),
+                               nullable=False,
+                               existing_server_default=sa.text("''::character varying"),
+                               server_default='')
+
+
+def downgrade():
+       op.alter_column('user', 'password',
+                               existing_type=sa.VARCHAR(length=255),
+                               nullable=True,
+                               existing_server_default=sa.text("''::character varying"))
index 64774af980c4637a97b7ec8518368a58015a8216..6618919f9c6e2f50f17234c0ee077f75aada38b4 100755 (executable)
@@ -2,4 +2,5 @@
 
 # Run all pending migrations
 
+./utils/reload.sh
 docker exec contentdb_app_1 sh -c "FLASK_CONFIG=../config.cfg FLASK_APP=app/__init__.py flask db upgrade"