AB64H

Auto BASE64 Hangouts

目前為 2016-09-30 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name AB64H
// @description Auto BASE64 Hangouts
// @namespace AB64H
// @version 0.1.3.3
// @include https://mail.google.com/*

// @require http://code.jquery.com/jquery-git.min.js
// @require https://greasyfork.org/scripts/23618-jsaes/code/JSAES.js?version=150018
// @require https://greasyfork.org/scripts/23619-jsaes-wrapper/code/JSAES%20Wrapper.js?version=150019
// @require https://greasyfork.org/scripts/130-portable-md5-function/code/Portable%20MD5%20Function.js?version=10066

// @license APACHE LICENSE 2.0
// @supportURL https://gitlab.com/jlxip/AB64H
// ==/UserScript==

function run() {
	var globalkey=prompt("PASSWORD OF COMMUNICATION");	// Pedimos la clave de cifrado para la comunicación
	var md5key=hex_md5(globalkey);	// Hasheamos la clave en md5 para obtener siempre una clave de 256 bits
	var key=init(md5key);	// Variable con la llave
	var msginput = $('div[role="textbox"]');	// Entrada de mensaje

	// LIMPIEZA DE VARIABLES QUE PUEDEN SER EXPUESTAS (seguridad)
	globalkey=null;
	md5key=null;

	msginput.keypress(function(evt) {	// Función para captar las pulsaciones de teclas en dicho campo
	    evt = evt || window.event;
	    var charCode = evt.keyCode || evt.which;
	    if(charCode==170) {	// Si la tecla pulsada es ª...
	    	var oneChanged = false;	// Variable booleana para saber si se ha descifrado al menos un mensaje
	    	$('span[dir="ltr"]').each(function() {	// Por cada etiqueta "span" con el campo dir="ltr"...
	    		if($(this).html().substr(0, 5)=="AES: ") {	// Si los primeros 4 bytes son "AES: "...
	    			var bencoded=$(this).html().substr(5, $(this).html().length);	// Obtenemos lo que queda después de "AES: "
	    			var encoded=atob(bencoded);	// Lo decodificamos de BASE64 para obtener los bytes limpios
	    			var decoded=decryptLongString(encoded, key);	// Decodificamos el mensaje
	    			$(this).html(decoded);	// Y lo cambiamos en el documento HTML
	    			oneChanged = true;	// Cambiamos el valor de la variable booleana para saber que al menos se ha descifrado un mensaje
	    		}
	    	});

	    	if(oneChanged == false) {	// Si no se ha cambiado ningún mensaje (porque se quiera cifrar texto)...
	    		var decoded=msginput.text();	// Variable con el mensaje en texto plano
		    	var encrypted=encryptLongString(decoded, key);	// Ciframos el mensaje
		    	var bencrypted=btoa(encrypted);	// Convertimos el mensaje cifrado en imprimible cifrándolo en BASE64
		    	msginput.text("AES: "+bencrypted);	// Cambiamos el mensaje a enviar por el mensaje cifrado con el prefijo "AES: "
	    	}

	    	return false;	// Devolvemos "false" para que no se escriba el carácter ª
	    }
	});
}

window.onload = function() {	// Cuando carga la página
	var search = $('input[dir="ltr"]:not([disabled])');	// Se busca el cuadro de búsqueda, valga la redundancia
	search.keypress(function(evt) {	// Cuando se pulse una tecla
		evt = evt || window.event;
		var charCode = evt.keyCode || evt.which;
		if(charCode==170) {		// Y sea ª
			run();	// Se ejecuta run()
			return false;	// Devolvemos "false" para que no se escriba el carácter ª
		}
	});
}