2015-05-06 20:35:30 +02:00
|
|
|
var randomString = function(length, chars) {
|
|
|
|
var result = '';
|
2015-05-05 23:24:37 +02:00
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
for (var i = length; i > 0; --i) {
|
|
|
|
result += chars[Math.round(Math.random() * (chars.length - 1))];
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
2015-05-05 23:24:37 +02:00
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
var JsonFormatter = {
|
|
|
|
stringify: function(cipherParams) {
|
|
|
|
var jsonObj = {
|
|
|
|
ct: cipherParams.ciphertext.toString(CryptoJS.enc.Base64)
|
|
|
|
};
|
2015-05-05 23:24:37 +02:00
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
if (cipherParams.iv) {
|
|
|
|
jsonObj.iv = cipherParams.iv.toString();
|
|
|
|
}
|
|
|
|
if (cipherParams.salt) {
|
|
|
|
jsonObj.s = cipherParams.salt.toString();
|
|
|
|
}
|
2015-05-05 23:24:37 +02:00
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
return JSON.stringify(jsonObj);
|
|
|
|
},
|
2015-05-05 23:24:37 +02:00
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
parse: function(jsonStr) {
|
|
|
|
var jsonObj = JSON.parse(jsonStr);
|
|
|
|
var cipherParams = CryptoJS.lib.CipherParams.create({
|
|
|
|
ciphertext: CryptoJS.enc.Base64.parse(jsonObj.ct)
|
|
|
|
});
|
2015-05-05 23:24:37 +02:00
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
if (jsonObj.iv) {
|
|
|
|
cipherParams.iv = CryptoJS.enc.Hex.parse(jsonObj.iv)
|
|
|
|
}
|
|
|
|
if (jsonObj.s) {
|
|
|
|
cipherParams.salt = CryptoJS.enc.Hex.parse(jsonObj.s)
|
|
|
|
}
|
2015-05-05 23:24:37 +02:00
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
return cipherParams;
|
2015-05-05 23:24:37 +02:00
|
|
|
}
|
2015-05-06 20:35:30 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
var editorEvents = function() {
|
|
|
|
$('textarea').on('keyup change', function() {
|
|
|
|
$(this).attr('rows', Math.min(30, Math.max(10, $(this).val().split("\n").length)));
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#options input').change(function() {
|
|
|
|
var $input = $(this);
|
|
|
|
|
|
|
|
var $label = $($input.data('id'));
|
|
|
|
|
|
|
|
$label.html($label.data('tpl').replace('%value%', $input.data('title')));
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#options li, #options a').click(function() {
|
|
|
|
$(this).find('label').trigger('click');
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#options label').click(function(e) {
|
|
|
|
e.stopPropagation();
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#options input:checked').each(function() {
|
|
|
|
$(this).trigger('change');
|
|
|
|
});
|
2015-05-06 22:46:29 +02:00
|
|
|
|
2015-05-08 16:44:59 +02:00
|
|
|
$('.show-diff').click(function() {
|
|
|
|
$($(this).data('target')).toggle();
|
|
|
|
});
|
2015-05-11 18:40:27 +02:00
|
|
|
|
|
|
|
if ((document.location.href).indexOf('#diff-') !== -1) {
|
|
|
|
var anchor = '#' + (document.location.href).toString().split('#')[1];
|
|
|
|
$('.show-diff[href="' + anchor + '"]').click();
|
|
|
|
document.location.href = anchor;
|
|
|
|
}
|
2015-05-06 20:35:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var mainEditorEvents = function() {
|
|
|
|
$('.cipher-input').change(function() {
|
|
|
|
if ($('.cipher-input:checked').val() === 'yes') {
|
|
|
|
$('#cipher-alert').removeClass('hide');
|
|
|
|
} else {
|
|
|
|
$('#cipher-alert').addClass('hide');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#main-form').submit(function(e) {
|
|
|
|
if ($('.cipher-input:checked').val() === 'yes') {
|
|
|
|
var passphrase = randomString(256, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
|
|
|
|
var content = $('#form_content').val();
|
|
|
|
var encrypted = CryptoJS.AES.encrypt(content, passphrase, {
|
|
|
|
format: JsonFormatter
|
|
|
|
});
|
|
|
|
|
|
|
|
$(this).attr('action', $(this).attr('action') + '#key=' + passphrase);
|
|
|
|
$('#form_content').val(encrypted);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-05-11 21:06:41 +02:00
|
|
|
var getKey = function() {
|
|
|
|
var url = document.location.href;
|
|
|
|
var parts = url.split('#key=');
|
2015-05-09 01:03:51 +02:00
|
|
|
|
2015-05-11 21:06:41 +02:00
|
|
|
if (parts.length === 2) {
|
|
|
|
return parts[1];
|
2015-05-08 16:44:59 +02:00
|
|
|
}
|
|
|
|
|
2015-05-11 21:06:41 +02:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
var viewerEvents = function() {
|
|
|
|
var $render = $('.syntaxhighlighter');
|
|
|
|
|
2015-05-08 16:44:59 +02:00
|
|
|
$(document).ready(function() {
|
2015-05-11 21:06:41 +02:00
|
|
|
var key = getKey();
|
|
|
|
var $embedInput = $('#embed-input');
|
|
|
|
var to = ' ';
|
2015-05-08 16:44:59 +02:00
|
|
|
|
2015-05-11 21:06:41 +02:00
|
|
|
if (0 !== $render.length && key) {
|
|
|
|
var decrypted = CryptoJS.AES.decrypt($render.html(), key, {
|
2015-05-08 16:44:59 +02:00
|
|
|
format: JsonFormatter
|
|
|
|
});
|
2015-05-09 01:03:51 +02:00
|
|
|
$render.text(decrypted.toString(CryptoJS.enc.Utf8));
|
2015-05-08 16:44:59 +02:00
|
|
|
SyntaxHighlighter.all();
|
2015-05-11 21:06:41 +02:00
|
|
|
|
|
|
|
to = ' data-key="#key=' + key + '" ';
|
2015-05-11 21:15:00 +02:00
|
|
|
|
|
|
|
$('.lang').each(function() {
|
|
|
|
$(this).attr('href', $(this).attr('href') + '#key=' + key);
|
|
|
|
});
|
2015-05-11 21:06:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($embedInput.length) {
|
|
|
|
$embedInput.val($embedInput.val().replace('%key%', to));
|
2015-05-08 16:44:59 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-05-06 20:35:30 +02:00
|
|
|
var bootstrap = function() {
|
|
|
|
editorEvents();
|
2015-05-08 16:44:59 +02:00
|
|
|
viewerEvents();
|
2015-05-06 20:35:30 +02:00
|
|
|
mainEditorEvents();
|
|
|
|
}
|
|
|
|
|
|
|
|
bootstrap();
|