Browse Source

full stack tribes

feature/dockerfile-arm
Evan Feenstra 5 years ago
parent
commit
895980eaa8
  1. 3
      api/controllers/chats.ts
  2. 2
      api/controllers/messages.ts
  3. 11
      api/network/receive.ts
  4. 14
      api/network/send.ts
  5. 25
      api/utils/msg.ts
  6. 1
      api/utils/tribes.ts
  7. 2
      dist/api/controllers/chats.js
  8. 2
      dist/api/controllers/chats.js.map
  9. 2
      dist/api/controllers/messages.js
  10. 2
      dist/api/controllers/messages.js.map
  11. 8
      dist/api/network/receive.js
  12. 2
      dist/api/network/receive.js.map
  13. 13
      dist/api/network/send.js
  14. 2
      dist/api/network/send.js.map
  15. 24
      dist/api/utils/msg.js
  16. 2
      dist/api/utils/msg.js.map
  17. 1
      dist/api/utils/tribes.js
  18. 2
      dist/api/utils/tribes.js.map

3
api/controllers/chats.ts

@ -170,6 +170,7 @@ async function joinTribe(req, res){
let theTribeOwner
const owner = await models.Contact.findOne({ where: { isOwner: true } })
const contactIds = [owner.id]
if (tribeOwner) {
theTribeOwner = tribeOwner // might already include??
@ -302,6 +303,8 @@ async function receiveGroupJoin(payload) {
contactIds.push(createdContact.id)
}
}
if(!theSender) return // fail (no contact key?)
await chat.update({ contactIds: JSON.stringify(contactIds) })
var date = new Date()

2
api/controllers/messages.ts

@ -108,7 +108,7 @@ const sendMessage = async (req, res) => {
remote_text_map,
} = req.body
console.log('[sendMessage]')
console.log('[sendMessage]',remote_text_map)
var date = new Date();
date.setMilliseconds(0)

11
api/network/receive.ts

@ -15,6 +15,7 @@ const typesToForward=[
]
async function onReceive(payload){
// if tribe, owner must forward to MQTT
console.log("RECEIVED PAYLOAD",payload)
const isTribe = payload.chat.type===constants.chat_types.tribe
if(isTribe && typesToForward.includes(payload.type)){
const tribeOwnerPubKey = await tribes.verifySignedTimestamp(payload.chat.uuid)
@ -31,12 +32,18 @@ async function onReceive(payload){
}
async function forwardMessageToTribe(payload){
console.log("FORWARD TO TRIBE",payload)
const chat = await models.Chat.findOne({where:{uuid:payload.chat.uuid}})
const sender = await models.Contact.findOne({where:{publicKey:payload.sender.pub_key}})
//const sender = await models.Contact.findOne({where:{publicKey:payload.sender.pub_key}})
const owner = await models.Contact.findOne({where:{isOwner:true}})
const type = payload.type
const message = payload.message
sendMessage({
chat, sender, type, message,
sender: {
...owner.dataValues, // ADD IN REAL ALIAS HERE??!
...payload.sender&&payload.sender.alias && {alias:payload.sender.alias}
},
chat, type, message,
success: ()=>{},
receive: ()=>{}
})

14
api/network/send.ts

@ -13,6 +13,12 @@ export async function sendMessage(params) {
const m = newmsg(type, chat, sender, message)
let msg = m
console.log(type,message)
if(!sender) {
console.log("NO SENDER?????")
return
}
let contactIds = (typeof chat.contactIds==='string' ? JSON.parse(chat.contactIds) : chat.contactIds) || []
if(contactIds.length===1) {
if (contactIds[0]===1) {
@ -23,6 +29,7 @@ export async function sendMessage(params) {
let networkType:NetworkType = undefined
const isTribe = chat.type===constants.chat_types.tribe
let isTribeOwner = false
const chatUUID = chat.uuid
if(isTribe) {
if(type===constants.message_types.confirmation) {
@ -32,6 +39,7 @@ export async function sendMessage(params) {
const tribeOwnerPubKey = await tribes.verifySignedTimestamp(chatUUID)
if(sender.publicKey===tribeOwnerPubKey){
console.log('im owner! mqtt!')
isTribeOwner = true
networkType = 'mqtt' // broadcast to all
// decrypt message.content and message.mediaKey w groupKey
msg = await decryptMessage(msg, chat)
@ -46,7 +54,7 @@ export async function sendMessage(params) {
let no:any = null
console.log('all contactIds',contactIds)
await asyncForEach(contactIds, async contactId => {
if (contactId == sender.id) {
if (contactId == 1) { // dont send to self
return
}
@ -54,7 +62,7 @@ export async function sendMessage(params) {
const destkey = contact.publicKey
console.log('-> sending to ', contact.id, destkey)
const m = await personalizeMessage(msg, contact)
const m = await personalizeMessage(msg, contact, isTribeOwner)
const opts = {
dest: destkey,
data: m,
@ -104,7 +112,7 @@ export function signAndSend(opts, mqttTopic?:string){
function newmsg(type, chat, sender, message){
const includeGroupKey = type===constants.message_types.group_create || type===constants.message_types.group_invite
const includeAlias = chat.type===constants.chat_types.tribe
const includeAlias = sender && sender.alias && chat.type===constants.chat_types.tribe
return {
type: type,
chat: {

25
api/utils/msg.ts

@ -4,10 +4,16 @@ import * as path from 'path'
import * as rsa from '../crypto/rsa'
const constants = require(path.join(__dirname,'../../config/constants.json'))
function addInRemoteText(full:{[k:string]:any}, contactId){
function addInRemoteText(full:{[k:string]:any}, contactId, isTribe:boolean){
const m = full && full.message
if (!(m && m.content)) return full
if (!(typeof m.content==='object')) return full
if(isTribe) {
// if just one, send it (for tribe remote_text_map... is there a better way?)
if(Object.values(m.content).length===1) {
return fillmsg(full, {content: Object.values(m.content)[0]})
}
}
return fillmsg(full, {content: m.content[contactId+'']})
}
@ -32,14 +38,16 @@ function removeAllNonAdminMembersIfTribe(full:{[k:string]:any}, destkey){
// return fillchatmsg(full, {members})
}
// THIS IS ONLY FOR TRIBE OWNER
// by this time the content and mediaKey are already in message as string
async function encryptTribeBroadcast(full:{[k:string]:any}, contact){
async function encryptTribeBroadcast(full:{[k:string]:any}, contact, isTribe:boolean, isTribeOwner:boolean){
if(!isTribeOwner) return full
const chat = full && full.chat
const message = full && full.message
if (!message || !(chat && chat.type && chat.uuid)) return full
const isTribe = chat.type===constants.chat_types.tribe
const obj: {[k:string]:any} = {}
if(isTribe) { // has been previously decrypted
if(isTribe && isTribeOwner) { // has been previously decrypted
if(message.content) {
const encContent = await rsa.encrypt(contact.contactKey, message.content)
obj.content = encContent
@ -117,18 +125,21 @@ async function decryptMessage(full:{[k:string]:any}, chat) {
return fillmsg(full, obj)
}
async function personalizeMessage(m,contact){
async function personalizeMessage(m,contact,isTribeOwner:boolean){
const contactId = contact.contactId
const destkey = contact.publicKey
const cloned = JSON.parse(JSON.stringify(m))
const msgWithRemoteTxt = addInRemoteText(cloned, contactId)
const chat = cloned && cloned.chat
const isTribe = chat.type&&chat.type===constants.chat_types.tribe
const msgWithRemoteTxt = addInRemoteText(cloned, contactId, isTribe)
const cleanMsg = removeRecipientFromChatMembers(msgWithRemoteTxt, destkey)
const cleanerMsg = removeAllNonAdminMembersIfTribe(cleanMsg, destkey)
const msgWithMediaKey = addInMediaKey(cleanerMsg, contactId)
const msgWithMediaToken = await finishTermsAndReceipt(msgWithMediaKey, destkey)
const encMsg = await encryptTribeBroadcast(msgWithMediaToken, contact)
const encMsg = await encryptTribeBroadcast(msgWithMediaToken, contact, isTribe, isTribeOwner)
return encMsg
}

1
api/utils/tribes.ts

@ -46,7 +46,6 @@ export function subscribe(topic){
}
export function publish(topic,msg){
console.log("PUBLISH",client,topic,msg)
if(client) client.publish(topic,msg)
}

2
dist/api/controllers/chats.js

@ -298,6 +298,8 @@ function receiveGroupJoin(payload) {
contactIds.push(createdContact.id);
}
}
if (!theSender)
return; // fail (no contact key?)
yield chat.update({ contactIds: JSON.stringify(contactIds) });
var date = new Date();
date.setMilliseconds(0);

2
dist/api/controllers/chats.js.map

File diff suppressed because one or more lines are too long

2
dist/api/controllers/messages.js

@ -98,7 +98,7 @@ const sendMessage = (req, res) => __awaiter(void 0, void 0, void 0, function* ()
// return failure(res, e.message)
// }
const { contact_id, text, remote_text, chat_id, remote_text_map, } = req.body;
console.log('[sendMessage]');
console.log('[sendMessage]', remote_text_map);
var date = new Date();
date.setMilliseconds(0);
const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });

2
dist/api/controllers/messages.js.map

File diff suppressed because one or more lines are too long

8
dist/api/network/receive.js

@ -25,6 +25,7 @@ const typesToForward = [
function onReceive(payload) {
return __awaiter(this, void 0, void 0, function* () {
// if tribe, owner must forward to MQTT
console.log("RECEIVED PAYLOAD", payload);
const isTribe = payload.chat.type === constants.chat_types.tribe;
if (isTribe && typesToForward.includes(payload.type)) {
const tribeOwnerPubKey = yield tribes.verifySignedTimestamp(payload.chat.uuid);
@ -43,12 +44,15 @@ function onReceive(payload) {
}
function forwardMessageToTribe(payload) {
return __awaiter(this, void 0, void 0, function* () {
console.log("FORWARD TO TRIBE", payload);
const chat = yield models_1.models.Chat.findOne({ where: { uuid: payload.chat.uuid } });
const sender = yield models_1.models.Contact.findOne({ where: { publicKey: payload.sender.pub_key } });
//const sender = await models.Contact.findOne({where:{publicKey:payload.sender.pub_key}})
const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });
const type = payload.type;
const message = payload.message;
send_1.sendMessage({
chat, sender, type, message,
sender: Object.assign(Object.assign({}, owner.dataValues), payload.sender && payload.sender.alias && { alias: payload.sender.alias }),
chat, type, message,
success: () => { },
receive: () => { }
});

2
dist/api/network/receive.js.map

File diff suppressed because one or more lines are too long

13
dist/api/network/send.js

@ -20,6 +20,11 @@ function sendMessage(params) {
const { type, chat, message, sender, amount, success, failure } = params;
const m = newmsg(type, chat, sender, message);
let msg = m;
console.log(type, message);
if (!sender) {
console.log("NO SENDER?????");
return;
}
let contactIds = (typeof chat.contactIds === 'string' ? JSON.parse(chat.contactIds) : chat.contactIds) || [];
if (contactIds.length === 1) {
if (contactIds[0] === 1) {
@ -30,6 +35,7 @@ function sendMessage(params) {
}
let networkType = undefined;
const isTribe = chat.type === constants.chat_types.tribe;
let isTribeOwner = false;
const chatUUID = chat.uuid;
if (isTribe) {
if (type === constants.message_types.confirmation) {
@ -39,6 +45,7 @@ function sendMessage(params) {
const tribeOwnerPubKey = yield tribes.verifySignedTimestamp(chatUUID);
if (sender.publicKey === tribeOwnerPubKey) {
console.log('im owner! mqtt!');
isTribeOwner = true;
networkType = 'mqtt'; // broadcast to all
// decrypt message.content and message.mediaKey w groupKey
msg = yield msg_1.decryptMessage(msg, chat);
@ -53,13 +60,13 @@ function sendMessage(params) {
let no = null;
console.log('all contactIds', contactIds);
yield asyncForEach(contactIds, (contactId) => __awaiter(this, void 0, void 0, function* () {
if (contactId == sender.id) {
if (contactId == 1) { // dont send to self
return;
}
const contact = yield models_1.models.Contact.findOne({ where: { id: contactId } });
const destkey = contact.publicKey;
console.log('-> sending to ', contact.id, destkey);
const m = yield msg_1.personalizeMessage(msg, contact);
const m = yield msg_1.personalizeMessage(msg, contact, isTribeOwner);
const opts = {
dest: destkey,
data: m,
@ -116,7 +123,7 @@ function signAndSend(opts, mqttTopic) {
exports.signAndSend = signAndSend;
function newmsg(type, chat, sender, message) {
const includeGroupKey = type === constants.message_types.group_create || type === constants.message_types.group_invite;
const includeAlias = chat.type === constants.chat_types.tribe;
const includeAlias = sender && sender.alias && chat.type === constants.chat_types.tribe;
return {
type: type,
chat: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ uuid: chat.uuid }, chat.name && { name: chat.name }), (chat.type || chat.type === 0) && { type: chat.type }), chat.members && { members: chat.members }), (includeGroupKey && chat.groupKey) && { groupKey: chat.groupKey }), (includeGroupKey && chat.host) && { host: chat.host }),

2
dist/api/network/send.js.map

@ -1 +1 @@
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../api/network/send.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../api/network/send.ts"],"names":[],"mappings":"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"}

24
dist/api/utils/msg.js

@ -13,12 +13,18 @@ const ldat_1 = require("./ldat");
const path = require("path");
const rsa = require("../crypto/rsa");
const constants = require(path.join(__dirname, '../../config/constants.json'));
function addInRemoteText(full, contactId) {
function addInRemoteText(full, contactId, isTribe) {
const m = full && full.message;
if (!(m && m.content))
return full;
if (!(typeof m.content === 'object'))
return full;
if (isTribe) {
// if just one, send it (for tribe remote_text_map... is there a better way?)
if (Object.values(m.content).length === 1) {
return fillmsg(full, { content: Object.values(m.content)[0] });
}
}
return fillmsg(full, { content: m.content[contactId + ''] });
}
function removeRecipientFromChatMembers(full, destkey) {
@ -41,16 +47,18 @@ function removeAllNonAdminMembersIfTribe(full, destkey) {
// if(members[destkey]) delete members[destkey]
// return fillchatmsg(full, {members})
}
// THIS IS ONLY FOR TRIBE OWNER
// by this time the content and mediaKey are already in message as string
function encryptTribeBroadcast(full, contact) {
function encryptTribeBroadcast(full, contact, isTribe, isTribeOwner) {
return __awaiter(this, void 0, void 0, function* () {
if (!isTribeOwner)
return full;
const chat = full && full.chat;
const message = full && full.message;
if (!message || !(chat && chat.type && chat.uuid))
return full;
const isTribe = chat.type === constants.chat_types.tribe;
const obj = {};
if (isTribe) { // has been previously decrypted
if (isTribe && isTribeOwner) { // has been previously decrypted
if (message.content) {
const encContent = yield rsa.encrypt(contact.contactKey, message.content);
obj.content = encContent;
@ -132,17 +140,19 @@ function decryptMessage(full, chat) {
});
}
exports.decryptMessage = decryptMessage;
function personalizeMessage(m, contact) {
function personalizeMessage(m, contact, isTribeOwner) {
return __awaiter(this, void 0, void 0, function* () {
const contactId = contact.contactId;
const destkey = contact.publicKey;
const cloned = JSON.parse(JSON.stringify(m));
const msgWithRemoteTxt = addInRemoteText(cloned, contactId);
const chat = cloned && cloned.chat;
const isTribe = chat.type && chat.type === constants.chat_types.tribe;
const msgWithRemoteTxt = addInRemoteText(cloned, contactId, isTribe);
const cleanMsg = removeRecipientFromChatMembers(msgWithRemoteTxt, destkey);
const cleanerMsg = removeAllNonAdminMembersIfTribe(cleanMsg, destkey);
const msgWithMediaKey = addInMediaKey(cleanerMsg, contactId);
const msgWithMediaToken = yield finishTermsAndReceipt(msgWithMediaKey, destkey);
const encMsg = yield encryptTribeBroadcast(msgWithMediaToken, contact);
const encMsg = yield encryptTribeBroadcast(msgWithMediaToken, contact, isTribe, isTribeOwner);
return encMsg;
});
}

2
dist/api/utils/msg.js.map

File diff suppressed because one or more lines are too long

1
dist/api/utils/tribes.js

@ -58,7 +58,6 @@ function subscribe(topic) {
}
exports.subscribe = subscribe;
function publish(topic, msg) {
console.log("PUBLISH", client, topic, msg);
if (client)
client.publish(topic, msg);
}

2
dist/api/utils/tribes.js.map

@ -1 +1 @@
{"version":3,"file":"tribes.js","sourceRoot":"","sources":["../../../api/utils/tribes.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"tribes.js","sourceRoot":"","sources":["../../../api/utils/tribes.ts"],"names":[],"mappings":"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"}
Loading…
Cancel
Save