43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
|
const db = require("../db");
|
||
|
const openpgp = require("openpgp");
|
||
|
|
||
|
const send_message = async (msg, respond, socket) => {
|
||
|
// find user
|
||
|
const result = await db.query("select * from users where name = ?", [
|
||
|
msg.name,
|
||
|
]);
|
||
|
if (result.rows.length === 0) {
|
||
|
return respond({
|
||
|
success: false,
|
||
|
message: "User not found",
|
||
|
});
|
||
|
}
|
||
|
// validate signature
|
||
|
try {
|
||
|
const key = await openpgp.readKey({ armoredKey: result.rows[0].pubkey });
|
||
|
const verification = await openpgp.verify({
|
||
|
message: await openpgp.readCleartextMessage({
|
||
|
cleartextMessage: msg.message,
|
||
|
}),
|
||
|
verificationKeys: key,
|
||
|
expectSigned: true,
|
||
|
});
|
||
|
// add message and send it to everyone
|
||
|
await db.query(
|
||
|
"insert into posts (user, thread, content, sig) values (?, 1, ?, ?)",
|
||
|
[result.rows[0].id, verification.data, msg.message]
|
||
|
);
|
||
|
socket.broadcast.emit("new_message", {
|
||
|
name: msg.name,
|
||
|
message: verification.data,
|
||
|
});
|
||
|
} catch (err) {
|
||
|
return respond({
|
||
|
success: false,
|
||
|
message: "Message signature verification failed",
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
module.exports = send_message;
|