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/app/message-snippet/server/requests.js

65 lines
1.5 KiB

import { WebApp } from 'meteor/webapp';
import { Cookies } from 'meteor/ostrio:cookies';
import { Users, Rooms, Messages } from '../../models';
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 = 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 = Messages.findOne(
{
_id: match[1],
snippeted: true,
},
);
const room = 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();
});