2022-11-18 09:04:33 +01:00
|
|
|
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)
|
2022-11-18 11:08:08 +01:00
|
|
|
user.password = hasher.hash(password)
|
2022-11-18 09:04:33 +01:00
|
|
|
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
|