|
| 1 | +""" Models. """ |
| 2 | + |
| 3 | + |
| 4 | +from datetime import datetime |
| 5 | +from itsdangerous import TimedJSONWebSignatureSerializer as Serializer |
| 6 | + |
| 7 | +from flask import current_app |
| 8 | +from FlaskRTBCTF.config import LOGGING |
| 9 | +from FlaskRTBCTF import db, login_manager |
| 10 | +from flask_login import UserMixin |
| 11 | + |
| 12 | + |
| 13 | +@login_manager.user_loader |
| 14 | +def load_user(user_id): |
| 15 | + return User.query.get(int(user_id)) |
| 16 | + |
| 17 | + |
| 18 | +# Machine Table |
| 19 | + |
| 20 | + |
| 21 | +class Machine(db.Model): |
| 22 | + id = db.Column(db.Integer, primary_key=True) |
| 23 | + name = db.Column(db.String(64), nullable=False) |
| 24 | + user_hash = db.Column(db.String(32), nullable=False) |
| 25 | + root_hash = db.Column(db.String(32), nullable=False) |
| 26 | + user_points = db.Column(db.Integer, default=0) |
| 27 | + root_points = db.Column(db.Integer, default=0) |
| 28 | + os = db.Column(db.String(16), nullable=False) |
| 29 | + ip = db.Column(db.String(45), nullable=False) |
| 30 | + hardness = db.Column(db.String(16), nullable=False, default="Easy") |
| 31 | + |
| 32 | + score = db.relationship("Score", backref="machine", lazy=True) |
| 33 | + |
| 34 | + |
| 35 | +# User Table |
| 36 | + |
| 37 | + |
| 38 | +class User(db.Model, UserMixin): |
| 39 | + id = db.Column(db.Integer, primary_key=True) |
| 40 | + username = db.Column(db.String(24), unique=True, nullable=False) |
| 41 | + email = db.Column(db.String(88), unique=True, nullable=False) |
| 42 | + password = db.Column(db.String(64), nullable=False) |
| 43 | + isAdmin = db.Column(db.Boolean, default=False) |
| 44 | + score = db.relationship("Score", backref="user", lazy=True, uselist=False) |
| 45 | + if LOGGING: |
| 46 | + logs = db.relationship("Logs", backref="user", lazy=True, uselist=False) |
| 47 | + |
| 48 | + def get_reset_token(self, expires_sec=1800): |
| 49 | + s = Serializer(current_app.config["SECRET_KEY"], expires_sec) |
| 50 | + return s.dumps({"user_id": self.id}).decode("utf-8") |
| 51 | + |
| 52 | + @staticmethod |
| 53 | + def verify_reset_token(token): |
| 54 | + s = Serializer(current_app.config["SECRET_KEY"]) |
| 55 | + try: |
| 56 | + user_id = s.loads(token)["user_id"] |
| 57 | + except Exception: |
| 58 | + return None |
| 59 | + return User.query.get(user_id) |
| 60 | + |
| 61 | + def __repr__(self): |
| 62 | + return f"User('{self.username}', '{self.email}'))" |
| 63 | + |
| 64 | + |
| 65 | +# Score Table |
| 66 | + |
| 67 | + |
| 68 | +class Score(db.Model): |
| 69 | + user_id = db.Column( |
| 70 | + db.Integer, db.ForeignKey("user.id"), nullable=False, primary_key=True |
| 71 | + ) |
| 72 | + userHash = db.Column(db.Boolean, default=False) |
| 73 | + rootHash = db.Column(db.Boolean, default=False) |
| 74 | + points = db.Column(db.Integer) |
| 75 | + timestamp = db.Column(db.DateTime(), default=datetime.utcnow) |
| 76 | + machine_id = db.Column(db.Integer, db.ForeignKey("machine.id"), nullable=False) |
| 77 | + |
| 78 | + def __repr__(self): |
| 79 | + return f"Score('{self.user_id}', '{self.points}')" |
| 80 | + |
| 81 | + |
| 82 | +# Notifications Table |
| 83 | + |
| 84 | + |
| 85 | +class Notification(db.Model): |
| 86 | + id = db.Column(db.Integer, primary_key=True) |
| 87 | + title = db.Column(db.String(30), nullable=False) |
| 88 | + body = db.Column(db.TEXT(), nullable=False) |
| 89 | + timestamp = db.Column(db.DateTime, default=datetime.utcnow) |
| 90 | + |
| 91 | + def __repr__(self): |
| 92 | + return f"Notif('{self.title}', '{self.body}')" |
| 93 | + |
| 94 | + |
| 95 | +# Logging Table |
| 96 | + |
| 97 | + |
| 98 | +if LOGGING: |
| 99 | + |
| 100 | + class Logs(db.Model): |
| 101 | + user_id = db.Column( |
| 102 | + db.Integer, db.ForeignKey("user.id"), nullable=False, primary_key=True |
| 103 | + ) |
| 104 | + accountCreationTime = db.Column(db.DateTime, nullable=False) |
| 105 | + visitedMachine = db.Column(db.Boolean, default=False) |
| 106 | + machineVisitTime = db.Column(db.DateTime, nullable=True) |
| 107 | + userSubmissionTime = db.Column(db.DateTime, nullable=True) |
| 108 | + rootSubmissionTime = db.Column(db.DateTime, nullable=True) |
| 109 | + userOwnTime = db.Column(db.String, nullable=True) |
| 110 | + rootOwnTime = db.Column(db.String, nullable=True) |
| 111 | + userSubmissionIP = db.Column(db.String, nullable=True) |
| 112 | + rootSubmissionIP = db.Column(db.String, nullable=True) |
| 113 | + |
| 114 | + def __repr__(self): |
| 115 | + return f"Logs('{self.user_id}','{self.visitedMachine}'" |
0 commit comments