diff --git a/api/routes/kolloquiums.js b/api/routes/kolloquiums.js index 241463ef093d4a5f933c3721cf8e87fdad948d57..d12858ae114112ad2e679375e4694cf397e34d78 100644 --- a/api/routes/kolloquiums.js +++ b/api/routes/kolloquiums.js @@ -9,6 +9,35 @@ function getDirectories(path) { }); } +// function removeDangerousSymbols(title) { +// return title +// } + +function removeDangerousSymbols(fname) { + // https://stackoverflow.com/a/31976060 + // https://gist.github.com/doctaphred/d01d05291546186941e1b7ddc02034d3 + + const fname_original = fname; + + // resolve multi-line, whitespace trimming + fname = fname.split(/[\r\n]/).map(s => s.trim()).filter(s => s.length).join(" "); + // forbidden characters + // (after multi-line, because new-line-chars are themselves forbidden characters) + fname = fname.replaceAll(/[<>.:"\/\\\|?*\x00-\x1F]/g, ''); + // advanced trim + fname = fname.replace(/\.$/, ""); + // empty filename + if (!fname.length) { + fname = '_'; + } + // forbidden filenames + if (fname.match(/^(CON|PRN|AUX|NUL|COM1|COM2|COM3|COM4|COM5|COM6|COM7|COM8|COM9|LPT1|LPT2|LPT3|LPT4|LPT5|LPT6|LPT7|LPT8|LPT9)(\..+)?$/)) { + fname = `_${fname}`; + } + + return fname; +} + fs.mkdir('Kolloquiums',function(err) { if (err && err.code === "EEXIST") { console.log('Kolloquiums Directory already existed') @@ -33,14 +62,16 @@ router.use('/getKolloquiums', (req, res) => { router.use('/deleteKolloquium', (req, res) => { console.log('deleting Kolloquium') let { title } = req.body - if(title == '') { + if(!title || title.trim().length == 0) { console.error('Folder has no name') return res.json({ status: 'error', message: 'Folder has no name' }) } - fs.rmdir("Kolloquiums/" + title, function(err) { + + let safeTitle = removeDangerousSymbols(title) + fs.rmdir("Kolloquiums/" + safeTitle, function(err) { if (err) { console.error(err); return res.json({ @@ -51,7 +82,7 @@ router.use('/deleteKolloquium', (req, res) => { }); return res.json({ status: 'success', - message: 'removed Kolloquium ' + title + message: 'removed Kolloquium ' + safeTitle }) }) @@ -60,12 +91,20 @@ router.use('/createKolloquium', (req, res) => { console.log('creating Kolloquium') console.log(req.body) let { title } = req.body - fs.mkdir('Kolloquiums/' + title,function(err) { + if( !title || title.trim().length == 0) { + console.error('Title was empty') + return res.json({ + status: 'error', + message: 'Title was empty' + }) + } + let safeTitle = removeDangerousSymbols(title) + fs.mkdir('Kolloquiums/' + safeTitle, function(err) { if (err && err.code === "EEXIST") { - console.warn('Directory "' + title + '" already existed') + console.warn('Directory "' + safeTitle + '" already existed') return res.json({ status: 'warning', - message: 'Directory "' + title + '" already existed' + message: 'Directory "' + safeTitle + '" already existed' }) } else if (err && err.code != "EEXIST") { @@ -76,10 +115,10 @@ router.use('/createKolloquium', (req, res) => { }) } else { - console.log('Directory "' + title + '" created successfully!'); + console.log('Directory "' + safeTitle + '" created successfully!'); return res.json({ status: 'success', - message: 'Directory "' + title + '" created successfully!' + message: 'Directory "' + safeTitle + '" created successfully!' }) } }); @@ -90,14 +129,16 @@ router.use('/renameKolloquium', (req, res) => { console.log('renaming Kolloquium') console.log(req.body); let { oldTitle, newTitle } = req.body - if( oldTitle == '' || newTitle == '') { + if( !oldTitle || oldTitle.trim().length == 0 || !newTitle || newTitle.trim().length == 0) { console.error('at least one of the names was empty') return res.json({ status: 'error', message: 'at least one of the names was empty' }) } - fs.rename('Kolloquiums/' + oldTitle, 'Kolloquiums/' + newTitle, (err) => { + let oldSafeTitle = removeDangerousSymbols(oldTitle) + let newSafeTitle = removeDangerousSymbols(newTitle) + fs.rename('Kolloquiums/' + oldSafeTitle, 'Kolloquiums/' + newSafeTitle, (err) => { if(err) { console.error(err); return res.json({ diff --git a/pages/index.vue b/pages/index.vue index 9917d0dc46d5e989eb665778c070b6cb7e6f706d..b5ce5998056ad03095407d1da19eb4b50403ef8d 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -22,7 +22,7 @@ @update:title="kolloquium.title=$event" :inEdit="kolloquium.inEdit" @update:inEdit="toggleEdit(kolloquium, $event)" - @deleteKolloquium="deleteKolloquium(kolloquium)" + @deleteKolloquium="deleteKolloquium(kolloquium.title)" /> <ListItem @click.native="createNewKolloquium()" @@ -112,14 +112,14 @@ export default { if(createNew){ kolloquium.title = title kolloquium.isNew = false - if (!title || title == '') { + if (!title || title.trim().length == 0) { this.deleteKolloquium(title) return } this.$axios.post('api/createKolloquium', { title: title }) } else if (changeName) { - if (title == '') { + if (!title || title.trim().length == 0) { return } kolloquium.title = title @@ -127,10 +127,10 @@ export default { } }, deleteKolloquium(kolloquiumToDelete) { - this.kolloquiums = this.kolloquiums.filter(kolloquium => kolloquium.title != kolloquiumToDelete.title); + this.kolloquiums = this.kolloquiums.filter(kolloquium => kolloquium.title != kolloquiumToDelete); this.selectedKolloquium = "" if(kolloquiumToDelete != ''){ - this.$axios.post('api/deleteKolloquium', { title: kolloquiumToDelete.title }) + this.$axios.post('api/deleteKolloquium', { title: kolloquiumToDelete }) } }, },