Skip to content

Commit 00b5522

Browse files
committed
bug fixes
2 parents 9e95399 + 85a4b6a commit 00b5522

File tree

3 files changed

+138
-2
lines changed

3 files changed

+138
-2
lines changed

CONTRIBUTING.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424

2525
## This project makes use of the following Flask libraries
2626

27-
* Flask-blueprints for modularity and clean codebase,
27+
* Blueprints for modularity and clean codebase,
2828
* Flask-admin for Admin views and easy realtime management,
29-
* Flask-SQLAlchemy for SQL models,
29+
* Flask-SQLAlchemy for SQL models,
30+
* Flask-Caching with redis for efficient caching,
3031
* Flask-login for session handling,
3132
* Flask-wtf for responsive forms,
3233
* Flask-mail for mail service,

src/FlaskRTBCTF/helpers.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
""" Helper functions """
2+
3+
import os
4+
import secrets
5+
6+
7+
def handle_secret_key(default="you-will-never-guess"):
8+
sk = os.environ.get("SECRET_KEY", default)
9+
if not sk:
10+
sk = secrets.token_hex(16)
11+
os.environ["SECRET_KEY"] = sk
12+
return sk
13+
14+
15+
def handle_admin_pass(default="admin"):
16+
passwd = os.environ.get("ADMIN_PASS", default)
17+
if not passwd:
18+
passwd = secrets.token_hex(16)
19+
os.environ["ADMIN_PASS"] = passwd
20+
return passwd

src/FlaskRTBCTF/models.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
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

Comments
 (0)