diff --git a/CTFd/themes/admin/assets/js/pages/challenge.js b/CTFd/themes/admin/assets/js/pages/challenge.js index 6a37d50e..e88130d9 100644 --- a/CTFd/themes/admin/assets/js/pages/challenge.js +++ b/CTFd/themes/admin/assets/js/pages/challenge.js @@ -16,111 +16,7 @@ import TagsList from "../components/tags/TagsList.vue"; import ChallengeFilesList from "../components/files/ChallengeFilesList.vue"; import HintsList from "../components/hints/HintsList.vue"; import NextChallenge from "../components/next/NextChallenge.vue"; -import hljs from "highlight.js"; -const displayHint = data => { - ezAlert({ - title: "Hint", - body: data.html, - button: "Got it!" - }); -}; - -const loadHint = id => { - CTFd.api.get_hint({ hintId: id, preview: true }).then(response => { - if (response.data.content) { - displayHint(response.data); - return; - } - // displayUnlock(id); - }); -}; - -function renderSubmissionResponse(response, cb) { - var result = response.data; - - var result_message = $("#result-message"); - var result_notification = $("#result-notification"); - var answer_input = $("#submission-input"); - result_notification.removeClass(); - result_message.text(result.message); - - if (result.status === "authentication_required") { - window.location = - CTFd.config.urlRoot + - "/login?next=" + - CTFd.config.urlRoot + - window.location.pathname + - window.location.hash; - return; - } else if (result.status === "incorrect") { - // Incorrect key - result_notification.addClass( - "alert alert-danger alert-dismissable text-center" - ); - result_notification.slideDown(); - - answer_input.removeClass("correct"); - answer_input.addClass("wrong"); - setTimeout(function() { - answer_input.removeClass("wrong"); - }, 3000); - } else if (result.status === "correct") { - // Challenge Solved - result_notification.addClass( - "alert alert-success alert-dismissable text-center" - ); - result_notification.slideDown(); - - $(".challenge-solves").text( - parseInt( - $(".challenge-solves") - .text() - .split(" ")[0] - ) + - 1 + - " Solves" - ); - - answer_input.val(""); - answer_input.removeClass("wrong"); - answer_input.addClass("correct"); - } else if (result.status === "already_solved") { - // Challenge already solved - result_notification.addClass( - "alert alert-info alert-dismissable text-center" - ); - result_notification.slideDown(); - - answer_input.addClass("correct"); - } else if (result.status === "paused") { - // CTF is paused - result_notification.addClass( - "alert alert-warning alert-dismissable text-center" - ); - result_notification.slideDown(); - } else if (result.status === "ratelimited") { - // Keys per minute too high - result_notification.addClass( - "alert alert-warning alert-dismissable text-center" - ); - result_notification.slideDown(); - - answer_input.addClass("too-fast"); - setTimeout(function() { - answer_input.removeClass("too-fast"); - }, 3000); - } - setTimeout(function() { - $(".alert").slideUp(); - $("#challenge-submit").removeClass("disabled-button"); - $("#challenge-submit").prop("disabled", false); - }, 3000); - - if (cb) { - cb(result); - } -} function loadChalTemplate(challenge) { CTFd._internal.challenge = {}; @@ -244,87 +140,9 @@ function handleChallengeOptions(event) { $(() => { $(".preview-challenge").click(function(_e) { - CTFd._internal.challenge = {}; - $.get( - CTFd.config.urlRoot + "/api/v1/challenges/" + window.CHALLENGE_ID, - function(response) { - // Preview should not show any solves - var challenge_data = response.data; - challenge_data["solves"] = null; - - $.getScript( - CTFd.config.urlRoot + challenge_data.type_data.scripts.view, - function() { - const challenge = CTFd._internal.challenge; - - // Inject challenge data into the plugin - challenge.data = response.data; - - $("#challenge-window").empty(); - - // Call preRender function in plugin - challenge.preRender(); - - $("#challenge-window").append(challenge_data.view); - - $("#challenge-window #challenge-input").addClass("form-control"); - $("#challenge-window #challenge-submit").addClass( - "btn btn-md btn-outline-secondary float-right" - ); - - $(".challenge-solves").hide(); - $(".nav-tabs a").click(function(e) { - e.preventDefault(); - $(this).tab("show"); - }); - - // Handle modal toggling - $("#challenge-window").on("hide.bs.modal", function(_event) { - $("#challenge-input").removeClass("wrong"); - $("#challenge-input").removeClass("correct"); - $("#incorrect-key").slideUp(); - $("#correct-key").slideUp(); - $("#already-solved").slideUp(); - $("#too-fast").slideUp(); - }); - - $(".load-hint").on("click", function(_event) { - loadHint($(this).data("hint-id")); - }); - - $("#challenge-submit").click(function(e) { - e.preventDefault(); - $("#challenge-submit").addClass("disabled-button"); - $("#challenge-submit").prop("disabled", true); - CTFd._internal.challenge - .submit(true) - .then(renderSubmissionResponse); - // Preview passed as true - }); - - $("#challenge-input").keyup(function(event) { - if (event.keyCode == 13) { - $("#challenge-submit").click(); - } - }); - - challenge.postRender(); - - $("#challenge-window") - .find("pre code") - .each(function(_idx) { - hljs.highlightBlock(this); - }); - - window.location.replace( - window.location.href.split("#")[0] + "#preview" - ); - - $("#challenge-window").modal(); - } - ); - } - ); + let url = `${CTFd.config.urlRoot}/admin/challenges/preview/${window.CHALLENGE_ID}`; + $("#challenge-window").html(``); + $("#challenge-modal").modal(); }); $(".comments-challenge").click(function(_event) { diff --git a/CTFd/themes/admin/static/js/pages/challenge.dev.js b/CTFd/themes/admin/static/js/pages/challenge.dev.js index 8bb74a04..e0f5520a 100644 --- a/CTFd/themes/admin/static/js/pages/challenge.dev.js +++ b/CTFd/themes/admin/static/js/pages/challenge.dev.js @@ -162,7 +162,7 @@ /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _helpers = _interopRequireDefault(__webpack_require__(/*! core/helpers */ \"./CTFd/themes/core/assets/js/helpers.js\"));\n\nvar _styles = __webpack_require__(/*! ../styles */ \"./CTFd/themes/admin/assets/js/styles.js\");\n\nvar _vueEsm = _interopRequireDefault(__webpack_require__(/*! vue/dist/vue.esm.browser */ \"./node_modules/vue/dist/vue.esm.browser.js\"));\n\nvar _CommentBox = _interopRequireDefault(__webpack_require__(/*! ../components/comments/CommentBox.vue */ \"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue\"));\n\nvar _FlagList = _interopRequireDefault(__webpack_require__(/*! ../components/flags/FlagList.vue */ \"./CTFd/themes/admin/assets/js/components/flags/FlagList.vue\"));\n\nvar _Requirements = _interopRequireDefault(__webpack_require__(/*! ../components/requirements/Requirements.vue */ \"./CTFd/themes/admin/assets/js/components/requirements/Requirements.vue\"));\n\nvar _TopicsList = _interopRequireDefault(__webpack_require__(/*! ../components/topics/TopicsList.vue */ \"./CTFd/themes/admin/assets/js/components/topics/TopicsList.vue\"));\n\nvar _TagsList = _interopRequireDefault(__webpack_require__(/*! ../components/tags/TagsList.vue */ \"./CTFd/themes/admin/assets/js/components/tags/TagsList.vue\"));\n\nvar _ChallengeFilesList = _interopRequireDefault(__webpack_require__(/*! ../components/files/ChallengeFilesList.vue */ \"./CTFd/themes/admin/assets/js/components/files/ChallengeFilesList.vue\"));\n\nvar _HintsList = _interopRequireDefault(__webpack_require__(/*! ../components/hints/HintsList.vue */ \"./CTFd/themes/admin/assets/js/components/hints/HintsList.vue\"));\n\nvar _NextChallenge = _interopRequireDefault(__webpack_require__(/*! ../components/next/NextChallenge.vue */ \"./CTFd/themes/admin/assets/js/components/next/NextChallenge.vue\"));\n\nvar _highlight = _interopRequireDefault(__webpack_require__(/*! highlight.js */ \"./node_modules/highlight.js/lib/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: data.html,\n button: \"Got it!\"\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd[\"default\"].api.get_hint({\n hintId: id,\n preview: true\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n } // displayUnlock(id);\n\n });\n};\n\nfunction renderSubmissionResponse(response, cb) {\n var result = response.data;\n var result_message = (0, _jquery[\"default\"])(\"#result-message\");\n var result_notification = (0, _jquery[\"default\"])(\"#result-notification\");\n var answer_input = (0, _jquery[\"default\"])(\"#submission-input\");\n result_notification.removeClass();\n result_message.text(result.message);\n\n if (result.status === \"authentication_required\") {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/login?next=\" + _CTFd[\"default\"].config.urlRoot + window.location.pathname + window.location.hash;\n return;\n } else if (result.status === \"incorrect\") {\n // Incorrect key\n result_notification.addClass(\"alert alert-danger alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.removeClass(\"correct\");\n answer_input.addClass(\"wrong\");\n setTimeout(function () {\n answer_input.removeClass(\"wrong\");\n }, 3000);\n } else if (result.status === \"correct\") {\n // Challenge Solved\n result_notification.addClass(\"alert alert-success alert-dismissable text-center\");\n result_notification.slideDown();\n (0, _jquery[\"default\"])(\".challenge-solves\").text(parseInt((0, _jquery[\"default\"])(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\n answer_input.val(\"\");\n answer_input.removeClass(\"wrong\");\n answer_input.addClass(\"correct\");\n } else if (result.status === \"already_solved\") {\n // Challenge already solved\n result_notification.addClass(\"alert alert-info alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"correct\");\n } else if (result.status === \"paused\") {\n // CTF is paused\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n } else if (result.status === \"ratelimited\") {\n // Keys per minute too high\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"too-fast\");\n setTimeout(function () {\n answer_input.removeClass(\"too-fast\");\n }, 3000);\n }\n\n setTimeout(function () {\n (0, _jquery[\"default\"])(\".alert\").slideUp();\n (0, _jquery[\"default\"])(\"#challenge-submit\").removeClass(\"disabled-button\");\n (0, _jquery[\"default\"])(\"#challenge-submit\").prop(\"disabled\", false);\n }, 3000);\n\n if (cb) {\n cb(result);\n }\n}\n\nfunction loadChalTemplate(challenge) {\n _CTFd[\"default\"]._internal.challenge = {};\n\n _jquery[\"default\"].getScript(_CTFd[\"default\"].config.urlRoot + challenge.scripts.view, function () {\n var template_data = challenge.create;\n (0, _jquery[\"default\"])(\"#create-chal-entry-div\").html(template_data);\n (0, _styles.bindMarkdownEditors)();\n\n _jquery[\"default\"].getScript(_CTFd[\"default\"].config.urlRoot + challenge.scripts.create, function () {\n (0, _jquery[\"default\"])(\"#create-chal-entry-div form\").submit(function (event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#create-chal-entry-div form\").serializeJSON();\n\n _CTFd[\"default\"].fetch(\"/api/v1/challenges\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery[\"default\"])(\"#challenge-create-options #challenge_id\").val(response.data.id);\n (0, _jquery[\"default\"])(\"#challenge-create-options\").modal();\n } else {\n var body = \"\";\n\n for (var k in response.errors) {\n body += response.errors[k].join(\"\\n\");\n body += \"\\n\";\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: body,\n button: \"OK\"\n });\n }\n });\n });\n });\n });\n}\n\nfunction handleChallengeOptions(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(event.target).serializeJSON(true);\n var flag_params = {\n challenge_id: params.challenge_id,\n content: params.flag || \"\",\n type: params.flag_type,\n data: params.flag_data ? params.flag_data : \"\"\n }; // Define a save_challenge function\n\n var save_challenge = function save_challenge() {\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + params.challenge_id, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n state: params.state\n })\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n setTimeout(function () {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/challenges/\" + params.challenge_id;\n }, 700);\n }\n });\n };\n\n Promise.all([// Save flag\n new Promise(function (resolve, _reject) {\n if (flag_params.content.length == 0) {\n resolve();\n return;\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/flags\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(flag_params)\n }).then(function (response) {\n resolve(response.json());\n });\n }), // Upload files\n new Promise(function (resolve, _reject) {\n var form = event.target;\n var data = {\n challenge: params.challenge_id,\n type: \"challenge\"\n };\n var filepath = (0, _jquery[\"default\"])(form.elements[\"file\"]).val();\n\n if (filepath) {\n _helpers[\"default\"].files.upload(form, data);\n }\n\n resolve();\n })]).then(function (_responses) {\n save_challenge();\n });\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\".preview-challenge\").click(function (_e) {\n _CTFd[\"default\"]._internal.challenge = {};\n\n _jquery[\"default\"].get(_CTFd[\"default\"].config.urlRoot + \"/api/v1/challenges/\" + window.CHALLENGE_ID, function (response) {\n // Preview should not show any solves\n var challenge_data = response.data;\n challenge_data[\"solves\"] = null;\n\n _jquery[\"default\"].getScript(_CTFd[\"default\"].config.urlRoot + challenge_data.type_data.scripts.view, function () {\n var challenge = _CTFd[\"default\"]._internal.challenge; // Inject challenge data into the plugin\n\n challenge.data = response.data;\n (0, _jquery[\"default\"])(\"#challenge-window\").empty(); // Call preRender function in plugin\n\n challenge.preRender();\n (0, _jquery[\"default\"])(\"#challenge-window\").append(challenge_data.view);\n (0, _jquery[\"default\"])(\"#challenge-window #challenge-input\").addClass(\"form-control\");\n (0, _jquery[\"default\"])(\"#challenge-window #challenge-submit\").addClass(\"btn btn-md btn-outline-secondary float-right\");\n (0, _jquery[\"default\"])(\".challenge-solves\").hide();\n (0, _jquery[\"default\"])(\".nav-tabs a\").click(function (e) {\n e.preventDefault();\n (0, _jquery[\"default\"])(this).tab(\"show\");\n }); // Handle modal toggling\n\n (0, _jquery[\"default\"])(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery[\"default\"])(\"#incorrect-key\").slideUp();\n (0, _jquery[\"default\"])(\"#correct-key\").slideUp();\n (0, _jquery[\"default\"])(\"#already-solved\").slideUp();\n (0, _jquery[\"default\"])(\"#too-fast\").slideUp();\n });\n (0, _jquery[\"default\"])(\".load-hint\").on(\"click\", function (_event) {\n loadHint((0, _jquery[\"default\"])(this).data(\"hint-id\"));\n });\n (0, _jquery[\"default\"])(\"#challenge-submit\").click(function (e) {\n e.preventDefault();\n (0, _jquery[\"default\"])(\"#challenge-submit\").addClass(\"disabled-button\");\n (0, _jquery[\"default\"])(\"#challenge-submit\").prop(\"disabled\", true);\n\n _CTFd[\"default\"]._internal.challenge.submit(true).then(renderSubmissionResponse); // Preview passed as true\n\n });\n (0, _jquery[\"default\"])(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery[\"default\"])(\"#challenge-submit\").click();\n }\n });\n challenge.postRender();\n (0, _jquery[\"default\"])(\"#challenge-window\").find(\"pre code\").each(function (_idx) {\n _highlight[\"default\"].highlightBlock(this);\n });\n window.location.replace(window.location.href.split(\"#\")[0] + \"#preview\");\n (0, _jquery[\"default\"])(\"#challenge-window\").modal();\n });\n });\n });\n (0, _jquery[\"default\"])(\".comments-challenge\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#challenge-comments-window\").modal();\n });\n (0, _jquery[\"default\"])(\".delete-challenge\").click(function (_e) {\n (0, _ezq.ezQuery)({\n title: \"Delete Challenge\",\n body: \"Are you sure you want to delete {0}\".format(\"\" + (0, _utils.htmlEntities)(window.CHALLENGE_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/challenges\";\n }\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\"#challenge-update-container > form\").submit(function (e) {\n e.preventDefault();\n var params = (0, _jquery[\"default\"])(e.target).serializeJSON(true);\n\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID + \"/flags\", {\n method: \"GET\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n var update_challenge = function update_challenge() {\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery[\"default\"])(\".challenge-state\").text(response.data.state);\n\n switch (response.data.state) {\n case \"visible\":\n (0, _jquery[\"default\"])(\".challenge-state\").removeClass(\"badge-danger\").addClass(\"badge-success\");\n break;\n\n case \"hidden\":\n (0, _jquery[\"default\"])(\".challenge-state\").removeClass(\"badge-success\").addClass(\"badge-danger\");\n break;\n\n default:\n break;\n }\n\n (0, _ezq.ezToast)({\n title: \"Success\",\n body: \"Your challenge has been updated!\"\n });\n } else {\n var body = \"\";\n\n for (var k in response.errors) {\n body += response.errors[k].join(\"\\n\");\n body += \"\\n\";\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: body,\n button: \"OK\"\n });\n }\n });\n }; // Check if the challenge doesn't have any flags before marking visible\n\n\n if (response.data.length === 0 && params.state === \"visible\") {\n (0, _ezq.ezQuery)({\n title: \"Missing Flags\",\n body: \"This challenge does not have any flags meaning it may be unsolveable. Are you sure you'd like to update this challenge?\",\n success: update_challenge\n });\n } else {\n update_challenge();\n }\n });\n });\n (0, _jquery[\"default\"])(\"#challenge-create-options form\").submit(handleChallengeOptions); // Load FlagList component\n\n if (document.querySelector(\"#challenge-flags\")) {\n var flagList = _vueEsm[\"default\"].extend(_FlagList[\"default\"]);\n\n var vueContainer = document.createElement(\"div\");\n document.querySelector(\"#challenge-flags\").appendChild(vueContainer);\n new flagList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(vueContainer);\n } // Load TopicsList component\n\n\n if (document.querySelector(\"#challenge-topics\")) {\n var topicsList = _vueEsm[\"default\"].extend(_TopicsList[\"default\"]);\n\n var _vueContainer = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-topics\").appendChild(_vueContainer);\n new topicsList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer);\n } // Load TagsList component\n\n\n if (document.querySelector(\"#challenge-tags\")) {\n var tagList = _vueEsm[\"default\"].extend(_TagsList[\"default\"]);\n\n var _vueContainer2 = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-tags\").appendChild(_vueContainer2);\n new tagList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer2);\n } // Load Requirements component\n\n\n if (document.querySelector(\"#prerequisite-add-form\")) {\n var reqsComponent = _vueEsm[\"default\"].extend(_Requirements[\"default\"]);\n\n var _vueContainer3 = document.createElement(\"div\");\n\n document.querySelector(\"#prerequisite-add-form\").appendChild(_vueContainer3);\n new reqsComponent({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer3);\n } // Load ChallengeFilesList component\n\n\n if (document.querySelector(\"#challenge-files\")) {\n var challengeFilesList = _vueEsm[\"default\"].extend(_ChallengeFilesList[\"default\"]);\n\n var _vueContainer4 = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-files\").appendChild(_vueContainer4);\n new challengeFilesList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer4);\n } // Load HintsList component\n\n\n if (document.querySelector(\"#challenge-hints\")) {\n var hintsList = _vueEsm[\"default\"].extend(_HintsList[\"default\"]);\n\n var _vueContainer5 = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-hints\").appendChild(_vueContainer5);\n new hintsList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer5);\n } // Load Next component\n\n\n if (document.querySelector(\"#next-add-form\")) {\n var nextChallenge = _vueEsm[\"default\"].extend(_NextChallenge[\"default\"]);\n\n var _vueContainer6 = document.createElement(\"div\");\n\n document.querySelector(\"#next-add-form\").appendChild(_vueContainer6);\n new nextChallenge({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer6);\n } // Because this JS is shared by a few pages,\n // we should only insert the CommentBox if it's actually in use\n\n\n if (document.querySelector(\"#comment-box\")) {\n // Insert CommentBox element\n var commentBox = _vueEsm[\"default\"].extend(_CommentBox[\"default\"]);\n\n var _vueContainer7 = document.createElement(\"div\");\n\n document.querySelector(\"#comment-box\").appendChild(_vueContainer7);\n new commentBox({\n propsData: {\n type: \"challenge\",\n id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer7);\n }\n\n _jquery[\"default\"].get(_CTFd[\"default\"].config.urlRoot + \"/api/v1/challenges/types\", function (response) {\n var data = response.data;\n loadChalTemplate(data[\"standard\"]);\n (0, _jquery[\"default\"])(\"#create-chals-select input[name=type]\").change(function () {\n var challenge = data[this.value];\n loadChalTemplate(challenge);\n });\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/challenge.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _helpers = _interopRequireDefault(__webpack_require__(/*! core/helpers */ \"./CTFd/themes/core/assets/js/helpers.js\"));\n\nvar _styles = __webpack_require__(/*! ../styles */ \"./CTFd/themes/admin/assets/js/styles.js\");\n\nvar _vueEsm = _interopRequireDefault(__webpack_require__(/*! vue/dist/vue.esm.browser */ \"./node_modules/vue/dist/vue.esm.browser.js\"));\n\nvar _CommentBox = _interopRequireDefault(__webpack_require__(/*! ../components/comments/CommentBox.vue */ \"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue\"));\n\nvar _FlagList = _interopRequireDefault(__webpack_require__(/*! ../components/flags/FlagList.vue */ \"./CTFd/themes/admin/assets/js/components/flags/FlagList.vue\"));\n\nvar _Requirements = _interopRequireDefault(__webpack_require__(/*! ../components/requirements/Requirements.vue */ \"./CTFd/themes/admin/assets/js/components/requirements/Requirements.vue\"));\n\nvar _TopicsList = _interopRequireDefault(__webpack_require__(/*! ../components/topics/TopicsList.vue */ \"./CTFd/themes/admin/assets/js/components/topics/TopicsList.vue\"));\n\nvar _TagsList = _interopRequireDefault(__webpack_require__(/*! ../components/tags/TagsList.vue */ \"./CTFd/themes/admin/assets/js/components/tags/TagsList.vue\"));\n\nvar _ChallengeFilesList = _interopRequireDefault(__webpack_require__(/*! ../components/files/ChallengeFilesList.vue */ \"./CTFd/themes/admin/assets/js/components/files/ChallengeFilesList.vue\"));\n\nvar _HintsList = _interopRequireDefault(__webpack_require__(/*! ../components/hints/HintsList.vue */ \"./CTFd/themes/admin/assets/js/components/hints/HintsList.vue\"));\n\nvar _NextChallenge = _interopRequireDefault(__webpack_require__(/*! ../components/next/NextChallenge.vue */ \"./CTFd/themes/admin/assets/js/components/next/NextChallenge.vue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction loadChalTemplate(challenge) {\n _CTFd[\"default\"]._internal.challenge = {};\n\n _jquery[\"default\"].getScript(_CTFd[\"default\"].config.urlRoot + challenge.scripts.view, function () {\n var template_data = challenge.create;\n (0, _jquery[\"default\"])(\"#create-chal-entry-div\").html(template_data);\n (0, _styles.bindMarkdownEditors)();\n\n _jquery[\"default\"].getScript(_CTFd[\"default\"].config.urlRoot + challenge.scripts.create, function () {\n (0, _jquery[\"default\"])(\"#create-chal-entry-div form\").submit(function (event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#create-chal-entry-div form\").serializeJSON();\n\n _CTFd[\"default\"].fetch(\"/api/v1/challenges\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery[\"default\"])(\"#challenge-create-options #challenge_id\").val(response.data.id);\n (0, _jquery[\"default\"])(\"#challenge-create-options\").modal();\n } else {\n var body = \"\";\n\n for (var k in response.errors) {\n body += response.errors[k].join(\"\\n\");\n body += \"\\n\";\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: body,\n button: \"OK\"\n });\n }\n });\n });\n });\n });\n}\n\nfunction handleChallengeOptions(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(event.target).serializeJSON(true);\n var flag_params = {\n challenge_id: params.challenge_id,\n content: params.flag || \"\",\n type: params.flag_type,\n data: params.flag_data ? params.flag_data : \"\"\n }; // Define a save_challenge function\n\n var save_challenge = function save_challenge() {\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + params.challenge_id, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n state: params.state\n })\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n setTimeout(function () {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/challenges/\" + params.challenge_id;\n }, 700);\n }\n });\n };\n\n Promise.all([// Save flag\n new Promise(function (resolve, _reject) {\n if (flag_params.content.length == 0) {\n resolve();\n return;\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/flags\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(flag_params)\n }).then(function (response) {\n resolve(response.json());\n });\n }), // Upload files\n new Promise(function (resolve, _reject) {\n var form = event.target;\n var data = {\n challenge: params.challenge_id,\n type: \"challenge\"\n };\n var filepath = (0, _jquery[\"default\"])(form.elements[\"file\"]).val();\n\n if (filepath) {\n _helpers[\"default\"].files.upload(form, data);\n }\n\n resolve();\n })]).then(function (_responses) {\n save_challenge();\n });\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\".preview-challenge\").click(function (_e) {\n var url = \"\".concat(_CTFd[\"default\"].config.urlRoot, \"/admin/challenges/preview/\").concat(window.CHALLENGE_ID);\n (0, _jquery[\"default\"])(\"#challenge-window\").html(\"\"));\n (0, _jquery[\"default\"])(\"#challenge-modal\").modal();\n });\n (0, _jquery[\"default\"])(\".comments-challenge\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#challenge-comments-window\").modal();\n });\n (0, _jquery[\"default\"])(\".delete-challenge\").click(function (_e) {\n (0, _ezq.ezQuery)({\n title: \"Delete Challenge\",\n body: \"Are you sure you want to delete {0}\".format(\"\" + (0, _utils.htmlEntities)(window.CHALLENGE_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/challenges\";\n }\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\"#challenge-update-container > form\").submit(function (e) {\n e.preventDefault();\n var params = (0, _jquery[\"default\"])(e.target).serializeJSON(true);\n\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID + \"/flags\", {\n method: \"GET\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n var update_challenge = function update_challenge() {\n _CTFd[\"default\"].fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery[\"default\"])(\".challenge-state\").text(response.data.state);\n\n switch (response.data.state) {\n case \"visible\":\n (0, _jquery[\"default\"])(\".challenge-state\").removeClass(\"badge-danger\").addClass(\"badge-success\");\n break;\n\n case \"hidden\":\n (0, _jquery[\"default\"])(\".challenge-state\").removeClass(\"badge-success\").addClass(\"badge-danger\");\n break;\n\n default:\n break;\n }\n\n (0, _ezq.ezToast)({\n title: \"Success\",\n body: \"Your challenge has been updated!\"\n });\n } else {\n var body = \"\";\n\n for (var k in response.errors) {\n body += response.errors[k].join(\"\\n\");\n body += \"\\n\";\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: body,\n button: \"OK\"\n });\n }\n });\n }; // Check if the challenge doesn't have any flags before marking visible\n\n\n if (response.data.length === 0 && params.state === \"visible\") {\n (0, _ezq.ezQuery)({\n title: \"Missing Flags\",\n body: \"This challenge does not have any flags meaning it may be unsolveable. Are you sure you'd like to update this challenge?\",\n success: update_challenge\n });\n } else {\n update_challenge();\n }\n });\n });\n (0, _jquery[\"default\"])(\"#challenge-create-options form\").submit(handleChallengeOptions); // Load FlagList component\n\n if (document.querySelector(\"#challenge-flags\")) {\n var flagList = _vueEsm[\"default\"].extend(_FlagList[\"default\"]);\n\n var vueContainer = document.createElement(\"div\");\n document.querySelector(\"#challenge-flags\").appendChild(vueContainer);\n new flagList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(vueContainer);\n } // Load TopicsList component\n\n\n if (document.querySelector(\"#challenge-topics\")) {\n var topicsList = _vueEsm[\"default\"].extend(_TopicsList[\"default\"]);\n\n var _vueContainer = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-topics\").appendChild(_vueContainer);\n new topicsList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer);\n } // Load TagsList component\n\n\n if (document.querySelector(\"#challenge-tags\")) {\n var tagList = _vueEsm[\"default\"].extend(_TagsList[\"default\"]);\n\n var _vueContainer2 = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-tags\").appendChild(_vueContainer2);\n new tagList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer2);\n } // Load Requirements component\n\n\n if (document.querySelector(\"#prerequisite-add-form\")) {\n var reqsComponent = _vueEsm[\"default\"].extend(_Requirements[\"default\"]);\n\n var _vueContainer3 = document.createElement(\"div\");\n\n document.querySelector(\"#prerequisite-add-form\").appendChild(_vueContainer3);\n new reqsComponent({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer3);\n } // Load ChallengeFilesList component\n\n\n if (document.querySelector(\"#challenge-files\")) {\n var challengeFilesList = _vueEsm[\"default\"].extend(_ChallengeFilesList[\"default\"]);\n\n var _vueContainer4 = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-files\").appendChild(_vueContainer4);\n new challengeFilesList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer4);\n } // Load HintsList component\n\n\n if (document.querySelector(\"#challenge-hints\")) {\n var hintsList = _vueEsm[\"default\"].extend(_HintsList[\"default\"]);\n\n var _vueContainer5 = document.createElement(\"div\");\n\n document.querySelector(\"#challenge-hints\").appendChild(_vueContainer5);\n new hintsList({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer5);\n } // Load Next component\n\n\n if (document.querySelector(\"#next-add-form\")) {\n var nextChallenge = _vueEsm[\"default\"].extend(_NextChallenge[\"default\"]);\n\n var _vueContainer6 = document.createElement(\"div\");\n\n document.querySelector(\"#next-add-form\").appendChild(_vueContainer6);\n new nextChallenge({\n propsData: {\n challenge_id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer6);\n } // Because this JS is shared by a few pages,\n // we should only insert the CommentBox if it's actually in use\n\n\n if (document.querySelector(\"#comment-box\")) {\n // Insert CommentBox element\n var commentBox = _vueEsm[\"default\"].extend(_CommentBox[\"default\"]);\n\n var _vueContainer7 = document.createElement(\"div\");\n\n document.querySelector(\"#comment-box\").appendChild(_vueContainer7);\n new commentBox({\n propsData: {\n type: \"challenge\",\n id: window.CHALLENGE_ID\n }\n }).$mount(_vueContainer7);\n }\n\n _jquery[\"default\"].get(_CTFd[\"default\"].config.urlRoot + \"/api/v1/challenges/types\", function (response) {\n var data = response.data;\n loadChalTemplate(data[\"standard\"]);\n (0, _jquery[\"default\"])(\"#create-chals-select input[name=type]\").change(function () {\n var challenge = data[this.value];\n loadChalTemplate(challenge);\n });\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/challenge.js?"); /***/ }) diff --git a/CTFd/themes/admin/static/js/pages/challenge.min.js b/CTFd/themes/admin/static/js/pages/challenge.min.js index 2086187d..86f09a57 100644 --- a/CTFd/themes/admin/static/js/pages/challenge.min.js +++ b/CTFd/themes/admin/static/js/pages/challenge.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,n,i=e[0],o=e[1],a=e[2],r=0,s=[];r"+(0,g.htmlEntities)(window.CHALLENGE_NAME)+""),success:function(){y.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=y.default.config.urlRoot+"/admin/challenges")})}})}),(0,v.default)("#challenge-update-container > form").submit(function(e){e.preventDefault();var n=(0,v.default)(e.target).serializeJSON(!0);y.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID+"/flags",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){function t(){y.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(e){if(e.success){switch((0,v.default)(".challenge-state").text(e.data.state),e.data.state){case"visible":(0,v.default)(".challenge-state").removeClass("badge-danger").addClass("badge-success");break;case"hidden":(0,v.default)(".challenge-state").removeClass("badge-success").addClass("badge-danger")}(0,j.ezToast)({title:"Success",body:"Your challenge has been updated!"})}else{var t,n="";for(t in e.errors)n+=e.errors[t].join("\n"),n+="\n";(0,j.ezAlert)({title:"Error",body:n,button:"OK"})}})}0===e.data.length&&"visible"===n.state?(0,j.ezQuery)({title:"Missing Flags",body:"This challenge does not have any flags meaning it may be unsolveable. Are you sure you'd like to update this challenge?",success:t}):t()})}),(0,v.default)("#challenge-create-options form").submit(S),document.querySelector("#challenge-flags")&&(e=_.default.extend(T.default),t=document.createElement("div"),document.querySelector("#challenge-flags").appendChild(t),new e({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(t)),document.querySelector("#challenge-topics")&&(n=_.default.extend(C.default),i=document.createElement("div"),document.querySelector("#challenge-topics").appendChild(i),new n({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(i)),document.querySelector("#challenge-tags")&&(o=_.default.extend(E.default),a=document.createElement("div"),document.querySelector("#challenge-tags").appendChild(a),new o({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(a)),document.querySelector("#prerequisite-add-form")&&(r=_.default.extend(w.default),s=document.createElement("div"),document.querySelector("#prerequisite-add-form").appendChild(s),new r({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(s)),document.querySelector("#challenge-files")&&(d=_.default.extend(q.default),c=document.createElement("div"),document.querySelector("#challenge-files").appendChild(c),new d({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(c)),document.querySelector("#challenge-hints")&&(l=_.default.extend(I.default),p=document.createElement("div"),document.querySelector("#challenge-hints").appendChild(p),new l({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(p)),document.querySelector("#next-add-form")&&(u=_.default.extend(A.default),f=document.createElement("div"),document.querySelector("#next-add-form").appendChild(f),new u({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(f)),document.querySelector("#comment-box")&&(m=_.default.extend(b.default),h=document.createElement("div"),document.querySelector("#comment-box").appendChild(h),new m({propsData:{type:"challenge",id:window.CHALLENGE_ID}}).$mount(h)),v.default.get(y.default.config.urlRoot+"/api/v1/challenges/types",function(e){var t=e.data;k(t.standard),(0,v.default)("#create-chals-select input[name=type]").change(function(){k(t[this.value])})})})},"./CTFd/themes/admin/assets/js/pages/main.js":function(e,t,n){var i=f(n("./CTFd/themes/core/assets/js/CTFd.js")),o=f(n("./node_modules/jquery/dist/jquery.js")),a=f(n("./node_modules/dayjs/dayjs.min.js")),r=f(n("./node_modules/dayjs/plugin/advancedFormat.js")),s=f(n("./node_modules/nunjucks/browser/nunjucks.js")),d=n("./node_modules/howler/dist/howler.js"),c=f(n("./CTFd/themes/core/assets/js/events.js")),l=f(n("./CTFd/themes/core/assets/js/times.js")),p=f(n("./CTFd/themes/admin/assets/js/styles.js")),u=f(n("./CTFd/themes/core/assets/js/helpers.js"));function f(e){return e&&e.__esModule?e:{default:e}}a.default.extend(r.default),i.default.init(window.init),window.CTFd=i.default,window.helpers=u.default,window.$=o.default,window.dayjs=a.default,window.nunjucks=s.default,window.Howl=d.Howl,(0,o.default)(function(){(0,p.default)(),(0,l.default)(),(0,c.default)(i.default.config.urlRoot)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=l,t.bindMarkdownEditor=p,t.bindMarkdownEditors=u,t.default=void 0,n("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var i=n("./CTFd/themes/core/assets/js/utils.js"),o=c(n("./node_modules/jquery/dist/jquery.js")),a=c(n("./node_modules/easymde/src/js/easymde.js")),r=c(n("./node_modules/vue/dist/vue.esm.browser.js")),s=c(n("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(n("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=r.default.extend(s.default),n=document.createElement("div");document.querySelector("main").appendChild(n);var i=new t({propsData:{editor:e}}).$mount(n);(0,o.default)("#media-modal").on("hidden.bs.modal",function(e){i.$destroy(),(0,o.default)("#media-modal").remove()}),(0,o.default)("#media-modal").modal()}function p(e){var t;!1===e.hasOwnProperty("mde")&&(t=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){l(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,o.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,o.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,o.default)(e).val()),t.codemirror.refresh()}))}function u(){(0,o.default)("textarea.markdown").each(function(e,t){p(t)})}t.default=function(){(0,o.default)(":input").each(function(){(0,o.default)(this).data("initial",(0,o.default)(this).val())}),(0,o.default)(function(){(0,o.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,o.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,o.default)("[data-checkbox]").click(function(e){(0,o.default)(e.target).is("input[type=checkbox]")||(0,o.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,o.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,o.default)(this).prop("checked"),n=(0,o.default)(this).index()+1;(0,o.default)(this).closest("table").find("tr td:nth-child(".concat(n,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,o.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,o.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,o.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,o.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,o.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,o.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),u(),(0,i.makeSortableTables)(),(0,o.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=p(n("./node_modules/jquery/dist/jquery.js")),o=p(n("./node_modules/dayjs/dayjs.min.js")),a=p(n("./node_modules/markdown-it/index.js"));n("./CTFd/themes/core/assets/js/patch.js");var r=p(n("./CTFd/themes/core/assets/js/fetch.js")),s=p(n("./CTFd/themes/core/assets/js/config.js")),d=n("./CTFd/themes/core/assets/js/api.js"),c=p(n("./CTFd/themes/core/assets/js/ezq.js")),l=n("./CTFd/themes/core/assets/js/utils.js");function p(e){return e&&e.__esModule?e:{default:e}}function u(t,e){var n,i=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,n)),i}function f(o){for(var e=1;e".concat(e.body,"

")):n.find(".modal-body").append((0,s.default)(e.body));var i=(0,s.default)(p.format(e.button));return e.success&&(0,s.default)(i).click(function(){e.success()}),e.large&&n.find(".modal-dialog").addClass("modal-lg"),n.find(".modal-footer").append(i),n.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(n),n.modal("show"),(0,s.default)(n).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),n}function h(e){(0,s.default)("#ezq--notifications-toast-container").length||(0,s.default)("body").append((0,s.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t,n=d.format(e.title,e.body),i=(0,s.default)(n);e.onclose&&(0,s.default)(i).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick&&((t=(0,s.default)(i).find(".toast-body")).addClass("cursor-pointer"),t.click(function(){e.onclick()}));var o=!1!==e.autohide,a=!1!==e.animation,r=e.delay||1e4;return(0,s.default)("#ezq--notifications-toast-container").prepend(i),i.toast({autohide:o,delay:r,animation:a}),i.toast("show"),i}function g(e){var t=r.format(e.title),n=(0,s.default)(t);"string"==typeof e.body?n.find(".modal-body").append("

".concat(e.body,"

")):n.find(".modal-body").append((0,s.default)(e.body));var i=(0,s.default)(f),o=(0,s.default)(u);return n.find(".modal-footer").append(o),n.find(".modal-footer").append(i),n.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(n),(0,s.default)(n).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(i).click(function(){e.success()}),n.modal("show"),n}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var n=c.format(e.width),i=r.format(e.title),o=(0,s.default)(i);return o.find(".modal-body").append((0,s.default)(n)),(0,s.default)("main").append(o),o.modal("show")}function y(e){var t={success:l,error:o}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,n("./node_modules/whatwg-fetch/fetch.js");var i,o=(i=n("./CTFd/themes/core/assets/js/config.js"))&&i.__esModule?i:{default:i};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=o.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=o.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/patch.js":function(e,t,n){var i,s=(i=n("./node_modules/q/q.js"))&&i.__esModule?i:{default:i},o=n("./CTFd/themes/core/assets/js/api.js");function r(t,e){var n,i=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,n)),i}function a(o){for(var e=1;e'),(0,r.default)("th.sort-col").click(function(){var o,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((o=(0,r.default)(this).index(),function(e,t){var n=a(e,o),i=a(t,o);return r.default.isNumeric(n)&&r.default.isNumeric(i)?n-i:n.toString().localeCompare(i)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var n=0;n").text(e).html()};var i,r=(i=n("./node_modules/jquery/dist/jquery.js"))&&i.__esModule?i:{default:i};function o(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}r.default.fn.serializeJSON=function(n){var i={},o=(0,r.default)(this),e=o.serializeArray();return(e=(e=e.concat(o.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(o.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;n&&(null===e.value||""===e.value)&&(t=o.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(i[e.name]=e.value)}),i},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,n=0;if(0==this.length)return n;for(e=0,t=this.length;e')),(0,v.default)("#challenge-modal").modal()}),(0,v.default)(".comments-challenge").click(function(e){(0,v.default)("#challenge-comments-window").modal()}),(0,v.default)(".delete-challenge").click(function(e){(0,j.ezQuery)({title:"Delete Challenge",body:"Are you sure you want to delete {0}".format(""+(0,g.htmlEntities)(window.CHALLENGE_NAME)+""),success:function(){y.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=y.default.config.urlRoot+"/admin/challenges")})}})}),(0,v.default)("#challenge-update-container > form").submit(function(e){e.preventDefault();var n=(0,v.default)(e.target).serializeJSON(!0);y.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID+"/flags",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){function t(){y.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(e){if(e.success){switch((0,v.default)(".challenge-state").text(e.data.state),e.data.state){case"visible":(0,v.default)(".challenge-state").removeClass("badge-danger").addClass("badge-success");break;case"hidden":(0,v.default)(".challenge-state").removeClass("badge-success").addClass("badge-danger")}(0,j.ezToast)({title:"Success",body:"Your challenge has been updated!"})}else{var t,n="";for(t in e.errors)n+=e.errors[t].join("\n"),n+="\n";(0,j.ezAlert)({title:"Error",body:n,button:"OK"})}})}0===e.data.length&&"visible"===n.state?(0,j.ezQuery)({title:"Missing Flags",body:"This challenge does not have any flags meaning it may be unsolveable. Are you sure you'd like to update this challenge?",success:t}):t()})}),(0,v.default)("#challenge-create-options form").submit(M),document.querySelector("#challenge-flags")&&(e=_.default.extend(b.default),t=document.createElement("div"),document.querySelector("#challenge-flags").appendChild(t),new e({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(t)),document.querySelector("#challenge-topics")&&(n=_.default.extend(C.default),i=document.createElement("div"),document.querySelector("#challenge-topics").appendChild(i),new n({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(i)),document.querySelector("#challenge-tags")&&(o=_.default.extend(E.default),a=document.createElement("div"),document.querySelector("#challenge-tags").appendChild(a),new o({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(a)),document.querySelector("#prerequisite-add-form")&&(r=_.default.extend(w.default),s=document.createElement("div"),document.querySelector("#prerequisite-add-form").appendChild(s),new r({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(s)),document.querySelector("#challenge-files")&&(d=_.default.extend(q.default),c=document.createElement("div"),document.querySelector("#challenge-files").appendChild(c),new d({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(c)),document.querySelector("#challenge-hints")&&(l=_.default.extend(I.default),p=document.createElement("div"),document.querySelector("#challenge-hints").appendChild(p),new l({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(p)),document.querySelector("#next-add-form")&&(u=_.default.extend(A.default),f=document.createElement("div"),document.querySelector("#next-add-form").appendChild(f),new u({propsData:{challenge_id:window.CHALLENGE_ID}}).$mount(f)),document.querySelector("#comment-box")&&(m=_.default.extend(T.default),h=document.createElement("div"),document.querySelector("#comment-box").appendChild(h),new m({propsData:{type:"challenge",id:window.CHALLENGE_ID}}).$mount(h)),v.default.get(y.default.config.urlRoot+"/api/v1/challenges/types",function(e){var t=e.data;P(t.standard),(0,v.default)("#create-chals-select input[name=type]").change(function(){P(t[this.value])})})})},"./CTFd/themes/admin/assets/js/pages/main.js":function(e,t,n){var i=f(n("./CTFd/themes/core/assets/js/CTFd.js")),o=f(n("./node_modules/jquery/dist/jquery.js")),a=f(n("./node_modules/dayjs/dayjs.min.js")),r=f(n("./node_modules/dayjs/plugin/advancedFormat.js")),s=f(n("./node_modules/nunjucks/browser/nunjucks.js")),d=n("./node_modules/howler/dist/howler.js"),c=f(n("./CTFd/themes/core/assets/js/events.js")),l=f(n("./CTFd/themes/core/assets/js/times.js")),p=f(n("./CTFd/themes/admin/assets/js/styles.js")),u=f(n("./CTFd/themes/core/assets/js/helpers.js"));function f(e){return e&&e.__esModule?e:{default:e}}a.default.extend(r.default),i.default.init(window.init),window.CTFd=i.default,window.helpers=u.default,window.$=o.default,window.dayjs=a.default,window.nunjucks=s.default,window.Howl=d.Howl,(0,o.default)(function(){(0,p.default)(),(0,l.default)(),(0,c.default)(i.default.config.urlRoot)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=l,t.bindMarkdownEditor=p,t.bindMarkdownEditors=u,t.default=void 0,n("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var i=n("./CTFd/themes/core/assets/js/utils.js"),o=c(n("./node_modules/jquery/dist/jquery.js")),a=c(n("./node_modules/easymde/src/js/easymde.js")),r=c(n("./node_modules/vue/dist/vue.esm.browser.js")),s=c(n("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(n("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=r.default.extend(s.default),n=document.createElement("div");document.querySelector("main").appendChild(n);var i=new t({propsData:{editor:e}}).$mount(n);(0,o.default)("#media-modal").on("hidden.bs.modal",function(e){i.$destroy(),(0,o.default)("#media-modal").remove()}),(0,o.default)("#media-modal").modal()}function p(e){var t;!1===e.hasOwnProperty("mde")&&(t=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){l(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,o.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,o.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,o.default)(e).val()),t.codemirror.refresh()}))}function u(){(0,o.default)("textarea.markdown").each(function(e,t){p(t)})}t.default=function(){(0,o.default)(":input").each(function(){(0,o.default)(this).data("initial",(0,o.default)(this).val())}),(0,o.default)(function(){(0,o.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,o.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,o.default)("[data-checkbox]").click(function(e){(0,o.default)(e.target).is("input[type=checkbox]")||(0,o.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,o.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,o.default)(this).prop("checked"),n=(0,o.default)(this).index()+1;(0,o.default)(this).closest("table").find("tr td:nth-child(".concat(n,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,o.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,o.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,o.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,o.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,o.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,o.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),u(),(0,i.makeSortableTables)(),(0,o.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=p(n("./node_modules/jquery/dist/jquery.js")),o=p(n("./node_modules/dayjs/dayjs.min.js")),a=p(n("./node_modules/markdown-it/index.js"));n("./CTFd/themes/core/assets/js/patch.js");var r=p(n("./CTFd/themes/core/assets/js/fetch.js")),s=p(n("./CTFd/themes/core/assets/js/config.js")),d=n("./CTFd/themes/core/assets/js/api.js"),c=p(n("./CTFd/themes/core/assets/js/ezq.js")),l=n("./CTFd/themes/core/assets/js/utils.js");function p(e){return e&&e.__esModule?e:{default:e}}function u(t,e){var n,i=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,n)),i}function f(o){for(var e=1;e".concat(e.body,"

")):n.find(".modal-body").append((0,s.default)(e.body));var i=(0,s.default)(p.format(e.button));return e.success&&(0,s.default)(i).click(function(){e.success()}),e.large&&n.find(".modal-dialog").addClass("modal-lg"),n.find(".modal-footer").append(i),n.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(n),n.modal("show"),(0,s.default)(n).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),n}function h(e){(0,s.default)("#ezq--notifications-toast-container").length||(0,s.default)("body").append((0,s.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t,n=d.format(e.title,e.body),i=(0,s.default)(n);e.onclose&&(0,s.default)(i).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick&&((t=(0,s.default)(i).find(".toast-body")).addClass("cursor-pointer"),t.click(function(){e.onclick()}));var o=!1!==e.autohide,a=!1!==e.animation,r=e.delay||1e4;return(0,s.default)("#ezq--notifications-toast-container").prepend(i),i.toast({autohide:o,delay:r,animation:a}),i.toast("show"),i}function g(e){var t=r.format(e.title),n=(0,s.default)(t);"string"==typeof e.body?n.find(".modal-body").append("

".concat(e.body,"

")):n.find(".modal-body").append((0,s.default)(e.body));var i=(0,s.default)(f),o=(0,s.default)(u);return n.find(".modal-footer").append(o),n.find(".modal-footer").append(i),n.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(n),(0,s.default)(n).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(i).click(function(){e.success()}),n.modal("show"),n}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var n=c.format(e.width),i=r.format(e.title),o=(0,s.default)(i);return o.find(".modal-body").append((0,s.default)(n)),(0,s.default)("main").append(o),o.modal("show")}function y(e){var t={success:l,error:o}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,n("./node_modules/whatwg-fetch/fetch.js");var i,o=(i=n("./CTFd/themes/core/assets/js/config.js"))&&i.__esModule?i:{default:i};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=o.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=o.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/patch.js":function(e,t,n){var i,s=(i=n("./node_modules/q/q.js"))&&i.__esModule?i:{default:i},o=n("./CTFd/themes/core/assets/js/api.js");function r(t,e){var n,i=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,n)),i}function a(o){for(var e=1;e'),(0,r.default)("th.sort-col").click(function(){var o,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((o=(0,r.default)(this).index(),function(e,t){var n=a(e,o),i=a(t,o);return r.default.isNumeric(n)&&r.default.isNumeric(i)?n-i:n.toString().localeCompare(i)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var n=0;n").text(e).html()};var i,r=(i=n("./node_modules/jquery/dist/jquery.js"))&&i.__esModule?i:{default:i};function o(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}r.default.fn.serializeJSON=function(n){var i={},o=(0,r.default)(this),e=o.serializeArray();return(e=(e=e.concat(o.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(o.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;n&&(null===e.value||""===e.value)&&(t=o.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(i[e.name]=e.value)}),i},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,n=0;if(0==this.length)return n;for(e=0,t=this.length;e= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\n\nfunction deleteCorrectSubmission(_event) {\n var key_id = (0, _jquery[\"default\"])(this).data(\"submission-id\");\n var $elem = (0, _jquery[\"default\"])(this).parent().parent();\n var chal_name = $elem.find(\".chal\").text().trim();\n var team_name = $elem.find(\".team\").text().trim();\n var row = (0, _jquery[\"default\"])(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Submission\",\n body: \"Are you sure you want to delete correct submission from {0} for challenge {1}\".format(\"\" + (0, _utils.htmlEntities)(team_name) + \"\", \"\" + (0, _utils.htmlEntities)(chal_name) + \"\"),\n success: function success() {\n _CTFd[\"default\"].api.delete_submission({\n submissionId: key_id\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(_event) {\n var submissionIDs = (0, _jquery[\"default\"])(\"input[data-submission-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target = submissionIDs.length === 1 ? \"submission\" : \"submissions\";\n (0, _ezq.ezQuery)({\n title: \"Delete Submissions\",\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction showFlagsToggle(_event) {\n var urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has(\"full\")) {\n urlParams[\"delete\"](\"full\");\n } else {\n urlParams.set(\"full\", \"true\");\n }\n\n window.location.href = \"\".concat(window.location.pathname, \"?\").concat(urlParams.toString());\n}\n\nfunction showFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var eye = target.find(\"i\");\n var flag = target.parent().find(\"pre\");\n\n if (!flag.hasClass(\"full-flag\")) {\n flag.text(flag.attr(\"title\"));\n flag.addClass(\"full-flag\");\n eye.addClass(\"fa-eye-slash\");\n eye.removeClass(\"fa-eye\");\n } else {\n flag.text(flag.attr(\"title\").substring(0, 42) + \"...\");\n flag.removeClass(\"full-flag\");\n eye.addClass(\"fa-eye\");\n eye.removeClass(\"fa-eye-slash\");\n }\n}\n\nfunction copyFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var flag = target.parent().find(\"pre\");\n var text = flag.attr(\"title\");\n navigator.clipboard.writeText(text);\n (0, _jquery[\"default\"])(event.currentTarget).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"hide\");\n }, 1500);\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\"#show-full-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\"#show-short-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\".show-flag\").click(showFlag);\n (0, _jquery[\"default\"])(\".copy-flag\").click(copyFlag);\n (0, _jquery[\"default\"])(\".delete-correct-submission\").click(deleteCorrectSubmission);\n (0, _jquery[\"default\"])(\"#submission-delete-button\").click(deleteSelectedSubmissions);\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/submissions.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction deleteCorrectSubmission(_event) {\n var key_id = (0, _jquery[\"default\"])(this).data(\"submission-id\");\n var $elem = (0, _jquery[\"default\"])(this).parent().parent();\n var chal_name = $elem.find(\".chal\").text().trim();\n var team_name = $elem.find(\".team\").text().trim();\n var row = (0, _jquery[\"default\"])(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Submission\",\n body: \"Are you sure you want to delete correct submission from {0} for challenge {1}\".format(\"\" + (0, _utils.htmlEntities)(team_name) + \"\", \"\" + (0, _utils.htmlEntities)(chal_name) + \"\"),\n success: function success() {\n _CTFd[\"default\"].api.delete_submission({\n submissionId: key_id\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(_event) {\n var submissionIDs = (0, _jquery[\"default\"])(\"input[data-submission-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target = submissionIDs.length === 1 ? \"submission\" : \"submissions\";\n (0, _ezq.ezQuery)({\n title: \"Delete Submissions\",\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction showFlagsToggle(_event) {\n var urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has(\"full\")) {\n urlParams[\"delete\"](\"full\");\n } else {\n urlParams.set(\"full\", \"true\");\n }\n\n window.location.href = \"\".concat(window.location.pathname, \"?\").concat(urlParams.toString());\n}\n\nfunction showFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var eye = target.find(\"i\");\n var flag = target.parent().find(\"pre\");\n\n if (!flag.hasClass(\"full-flag\")) {\n flag.text(flag.attr(\"title\"));\n flag.addClass(\"full-flag\");\n eye.addClass(\"fa-eye-slash\");\n eye.removeClass(\"fa-eye\");\n } else {\n flag.text(flag.attr(\"title\").substring(0, 42) + \"...\");\n flag.removeClass(\"full-flag\");\n eye.addClass(\"fa-eye\");\n eye.removeClass(\"fa-eye-slash\");\n }\n}\n\nfunction copyFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var flag = target.parent().find(\"pre\");\n var text = flag.attr(\"title\");\n navigator.clipboard.writeText(text);\n (0, _jquery[\"default\"])(event.currentTarget).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"hide\");\n }, 1500);\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\"#show-full-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\"#show-short-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\".show-flag\").click(showFlag);\n (0, _jquery[\"default\"])(\".copy-flag\").click(copyFlag);\n (0, _jquery[\"default\"])(\".delete-correct-submission\").click(deleteCorrectSubmission);\n (0, _jquery[\"default\"])(\"#submission-delete-button\").click(deleteSelectedSubmissions);\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/submissions.js?"); /***/ }) diff --git a/CTFd/themes/admin/templates/challenges/challenge.html b/CTFd/themes/admin/templates/challenges/challenge.html index a8b6eb78..c10a2c9b 100644 --- a/CTFd/themes/admin/templates/challenges/challenge.html +++ b/CTFd/themes/admin/templates/challenges/challenge.html @@ -5,7 +5,24 @@ {% endblock %} {% block content %} -