working on storing user keys
parent
fc590346be
commit
99217b4af2
197
lor-cryptomsg.js
197
lor-cryptomsg.js
|
@ -12,14 +12,19 @@
|
|||
|
||||
(function() {
|
||||
|
||||
var username = '';
|
||||
var _username = '';
|
||||
var _keyset = [];
|
||||
var publicKey = '';
|
||||
|
||||
/*
|
||||
var publicKey = `-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
|
||||
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
|
||||
xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
|
||||
gwQco1KRMDSmXSMkDwIDAQAB
|
||||
-----END PUBLIC KEY-----`;
|
||||
*/
|
||||
|
||||
|
||||
var privateKey = `-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
|
||||
|
@ -37,7 +42,29 @@ psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
|
|||
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
|
||||
-----END RSA PRIVATE KEY-----`;
|
||||
|
||||
var encryptedRegexp = /\[ENCRYPTED\]([\s\S]+)\[\/ENCRYPTED\]/mgi;
|
||||
var getAllowedUsers = function() {
|
||||
var users = [];
|
||||
if (_keyset) {
|
||||
for (var userkey in _keyset) {
|
||||
if (!users[_keyset[userkey]['user']]) {
|
||||
users.push(_keyset[userkey]['user']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return users;
|
||||
}
|
||||
|
||||
var getUserKey = function(user) {
|
||||
|
||||
for (var userkey in _keyset) {
|
||||
if (_keyset[userkey]['user'] && _keyset[userkey]['user'] === user) {
|
||||
return _keyset[userkey]['key'];
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
|
||||
}
|
||||
|
||||
var insertText = function(textarea, text) {
|
||||
|
||||
|
@ -59,84 +86,151 @@ uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
|
|||
var author = $(messageTag).find('.sign a[itemprop="creator"]').text();
|
||||
|
||||
if (msg && msg.length && author.trim() != '') {
|
||||
var encryptedRegexp = /(\[ENCRYPTED\][\s\S]+\[\/ENCRYPTED\])+?/mi;
|
||||
var encryptedMsgRegexp = /\[ENCRYPTED\]([\s\S]+)\[\/ENCRYPTED\]/mi;
|
||||
|
||||
Array.prototype.forEach.call(msg, function(p) {
|
||||
var msg = p.innerText;
|
||||
if (msg.trim() != '' && encryptedRegexp.test(msg)) {
|
||||
|
||||
msg = msg.replace(encryptedRegexp, '$1').trim();
|
||||
var result = msg.match(encryptedRegexp);
|
||||
if (result && result.length >= 1) {
|
||||
|
||||
var decrypt = new JSEncrypt.JSEncrypt();
|
||||
decrypt.setPrivateKey(privateKey);
|
||||
for (var i=1; i<result.length; i++) {
|
||||
var encBlock = result[i];
|
||||
|
||||
if (encBlock && encryptedMsgRegexp.test(encBlock)) {
|
||||
var resultMsg = encBlock.match(encryptedMsgRegexp);
|
||||
|
||||
if (resultMsg && resultMsg.length) {
|
||||
var decrypt = new JSEncrypt.JSEncrypt();
|
||||
decrypt.setPrivateKey(privateKey);
|
||||
|
||||
var decryptedMsg = decrypt.decrypt(resultMsg[1]);
|
||||
msg = msg.replace(encBlock, '[DECRYPTED]'+decryptedMsg+'[/DECRYTED]');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var decryptedMsg = decrypt.decrypt(msg);
|
||||
p.innerText = '[DECRYPTED]'+decryptedMsg+'[/DECRYTED]';
|
||||
}
|
||||
p.innerText = msg;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var insertEncryptButton = function(textarea) {
|
||||
|
||||
var button = document.createElement('input');
|
||||
button.type = 'button';
|
||||
button.value = 'Encrypt it!';
|
||||
textarea.parentNode.insertBefore(button, textarea.nextSibling);
|
||||
var users = getAllowedUsers();
|
||||
if (users && users.length) {
|
||||
|
||||
button.addEventListener('click', function() {
|
||||
var button = document.createElement('input');
|
||||
button.type = 'button';
|
||||
button.value = 'Encrypt it!';
|
||||
textarea.parentNode.insertBefore(button, textarea.nextSibling);
|
||||
button.addEventListener('click', function() {
|
||||
|
||||
var startPos = textarea.selectionStart;
|
||||
var endPos = textarea.selectionEnd;
|
||||
var msg = textarea.value.substring(startPos, endPos);
|
||||
var startPos = textarea.selectionStart;
|
||||
var endPos = textarea.selectionEnd;
|
||||
var msg = textarea.value.substring(startPos, endPos);
|
||||
|
||||
if (msg.trim() == '') {
|
||||
alert('Nothing to encrypt! Please select text.');
|
||||
return;
|
||||
if (msg.trim() == '') {
|
||||
alert('Nothing to encrypt! Please select text.');
|
||||
return;
|
||||
}
|
||||
|
||||
var userTag = document.getElementById("userCrypt");
|
||||
var user = userTag.options[userTag.selectedIndex].value;
|
||||
|
||||
var userkey = getUserKey(user);
|
||||
if (userkey.trim() == '') {
|
||||
alert('You have not public key for user: '+user);
|
||||
return;
|
||||
}
|
||||
|
||||
var encrypt = new JSEncrypt.JSEncrypt();
|
||||
encrypt.setPublicKey(userkey.trim());
|
||||
var encryptMy = new JSEncrypt.JSEncrypt();
|
||||
encryptMy.setPublicKey(publicKey.trim());
|
||||
|
||||
var encryptedMsg = encrypt.encrypt(msg);
|
||||
var encryptedMsgMy = encryptMy.encrypt(msg);
|
||||
insertText(textarea, '[ENCRYPTED]' + encryptedMsg + '[/ENCRYPTED]' + '[ENCRYPTED]' + encryptedMsgMy + '[/ENCRYPTED]');
|
||||
|
||||
});
|
||||
|
||||
var space = document.createElement("span");
|
||||
space.innerHTML = ' ';
|
||||
textarea.parentNode.insertBefore(space, button);
|
||||
|
||||
//Create and append select list
|
||||
var selectList = document.createElement("select");
|
||||
selectList.id = "userCrypt";
|
||||
textarea.parentNode.insertBefore(selectList, space);
|
||||
//Create and append the options
|
||||
for (var i = 0; i < users.length; i++) {
|
||||
var option = document.createElement("option");
|
||||
option.value = users[i];
|
||||
option.text = users[i];
|
||||
selectList.appendChild(option);
|
||||
}
|
||||
|
||||
var encrypt = new JSEncrypt.JSEncrypt();
|
||||
encrypt.setPublicKey(publicKey);
|
||||
|
||||
var encryptedMsg = encrypt.encrypt(msg);
|
||||
insertText(textarea, '\n\n[ENCRYPTED]' + encryptedMsg + '[/ENCRYPTED]\n\n');
|
||||
|
||||
});
|
||||
|
||||
var description = document.createElement('div');
|
||||
description.innerHTML = 'Зашифровать выделенный текст';
|
||||
textarea.parentNode.insertBefore(description, button);
|
||||
var description = document.createElement('div');
|
||||
description.innerHTML = 'Зашифровать выделенный текст';
|
||||
textarea.parentNode.insertBefore(description, selectList);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var checkLoggedIn = function(callback) {
|
||||
var regmenu = $('#regmenu');
|
||||
if (regmenu && regmenu.length) {
|
||||
username = '';
|
||||
_username = '';
|
||||
return;
|
||||
}
|
||||
var login = $('#loginGreating a').text();
|
||||
if (login.trim() != '' && login.trim() != 'РегистрацияВход') {
|
||||
username = login.trim();
|
||||
callback();
|
||||
_username = login.trim();
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var reloadUsersWithPublicKeys = function() {
|
||||
$.get('http://127.0.0.1:8080/people/'+username+'/profile', function(data) {
|
||||
var regexpKeyset = /\[USERKEYS\]([\s\S]+)\[\/USERKEYS\]/gi;
|
||||
var regexpKey = /\[USERKEY user="(\w)"\]([\s\S]+)\[\/USERKEY\]/gi;
|
||||
var readMyKeyset = function(callback) {
|
||||
_keyset = [];
|
||||
|
||||
$.get('http://127.0.0.1:8080/people/'+_username+'/profile', function(data) {
|
||||
var regexpKeysetMy = /\[PUBLICKEY\]([\s\S]+)\[\/PUBLICKEY\]/mi;
|
||||
var regexpKeyset = /\[USERKEYS\]([\s\S]+)\[\/USERKEYS\]/mgi;
|
||||
var regexpKey = /\[USERKEY user=(\w+)\]([\s\S]+)\[\/USERKEY\]/mi;
|
||||
|
||||
if (regexpKeysetMy.test(data)) {
|
||||
var resultPublicKey = data.match(regexpKeysetMy);
|
||||
if (resultPublicKey && resultPublicKey.length) {
|
||||
publicKey = resultPublicKey[1];
|
||||
}
|
||||
}
|
||||
|
||||
if (regexpKeyset.test(data)) {
|
||||
var resultKeyset = data.match(regexpKeyset);
|
||||
if (resultKeyset.length > 1) {
|
||||
var keyset = resultKeyset[1];
|
||||
if (resultKeyset && resultKeyset.length) {
|
||||
var keyset = resultKeyset[0];
|
||||
if (regexpKey.test(keyset)) {
|
||||
var resultKeys = keyset.match(regexpKey);
|
||||
if (resultKeys.length > 1) {
|
||||
for (var i=1; i < resultKeys.length; i++) {
|
||||
var keyData = resultKey[i];
|
||||
}
|
||||
while (resultKeys && resultKeys.length > 1) {
|
||||
_keyset.push({
|
||||
'user' : resultKeys[1],
|
||||
'key' : resultKeys[2]
|
||||
});
|
||||
keyset = keyset.replace(resultKeys[0], '');
|
||||
resultKeys = keyset.match(regexpKey);
|
||||
}
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -144,11 +238,22 @@ uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
|
|||
});
|
||||
}
|
||||
|
||||
var insertAllButtons = function() {
|
||||
|
||||
//create Encrypt button
|
||||
var textareas = document.getElementsByTagName('textarea');
|
||||
if (textareas && textareas.length) {
|
||||
Array.prototype.forEach.call(textareas, insertEncryptButton);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
window.addEventListener('load', function() {
|
||||
|
||||
checkLoggedIn(function() {
|
||||
|
||||
reloadUsersWithPublicKeys();
|
||||
readMyKeyset(insertAllButtons);
|
||||
|
||||
//autodecrypt
|
||||
var messages = $('.msg_body');
|
||||
|
@ -156,12 +261,6 @@ uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
|
|||
Array.prototype.forEach.call(messages, decryptFn);
|
||||
}
|
||||
|
||||
//create Encrypt button
|
||||
var textareas = document.getElementsByTagName('textarea');
|
||||
if (textareas && textareas.length) {
|
||||
Array.prototype.forEach.call(textareas, insertEncryptButton);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue