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

pull/17/head
El RIDO 8 years ago
parent d510e861d2
commit a4ebdbc606

@ -52,6 +52,11 @@ languageselection = false
; if this is set and language selection is disabled, this will be the only language ; if this is set and language selection is disabled, this will be the only language
; languagedefault = "en" ; 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]
; expire value that is selected per default ; expire value that is selected per default
; make sure the value exists in [expire_options] ; make sure the value exists in [expire_options]

@ -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.":
"Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.", "Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.",
"Invalid attachment.": "Ungültiger Datei-Anhang.", "Invalid attachment.": "Ungültiger Datei-Anhang.",
"Options": "Optionen" "Options": "Optionen",
"Shorten URL": "URL verkürzen"
} }

@ -144,5 +144,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.":
"Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.", "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.",
"Invalid attachment.": "Attachement invalide.", "Invalid attachment.": "Attachement invalide.",
"Options": "Options" "Options": "Options",
"Shorten URL": "Raccourcir URL"
} }

@ -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.":
"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.", "Invalid attachment.": "Invalid attachment.",
"Options": "Options" "Options": "Options",
"Shorten URL": "Skróć adres URL"
} }

@ -144,5 +144,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.":
"Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.", "Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.",
"Invalid attachment.": "Neveljavna priponka.", "Invalid attachment.": "Neveljavna priponka.",
"Options": "Možnosti" "Options": "Možnosti",
"Shorten URL": "Skrajšajte URL"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

@ -405,7 +405,7 @@ $(function() {
* translation cache * translation cache
*/ */
translations: {} translations: {}
} };
/** /**
* filter methods * filter methods
@ -921,7 +921,7 @@ $(function() {
filter.cipher(randomkey, password, e.target.result), filter.cipher(randomkey, password, e.target.result),
filter.cipher(randomkey, password, theFile.name) filter.cipher(randomkey, password, theFile.name)
); );
} };
})(files[0]); })(files[0]);
reader.readAsDataURL(files[0]); reader.readAsDataURL(files[0]);
} }
@ -942,7 +942,9 @@ $(function() {
/** /**
* Send a new paste to server, step 2 * 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) sendDataContinue: function(randomkey, cipherdata_attachment, cipherdata_attachment_name)
{ {
@ -977,7 +979,12 @@ $(function() {
zerobin.showStatus('', false); zerobin.showStatus('', false);
zerobin.errorMessage.addClass('hidden'); 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>'); $('#deletelink').html('<a href="' + deleteUrl + '">' + i18n._('Delete data') + '</a>');
zerobin.pasteResult.removeClass('hidden'); zerobin.pasteResult.removeClass('hidden');
// We pre-select the link so that the user only has to [Ctrl]+[c] the link. // 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. * Put the screen in "New paste" mode.
*/ */

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

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

@ -169,7 +169,11 @@
<div id="pasteresult" role="alert" class="hidden alert alert-success"> <div id="pasteresult" role="alert" class="hidden alert alert-success">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<div id="deletelink"></div> <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> </div>
</header> </header>
<section class="container"> <section class="container">

@ -165,7 +165,11 @@
<div id="pasteresult" role="alert" class="hidden alert alert-success"> <div id="pasteresult" role="alert" class="hidden alert alert-success">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<div id="deletelink"></div> <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> </div>
</header> </header>
<section class="container"> <section class="container">

@ -165,7 +165,11 @@
<div id="pasteresult" role="alert" class="hidden alert alert-success"> <div id="pasteresult" role="alert" class="hidden alert alert-success">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<div id="deletelink"></div> <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> </div>
</header> </header>
<section class="container"> <section class="container">

@ -165,7 +165,11 @@
<div id="pasteresult" role="alert" class="hidden alert alert-success"> <div id="pasteresult" role="alert" class="hidden alert alert-success">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<div id="deletelink"></div> <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> </div>
</header> </header>
<section class="container"> <section class="container">

@ -165,7 +165,11 @@
<div id="pasteresult" role="alert" class="hidden alert alert-success"> <div id="pasteresult" role="alert" class="hidden alert alert-success">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<div id="deletelink"></div> <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> </div>
</header> </header>
<section class="container"> <section class="container">

@ -84,7 +84,9 @@
</div> </div>
<div id="pasteresult" class="hidden"> <div id="pasteresult" class="hidden">
<div id="deletelink"></div> <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>{if="$FILEUPLOAD"}
<div id="attachment" class="hidden"><a>{function="t('Download attachment')"}</a></div> <div id="attachment" class="hidden"><a>{function="t('Download attachment')"}</a></div>
<div id="attach" class="hidden"> <div id="attach" class="hidden">

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

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

@ -44,6 +44,13 @@ class zerobinTest extends PHPUnit_Framework_TestCase
$content, $content,
'outputs title correctly' '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 * @runInSeparateProcess
*/ */

Loading…
Cancel
Save