Kaynağa Gözat

re-introducing (optional) URL shortener support, resolves #58

El RIDO 10 yıl önce
ebeveyn
işleme
a4ebdbc606

+ 5 - 0
cfg/conf.ini.sample

@@ -52,6 +52,11 @@ languageselection = false
 ; if this is set and language selection is disabled, this will be the only language
 ; languagedefault = "en"
 
+; (optional) URL shortener address to offer after a new paste is created
+; it is suggested to only use this with self-hosted shorteners as this will leak
+; the pastes encryption key
+; urlshortener = "https://shortener.example.com/api?link="
+
 [expire]
 ; expire value that is selected per default
 ; make sure the value exists in [expire_options]

+ 2 - 1
i18n/de.json

@@ -135,5 +135,6 @@
     "Your browser does not support uploading encrypted files. Please use a newer browser.":
         "Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.",
     "Invalid attachment.": "Ungültiger Datei-Anhang.",
-    "Options": "Optionen"
+    "Options": "Optionen",
+    "Shorten URL": "URL verkürzen"
 }

+ 2 - 1
i18n/fr.json

@@ -144,5 +144,6 @@
     "Your browser does not support uploading encrypted files. Please use a newer browser.":
         "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.",
     "Invalid attachment.": "Attachement invalide.",
-    "Options": "Options"
+    "Options": "Options",
+    "Shorten URL": "Raccourcir URL"
 }

+ 2 - 1
i18n/pl.json

@@ -135,5 +135,6 @@
     "Your browser does not support uploading encrypted files. Please use a newer browser.":
         "Your browser does not support uploading encrypted files. Please use a newer browser.",
     "Invalid attachment.": "Invalid attachment.",
-    "Options": "Options"
+    "Options": "Options",
+    "Shorten URL": "Skróć adres URL"
 }

+ 2 - 1
i18n/sl.json

@@ -144,5 +144,6 @@
     "Your browser does not support uploading encrypted files. Please use a newer browser.":
         "Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.",
     "Invalid attachment.": "Neveljavna priponka.",
-    "Options": "Možnosti"
+    "Options": "Možnosti",
+    "Shorten URL": "Skrajšajte URL"
 }

BIN
img/icon_shorten.png


+ 31 - 4
js/zerobin.js

