mirror of
https://github.com/aljazceru/CTFd.git
synced 2025-12-17 05:54:19 +01:00
* Adopting a challenge type layout from deckar01 * Move standard challenge modals into the plugin * Migration to change challenge type id to a string * Travis testing now builds with MySQL, SQLite, and Postgres * Rework get_standings to use the row ID instead of the saved time because of differences in database time precision
159 lines
4.3 KiB
Python
159 lines
4.3 KiB
Python
from CTFd import create_app
|
|
from CTFd.models import *
|
|
from sqlalchemy_utils import database_exists, create_database, drop_database
|
|
from sqlalchemy.engine.url import make_url
|
|
import datetime
|
|
import six
|
|
|
|
if six.PY2:
|
|
text_type = unicode
|
|
binary_type = str
|
|
else:
|
|
text_type = str
|
|
binary_type = bytes
|
|
|
|
|
|
def create_ctfd(ctf_name="CTFd", name="admin", email="admin@ctfd.io", password="password", setup=True):
|
|
app = create_app('CTFd.config.TestingConfig')
|
|
|
|
if setup:
|
|
app = setup_ctfd(app, ctf_name, name, email, password)
|
|
return app
|
|
|
|
|
|
def setup_ctfd(app, ctf_name="CTFd", name="admin", email="admin@ctfd.io", password="password"):
|
|
with app.app_context():
|
|
with app.test_client() as client:
|
|
data = {}
|
|
r = client.get('/setup') # Populate session with nonce
|
|
with client.session_transaction() as sess:
|
|
data = {
|
|
"ctf_name": ctf_name,
|
|
"name": name,
|
|
"email": email,
|
|
"password": password,
|
|
"nonce": sess.get('nonce')
|
|
}
|
|
client.post('/setup', data=data)
|
|
return app
|
|
|
|
|
|
def destroy_ctfd(app):
|
|
with app.app_context():
|
|
app.db.session.commit()
|
|
app.db.session.close_all()
|
|
app.db.drop_all()
|
|
drop_database(app.config['SQLALCHEMY_DATABASE_URI'])
|
|
|
|
|
|
def register_user(app, name="user", email="user@ctfd.io", password="password"):
|
|
with app.app_context():
|
|
with app.test_client() as client:
|
|
r = client.get('/register')
|
|
with client.session_transaction() as sess:
|
|
data = {
|
|
"name": name,
|
|
"email": email,
|
|
"password": password,
|
|
"nonce": sess.get('nonce')
|
|
}
|
|
client.post('/register', data=data)
|
|
|
|
|
|
def login_as_user(app, name="user", password="password"):
|
|
with app.app_context():
|
|
with app.test_client() as client:
|
|
r = client.get('/login')
|
|
with client.session_transaction() as sess:
|
|
data = {
|
|
"name": name,
|
|
"password": password,
|
|
"nonce": sess.get('nonce')
|
|
}
|
|
client.post('/login', data=data)
|
|
return client
|
|
|
|
|
|
def get_scores(user):
|
|
scores = user.get('/scores')
|
|
print(scores.get_data(as_text=True))
|
|
scores = json.loads(scores.get_data(as_text=True))
|
|
print(scores)
|
|
return scores['standings']
|
|
|
|
|
|
def gen_challenge(db, name='chal_name', description='chal_description', value=100, category='chal_category', type='standard'):
|
|
chal = Challenges(name, description, value, category)
|
|
db.session.add(chal)
|
|
db.session.commit()
|
|
return chal
|
|
|
|
|
|
def gen_award(db, teamid, name="award_name", value=100):
|
|
award = Awards(teamid, name, value)
|
|
db.session.add(award)
|
|
db.session.commit()
|
|
return award
|
|
|
|
|
|
def gen_tag(db, chal, tag='tag_tag'):
|
|
tag = Tags(chal, tag)
|
|
db.session.add(tag)
|
|
db.session.commit()
|
|
return tag
|
|
|
|
|
|
def gen_file():
|
|
pass
|
|
|
|
|
|
def gen_flag(db, chal, flag='flag', key_type=0):
|
|
key = Keys(chal, flag, key_type)
|
|
db.session.add(key)
|
|
db.session.commit()
|
|
return key
|
|
|
|
|
|
def gen_team(db, name='name', email='user@ctfd.io', password='password'):
|
|
team = Teams(name, email, password)
|
|
db.session.add(team)
|
|
db.session.commit()
|
|
return team
|
|
|
|
|
|
def gen_hint(db, chal, hint="This is a hint", cost=0, type=0):
|
|
hint = Hints(chal, hint, cost, type)
|
|
db.session.add(hint)
|
|
db.session.commit()
|
|
return hint
|
|
|
|
|
|
def gen_solve(db, teamid, chalid, ip='127.0.0.1', flag='rightkey'):
|
|
solve = Solves(teamid, chalid, ip, flag)
|
|
solve.date = datetime.datetime.utcnow()
|
|
db.session.add(solve)
|
|
db.session.commit()
|
|
return solve
|
|
|
|
|
|
def gen_wrongkey(db, teamid, chalid, ip='127.0.0.1', flag='wrongkey'):
|
|
wrongkey = WrongKeys(teamid, chalid, ip, flag)
|
|
wrongkey.date = datetime.datetime.utcnow()
|
|
db.session.add(wrongkey)
|
|
db.session.commit()
|
|
return wrongkey
|
|
|
|
|
|
def gen_tracking(db, ip, team):
|
|
tracking = Tracking(ip, team)
|
|
db.session.add(tracking)
|
|
db.session.commit()
|
|
return tracking
|
|
|
|
|
|
def gen_page(db, route, html):
|
|
page = Pages(route, html)
|
|
db.session.add(page)
|
|
db.session.commit()
|
|
return page
|