blob: 3c18f2d8ddebe00ce9a96b30f37dd20da9ad6d63 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.11/handlebars.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<script id="body-template" type="text/x-handlebars-template">
<div class="container">
<div class="alert alert-secondary" role="alert">
<strong>Please note:</strong> All flags are case-sensitive and look like <samp>CIRCUS{IS_REALLY_C00L}</samp>.
</div>
{{#each challenges}}
<div class="card {{#if foundFlag}}border-success{{/if}}" style="margin-bottom: 20px">
<div class="card-header">
{{ name }}
<span class="badge badge-light">
{{ category }}
</span>
</div>
<div class="card-body">
<p>
{{{ description }}}
</p>
{{#if foundFlag}}
<p class="text-success">Flag found!</p>
{{else}}
<form class="input-group mb-3" onsubmit="event.preventDefault();submitThis(this);">
<input type="hidden" name="challengeName" value="{{ name }}">
<input type="text" class="form-control" aria-label="Flag" aria-describedby="button-submit" name="flag">
<div class="input-group-append">
<button class="btn btn-outline-primary" type="submit" id="button-submit">Submit flag</button>
</div>
</form>
{{/if}}
</div>
</div>
{{/each}}
</div>
</script>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark mb-4">
<a class="navbar-brand" href="/">Companion</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item active">
<a class="nav-link" href="/challenges">Challenges</a>
</li>
</ul>
<form class="form-inline mt-2 mt-md-0" action="/logout" method="post">
<button class="btn btn-outline-danger my-2 my-sm-0" type="submit">Logout</button>
</form>
</div>
</nav>
<main class="container" role="main" id="challenge-list">
<div class="alert alert-info" role="alert">
Loading challenges...
</div>
</main>
</body>
<script type="text/javascript">
var template = Handlebars.compile($("#body-template").html());
function loadChallengesAndRender() {
$.ajax({
url: "/api/getChallenges",
success: function(result) {
$("#challenge-list").html(
template(jQuery.parseJSON(result))
);
}
});
}
function submitThis(t) {
submitFlag($(t).find('[name=challengeName]').val(), $(t).find('[name=flag]'));
}
function submitFlag(challengeName, flagObject) {
$.post("/api/submitFlag", {
"challengeName": challengeName,
"flag": flagObject.val()
}).done(function(data) {
var result = jQuery.parseJSON(data);
if(result["correctFlag"] == "true") {
// yay!
loadChallengesAndRender();
} else {
// nay!
flagObject.addClass("alert-danger").blur();
}
});
}
$(document).ready(function() {
loadChallengesAndRender();
});
</script>
</html>
|