Browse Source

finish network abstraction

feature/dockerfile-arm
Evan Feenstra 5 years ago
parent
commit
46984b9997
  1. 2
      api/controllers/chats.ts
  2. 3
      api/grpc/index.ts
  3. 55
      api/network/receive.ts
  4. 68
      api/network/send.ts
  5. 71
      api/utils/msg.ts
  6. 4
      api/utils/tribes.ts
  7. 2
      dist/api/controllers/chats.js
  8. 2
      dist/api/controllers/chats.js.map
  9. 5
      dist/api/grpc/index.js
  10. 2
      dist/api/grpc/index.js.map
  11. 55
      dist/api/network/receive.js
  12. 2
      dist/api/network/receive.js.map
  13. 62
      dist/api/network/send.js
  14. 2
      dist/api/network/send.js.map
  15. 71
      dist/api/utils/msg.js
  16. 2
      dist/api/utils/msg.js.map
  17. 5
      dist/api/utils/tribes.js
  18. 2
      dist/api/utils/tribes.js.map

2
api/controllers/chats.ts

@ -272,7 +272,7 @@ async function receiveGroupJoin(payload) {
const chat = await models.Chat.findOne({ where: { uuid: chat_uuid } })
if (!chat) return
// THIS CHECK CAN BE DONE IN NETWORK.RECEIVE --> forward to mqtt if needed to
// THIS CHECK CAN BE DONE IN NETWORK.RECEIVE? --> forward to mqtt if needed to
const isTribe = chat_type===constants.chat_types.tribe
if(isTribe) {
const owner = await models.Contact.findOne({ where: { isOwner: true } })

3
api/grpc/index.ts

@ -7,11 +7,10 @@ import {loadLightning} from '../utils/lightning'
import * as network from '../network'
import * as moment from 'moment'
import * as path from 'path'
import {parseKeysendInvoice} from '../network'
const constants = require(path.join(__dirname,'../../config/constants.json'))
function subscribeInvoices() {
function subscribeInvoices(parseKeysendInvoice) {
return new Promise(async(resolve,reject)=>{
const lightning = await loadLightning()

55
api/network/receive.ts

@ -4,10 +4,44 @@ import {getInfo} from '../utils/lightning'
import {controllers} from '../controllers'
import * as tribes from '../utils/tribes'
import {SPHINX_CUSTOM_RECORD_KEY, verifyAscii} from '../utils/lightning'
import { models } from '../models'
import {sendMessage} from './send'
const constants = require(path.join(__dirname,'../../config/constants.json'))
const types = constants.message_types
const typesToForward=[
types.message, types.attachment, types.group_join, types.group_leave
]
async function onReceive(payload){
// if tribe, owner must forward to MQTT
const isTribe = payload.chat.type===constants.chat_types.tribe
if(isTribe && typesToForward.includes(payload.type)){
const tribeOwnerPubKey = await tribes.verifySignedTimestamp(payload.chat.uuid)
const owner = await models.Contact.findOne({where: {isOwner:true}})
if(owner.publicKey===tribeOwnerPubKey){
forwardMessageToTribe(payload)
}
}
if(ACTIONS[payload.type]) {
ACTIONS[payload.type](payload)
} else {
console.log('Incorrect payload type:', payload.type)
}
}
function forwardMessageToTribe(payload){
const chat = models.Chat.findOne({where:{uuid:payload.chat.uuid}})
const sender = models.Contact.findOne({where:{publicKey:payload.sender.pub_key}})
const type = payload.type
const message = payload.message
sendMessage({
chat, sender, type, message,
success: ()=>{},
receive: ()=>{}
})
}
const ACTIONS = {
[types.contact_key]: controllers.contacts.receiveContactKey,
[types.contact_key_confirmation]: controllers.contacts.receiveConfirmContactKey,
@ -28,20 +62,19 @@ const ACTIONS = {
export async function initGrpcSubscriptions() {
try{
await getInfo()
await lndService.subscribeInvoices()
await lndService.subscribeInvoices(parseKeysendInvoice)
} catch(e) {
throw e
}
}
export async function initTribesSubscriptions(){
tribes.connect(myPubKey =>{ // connected callback
// get all tribes and sub to each individually ????
tribes.subscribe(`${myPubKey}/#`)
}, (topic, message)=>{ // onMessage callback
tribes.connect(async(topic, message)=>{ // onMessage callback
console.log("=====> msg received! TOPIC", topic, "MESSAGE", message)
// check topic is signed by sender?
// fire off the ACTION
// fire off the ACTION
const payload = await parseAndVerifyPayload(message)
onReceive(payload)
})
}
@ -83,15 +116,11 @@ export async function parseKeysendInvoice(i){
if(threads) payload = await parseAndVerifyPayload(threads)
}
if(payload){
const dat = payload.content || payload
const dat = payload
if(value && dat && dat.message){
dat.message.amount = value // ADD IN TRUE VALUE
}
if(ACTIONS[payload.type]) {
ACTIONS[payload.type](payload)
} else {
console.log('Incorrect payload type:', payload.type)
}
onReceive(dat)
}
}

68
api/network/send.ts

@ -1,46 +1,32 @@
import { models } from '../models'
import * as LND from '../utils/lightning'
import {personalizeMessage} from '../utils/msg'
import {personalizeMessage, decryptMessage} from '../utils/msg'
import * as path from 'path'
import * as tribes from '../utils/tribes'
const constants = require(path.join(__dirname,'../../config/constants.json'))
export function signAndSend(opts){
type NetworkType = undefined | 'mqtt' | 'lightning'
export function signAndSend(opts, mqttTopic?:string){
return new Promise(async function(resolve, reject) {
if(!opts.data || typeof opts.data!=='object') {
return reject('object plz')
}
let data = JSON.stringify(opts.data)
// SIGN HERE and append sig
const sig = await LND.signAscii(data)
data = data + sig
console.log("DATA")
console.log(opts.data)
try {
const payload = opts.data
if(payload.chat&&payload.chat.type===constants.chat_types.tribe) {
// if owner pub to mqtt all group members (but not to self!!!)
const chatUUID = payload.chat.uuid
const recipient = opts.dest
if(!chatUUID || !recipient) return
const tribeOwnerPubKey = await tribes.verifySignedTimestamp(chatUUID)
const owner = await models.Contact.findOne({ where: { isOwner: true } })
if(owner.publicKey===tribeOwnerPubKey){
tribes.publish(`${recipient}/${chatUUID}`, data)
} else {
// else keysend to owner ONLY
if(recipient===tribeOwnerPubKey) {
LND.keysendMessage({...opts,data})
}
}
if(mqttTopic) {
await tribes.publish(mqttTopic, data)
} else {
LND.keysendMessage({...opts,data})
await LND.keysendMessage({...opts,data})
}
resolve(true)
} catch(e) {
throw e
reject(e)
}
})
}
@ -48,11 +34,28 @@ export function signAndSend(opts){
export async function sendMessage(params) {
const { type, chat, message, sender, amount, success, failure } = params
const m = newmsg(type, chat, sender, message)
let msg = m
const contactIds = (typeof chat.contactIds==='string' ? JSON.parse(chat.contactIds) : chat.contactIds) || []
let contactIds = (typeof chat.contactIds==='string' ? JSON.parse(chat.contactIds) : chat.contactIds) || []
if(contactIds.length===1) {
if (contactIds[0]===1) {
return success(true) // if no contacts thats fine (like create tribe)
return success(true) // if no contacts thats fine (like create public tribe)
}
}
let networkType:NetworkType = undefined
const isTribe = chat.type===constants.chat_types.tribe
const chatUUID = chat.uuid
if(isTribe) {
const tribeOwnerPubKey = await tribes.verifySignedTimestamp(chatUUID)
if(sender.publicKey===tribeOwnerPubKey){
networkType = 'mqtt' // broadcast to all
// decrypt message.content and message.mediaKey w groupKey
msg = await decryptMessage(msg, chat)
} else {
// if tribe, send to owner only
const tribeOwner = await models.Contact.findOne({where: {publicKey:tribeOwnerPubKey}})
contactIds = [tribeOwner.id]
}
}
@ -64,20 +67,19 @@ export async function sendMessage(params) {
return
}
console.log('-> sending to contact #', contactId)
const contact = await models.Contact.findOne({ where: { id: contactId } })
const destkey = contact.publicKey
console.log('-> sending to ', contact.id, destkey)
const finalMsg = await personalizeMessage(m, contactId, destkey)
const m = await personalizeMessage(msg, contact)
const opts = {
dest: destkey,
data: finalMsg,
amt: Math.max(amount, 3)
data: m,
amt: Math.max((amount||0), 3)
}
try {
const r = await signAndSend(opts)
const mqttTopic = networkType==='mqtt' ? `${destkey}/${chatUUID}` : ''
const r = await signAndSend(opts, mqttTopic)
yes = r
} catch (e) {
console.log("KEYSEND ERROR", e)

71
api/utils/msg.ts

@ -1,5 +1,8 @@
import { tokenFromTerms } from './ldat'
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){
const m = full && full.message
@ -29,6 +32,26 @@ function removeAllNonAdminMembersIfTribe(full:{[k:string]:any}, destkey){
// return fillchatmsg(full, {members})
}
// by this time the content and mediaKey are already in message as string
async function encryptTribeBroadcast(full:{[k:string]:any}, contact){
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(message.content) {
const encContent = await rsa.encrypt(contact.contactKey, message.content)
obj.content = encContent
}
if(message.mediaKey) {
const encMediaKey = await rsa.encrypt(contact.contactKey, message.mediaKey)
obj.mediaKey = encMediaKey
}
}
return fillmsg(full, obj)
}
function addInMediaKey(full:{[k:string]:any}, contactId){
const m = full && full.message
if (!(m && m.mediaKey)) return full
@ -60,14 +83,50 @@ async function finishTermsAndReceipt(full:{[k:string]:any}, destkey) {
return fullmsg
}
async function personalizeMessage(m,contactId,destkey){
// DECRYPT EITHER STRING OR FIRST VAL IN OBJ
async function decryptMessage(full:{[k:string]:any},chat) {
if(!chat.groupPrivateKey) return full
const m = full && full.message
if (!m) return full
const obj: {[k:string]:any} = {}
if(m.content) {
let content = m.content
if(typeof m.content==='object') {
if(Object.values(m.content).length) {
content = Object.values(m.content)[0]
}
}
const decContent = rsa.decrypt(chat.groupPrivateKey, content)
obj.content = decContent
}
if (m.mediaKey) {
let mediaKey = m.mediaKey
if(typeof m.mediaKey==='object') {
if(Object.values(m.mediaKey).length) {
mediaKey = Object.values(m.mediaKey)[0]
}
}
const decMediaKey = rsa.decrypt(chat.groupPrivateKey, mediaKey)
obj.mediaKey = decMediaKey
}
return fillmsg(full, obj)
}
async function personalizeMessage(m,contact){
const contactId = contact.contactId
const destkey = contact.publicKey
const cloned = JSON.parse(JSON.stringify(m))
const msg = addInRemoteText(cloned, contactId)
const cleanMsg = removeRecipientFromChatMembers(msg, destkey)
const msgWithRemoteTxt = addInRemoteText(cloned, contactId)
const cleanMsg = removeRecipientFromChatMembers(msgWithRemoteTxt, destkey)
const cleanerMsg = removeAllNonAdminMembersIfTribe(cleanMsg, destkey)
const msgWithMediaKey = addInMediaKey(cleanerMsg, contactId)
const finalMsg = await finishTermsAndReceipt(msgWithMediaKey, destkey)
return finalMsg
const msgWithMediaToken = await finishTermsAndReceipt(msgWithMediaKey, destkey)
const encMsg = await encryptTribeBroadcast(msgWithMediaToken, contact)
return encMsg
}
function fillmsg(full, props){
@ -89,5 +148,5 @@ function fillchatmsg(full, props){
}
export {
personalizeMessage
personalizeMessage, decryptMessage,
}

4
api/utils/tribes.ts

@ -10,7 +10,7 @@ const config = require(path.join(__dirname,'../../config/app.json'))[env]
let client:any
export async function connect(connectedCallback, onMessage) {
export async function connect(onMessage) {
try{
const info = await LND.getInfo()
@ -25,7 +25,7 @@ export async function connect(connectedCallback, onMessage) {
})
client.on('connect', function () {
console.log("[tribes] connected!")
if(connectedCallback) connectedCallback(info.identity_pubkey)
client.subscribe(`${info.identity_pubkey}/#`)
})
client.on('close', function () {
setTimeout(()=> reconnect(), 2000)

2
dist/api/controllers/chats.js

@ -267,7 +267,7 @@ function receiveGroupJoin(payload) {
const chat = yield models_1.models.Chat.findOne({ where: { uuid: chat_uuid } });
if (!chat)
return;
// THIS CHECK CAN BE DONE IN NETWORK.RECEIVE --> forward to mqtt if needed to
// THIS CHECK CAN BE DONE IN NETWORK.RECEIVE? --> forward to mqtt if needed to
const isTribe = chat_type === constants.chat_types.tribe;
if (isTribe) {
const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });

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

File diff suppressed because one or more lines are too long

5
dist/api/grpc/index.js

@ -18,9 +18,8 @@ const lightning_1 = require("../utils/lightning");
const network = require("../network");
const moment = require("moment");
const path = require("path");
const network_1 = require("../network");
const constants = require(path.join(__dirname, '../../config/constants.json'));
function subscribeInvoices() {
function subscribeInvoices(parseKeysendInvoice) {
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
const lightning = yield lightning_1.loadLightning();
var call = lightning.subscribeInvoices();
@ -32,7 +31,7 @@ function subscribeInvoices() {
}
// console.log("IS KEYSEND", response.is_keysend)
if (response.is_keysend) {
network_1.parseKeysendInvoice(response);
parseKeysendInvoice(response);
}
else {
const invoice = yield models_1.models.Message.findOne({ where: { type: constants.message_types.invoice, payment_request: response['payment_request'] } });

2
dist/api/grpc/index.js.map

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

55
dist/api/network/receive.js

@ -15,8 +15,43 @@ const lightning_1 = require("../utils/lightning");
const controllers_1 = require("../controllers");
const tribes = require("../utils/tribes");
const lightning_2 = require("../utils/lightning");
const models_1 = require("../models");
const send_1 = require("./send");
const constants = require(path.join(__dirname, '../../config/constants.json'));
const types = constants.message_types;
const typesToForward = [
types.message, types.attachment, types.group_join, types.group_leave
];
function onReceive(payload) {
return __awaiter(this, void 0, void 0, function* () {
// if tribe, owner must forward to MQTT
const isTribe = payload.chat.type === constants.chat_types.tribe;
if (isTribe && typesToForward.includes(payload.type)) {
const tribeOwnerPubKey = yield tribes.verifySignedTimestamp(payload.chat.uuid);
const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });
if (owner.publicKey === tribeOwnerPubKey) {
forwardMessageToTribe(payload);
}
}
if (ACTIONS[payload.type]) {
ACTIONS[payload.type](payload);
}
else {
console.log('Incorrect payload type:', payload.type);
}
});
}
function forwardMessageToTribe(payload) {
const chat = models_1.models.Chat.findOne({ where: { uuid: payload.chat.uuid } });
const sender = models_1.models.Contact.findOne({ where: { publicKey: payload.sender.pub_key } });
const type = payload.type;
const message = payload.message;
send_1.sendMessage({
chat, sender, type, message,
success: () => { },
receive: () => { }
});
}
const ACTIONS = {
[types.contact_key]: controllers_1.controllers.contacts.receiveContactKey,
[types.contact_key_confirmation]: controllers_1.controllers.contacts.receiveConfirmContactKey,
@ -37,7 +72,7 @@ function initGrpcSubscriptions() {
return __awaiter(this, void 0, void 0, function* () {
try {
yield lightning_1.getInfo();
yield lndService.subscribeInvoices();
yield lndService.subscribeInvoices(parseKeysendInvoice);
}
catch (e) {
throw e;
@ -47,14 +82,13 @@ function initGrpcSubscriptions() {
exports.initGrpcSubscriptions = initGrpcSubscriptions;
function initTribesSubscriptions() {
return __awaiter(this, void 0, void 0, function* () {
tribes.connect(myPubKey => {
// get all tribes and sub to each individually ????
tribes.subscribe(`${myPubKey}/#`);
}, (topic, message) => {
tribes.connect((topic, message) => __awaiter(this, void 0, void 0, function* () {
console.log("=====> msg received! TOPIC", topic, "MESSAGE", message);
// check topic is signed by sender?
// fire off the ACTION
});
const payload = yield parseAndVerifyPayload(message);
onReceive(payload);
}));
});
}
exports.initTribesSubscriptions = initTribesSubscriptions;
@ -102,16 +136,11 @@ function parseKeysendInvoice(i) {
payload = yield parseAndVerifyPayload(threads);
}
if (payload) {
const dat = payload.content || payload;
const dat = payload;
if (value && dat && dat.message) {
dat.message.amount = value; // ADD IN TRUE VALUE
}
if (ACTIONS[payload.type]) {
ACTIONS[payload.type](payload);
}
else {
console.log('Incorrect payload type:', payload.type);
}
onReceive(dat);
}
});
}

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

File diff suppressed because one or more lines are too long

62
dist/api/network/send.js

@ -15,44 +15,26 @@ const msg_1 = require("../utils/msg");
const path = require("path");
const tribes = require("../utils/tribes");
const constants = require(path.join(__dirname, '../../config/constants.json'));
function signAndSend(opts) {
function signAndSend(opts, mqttTopic) {
return new Promise(function (resolve, reject) {
return __awaiter(this, void 0, void 0, function* () {
if (!opts.data || typeof opts.data !== 'object') {
return reject('object plz');
}
let data = JSON.stringify(opts.data);
// SIGN HERE and append sig
const sig = yield LND.signAscii(data);
data = data + sig;
console.log("DATA");
console.log(opts.data);
try {
const payload = opts.data;
if (payload.chat && payload.chat.type === constants.chat_types.tribe) {
// if owner pub to mqtt all group members (but not to self!!!)
const chatUUID = payload.chat.uuid;
const recipient = opts.dest;
if (!chatUUID || !recipient)
return;
const tribeOwnerPubKey = yield tribes.verifySignedTimestamp(chatUUID);
const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });
if (owner.publicKey === tribeOwnerPubKey) {
tribes.publish(`${recipient}/${chatUUID}`, data);
}
else {
// else keysend to owner ONLY
if (recipient === tribeOwnerPubKey) {
LND.keysendMessage(Object.assign(Object.assign({}, opts), { data }));
}
}
if (mqttTopic) {
yield tribes.publish(mqttTopic, data);
}
else {
LND.keysendMessage(Object.assign(Object.assign({}, opts), { data }));
yield LND.keysendMessage(Object.assign(Object.assign({}, opts), { data }));
}
resolve(true);
}
catch (e) {
throw e;
reject(e);
}
});
});
@ -62,10 +44,27 @@ function sendMessage(params) {
return __awaiter(this, void 0, void 0, function* () {
const { type, chat, message, sender, amount, success, failure } = params;
const m = newmsg(type, chat, sender, message);
const contactIds = (typeof chat.contactIds === 'string' ? JSON.parse(chat.contactIds) : chat.contactIds) || [];
let msg = m;
let contactIds = (typeof chat.contactIds === 'string' ? JSON.parse(chat.contactIds) : chat.contactIds) || [];
if (contactIds.length === 1) {
if (contactIds[0] === 1) {
return success(true); // if no contacts thats fine (like create tribe)
return success(true); // if no contacts thats fine (like create public tribe)
}
}
let networkType = undefined;
const isTribe = chat.type === constants.chat_types.tribe;
const chatUUID = chat.uuid;
if (isTribe) {
const tribeOwnerPubKey = yield tribes.verifySignedTimestamp(chatUUID);
if (sender.publicKey === tribeOwnerPubKey) {
networkType = 'mqtt'; // broadcast to all
// decrypt message.content and message.mediaKey w groupKey
msg = yield msg_1.decryptMessage(msg, chat);
}
else {
// if tribe, send to owner only
const tribeOwner = yield models_1.models.Contact.findOne({ where: { publicKey: tribeOwnerPubKey } });
contactIds = [tribeOwner.id];
}
}
let yes = null;
@ -75,17 +74,18 @@ function sendMessage(params) {
if (contactId == sender.id) {
return;
}
console.log('-> sending to contact #', contactId);
const contact = yield models_1.models.Contact.findOne({ where: { id: contactId } });
const destkey = contact.publicKey;
const finalMsg = yield msg_1.personalizeMessage(m, contactId, destkey);
console.log('-> sending to ', contact.id, destkey);
const m = yield msg_1.personalizeMessage(msg, contact);
const opts = {
dest: destkey,
data: finalMsg,
amt: Math.max(amount, 3)
data: m,
amt: Math.max((amount || 0), 3)
};
try {
const r = yield signAndSend(opts);
const mqttTopic = networkType === 'mqtt' ? `${destkey}/${chatUUID}` : '';
const r = yield signAndSend(opts, mqttTopic);
yes = r;
}
catch (e) {

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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"}

71
dist/api/utils/msg.js

@ -10,6 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", { value: true });
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) {
const m = full && full.message;
if (!(m && m.content))
@ -38,6 +41,28 @@ function removeAllNonAdminMembersIfTribe(full, destkey) {
// if(members[destkey]) delete members[destkey]
// return fillchatmsg(full, {members})
}
// by this time the content and mediaKey are already in message as string
function encryptTribeBroadcast(full, contact) {
return __awaiter(this, void 0, void 0, function* () {
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 (message.content) {
const encContent = yield rsa.encrypt(contact.contactKey, message.content);
obj.content = encContent;
}
if (message.mediaKey) {
const encMediaKey = yield rsa.encrypt(contact.contactKey, message.mediaKey);
obj.mediaKey = encMediaKey;
}
}
return fillmsg(full, obj);
});
}
function addInMediaKey(full, contactId) {
const m = full && full.message;
if (!(m && m.mediaKey))
@ -71,15 +96,51 @@ function finishTermsAndReceipt(full, destkey) {
return fullmsg;
});
}
function personalizeMessage(m, contactId, destkey) {
// DECRYPT EITHER STRING OR FIRST VAL IN OBJ
function decryptMessage(full, chat) {
return __awaiter(this, void 0, void 0, function* () {
if (!chat.groupPrivateKey)
return full;
const m = full && full.message;
if (!m)
return full;
const obj = {};
if (m.content) {
let content = m.content;
if (typeof m.content === 'object') {
if (Object.values(m.content).length) {
content = Object.values(m.content)[0];
}
}
const decContent = rsa.decrypt(chat.groupPrivateKey, content);
obj.content = decContent;
}
if (m.mediaKey) {
let mediaKey = m.mediaKey;
if (typeof m.mediaKey === 'object') {
if (Object.values(m.mediaKey).length) {
mediaKey = Object.values(m.mediaKey)[0];
}
}
const decMediaKey = rsa.decrypt(chat.groupPrivateKey, mediaKey);
obj.mediaKey = decMediaKey;
}
return fillmsg(full, obj);
});
}
exports.decryptMessage = decryptMessage;
function personalizeMessage(m, contact) {
return __awaiter(this, void 0, void 0, function* () {
const contactId = contact.contactId;
const destkey = contact.publicKey;
const cloned = JSON.parse(JSON.stringify(m));
const msg = addInRemoteText(cloned, contactId);
const cleanMsg = removeRecipientFromChatMembers(msg, destkey);
const msgWithRemoteTxt = addInRemoteText(cloned, contactId);
const cleanMsg = removeRecipientFromChatMembers(msgWithRemoteTxt, destkey);
const cleanerMsg = removeAllNonAdminMembersIfTribe(cleanMsg, destkey);
const msgWithMediaKey = addInMediaKey(cleanerMsg, contactId);
const finalMsg = yield finishTermsAndReceipt(msgWithMediaKey, destkey);
return finalMsg;
const msgWithMediaToken = yield finishTermsAndReceipt(msgWithMediaKey, destkey);
const encMsg = yield encryptTribeBroadcast(msgWithMediaToken, contact);
return encMsg;
});
}
exports.personalizeMessage = personalizeMessage;

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

File diff suppressed because one or more lines are too long

5
dist/api/utils/tribes.js

@ -17,7 +17,7 @@ const mqtt = require("mqtt");
const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '../../config/app.json'))[env];
let client;
function connect(connectedCallback, onMessage) {
function connect(onMessage) {
return __awaiter(this, void 0, void 0, function* () {
try {
const info = yield LND.getInfo();
@ -33,8 +33,7 @@ function connect(connectedCallback, onMessage) {
});
client.on('connect', function () {
console.log("[tribes] connected!");
if (connectedCallback)
connectedCallback(info.identity_pubkey);
client.subscribe(`${info.identity_pubkey}/#`);
});
client.on('close', function () {
setTimeout(() => reconnect(), 2000);

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