diff --git a/CTFd/admin.py b/CTFd/admin.py index 0248f978..ca3b08a1 100644 --- a/CTFd/admin.py +++ b/CTFd/admin.py @@ -1,6 +1,6 @@ from flask import render_template, request, redirect, abort, jsonify, url_for, session, Blueprint from CTFd.utils import sha512, is_safe_url, authed, admins_only, is_admin, unix_time, unix_time_millis, get_config, set_config, sendmail, rmdir -from CTFd.models import db, Teams, Solves, Challenges, WrongKeys, Keys, Tags, Files, Tracking, Pages, Config +from CTFd.models import db, Teams, Solves, Challenges, WrongKeys, Keys, Tags, Files, Tracking, Pages, Config, DatabaseError from itsdangerous import TimedSerializer, BadTimeSignature from werkzeug.utils import secure_filename from socket import inet_aton, inet_ntoa @@ -410,10 +410,16 @@ def unban(teamid): @admin.route('/admin/team//delete', methods=['POST']) @admins_only def delete_team(teamid): - user = Teams.query.filter_by(id=teamid).first() - db.session.delete(user) - db.session.commit() - return '1' + try: + WrongKeys.query.filter_by(team=teamid).delete() + Solves.query.filter_by(teamid=teamid).delete() + Tracking.query.filter_by(team=teamid).delete() + Teams.query.filter_by(id=teamid).delete() + db.session.commit() + except DatabaseError: + return '0' + else: + return '1' @admin.route('/admin/graphs/') diff --git a/CTFd/models.py b/CTFd/models.py index cf07747f..92599188 100644 --- a/CTFd/models.py +++ b/CTFd/models.py @@ -1,4 +1,5 @@ from flask.ext.sqlalchemy import SQLAlchemy +from sqlalchemy.exc import DatabaseError from socket import inet_aton, inet_ntoa from struct import unpack, pack @@ -8,12 +9,15 @@ import datetime import hashlib import json + def sha512(string): return hashlib.sha512(string).hexdigest() + def ip2long(ip): return unpack('!I', inet_aton(ip))[0] + def long2ip(ip_int): return inet_ntoa(pack('!I', ip_int)) @@ -32,6 +36,7 @@ class Pages(db.Model): def __repr__(self): return "".format(self.tag, self.chal) + class Challenges(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80)) @@ -51,6 +56,7 @@ class Challenges(db.Model): def __repr__(self): return '' % self.name + class Tags(db.Model): id = db.Column(db.Integer, primary_key=True) chal = db.Column(db.Integer, db.ForeignKey('challenges.id')) @@ -63,6 +69,7 @@ class Tags(db.Model): def __repr__(self): return "".format(self.tag, self.chal) + class Files(db.Model): id = db.Column(db.Integer, primary_key=True) chal = db.Column(db.Integer, db.ForeignKey('challenges.id')) @@ -75,6 +82,7 @@ class Files(db.Model): def __repr__(self): return "".format(self.location, self.chal) + class Keys(db.Model): id = db.Column(db.Integer, primary_key=True) chal = db.Column(db.Integer, db.ForeignKey('challenges.id')) @@ -130,6 +138,7 @@ class Teams(db.Model): except ValueError: return 0 + class Solves(db.Model): __table_args__ = (db.UniqueConstraint('chalid', 'teamid'), {}) id = db.Column(db.Integer, primary_key=True)