Updated Flask-Security-Too to the latest v4. Fixes #6225

This commit is contained in:
Aditya Toshniwal 2021-06-06 13:58:06 +05:30 committed by Akshay Joshi
parent 2aa2d79de2
commit 065a3aa2f5
6 changed files with 69 additions and 7 deletions

View File

@ -20,6 +20,7 @@ New features
Housekeeping Housekeeping
************ ************
| `Issue #6225 <https://redmine.postgresql.org/issues/6225>`_ - Updated Flask-Security-Too to the latest v4.
Bug fixes Bug fixes
********* *********

View File

@ -29,7 +29,7 @@ psycopg2==2.8.*
python-dateutil==2.* python-dateutil==2.*
SQLAlchemy==1.3.* SQLAlchemy==1.3.*
itsdangerous<=1.1.0 itsdangerous<=1.1.0
Flask-Security-Too==3.* Flask-Security-Too==4.*
bcrypt==3.* bcrypt==3.*
cryptography==3.* cryptography==3.*
sshtunnel==0.* sshtunnel==0.*

View File

@ -0,0 +1,57 @@
"""empty message
Revision ID: c465fee44968
Revises: d0bc9f32b2b9
Create Date: 2021-06-04 14:42:12.843116
"""
from pgadmin.model import db, User
import uuid
# revision identifiers, used by Alembic.
revision = 'c465fee44968'
down_revision = 'd0bc9f32b2b9'
branch_labels = None
depends_on = None
def upgrade():
db.engine.execute("ALTER TABLE user RENAME TO user_old")
db.engine.execute("""
CREATE TABLE user (
id INTEGER NOT NULL,
username VARCHAR(256) NOT NULL,
email VARCHAR(256),
password VARCHAR(256),
active BOOLEAN NOT NULL,
confirmed_at DATETIME,
masterpass_check VARCHAR(256),
auth_source VARCHAR(256) NOT NULL DEFAULT 'internal',
fs_uniquifier NOT NULL UNIQUE,
PRIMARY KEY (id),
UNIQUE (username, auth_source, fs_uniquifier),
CHECK (active IN (0, 1))
);
""")
user_old = db.engine.execute(
'select id, username, email, password, active, '
'confirmed_at, masterpass_check, auth_source '
'from user_old')
db.engine.execute(User.__table__.insert(), [
{
**row,
'fs_uniquifier': uuid.uuid4().hex
} for row in user_old
])
db.engine.execute("DROP TABLE user_old")
def downgrade():
# pgAdmin only upgrades, downgrade not implemented.
pass

View File

@ -305,7 +305,7 @@ def create_app(app_name=None):
if current_user.is_authenticated: if current_user.is_authenticated:
user_id = current_user.id user_id = current_user.id
else: else:
user = user_datastore.get_user(config.DESKTOP_USER) user = user_datastore.find_user(email=config.DESKTOP_USER)
if user is not None: if user is not None:
user_id = user.id user_id = user.id
user_language = Preferences.raw_value( user_language = Preferences.raw_value(
@ -697,7 +697,7 @@ def create_app(app_name=None):
abort(401) abort(401)
if not config.SERVER_MODE and not current_user.is_authenticated: if not config.SERVER_MODE and not current_user.is_authenticated:
user = user_datastore.get_user(config.DESKTOP_USER) user = user_datastore.find_user(email=config.DESKTOP_USER)
# Throw an error if we failed to find the desktop user, to give # Throw an error if we failed to find the desktop user, to give
# the sysadmin a hint. We'll continue to try to login anyway as # the sysadmin a hint. We'll continue to try to login anyway as
# that'll through a nice 500 error for us. # that'll through a nice 500 error for us.

View File

@ -32,7 +32,7 @@ from flask_security.recoverable import reset_password_token_status, \
from flask_security.signals import reset_password_instructions_sent from flask_security.signals import reset_password_instructions_sent
from flask_security.utils import config_value, do_flash, get_url, \ from flask_security.utils import config_value, do_flash, get_url, \
get_message, slash_url_suffix, login_user, send_mail, logout_user get_message, slash_url_suffix, login_user, send_mail, logout_user
from flask_security.views import _security, _commit, _ctx from flask_security.views import _security, view_commit, _ctx
from werkzeug.datastructures import MultiDict from werkzeug.datastructures import MultiDict
import config import config
@ -1144,7 +1144,7 @@ if hasattr(config, 'SECURITY_CHANGEABLE') and config.SECURITY_CHANGEABLE:
has_error = True has_error = True
if request.json is None and not has_error: if request.json is None and not has_error:
after_this_request(_commit) after_this_request(view_commit)
do_flash(*get_message('PASSWORD_CHANGE')) do_flash(*get_message('PASSWORD_CHANGE'))
old_key = get_crypt_key()[1] old_key = get_crypt_key()[1]
@ -1310,7 +1310,7 @@ if hasattr(config, 'SECURITY_RECOVERABLE') and config.SECURITY_RECOVERABLE:
has_error = True has_error = True
if not has_error: if not has_error:
after_this_request(_commit) after_this_request(view_commit)
do_flash(*get_message('PASSWORD_RESET')) do_flash(*get_message('PASSWORD_RESET'))
login_user(user) login_user(user)
return redirect(get_url(_security.post_reset_view) or return redirect(get_url(_security.post_reset_view) or

View File

@ -20,6 +20,7 @@ things:
from flask_security import UserMixin, RoleMixin from flask_security import UserMixin, RoleMixin
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
import uuid
########################################################################## ##########################################################################
# #
@ -29,7 +30,7 @@ from flask_sqlalchemy import SQLAlchemy
# #
########################################################################## ##########################################################################
SCHEMA_VERSION = 29 SCHEMA_VERSION = 30
########################################################################## ##########################################################################
# #
@ -76,6 +77,9 @@ class User(db.Model, UserMixin):
roles = db.relationship('Role', secondary=roles_users, roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic')) backref=db.backref('users', lazy='dynamic'))
auth_source = db.Column(db.String(16), unique=True, nullable=False) auth_source = db.Column(db.String(16), unique=True, nullable=False)
# fs_uniquifier is required by flask-security-too >= 4.
fs_uniquifier = db.Column(db.String(255), unique=True, nullable=False,
default=(lambda _: uuid.uuid4().hex))
class Setting(db.Model): class Setting(db.Model):