The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
Rocket.Chat/packages/rocketchat-message-snippet/server/requests.js

62 lines
1.4 KiB

/* global Cookies */
WebApp.connectHandlers.use('/snippet/download', function(req, res) {
let rawCookies;
let token;
let uid;
const cookie = new Cookies();
if (req.headers && req.headers.cookie !== null) {
rawCookies = req.headers.cookie;
}
if (rawCookies !== null) {
uid = cookie.get('rc_uid', rawCookies);
}
if (rawCookies !== null) {
token = cookie.get('rc_token', rawCookies);
}
if (uid === null) {
uid = req.query.rc_uid;
token = req.query.rc_token;
}
const user = RocketChat.models.Users.findOneByIdAndLoginToken(uid, token);
if (!(uid && token && user)) {
res.writeHead(403);
res.end();
return false;
}
const match = /^\/([^\/]+)\/(.*)/.exec(req.url);
if (match[1]) {
const snippet = RocketChat.models.Messages.findOne(
{
'_id': match[1],
'snippeted': true
}
);
const room = RocketChat.models.Rooms.findOne({ '_id': snippet.rid, 'usernames': { '$in': [user.username] }});
if (room === undefined) {
res.writeHead(403);
res.end();
return false;
}
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${ encodeURIComponent(snippet.snippetName) }`);
res.setHeader('Content-Type', 'application/octet-stream');
// Removing the ``` contained in the msg.
const snippetContent = snippet.msg.substr(3, snippet.msg.length - 6);
res.setHeader('Content-Length', snippetContent.length);
res.write(snippetContent);
res.end();
return;
}
res.writeHead(404);
res.end();
return;
});