From 7f70dd1678b593155ebb51e88b0ad99b24576f32 Mon Sep 17 00:00:00 2001 From: Son NK Date: Thu, 27 Feb 2020 22:15:22 +0700 Subject: [PATCH] make User.password nullable, add SocialAuth model --- app/models.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/app/models.py b/app/models.py index 4d71fa11..41e985bc 100644 --- a/app/models.py +++ b/app/models.py @@ -103,7 +103,7 @@ class User(db.Model, ModelMixin, UserMixin): __tablename__ = "users" email = db.Column(db.String(256), unique=True, nullable=False) salt = db.Column(db.String(128), nullable=False) - password = db.Column(db.String(128), nullable=False) + password = db.Column(db.String(128), nullable=True) name = db.Column(db.String(128), nullable=False) is_admin = db.Column(db.Boolean, nullable=False, default=False) alias_generator = db.Column( @@ -156,12 +156,9 @@ class User(db.Model, ModelMixin, UserMixin): def create(cls, email, name, password=None, **kwargs): user: User = super(User, cls).create(email=email, name=name, **kwargs) - if not password: - # set a random password - password = random_string(20) - - user.set_password(password) - db.session.flush() + if password: + user.set_password(password) + db.session.flush() # create a first alias mail to show user how to use when they login GenEmail.create_new(user.id, prefix="my-first-alias") @@ -241,6 +238,8 @@ class User(db.Model, ModelMixin, UserMixin): self.password = password_hash def check_password(self, password) -> bool: + if not self.password: + return False password_hash = bcrypt.hashpw(password.encode(), self.salt.encode()) return self.password.encode() == password_hash @@ -351,6 +350,17 @@ class ResetPasswordCode(db.Model, ModelMixin): return self.expired < arrow.now() +class SocialAuth(db.Model, ModelMixin): + """Store how user authenticates with social login""" + + user_id = db.Column(db.ForeignKey(User.id, ondelete="cascade"), nullable=False) + + # name of the social login used, could be facebook, google or github + social = db.Column(db.String(128), nullable=False) + + __table_args__ = (db.UniqueConstraint("user_id", "social", name="uq_social_auth"),) + + # <<< OAUTH models >>>