240 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
CTFd._internal.challenge.data = undefined
 | 
						|
 | 
						|
CTFd._internal.challenge.renderer = null;
 | 
						|
 | 
						|
CTFd._internal.challenge.preRender = function () {
 | 
						|
}
 | 
						|
 | 
						|
CTFd._internal.challenge.render = null;
 | 
						|
 | 
						|
CTFd._internal.challenge.postRender = function () {
 | 
						|
    loadInfo();
 | 
						|
}
 | 
						|
 | 
						|
if (window.$ === undefined) window.$ = CTFd.lib.$;
 | 
						|
 | 
						|
function loadInfo() {
 | 
						|
    var challenge_id = CTFd._internal.challenge.data.id;
 | 
						|
    var url = "/api/v1/plugins/ctfd-whale/container?challenge_id=" + challenge_id;
 | 
						|
 | 
						|
    CTFd.fetch(url, {
 | 
						|
        method: 'GET',
 | 
						|
        credentials: 'same-origin',
 | 
						|
        headers: {
 | 
						|
            'Accept': 'application/json',
 | 
						|
            'Content-Type': 'application/json'
 | 
						|
        }
 | 
						|
    }).then(function (response) {
 | 
						|
        if (response.status === 429) {
 | 
						|
            // User was ratelimited but process response
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        if (response.status === 403) {
 | 
						|
            // User is not logged in or CTF is paused.
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        return response.json();
 | 
						|
    }).then(function (response) {
 | 
						|
        if (window.t !== undefined) {
 | 
						|
            clearInterval(window.t);
 | 
						|
            window.t = undefined;
 | 
						|
        }
 | 
						|
        if (response.success) response = response.data;
 | 
						|
        else CTFd._functions.events.eventAlert({
 | 
						|
            title: "Fail",
 | 
						|
            html: response.message,
 | 
						|
            button: "OK"
 | 
						|
        });
 | 
						|
        if (response.remaining_time != undefined) {
 | 
						|
            $('#whale-challenge-user-access').html(response.user_access);
 | 
						|
            $('#whale-challenge-lan-domain').html(response.lan_domain);
 | 
						|
            $('#whale-challenge-count-down').text(response.remaining_time);
 | 
						|
            $('#whale-panel-stopped').hide();
 | 
						|
            $('#whale-panel-started').show();
 | 
						|
 | 
						|
            window.t = setInterval(() => {
 | 
						|
                const c = $('#whale-challenge-count-down').text();
 | 
						|
                if (!c) return;
 | 
						|
                let second = parseInt(c) - 1;
 | 
						|
                if (second <= 0) {
 | 
						|
                    loadInfo();
 | 
						|
                }
 | 
						|
                $('#whale-challenge-count-down').text(second);
 | 
						|
            }, 1000);
 | 
						|
        } else {
 | 
						|
            $('#whale-panel-started').hide();
 | 
						|
            $('#whale-panel-stopped').show();
 | 
						|
        }
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
CTFd._internal.challenge.destroy = function () {
 | 
						|
    var challenge_id = CTFd._internal.challenge.data.id;
 | 
						|
    var url = "/api/v1/plugins/ctfd-whale/container?challenge_id=" + challenge_id;
 | 
						|
 | 
						|
    $('#whale-button-destroy').text("Waiting...");
 | 
						|
    $('#whale-button-destroy').prop('disabled', true);
 | 
						|
 | 
						|
    var params = {};
 | 
						|
 | 
						|
    CTFd.fetch(url, {
 | 
						|
        method: 'DELETE',
 | 
						|
        credentials: 'same-origin',
 | 
						|
        headers: {
 | 
						|
            'Accept': 'application/json',
 | 
						|
            'Content-Type': 'application/json'
 | 
						|
        },
 | 
						|
        body: JSON.stringify(params)
 | 
						|
    }).then(function (response) {
 | 
						|
        if (response.status === 429) {
 | 
						|
            // User was ratelimited but process response
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        if (response.status === 403) {
 | 
						|
            // User is not logged in or CTF is paused.
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        return response.json();
 | 
						|
    }).then(function (response) {
 | 
						|
        if (response.success) {
 | 
						|
            loadInfo();
 | 
						|
            CTFd._functions.events.eventAlert({
 | 
						|
                title: "Success",
 | 
						|
                html: "Your instance has been destroyed!",
 | 
						|
                button: "OK"
 | 
						|
            });
 | 
						|
        } else {
 | 
						|
            CTFd._functions.events.eventAlert({
 | 
						|
                title: "Fail",
 | 
						|
                html: response.message,
 | 
						|
                button: "OK"
 | 
						|
            });
 | 
						|
        }
 | 
						|
    }).finally(() => {
 | 
						|
        $('#whale-button-destroy').text("Destroy this instance");
 | 
						|
        $('#whale-button-destroy').prop('disabled', false);
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
CTFd._internal.challenge.renew = function () {
 | 
						|
    var challenge_id = CTFd._internal.challenge.data.id;
 | 
						|
    var url = "/api/v1/plugins/ctfd-whale/container?challenge_id=" + challenge_id;
 | 
						|
 | 
						|
    $('#whale-button-renew').text("Waiting...");
 | 
						|
    $('#whale-button-renew').prop('disabled', true);
 | 
						|
 | 
						|
    var params = {};
 | 
						|
 | 
						|
    CTFd.fetch(url, {
 | 
						|
        method: 'PATCH',
 | 
						|
        credentials: 'same-origin',
 | 
						|
        headers: {
 | 
						|
            'Accept': 'application/json',
 | 
						|
            'Content-Type': 'application/json'
 | 
						|
        },
 | 
						|
        body: JSON.stringify(params)
 | 
						|
    }).then(function (response) {
 | 
						|
        if (response.status === 429) {
 | 
						|
            // User was ratelimited but process response
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        if (response.status === 403) {
 | 
						|
            // User is not logged in or CTF is paused.
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        return response.json();
 | 
						|
    }).then(function (response) {
 | 
						|
        if (response.success) {
 | 
						|
            loadInfo();
 | 
						|
            CTFd._functions.events.eventAlert({
 | 
						|
                title: "Success",
 | 
						|
                html: "Your instance has been renewed!",
 | 
						|
                button: "OK"
 | 
						|
            });
 | 
						|
        } else {
 | 
						|
            CTFd._functions.events.eventAlert({
 | 
						|
                title: "Fail",
 | 
						|
                html: response.message,
 | 
						|
                button: "OK"
 | 
						|
            });
 | 
						|
        }
 | 
						|
    }).finally(() => {
 | 
						|
        $('#whale-button-renew').text("Renew this instance");
 | 
						|
        $('#whale-button-renew').prop('disabled', false);
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
CTFd._internal.challenge.boot = function () {
 | 
						|
    var challenge_id = CTFd._internal.challenge.data.id;
 | 
						|
    var url = "/api/v1/plugins/ctfd-whale/container?challenge_id=" + challenge_id;
 | 
						|
 | 
						|
    $('#whale-button-boot').text("Waiting...");
 | 
						|
    $('#whale-button-boot').prop('disabled', true);
 | 
						|
 | 
						|
    var params = {};
 | 
						|
 | 
						|
    CTFd.fetch(url, {
 | 
						|
        method: 'POST',
 | 
						|
        credentials: 'same-origin',
 | 
						|
        headers: {
 | 
						|
            'Accept': 'application/json',
 | 
						|
            'Content-Type': 'application/json'
 | 
						|
        },
 | 
						|
        body: JSON.stringify(params)
 | 
						|
    }).then(function (response) {
 | 
						|
        if (response.status === 429) {
 | 
						|
            // User was ratelimited but process response
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        if (response.status === 403) {
 | 
						|
            // User is not logged in or CTF is paused.
 | 
						|
            return response.json();
 | 
						|
        }
 | 
						|
        return response.json();
 | 
						|
    }).then(function (response) {
 | 
						|
        if (response.success) {
 | 
						|
            loadInfo();
 | 
						|
            CTFd._functions.events.eventAlert({
 | 
						|
                title: "Success",
 | 
						|
                html: "Your instance has been deployed!",
 | 
						|
                button: "OK"
 | 
						|
            });
 | 
						|
        } else {
 | 
						|
            CTFd._functions.events.eventAlert({
 | 
						|
                title: "Fail",
 | 
						|
                html: response.message,
 | 
						|
                button: "OK"
 | 
						|
            });
 | 
						|
        }
 | 
						|
    }).finally(() => {
 | 
						|
        $('#whale-button-boot').text("Launch an instance");
 | 
						|
        $('#whale-button-boot').prop('disabled', false);
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
CTFd._internal.challenge.submit = function (preview) {
 | 
						|
    var challenge_id = CTFd._internal.challenge.data.id;
 | 
						|
    var submission = $('#challenge-input').val()
 | 
						|
 | 
						|
    var body = {
 | 
						|
        'challenge_id': challenge_id,
 | 
						|
        'submission': submission,
 | 
						|
    }
 | 
						|
    var params = {}
 | 
						|
    if (preview)
 | 
						|
        params['preview'] = true
 | 
						|
 | 
						|
    return CTFd.api.post_challenge_attempt(params, body).then(function (response) {
 | 
						|
        if (response.status === 429) {
 | 
						|
            // User was ratelimited but process response
 | 
						|
            return response
 | 
						|
        }
 | 
						|
        if (response.status === 403) {
 | 
						|
            // User is not logged in or CTF is paused.
 | 
						|
            return response
 | 
						|
        }
 | 
						|
        return response
 | 
						|
    })
 | 
						|
};
 |