Apply sanitation to chat names with extension

4b2c074399471cf674fa1e9691a41b09618ecb33

Cohee <18619528+Cohee1207@users.noreply.github.com>

1 files changed, +12 -21Showing whitespace changes
src/endpoints/chats.js+12 -21
@@ -144,8 +144,8 @@ router.post('/save', jsonParser, function (request, response) {
144 const directoryName = String(request.body.avatar_url).replace('.png', '');144 const directoryName = String(request.body.avatar_url).replace('.png', '');
145 const chatData = request.body.chat;145 const chatData = request.body.chat;
146 const jsonlData = chatData.map(JSON.stringify).join('\n');146 const jsonlData = chatData.map(JSON.stringify).join('\n');
147 const fileName = `${sanitize(String(request.body.file_name))}.jsonl`;147 const fileName = `${String(request.body.file_name)}.jsonl`;
148 const filePath = path.join(request.user.directories.chats, directoryName, fileName);148 const filePath = path.join(request.user.directories.chats, directoryName, sanitize(fileName));
149 writeFileAtomicSync(filePath, jsonlData, 'utf8');149 writeFileAtomicSync(filePath, jsonlData, 'utf8');
150 backupChat(request.user.directories.backups, directoryName, jsonlData);150 backupChat(request.user.directories.backups, directoryName, jsonlData);
151 return response.send({ result: 'ok' });151 return response.send({ result: 'ok' });
@@ -171,14 +171,15 @@ router.post('/get', jsonParser, function (request, response) {
171 return response.send({});171 return response.send({});
172 }172 }
173173
174 const fileName = path.join(directoryPath, `${sanitize(String(request.body.file_name))}.jsonl`);174 const fileName = `${String(request.body.file_name)}.jsonl`;
175 const chatFileExists = fs.existsSync(fileName);175 const filePath = path.join(directoryPath, sanitize(fileName));
176 const chatFileExists = fs.existsSync(filePath);
176177
177 if (!chatFileExists) {178 if (!chatFileExists) {
178 return response.send({});179 return response.send({});
179 }180 }
180181
181 const data = fs.readFileSync(fileName, 'utf8');182 const data = fs.readFileSync(filePath, 'utf8');
182 const lines = data.split('\n');183 const lines = data.split('\n');
183184
184 // Iterate through the array of strings and parse each line as JSON185 // Iterate through the array of strings and parse each line as JSON
@@ -217,28 +218,18 @@ router.post('/rename', jsonParser, async function (request, response) {
217});218});
218219
219router.post('/delete', jsonParser, function (request, response) {220router.post('/delete', jsonParser, function (request, response) {
220 if (!request.body) {
221 console.log('no request body seen');
222 return response.sendStatus(400);
223 }
224
225 if (request.body.chatfile !== sanitize(request.body.chatfile)) {
226 console.error('Malicious chat name prevented');
227 return response.sendStatus(403);
228 }
229
230 const dirName = String(request.body.avatar_url).replace('.png', '');221 const dirName = String(request.body.avatar_url).replace('.png', '');
231 const fileName = path.join(request.user.directories.chats, dirName, sanitize(String(request.body.chatfile)));222 const fileName = String(request.body.chatfile);
232 const chatFileExists = fs.existsSync(fileName);223 const filePath = path.join(request.user.directories.chats, dirName, sanitize(fileName));
224 const chatFileExists = fs.existsSync(filePath);
233225
234 if (!chatFileExists) {226 if (!chatFileExists) {
235 console.log(`Chat file not found '${fileName}'`);227 console.log(`Chat file not found '${filePath}'`);
236 return response.sendStatus(400);228 return response.sendStatus(400);
237 } else {
238 fs.rmSync(fileName);
239 console.log('Deleted chat file: ' + fileName);
240 }229 }
241230
231 fs.rmSync(filePath);
232 console.log('Deleted chat file: ' + filePath);
242 return response.send('ok');233 return response.send('ok');
243});234});
244235