Browse Source

bot install, intercept msgs and check for bot cmds, gen bot res, encrypt html msg

push-params
Evan Feenstra 5 years ago
parent
commit
d1b928c3fa
  1. 5
      api/controllers/actions.ts
  2. 71
      api/controllers/bots.ts
  3. 27
      api/controllers/chatTribes.ts
  4. 5
      api/controllers/index.ts
  5. 3
      api/models/ts/bot.ts
  6. 43
      api/network/intercept.ts
  7. 14
      api/network/interfaces.ts
  8. 2
      api/network/receive.ts
  9. 2
      api/network/send.ts
  10. 1
      api/utils/setup.ts
  11. 5
      dist/api/controllers/actions.js
  12. 2
      dist/api/controllers/actions.js.map
  13. 79
      dist/api/controllers/bots.js
  14. 2
      dist/api/controllers/bots.js.map
  15. 29
      dist/api/controllers/chatTribes.js
  16. 2
      dist/api/controllers/chatTribes.js.map
  17. 5
      dist/api/controllers/index.js
  18. 2
      dist/api/controllers/index.js.map
  19. 4
      dist/api/models/ts/bot.js
  20. 2
      dist/api/models/ts/bot.js.map
  21. 48
      dist/api/network/intercept.js
  22. 2
      dist/api/network/intercept.js.map
  23. 3
      dist/api/network/interfaces.js
  24. 1
      dist/api/network/interfaces.js.map
  25. 2
      dist/api/network/receive.js
  26. 2
      dist/api/network/receive.js.map
  27. 2
      dist/api/network/send.js
  28. 2
      dist/api/network/send.js.map
  29. 1
      dist/api/utils/setup.js
  30. 2
      dist/api/utils/setup.js.map

5
api/controllers/actions.ts

