Pārlūkot izejas kodu

Add password retry feature

rugk 9 gadi atpakaļ
vecāks
revīzija
d53207e404

+ 82 - 9
js/privatebin.js

@@ -460,7 +460,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
                     // file is loaded
                     // file is loaded
                 }
                 }
 
 
-                // for all other langauges than English for which this behaviour
+                // for all other languages than English for which this behaviour
                 // is expected as it is built-in, log error
                 // is expected as it is built-in, log error
                 if (language !== null && language !== 'en') {
                 if (language !== null && language !== 'en') {
                     console.error('Missing translation for: \'' + messageId + '\' in language ' + language);
                     console.error('Missing translation for: \'' + messageId + '\' in language ' + language);
@@ -1533,6 +1533,21 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
             return password;
             return password;
         }
         }
 
 
+        /**
+         * resets the password to an empty string
+         *
+         * @name   Prompt.reset
+         * @function
+         */
+        me.reset = function()
+        {
+            // reset internal
+            password = '';
+
+            // and also reset UI
+            $passwordDecrypt.val('');
+        }
+
         /**
         /**
          * init status manager
          * init status manager
          *
          *
@@ -2510,9 +2525,11 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
             $password,
             $password,
             $passwordInput,
             $passwordInput,
             $rawTextButton,
             $rawTextButton,
-            $sendButton;
+            $sendButton,
+            $retryButton;
 
 
-        var pasteExpiration = '1week';
+        var pasteExpiration = '1week',
+            retryButtonCallback;
 
 
         /**
         /**
          * set the expiration on bootstrap templates in dropdown
          * set the expiration on bootstrap templates in dropdown
@@ -2663,6 +2680,19 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
             Controller.newPaste();
             Controller.newPaste();
         }
         }
 
 
+        /**
+         * retrys some callback registered before
+         *
+         * @name   TopNav.clickRetryButton
+         * @private
+         * @function
+         * @param  {Event} event
+         */
+        function clickRetryButton(event)
+        {
+            retryButtonCallback();
+        }
+
         /**
         /**
          * removes the existing attachment
          * removes the existing attachment
          *
          *
@@ -2720,8 +2750,8 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
                 return;
                 return;
             }
             }
 
 
-            $newButton.addClass('hidden');
             $cloneButton.addClass('hidden');
             $cloneButton.addClass('hidden');
+            $newButton.addClass('hidden');
             $rawTextButton.addClass('hidden');
             $rawTextButton.addClass('hidden');
 
 
             viewButtonsDisplayed = false;
             viewButtonsDisplayed = false;
@@ -2752,14 +2782,14 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
                 return;
                 return;
             }
             }
 
 
-            $sendButton.removeClass('hidden');
+            $attach.removeClass('hidden');
+            $burnAfterReadingOption.removeClass('hidden');
             $expiration.removeClass('hidden');
             $expiration.removeClass('hidden');
             $formatter.removeClass('hidden');
             $formatter.removeClass('hidden');
-            $burnAfterReadingOption.removeClass('hidden');
-            $openDiscussionOption.removeClass('hidden');
             $newButton.removeClass('hidden');
             $newButton.removeClass('hidden');
+            $openDiscussionOption.removeClass('hidden');
             $password.removeClass('hidden');
             $password.removeClass('hidden');
-            $attach.removeClass('hidden');
+            $sendButton.removeClass('hidden');
 
 
             createButtonsDisplayed = true;
             createButtonsDisplayed = true;
         }
         }
@@ -2800,6 +2830,28 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
             $newButton.removeClass('hidden');
             $newButton.removeClass('hidden');
         }
         }
 
 
+        /**
+         * only shows the "retry" button
+         *
+         * @name   TopNav.showRetryButton
+         * @function
+         */
+        me.showRetryButton = function()
+        {
+            $retryButton.removeClass('hidden');
+        }
+
+        /**
+         * hides the "retry" button
+         *
+         * @name   TopNav.hideRetryButton
+         * @function
+         */
+        me.hideRetryButton = function()
+        {
+            $retryButton.addClass('hidden');
+        }
+
         /**
         /**
          * only hides the clone button
          * only hides the clone button
          *
          *
@@ -2947,6 +2999,18 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
             return $customAttachment;
             return $customAttachment;
         }
         }
 
 
+        /**
+         * Set a function to call when the retry button is clicked.
+         *
+         * @name   TopNav.setRetryCallback
+         * @function
+         * @param {function} callback
+         */
+        me.setRetryCallback = function(callback)
+        {
+            retryButtonCallback = callback;
+        }
+
         /**
         /**
          * init navigation manager
          * init navigation manager
          *
          *
@@ -2972,6 +3036,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
             $password = $('#password');
             $password = $('#password');
             $passwordInput = $('#passwordinput');
             $passwordInput = $('#passwordinput');
             $rawTextButton = $('#rawtextbutton');
             $rawTextButton = $('#rawtextbutton');
+            $retryButton = $('#retrybutton');
             $sendButton = $('#sendbutton');
             $sendButton = $('#sendbutton');
 
 
             // bootstrap template drop down
             // bootstrap template drop down
@@ -2986,6 +3051,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
             $sendButton.click(PasteEncrypter.sendPaste);
             $sendButton.click(PasteEncrypter.sendPaste);
             $cloneButton.click(Controller.clonePaste);
             $cloneButton.click(Controller.clonePaste);
             $rawTextButton.click(rawText);
             $rawTextButton.click(rawText);
+            $retryButton.click(clickRetryButton);
             $fileRemoveButton.click(removeAttachment);
             $fileRemoveButton.click(removeAttachment);
 
 
             // bootstrap template drop downs
             // bootstrap template drop downs
@@ -3796,6 +3862,9 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
          */
          */
         me.run = function(paste)
         me.run = function(paste)
         {
         {
+            // in case the button has been there previously
+            TopNav.hideRetryButton();
+
             Alert.hideMessages();
             Alert.hideMessages();
             Alert.showLoading('Decrypting paste…', 0, 'cloud-download'); // @TODO icon maybe rotation-lock, but needs full Glyphicons
             Alert.showLoading('Decrypting paste…', 0, 'cloud-download'); // @TODO icon maybe rotation-lock, but needs full Glyphicons
 
 
@@ -3845,7 +3914,11 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
 
 
                 // log and show error
                 // log and show error
                 console.error(err);
                 console.error(err);
-                Alert.showError('Could not decrypt data (Wrong key?)');
+                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(me.run);
+                TopNav.showRetryButton();
             }
             }
         }
         }
 
 

