126 lines
4.1 KiB
TypeScript
126 lines
4.1 KiB
TypeScript
/*
|
|
* @project: TERA
|
|
* @version: Development (beta)
|
|
* @license: MIT (not for evil)
|
|
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
|
* Web: https://terafoundation.org
|
|
* Twitter: https://twitter.com/terafoundation
|
|
* Telegram: https://t.me/terafoundation
|
|
*/
|
|
|
|
"use strict";
|
|
require('../core/crypto-library');
|
|
const OPEN_TYPE_TRANSACTION = 11;
|
|
const MESSAGE_TYPE_TRANSACTION = 12;
|
|
const MAX_MSG_SIZE = 1024;
|
|
var TempArrayTr = new Uint8Array(MAX_MSG_SIZE);
|
|
const MESSAGE_START = 9;
|
|
const MESSAGE_END = MAX_MSG_SIZE - 5;
|
|
import './names'
|
|
import DApp from './dapp'
|
|
export default class MessagerApp extends DApp {
|
|
Server
|
|
Channels
|
|
NamesMap
|
|
constructor() {
|
|
super()
|
|
this.Channels = {}
|
|
this.NamesMap = global.NAMES.KeyValueMap
|
|
global.MESSAGER = this
|
|
}
|
|
Decrypt(Body) {
|
|
for (var key in this.Channels) {
|
|
var Node = this.Channels[key];
|
|
global.Decrypt(Body, TempArrayTr, Node.Secret)
|
|
if (global.IsZeroArr(TempArrayTr.slice(MESSAGE_END))) {
|
|
var Str = global.Utf8ArrayToStr(TempArrayTr.slice(MESSAGE_START));
|
|
return Str;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
Encrypt(StrMessage, StrTo) {
|
|
var NameArr;
|
|
if (typeof StrTo === "string") {
|
|
NameArr = global.GetArrFromStr(StrTo, 32)
|
|
} else {
|
|
NameArr = StrTo
|
|
}
|
|
var arrMessage = global.GetArrFromStr(StrMessage, MESSAGE_END);
|
|
var ArrayTr = new Uint8Array(MAX_MSG_SIZE);
|
|
ArrayTr[0] = MESSAGE_TYPE_TRANSACTION
|
|
for (var i = 5; i < MAX_MSG_SIZE; i++) {
|
|
ArrayTr[i] = arrMessage[i - MESSAGE_START]
|
|
}
|
|
var Body = new Uint8Array(MAX_MSG_SIZE);
|
|
var Node = this.OpenChannel(NameArr);
|
|
global.Encrypt(ArrayTr, Body, Node.Secret)
|
|
return Body;
|
|
}
|
|
OpenChannel(FromNameArr) {
|
|
var FromArr;
|
|
var StrKeyFrom = global.GetHexFromAddres(FromNameArr);
|
|
if (this.NamesMap[StrKeyFrom]) {
|
|
FromArr = this.NamesMap[StrKeyFrom]
|
|
}
|
|
else {
|
|
FromArr = FromNameArr
|
|
}
|
|
var StrKey = global.GetHexFromAddres(FromArr);
|
|
var Node = this.Channels[StrKey];
|
|
if (!Node) {
|
|
Node = { addrArr: FromArr }
|
|
global.CheckContextSecret(this.Server, Node)
|
|
this.Channels[StrKey] = Node
|
|
}
|
|
return Node;
|
|
}
|
|
OnWriteTransaction(Block, Body, BlockNum, TrNum) {
|
|
var Type = Body[0];
|
|
if (Type === OPEN_TYPE_TRANSACTION) {
|
|
var ToArr = Body.slice(33);
|
|
if (global.CompareArr(ToArr, global.NAMES.CurrentNameArr) === 0 || global.CompareArr(ToArr, this.Server.addrArr) === 0) {
|
|
var FromNameArr = Body.slice(1, 33);
|
|
this.OpenChannel(FromNameArr)
|
|
}
|
|
}
|
|
else
|
|
if (Type === MESSAGE_TYPE_TRANSACTION) {
|
|
var Str = this.Decrypt(Body);
|
|
if (Str !== undefined)
|
|
global.ToLog("GET MESSAGE:" + Str)
|
|
}
|
|
}
|
|
OnMessage(Msg) {
|
|
global.ToLog("GET MESSAGE:" + Msg.body)
|
|
return;
|
|
var Body = Msg.body;
|
|
var Type = Body[0];
|
|
if (Type === MESSAGE_TYPE_TRANSACTION) {
|
|
var Str = this.Decrypt(Body);
|
|
if (Str !== undefined) {
|
|
global.ToLog("GET MESSAGE:" + Str)
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
function TestEncryptDecrypt() {
|
|
const CMessager = module.exports;
|
|
var Server = { KeyPair: global.GetKeyPairTest("Test"), DApp: { Names: { KeyValueMap: {} } }, };
|
|
var Test = new CMessager(Server);
|
|
var KeyPair2 = global.GetKeyPairTest("Test2");
|
|
var StrTest1 = global.GetArrFromStr("Test2", 32);
|
|
var StrKey = global.GetHexFromAddres(StrTest1);
|
|
global.MESSAGER.NamesMap[StrKey] = KeyPair2.addrArr;
|
|
var Body = global.MESSAGER.Encrypt("This is a test message!", "Test2");
|
|
var Str2 = global.MESSAGER.Decrypt(Body);
|
|
console.log("Decrypt:");
|
|
console.log(Str2);
|
|
};
|
|
|
|
var messager = new MessagerApp();
|
|
global.DApps.Messager = messager;
|
|
global.DAppByType[OPEN_TYPE_TRANSACTION] = messager;
|
|
global.DAppByType[MESSAGE_TYPE_TRANSACTION] = messager;
|