@@ -405,7 +405,7 @@ $(function() {
          * translation cache
          */
         translations: {}
-    }
+    };
 
     /**
      * filter methods
@@ -921,7 +921,7 @@ $(function() {
                             filter.cipher(randomkey, password, e.target.result),
                             filter.cipher(randomkey, password, theFile.name)
                         );
-                    }
+                    };
                 })(files[0]);
                 reader.readAsDataURL(files[0]);
             }
@@ -942,7 +942,9 @@ $(function() {
         /**
          * Send a new paste to server, step 2
          *
-         * @param Event event
+         * @param string randomkey
+         * @param encrypted string cipherdata_attachment
+         * @param encrypted string cipherdata_attachment_name
          */
         sendDataContinue: function(randomkey, cipherdata_attachment, cipherdata_attachment_name)
         {
@@ -977,7 +979,12 @@ $(function() {
                         zerobin.showStatus('', false);
                         zerobin.errorMessage.addClass('hidden');
 
-                        $('#pastelink').html(i18n._('Your paste is <a id="pasteurl" href="%s">%s</a> <span id="copyhint">(Hit [Ctrl]+[c] to copy)</span>', url, url));
+                        $('#pastelink').html(
+                            i18n._(
+                                'Your paste is <a id="pasteurl" href="%s">%s</a> <span id="copyhint">(Hit [Ctrl]+[c] to copy)</span>',
+                                url, url
+                            ) + zerobin.shortenUrl(url)
+                        );
                         $('#deletelink').html('<a href="' + deleteUrl + '">' + i18n._('Delete data') + '</a>');
                         zerobin.pasteResult.removeClass('hidden');
                         // We pre-select the link so that the user only has to [Ctrl]+[c] the link.
@@ -1004,6 +1011,26 @@ $(function() {
             });
         },
 
+        /**
+         * Check if a URL shortener was defined and create HTML containing a link to it.
+         *
+         * @param string url
+         * @return string html
+         */
+        shortenUrl: function(url)
+        {
+            var shortenerHtml = $('#shortenbutton');
+            if (shortenerHtml) {
+                var shortener = shortenerHtml.data('shortener');
+                shortenerHtml.attr(
+                    'onclick',
+                    "window.location.href = '" + shortener + encodeURIComponent(url) + "';"
+                );
+                return ' ' + $('<div />').append(shortenerHtml.clone()).html();
+            }
+            return '';
+        },
+
         /**
          * Put the screen in "New paste" mode.
          */

+ 1 - 0
lib/configuration.php

@@ -44,6 +44,7 @@ class configuration
             'base64version' => '2.1.9',
             'languageselection' => false,
             'languagedefault' => '',
+            'urlshortener' => '',
         ),
         'expire' => array(
             'default' => '1week',

+ 1 - 0
lib/zerobin.php

@@ -455,6 +455,7 @@ class zerobin
         $page->assign('EXPIRE', $expire);
         $page->assign('EXPIREDEFAULT', $this->_conf->getKey('default', 'expire'));
         $page->assign('EXPIRECLONE', !$this->_doesExpire || ($this->_doesExpire && $this->_conf->getKey('clone', 'expire')));
+        $page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener'));
         $page->draw($this->_conf->getKey('template'));
     }
 

+ 5 - 1
tpl/bootstrap-compact.html

@@ -169,7 +169,11 @@
 			<div id="pasteresult" role="alert" class="hidden alert alert-success">
 				<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
 				<div id="deletelink"></div>
-				<div id="pastelink"></div>
+				<div id="pastelink">{if="strlen($URLSHORTENER)"}
+					<button id="shortenbutton" data-shortener="{$URLSHORTENER|htmlspecialchars}" type="button" class="btn btn-primary">
+						<span class="glyphicon glyphicon-send" aria-hidden="true"></span> {function="t('Shorten URL')"}
+					</button>
+				{/if}</div>
 			</div>
 		</header>
 		<section class="container">

+ 5 - 1
tpl/bootstrap-dark-page.html

@@ -165,7 +165,11 @@
 			<div id="pasteresult" role="alert" class="hidden alert alert-success">
 				<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
 				<div id="deletelink"></div>
-				<div id="pastelink"></div>
+				<div id="pastelink">{if="strlen($URLSHORTENER)"}
+					<button id="shortenbutton" data-shortener="{$URLSHORTENER|htmlspecialchars}" type="button" class="btn btn-warning">
+						<span class="glyphicon glyphicon-send" aria-hidden="true"></span> {function="t('Shorten URL')"}
+					</button>
+				{/if}</div>
 			</div>
 		</header>
 		<section class="container">

+ 5 - 1
tpl/bootstrap-dark.html

@@ -165,7 +165,11 @@
 			<div id="pasteresult" role="alert" class="hidden alert alert-success">
 				<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
 				<div id="deletelink"></div>
-				<div id="pastelink"></div>
+				<div id="pastelink">{if="strlen($URLSHORTENER)"}
+					<button id="shortenbutton" data-shortener="{$URLSHORTENER|htmlspecialchars}" type="button" class="btn btn-warning">
+						<span class="glyphicon glyphicon-send" aria-hidden="true"></span> {function="t('Shorten URL')"}
+					</button>
+				{/if}</div>
 			</div>
 		</header>
 		<section class="container">

+ 5 - 1
tpl/bootstrap-page.html

@@ -165,7 +165,11 @@
 			<div id="pasteresult" role="alert" class="hidden alert alert-success">
 				<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
 				<div id="deletelink"></div>
-				<div id="pastelink"></div>
+				<div id="pastelink">{if="strlen($URLSHORTENER)"}
+					<button id="shortenbutton" data-shortener="{$URLSHORTENER|htmlspecialchars}" type="button" class="btn btn-primary">
+						<span class="glyphicon glyphicon-send" aria-hidden="true"></span> {function="t('Shorten URL')"}
+					</button>
+				{/if}</div>
 			</div>
 		</header>
 		<section class="container">

+ 5 - 1
tpl/bootstrap.html

@@ -165,7 +165,11 @@
 			<div id="pasteresult" role="alert" class="hidden alert alert-success">
 				<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
 				<div id="deletelink"></div>
-				<div id="pastelink"></div>
+				<div id="pastelink">{if="strlen($URLSHORTENER)"}
+					<button id="shortenbutton" data-shortener="{$URLSHORTENER|htmlspecialchars}" type="button" class="btn btn-primary">
+						<span class="glyphicon glyphicon-send" aria-hidden="true"></span> {function="t('Shorten URL')"}
+					</button>
+				{/if}</div>
 			</div>
 		</header>
 		<section class="container">

+ 3 - 1
tpl/page.html

@@ -84,7 +84,9 @@
 				</div>
 				<div id="pasteresult" class="hidden">
 					<div id="deletelink"></div>
-					<div id="pastelink"></div>
+					<div id="pastelink">{if="strlen($URLSHORTENER)"}
+						<button id="shortenbutton" data-shortener="{$URLSHORTENER|htmlspecialchars}"><img src="img/icon_shorten.png" width="13" height="15" />{function="t('Shorten URL')"}</button>
+					{/if}</div>
 				</div>{if="$FILEUPLOAD"}
 				<div id="attachment" class="hidden"><a>{function="t('Download attachment')"}</a></div>
 				<div id="attach" class="hidden">

+ 1 - 0
tst/RainTPL.php

@@ -44,6 +44,7 @@ class RainTPLTest extends PHPUnit_Framework_TestCase
         $page->assign('EXPIRE', self::$expire);
         $page->assign('EXPIREDEFAULT', self::$expire_default);
         $page->assign('EXPIRECLONE', true);
+        $page->assign('URLSHORTENER', '');
         ob_start();
         $page->draw('page');
         $this->_content = ob_get_contents();

+ 1 - 0
tst/configuration.php

@@ -16,6 +16,7 @@ class configurationTest extends PHPUnit_Framework_TestCase
             'base64version' => '2.1.9',
             'languageselection' => false,
             'languagedefault' => '',
+            'urlshortener' => '',
         ),
         'expire' => array(
             'default' => '1week',

+ 57 - 0
tst/zerobin.php

@@ -44,6 +44,13 @@ class zerobinTest extends PHPUnit_Framework_TestCase
             $content,
             'outputs title correctly'
         );