+ 6 - 1
tpl/bootstrap.php

@@ -69,7 +69,7 @@ if ($MARKDOWN):
 <?php
 <?php
 endif;
 endif;
 ?>
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-TCwmpH2nrRe3mLYIsGG90FGOFAqZal8SUQVNp16iA7K1B80I//RXp8mYxXdyyk/eluKilwCNY5wo9MYC4vdEoQ==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-tGE0CigbTPqWg1xkIeJrdAT3U9QsTTI2k/8qviRyBVbyuevBiyM3XBlmpARRjHwv075QSK4h4TuI8TlU9ScS2Q==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->
 		<![endif]-->
@@ -125,6 +125,11 @@ endif;
 						<?php echo I18n::_('Loading…'), PHP_EOL; ?>
 						<?php echo I18n::_('Loading…'), PHP_EOL; ?>
 					</li>
 					</li>
 					<li>
 					<li>
+						<button id="retrybutton" type="button" class="reloadlink hidden btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?> navbar-btn">
+							<span class="glyphicon glyphicon-repeat" aria-hidden="true"></span> <?php echo I18n::_('Retry'), PHP_EOL; ?>
+						</button>
+					</li>
+					<li>
 <?php
 <?php
 if ($isPage):
 if ($isPage):
 ?>
 ?>

+ 1 - 1
tpl/page.php

@@ -47,7 +47,7 @@ if ($MARKDOWN):
 <?php
 <?php
 endif;
 endif;
 ?>
 ?>
