from argon2 import PasswordHasher from argon2.exceptions import VerifyMismatchError from flask_login import UserMixin from server import db hasher = PasswordHasher() class User(UserMixin, db.Model): __tablename__ = "user" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.Unicode, unique=True, nullable=False) password = db.Column(db.String, nullable=False) world = db.Column(db.JSON, nullable=True, default=None) claimed_base = db.Column(db.JSON, nullable=False, default="") inventory = db.Column(db.Unicode, nullable=True, default=None) loaded_world = db.Column(db.JSON, nullable=True, default=None) def get_id(self): return str(self.id) @classmethod def exists(cls, username): return cls.query.filter(cls.username == username).first() is not None @classmethod def register(cls, username, password, roles=None): user = cls.query.filter(cls.username == username).first() if user is None: user = cls(username=username) db.session.add(user) user.password = hasher.hash(password) db.session.commit() return user def verify(self, password): try: hasher.verify(self.password, password) except VerifyMismatchError: return False if hasher.check_needs_rehash(self.password): self.password = hasher.hash(password) db.session.commit() return True