Skip to content

Commit c1d7910

Browse files
authored
Don't provide extra time config values and prevent invalid dates during setup (CTFd#1627)
* Don't provide extra time config values when updating times in the Admin Panel * Prevent invalid dates during setup
1 parent dddec84 commit c1d7910

File tree

4 files changed

+29
-24
lines changed

4 files changed

+29
-24
lines changed

CTFd/themes/admin/templates/configs/time.html

+18-18
Original file line numberDiff line numberDiff line change
@@ -29,30 +29,30 @@
2929

3030
<div class="form-group col-md-2">
3131
<label for="start-month">Month:</label>
32-
<input class="form-control start-date" id='start-month' name='start-month' min="0" max="12"
32+
<input class="form-control start-date" id='start-month' min="0" max="12"
3333
type='number'>
3434
</div>
3535

3636
<div class="form-group col-md-2">
3737
<label for="start-day">Day:</label>
38-
<input class="form-control start-date" id='start-day' name='start-day' min="0" max="31"
38+
<input class="form-control start-date" id='start-day' min="0" max="31"
3939
type='number'>
4040
</div>
4141

4242
<div class="form-group col-md-3">
4343
<label for="start-year">Year:</label>
44-
<input class="form-control start-date" id='start-year' name='start-year' type='number'>
44+
<input class="form-control start-date" id='start-year' type='number'>
4545
</div>
4646

4747
<div class="form-group col-md-2">
4848
<label for="start-hour">Hour:</label>
49-
<input class="form-control start-date" id='start-hour' name='start-hour' min="0" max="23"
49+
<input class="form-control start-date" id='start-hour' min="0" max="23"
5050
type='number'>
5151
</div>
5252

5353
<div class="form-group col-md-3">
5454
<label for="start-minute">Minute:</label>
55-
<input class="form-control start-date" id='start-minute' name='start-minute' min="0" max="59"
55+
<input class="form-control start-date" id='start-minute' min="0" max="59"
5656
type='number'>
5757
</div>
5858

@@ -76,7 +76,7 @@
7676

7777
<div class="form-group col-md-12">
7878
<label>UTC Timestamp:</label>
79-
<input class="form-control" id='start' name='start' type='text'
79+
<input class="form-control" id='start' name='start' type='number'
8080
placeholder="Start Date (UTC timestamp)"
8181
{% if start is defined and start != None %}value="{{ start }}"{% endif %} readonly>
8282
</div>
@@ -92,30 +92,30 @@
9292

9393
<div class="form-group col-md-2">
9494
<label for="end-month">Month:</label>
95-
<input class="form-control end-date" id='end-month' name='end-month' min="0" max="12"
95+
<input class="form-control end-date" id='end-month' min="0" max="12"
9696
type='number'>
9797
</div>
9898

9999
<div class="form-group col-md-2">
100100
<label for="end-day">Day:</label>
101-
<input class="form-control end-date" id='end-day' name='end-day' min="0" max="31"
101+
<input class="form-control end-date" id='end-day' min="0" max="31"
102102
type='number'>
103103
</div>
104104

105105
<div class="form-group col-md-4">
106106
<label for="end-year">Year:</label>
107-
<input class="form-control end-date" id='end-year' name='end-year' type='number'>
107+
<input class="form-control end-date" id='end-year' type='number'>
108108
</div>
109109

110110
<div class="form-group col-md-2">
111111
<label for="end-hour">Hour:</label>
112-
<input class="form-control end-date" id='end-hour' name='end-hour' min="0" max="23"
112+
<input class="form-control end-date" id='end-hour' min="0" max="23"
113113
type='number'>
114114
</div>
115115

116116
<div class="form-group col-md-2">
117117
<label for="end-minute">Minute:</label>
118-
<input class="form-control end-date" id='end-minute' name='end-minute' min="0"
118+
<input class="form-control end-date" id='end-minute' min="0"
119119
max="59" type='number'>
120120
</div>
121121

@@ -147,7 +147,7 @@
147147

148148
<div class="form-group col-md-12">
149149
<label for="end">UTC Timestamp:</label>
150-
<input class="form-control" id='end' name='end' type='text'
150+
<input class="form-control" id='end' name='end' type='number'
151151
placeholder="End Date (UTC timestamp)"
152152
{% if end is defined and end != None %}value="{{ end }}"{% endif %} readonly>
153153
</div>
@@ -164,30 +164,30 @@
164164

