2018-12-27 17:26:59 +03:00
|
|
|
// ==UserScript==
|
|
|
|
// @name CryptoMessages for LOR
|
|
|
|
// @namespace ru.bvn13.lor.cryptomsg
|
|
|
|
// @version 0.1
|
|
|
|
// @description Brings private dialogs for LOR
|
|
|
|
// @include https://www.linux.org.ru/*
|
|
|
|
// @grant none
|
|
|
|
// @copyright 2018+, bvn13
|
|
|
|
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
|
|
|
|
// @require http://travistidwell.com/jsencrypt/bin/jsencrypt.js
|
|
|
|
// ==/UserScript==
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
2018-12-27 18:30:39 +03:00
|
|
|
var username = '';
|
2018-12-27 17:26:59 +03:00
|
|
|
|
|
|
|
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
|
|
|
|
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
|
|
|
|
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
|
|
|
|
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
|
|
|
|
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
|
|
|
|
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
|
|
|
|
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
|
|
|
|
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
|
|
|
|
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
|
|
|
|
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
|
|
|
|
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
|
|
|
|
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
|
|
|
|
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
|
|
|
|
-----END RSA PRIVATE KEY-----`;
|
|
|
|
|
|
|
|
var encryptedRegexp = /\[ENCRYPTED\]([\s\S]+)\[\/ENCRYPTED\]/mgi;
|
|
|
|
|
|
|
|
var insertText = function(textarea, text) {
|
|
|
|
|
|
|
|
var startPos = textarea.selectionStart;
|
|
|
|
var endPos = textarea.selectionEnd;
|
|
|
|
|
|
|
|
textarea.value = textarea.value.substring(0, startPos)
|
|
|
|
+ '\n\n' + text + '\n\n'
|
|
|
|
+ textarea.value.substring(endPos, textarea.value.length);
|
|
|
|
|
|
|
|
textarea.selectionStart = startPos + text.length;
|
|
|
|
textarea.selectionEnd = startPos + text.length;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
var decryptFn = function(messageTag) {
|
|
|
|
|
|
|
|
var msg = messageTag.querySelectorAll('p');
|
2018-12-27 18:30:39 +03:00
|
|
|
var author = $(messageTag).find('.sign a[itemprop="creator"]').text();
|
2018-12-27 17:26:59 +03:00
|
|
|
|
2018-12-27 18:30:39 +03:00
|
|
|
if (msg && msg.length && author.trim() != '') {
|
2018-12-27 17:26:59 +03:00
|
|
|
|
|
|
|
Array.prototype.forEach.call(msg, function(p) {
|
|
|
|
var msg = p.innerText;
|
|
|
|
if (msg.trim() != '' && encryptedRegexp.test(msg)) {
|
|
|
|
|
|
|
|
msg = msg.replace(encryptedRegexp, '$1').trim();
|
|
|
|
|
|
|
|
var decrypt = new JSEncrypt.JSEncrypt();
|
|
|
|
decrypt.setPrivateKey(privateKey);
|
|
|
|
|
|
|
|
var decryptedMsg = decrypt.decrypt(msg);
|
|
|
|
p.innerText = '[DECRYPTED]'+decryptedMsg+'[/DECRYTED]';
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var insertEncryptButton = function(textarea) {
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
if (msg.trim() == '') {
|
|
|
|
alert('Nothing to encrypt! Please select text.');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-12-27 18:30:39 +03:00
|
|
|
var checkLoggedIn = function(callback) {
|
|
|
|
var regmenu = $('#regmenu');
|
|
|
|
if (regmenu && regmenu.length) {
|
|
|
|
username = '';
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var login = $('#loginGreating a').text();
|
|
|
|
if (login.trim() != '' && login.trim() != 'РегистрацияВход') {
|
|
|
|
username = login.trim();
|
|
|
|
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;
|
|
|
|
|
|
|
|
if (regexpKeyset.test(data)) {
|
|
|
|
var resultKeyset = data.match(regexpKeyset);
|
|
|
|
if (resultKeyset.length > 1) {
|
|
|
|
var keyset = resultKeyset[1];
|
|
|
|
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];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-12-27 17:26:59 +03:00
|
|
|
window.addEventListener('load', function() {
|
|
|
|
|
2018-12-27 18:30:39 +03:00
|
|
|
checkLoggedIn(function() {
|
|
|
|
|
|
|
|
reloadUsersWithPublicKeys();
|
2018-12-27 17:26:59 +03:00
|
|
|
|
|
|
|
//autodecrypt
|
|
|
|
var messages = $('.msg_body');
|
|
|
|
if (messages && messages.length) {
|
|
|
|
Array.prototype.forEach.call(messages, decryptFn);
|
|
|
|
}
|
|
|
|
|
|
|
|
//create Encrypt button
|
|
|
|
var textareas = document.getElementsByTagName('textarea');
|
|
|
|
if (textareas && textareas.length) {
|
|
|
|
Array.prototype.forEach.call(textareas, insertEncryptButton);
|
|
|
|
}
|
|
|
|
|
2018-12-27 18:30:39 +03:00
|
|
|
});
|
2018-12-27 17:26:59 +03:00
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
})();
|