+        $this->assertNotTag(
+            array(
+                'id' => 'shortenbutton'
+            ),
+            $content,
+            'doesn\'t output shortener button'
+        );
     }
 
     /**
@@ -70,6 +77,56 @@ class zerobinTest extends PHPUnit_Framework_TestCase
         );
     }
 
+    /**
+     * @runInSeparateProcess
+     */
+    public function testViewForceLanguageDefault()
+    {
+        $this->reset();
+        $options = parse_ini_file(CONF, true);
+        $options['main']['languageselection'] = false;
+        $options['main']['languagedefault'] = 'fr';
+        helper::confBackup();
+        helper::createIniFile(CONF, $options);
+        $_COOKIE['lang'] = 'de';
+        ob_start();
+        new zerobin;
+        $content = ob_get_contents();
+        $this->assertTag(
+            array(
+                'tag' => 'title',
+                'content' => 'ZeroBin'
+            ),
+            $content,
+            'outputs title correctly'
+        );
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testViewUrlShortener()
+    {
+        $shortener = 'https://shortener.example.com/api?link=';
+        $this->reset();
+        $options = parse_ini_file(CONF, true);
+        $options['main']['urlshortener'] = $shortener;
+        helper::confBackup();
+        helper::createIniFile(CONF, $options);
+        $_COOKIE['lang'] = 'de';
+        ob_start();
+        new zerobin;
+        $content = ob_get_contents();
+        $this->assertTag(
+            array(
+                'id' => 'shortenbutton',
+                'attributes' => array('data-shortener' => $shortener)
+            ),
+            $content,
+            'outputs configured shortener URL correctly'
+        );
+    }
+
     /**
      * @runInSeparateProcess
      */