165165
<div class="form-group col-md-2">
166166
<label for="freeze-month">Month:</label>
167-
<input class="form-control freeze-date" id='freeze-month' name='freeze-month' min="0" max="12"
167+
<input class="form-control freeze-date" id='freeze-month' min="0" max="12"
168168
type='number'>
169169
</div>
170170

171171
<div class="form-group col-md-2">
172172
<label for="freeze-day">Day:</label>
173-
<input class="form-control freeze-date" id='freeze-day' name='freeze-day' min="0" max="31"
173+
<input class="form-control freeze-date" id='freeze-day' min="0" max="31"
174174
type='number'>
175175
</div>
176176

177177
<div class="form-group col-md-4">
178178
<label for="freeze-year">Year:</label>
179-
<input class="form-control freeze-date" id='freeze-year' name='freeze-year' type='number'>
179+
<input class="form-control freeze-date" id='freeze-year' type='number'>
180180
</div>
181181

182182
<div class="form-group col-md-2">
183183
<label for="freeze-hour">Hour:</label>
184-
<input class="form-control freeze-date" id='freeze-hour' name='freeze-hour' min="0" max="23"
184+
<input class="form-control freeze-date" id='freeze-hour' min="0" max="23"
185185
type='number'>
186186
</div>
187187

188188
<div class="form-group col-md-2">
189189
<label for="freeze-minute">Minute:</label>
190-
<input class="form-control freeze-date" id='freeze-minute' name='freeze-minute' min="0"
190+
<input class="form-control freeze-date" id='freeze-minute' min="0"
191191
max="59" type='number'>
192192
</div>
193193

@@ -211,7 +211,7 @@
211211

212212
<div class="form-group col-md-12">
213213
<label for="freeze">UTC Timestamp:</label>
214-
<input class="form-control" id='freeze' name='freeze' type='text'
214+
<input class="form-control" id='freeze' name='freeze' type='number'
215215
placeholder="Freeze Date (UTC timestamp)"
216216
{% if freeze is defined and freeze != None %}value="{{ freeze }}"{% endif %} readonly>
217217
</div>

CTFd/themes/core/assets/js/pages/setup.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,21 @@ function switchTab(event) {
3030
}
3131

3232
function processDateTime(datetime) {
33-
let date_picker = $(`#${datetime}-date`);
34-
let time_picker = $(`#${datetime}-time`);
3533
return function(_event) {
34+
let date_picker = $(`#${datetime}-date`);
35+
let time_picker = $(`#${datetime}-time`);
3636
let unix_time = Moment(
3737
`${date_picker.val()} ${time_picker.val()}`,
3838
"YYYY-MM-DD HH:mm"
3939
)
4040
.utc()
41-
.format("X");
42-
$(`#${datetime}-preview`).val(unix_time);
41+
.unix();
42+
43+
if (isNaN(unix_time)) {
44+
$(`#${datetime}-preview`).val("");
45+
} else {
46+
$(`#${datetime}-preview`).val(unix_time);
47+
}
4348
};
4449
}
4550

