diff --git a/CTFd/__init__.py b/CTFd/__init__.py index c925e83f..ceee401d 100644 --- a/CTFd/__init__.py +++ b/CTFd/__init__.py @@ -1,7 +1,7 @@ from flask import Flask, render_template, request, redirect, abort, session, jsonify, json as json_mod, url_for -from flask.ext.sqlalchemy import SQLAlchemy +from flask_sqlalchemy import SQLAlchemy from logging.handlers import RotatingFileHandler -from flask.ext.session import Session +from flask_session import Session from sqlalchemy_utils import database_exists, create_database import os import sqlalchemy diff --git a/CTFd/admin.py b/CTFd/admin.py index 2725e1c7..091ddf00 100644 --- a/CTFd/admin.py +++ b/CTFd/admin.py @@ -1,6 +1,7 @@ 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, create_image, delete_image, run_image, container_status, container_ports, container_stop, container_start from CTFd.models import db, Teams, Solves, Awards, Containers, Challenges, WrongKeys, Keys, Tags, Files, Tracking, Pages, Config, DatabaseError +from CTFd.scoreboard import get_standings from itsdangerous import TimedSerializer, BadTimeSignature from sqlalchemy.sql import and_, or_, not_ from sqlalchemy.sql.expression import union_all @@ -19,8 +20,6 @@ import json import datetime import calendar -from scoreboard import get_standings - admin = Blueprint('admin', __name__) @@ -445,9 +444,11 @@ def admin_team(teamid): solves = Solves.query.filter_by(teamid=teamid).all() solve_ids = [s.chalid for s in solves] missing = Challenges.query.filter( not_(Challenges.id.in_(solve_ids) ) ).all() - addrs = db.session.query(Tracking.ip, db.func.max(Tracking.date)) \ + last_seen = db.func.max(Tracking.date).label('last_seen') + addrs = db.session.query(Tracking.ip, last_seen) \ .filter_by(team=teamid) \ - .group_by(Tracking.ip).all() + .group_by(Tracking.ip) \ + .order_by(last_seen.desc()).all() wrong_keys = WrongKeys.query.filter_by(teamid=teamid).order_by(WrongKeys.date.asc()).all() awards = Awards.query.filter_by(teamid=teamid).order_by(Awards.date.asc()).all() score = user.score() diff --git a/CTFd/models.py b/CTFd/models.py index b95266f3..1b15e309 100644 --- a/CTFd/models.py +++ b/CTFd/models.py @@ -1,9 +1,9 @@ -from flask.ext.sqlalchemy import SQLAlchemy +from flask_sqlalchemy import SQLAlchemy from sqlalchemy.exc import DatabaseError from sqlalchemy.sql import func from socket import inet_aton, inet_ntoa -from struct import unpack, pack +from struct import unpack, pack, error as struct_error from passlib.hash import bcrypt_sha256 import datetime @@ -16,11 +16,15 @@ def sha512(string): def ip2long(ip): - return unpack('!I', inet_aton(ip))[0] + return unpack('!i', inet_aton(ip))[0] def long2ip(ip_int): - return inet_ntoa(pack('!I', ip_int)) + try: + return inet_ntoa(pack('!i', ip_int)) + except struct_error: + # Backwards compatibility with old CTFd databases + return inet_ntoa(pack('!I', ip_int)) db = SQLAlchemy() @@ -180,7 +184,7 @@ class Solves(db.Model): id = db.Column(db.Integer, primary_key=True) chalid = db.Column(db.Integer, db.ForeignKey('challenges.id')) teamid = db.Column(db.Integer, db.ForeignKey('teams.id')) - ip = db.Column(db.BigInteger) + ip = db.Column(db.Integer) flag = db.Column(db.Text) date = db.Column(db.DateTime, default=datetime.datetime.utcnow) team = db.relationship('Teams', foreign_keys="Solves.teamid", lazy='joined') diff --git a/CTFd/templates/admin/pages.html b/CTFd/templates/admin/pages.html index a2843615..b481f768 100644 --- a/CTFd/templates/admin/pages.html +++ b/CTFd/templates/admin/pages.html @@ -92,7 +92,7 @@ function load_confirm_modal(route){ function save_css(){ var css = editor.getValue(); var nonce = $('#nonce').val(); - $.post('/admin/css', {'css':css, 'nonce':nonce}, function(){ + $.post(script_root + '/admin/css', {'css':css, 'nonce':nonce}, function(){ console.log('saved'); }); }