Skip to content

Commit 45d1b10

Browse files
committed
Preventing dangerous file names in tests config form.
1 parent b407056 commit 45d1b10

3 files changed

Lines changed: 26 additions & 6 deletions

File tree

src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.js

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,26 @@ const validateFileExists = (data, errors, path, existingFiles) => {
112112
}
113113
};
114114

115-
const validateFileEntryNotEmpty = (data, errors, path, emptyError) => {
115+
const validateFileName = (
116+
data,
117+
errors,
118+
path,
119+
emptyError = (
120+
<FormattedMessage id="app.expandingInputFilesField.validateEmpty" defaultMessage="This value must not be empty." />
121+
)
122+
) => {
116123
const name = safeGet(data, path);
117124
if (!name || name.trim() === '') {
118125
safeSet(errors, path, emptyError);
126+
} else if (!name.match(/^[-a-zA-Z0-9_+.,@()%!# ]+$/) || name.trim() === '.' || name.trim() === '..') {
127+
safeSet(
128+
errors,
129+
path,
130+
<FormattedMessage
131+
id="app.editExerciseConfigForm.validation.fileNameCharacters"
132+
defaultMessage="File name must not contain dangerous characters (e.g. path separators)."
133+
/>
134+
);
119135
}
120136
};
121137

@@ -128,10 +144,10 @@ const validateFileList = (data, errors, path, pairs, existingFiles, emptyError,
128144
// check empty names
129145
files.forEach((_, idx) => {
130146
if (pairs) {
131-
validateFileEntryNotEmpty(data, errors, [...path, idx, 'file'], emptyError);
132-
validateFileEntryNotEmpty(data, errors, [...path, idx, 'name'], emptyError);
147+
validateFileName(data, errors, [...path, idx, 'file'], emptyError);
148+
validateFileName(data, errors, [...path, idx, 'name'], emptyError);
133149
} else {
134-
validateFileEntryNotEmpty(data, errors, [...path, idx], emptyError);
150+
validateFileName(data, errors, [...path, idx], emptyError);
135151
}
136152
});
137153

@@ -412,6 +428,10 @@ const validate = (formData, { exercise, exerciseFiles }) => {
412428
if (test.useCustomJudge) {
413429
validateFileExists(formData, errors, ['config', testKey, 'custom-judge'], existingFiles);
414430
}
431+
432+
if (test.useOutFile) {
433+
validateFileName(formData, errors, ['config', testKey, 'actual-output']);
434+
}
415435
}
416436

417437
return errors;

src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTest.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class EditExerciseSimpleConfigTest extends Component {
6666
.find(env => Boolean(overrides[env]));
6767
const override = environmentWithOverride ? overrides[environmentWithOverride] : {};
6868

69-
// Prepare showFlags combining defaults with overrided for given environment
69+
// Prepare showFlags combining defaults with overridden for given environment
7070
const {
7171
showCompilation = true, // compilation block (per-env extra files and entry points)
7272
showInputs = true, // input data module (input files + stdin)

src/pages/EditExerciseConfig/EditExerciseConfig.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ class EditExerciseConfig extends Component {
310310
<table className="my-3">
311311
<tbody>
312312
<tr>
313-
<td className="valing-middle pe-3">
313+
<td className="pe-3">
314314
<ResourceRenderer resource={[exerciseConfig, exerciseEnvironmentConfig]}>
315315
{(config, environmentConfigs) => (
316316
<ResourceRenderer resourceArray={runtimeEnvironments}>

0 commit comments

Comments
 (0)