CTFd/themes/core/static/js/pages/setup.dev.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@
162162
/***/ (function(module, exports, __webpack_require__) {
163163

164164
;
165-
eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _momentTimezone = _interopRequireDefault(__webpack_require__(/*! moment-timezone */ \"./node_modules/moment-timezone/index.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction switchTab(event) {\n event.preventDefault(); // Handle tab validation\n\n var valid_tab = true;\n (0, _jquery.default)(event.target).closest(\"[role=tabpanel]\").find(\"input,textarea\").each(function (i, e) {\n var $e = (0, _jquery.default)(e);\n var status = e.checkValidity();\n\n if (status === false) {\n $e.removeClass(\"input-filled-valid\");\n $e.addClass(\"input-filled-invalid\");\n valid_tab = false;\n }\n });\n\n if (valid_tab == false) {\n return;\n }\n\n var href = (0, _jquery.default)(event.target).data(\"href\");\n (0, _jquery.default)(\".nav a[href=\\\"\".concat(href, \"\\\"]\")).tab(\"show\");\n}\n\nfunction processDateTime(datetime) {\n var date_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-date\"));\n var time_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-time\"));\n return function (_event) {\n var unix_time = (0, _momentTimezone.default)(\"\".concat(date_picker.val(), \" \").concat(time_picker.val()), \"YYYY-MM-DD HH:mm\").utc().format(\"X\");\n (0, _jquery.default)(\"#\".concat(datetime, \"-preview\")).val(unix_time);\n };\n}\n\nfunction mlcSetup(_event) {\n var params = {\n name: (0, _jquery.default)(\"#ctf_name\").val(),\n type: \"jeopardy\",\n description: (0, _jquery.default)(\"#ctf_description\").val(),\n user_mode: (0, _jquery.default)(\"#user_mode\").val(),\n event_url: window.location.origin + _CTFd.default.config.urlRoot,\n redirect_url: window.location.origin + _CTFd.default.config.urlRoot + \"/redirect\",\n integration_setup_url: window.location.origin + _CTFd.default.config.urlRoot + \"/setup/integrations\",\n start: (0, _jquery.default)(\"#start-preview\").val(),\n end: (0, _jquery.default)(\"#end-preview\").val(),\n platform: \"CTFd\",\n state: window.STATE\n };\n var ret = [];\n\n for (var p in params) {\n ret.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(params[p]));\n }\n\n window.open(\"https://www.majorleaguecyber.org/events/new?\" + ret.join(\"&\"), \"_blank\");\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\".tab-next\").click(switchTab);\n (0, _jquery.default)(\"input\").on(\"keypress\", function (e) {\n // Hook Enter button\n if (e.keyCode == 13) {\n e.preventDefault();\n (0, _jquery.default)(e.target).closest(\".tab-pane\").find(\"button[data-href]\").click();\n }\n });\n (0, _jquery.default)(\"#integration-mlc\").click(mlcSetup);\n (0, _jquery.default)(\"#start-date,#start-time\").change(processDateTime(\"start\"));\n (0, _jquery.default)(\"#end-date,#end-time\").change(processDateTime(\"end\"));\n (0, _jquery.default)(\"#config-color-picker\").on(\"input\", function (_e) {\n (0, _jquery.default)(\"#config-color-input\").val((0, _jquery.default)(this).val());\n });\n (0, _jquery.default)(\"#config-color-reset\").click(function () {\n (0, _jquery.default)(\"#config-color-input\").val(\"\");\n (0, _jquery.default)(\"#config-color-picker\").val(\"\");\n });\n window.addEventListener(\"storage\", function (event) {\n if (event.key == \"integrations\" && event.newValue) {\n var integration = JSON.parse(event.newValue);\n\n if (integration[\"name\"] == \"mlc\") {\n (0, _jquery.default)(\"#integration-mlc\").text(\"Already Configured\").attr(\"disabled\", true);\n window.focus();\n localStorage.removeItem(\"integrations\");\n }\n }\n });\n (0, _jquery.default)(\"#setup-form\").submit(function (e) {\n if ((0, _jquery.default)(\"#newsletter-checkbox\").prop(\"checked\")) {\n var email = (0, _jquery.default)(e.target).find(\"input[name=email]\").val();\n\n _jquery.default.ajax({\n type: \"POST\",\n url: \"https://ctfd.us15.list-manage.com/subscribe/post-json?u=6c7fa6feeced52775aec9d015&id=dd1484208e&c=?\",\n data: {\n EMAIL: email,\n subscribe: \"Subscribe\",\n b_6c7fa6feeced52775aec9d015_dd1484208e: \"\"\n },\n dataType: \"jsonp\",\n contentType: \"application/json; charset=utf-8\"\n });\n }\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/setup.js?");
165+
eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _momentTimezone = _interopRequireDefault(__webpack_require__(/*! moment-timezone */ \"./node_modules/moment-timezone/index.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction switchTab(event) {\n event.preventDefault(); // Handle tab validation\n\n var valid_tab = true;\n (0, _jquery.default)(event.target).closest(\"[role=tabpanel]\").find(\"input,textarea\").each(function (i, e) {\n var $e = (0, _jquery.default)(e);\n var status = e.checkValidity();\n\n if (status === false) {\n $e.removeClass(\"input-filled-valid\");\n $e.addClass(\"input-filled-invalid\");\n valid_tab = false;\n }\n });\n\n if (valid_tab == false) {\n return;\n }\n\n var href = (0, _jquery.default)(event.target).data(\"href\");\n (0, _jquery.default)(\".nav a[href=\\\"\".concat(href, \"\\\"]\")).tab(\"show\");\n}\n\nfunction processDateTime(datetime) {\n return function (_event) {\n var date_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-date\"));\n var time_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-time\"));\n var unix_time = (0, _momentTimezone.default)(\"\".concat(date_picker.val(), \" \").concat(time_picker.val()), \"YYYY-MM-DD HH:mm\").utc().unix();\n\n if (isNaN(unix_time)) {\n (0, _jquery.default)(\"#\".concat(datetime, \"-preview\")).val(\"\");\n } else {\n (0, _jquery.default)(\"#\".concat(datetime, \"-preview\")).val(unix_time);\n }\n };\n}\n\nfunction mlcSetup(_event) {\n var params = {\n name: (0, _jquery.default)(\"#ctf_name\").val(),\n type: \"jeopardy\",\n description: (0, _jquery.default)(\"#ctf_description\").val(),\n user_mode: (0, _jquery.default)(\"#user_mode\").val(),\n event_url: window.location.origin + _CTFd.default.config.urlRoot,\n redirect_url: window.location.origin + _CTFd.default.config.urlRoot + \"/redirect\",\n integration_setup_url: window.location.origin + _CTFd.default.config.urlRoot + \"/setup/integrations\",\n start: (0, _jquery.default)(\"#start-preview\").val(),\n end: (0, _jquery.default)(\"#end-preview\").val(),\n platform: \"CTFd\",\n state: window.STATE\n };\n var ret = [];\n\n for (var p in params) {\n ret.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(params[p]));\n }\n\n window.open(\"https://www.majorleaguecyber.org/events/new?\" + ret.join(\"&\"), \"_blank\");\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\".tab-next\").click(switchTab);\n (0, _jquery.default)(\"input\").on(\"keypress\", function (e) {\n // Hook Enter button\n if (e.keyCode == 13) {\n e.preventDefault();\n (0, _jquery.default)(e.target).closest(\".tab-pane\").find(\"button[data-href]\").click();\n }\n });\n (0, _jquery.default)(\"#integration-mlc\").click(mlcSetup);\n (0, _jquery.default)(\"#start-date,#start-time\").change(processDateTime(\"start\"));\n (0, _jquery.default)(\"#end-date,#end-time\").change(processDateTime(\"end\"));\n (0, _jquery.default)(\"#config-color-picker\").on(\"input\", function (_e) {\n (0, _jquery.default)(\"#config-color-input\").val((0, _jquery.default)(this).val());\n });\n (0, _jquery.default)(\"#config-color-reset\").click(function () {\n (0, _jquery.default)(\"#config-color-input\").val(\"\");\n (0, _jquery.default)(\"#config-color-picker\").val(\"\");\n });\n window.addEventListener(\"storage\", function (event) {\n if (event.key == \"integrations\" && event.newValue) {\n var integration = JSON.parse(event.newValue);\n\n if (integration[\"name\"] == \"mlc\") {\n (0, _jquery.default)(\"#integration-mlc\").text(\"Already Configured\").attr(\"disabled\", true);\n window.focus();\n localStorage.removeItem(\"integrations\");\n }\n }\n });\n (0, _jquery.default)(\"#setup-form\").submit(function (e) {\n if ((0, _jquery.default)(\"#newsletter-checkbox\").prop(\"checked\")) {\n var email = (0, _jquery.default)(e.target).find(\"input[name=email]\").val();\n\n _jquery.default.ajax({\n type: \"POST\",\n url: \"https://ctfd.us15.list-manage.com/subscribe/post-json?u=6c7fa6feeced52775aec9d015&id=dd1484208e&c=?\",\n data: {\n EMAIL: email,\n subscribe: \"Subscribe\",\n b_6c7fa6feeced52775aec9d015_dd1484208e: \"\"\n },\n dataType: \"jsonp\",\n contentType: \"application/json; charset=utf-8\"\n });\n }\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/setup.js?");
166166

167167
/***/ })
168168

CTFd/themes/core/static/js/pages/setup.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)