-		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-TCwmpH2nrRe3mLYIsGG90FGOFAqZal8SUQVNp16iA7K1B80I//RXp8mYxXdyyk/eluKilwCNY5wo9MYC4vdEoQ==" crossorigin="anonymous"></script>
+		<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-tGE0CigbTPqWg1xkIeJrdAT3U9QsTTI2k/8qviRyBVbyuevBiyM3XBlmpARRjHwv075QSK4h4TuI8TlU9ScS2Q==" crossorigin="anonymous"></script>
 		<!--[if lt IE 10]>
 		<!--[if lt IE 10]>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
 		<![endif]-->
 		<![endif]-->

+ 1 - 0
vendor/composer/autoload_classmap.php

@@ -23,6 +23,7 @@ return array(
     'PrivateBin\\Model\\Comment' => $baseDir . '/lib/Model/Comment.php',
     'PrivateBin\\Model\\Comment' => $baseDir . '/lib/Model/Comment.php',
     'PrivateBin\\Model\\Paste' => $baseDir . '/lib/Model/Paste.php',
     'PrivateBin\\Model\\Paste' => $baseDir . '/lib/Model/Paste.php',
     'PrivateBin\\Persistence\\AbstractPersistence' => $baseDir . '/lib/Persistence/AbstractPersistence.php',
     'PrivateBin\\Persistence\\AbstractPersistence' => $baseDir . '/lib/Persistence/AbstractPersistence.php',
+    'PrivateBin\\Persistence\\DataStore' => $baseDir . '/lib/Persistence/DataStore.php',
     'PrivateBin\\Persistence\\PurgeLimiter' => $baseDir . '/lib/Persistence/PurgeLimiter.php',
     'PrivateBin\\Persistence\\PurgeLimiter' => $baseDir . '/lib/Persistence/PurgeLimiter.php',
     'PrivateBin\\Persistence\\ServerSalt' => $baseDir . '/lib/Persistence/ServerSalt.php',
     'PrivateBin\\Persistence\\ServerSalt' => $baseDir . '/lib/Persistence/ServerSalt.php',
     'PrivateBin\\Persistence\\TrafficLimiter' => $baseDir . '/lib/Persistence/TrafficLimiter.php',
     'PrivateBin\\Persistence\\TrafficLimiter' => $baseDir . '/lib/Persistence/TrafficLimiter.php',

+ 1 - 0
vendor/composer/autoload_static.php

@@ -52,6 +52,7 @@ class ComposerStaticInitDontChange
         'PrivateBin\\Model\\Comment' => __DIR__ . '/../..' . '/lib/Model/Comment.php',
         'PrivateBin\\Model\\Comment' => __DIR__ . '/../..' . '/lib/Model/Comment.php',
         'PrivateBin\\Model\\Paste' => __DIR__ . '/../..' . '/lib/Model/Paste.php',
         'PrivateBin\\Model\\Paste' => __DIR__ . '/../..' . '/lib/Model/Paste.php',
         'PrivateBin\\Persistence\\AbstractPersistence' => __DIR__ . '/../..' . '/lib/Persistence/AbstractPersistence.php',
         'PrivateBin\\Persistence\\AbstractPersistence' => __DIR__ . '/../..' . '/lib/Persistence/AbstractPersistence.php',
+        'PrivateBin\\Persistence\\DataStore' => __DIR__ . '/../..' . '/lib/Persistence/DataStore.php',
         'PrivateBin\\Persistence\\PurgeLimiter' => __DIR__ . '/../..' . '/lib/Persistence/PurgeLimiter.php',
         'PrivateBin\\Persistence\\PurgeLimiter' => __DIR__ . '/../..' . '/lib/Persistence/PurgeLimiter.php',
         'PrivateBin\\Persistence\\ServerSalt' => __DIR__ . '/../..' . '/lib/Persistence/ServerSalt.php',
         'PrivateBin\\Persistence\\ServerSalt' => __DIR__ . '/../..' . '/lib/Persistence/ServerSalt.php',
         'PrivateBin\\Persistence\\TrafficLimiter' => __DIR__ . '/../..' . '/lib/Persistence/TrafficLimiter.php',
         'PrivateBin\\Persistence\\TrafficLimiter' => __DIR__ . '/../..' . '/lib/Persistence/TrafficLimiter.php',