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 });