ctf-2011
old assets from capture-the-flag ictf 2011
git clone https://9o.is/git/ctf-2011.git
rwthctf.js
(8162B)
1 $.facebox.settings.closeImage = '/facebox/closelabel.png';
2 $.facebox.settings.loadingImage = '/loading.gif';
3
4 var timerid = 0;
5 //var loading = '<img src="/loading.gif" alt="Loading" />';
6 var loading = '';
7
8 var colors = {
9 down: '#E6ACAC',
10 broken: '#E8C6A2',
11 good: '#BBF2B8',
12 error: '#ACACE6',
13 };
14
15 var statestrings = {
16 0: 'good',
17 1: 'down',
18 2: 'broken',
19 3: 'error',
20 };
21
22 var handlers = {
23 score: function(info) {
24 var container = $(document.createElement('div'));
25 container.append("<h2>Scoreboard</h2><span class='explanation'>(refreshed every 5 seconds)</span>");
26 var p = $(document.createElement('p'));
27 p.append('Click on a service to display details about its status on a certain team.<br/>');
28 p.append('Offense and Defense points represent the amount of points gathered compared to the leading team.');
29 container.append(p);
30
31 info.scores.sort( function(a, b) {
32 return b.money - a.money;
33 } );
34
35 var table = $(document.createElement('table'));
36 table.addClass('scoreboard');
37
38 var tr = $(document.createElement('tr'));
39 tr.append($(document.createElement('td')));
40 for(var idx in info.services) {
41 tr.append($(document.createElement('th')).text(info.services[idx].label));
42 }
43 tr.append($(document.createElement('th')).text('Offense'))
44 tr.append($(document.createElement('th')).text('Defense'))
45 tr.append($(document.createElement('th')).text('Account Balance'))
46 table.append(tr);
47
48 for(var idx in info.scores) {
49 var tr = $(document.createElement('tr'));
50 tr.append($(document.createElement('th')).text(info.scores[idx].name));
51
52 for(var jdx in info.services) {
53 var sstate = 'unknown';
54 var smsg = 'unknown';
55 if (info.scores[idx].states && info.services[jdx].name in info.scores[idx].states && info.scores[idx].states[info.services[jdx].name] !== undefined) {
56 sstate = statestrings[info.scores[idx].states[info.services[jdx].name].state];
57 smsg = info.scores[idx].states[info.services[jdx].name].msg;
58 }
59 if (!sstate) sstate = 'error';
60 var cell = $(document.createElement('td')).text(sstate);
61 cell.css({'cursor':'pointer', 'background-color': colors[sstate]});
62 cell[0].onclick = function(team, service, msg) { return function () {
63 $.facebox(msg);
64 } } (info.scores[idx].id, info.services[jdx].id, smsg);
65 tr.append(cell);
66 }
67
68 tr.append($(document.createElement('td')).text(info.scores[idx].ap+"%").css({'background-color': 'white'}));
69 tr.append($(document.createElement('td')).text(info.scores[idx].dp+"%").css({'background-color': 'white'}));
70 tr.append($(document.createElement('td')).text('$'+info.scores[idx].money).css({'background-color': 'white'}));
71
72 table.append(tr);
73 }
74
75 container.append(table);
76 replaceContent(container);
77 },
78
79 market: function(posts) {
80 var container = $(document.createElement('div'));
81 container.append("<h2>Black Market</h2><span class='explanation'>Buy and Sell Advisories</span>");
82 container.append('<p>You can submit your stuff here: <a class="internal" href="/json/marketsubmission#market">Market submission</a></p>');
83 container.append('<h3>Current market</h3>');
84
85 var table = $(document.createElement('table'));
86 table.attr("class","market");
87 table.append("<tr><th>Description</th><th>Price</th><th>Actions</th></tr>");
88
89 for(var post in posts) {
90 post = posts[post];
91 var row = $(document.createElement('tr'));
92
93 var description = $(document.createElement('td'));
94 description.text(post.description);
95 row.append(description);
96
97 var price = $(document.createElement('td'));
98 price.addClass('price');
99 price.text(post.price);
100 row.append(price);
101
102 var action = $(document.createElement('td'));
103 var buy = $(document.createElement('a'));
104 buy.attr("href","");
105 buy.addClass('buy');
106 buy.text("Buy");
107 action.append(buy);
108 row.append(action);
109
110 table.append(row);
111 }
112 container.append(table);
113
114 replaceContent(container);
115 },
116
117 marketsubmission: function(info) {
118 var container = $(document.createElement('div'));
119 var marketform = $(document.createElement('form'));
120 marketform.attr("id","marketform");
121 marketform.attr("action","/json/marketsubmission");
122 marketform.attr("method","post");
123 marketform.append('<h2>Black Market Submission</h2><span class="explanation">Submit your own advisories and earn cash when they are sold.</span>');
124 marketform.append('<p>Here, you can sell any weaknesses you have discovered (and hopefully fixed) to other teams for a monetary compensation.<br/>Funds will be added to your account for each sale.<br/>Please note that it is currently not possible to withdraw or update an advisory once it is submitted.</p>');
125 marketform.append('<h3>Description</h3><input id="description" type="text" name="description" size="80" value="Description" />');
126 marketform.append('<span class="explanation">This will be the only description shown in the Market, so make it to the point.</span>');
127 marketform.append('<h3>MSRP</h3><input id="price" type="text" name="price" size="8" value="100" />');
128 marketform.append('<span class="explanation">You can suggest a retail price at which we should sell your advisory. We are not required to abide by this suggestion.</span>');
129 marketform.append('<h3>Content</h3><textarea id="content" name="content" cols="80" rows="40">Content</textarea>');
130 marketform.append('<span class="explanation">Your advisory. Please use formatting similar to <a href="/txt/advisory.txt#">this advisory</a><br/>This means: Hard linebreaks, fixed column limit, no special chars, no tabs.</span>');
131 marketform.append('<h3>Submit</h3><input type="submit" value="Send" />');
132 container.append(marketform);
133 replaceContent(container);
134 $("form#marketform").submit(function() {
135 var description = $("#description").attr('value');
136 var price = $("#price").attr('value');
137 var content = $("#content").attr('value');
138 $.ajax({
139 type: "POST",
140 url: "/json/marketsubmission",
141 data: "description=" + description + "&price=" + price + "&content=" + content,
142 complete: function() {
143 $("form#marketform").hide();
144 var container = $(document.createElement('div'));
145 container.html("<h3>Submission successful</h3>");
146 replaceContent(container);
147 $("#rwthpage").effect("highlight", {color: '#FFADAD'}, 1000);
148 }
149 });
150 return false;
151 });
152 },
153
154 }
155
156 function replaceContent(newContent, onComplete) {
157 var div;
158 if(typeof(newContent) == 'string') {
159 div = $(document.createElement('div'));
160 div.html(newContent);
161 }
162 else {
163 if(newContent != "")
164 div = newContent;
165 }
166
167 div.addClass('rwthpage');
168 $(document.body).append(div);
169 $("#rwthpage").replaceWith(div);
170 div.attr("id", "rwthpage");
171
172 $("#rwthpage a").click(linkClickHandler);
173 if(timerid > -1)
174 $("#rwthpage").effect("highlight", {color: '#FFADAD'}, 1000);
175
176 }
177
178 var pageRequests = new Array();
179
180 function linkClickHandler(ev) {
181 var url = ev.target.href;
182 var sposition = $(window).scrollTop();
183 hash = url.replace(/.*#/, '');
184 clearInterval(timerid);
185 timerid = -1;
186
187 if(url.search('/json/') >= 0) {
188 $.get(url, { }, function (result, status) {
189 url = url.replace(/^http:\/\/.+\//, '');
190 url = url.replace(/#.*/, '');
191 if(url.search('score') >= 0)
192 timerid = setInterval(function() { linkClickHandler(ev);}, 5000);
193
194 if(handlers[url]) {
195 handlers[url](result);
196 } else {
197 replaceContent(result);
198 }
199 }, 'json');
200 } else if (url.search('/txt/') >= 0) {
201 url = url.replace(/^http:\/\/.+\//, 'txt/');
202 url = url.replace(/#.*/, '');
203 var pre = $(document.createElement('pre'));
204 pre.load(url);
205 $("#rwthpage").html(pre);
206 } else {
207 url = url.replace(/^http:\/\/.+\//, 'static/');
208 url = url.replace(/#.*/, '');
209 $("#rwthpage").load(url);
210 }
211
212 $(window).scrollTop(sposition);
213 window.location.hash = hash;
214 $('td.current:first').attr("class","");
215 $('a[id=#'+hash+']:first').parent().attr("class","current");
216 return false;
217 }
218
219 $(document).ready( function() {
220 $("#nav > table > tbody > tr > td > a").click(linkClickHandler);
221 var hash = window.location.hash;
222 if(hash != '') {
223 $('a[id='+ hash + ']:first').click();
224 } else {
225 $('a[id=#news]:first').click();
226 }
227 });