Merge
This commit is contained in:
commit
42ccc3cc5e
9 changed files with 328 additions and 7 deletions
|
@ -1,8 +1,10 @@
|
|||
import logger
|
||||
|
||||
from flask import Blueprint, session, request
|
||||
from flask import current_app as app
|
||||
|
||||
from models import db, Problems
|
||||
from decorators import admins_only, api_wrapper
|
||||
from models import db, Problems, Solves, Teams
|
||||
from decorators import admins_only, api_wrapper, login_required
|
||||
|
||||
blueprint = Blueprint("problem", __name__)
|
||||
|
||||
|
@ -67,3 +69,33 @@ def problem_update():
|
|||
|
||||
return { "success": 1, "message": "Success!" }
|
||||
return { "success": 0, "message": "Problem does not exist!" }
|
||||
|
||||
@blueprint.route("/submit", methods=["POST"])
|
||||
@api_wrapper
|
||||
@login_required
|
||||
def problem_submit():
|
||||
pid = request.form["pid"]
|
||||
flag = request.form["flag"]
|
||||
tid = session["tid"]
|
||||
|
||||
problem = Problems.query.filter_by(pid=pid).first()
|
||||
team = Teams.query.filter_by(tid=tid).first()
|
||||
if problem:
|
||||
if flag == problem.flag:
|
||||
solve = Solves(pid, tid)
|
||||
team.score += problem.value
|
||||
problem.solves += 1
|
||||
db.session.add(solve)
|
||||
db.session.add(team)
|
||||
db.session.add(problem)
|
||||
db.session.commit()
|
||||
|
||||
logger.log("submissions.log", logger.WARNING, "%s has solved %s by submitting %s" % (team.name, problem.name, flag))
|
||||
return { "success": 1, "message": "Correct!" }
|
||||
|
||||
else:
|
||||
logger.log("submissions.log", logger.WARNING, "%s has incorrectly submitted %s to %s" % (team.name, flag, problem.name))
|
||||
return { "success": 0, "message": "Incorrect." }
|
||||
|
||||
else:
|
||||
return { "success": 0, "message": "Problem does not exist!" }
|
||||
|
|
|
@ -11,7 +11,7 @@ app.config["SQLALCHEMY_DATABASE_URI"] = config.SQLALCHEMY_DATABASE_URI
|
|||
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = config.SQLALCHEMY_TRACK_MODIFICATIONS
|
||||
|
||||
with app.app_context():
|
||||
from api.models import db
|
||||
from api.models import db, Teams, Problems, Solves, Users
|
||||
db.init_app(app)
|
||||
db.create_all()
|
||||
|
||||
|
|
158
web/css/c3.css
Normal file
158
web/css/c3.css
Normal file
|
@ -0,0 +1,158 @@
|
|||
/*-- Chart --*/
|
||||
.c3 svg {
|
||||
font: 10px sans-serif; }
|
||||
|
||||
.c3 path, .c3 line {
|
||||
fill: none;
|
||||
stroke: #000; }
|
||||
|
||||
.c3 text {
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none; }
|
||||
|
||||
.c3-legend-item-tile, .c3-xgrid-focus, .c3-ygrid, .c3-event-rect, .c3-bars path {
|
||||
shape-rendering: crispEdges; }
|
||||
|
||||
.c3-chart-arc path {
|
||||
stroke: #fff; }
|
||||
|
||||
.c3-chart-arc text {
|
||||
fill: #fff;
|
||||
font-size: 13px; }
|
||||
|
||||
/*-- Axis --*/
|
||||
/*-- Grid --*/
|
||||
.c3-grid line {
|
||||
stroke: #aaa; }
|
||||
|
||||
.c3-grid text {
|
||||
fill: #aaa; }
|
||||
|
||||
.c3-xgrid, .c3-ygrid {
|
||||
stroke-dasharray: 3 3; }
|
||||
|
||||
/*-- Text on Chart --*/
|
||||
.c3-text.c3-empty {
|
||||
fill: #808080;
|
||||
font-size: 2em; }
|
||||
|
||||
/*-- Line --*/
|
||||
.c3-line {
|
||||
stroke-width: 1px; }
|
||||
|
||||
/*-- Point --*/
|
||||
.c3-circle._expanded_ {
|
||||
stroke-width: 1px;
|
||||
stroke: white; }
|
||||
|
||||
.c3-selected-circle {
|
||||
fill: white;
|
||||
stroke-width: 2px; }
|
||||
|
||||
/*-- Bar --*/
|
||||
.c3-bar {
|
||||
stroke-width: 0; }
|
||||
|
||||
.c3-bar._expanded_ {
|
||||
fill-opacity: 0.75; }
|
||||
|
||||
/*-- Focus --*/
|
||||
.c3-target.c3-focused {
|
||||
opacity: 1; }
|
||||
|
||||
.c3-target.c3-focused path.c3-line, .c3-target.c3-focused path.c3-step {
|
||||
stroke-width: 2px; }
|
||||
|
||||
.c3-target.c3-defocused {
|
||||
opacity: 0.3 !important; }
|
||||
|
||||
/*-- Region --*/
|
||||
.c3-region {
|
||||
fill: steelblue;
|
||||
fill-opacity: 0.1; }
|
||||
|
||||
/*-- Brush --*/
|
||||
.c3-brush .extent {
|
||||
fill-opacity: 0.1; }
|
||||
|
||||
/*-- Select - Drag --*/
|
||||
/*-- Legend --*/
|
||||
.c3-legend-item {
|
||||
font-size: 12px; }
|
||||
|
||||
.c3-legend-item-hidden {
|
||||
opacity: 0.15; }
|
||||
|
||||
.c3-legend-background {
|
||||
opacity: 0.75;
|
||||
fill: white;
|
||||
stroke: lightgray;
|
||||
stroke-width: 1; }
|
||||
|
||||
/*-- Tooltip --*/
|
||||
.c3-tooltip-container {
|
||||
z-index: 10; }
|
||||
|
||||
.c3-tooltip {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
background-color: #fff;
|
||||
empty-cells: show;
|
||||
-webkit-box-shadow: 7px 7px 12px -9px #777777;
|
||||
-moz-box-shadow: 7px 7px 12px -9px #777777;
|
||||
box-shadow: 7px 7px 12px -9px #777777;
|
||||
opacity: 0.9; }
|
||||
|
||||
.c3-tooltip tr {
|
||||
border: 1px solid #CCC; }
|
||||
|
||||
.c3-tooltip th {
|
||||
background-color: #aaa;
|
||||
font-size: 14px;
|
||||
padding: 2px 5px;
|
||||
text-align: left;
|
||||
color: #FFF; }
|
||||
|
||||
.c3-tooltip td {
|
||||
font-size: 13px;
|
||||
padding: 3px 6px;
|
||||
background-color: #fff;
|
||||
border-left: 1px dotted #999; }
|
||||
|
||||
.c3-tooltip td > span {
|
||||
display: inline-block;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
margin-right: 6px; }
|
||||
|
||||
.c3-tooltip td.value {
|
||||
text-align: right; }
|
||||
|
||||
/*-- Area --*/
|
||||
.c3-area {
|
||||
stroke-width: 0;
|
||||
opacity: 0.2; }
|
||||
|
||||
/*-- Arc --*/
|
||||
.c3-chart-arcs-title {
|
||||
dominant-baseline: middle;
|
||||
font-size: 1.3em; }
|
||||
|
||||
.c3-chart-arcs .c3-chart-arcs-background {
|
||||
fill: #e0e0e0;
|
||||
stroke: none; }
|
||||
|
||||
.c3-chart-arcs .c3-chart-arcs-gauge-unit {
|
||||
fill: #000;
|
||||
font-size: 16px; }
|
||||
|
||||
.c3-chart-arcs .c3-chart-arcs-gauge-max {
|
||||
fill: #777; }
|
||||
|
||||
.c3-chart-arcs .c3-chart-arcs-gauge-min {
|
||||
fill: #777; }
|
||||
|
||||
.c3-chart-arc .c3-gauge-value {
|
||||
fill: #000;
|
||||
/* font-size: 28px !important;*/ }
|
|
@ -3,6 +3,9 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>EasyCTF 2016</title>
|
||||
<link href="css/c3.css" rel="stylesheet" type="text/css">
|
||||
<script src="js/d3.v3.min.js" charset="utf-8"></script>
|
||||
<script src="js/c3.min.js"></script>
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
|
||||
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
|
||||
<link type="text/css" rel="stylesheet" href="css/style.css">
|
||||
|
|
5
web/js/c3.min.js
vendored
Normal file
5
web/js/c3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
5
web/js/d3.v3.min.js
vendored
Normal file
5
web/js/d3.v3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
45
web/js/scoreboard.js
Normal file
45
web/js/scoreboard.js
Normal file
|
@ -0,0 +1,45 @@
|
|||
var chart = c3.generate({
|
||||
data: {
|
||||
x: 'x',
|
||||
columns: [
|
||||
['x', '2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'],
|
||||
['Team Thomas', 30, 250, 380, 500, 620, 740],
|
||||
]
|
||||
},
|
||||
axis: {
|
||||
x: {
|
||||
type: 'timeseries',
|
||||
tick: {
|
||||
format: '%Y-%m-%d'
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team Charles', 100, 210, 320, 430, 540, 650]
|
||||
]
|
||||
});
|
||||
}, 1000);
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team Zach', 10, 120, 230, 340, 450, 560]
|
||||
]
|
||||
});
|
||||
}, 2000);
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team Michael', 0, 80, 190, 300, 410, 520]
|
||||
]
|
||||
});
|
||||
}, 3000);
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team James', 0, 100, 250, 300, 450, 600]
|
||||
]
|
||||
});
|
||||
}, 4000);
|
|
@ -36,9 +36,9 @@
|
|||
|
||||
<div class="col-md-12">
|
||||
<br>
|
||||
<label>Password</label>
|
||||
<label>Confirm Password</label>
|
||||
<br>
|
||||
<input type="password" name="password_confirm" autocomplete="off" placeholder="Confirm Password" class="form-control">
|
||||
<input type="password" name="password_confirm" id="password_confirm" autocomplete="off" placeholder="Confirm Password" class="form-control">
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
|
|
@ -1,18 +1,91 @@
|
|||
<script type="text/javascript">
|
||||
var chart = c3.generate({
|
||||
data: {
|
||||
x: 'x',
|
||||
columns: [
|
||||
['x', '2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'],
|
||||
['Team Thomas', 30, 250, 380, 500, 620, 740],
|
||||
]
|
||||
},
|
||||
axis: {
|
||||
x: {
|
||||
type: 'timeseries',
|
||||
tick: {
|
||||
format: '%Y-%m-%d'
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team Charles', 100, 210, 320, 430, 540, 650]
|
||||
]
|
||||
});
|
||||
}, 1000);
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team Zach', 10, 120, 230, 340, 450, 560]
|
||||
]
|
||||
});
|
||||
}, 2000);
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team Michael', 0, 80, 190, 300, 410, 520]
|
||||
]
|
||||
});
|
||||
}, 3000);
|
||||
setTimeout(function() {
|
||||
chart.load({
|
||||
columns: [
|
||||
['Team James', 0, 100, 250, 300, 450, 600]
|
||||
]
|
||||
});
|
||||
}, 4000);
|
||||
</script>
|
||||
<center class="fade_in">
|
||||
<h1 class="heading1">Scoreboard</h1>
|
||||
<br>
|
||||
<div id="chart"></div>
|
||||
<br>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Team Name</th>
|
||||
<th>School</th>
|
||||
<th>Points</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>Charles Is The Best</td>
|
||||
<td>pg</td>
|
||||
<td>Team Thomas</td>
|
||||
<td>T. High School</td>
|
||||
<td>740</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>Team Charles</td>
|
||||
<td>C. High School</td>
|
||||
<td>650</td>
|
||||
</tr><tr>
|
||||
<td>3</td>
|
||||
<td>Team Zach</td>
|
||||
<td>Z. High School</td>
|
||||
<td>560</td>
|
||||
</tr><tr>
|
||||
<td>4</td>
|
||||
<td>Team Michael</td>
|
||||
<td>M. High School</td>
|
||||
<td>520</td>
|
||||
</tr><tr>
|
||||
<td>5</td>
|
||||
<td>Team James</td>
|
||||
<td>J. High School</td>
|
||||
<td>600</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
Loading…
Reference in a new issue