incrementing version number, updating docs

This commit is contained in:
El RIDO 2015-09-19 17:23:10 +02:00
parent a41d0ca4dd
commit 608605cd54
25 changed files with 271 additions and 124 deletions

View File

@ -1,12 +1,29 @@
# ZeroBin version history #
* **0.21 (2015-09-19)**:
* ADDED: Translations for German, French and Polish, language selection menu (optional)
* ADDED: File upload and image display support (optional)
* ADDED: Markdown format support
* ADDED: "bootstrap-compact" template that hides some of the options in a drop down menu to ensure the nav bar fitting on one line on smaller screen sizes
* FIXING: Various usability issues with different screen sizes / device types in the "bootstrap" template
* CHANGED: Instead of having different options to enable and preselect certain formats there is now a generic `[formatter_options]` section where formats can be added to the displayed format drop down menu. A `defaultformatter` can be set, it defaults to "plaintext". The `syntaxhighlighting` configuration got deprecated.
* `zerobin.js` got a major refactoring:
* moved from global namespace into anonymous function
* events are no longer set via "onclick" attributes in the templates, but bound by from JS side
* for simpler maintenance the functions were grouped into objects: zerobin (display logic, event handling), filter (compression,
encryption), i18n (translation, counterpart of i18n.php) and helper (stateless utilities)
* Wiki pages were added to address common topics:
* [Upgrading from ZeroBin 0.19 Alpha](https://github.com/elrido/ZeroBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha)
* [ZeroBin Directory of public servers](https://github.com/elrido/ZeroBin/wiki/ZeroBin-Directory)
* [Translation](https://github.com/elrido/ZeroBin/wiki/Translation)
* [Templates](https://github.com/elrido/ZeroBin/wiki/Templates)
* **0.20 (2015-09-03)**:
* ADDED: Password protected pastes (optional)
* ADDED: configuration options for highlighting, password, discussions, expiration times, rate limiting
* ADDED: JSON-only retrieval of paste incl. discussion, used to be able to refresh paste when posting a comment
* ADDED: bootstrap CSS based template
* CHANGE: "Burn after reading" pastes are now deleted only after the paste was successfully decrypted via callback. This prevents accidental deletion by chatbots following URLs and the like. Usage of a password is suggested to ensure only the desired recipient is able to encrypt it.
* CHANGE: the "opendiscussion" option now only controls if the discussion checkbox is preselected. Use "discussion = false" to disable the discussion feature completely (which also removes the checkbox from the template).
* CHANGED: "Burn after reading" pastes are now deleted only after the paste was successfully decrypted via callback. This prevents accidental deletion by chatbots following URLs and the like. Usage of a password is suggested to ensure only the desired recipient is able to encrypt it.
* CHANGED: the "opendiscussion" option now only controls if the discussion checkbox is preselected. Use "discussion = false" to disable the discussion feature completely (which also removes the checkbox from the template).
* FIXING: Behaviour of several conflicting configuration options. As a general measure unit tests for 9 of the options and all their possible configurations were added via a unit test generator.
* updated JS libraries: jquery to 1.11.3, sjcl to 1.0.2, base64.js to 2.1.9, deflate to 0.5, inflate to 0.3 and prettify to latest
* generally improved documentation, both inline phpdoc / JSdoc source code documentation, as well as Wiki pages on installation, configuration, development and JSON-API

View File

@ -5,7 +5,7 @@ Sébastien Sauvage - original idea and main developer
Alexey Gladkov - syntax highlighting
Greg Knaddison - robots.txt
MrKooky - HTML5 markup, CSS cleanup
Simon Rupf - MVC refactoring, configuration support and unit tests
Simon Rupf - MVC refactoring, configuration, i18n and unit tests
Hexalyse - Password protection
Viktor Stanchev - File upload support

View File

@ -1,20 +1,47 @@
Installation
============
For Administrators
------------------
## Basic installation
In the index.php in the main folder you can define a different PATH. This is
useful if you want to secure your installation and want to move the
configuration, data files, templates and PHP libraries (directories cfg, data,
lib, tpl and tst) outside of your document root. This new location must still
be accessible to your webserver / PHP process.
**TL;DR:** Download the [latest release archive](https://github.com/elrido/ZeroBin/releases/latest)
and extract it in your web hosts folder were you want to install your ZeroBin instance.
> ### PATH Example ###
### Requirements
- PHP version 5.2.6 or above
- GD extension
- mcrypt extension (recommended)
- some disk space or (optional) a database supported by PDO
- A web browser with javascript support
### Configuration
In the file `cfg/conf.ini` you can configure ZeroBin. The config file is divided
into multiple sections, which are enclosed in square brackets.
In the `[main]` section you can enable or disable the discussion feature, set the
limit of stored pastes and comments in bytes. The `[traffic]` section lets you
set a time limit in seconds. Users may not post more often then this limit to
your ZeroBin installation.
More details can be found in the
[configuration documentation](https://github.com/elrido/ZeroBin/wiki/Configuration).
## Advanced installation
### Changing the path
In the index.php you can define a different `PATH`. This is useful to secure your
installation. You can move the configuration, data files, templates and PHP
libraries (directories cfg, data, lib, tpl, tmp and tst) outside of your document
root. This new location must still be accessible to your webserver / PHP process
([open_basedir setting](http://php.net/manual/en/ini.core.php#ini.open-basedir)).
> #### PATH Example
> Your zerobin installation lives in a subfolder called "paste" inside of your
> document root. The URL looks like this:
> http://example.com/paste/
> The ZeroBin folder on your webserver is really:
> The full path of ZeroBin on your webserver is:
> /home/example.com/htdocs/paste
>
> When setting the path like this:
@ -22,29 +49,27 @@ be accessible to your webserver / PHP process.
> ZeroBin will look for your includes here:
> /home/example.com/secret/zerobin
In the file "cfg/conf.ini" you can configure ZeroBin. The config file is
divided into multiple sections, which are enclosed in square brackets. In the
"[main]" section you can enable or disable the discussion feature, set the
limit of stored pastes and comments in bytes. The "[traffic]" section lets you
set a time limit in seconds. Users may not post more often then this limit to
your ZeroBin.
### Using a database instead of flat files
Finally the "[model]" and "[model_options]" sections let you configure your
favourite way of storing the pastes and discussions on your server.
"zerobin_data" is the default model, which stores everything in files in the
data folder. This is the recommended setup for low traffic sites. Under high
load, in distributed setups or if you are not allowed to store files locally,
you might want to switch to the "zerobin_db" model. This lets you store your
data in a database. Basically all databases that are supported by PDO (PHP
data objects) may be used. Automatic table creation is provided for pdo_ibm,
pdo_informix, pdo_mssql, pdo_mysql, pdo_oci, pdo_pgsql and pdo_sqlite. You may
want to provide a table prefix, if you have to share the zerobin database with
another application. The table prefix option is called "tbl".
In the configuration file the `[model]` and `[model_options]` sections let you
configure your favourite way of storing the pastes and discussions on your server.
> ### Note ###
> The "zerobin_db" model has only been tested with SQLite and MySQL, although
> it would not be recommended to use SQLite in a production environment. If you
> gain any experience running ZeroBin on other RDBMS, please let us know.
`zerobin_data` is the default model, which stores everything in files in the data
folder. This is the recommended setup for most sites.
Under high load, in distributed setups or if you are not allowed to store files
locally, you might want to switch to the `zerobin_db` model. This lets you store
your data in a database. Basically all databases that are supported by
[PDO](http://php.net/manual/en/book.pdo.php) may be used. Automatic table
creation is provided for `pdo_ibm`, `pdo_informix`, `pdo_mssql`, `pdo_mysql`,
`pdo_oci`, `pdo_pgsql` and `pdo_sqlite`. You may want to provide a table prefix,
if you have to share the zerobin database with another application. The table
prefix option is called `tbl`.
> #### Note
> The "zerobin_db" model has only been tested with SQLite and MySQL, although it
would not be recommended to use SQLite in a production environment. If you gain
any experience running ZeroBin on other RDBMS, please let us know.
For reference or if you want to create the table schema for yourself:
@ -66,32 +91,3 @@ For reference or if you want to create the table schema for yourself:
vizhash TEXT,
postdate INT
);
For Developers
--------------
If you want to create your own data models, you might want to know how the
arrays, that you have to store, look like:
public function create($pasteid, $paste)
{
$pasteid = substr(hash('md5', $paste['data']), 0, 16);
$paste['data'] // text
$paste['meta']['postdate'] // int UNIX timestamp
$paste['meta']['expire_date'] // int UNIX timestamp
$paste['meta']['opendiscussion'] // true (if false it is unset)
$paste['meta']['burnafterreading'] // true (if false it is unset; if true, then opendiscussion is unset)
}
public function createComment($pasteid, $parentid, $commentid, $comment)
{
$pasteid // the id of the paste this comment belongs to
$parentid // the id of the parent of this comment, may be the paste id itself
$commentid = substr(hash('md5', $paste['data']), 0, 16);
$comment['data'] // text
$comment['meta']['nickname'] // text or null (if anonymous)
$comment['meta']['vizhash'] // text or null (if anonymous)
$comment['meta']['postdate'] // int UNIX timestamp
}

View File

@ -1,4 +1,4 @@
# ZeroBin 0.20
# ZeroBin 0.21
ZeroBin is a minimalist, opensource online pastebin where the server has zero
knowledge of pasted data.
@ -12,16 +12,16 @@ without loosing any data.
## What ZeroBin provides
- As a server administrator you don't have to worry if your users post content
+ As a server administrator you don't have to worry if your users post content
that is considered illegal in your country. You have no knowledge of any
pastes content. If requested or enforced, you can delete any paste from your
system.
of the pastes content. If requested or enforced, you can delete any paste from
your system.
- Pastebin like system to store text documents, code samples, etc.
+ Pastebin-like system to store text documents, code samples, etc.
- Encryption of data sent to server, even if it does not provide HTTPS.
+ Encryption of data sent to server, even if it does not provide HTTPS.
- Possibility to set a password which is required to read the paste. It further
+ Possibility to set a password which is required to read the paste. It further
protects a paste and prevents people stumbling upon your paste's link
from being able to read it without the password.
@ -43,48 +43,38 @@ without loosing any data.
Some features are optional and can be enabled or disabled in the [configuration
file](https://github.com/elrido/ZeroBin/wiki/Configuration):
- Password protection
* Password protection
- Discussions
* Discussions
- Expiration times, including a "forever" and "burn after reading" option
* Expiration times, including a "forever" and "burn after reading" option
- Syntax highlighting using prettify.js, including 4 prettify themes
* Markdown format support for HTML formatted pastes
- Templates: By default there is a bootstrap based and a "classic ZeroBin" theme
* Syntax highlighting for source code using prettify.js, including 4 prettify themes
* File upload support, images get displayed (disabled by default, possibility to adjust size limit)
* Templates: By default there is a bootstrap CSS and a "classic ZeroBin" theme
and it is easy to adapt these to your own websites layout or create your own.
* Translation system and automatic browser language detection (if enabled in browser)
* Language selection (disabled by default, as it uses a session cookie)
## Further resources
- [Installation guide](https://github.com/elrido/ZeroBin/wiki/Installation)
* [Installation guide](https://github.com/elrido/ZeroBin/wiki/Installation)
- [Configuration guide](https://github.com/elrido/ZeroBin/wiki/Configuration)
* [Upgrading from 0.19 Alpha](https://github.com/elrido/ZeroBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha)
- [Developer guide](https://github.com/elrido/ZeroBin/wiki/Development)
* [Configuration guide](https://github.com/elrido/ZeroBin/wiki/Configuration)
* [Templates](https://github.com/elrido/ZeroBin/wiki/Templates)
* [Translation guide](https://github.com/elrido/ZeroBin/wiki/Translation)
* [Developer guide](https://github.com/elrido/ZeroBin/wiki/Development)
Run into any issues? Have ideas for further developments? Please
[report](https://github.com/elrido/ZeroBin/issues) them!
------------------------------------------------------------------------------
Copyright (c) 2012 Sébastien SAUVAGE (sebsauvage.net)
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product documentation
would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must
not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
------------------------------------------------------------------------------

View File

@ -5,7 +5,7 @@
; @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
; @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
; @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
; @version 0.20
; @version 0.21
[main]
; enable or disable the discussion feature, defaults to true
@ -109,4 +109,3 @@ dir = PATH "data"
;usr = null
;pwd = null
;opt[12] = true ; PDO::ATTR_PERSISTENT

View File

@ -1,4 +1,4 @@
/* ZeroBin 0.20 - http://sebsauvage.net/wiki/doku.php?id=php:zerobin */
/* ZeroBin 0.21 - http://sebsauvage.net/wiki/doku.php?id=php:zerobin */
body {

View File

@ -1,4 +1,4 @@
/* ZeroBin 0.20 - http://sebsauvage.net/wiki/doku.php?id=php:zerobin */
/* ZeroBin 0.21 - http://sebsauvage.net/wiki/doku.php?id=php:zerobin */
/* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved.

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
// change this, if your php files and data is outside of your webservers document root

View File

@ -6,7 +6,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
'use strict';

View File

@ -1162,7 +1162,16 @@ class RainTpl_SyntaxException extends RainTpl_Exception{
}
}
// shorthand translate function for use in templates
/**
* shorthand translate function for use in templates
*
* alias for i18n::translate()
*
* @access public
* @param string $messageId
* @param mixed $args one or multiple parameters injected into placeholders
* @return string
*/
function t() {
return call_user_func_array(array('i18n', 'translate'), func_get_args());
}

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
spl_autoload_register('auto::loader');

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -8,7 +8,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:vizhash_gd
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.0.4 beta ZeroBin 0.20
* @version 0.0.4 beta ZeroBin 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**
@ -22,7 +22,7 @@ class zerobin
*
* @const string
*/
const VERSION = '0.20';
const VERSION = '0.21';
/**
* show the same error message if the paste expired or does not exist

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -7,7 +7,7 @@
* @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.20
* @version 0.21
*/
/**

View File

@ -41,6 +41,8 @@ class RainTPLTest extends PHPUnit_Framework_TestCase
$page->assign('FILEUPLOAD', false);
$page->assign('BASE64JSVERSION', '2.1.9');
$page->assign('NOTICE', 'example');
$page->assign('LANGUAGESELECTION', '');
$page->assign('LANGUAGES', i18n::getLanguageLabels(i18n::getAvailableLanguages()));
$page->assign('EXPIRE', self::$expire);
$page->assign('EXPIREDEFAULT', self::$expire_default);
ob_start();

View File

@ -25,6 +25,16 @@ class i18nTest extends PHPUnit_Framework_TestCase
$this->assertEquals($messageId, i18n::_($messageId), 'fallback to en');
}
public function testCookieLanguageDeDetection()
{
$_COOKIE['lang'] = 'de';
i18n::loadTranslations();
$this->assertEquals($this->_translations['en'], i18n::_('en'), 'browser language de');
$this->assertEquals('0 Stunden', i18n::_('%d hours', 0), '0 hours in german');
$this->assertEquals('1 Stunde', i18n::_('%d hours', 1), '1 hour in german');
$this->assertEquals('2 Stunden', i18n::_('%d hours', 2), '2 hours in french');
}
public function testBrowserLanguageDeDetection()
{
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-CH,de;q=0.8,en-GB;q=0.6,en-US;q=0.4,en;q=0.2';
@ -64,6 +74,6 @@ class i18nTest extends PHPUnit_Framework_TestCase
{
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'foobar';
i18n::loadTranslations();
$this->assertEquals('some string + 1', i18n::_('some %s + %d', 'string', 1), 'browser language de');
$this->assertEquals('some string + 1', i18n::_('some %s + %d', 'string', 1), 'browser language en');
}
}

View File

@ -71,6 +71,31 @@ class zerobinTest extends PHPUnit_Framework_TestCase
);
}
/**
* @runInSeparateProcess
*/
public function testViewLanguageSelection()
{
$this->reset();
$options = parse_ini_file($this->_conf, true);
$options['main']['languageselection'] = true;
if (!is_file($this->_conf . '.bak') && is_file($this->_conf))
rename($this->_conf, $this->_conf . '.bak');
helper::createIniFile($this->_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
*/
@ -168,6 +193,27 @@ class zerobinTest extends PHPUnit_Framework_TestCase
$this->assertFalse($this->_model->exists(self::$pasteid), 'paste exists after posting data');
}
/**
* @runInSeparateProcess
*/
public function testCreateProxyHeader()
{
$this->reset();
$options = parse_ini_file($this->_conf, true);
$options['traffic']['header'] = 'X_FORWARDED_FOR';
if (!is_file($this->_conf . '.bak') && is_file($this->_conf))
rename($this->_conf, $this->_conf . '.bak');
helper::createIniFile($this->_conf, $options);
$_POST = self::$paste;
$_SERVER['HTTP_X_FORWARDED_FOR'] = '::1';
ob_start();
new zerobin;
$content = ob_get_contents();
$response = json_decode($content, true);
$this->assertEquals(1, $response['status'], 'outputs error status');
$this->assertFalse($this->_model->exists(self::$pasteid), 'paste exists after posting data');
}
/**
* @runInSeparateProcess
*/
@ -289,6 +335,35 @@ class zerobinTest extends PHPUnit_Framework_TestCase
$this->assertFalse($this->_model->exists(self::$pasteid), 'paste exists after posting data');
}
/**
* @runInSeparateProcess
*/
public function testCreateAttachment()
{
$this->reset();
$options = parse_ini_file($this->_conf, true);
$options['traffic']['limit'] = 0;
$options['main']['fileupload'] = true;
if (!is_file($this->_conf . '.bak') && is_file($this->_conf))
rename($this->_conf, $this->_conf . '.bak');
helper::createIniFile($this->_conf, $options);
$_POST = self::$paste;
$_POST['attachment'] = self::$comment['data'];
$_POST['attachmentname'] = self::$comment['meta']['nickname'];
$_SERVER['REMOTE_ADDR'] = '::1';
ob_start();
new zerobin;
$content = ob_get_contents();
$response = json_decode($content, true);
$this->assertEquals(0, $response['status'], 'outputs status');
$this->assertEquals(
hash_hmac('sha1', $response['id'], serversalt::get()),
$response['deletetoken'],
'outputs valid delete token'
);
$this->assertTrue($this->_model->exists($response['id']), 'paste exists after posting data');
}
/**
* @runInSeparateProcess
*/
@ -598,6 +673,55 @@ class zerobinTest extends PHPUnit_Framework_TestCase
$this->assertEquals(1, $response['status'], 'outputs error status');
}
/**
* @runInSeparateProcess
*/
public function testReadOldSyntax()
{
$this->reset();
$oldPaste = self::$paste;
$oldPaste['meta']['syntaxcoloring'] = true;
unset($oldPaste['meta']['formatter']);
$this->_model->create(self::$pasteid, $oldPaste);
$_SERVER['QUERY_STRING'] = self::$pasteid;
ob_start();
new zerobin;
$content = ob_get_contents();
$oldPaste['meta']['formatter'] = 'syntaxhighlighting';
$this->assertTag(
array(
'id' => 'cipherdata',
'content' => htmlspecialchars(json_encode($oldPaste), ENT_NOQUOTES)
),
$content,
'outputs data correctly'
);
}
/**
* @runInSeparateProcess
*/
public function testReadOldFormat()
{
$this->reset();
$oldPaste = self::$paste;
unset($oldPaste['meta']['formatter']);
$this->_model->create(self::$pasteid, $oldPaste);
$_SERVER['QUERY_STRING'] = self::$pasteid;
ob_start();
new zerobin;
$content = ob_get_contents();
$oldPaste['meta']['formatter'] = 'plaintext';
$this->assertTag(
array(
'id' => 'cipherdata',
'content' => htmlspecialchars(json_encode($oldPaste), ENT_NOQUOTES)
),
$content,
'outputs data correctly'
);
}
/**
* @runInSeparateProcess
*/