re-introducing (optional) URL shortener support, resolves #58
This commit is contained in:
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…
Reference in New Issue