@ -6,6 +6,7 @@ import * as short from 'short-uuid'
import * as rsa from '../crypto/rsa'
import * as crypto from 'crypto'
import * as jsonUtils from '../utils/json'
import * as tribes from '../utils/tribes'
/*
hexdump -n 8 -e '4/4 "%08X" 1 "\n"' /dev/random
@ -49,8 +50,10 @@ export const createBot = async (req, res) => {
const isTribeOwner = owner.publicKey===chat.ownerPubkey
if(!isTribeOwner) return failure(res, 'not tribe owner')
const uuid = await tribes.genSignedTimestamp()
const newBot = {
id: crypto.randomBytes(8).toString('hex').toUpperCase(),
uuid,
id: crypto.randomBytes(16).toString('hex').toUpperCase(),
chatId: chat_id,
name: name,
secret: crypto.randomBytes(16).toString('hex').toUpperCase()

71
api/controllers/bots.ts

@ -1,13 +1,74 @@
import * as path from 'path'
import {Msg} from '../network/interfaces'
import * as short from 'short-uuid'
import * as rsa from '../crypto/rsa'
import { models } from '../models'
import * as socket from '../utils/socket'
import * as jsonUtils from '../utils/json'
const constants = require(path.join(__dirname, '../../config/constants.json'))
async function genBotRes(chat,text){
var date = new Date()
date.setMilliseconds(0)
const owner = await models.Contact.findOne({ where: { isOwner: true } })
const encryptedForMeText = rsa.encrypt(owner.contactKey, text)
const msg:{[k:string]:any}={
chatId: chat.id,
uuid: short.generate(),
type: constants.message_types.bot_res,
sender: owner.id,
amount: 0,
date: date,
messageContent: encryptedForMeText,
remoteMessageContent: '',
status: constants.statuses.confirmed,
createdAt: date,
updatedAt: date,
senderAlias: 'Bot Mother'
}
const message = await models.Message.create(msg)
socket.sendJson({
type: 'message',
response: jsonUtils.messageToJson(message, chat, owner)
})
}
// return whether this is legit to process
export async function processBotMessage(msg:Msg, chat, botInTribe): Promise<boolean> {
const txt = msg.message.content
if(txt.startsWith('/bot ')){
const arr = txt.split(' ')
if(arr.length<2) return false
const cmd = arr[1]
switch(cmd) {
case 'install':
if(arr.length<3) return false
installBot(arr[2], botInTribe)
default:
genBotRes(chat,botHelpHTML)
}
} else {
}
return true
}
const botHelpHTML=`<p>
<b>Bot commands:</b>
<ul>
<li><b>/bot install {BOTNAME}:</b>&nbsp;Install a new bot
<li><b>/bot help:</b>&nbsp;Print out this help message
</ul>
<p>
`
/* intercept */
export const installBot = async (req,res) => {
export function installBot(botname,botInTribe) {
console.log("INSTALL BOT NOW")
// need bot uuid and maker pubkey
// send bot_install to bot maker
// mqtt sub to the bot uuid (dont need this actually)
// generate ChatMember with bot=true
// bot_maker_pubkey, bot_uuid, bot_prefix
@ -24,7 +85,11 @@ export async function receiveBotInstall(payload) {
// create BotMember for publishing to mqtt
}
// type BotResType = 'install' | 'message' | 'broadcast' | 'keysend'
// type BotCmdType = 'install' | 'message' | 'broadcast' | 'keysend'
export async function receiveBotCmd(payload) {
console.log(constants.message_types.bot_cmd)
}
export async function receiveBotRes(payload) {
console.log(constants.message_types.bot_res)

27
api/controllers/chatTribes.ts

@ -376,6 +376,33 @@ export async function receiveMemberReject(payload) {
sendNotification(chat, chat_name, 'reject')
}
export async function receiveTribeDelete(payload) {
console.log('=> receiveTribeDelete')
const { chat, sender } = await helpers.parseReceiveParams(payload)
if(!chat) return console.log('no chat')
// await chat.update({status: constants.chat_statuses.rejected})
// update on tribes server too
let date = new Date()
date.setMilliseconds(0)
const msg:{[k:string]:any} = {
chatId: chat.id,
type: constants.message_types.tribe_delete,
sender: (sender && sender.id) || 0,
messageContent:'', remoteMessageContent:'',
status: constants.statuses.confirmed,
date: date, createdAt: date, updatedAt: date
}
const message = await models.Message.create(msg)
socket.sendJson({
type: 'tribe_delete',
response: {
message: jsonUtils.messageToJson(message, chat),
chat: jsonUtils.chatToJson(chat),
}
})
}
export async function replayChatHistory(chat, contact) {
if(!(chat&&chat.id&&contact&&contact.id)){
return console.log('[tribes] cant replay history')

5
api/controllers/index.ts

@ -1,6 +1,7 @@
import {models} from '../models'
import * as chats from './chats'
import * as chatTribes from './chatTribes'
import * as bots from './bots'
import * as details from './details'
import * as contacts from './contacts'
import * as invites from './invites'
@ -147,4 +148,8 @@ export const ACTIONS = {
[msgtypes.member_request]: chatTribes.receiveMemberRequest,
[msgtypes.member_approve]: chatTribes.receiveMemberApprove,
[msgtypes.member_reject]: chatTribes.receiveMemberReject,
[msgtypes.tribe_delete]: chatTribes.receiveTribeDelete,
[msgtypes.bot_install]: bots.receiveBotInstall,
[msgtypes.bot_cmd]: bots.receiveBotCmd,
[msgtypes.bot_res]: bots.receiveBotRes,
}

3
api/models/ts/bot.ts

@ -10,6 +10,9 @@ export default class Bot extends Model<Bot> {
})
id: string
@Column
uuid: string
@Column(DataType.BIGINT)
chatId: number

43
api/network/intercept.ts

@ -1,30 +1,35 @@
import {processBotMessage} from '../controllers/bots'
import {Msg} from './interfaces'
import { models } from '../models'
/*
process if bot message
AND return true if it is, and forward to bot
*/
export async function isBotMsg(msg:Msg, sentByMe:boolean): Promise<boolean> {
const txt = msg.message.content
const chat = await models.Chat.findOne({where:{
uuid: msg.chat.uuid
}})
if(!chat) return false
export interface Msg {
type: number,
message: {
content: string
},
chat: {
uuid: string
},
sender: {
pub_key: string,
alias: string,
if(txt.startsWith('/bot ')) {
const ok = processBotMessage(msg, chat, null)
return ok?true:false
}
const botInTribe = await models.ChatMember.findOne({where:{
bot:true, chatId: chat.id
}})
if(!botInTribe) return false
if(!(botInTribe.botMakerPubkey && botInTribe.botUuid)) return false
if(txt.startsWith(`${botInTribe.botPrefix} `)){
const ok = await processBotMessage(msg, chat, botInTribe)
return ok?true:false
}
}
// msg.message.content
export function isBotMsg(msg:Msg, sentByMe:boolean){
return false
// check if bot msg
// check my ChatMembers to see if its here
// OR check my Bots if im the maker
// process it "bot_cmd"
}

14
api/network/interfaces.ts

@ -0,0 +1,14 @@
export interface Msg {
type: number,
message: {
content: string
},
chat: {
uuid: string
},
sender: {
pub_key: string,
alias: string,
}
}

2
api/network/receive.ts

@ -131,7 +131,7 @@ async function doTheAction(data){
/* decrypt and re-encrypt with phone's pubkey for storage */
const chat = await models.Chat.findOne({where:{uuid:payload.chat.uuid}})
const pld = await decryptMessage(data, chat)
const isBotMsg = intercept.isBotMsg(pld, false)
const isBotMsg = await intercept.isBotMsg(pld, false)
if(isBotMsg===true) {
return // DO NOT FORWARD TO TRIBE, forwarded to bot instead
}

2
api/network/send.ts

@ -49,7 +49,7 @@ export async function sendMessage(params) {
networkType = 'mqtt' // broadcast to all
// decrypt message.content and message.mediaKey w groupKey
msg = await decryptMessage(msg, chat)
const isBotMsg = intercept.isBotMsg(msg, true)
const isBotMsg = await intercept.isBotMsg(msg, true)
if(isBotMsg===true) {
return // DO NOT FORWARD TO TRIBE, forwarded to bot instead
}

1
api/utils/setup.ts

@ -37,6 +37,7 @@ async function migrate(){
addTableColumn('sphinx_chat_members', 'bot_uuid')
addTableColumn('sphinx_bots', 'webhook')
addTableColumn('sphinx_bots', 'uuid')
try{
await sequelize.query(`

5
dist/api/controllers/actions.js

@ -17,6 +17,7 @@ const short = require("short-uuid");
const rsa = require("../crypto/rsa");
const crypto = require("crypto");
const jsonUtils = require("../utils/json");
const tribes = require("../utils/tribes");
/*
hexdump -n 8 -e '4/4 "%08X" 1 "\n"' /dev/random
hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
@ -58,8 +59,10 @@ exports.createBot = (req, res) => __awaiter(void 0, void 0, void 0, function* ()
const isTribeOwner = owner.publicKey === chat.ownerPubkey;
if (!isTribeOwner)
return res_1.failure(res, 'not tribe owner');
const uuid = yield tribes.genSignedTimestamp();
const newBot = {
id: crypto.randomBytes(8).toString('hex').toUpperCase(),
uuid,
id: crypto.randomBytes(16).toString('hex').toUpperCase(),
chatId: chat_id,
name: name,
secret: crypto.randomBytes(16).toString('hex').toUpperCase()

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

File diff suppressed because one or more lines are too long

79
dist/api/controllers/bots.js

@ -10,15 +10,80 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const short = require("short-uuid");
const rsa = require("../crypto/rsa");
const models_1 = require("../models");
const socket = require("../utils/socket");
const jsonUtils = require("../utils/json");
const constants = require(path.join(__dirname, '../../config/constants.json'));
function genBotRes(chat, text) {
return __awaiter(this, void 0, void 0, function* () {
var date = new Date();
date.setMilliseconds(0);
const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });
const encryptedForMeText = rsa.encrypt(owner.contactKey, text);
const msg = {
chatId: chat.id,
uuid: short.generate(),
type: constants.message_types.bot_res,
sender: owner.id,
amount: 0,
date: date,
messageContent: encryptedForMeText,
remoteMessageContent: '',
status: constants.statuses.confirmed,
createdAt: date,
updatedAt: date,
senderAlias: 'Bot Mother'
};
const message = yield models_1.models.Message.create(msg);
socket.sendJson({
type: 'message',
response: jsonUtils.messageToJson(message, chat, owner)
});
});
}
// return whether this is legit to process
function processBotMessage(msg, chat, botInTribe) {
return __awaiter(this, void 0, void 0, function* () {
const txt = msg.message.content;
if (txt.startsWith('/bot ')) {
const arr = txt.split(' ');
if (arr.length < 2)
return false;
const cmd = arr[1];
switch (cmd) {
case 'install':
if (arr.length < 3)
return false;
installBot(arr[2], botInTribe);
default:
genBotRes(chat, botHelpHTML);
}
}
else {
}
return true;
});
}
exports.processBotMessage = processBotMessage;
const botHelpHTML = `<p>
<b>Bot commands:</b>
<ul>
<li><b>/bot install {BOTNAME}:</b>&nbsp;Install a new bot
<li><b>/bot help:</b>&nbsp;Print out this help message
</ul>
<p>
`;
/* intercept */
exports.installBot = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
function installBot(botname, botInTribe) {
console.log("INSTALL BOT NOW");
// need bot uuid and maker pubkey
// send bot_install to bot maker
// mqtt sub to the bot uuid (dont need this actually)
// generate ChatMember with bot=true
// bot_maker_pubkey, bot_uuid, bot_prefix
});
}
exports.installBot = installBot;
function receiveBotInstall(payload) {
return __awaiter(this, void 0, void 0, function* () {
console.log('=> receiveBotInstall');
@ -30,7 +95,13 @@ function receiveBotInstall(payload) {
});
}
exports.receiveBotInstall = receiveBotInstall;
// type BotResType = 'install' | 'message' | 'broadcast' | 'keysend'
// type BotCmdType = 'install' | 'message' | 'broadcast' | 'keysend'
function receiveBotCmd(payload) {
return __awaiter(this, void 0, void 0, function* () {
console.log(constants.message_types.bot_cmd);
});
}
exports.receiveBotCmd = receiveBotCmd;
function receiveBotRes(payload) {
return __awaiter(this, void 0, void 0, function* () {
console.log(constants.message_types.bot_res);

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

@ -1 +1 @@
{"version":3,"file":"bots.js","sourceRoot":"","sources":["../../../api/controllers/bots.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6BAA4B;AAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC,CAAA;AAE9E,eAAe;AAEF,QAAA,UAAU,GAAG,CAAO,GAAG,EAAC,GAAG,EAAE,EAAE;IAC1C,iCAAiC;IACjC,gCAAgC;IAChC,qDAAqD;IAErD,oCAAoC;IACpC,yCAAyC;AAC3C,CAAC,CAAA,CAAA;AAED,SAAsB,iBAAiB,CAAC,OAAO;;QAC7C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QACnC,yCAAyC;QACzC,4CAA4C;QAC5C,mCAAmC;QAEnC,mDAAmD;QAEnD,0CAA0C;IAC5C,CAAC;CAAA;AATD,8CASC;AAED,oEAAoE;AAEpE,SAAsB,aAAa,CAAC,OAAO;;QACzC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAC9C,CAAC;CAAA;AAFD,sCAEC"}
{"version":3,"file":"bots.js","sourceRoot":"","sources":["../../../api/controllers/bots.ts"],"names":[],"mappings":"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"}

29
dist/api/controllers/chatTribes.js

@ -371,6 +371,35 @@ function receiveMemberReject(payload) {
});
}
exports.receiveMemberReject = receiveMemberReject;
function receiveTribeDelete(payload) {
return __awaiter(this, void 0, void 0, function* () {
console.log('=> receiveTribeDelete');
const { chat, sender } = yield helpers.parseReceiveParams(payload);
if (!chat)
return console.log('no chat');
// await chat.update({status: constants.chat_statuses.rejected})
// update on tribes server too
let date = new Date();
date.setMilliseconds(0);
const msg = {
chatId: chat.id,
type: constants.message_types.tribe_delete,
sender: (sender && sender.id) || 0,
messageContent: '', remoteMessageContent: '',
status: constants.statuses.confirmed,
date: date, createdAt: date, updatedAt: date
};
const message = yield models_1.models.Message.create(msg);
socket.sendJson({
type: 'tribe_delete',
response: {
message: jsonUtils.messageToJson(message, chat),
chat: jsonUtils.chatToJson(chat),
}
});
});
}
exports.receiveTribeDelete = receiveTribeDelete;
function replayChatHistory(chat, contact) {
return __awaiter(this, void 0, void 0, function* () {
if (!(chat && chat.id && contact && contact.id)) {

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

File diff suppressed because one or more lines are too long

5
dist/api/controllers/index.js

@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const models_1 = require("../models");
const chats = require("./chats");
const chatTribes = require("./chatTribes");
const bots = require("./bots");
const details = require("./details");
const contacts = require("./contacts");
const invites = require("./invites");
@ -144,5 +145,9 @@ exports.ACTIONS = {
[msgtypes.member_request]: chatTribes.receiveMemberRequest,
[msgtypes.member_approve]: chatTribes.receiveMemberApprove,
[msgtypes.member_reject]: chatTribes.receiveMemberReject,
[msgtypes.tribe_delete]: chatTribes.receiveTribeDelete,
[msgtypes.bot_install]: bots.receiveBotInstall,
[msgtypes.bot_cmd]: bots.receiveBotCmd,
[msgtypes.bot_res]: bots.receiveBotRes,
};
//# sourceMappingURL=index.js.map

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

File diff suppressed because one or more lines are too long

4
dist/api/models/ts/bot.js

@ -20,6 +20,10 @@ __decorate([
}),
__metadata("design:type", String)
], Bot.prototype, "id", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", String)
], Bot.prototype, "uuid", void 0);
__decorate([
sequelize_typescript_1.Column(sequelize_typescript_1.DataType.BIGINT),
__metadata("design:type", Number)

2
dist/api/models/ts/bot.js.map

@ -1 +1 @@
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../../api/models/ts/bot.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAAsE;AAGtE,IAAqB,GAAG,GAAxB,MAAqB,GAAI,SAAQ,4BAAU;CA2B1C,CAAA;AApBC;IALC,6BAAM,CAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,IAAI;KACb,CAAC;;+BACQ;AAGV;IADC,6BAAM,CAAC,+BAAQ,CAAC,MAAM,CAAC;;mCACV;AAGd;IADC,6BAAM;;iCACK;AAGZ;IADC,6BAAM;;mCACO;AAGd;IADC,6BAAM;;oCACQ;AAGf;IADC,6BAAM;8BACI,IAAI;sCAAA;AAGf;IADC,6BAAM;8BACI,IAAI;sCAAA;AAzBI,GAAG;IADvB,4BAAK,CAAC,EAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAC,CAAC;GAChC,GAAG,CA2BvB;kBA3BoB,GAAG"}
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../../api/models/ts/bot.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAAsE;AAGtE,IAAqB,GAAG,GAAxB,MAAqB,GAAI,SAAQ,4BAAU;CA8B1C,CAAA;AAvBC;IALC,6BAAM,CAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,IAAI;KACb,CAAC;;+BACQ;AAGV;IADC,6BAAM;;iCACK;AAGZ;IADC,6BAAM,CAAC,+BAAQ,CAAC,MAAM,CAAC;;mCACV;AAGd;IADC,6BAAM;;iCACK;AAGZ;IADC,6BAAM;;mCACO;AAGd;IADC,6BAAM;;oCACQ;AAGf;IADC,6BAAM;8BACI,IAAI;sCAAA;AAGf;IADC,6BAAM;8BACI,IAAI;sCAAA;AA5BI,GAAG;IADvB,4BAAK,CAAC,EAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAC,CAAC;GAChC,GAAG,CA8BvB;kBA9BoB,GAAG"}

48
dist/api/network/intercept.js

@ -1,16 +1,44 @@
"use strict";
/*
process if bot message
AND return true if it is, and forward to bot
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
// msg.message.content
const bots_1 = require("../controllers/bots");
const models_1 = require("../models");
function isBotMsg(msg, sentByMe) {
return false;
// check if bot msg
// check my ChatMembers to see if its here
// OR check my Bots if im the maker
// process it "bot_cmd"
return __awaiter(this, void 0, void 0, function* () {
const txt = msg.message.content;
const chat = yield models_1.models.Chat.findOne({ where: {
uuid: msg.chat.uuid
} });
if (!chat)
return false;
if (txt.startsWith('/bot ')) {
const ok = bots_1.processBotMessage(msg, chat, null);
return ok ? true : false;
}
const botInTribe = yield models_1.models.ChatMember.findOne({ where: {
bot: true, chatId: chat.id
} });
if (!botInTribe)
return false;
if (!(botInTribe.botMakerPubkey && botInTribe.botUuid))
return false;
if (txt.startsWith(`${botInTribe.botPrefix} `)) {
const ok = yield bots_1.processBotMessage(msg, chat, botInTribe);
return ok ? true : false;
}
return false;
// check if bot msg
// check my ChatMembers to see if its here
// process it "bot_cmd"
});
}
exports.isBotMsg = isBotMsg;
//# sourceMappingURL=intercept.js.map

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

@ -1 +1 @@
{"version":3,"file":"intercept.js","sourceRoot":"","sources":["../../../api/network/intercept.ts"],"names":[],"mappings":";AACA;;;EAGE;;AAgBF,sBAAsB;AACtB,SAAgB,QAAQ,CAAC,GAAO,EAAE,QAAgB;IAChD,OAAO,KAAK,CAAA;IAEZ,mBAAmB;IACnB,0CAA0C;IAC1C,mCAAmC;IAEnC,uBAAuB;AACzB,CAAC;AARD,4BAQC"}
{"version":3,"file":"intercept.js","sourceRoot":"","sources":["../../../api/network/intercept.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,8CAAqD;AAErD,sCAAkC;AAElC,SAAsB,QAAQ,CAAC,GAAO,EAAE,QAAgB;;QACtD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAA;QAC/B,MAAM,IAAI,GAAG,MAAM,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC;gBAC5C,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;aACpB,EAAC,CAAC,CAAA;QACH,IAAG,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QAGtB,IAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,EAAE,GAAG,wBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YAC7C,OAAO,EAAE,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,KAAK,CAAA;SACrB;QAED,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC;gBACxD,GAAG,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;aAC1B,EAAC,CAAC,CAAA;QACH,IAAG,CAAC,UAAU;YAAE,OAAO,KAAK,CAAA;QAC5B,IAAG,CAAC,CAAC,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAA;QAEnE,IAAG,GAAG,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,SAAS,GAAG,CAAC,EAAC;YAC5C,MAAM,EAAE,GAAG,MAAM,wBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;YACzD,OAAO,EAAE,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,KAAK,CAAA;SACrB;QAED,OAAO,KAAK,CAAA;QAEZ,mBAAmB;QACnB,0CAA0C;QAE1C,uBAAuB;IACzB,CAAC;CAAA;AA9BD,4BA8BC"}

3
dist/api/network/interfaces.js

@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=interfaces.js.map

1
dist/api/network/interfaces.js.map

@ -0,0 +1 @@
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../api/network/interfaces.ts"],"names":[],"mappings":""}

2
dist/api/network/receive.js

@ -150,7 +150,7 @@ function doTheAction(data) {
/* decrypt and re-encrypt with phone's pubkey for storage */
const chat = yield models_1.models.Chat.findOne({ where: { uuid: payload.chat.uuid } });
const pld = yield msg_1.decryptMessage(data, chat);
const isBotMsg = intercept.isBotMsg(pld, false);
const isBotMsg = yield intercept.isBotMsg(pld, false);
if (isBotMsg === true) {
return; // DO NOT FORWARD TO TRIBE, forwarded to bot instead
}

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

File diff suppressed because one or more lines are too long

2
dist/api/network/send.js

@ -54,7 +54,7 @@ function sendMessage(params) {
networkType = 'mqtt'; // broadcast to all
// decrypt message.content and message.mediaKey w groupKey
msg = yield msg_1.decryptMessage(msg, chat);
const isBotMsg = intercept.isBotMsg(msg, true);
const isBotMsg = yield intercept.isBotMsg(msg, true);
if (isBotMsg === true) {
return; // DO NOT FORWARD TO TRIBE, forwarded to bot instead
}

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

File diff suppressed because one or more lines are too long

1
dist/api/utils/setup.js

@ -49,6 +49,7 @@ function migrate() {
addTableColumn('sphinx_chat_members', 'bot_maker_pubkey');
addTableColumn('sphinx_chat_members', 'bot_uuid');
addTableColumn('sphinx_bots', 'webhook');
addTableColumn('sphinx_bots', 'uuid');
try {
yield models_1.sequelize.query(`
CREATE TABLE sphinx_bot_members (

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

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