diff --git a/js/privatebin.js b/js/privatebin.js
index 3d83e990..d70a3387 100644
--- a/js/privatebin.js
+++ b/js/privatebin.js
@@ -4133,6 +4133,7 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
*
* @name PasteDecrypter.decryptOrPromptPassword
* @private
+ * @async
* @function
* @param {string} key
* @param {string} password - optional, may be an empty string
@@ -4140,10 +4141,10 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
* @throws {string}
* @return {false|string} false, when unsuccessful or string (decrypted data)
*/
- function decryptOrPromptPassword(key, password, cipherdata)
+ async function decryptOrPromptPassword(key, password, cipherdata)
{
// try decryption without password
- var plaindata = CryptTool.decipher(key, password, cipherdata);
+ var plaindata = await CryptTool.decipher(key, password, cipherdata);
// if it fails, request password
if (plaindata.length === 0 && password.length === 0) {
@@ -4168,6 +4169,7 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
*
* @name PasteDecrypter.decryptPaste
* @private
+ * @async
* @function
* @param {object} paste - paste data in object form
* @param {string} key
@@ -4176,29 +4178,30 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
* @return {bool} whether action was successful
* @throws {string}
*/
- function decryptPaste(paste, key, password, ignoreError)
+ async function decryptPaste(paste, key, password, ignoreError)
{
- var plaintext;
+ let decyptionPromise;
if (ignoreError === true) {
- plaintext = CryptTool.decipher(key, password, paste.data);
+ decyptionPromise = CryptTool.decipher(key, password, paste.data);
} else {
- try {
- plaintext = decryptOrPromptPassword(key, password, paste.data);
- } catch (err) {
- throw 'failed to decipher paste text: ' + err;
- }
+ decyptionPromise = decryptOrPromptPassword(key, password, paste.data);
+ }
+
+ return decyptionPromise.then((plaintext) => {
if (plaintext === false) {
return false;
}
- }
- // on success show paste
- PasteViewer.setFormat(paste.meta.formatter);
- PasteViewer.setText(plaintext);
- // trigger to show the text (attachment loaded afterwards)
- PasteViewer.run();
+ // on success show paste
+ PasteViewer.setFormat(paste.meta.formatter);
+ PasteViewer.setText(plaintext);
+ // trigger to show the text (attachment loaded afterwards)
+ PasteViewer.run();
- return true;
+ return true;
+ }).catch((err) => {
+ throw 'failed to decipher paste text: ' + err;
+ });
}
/**
@@ -4206,6 +4209,7 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
*
* @name PasteDecrypter.decryptAttachment
* @private
+ * @async
* @function
* @param {object} paste - paste data in object form
* @param {string} key
@@ -4213,36 +4217,26 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
* @return {bool} whether action was successful
* @throws {string}
*/
- function decryptAttachment(paste, key, password)
+ async function decryptAttachment(paste, key, password)
{
- var attachment, attachmentName;
-
- // decrypt attachment
- try {
- attachment = decryptOrPromptPassword(key, password, paste.attachment);
- } catch (err) {
+ let attachmentPromise = decryptOrPromptPassword(key, password, paste.attachment);
+ let attachmentNamePromise = decryptOrPromptPassword(key, password, paste.attachmentname);
+ attachmentPromise.catch((err) => {
throw 'failed to decipher attachment: ' + err;
- }
- if (attachment === false) {
- return false;
- }
-
- // decrypt attachment name
- if (paste.attachmentname) {
- try {
- attachmentName = decryptOrPromptPassword(key, password, paste.attachmentname);
- } catch (err) {
- throw 'failed to decipher attachment name: ' + err;
- }
- if (attachmentName === false) {
+ })
+ attachmentNamePromise.catch((err) => {
+ throw 'failed to decipher attachment name: ' + err;
+ })
+ Promise.all([attachmentPromise, attachmentNamePromise]).then((results) => {
+ if (results.some((result) => {
+ return result === false;
+ })) {
return false;
}
- }
-
- AttachmentViewer.setAttachment(attachment, attachmentName);
- AttachmentViewer.showAttachment();
-
- return true;
+ AttachmentViewer.setAttachment(results[0], results[1]);
+ AttachmentViewer.showAttachment();
+ return true;
+ })
}
/**
@@ -4300,20 +4294,17 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
// try to decrypt the paste
try {
// decrypt attachments
- if (paste.attachment) {
- if (AttachmentViewer.hasAttachmentData()) {
- // try to decrypt paste and if it fails (because the password is
- // missing) return to let JS continue and wait for user
- if (!decryptAttachment(paste, key, password)) {
- return;
+ if (paste.attachment && AttachmentViewer.hasAttachmentData()) {
+ // try to decrypt paste and if it fails (because the password is
+ // missing) return to let JS continue and wait for user
+ decryptAttachment(paste, key, password).then((attachementIsDecrypted) => {
+ if (attachementIsDecrypted) {
+ // ignore empty paste, as this is allowed when pasting attachments
+ decryptPaste(paste, key, password, true);
}
- }
- // ignore empty paste, as this is allowed when pasting attachments
- decryptPaste(paste, key, password, true);
+ });
} else {
- if (decryptPaste(paste, key, password) === false) {
- return false;
- }
+ decryptPaste(paste, key, password)
}
// shows the remaining time (until) deletion
@@ -4472,8 +4463,6 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
// restore position
window.scrollTo(0, orgPosition);
- PasteDecrypter.run(data);
-
// NOTE: could create problems as callback may be called
// asyncronously if PasteDecrypter e.g. needs to wait for a
// password being entered
diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php
index 124f3d61..99ff7c79 100644
--- a/tpl/bootstrap.php
+++ b/tpl/bootstrap.php
@@ -71,7 +71,7 @@ if ($MARKDOWN):
endif;
?>
-
+
diff --git a/tpl/page.php b/tpl/page.php
index 94ca6f48..6ebf95ef 100644
--- a/tpl/page.php
+++ b/tpl/page.php
@@ -49,7 +49,7 @@ if ($MARKDOWN):
endif;
?>
-
+