diff --git a/js/privatebin.js b/js/privatebin.js
index cf9b14a6..16501957 100644
--- a/js/privatebin.js
+++ b/js/privatebin.js
@@ -3990,12 +3990,12 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
Alert.hideLoading();
TopNav.showViewButtons();
- // show error message
+ // …show error message…
Alert.showError(
Uploader.parseUploadError(status, data, 'post comment')
);
- // reset error handler
+ // …and reset error handler
Alert.setCustomHandler(null);
});
@@ -4009,22 +4009,19 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
Uploader.setUnencryptedData('parentid', parentid);
}
- // encrypt data
- try {
- // start promisesat the same time and wait thereafter
- let settingData = [];
- settingData.push(Uploader.setData('data', plainText));
-
- if (nickname.length > 0) {
- settingData(Uploader.setData('nickname', nickname));
- }
-
- await Promise.all(settingData);
- } catch (e) {
- Alert.showError(e);
+ // start promises to encrypt data…
+ let dataPromises = [];
+ dataPromises.push(Uploader.setData('data', plainText));
+ if (nickname.length > 0) {
+ dataPromises.push(Uploader.setData('nickname', nickname));
}
- Uploader.run();
+ // …and upload when they are all done
+ Promise.all(dataPromises).then(() => {
+ Uploader.run();
+ }).catch((e) => {
+ Alert.showError(e);
+ });
};
/**
@@ -4194,7 +4191,7 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
PasteViewer.run();
}
}).catch((err) => {
- throw 'failed to decipher paste text: ' + err;
+ displayDecryptionError('failed to decipher paste text: ' + err);
});
}
@@ -4214,10 +4211,10 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
let attachmentPromise = decryptOrPromptPassword(key, password, paste.attachment);
let attachmentNamePromise = decryptOrPromptPassword(key, password, paste.attachmentname);
attachmentPromise.catch((err) => {
- throw 'failed to decipher attachment: ' + err;
+ displayDecryptionError('failed to decipher attachment: ' + err);
})
attachmentNamePromise.catch((err) => {
- throw 'failed to decipher attachment name: ' + err;
+ displayDecryptionError('failed to decipher attachment name: ' + err);
})
Promise.all([attachmentPromise, attachmentNamePromise]).then((results) => {
if (!results.some((result) => {
@@ -4247,12 +4244,15 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
let commentDecryptionPromises = [];
// iterate over comments
for (var i = 0; i < paste.comments.length; ++i) {
- commentDecryptionPromises.append(
+ commentDecryptionPromises.push(
CryptTool.decipher(key, password, paste.comments[i].data)
);
}
Promise.all(commentDecryptionPromises).then((plaintexts) => {
for (var i = 0; i < paste.comments.length; ++i) {
+ if (plaintexts[i] === false) {
+ continue;
+ }
var comment = paste.comments[i];
DiscussionViewer.addComment(
comment,
@@ -4264,6 +4264,27 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
});
}
+ /**
+ * displays and logs decryption errors
+ *
+ * @name PasteDecrypter.displayDecryptionError
+ * @private
+ * @function
+ * @param {string} message
+ */
+ function displayDecryptionError(message)
+ {
+ Alert.hideLoading();
+
+ // log detailed error, but display generic translation
+ console.error(message);
+ Alert.showError('Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.');
+
+ // reset password, so it can be re-entered
+ Prompt.reset();
+ TopNav.showRetryButton();
+ }
+
/**
* show decrypted text in the display area, including discussion (if open)
*
@@ -4282,50 +4303,43 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
return;
}
- var key = Model.getPasteKey(),
- password = Prompt.getPassword();
+ let key = Model.getPasteKey(),
+ password = Prompt.getPassword(),
+ decrytionPromises = [];
- // try to decrypt the paste
- try {
- // decrypt attachments
- 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
+ TopNav.setRetryCallback(function () {
+ TopNav.hideRetryButton();
+ me.run(paste);
+ });
+
+ // decrypt attachments
+ 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
+ decrytionPromises.push(
decryptAttachment(paste, key, password).then((attachementIsDecrypted) => {
if (attachementIsDecrypted) {
// ignore empty paste, as this is allowed when pasting attachments
- decryptPaste(paste, key, password, true);
+ return decryptPaste(paste, key, password, true);
}
- });
- } else {
- decryptPaste(paste, key, password)
- }
+ })
+ );
+ } else {
+ decrytionPromises.push(decryptPaste(paste, key, password))
+ }
- // shows the remaining time (until) deletion
- PasteStatus.showRemainingTime(paste.meta);
+ // shows the remaining time (until) deletion
+ PasteStatus.showRemainingTime(paste.meta);
- // if the discussion is opened on this paste, display it
- if (paste.meta.opendiscussion) {
- decryptComments(paste, key, password);
- }
+ // if the discussion is opened on this paste, display it
+ if (paste.meta.opendiscussion) {
+ decrytionPromises(decryptComments(paste, key, password));
+ }
+ Promise.all(decrytionPromises).then(() => {
Alert.hideLoading();
TopNav.showViewButtons();
- } catch(err) {
- Alert.hideLoading();
-
- // log and show error
- console.error(err);
- Alert.showError('Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.');
- // reset password, so it can be re-entered and sow retry button
- Prompt.reset();
- TopNav.setRetryCallback(function () {
- TopNav.hideRetryButton();
-
- me.run(paste);
- });
- TopNav.showRetryButton();
- }
+ });
};
/**
diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php
index 7a44b9b5..78c6b087 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 d6e3a0dc..d8e3d4d2 100644
--- a/tpl/page.php
+++ b/tpl/page.php
@@ -49,7 +49,7 @@ if ($MARKDOWN):
endif;
?>
-
+