summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.htaccess.dist20
-rw-r--r--_test/tests/inc/httpclient_http.test.php13
-rw-r--r--_test/tests/inc/media_get_from_url.test.php80
-rw-r--r--data/_dummy1
-rw-r--r--data/attic/_dummy1
-rw-r--r--data/cache/_dummy1
-rw-r--r--data/index/_dummy1
-rw-r--r--data/locks/_dummy1
-rw-r--r--data/media_attic/_dummy1
-rw-r--r--data/media_meta/_dummy1
-rw-r--r--data/meta/_dummy1
-rw-r--r--data/tmp/_dummy1
-rw-r--r--inc/HTTPClient.php107
-rw-r--r--inc/Mailer.class.php2
-rw-r--r--inc/actions.php6
-rw-r--r--inc/auth.php2
-rw-r--r--inc/html.php17
-rw-r--r--inc/httputils.php71
-rw-r--r--inc/io.php1
-rw-r--r--inc/lang/af/lang.php2
-rw-r--r--inc/lang/ar/lang.php4
-rw-r--r--inc/lang/az/lang.php2
-rw-r--r--inc/lang/bg/lang.php2
-rw-r--r--inc/lang/ca-valencia/lang.php2
-rw-r--r--inc/lang/ca/lang.php2
-rw-r--r--inc/lang/cs/lang.php2
-rw-r--r--inc/lang/da/lang.php2
-rw-r--r--inc/lang/el/lang.php6
-rw-r--r--inc/lang/eo/lang.php2
-rw-r--r--inc/lang/es/lang.php4
-rw-r--r--inc/lang/et/lang.php2
-rw-r--r--inc/lang/eu/lang.php2
-rw-r--r--inc/lang/fa/lang.php4
-rw-r--r--inc/lang/fi/lang.php2
-rw-r--r--inc/lang/fo/lang.php2
-rw-r--r--inc/lang/gl/lang.php4
-rw-r--r--inc/lang/he/lang.php3
-rw-r--r--inc/lang/hi/lang.php1
-rw-r--r--inc/lang/hr/lang.php2
-rw-r--r--inc/lang/hu/lang.php2
-rw-r--r--inc/lang/ia/lang.php4
-rw-r--r--inc/lang/id/lang.php2
-rw-r--r--inc/lang/is/lang.php2
-rw-r--r--inc/lang/it/lang.php4
-rw-r--r--inc/lang/ja/lang.php2
-rw-r--r--inc/lang/km/lang.php2
-rw-r--r--inc/lang/ku/lang.php2
-rw-r--r--inc/lang/la/lang.php4
-rw-r--r--inc/lang/lb/lang.php2
-rw-r--r--inc/lang/lt/lang.php2
-rw-r--r--inc/lang/lv/lang.php2
-rw-r--r--inc/lang/mg/lang.php2
-rw-r--r--inc/lang/mk/lang.php4
-rw-r--r--inc/lang/mr/lang.php1
-rw-r--r--inc/lang/ms/lang.php2
-rw-r--r--inc/lang/ne/lang.php1
-rw-r--r--inc/lang/nl/lang.php2
-rw-r--r--inc/lang/no/lang.php5
-rw-r--r--inc/lang/pl/lang.php4
-rw-r--r--inc/lang/pt/lang.php2
-rw-r--r--inc/lang/ro/lang.php2
-rw-r--r--inc/lang/ru/lang.php4
-rw-r--r--inc/lang/sl/lang.php2
-rw-r--r--inc/lang/sq/lang.php4
-rw-r--r--inc/lang/sr/lang.php2
-rw-r--r--inc/lang/th/lang.php2
-rw-r--r--inc/lang/tr/lang.php2
-rw-r--r--inc/lang/uk/lang.php2
-rw-r--r--inc/lang/vi/lang.php2
-rw-r--r--inc/lang/zh-tw/lang.php2
-rw-r--r--inc/media.php31
-rw-r--r--inc/parser/code.php2
-rw-r--r--install.php21
-rw-r--r--lib/exe/detail.php2
-rw-r--r--lib/exe/fetch.php310
-rw-r--r--lib/exe/js.php2
-rw-r--r--lib/exe/mediamanager.php7
-rw-r--r--lib/exe/xmlrpc.php4
-rw-r--r--lib/plugins/acl/script.js8
-rw-r--r--lib/plugins/auth.php1
-rw-r--r--lib/plugins/config/settings/config.class.php85
-rw-r--r--lib/plugins/config/settings/config.metadata.php10
-rw-r--r--lib/plugins/config/style.css9
-rw-r--r--lib/plugins/info/plugin.info.txt2
-rw-r--r--lib/plugins/info/syntax.php3
-rw-r--r--lib/plugins/plugin/lang/ar/lang.php2
-rw-r--r--lib/plugins/plugin/lang/hi/lang.php1
-rw-r--r--lib/plugins/plugin/lang/pl/lang.php2
-rw-r--r--lib/plugins/plugin/lang/zh-tw/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/ca-valencia/lang.php2
-rw-r--r--lib/scripts/linkwiz.js7
-rw-r--r--lib/scripts/qsearch.js9
-rw-r--r--lib/tpl/dokuwiki/css/_edit.css1
-rw-r--r--lib/tpl/dokuwiki/script.js9
94 files changed, 603 insertions, 386 deletions
diff --git a/.htaccess.dist b/.htaccess.dist
index aa2437b95..c90abdc80 100644
--- a/.htaccess.dist
+++ b/.htaccess.dist
@@ -15,7 +15,16 @@
## $conf['userewrite'] = 1 - not needed for rewrite mode 2
#RewriteEngine on
#
-## Not all installations will require the following line. If you do,
+#RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L]
+#RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L]
+#RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
+#RewriteRule ^$ doku.php [L]
+#RewriteCond %{REQUEST_FILENAME} !-f
+#RewriteCond %{REQUEST_FILENAME} !-d
+#RewriteRule (.*) doku.php?id=$1 [QSA,L]
+#RewriteRule ^index.php$ doku.php
+#
+## Not all installations will require the following line. If you do,
## change "/dokuwiki" to the path to your dokuwiki directory relative
## to your document root.
#RewriteBase /dokuwiki
@@ -25,12 +34,3 @@
## rules if your server setup allows HTTPS.
#RewriteCond %{HTTPS} !=on
#RewriteRule ^lib/exe/xmlrpc.php$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
-#
-#RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L]
-#RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L]
-#RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
-#RewriteRule ^$ doku.php [L]
-#RewriteCond %{REQUEST_FILENAME} !-f
-#RewriteCond %{REQUEST_FILENAME} !-d
-#RewriteRule (.*) doku.php?id=$1 [QSA,L]
-#RewriteRule ^index.php$ doku.php
diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php
index 9959a1f06..252eb6b65 100644
--- a/_test/tests/inc/httpclient_http.test.php
+++ b/_test/tests/inc/httpclient_http.test.php
@@ -134,6 +134,19 @@ class httpclient_http_test extends DokuWikiTest {
/**
* @group internet
*/
+ function test_maxbodyok(){
+ $http = new HTTPClient();
+ $http->max_bodysize = 500*1024;
+ $data = $http->get($this->server.'/stream/5');
+ $this->assertTrue($data !== false, 'HTTP response');
+ $http->max_bodysize_abort = false;
+ $data = $http->get($this->server.'/stream/5');
+ $this->assertTrue($data !== false, 'HTTP response');
+ }
+
+ /**
+ * @group internet
+ */
function test_basicauth(){
$http = new HTTPClient();
$http->user = 'user';
diff --git a/_test/tests/inc/media_get_from_url.test.php b/_test/tests/inc/media_get_from_url.test.php
new file mode 100644
index 000000000..3903b8a05
--- /dev/null
+++ b/_test/tests/inc/media_get_from_url.test.php
@@ -0,0 +1,80 @@
+<?php
+
+class media_get_from_url_test extends DokuWikiTest {
+
+ /**
+ * @group internet
+ */
+ public function test_cache(){
+ global $conf;
+ $conf['fetchsize'] = 500*1024; //500kb
+
+
+ $local = media_get_from_URL('http://www.google.com/images/srpr/logo3w.png','png',-1);
+ $this->assertTrue($local !== false);
+ $this->assertFileExists($local);
+
+ // remember time stamp
+ $time = filemtime($local);
+ clearstatcache(false, $local);
+ sleep(1);
+
+ // fetch again and make sure we got a cache file
+ $local = media_get_from_URL('http://www.google.com/images/srpr/logo3w.png','png',-1);
+ clearstatcache(false, $local);
+ $this->assertTrue($local !== false);
+ $this->assertFileExists($local);
+ $this->assertEquals($time, filemtime($local));
+
+ unlink($local);
+ }
+
+ /**
+ * @group internet
+ */
+ public function test_nocache(){
+ global $conf;
+ $conf['fetchsize'] = 500*1024; //500kb
+
+ $local = media_get_from_URL('http://www.google.com/images/srpr/logo3w.png','png',0);
+ $this->assertFalse($local);
+ }
+
+ /**
+ * @group internet
+ * @group slow
+ */
+ public function test_recache(){
+ global $conf;
+ $conf['fetchsize'] = 500*1024; //500kb
+
+
+ $local = media_get_from_URL('http://www.google.com/images/srpr/logo3w.png','png',5);
+ $this->assertTrue($local !== false);
+ $this->assertFileExists($local);
+
+ // remember time stamp
+ $time = filemtime($local);
+ clearstatcache(false, $local);
+ sleep(1);
+
+ // fetch again and make sure we got a cache file
+ $local = media_get_from_URL('http://www.google.com/images/srpr/logo3w.png','png',5);
+ clearstatcache(false, $local);
+ $this->assertTrue($local !== false);
+ $this->assertFileExists($local);
+ $this->assertEquals($time, filemtime($local));
+
+ clearstatcache(false, $local);
+ sleep(6);
+
+ // fetch again and make sure we got a new file
+ $local = media_get_from_URL('http://www.google.com/images/srpr/logo3w.png','png',5);
+ clearstatcache(false, $local);
+ $this->assertTrue($local !== false);
+ $this->assertFileExists($local);
+ $this->assertNotEquals($time, filemtime($local));
+
+ unlink($local);
+ }
+} \ No newline at end of file
diff --git a/data/_dummy b/data/_dummy
index e69de29bb..e492265be 100644
--- a/data/_dummy
+++ b/data/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/attic/_dummy b/data/attic/_dummy
index e69de29bb..e492265be 100644
--- a/data/attic/_dummy
+++ b/data/attic/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/cache/_dummy b/data/cache/_dummy
index e69de29bb..e492265be 100644
--- a/data/cache/_dummy
+++ b/data/cache/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/index/_dummy b/data/index/_dummy
index e69de29bb..e492265be 100644
--- a/data/index/_dummy
+++ b/data/index/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/locks/_dummy b/data/locks/_dummy
index e69de29bb..e492265be 100644
--- a/data/locks/_dummy
+++ b/data/locks/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/media_attic/_dummy b/data/media_attic/_dummy
index e69de29bb..e492265be 100644
--- a/data/media_attic/_dummy
+++ b/data/media_attic/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/media_meta/_dummy b/data/media_meta/_dummy
index e69de29bb..e492265be 100644
--- a/data/media_meta/_dummy
+++ b/data/media_meta/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/meta/_dummy b/data/meta/_dummy
index e69de29bb..e492265be 100644
--- a/data/meta/_dummy
+++ b/data/meta/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/data/tmp/_dummy b/data/tmp/_dummy
index e69de29bb..e492265be 100644
--- a/data/tmp/_dummy
+++ b/data/tmp/_dummy
@@ -0,0 +1 @@
+You can safely delete this file. \ No newline at end of file
diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php
index 51c1de875..772b580b2 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTPClient.php
@@ -150,6 +150,7 @@ class HTTPClient {
*
* @param string $url The URL to fetch
* @param bool $sloppy304 Return body on 304 not modified
+ * @return bool|string response body, false on error
* @author Andreas Gohr <andi@splitbrain.org>
*/
function get($url,$sloppy304=false){
@@ -170,6 +171,7 @@ class HTTPClient {
* @param string $url The URL to fetch
* @param array $data Associative array of parameters
* @param bool $sloppy304 Return body on 304 not modified
+ * @return bool|string response body, false on error
* @author Andreas Gohr <andi@splitbrain.org>
*/
function dget($url,$data,$sloppy304=false){
@@ -187,6 +189,9 @@ class HTTPClient {
*
* Returns the resulting page or false on an error;
*
+ * @param string $url The URL to fetch
+ * @param array $data Associative array of parameters
+ * @return bool|string response body, false on error
* @author Andreas Gohr <andi@splitbrain.org>
*/
function post($url,$data){
@@ -215,6 +220,9 @@ class HTTPClient {
$this->start = $this->_time();
$this->error = '';
$this->status = 0;
+ $this->status = 0;
+ $this->resp_body = '';
+ $this->resp_headers = array();
// don't accept gzip if truncated bodies might occur
if($this->max_bodysize &&
@@ -440,9 +448,31 @@ class HTTPClient {
$byte = $this->_readData($socket, 2, 'chunk'); // read trailing \r\n
}
} while ($chunk_size && !$abort);
- }elseif($this->max_bodysize){
- // read just over the max_bodysize
- $r_body = $this->_readData($socket, $this->max_bodysize+1, 'response', true);
+ }elseif(isset($this->resp_headers['content-length']) && !isset($this->resp_headers['transfer-encoding'])){
+ /* RFC 2616
+ * If a message is received with both a Transfer-Encoding header field and a Content-Length
+ * header field, the latter MUST be ignored.
+ */
+
+ // read up to the content-length or max_bodysize
+ // for keep alive we need to read the whole message to clean up the socket for the next read
+ if(!$this->keep_alive && $this->max_bodysize && $this->max_bodysize < $this->resp_headers['content-length']){
+ $length = $this->max_bodysize;
+ }else{
+ $length = $this->resp_headers['content-length'];
+ }
+
+ $r_body = $this->_readData($socket, $length, 'response (content-length limited)', true);
+ }else{
+ // read entire socket
+ $r_size = 0;
+ while (!feof($socket)) {
+ $r_body .= $this->_readData($socket, 4096, 'response (unlimited)', true);
+ }
+ }
+
+ // recheck body size, we might had to read the whole body, so we abort late or trim here
+ if($this->max_bodysize){
if(strlen($r_body) > $this->max_bodysize){
if ($this->max_bodysize_abort) {
throw new HTTPClientException('Allowed response size exceeded');
@@ -450,16 +480,6 @@ class HTTPClient {
$this->error = 'Allowed response size exceeded';
}
}
- }elseif(isset($this->resp_headers['content-length']) &&
- !isset($this->resp_headers['transfer-encoding'])){
- // read up to the content-length
- $r_body = $this->_readData($socket, $this->resp_headers['content-length'], 'response', true);
- }else{
- // read entire socket
- $r_size = 0;
- while (!feof($socket)) {
- $r_body .= $this->_readData($socket, 4096, 'response', true);
- }
}
} catch (HTTPClientException $err) {
@@ -502,8 +522,8 @@ class HTTPClient {
*
* Protocol, Servername and Port will be stripped from the request URL when a successful CONNECT happened
*
- * @param ressource &$socket
- * @param string &$requesturl
+ * @param resource &$socket
+ * @param string &$requesturl
* @return bool true if a tunnel was established
*/
function _ssltunnel(&$socket, &$requesturl){
@@ -543,9 +563,10 @@ class HTTPClient {
/**
* Safely write data to a socket
*
- * @param handle $socket An open socket handle
- * @param string $data The data to write
- * @param string $message Description of what is being read
+ * @param resource $socket An open socket handle
+ * @param string $data The data to write
+ * @param string $message Description of what is being read
+ * @throws HTTPClientException
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function _sendData($socket, $data, $message) {
@@ -585,10 +606,12 @@ class HTTPClient {
* Reads up to a given number of bytes or throws an exception if the
* response times out or ends prematurely.
*
- * @param handle $socket An open socket handle in non-blocking mode
- * @param int $nbytes Number of bytes to read
- * @param string $message Description of what is being read
- * @param bool $ignore_eof End-of-file is not an error if this is set
+ * @param resource $socket An open socket handle in non-blocking mode
+ * @param int $nbytes Number of bytes to read
+ * @param string $message Description of what is being read
+ * @param bool $ignore_eof End-of-file is not an error if this is set
+ * @throws HTTPClientException
+ * @return string
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function _readData($socket, $nbytes, $message, $ignore_eof = false) {
@@ -605,8 +628,8 @@ class HTTPClient {
$time_used = $this->_time() - $this->start;
if ($time_used > $this->timeout)
throw new HTTPClientException(
- sprintf('Timeout while reading %s (%.3fs)', $message, $time_used),
- -100);
+ sprintf('Timeout while reading %s after %d bytes (%.3fs)', $message,
+ strlen($r_data), $time_used), -100);
if(feof($socket)) {
if(!$ignore_eof)
throw new HTTPClientException("Premature End of File (socket) while reading $message");
@@ -635,8 +658,10 @@ class HTTPClient {
*
* Always returns a complete line, including the terminating \n.
*
- * @param handle $socket An open socket handle in non-blocking mode
- * @param string $message Description of what is being read
+ * @param resource $socket An open socket handle in non-blocking mode
+ * @param string $message Description of what is being read
+ * @throws HTTPClientException
+ * @return string
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function _readLine($socket, $message) {
@@ -669,10 +694,26 @@ class HTTPClient {
/**
* print debug info
*
+ * Uses _debug_text or _debug_html depending on the SAPI name
+ *
* @author Andreas Gohr <andi@splitbrain.org>
*/
function _debug($info,$var=null){
if(!$this->debug) return;
+ if(php_sapi_name() == 'cli'){
+ $this->_debug_text($info, $var);
+ }else{
+ $this->_debug_html($info, $var);
+ }
+ }
+
+ /**
+ * print debug info as HTML
+ *
+ * @param $info
+ * @param null $var
+ */
+ function _debug_html($info, $var=null){
print '<b>'.$info.'</b> '.($this->_time() - $this->start).'s<br />';
if(!is_null($var)){
ob_start();
@@ -684,6 +725,18 @@ class HTTPClient {
}
/**
+ * prints debug info as plain text
+ *
+ * @param $info
+ * @param null $var
+ */
+ function _debug_text($info, $var=null){
+ print '*'.$info.'* '.($this->_time() - $this->start)."s\n";
+ if(!is_null($var)) print_r($var);
+ print "\n-----------------------------------------------\n";
+ }
+
+ /**
* Return current timestamp in microsecond resolution
*/
static function _time(){
@@ -797,6 +850,8 @@ class HTTPClient {
/**
* Generates a unique identifier for a connection.
*
+ * @param string $server
+ * @param string $port
* @return string unique identifier
*/
function _uniqueConnectionId($server, $port) {
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
index f1492be9b..f87d7dd84 100644
--- a/inc/Mailer.class.php
+++ b/inc/Mailer.class.php
@@ -51,7 +51,7 @@ class Mailer {
$this->allowhtml = (bool)$conf['htmlmail'];
// add some default headers for mailfiltering FS#2247
- $this->setHeader('X-Mailer', 'DokuWiki '.getVersion());
+ $this->setHeader('X-Mailer', 'DokuWiki');
$this->setHeader('X-DokuWiki-User', $_SERVER['REMOTE_USER']);
$this->setHeader('X-DokuWiki-Title', $conf['title']);
$this->setHeader('X-DokuWiki-Server', $server);
diff --git a/inc/actions.php b/inc/actions.php
index e0ad908b7..da3414eb2 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -172,7 +172,7 @@ function act_dispatch(){
$evt->advise_after();
// Make sure plugs can handle 'denied'
if($conf['send404'] && $ACT == 'denied') {
- header('HTTP/1.0 403 Forbidden');
+ http_status(403);
}
unset($evt);
@@ -658,7 +658,7 @@ function act_sitemap($act) {
global $conf;
if ($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) {
- header("HTTP/1.0 404 Not Found");
+ http_status(404);
print "Sitemap generation is disabled.";
exit;
}
@@ -690,7 +690,7 @@ function act_sitemap($act) {
exit;
}
- header("HTTP/1.0 500 Internal Server Error");
+ http_status(500);
print "Could not read the sitemap file - bad permissions?";
exit;
}
diff --git a/inc/auth.php b/inc/auth.php
index 7f427bd8d..9566a2615 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -267,7 +267,7 @@ function auth_login($user, $pass, $sticky = false, $silent = false) {
function auth_validateToken($token) {
if(!$token || $token != $_SESSION[DOKU_COOKIE]['auth']['token']) {
// bad token
- header("HTTP/1.0 401 Unauthorized");
+ http_status(401);
print 'Invalid auth token - maybe the session timed out';
unset($_SESSION[DOKU_COOKIE]['auth']['token']); // no second chance
exit;
diff --git a/inc/html.php b/inc/html.php
index a48f18bff..c2723bceb 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -1473,7 +1473,7 @@ function html_edit(){
} ?>
<div class="editBox">
- <div class="toolbar">
+ <div class="toolbar group">
<div id="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.dformat();?></div>
<div id="tool__bar"><?php if ($wr && $data['media_manager']){?><a href="<?php echo DOKU_BASE?>lib/exe/mediamanager.php?ns=<?php echo $INFO['namespace']?>"
target="_blank"><?php echo $lang['mediaselect'] ?></a><?php }?></div>
@@ -1636,11 +1636,16 @@ function html_admin(){
}
// data security check
- // @todo: could be checked and only displayed if $conf['savedir'] is under the web root
- echo '<a style="border:none; float:right;"
- href="http://www.dokuwiki.org/security#web_access_security">
- <img src="data/security.png" alt="Your data directory seems to be protected properly."
- onerror="this.parentNode.style.display=\'none\'" /></a>';
+ // simple check if the 'savedir' is relative and accessible when appended to DOKU_URL
+ // it verifies either:
+ // 'savedir' has been moved elsewhere, or
+ // has protection to prevent the webserver serving files from it
+ if (substr($conf['savedir'],0,2) == './'){
+ echo '<a style="border:none; float:right;"
+ href="http://www.dokuwiki.org/security#web_access_security">
+ <img src="'.DOKU_URL.$conf['savedir'].'/security.png" alt="Your data directory seems to be protected properly."
+ onerror="this.parentNode.style.display=\'none\'" /></a>';
+ }
print p_locale_xhtml('admin');
diff --git a/inc/httputils.php b/inc/httputils.php
index 4ba287eb5..d3f3cdde2 100644
--- a/inc/httputils.php
+++ b/inc/httputils.php
@@ -250,6 +250,11 @@ function http_cached_finish($file, $content) {
}
}
+/**
+ * Fetches raw, unparsed POST data
+ *
+ * @return string
+ */
function http_get_raw_post_data() {
static $postData = null;
if ($postData === null) {
@@ -257,3 +262,69 @@ function http_get_raw_post_data() {
}
return $postData;
}
+
+/**
+ * Set the HTTP response status and takes care of the used PHP SAPI
+ *
+ * Inspired by CodeIgniter's set_status_header function
+ *
+ * @param int $code
+ * @param string $text
+ */
+function http_status($code = 200, $text = '') {
+ static $stati = array(
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authoritative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 307 => 'Temporary Redirect',
+
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition Failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version Not Supported'
+ );
+
+ if($text == '' && isset($stati[$code])) {
+ $text = $stati[$code];
+ }
+
+ $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : false;
+
+ if(substr(php_sapi_name(), 0, 3) == 'cgi') {
+ header("Status: {$code} {$text}", true);
+ } elseif($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0') {
+ header($server_protocol." {$code} {$text}", true, $code);
+ } else {
+ header("HTTP/1.1 {$code} {$text}", true, $code);
+ }
+}
diff --git a/inc/io.php b/inc/io.php
index b4da7d635..5ecc79703 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -474,6 +474,7 @@ function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=20
$http = new DokuHTTPClient();
$http->max_bodysize = $maxSize;
$http->timeout = 25; //max. 25 sec
+ $http->keep_alive = false; // we do single ops here, no need for keep-alive
$data = $http->get($url);
if(!$data) return false;
diff --git a/inc/lang/af/lang.php b/inc/lang/af/lang.php
index 6de891a63..ab8e5177b 100644
--- a/inc/lang/af/lang.php
+++ b/inc/lang/af/lang.php
@@ -55,7 +55,7 @@ $lang['current'] = 'huidige';
$lang['line'] = 'Streak';
$lang['youarehere'] = 'Jy is hier';
$lang['by'] = 'by';
-$lang['restored'] = 'Het terug gegaan na vroeëre weergawe';
+$lang['restored'] = 'Het terug gegaan na vroeëre weergawe (%s)';
$lang['summary'] = 'Voorskou';
$lang['qb_bold'] = 'Vetdruk';
$lang['qb_italic'] = 'Skuinsdruk';
diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php
index 4928b3dbd..5b72e0a51 100644
--- a/inc/lang/ar/lang.php
+++ b/inc/lang/ar/lang.php
@@ -181,7 +181,7 @@ $lang['lastmod'] = 'آخر تعديل';
$lang['by'] = 'بواسطة';
$lang['deleted'] = 'حذفت';
$lang['created'] = 'اُنشئت';
-$lang['restored'] = 'استعيدت نسخة قديمة';
+$lang['restored'] = 'استعيدت نسخة قديمة (%s)';
$lang['external_edit'] = 'تحرير خارجي';
$lang['summary'] = 'ملخص التحرير';
$lang['noflash'] = 'تحتاج إلى<a href="http://www.adobe.com/products/flashplayer/">ملحق فلاش أدوبي</a> لعرض هذا المحتوى.';
@@ -258,8 +258,6 @@ $lang['subscr_m_unsubscribe'] = 'ألغ الاشتراك';
$lang['subscr_m_subscribe'] = 'اشترك';
$lang['subscr_m_receive'] = 'استقبال';
$lang['subscr_style_every'] = 'بريدا على كل تغيير';
-$lang['subscr_style_digest'] = 'بريد ملخص عن تغييرات كل صفحة';
-$lang['subscr_style_list'] = 'قائمة بالصفحات المتغيرة منذ آخر بريد';
$lang['authmodfailed'] = 'إعدادات تصريح فاسدة، يرجى مراسلة المدير.';
$lang['authtempfail'] = 'تصريح المشترك غير متوفر مؤقتاً، إن استمرت هذه الحالة يرجى مراسلة المدير';
$lang['authpwdexpire'] = 'ستنتهي صلاحية كلمة السر في %d . عليك بتغييرها سريعا.';
diff --git a/inc/lang/az/lang.php b/inc/lang/az/lang.php
index 6df15a83e..5084d9f60 100644
--- a/inc/lang/az/lang.php
+++ b/inc/lang/az/lang.php
@@ -136,7 +136,7 @@ $lang['lastmod'] = 'Son dəyişiklər';
$lang['by'] = ' Kimdən';
$lang['deleted'] = 'silinib';
$lang['created'] = 'yaranıb';
-$lang['restored'] = 'köhnə versiya qaytarıldı';
+$lang['restored'] = 'köhnə versiya qaytarıldı (%s)';
$lang['external_edit'] = 'bayırdan dəyişik';
$lang['summary'] = 'Dəyişiklər xülasəsi';
$lang['noflash'] = 'Bu məzmuna baxmaq üçün <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> tələb olunur.';
diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php
index 47d83c62f..3c0a17a72 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -190,7 +190,7 @@ $lang['lastmod'] = 'Последна промяна';
$lang['by'] = 'от';
$lang['deleted'] = 'изтрита';
$lang['created'] = 'създадена';
-$lang['restored'] = 'възстановена предишна версия';
+$lang['restored'] = 'възстановена предишна версия (%s)';
$lang['external_edit'] = 'външна редакция';
$lang['summary'] = 'Обобщение';
$lang['noflash'] = 'Необходим е <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> за изобразяване на съдържанието.';
diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php
index 532f6c73d..6e7438f53 100644
--- a/inc/lang/ca-valencia/lang.php
+++ b/inc/lang/ca-valencia/lang.php
@@ -137,7 +137,7 @@ $lang['lastmod'] = 'Última modificació el';
$lang['by'] = 'per';
$lang['deleted'] = 'borrat';
$lang['created'] = 'creat';
-$lang['restored'] = 'restaurada l\'última versió';
+$lang['restored'] = 'restaurada l\'última versió (%s)';
$lang['external_edit'] = 'edició externa';
$lang['summary'] = 'Editar sumari';
$lang['noflash'] = 'Necessita el <a href="http://www.adobe.com/products/flashplayer/">plúgin d\'Adobe Flash</a> per a vore este contingut.';
diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php
index cb2b64686..a429dc06a 100644
--- a/inc/lang/ca/lang.php
+++ b/inc/lang/ca/lang.php
@@ -180,7 +180,7 @@ $lang['lastmod'] = 'Darrera modificació';
$lang['by'] = 'per';
$lang['deleted'] = 'suprimit';
$lang['created'] = 'creat';
-$lang['restored'] = 's\'ha restaurat una versió anterior';
+$lang['restored'] = 's\'ha restaurat una versió anterior %s';
$lang['external_edit'] = 'edició externa';
$lang['summary'] = 'Resum d\'edició';
$lang['noflash'] = 'Per a visualitzar aquest contingut necessiteu el <a href="http://www.adobe.com/products/flashplayer/">connector d\'Adobe Flash</a>.';
diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php
index af94424ac..f0b8f3ba4 100644
--- a/inc/lang/cs/lang.php
+++ b/inc/lang/cs/lang.php
@@ -188,7 +188,7 @@ $lang['lastmod'] = 'Poslední úprava';
$lang['by'] = 'autor:';
$lang['deleted'] = 'odstraněno';
$lang['created'] = 'vytvořeno';
-$lang['restored'] = 'stará verze byla obnovena';
+$lang['restored'] = 'stará verze byla obnovena (%s)';
$lang['external_edit'] = 'upraveno mimo DokuWiki';
$lang['summary'] = 'Komentář k úpravám';
$lang['noflash'] = 'Pro přehrání obsahu potřebujete <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
diff --git a/inc/lang/da/lang.php b/inc/lang/da/lang.php
index f132c133b..022de8127 100644
--- a/inc/lang/da/lang.php
+++ b/inc/lang/da/lang.php
@@ -188,7 +188,7 @@ $lang['lastmod'] = 'Sidst ændret';
$lang['by'] = 'af';
$lang['deleted'] = 'slettet';
$lang['created'] = 'oprettet';
-$lang['restored'] = 'gammel udgave reetableret';
+$lang['restored'] = 'gammel udgave reetableret (%s)';
$lang['external_edit'] = 'ekstern redigering';
$lang['summary'] = 'Redigerings resumé';
$lang['noflash'] = 'Den <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> er nødvendig til at vise denne indehold.';
diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php
index 55b70074f..0fe343026 100644
--- a/inc/lang/el/lang.php
+++ b/inc/lang/el/lang.php
@@ -148,7 +148,6 @@ $lang['uploadsucc'] = 'Επιτυχής φόρτωση';
$lang['uploadfail'] = 'Η μεταφόρτωση απέτυχε. Πιθανόν αυτό να οφείλεται στις ρυθμίσεις πρόσβασης του αρχείου.';
$lang['uploadwrong'] = 'Η μεταφόρτωση δεν έγινε δεκτή. Δεν επιτρέπονται αρχεία αυτού του τύπου!';
$lang['uploadexist'] = 'Το αρχείο ήδη υπάρχει. Δεν έγινε καμία αλλαγή.';
-$lang['uploadbadcontent'] = 'Το περιεχόμενο του αρχείου δεν ταιριάζει με την επέκτασή του.';
$lang['uploadspam'] = 'Η μεταφόρτωση ακυρώθηκε από το φίλτρο spam.';
$lang['uploadxss'] = 'Η μεταφόρτωση ακυρώθηκε λόγω πιθανού επικίνδυνου περιεχομένου.';
$lang['uploadsize'] = 'Το αρχείο ήταν πολύ μεγάλο. (μέγιστο %s)';
@@ -184,7 +183,7 @@ $lang['lastmod'] = 'Τελευταία τροποποίηση';
$lang['by'] = 'από';
$lang['deleted'] = 'διαγράφηκε';
$lang['created'] = 'δημιουργήθηκε';
-$lang['restored'] = 'παλαιότερη έκδοση επαναφέρθηκε';
+$lang['restored'] = 'παλαιότερη έκδοση επαναφέρθηκε (%s)';
$lang['external_edit'] = 'εξωτερική τροποποίηση';
$lang['summary'] = 'Επεξεργασία σύνοψης';
$lang['noflash'] = 'Το <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> απαιτείται για την προβολή αυτού του στοιχείου.';
@@ -314,8 +313,7 @@ $lang['media_upload'] = 'Φόρτωση στο <strong>%s</strong> φά
$lang['media_search'] = 'Αναζήτηση στο <strong>%s</strong> φάκελο.';
$lang['media_view'] = '%s';
$lang['media_viewold'] = '%s στα %s';
-$lang['media_edit'] = 'Επεξεργασία';
-$lang['media_history'] = 'Αυτές είναι οι παλαιότερες αναθεωρήσεις του αρχείου.';
+$lang['media_edit'] = 'Επεξεργασία %s';
$lang['media_meta_edited'] = 'τα μεταδεδομένα επεξεργάστηκαν';
$lang['media_perm_read'] = 'Συγνώμη, δεν έχετε επαρκή διακαιώματα για να διαβάσετε αυτά τα αρχεία.';
$lang['media_perm_upload'] = 'Συγνώμη, δεν έχετε επαρκή διακαιώματα για να φορτώσετε αυτά τα αρχεία.';
diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php
index 1c3b6f519..2d9b03148 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -184,7 +184,7 @@ $lang['lastmod'] = 'Lastaj ŝanĝoj';
$lang['by'] = 'de';
$lang['deleted'] = 'forigita';
$lang['created'] = 'kreita';
-$lang['restored'] = 'malnova revizio restarigita';
+$lang['restored'] = 'malnova revizio restarigita (%s)';
$lang['external_edit'] = 'ekstera redakto';
$lang['summary'] = 'Bulteno de ŝanĝoj';
$lang['noflash'] = 'La <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> necesas por montri tiun ĉi enhavon.';
diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php
index 20d0284bc..193ec9a7d 100644
--- a/inc/lang/es/lang.php
+++ b/inc/lang/es/lang.php
@@ -203,7 +203,7 @@ $lang['lastmod'] = 'Última modificación';
$lang['by'] = 'por';
$lang['deleted'] = 'borrado';
$lang['created'] = 'creado';
-$lang['restored'] = 'se ha restaurado la vieja versión';
+$lang['restored'] = 'se ha restaurado la vieja versión (%s)';
$lang['external_edit'] = 'editor externo';
$lang['summary'] = 'Resumen de la edición';
$lang['noflash'] = 'Para mostrar este contenido es necesario el <a href="http://www.adobe.com/products/flashplayer/">Plugin Adobe Flash</a>.';
@@ -280,8 +280,6 @@ $lang['subscr_m_unsubscribe'] = 'Darse de baja';
$lang['subscr_m_subscribe'] = 'Suscribirse';
$lang['subscr_m_receive'] = 'Recibir';
$lang['subscr_style_every'] = 'enviar correo en cada cambio';
-$lang['subscr_style_digest'] = 'recopilar correo de cambios por cada página';
-$lang['subscr_style_list'] = 'lista de páginas con cambios desde el último correo';
$lang['authmodfailed'] = 'Está mal configurada la autenticación de usuarios. Por favor, avisa al administrador del wiki.';
$lang['authtempfail'] = 'La autenticación de usuarios no está disponible temporalmente. Si esta situación persiste, por favor avisa al administrador del wiki.';
$lang['authpwdexpire'] = 'Su contraseña caducara en %d días, debería cambiarla lo antes posible';
diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php
index 8ae61558a..0a0310832 100644
--- a/inc/lang/et/lang.php
+++ b/inc/lang/et/lang.php
@@ -163,7 +163,7 @@ $lang['lastmod'] = 'Viimati muutnud';
$lang['by'] = 'persoon';
$lang['deleted'] = 'eemaldatud';
$lang['created'] = 'tekitatud';
-$lang['restored'] = 'vana versioon taastatud';
+$lang['restored'] = 'vana versioon taastatud (%s)';
$lang['external_edit'] = 'väline muutmine';
$lang['summary'] = 'kokkuvõte muudatustest';
$lang['mail_newpage'] = 'leht lisatud:';
diff --git a/inc/lang/eu/lang.php b/inc/lang/eu/lang.php
index 5b03dcb97..7aab8b44c 100644
--- a/inc/lang/eu/lang.php
+++ b/inc/lang/eu/lang.php
@@ -178,7 +178,7 @@ $lang['lastmod'] = 'Azken aldaketa';
$lang['by'] = 'egilea:';
$lang['deleted'] = 'ezabatua';
$lang['created'] = 'sortua';
-$lang['restored'] = 'bertsio zaharra berrezarria';
+$lang['restored'] = 'bertsio zaharra berrezarria (%s)';
$lang['external_edit'] = 'kanpoko aldaketa';
$lang['summary'] = 'Aldatu laburpena';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> beharrezkoa da eduki hau bistaratzeko.';
diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php
index 026d6499a..eb828a472 100644
--- a/inc/lang/fa/lang.php
+++ b/inc/lang/fa/lang.php
@@ -189,7 +189,7 @@ $lang['lastmod'] = 'آخرین ویرایش';
$lang['by'] = 'توسط';
$lang['deleted'] = 'حذف شد';
$lang['created'] = 'ایجاد شد';
-$lang['restored'] = 'یک نگارش پیشین واگردانی شد.';
+$lang['restored'] = 'یک نگارش پیشین واگردانی شد. (%s)';
$lang['external_edit'] = 'ویرایش خارجی';
$lang['summary'] = 'پیش‌نمایش';
$lang['noflash'] = 'برای نمایش محتویات <a href="http://www.adobe.com/products/flashplayer/">افزونه‌ی فلش</a> مورد نیاز است.';
@@ -266,8 +266,6 @@ $lang['subscr_m_unsubscribe'] = 'لغو آبونه';
$lang['subscr_m_subscribe'] = 'آبونه شدن';
$lang['subscr_m_receive'] = 'دریافت کردن';
$lang['subscr_style_every'] = 'ارسال رای‌نامه در تمامی تغییرات';
-$lang['subscr_style_digest'] = 'ارسال ایمیل‌های فشرده برای تغییرات هر صفحه';
-$lang['subscr_style_list'] = 'لیست صفحات تغییر داده شده از آخرین رای‌نامه';
$lang['authmodfailed'] = 'اشکال در نوع معتبرسازی کاربران، مدیر ویکی را باخبر سازید.';
$lang['authtempfail'] = 'معتبرسازی کابران موقتن مسدود می‌باشد. اگر این حالت پایدار بود، مدیر ویکی را باخبر سازید.';
$lang['authpwdexpire'] = 'کلمه عبور شما در %d روز منقضی خواهد شد ، شما باید آن را زود تغییر دهید';
diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php
index 73eb3d4cc..59e4dc6cb 100644
--- a/inc/lang/fi/lang.php
+++ b/inc/lang/fi/lang.php
@@ -183,7 +183,7 @@ $lang['lastmod'] = 'Viimeksi muutettu';
$lang['by'] = '/';
$lang['deleted'] = 'poistettu';
$lang['created'] = 'luotu';
-$lang['restored'] = 'vanha versio palautettu';
+$lang['restored'] = 'vanha versio palautettu (%s)';
$lang['external_edit'] = 'ulkoinen muokkaus';
$lang['summary'] = 'Yhteenveto muokkauksesta';
$lang['noflash'] = 'Tarvitset <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash-liitännäisen</a> nähdäksesi tämän sisällön.';
diff --git a/inc/lang/fo/lang.php b/inc/lang/fo/lang.php
index 14ec8c56b..9f51824db 100644
--- a/inc/lang/fo/lang.php
+++ b/inc/lang/fo/lang.php
@@ -130,7 +130,7 @@ $lang['lastmod'] = 'Seinast broytt';
$lang['by'] = 'av';
$lang['deleted'] = 'strika';
$lang['created'] = 'stovna';
-$lang['restored'] = 'gomul útgáva endurstovna';
+$lang['restored'] = 'gomul útgáva endurstovna (%s)';
$lang['summary'] = 'Samandráttur';
$lang['mail_newpage'] = 'skjal skoyta uppí:';
$lang['mail_changed'] = 'skjal broytt:';
diff --git a/inc/lang/gl/lang.php b/inc/lang/gl/lang.php
index 7cc06a833..fa49c1121 100644
--- a/inc/lang/gl/lang.php
+++ b/inc/lang/gl/lang.php
@@ -181,7 +181,7 @@ $lang['lastmod'] = 'Última modificación';
$lang['by'] = 'por';
$lang['deleted'] = 'eliminado';
$lang['created'] = 'creado';
-$lang['restored'] = 'revisión antiga restaurada';
+$lang['restored'] = 'revisión antiga restaurada (%s)';
$lang['external_edit'] = 'edición externa';
$lang['summary'] = 'Resumo da edición';
$lang['noflash'] = 'Precísase o <a href="http://www.adobe.com/products/flashplayer/">Extensión Adobe Flash</a> para amosar este contido.';
@@ -258,8 +258,6 @@ $lang['subscr_m_unsubscribe'] = 'Desubscribir';
$lang['subscr_m_subscribe'] = 'Subscribir';
$lang['subscr_m_receive'] = 'Recibir';
$lang['subscr_style_every'] = 'correo-e en cada troco';
-$lang['subscr_style_digest'] = 'correo-e con resumo de trocos para cada páxina';
-$lang['subscr_style_list'] = 'lista de páxinas mudadas dende o último correo-e';
$lang['authmodfailed'] = 'Configuración de autenticación de usuario incorrecta. Por favor, informa ao Administrador do teu Wiki.';
$lang['authtempfail'] = 'A autenticación de usuario non está dispoñible de xeito temporal. De persistir esta situación, por favor, informa ao Administrador do teu Wiki.';
$lang['authpwdexpire'] = 'A túa contrasinal expirará en %d días, deberías cambiala pronto.';
diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php
index e474501ae..4853a0e2b 100644
--- a/inc/lang/he/lang.php
+++ b/inc/lang/he/lang.php
@@ -165,7 +165,7 @@ $lang['lastmod'] = 'מועד השינוי האחרון';
$lang['by'] = 'על ידי';
$lang['deleted'] = 'נמחק';
$lang['created'] = 'נוצר';
-$lang['restored'] = 'שוחזר';
+$lang['restored'] = 'שוחזר (%s)';
$lang['external_edit'] = 'עריכה חיצונית';
$lang['summary'] = 'תקציר העריכה';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">תוסף פלאש לדפדפן</a> נדרש כדי להציג תוכן זה.';
@@ -243,7 +243,6 @@ $lang['i_modified'] = 'משיקולי אבטחה סקריפט זה י
עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף
<a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
$lang['i_funcna'] = 'פונקציית ה-PHP&rlm; <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?';
-$lang['i_phpver'] = 'גרסת ה־PHP שלך <code>%s</code> נמוכה מהדרוש. עליך לשדרג את התקנת ה־PHP שלך.';
$lang['i_permfail'] = '<code>%s</code> אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!';
$lang['i_confexists'] = '<code>%s</code> כבר קיים';
$lang['i_writeerr'] = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.';
diff --git a/inc/lang/hi/lang.php b/inc/lang/hi/lang.php
index 893457066..d2021fcae 100644
--- a/inc/lang/hi/lang.php
+++ b/inc/lang/hi/lang.php
@@ -84,7 +84,6 @@ $lang['lastmod'] = 'अंतिम बार संशोधि
$lang['by'] = 'के द्वारा';
$lang['deleted'] = 'हटाया';
$lang['created'] = 'निर्मित';
-$lang['restored'] = 'पुराने संशोधन बहाल';
$lang['external_edit'] = 'बाह्य सम्पादित';
$lang['summary'] = 'सारांश संपादित करें';
$lang['mail_newpage'] = 'पृष्ठ जोड़ा:';
diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php
index 97f4cf0c2..a607210d7 100644
--- a/inc/lang/hr/lang.php
+++ b/inc/lang/hr/lang.php
@@ -165,7 +165,7 @@ $lang['lastmod'] = 'Zadnja izmjena';
$lang['by'] = 'od';
$lang['deleted'] = 'obrisano';
$lang['created'] = 'stvoreno';
-$lang['restored'] = 'vraćena prijašnja inačica';
+$lang['restored'] = 'vraćena prijašnja inačica (%s)';
$lang['external_edit'] = 'vanjsko uređivanje';
$lang['summary'] = 'Sažetak izmjena';
$lang['noflash'] = 'Za prikazivanje ovog sadržaja potreban je <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php
index c59cace77..275fb15d5 100644
--- a/inc/lang/hu/lang.php
+++ b/inc/lang/hu/lang.php
@@ -169,7 +169,7 @@ $lang['lastmod'] = 'Utolsó módosítás';
$lang['by'] = 'szerkesztette:';
$lang['deleted'] = 'eltávolítva';
$lang['created'] = 'létrehozva';
-$lang['restored'] = 'az előző változat helyreállítva';
+$lang['restored'] = 'az előző változat helyreállítva (%s)';
$lang['external_edit'] = 'külső szerkesztés';
$lang['summary'] = 'A változások összefoglalása';
$lang['noflash'] = 'Ennek a tartalomnak a megtekintéséhez <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> szükséges.';
diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php
index a9d5c376c..fd63fb5ef 100644
--- a/inc/lang/ia/lang.php
+++ b/inc/lang/ia/lang.php
@@ -163,7 +163,7 @@ $lang['lastmod'] = 'Ultime modification';
$lang['by'] = 'per';
$lang['deleted'] = 'removite';
$lang['created'] = 'create';
-$lang['restored'] = 'ancian version restaurate';
+$lang['restored'] = 'ancian version restaurate (%s)';
$lang['external_edit'] = 'modification externe';
$lang['summary'] = 'Modificar summario';
$lang['noflash'] = 'Le <a href="http://www.adobe.com/products/flashplayer/">plug-in Flash de Adobe</a> es necessari pro monstrar iste contento.';
@@ -227,8 +227,6 @@ $lang['subscr_m_unsubscribe'] = 'Cancellar subscription';
$lang['subscr_m_subscribe'] = 'Subscriber';
$lang['subscr_m_receive'] = 'Reciper';
$lang['subscr_style_every'] = 'un message pro cata modification';
-$lang['subscr_style_digest'] = 'un digesto de modificationes pro cata pagina';
-$lang['subscr_style_list'] = 'lista de paginas modificate depost le ultime e-mail';
$lang['authmodfailed'] = 'Configuration incorrecte de authentication de usator. Per favor informa le administrator de tu wiki.';
$lang['authtempfail'] = 'Le authentication de usator temporarimente non es disponibile. Si iste situation persiste, per favor informa le administrator de tu wiki.';
$lang['i_chooselang'] = 'Selige tu lingua';
diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php
index 91ed38e31..e14b9d9f5 100644
--- a/inc/lang/id/lang.php
+++ b/inc/lang/id/lang.php
@@ -125,7 +125,7 @@ $lang['lastmod'] = 'Terakhir diubah';
$lang['by'] = 'oleh';
$lang['deleted'] = 'terhapus';
$lang['created'] = 'dibuat';
-$lang['restored'] = 'revisi lama ditampilkan kembali';
+$lang['restored'] = 'revisi lama ditampilkan kembali (%s)';
$lang['external_edit'] = 'Perubahan eksternal';
$lang['summary'] = 'Edit summary';
$lang['mail_newpage'] = 'Halaman ditambahkan:';
diff --git a/inc/lang/is/lang.php b/inc/lang/is/lang.php
index be20da6b3..78ae7e249 100644
--- a/inc/lang/is/lang.php
+++ b/inc/lang/is/lang.php
@@ -134,7 +134,7 @@ $lang['lastmod'] = 'Síðast breytt';
$lang['by'] = 'af';
$lang['deleted'] = 'eytt';
$lang['created'] = 'myndað';
-$lang['restored'] = 'Breytt aftur til fyrri útgáfu';
+$lang['restored'] = 'Breytt aftur til fyrri útgáfu (%s)';
$lang['external_edit'] = 'utanaðkomandi breyta';
$lang['summary'] = 'Forskoða';
$lang['noflash'] = 'Það þarf <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash viðbót</a> til að sýna sumt efnið á þessari síðu';
diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php
index 1ad5ae1bb..307e7292f 100644
--- a/inc/lang/it/lang.php
+++ b/inc/lang/it/lang.php
@@ -187,7 +187,7 @@ $lang['lastmod'] = 'Ultima modifica';
$lang['by'] = 'da';
$lang['deleted'] = 'eliminata';
$lang['created'] = 'creata';
-$lang['restored'] = 'versione precedente ripristinata';
+$lang['restored'] = 'versione precedente ripristinata (%s)';
$lang['external_edit'] = 'modifica esterna';
$lang['summary'] = 'Oggetto della modifica';
$lang['noflash'] = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">il plugin Adobe Flash</a> per visualizzare questo contenuto.';
@@ -263,8 +263,6 @@ $lang['subscr_m_unsubscribe'] = 'Rimuovi sottoscrizione';
$lang['subscr_m_subscribe'] = 'Sottoscrivi';
$lang['subscr_m_receive'] = 'Ricevi';
$lang['subscr_style_every'] = 'email per ogni modifica';
-$lang['subscr_style_digest'] = 'email riassuntiva delle modifiche di ogni pagina';
-$lang['subscr_style_list'] = 'elenco delle pagine modificate dall\'ultima email';
$lang['authmodfailed'] = 'La configurazione dell\'autenticazione non è corretta. Informa l\'amministratore di questo wiki.';
$lang['authtempfail'] = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo wiki.';
$lang['authpwdexpire'] = 'La tua password scadrà in %d giorni, dovresti cambiarla quanto prima.';
diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php
index 66de0dab5..7997889e4 100644
--- a/inc/lang/ja/lang.php
+++ b/inc/lang/ja/lang.php
@@ -181,7 +181,7 @@ $lang['lastmod'] = '最終更新';
$lang['by'] = 'by';
$lang['deleted'] = '削除';
$lang['created'] = '作成';
-$lang['restored'] = '以前のバージョンを復元';
+$lang['restored'] = '以前のバージョンを復元 (%s)';
$lang['external_edit'] = '外部編集';
$lang['summary'] = '編集の概要';
$lang['noflash'] = 'この内容を表示するためには <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> が必要です。';
diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php
index 6a5fa223f..85bb6afba 100644
--- a/inc/lang/km/lang.php
+++ b/inc/lang/km/lang.php
@@ -132,7 +132,6 @@ $lang['lastmod'] = 'ពេលកែចុងក្រោយ';
$lang['by'] = 'និពន្ឋដោយ';
$lang['deleted'] = 'យកចេញ';
$lang['created'] = 'បង្កើត';
-$lang['restored'] = 'ស្ដារបុនរាព្រឹតចាស់';
$lang['external_edit'] = 'កំរេពីក្រៅ';
$lang['summary'] = 'កែតម្រា';
@@ -207,7 +206,6 @@ $lang['i_superuser'] = 'អ្នកកំពូល';
$lang['i_problems'] = 'កម្មវិធី​ដំឡើងបានប៉ះឧបសគ្គ។ អ្នកមិនអាចបន្តទៅទៀត ដល់អ្នកជួសជុលវា។';
$lang['i_modified'] = '';
$lang['i_funcna'] = '<code>%s</code> ';
-$lang['i_phpver'] = 'PHP ប្រវត់លេខ<code>%s</code> ជា';
$lang['i_permfail'] = '<code>%s</code> មិនអាចសាស';
$lang['i_confexists'] = '<code>%s</code> មានហាយ';
$lang['i_writeerr'] = 'មិនអាចបណ្កើ<code>%s</code>។ អ្នកត្រវការពិនិត្យអធិក្រឹតិរបស់ថតនឹងឯកសារ។';
diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php
index 63ccafa35..c9d658c6d 100644
--- a/inc/lang/ku/lang.php
+++ b/inc/lang/ku/lang.php
@@ -95,7 +95,7 @@ $lang['lastmod'] = 'Guherandina dawî';
$lang['by'] = 'by';
$lang['deleted'] = 'hat jê birin';
$lang['created'] = 'hat afirandin';
-$lang['restored'] = 'old revision restored';
+$lang['restored'] = 'old revision restored (%s)';
$lang['summary'] = 'Kurteya guhartinê';
$lang['mail_newpage'] = 'page added:';
diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php
index 77fec8362..bea921abc 100644
--- a/inc/lang/la/lang.php
+++ b/inc/lang/la/lang.php
@@ -131,7 +131,6 @@ $lang['uploadsucc'] = 'Oneratum perfectum';
$lang['uploadfail'] = 'Error onerandi.';
$lang['uploadwrong'] = 'Onerare non potest. Genus documenti non legitimum!';
$lang['uploadexist'] = 'Documentum iam est.';
-$lang['uploadbadcontent'] = 'Documentum oneratum cum genere documenti non congruit.';
$lang['uploadspam'] = 'Onerare non potest: nam in indice perscriptionis documentum est.';
$lang['uploadxss'] = 'Onerare non potest: nam forsitan malum scriptum in documento est.';
$lang['uploadsize'] = 'Documentum onerandum ponderosius est. (Maxime "%s")';
@@ -164,7 +163,7 @@ $lang['lastmod'] = 'Extrema mutatio';
$lang['by'] = 'a(b)';
$lang['deleted'] = 'deletur';
$lang['created'] = 'creatur';
-$lang['restored'] = 'Recensio uetus restituta';
+$lang['restored'] = 'Recensio uetus restituta (%s)';
$lang['external_edit'] = 'Externe recensere';
$lang['summary'] = 'Indicem recensere';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> necessarium est.';
@@ -254,7 +253,6 @@ $lang['i_pol1'] = 'Publicus uicis (omnes legere, Sodales scribere
$lang['i_pol2'] = 'Clausus uicis (Soli Sodales legere scribere et onerare poccunt)';
$lang['i_retry'] = 'Rursum temptas';
$lang['i_license'] = 'Elige facultatem sub qua tuus uicis est:';
-$lang['recent_global'] = 'Mutatione in hoc genere uides. Recentiores mutationes quoque uidere <a href="%s">potes</a>';
$lang['years'] = 'ab annis %d';
$lang['months'] = 'a mensibus %d';
$lang['weeks'] = 'a septimanis %d';
diff --git a/inc/lang/lb/lang.php b/inc/lang/lb/lang.php
index e6409b7ff..bced5a50a 100644
--- a/inc/lang/lb/lang.php
+++ b/inc/lang/lb/lang.php
@@ -124,7 +124,7 @@ $lang['lastmod'] = 'Fir d\'lescht g\'ännert';
$lang['by'] = 'vun';
$lang['deleted'] = 'geläscht';
$lang['created'] = 'erstallt';
-$lang['restored'] = 'al Versioun zeréckgeholl';
+$lang['restored'] = 'al Versioun zeréckgeholl (%s)';
$lang['external_edit'] = 'extern Ännerung';
$lang['summary'] = 'Resumé vun den Ännerungen';
$lang['noflash'] = 'Den <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> get gebraucht fir dësen Inhalt unzeweisen.';
diff --git a/inc/lang/lt/lang.php b/inc/lang/lt/lang.php
index 13ff8c305..8a4c4e6a5 100644
--- a/inc/lang/lt/lang.php
+++ b/inc/lang/lt/lang.php
@@ -132,7 +132,7 @@ $lang['lastmod'] = 'Keista';
$lang['by'] = 'vartotojo';
$lang['deleted'] = 'ištrintas';
$lang['created'] = 'sukurtas';
-$lang['restored'] = 'atstatyta sena versija';
+$lang['restored'] = 'atstatyta sena versija (%s)';
$lang['external_edit'] = 'redaguoti papildomomis priemonėmis';
$lang['summary'] = 'Redaguoti santrauką';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> reikalingas šios medžiagos peržiūrai.';
diff --git a/inc/lang/lv/lang.php b/inc/lang/lv/lang.php
index 671e5f52a..2027b87ba 100644
--- a/inc/lang/lv/lang.php
+++ b/inc/lang/lv/lang.php
@@ -178,7 +178,7 @@ $lang['lastmod'] = 'Labota';
$lang['by'] = ', labojis';
$lang['deleted'] = 'dzēsts';
$lang['created'] = 'izveidots';
-$lang['restored'] = 'vecā versija atjaunota';
+$lang['restored'] = 'vecā versija atjaunota (%s)';
$lang['external_edit'] = 'ārpussistēmas labojums';
$lang['summary'] = 'Anotācija';
$lang['noflash'] = 'Lai attēlotu lapas saturu, vajag <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
diff --git a/inc/lang/mg/lang.php b/inc/lang/mg/lang.php
index 4142f00d0..95589ab21 100644
--- a/inc/lang/mg/lang.php
+++ b/inc/lang/mg/lang.php
@@ -88,7 +88,7 @@ $lang['lastmod'] = 'Novaina farany:';
$lang['by'] = '/';
$lang['deleted'] = 'voafafa';
$lang['created'] = 'Voamboatra';
-$lang['restored'] = 'Naverina tamin\'ny kinova taloha';
+$lang['restored'] = 'Naverina tamin\'ny kinova taloha (%s)';
$lang['summary'] = 'Fanovana teo';
$lang['mail_newpage'] = 'pejy niampy:';
diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php
index 7482f2512..44bd489b7 100644
--- a/inc/lang/mk/lang.php
+++ b/inc/lang/mk/lang.php
@@ -136,7 +136,7 @@ $lang['lastmod'] = 'Последно изменета';
$lang['by'] = 'од';
$lang['deleted'] = 'отстранета';
$lang['created'] = 'креирана';
-$lang['restored'] = 'обновена е стара ревизија';
+$lang['restored'] = 'обновена е стара ревизија (%s)';
$lang['external_edit'] = 'надворешно уредување';
$lang['summary'] = 'Уреди го изводот';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash приклучокот</a> е потребен за да се прикаже оваа содржина.';
@@ -196,8 +196,6 @@ $lang['subscr_m_unsubscribe'] = 'Отплатување';
$lang['subscr_m_subscribe'] = 'Претплата';
$lang['subscr_m_receive'] = 'Прими';
$lang['subscr_style_every'] = 'е-пошта за секоја промена';
-$lang['subscr_style_digest'] = 'е-пошта со преглед од промените за секоја страница';
-$lang['subscr_style_list'] = 'листа на променети страници од последната е-пошта';
$lang['authmodfailed'] = 'Лоша конфигурација за автентикација на корисник. Ве молам информирајте го вики администратор.';
$lang['authtempfail'] = 'Автентикација на корисник е привремено недостапна. Ако оваа ситуација истрајува, ве молам известете го вики администратор.';
$lang['i_chooselang'] = 'Избере јазик';
diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php
index b754a3f1c..d95813efa 100644
--- a/inc/lang/mr/lang.php
+++ b/inc/lang/mr/lang.php
@@ -180,7 +180,6 @@ $lang['lastmod'] = 'सर्वात शेवटचा बद
$lang['by'] = 'द्वारा';
$lang['deleted'] = 'काढून टाकले';
$lang['created'] = 'निर्माण केले';
-$lang['restored'] = 'जुनी आवृत्ति पुनर्स्थापित केली';
$lang['external_edit'] = 'बाहेरून संपादित';
$lang['summary'] = 'सारांश बदला';
$lang['noflash'] = 'ही माहिती दाखवण्यासाठी <a href="http://www.adobe.com/products/flashplayer/">अडोब फ्लॅश प्लेअर</a> ची गरज आहे.';
diff --git a/inc/lang/ms/lang.php b/inc/lang/ms/lang.php
index 92dc86b5a..02c0e2c91 100644
--- a/inc/lang/ms/lang.php
+++ b/inc/lang/ms/lang.php
@@ -93,5 +93,5 @@ $lang['uploadfail'] = 'Ralat muat naik';
$lang['uploadxss'] = 'Fail ini mengandungi kod HTML atau kod skrip yang mungkin boleh disalah tafsir oleh pelayar web.';
$lang['toc'] = 'Jadual Kandungan';
$lang['current'] = 'kini';
-$lang['restored'] = 'Telah dikembalikan ke semakan sebelumnya';
+$lang['restored'] = 'Telah dikembalikan ke semakan sebelumnya (%s)';
$lang['summary'] = 'Paparan';
diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php
index fa6d2f705..b7ca14b0a 100644
--- a/inc/lang/ne/lang.php
+++ b/inc/lang/ne/lang.php
@@ -128,7 +128,6 @@ $lang['lastmod'] = 'अन्तिम पटक सच्या
$lang['by'] = 'द्वारा ';
$lang['deleted'] = 'हटाइएको';
$lang['created'] = 'निर्माण गरिएको';
-$lang['restored'] = 'पुरानो संस्करण पुनर्‌प्रयोग गरिएको';
$lang['external_edit'] = 'बाह्य सम्पादन';
$lang['summary'] = 'सम्पादनको बारेमा';
$lang['mail_newpage'] = 'थपिएको पृष्ठ';
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index 0241eab2f..f6192a99b 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -192,7 +192,7 @@ $lang['lastmod'] = 'Laatst gewijzigd';
$lang['by'] = 'door';
$lang['deleted'] = 'verwijderd';
$lang['created'] = 'aangemaakt';
-$lang['restored'] = 'oude revisie hersteld';
+$lang['restored'] = 'oude revisie hersteld (%s)';
$lang['external_edit'] = 'Externe bewerking';
$lang['summary'] = 'Samenvatting wijziging';
$lang['noflash'] = 'De <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> is vereist om de pagina te kunnen weergeven.';
diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php
index 9aa11ac87..8235bfb91 100644
--- a/inc/lang/no/lang.php
+++ b/inc/lang/no/lang.php
@@ -190,7 +190,7 @@ $lang['lastmod'] = 'Sist endret';
$lang['by'] = 'av';
$lang['deleted'] = 'fjernet';
$lang['created'] = 'opprettet';
-$lang['restored'] = 'gjenopprettet til en tidligere versjon';
+$lang['restored'] = 'gjenopprettet til en tidligere versjon (%s)';
$lang['external_edit'] = 'ekstern redigering';
$lang['summary'] = 'Redigeringskommentar';
$lang['noflash'] = 'For at dette innholdet skal vises må du ha <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
@@ -316,8 +316,7 @@ $lang['media_upload'] = 'Last opp til navnerommet <strong>%s</strong>.'
$lang['media_search'] = 'Søk i navnerommet <strong>%s</strong>.';
$lang['media_view'] = '%s';
$lang['media_viewold'] = '%s på %s';
-$lang['media_edit'] = 'Rediger';
-$lang['media_history'] = 'Dette er de tidligere versjonene av filen.';
+$lang['media_edit'] = 'Rediger %s';
$lang['media_meta_edited'] = 'metadata er endra';
$lang['media_perm_read'] = 'Beklager, du har ikke tilgang til å lese filer.';
$lang['media_perm_upload'] = 'Beklager, du har ikke tilgang til å laste opp filer.';
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index cf9fc6a16..51149e88f 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -189,7 +189,7 @@ $lang['lastmod'] = 'ostatnio zmienione';
$lang['by'] = 'przez';
$lang['deleted'] = 'usunięto';
$lang['created'] = 'utworzono';
-$lang['restored'] = 'przywrócono poprzednią wersję';
+$lang['restored'] = 'przywrócono poprzednią wersję (%s)';
$lang['external_edit'] = 'edycja zewnętrzna';
$lang['summary'] = 'Opis zmian';
$lang['noflash'] = 'Plugin <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> jest niezbędny do obejrzenia tej zawartości.';
@@ -265,8 +265,6 @@ $lang['subscr_m_unsubscribe'] = 'Zrezygnuj z subskrypcji';
$lang['subscr_m_subscribe'] = 'Subskrybuj';
$lang['subscr_m_receive'] = 'Otrzymuj';
$lang['subscr_style_every'] = 'email przy każdej zmianie';
-$lang['subscr_style_digest'] = 'email ze streszczeniem zmian dla każdej ze stron';
-$lang['subscr_style_list'] = 'lista zmienionych stron od czasu ostatniego emaila';
$lang['authmodfailed'] = 'Błąd uwierzytelnienia. Powiadom administratora tego wiki.';
$lang['authtempfail'] = 'Uwierzytelnienie użytkownika jest w tej chwili niemożliwe. Jeśli ta sytuacja się powtórzy, powiadom administratora tego wiki.';
$lang['authpwdexpire'] = 'Twoje hasło wygaśnie za %d dni. Należy je zmienić w krótkim czasie.';
diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php
index 1555889f6..ac9c59c3e 100644
--- a/inc/lang/pt/lang.php
+++ b/inc/lang/pt/lang.php
@@ -179,7 +179,7 @@ $lang['lastmod'] = 'Esta página foi modificada pela última vez e
$lang['by'] = 'por';
$lang['deleted'] = 'Documento automaticamente removido.';
$lang['created'] = 'Criação deste novo documento.';
-$lang['restored'] = 'Versão anterior restaurada.';
+$lang['restored'] = 'Versão anterior restaurada (%s)';
$lang['external_edit'] = 'Edição externa';
$lang['summary'] = 'Sumário da Edição';
$lang['noflash'] = 'O <a href="http://www.adobe.com/products/flashplayer/">Plugin Adobe Flash</a> é necessário para exibir este conteúdo.';
diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php
index d6bfcad3a..8b2483daf 100644
--- a/inc/lang/ro/lang.php
+++ b/inc/lang/ro/lang.php
@@ -184,7 +184,7 @@ $lang['lastmod'] = 'Ultima modificare';
$lang['by'] = 'de către';
$lang['deleted'] = 'şters';
$lang['created'] = 'creat';
-$lang['restored'] = 'versiune veche restaurată';
+$lang['restored'] = 'versiune veche restaurată (%s)';
$lang['external_edit'] = 'editare externă';
$lang['summary'] = 'Editează sumarul';
$lang['noflash'] = 'Plugin-ul <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> este necesar pentru afişarea corectă a conţinutului.';
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index c391bc6a5..52e0ef3d6 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -193,7 +193,7 @@ $lang['lastmod'] = 'Последние изменения';
$lang['by'] = ' —';
$lang['deleted'] = 'удалено';
$lang['created'] = 'создано';
-$lang['restored'] = 'старая ревизия восстановлена';
+$lang['restored'] = 'старая ревизия восстановлена (%s)';
$lang['external_edit'] = 'внешнее изменение';
$lang['summary'] = 'Сводка изменений';
$lang['noflash'] = 'Для просмотра этого содержимого требуется <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
@@ -270,8 +270,6 @@ $lang['subscr_m_unsubscribe'] = 'Отменить подписку';
$lang['subscr_m_subscribe'] = 'Подписаться';
$lang['subscr_m_receive'] = 'Получить';
$lang['subscr_style_every'] = 'уведомлять о каждом изменении';
-$lang['subscr_style_digest'] = 'сводка изменений по каждой странице';
-$lang['subscr_style_list'] = 'перечислять изменившиеся страницы с прошлого уведомления';
$lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом своему администратору вики.';
$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.';
$lang['authpwdexpire'] = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее';
diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php
index 81220b8a2..5c4316b01 100644
--- a/inc/lang/sl/lang.php
+++ b/inc/lang/sl/lang.php
@@ -177,7 +177,7 @@ $lang['lastmod'] = 'Zadnja sprememba';
$lang['by'] = 'uporabnika';
$lang['deleted'] = 'odstranjena';
$lang['created'] = 'ustvarjena';
-$lang['restored'] = 'povrnjena stara različica';
+$lang['restored'] = 'povrnjena stara različica (%s)';
$lang['external_edit'] = 'urejanje v zunanjem urejevalniku';
$lang['summary'] = 'Povzetek urejanja';
$lang['noflash'] = 'Za prikaz vsebine je treba namestiti <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
diff --git a/inc/lang/sq/lang.php b/inc/lang/sq/lang.php
index e190d8404..212f10607 100644
--- a/inc/lang/sq/lang.php
+++ b/inc/lang/sq/lang.php
@@ -140,7 +140,7 @@ $lang['lastmod'] = 'Redaktuar për herë të fundit';
$lang['by'] = 'nga';
$lang['deleted'] = 'u fshi';
$lang['created'] = 'u krijua';
-$lang['restored'] = 'Kthehu tek një version i vjetër';
+$lang['restored'] = 'Kthehu tek një version i vjetër (%s)';
$lang['external_edit'] = 'redaktim i jashtëm';
$lang['summary'] = 'Përmbledhja redaktimit';
$lang['noflash'] = 'Nevojitet <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> për të paraqitur këtë përmbajtje.';
@@ -204,8 +204,6 @@ $lang['subscr_m_unsubscribe'] = 'Fshi Abonimin';
$lang['subscr_m_subscribe'] = 'Abonohu';
$lang['subscr_m_receive'] = 'Mer';
$lang['subscr_style_every'] = 'email mbi çdo ndryshim';
-$lang['subscr_style_digest'] = 'pasqyro email-e ndryshimi pér çdo faqe';
-$lang['subscr_style_list'] = 'listë e faqeve të ndryshuara që nga emaili i fundit';
$lang['authmodfailed'] = 'Konfigurim i gabuar i autentikimit të përdoruesit. Ju lutem informoni Administratorin tuaj të Wiki-it.';
$lang['authtempfail'] = 'Autentikimi i përdoruesve është përkohësisht i padisponueshëm. Nëse kjo gjendje vazhdon, ju lutemi të informoni Administratorin tuaj të Wiki-it.';
$lang['i_chooselang'] = 'Zgjidhni gjuhën tuaj';
diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php
index d7f594511..7fbdf1985 100644
--- a/inc/lang/sr/lang.php
+++ b/inc/lang/sr/lang.php
@@ -162,7 +162,7 @@ $lang['lastmod'] = 'Последњи пут мењано';
$lang['by'] = 'од';
$lang['deleted'] = 'избрисано';
$lang['created'] = 'направљено';
-$lang['restored'] = 'стара верзија повраћена';
+$lang['restored'] = 'стара верзија повраћена (%s)';
$lang['external_edit'] = 'спољна измена';
$lang['summary'] = 'Сажетак измене';
$lang['noflash'] = 'За приказивање ове врсте материјала потребан вам је <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php
index c9d526436..627484eab 100644
--- a/inc/lang/th/lang.php
+++ b/inc/lang/th/lang.php
@@ -144,7 +144,7 @@ $lang['lastmod'] = 'แก้ไขครั้งล่าสุ
$lang['by'] = 'โดย';
$lang['deleted'] = 'ถูกถอดออก';
$lang['created'] = 'ถูกสร้าง';
-$lang['restored'] = 'ย้อนไปรุ่นก่อนหน้า';
+$lang['restored'] = 'ย้อนไปรุ่นก่อนหน้า (%s)';
$lang['external_edit'] = 'แก้ไขภายนอก';
$lang['summary'] = 'สรุป(หมายเหตุ)การแก้ไขนี้';
$lang['noflash'] = 'ต้องการตัวเล่นแฟลช <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> เพื่อแสดงผลเนื้อหานี้';
diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php
index 5430905b1..c6edf74c6 100644
--- a/inc/lang/tr/lang.php
+++ b/inc/lang/tr/lang.php
@@ -176,7 +176,7 @@ $lang['lastmod'] = 'Son değiştirilme';
$lang['by'] = 'Değiştiren:';
$lang['deleted'] = 'silindi';
$lang['created'] = 'oluşturuldu';
-$lang['restored'] = 'eski sürüme dönüldü';
+$lang['restored'] = 'eski sürüme dönüldü (%s)';
$lang['external_edit'] = 'Dışarıdan düzenle';
$lang['summary'] = 'Özeti düzenle';
$lang['noflash'] = 'Bu içeriği göstermek için <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Eklentisi</a> gerekmektedir.';
diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php
index 5274a4210..6aa468c50 100644
--- a/inc/lang/uk/lang.php
+++ b/inc/lang/uk/lang.php
@@ -169,7 +169,7 @@ $lang['lastmod'] = 'В останнє змінено';
$lang['by'] = ' ';
$lang['deleted'] = 'знищено';
$lang['created'] = 'створено';
-$lang['restored'] = 'відновлено стару ревізію';
+$lang['restored'] = 'відновлено стару ревізію (%s)';
$lang['external_edit'] = 'зовнішнє редагування';
$lang['summary'] = 'Підсумок змін';
$lang['noflash'] = 'Для перегляду цієї сторінки необхідно встановити <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php
index 99c4d47e4..c439ca534 100644
--- a/inc/lang/vi/lang.php
+++ b/inc/lang/vi/lang.php
@@ -176,7 +176,7 @@ $lang['lastmod'] = 'Thời điểm thay đổi';
$lang['by'] = 'do';
$lang['deleted'] = 'bị xoá';
$lang['created'] = 'được tạo ra';
-$lang['restored'] = 'phiên bản cũ đã được khôi phục';
+$lang['restored'] = 'phiên bản cũ đã được khôi phục (%s)';
$lang['external_edit'] = 'external edit';
$lang['summary'] = 'Tóm tắt biên soạn';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> cần được cài để có thể xem nội dung này.';
diff --git a/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php
index ddb35617e..536266971 100644
--- a/inc/lang/zh-tw/lang.php
+++ b/inc/lang/zh-tw/lang.php
@@ -186,7 +186,7 @@ $lang['lastmod'] = '上一次變更';
$lang['by'] = '由';
$lang['deleted'] = '移除';
$lang['created'] = '建立';
-$lang['restored'] = '恢復為舊版';
+$lang['restored'] = '恢復為舊版 (%s)';
$lang['external_edit'] = '外部編輯';
$lang['summary'] = '編輯摘要';
$lang['noflash'] = '顯示此內容需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 附加元件</a>。';
diff --git a/inc/media.php b/inc/media.php
index 572b1177c..db1ca0d57 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -237,8 +237,7 @@ function media_upload_xhr($ns,$auth){
$realSize = stream_copy_to_stream($input, $target);
fclose($target);
fclose($input);
- if ($realSize != (int)$_SERVER["CONTENT_LENGTH"]){
- unlink($target);
+ if (isset($_SERVER["CONTENT_LENGTH"]) && ($realSize != (int)$_SERVER["CONTENT_LENGTH"])){
unlink($path);
return false;
}
@@ -1687,18 +1686,36 @@ function media_nstree($ns){
$ns = cleanID($ns);
if(empty($ns)){
global $ID;
- $ns = dirname(str_replace(':','/',$ID));
- if($ns == '.') $ns ='';
+ $ns = (string)getNS($ID);
}
- $ns = utf8_encodeFN(str_replace(':','/',$ns));
+
+ $ns_dir = utf8_encodeFN(str_replace(':','/',$ns));
$data = array();
- search($data,$conf['mediadir'],'search_index',array('ns' => $ns, 'nofiles' => true));
+ search($data,$conf['mediadir'],'search_index',array('ns' => $ns_dir, 'nofiles' => true));
// wrap a list with the root level around the other namespaces
array_unshift($data, array('level' => 0, 'id' => '', 'open' =>'true',
'label' => '['.$lang['mediaroot'].']'));
+ // insert the current ns into the hierarchy if it isn't already part of it
+ $ns_parts = explode(':', $ns);
+ $tmp_ns = '';
+ $pos = 0;
+ foreach ($ns_parts as $level => $part) {
+ if ($tmp_ns) $tmp_ns .= ':'.$part;
+ else $tmp_ns = $part;
+
+ // find the namespace parts or insert them
+ while ($data[$pos]['id'] != $tmp_ns) {
+ if ($pos >= count($data) || ($data[$pos]['level'] <= $level+1 && strnatcmp(utf8_encodeFN($data[$pos]['id']), utf8_encodeFN($tmp_ns)) > 0)) {
+ array_splice($data, $pos, 0, array(array('level' => $level+1, 'id' => $tmp_ns, 'open' => 'true')));
+ break;
+ }
+ ++$pos;
+ }
+ }
+
echo html_buildlist($data,'idx','media_nstree_item','media_nstree_li');
}
@@ -1878,6 +1895,8 @@ function media_get_from_URL($url,$ext,$cache){
function media_image_download($url,$file){
global $conf;
$http = new DokuHTTPClient();
+ $http->keep_alive = false; // we do single ops here, no need for keep-alive
+
$http->max_bodysize = $conf['fetchsize'];
$http->timeout = 25; //max. 25 sec
$http->header_regexp = '!\r\nContent-Type: image/(jpe?g|gif|png)!i';
diff --git a/inc/parser/code.php b/inc/parser/code.php
index 21fb0dc3c..43d8d703f 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -43,7 +43,7 @@ class Doku_Renderer_code extends Doku_Renderer {
* This should never be reached, if it is send a 404
*/
function document_end() {
- header("HTTP/1.0 404 Not Found");
+ http_status(404);
echo '404 - Not found';
exit;
}
diff --git a/install.php b/install.php
index f54c25207..2db25bd2f 100644
--- a/install.php
+++ b/install.php
@@ -54,7 +54,8 @@ $dokuwiki_hash = array(
'2011-05-25' => '4241865472edb6fa14a1227721008072',
'2011-11-10' => 'b46ff19a7587966ac4df61cbab1b8b31',
'2012-01-25' => '72c083c73608fc43c586901fd5dabb74',
- '2012-09-10' => 'eb0b3fc90056fbc12bac6f49f7764df3'
+ '2012-09-10' => 'eb0b3fc90056fbc12bac6f49f7764df3',
+ 'devel' => '7b62b75245f57f122d3e0f8ed7989623',
);
@@ -391,6 +392,24 @@ EOT;
@touch(DOKU_INC.'data/cache/autosubmit.txt');
}
+ // disable auth plugins til needed
+ $output = <<<EOT
+<?php
+/*
+ * Local plugin enable/disable settings
+ *
+ * Auto-generated by install script
+ * Date: $now
+ */
+
+\$plugins['authad'] = 0;
+\$plugins['authldap'] = 0;
+\$plugins['authmysql'] = 0;
+\$plugins['authpgsql'] = 0;
+
+EOT;
+ $ok = $ok && fileWrite(DOKU_LOCAL.'plugins.local.php', $output);
+
return $ok;
}
diff --git a/lib/exe/detail.php b/lib/exe/detail.php
index e597db3a2..db635c016 100644
--- a/lib/exe/detail.php
+++ b/lib/exe/detail.php
@@ -31,7 +31,7 @@ if($AUTH >= AUTH_READ){
$SRC = mediaFN($IMG);
if(!@file_exists($SRC)){
//doesn't exist!
- header("HTTP/1.0 404 File not Found");
+ http_status(404);
$ERROR = 'File not found';
}
}else{
diff --git a/lib/exe/fetch.php b/lib/exe/fetch.php
index 52e7ebe1e..9bac4d272 100644
--- a/lib/exe/fetch.php
+++ b/lib/exe/fetch.php
@@ -6,84 +6,87 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
- if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
- define('DOKU_DISABLE_GZIP_OUTPUT', 1);
- require_once(DOKU_INC.'inc/init.php');
-
- //close session
- session_write_close();
-
- $mimetypes = getMimeTypes();
-
- //get input
- $MEDIA = stripctl(getID('media',false)); // no cleaning except control chars - maybe external
- $CACHE = calc_cache($INPUT->str('cache'));
- $WIDTH = $INPUT->int('w');
- $HEIGHT = $INPUT->int('h');
- $REV = &$INPUT->ref('rev');
- //sanitize revision
- $REV = preg_replace('/[^0-9]/','',$REV);
-
- list($EXT,$MIME,$DL) = mimetype($MEDIA,false);
- if($EXT === false){
- $EXT = 'unknown';
- $MIME = 'application/octet-stream';
- $DL = true;
- }
-
- // check for permissions, preconditions and cache external files
- list($STATUS, $STATUSMESSAGE) = checkFileStatus($MEDIA, $FILE, $REV);
-
- // prepare data for plugin events
- $data = array('media' => $MEDIA,
- 'file' => $FILE,
- 'orig' => $FILE,
- 'mime' => $MIME,
- 'download' => $DL,
- 'cache' => $CACHE,
- 'ext' => $EXT,
- 'width' => $WIDTH,
- 'height' => $HEIGHT,
- 'status' => $STATUS,
- 'statusmessage' => $STATUSMESSAGE,
- );
-
- // handle the file status
- $evt = new Doku_Event('FETCH_MEDIA_STATUS', $data);
- if ( $evt->advise_before() ) {
- // redirects
- if($data['status'] > 300 && $data['status'] <= 304){
- send_redirect($data['statusmessage']);
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/../../');
+define('DOKU_DISABLE_GZIP_OUTPUT', 1);
+require_once(DOKU_INC.'inc/init.php');
+session_write_close(); //close session
+
+// BEGIN main (if not testing)
+if(!defined('SIMPLE_TEST')) {
+ $mimetypes = getMimeTypes();
+
+ //get input
+ $MEDIA = stripctl(getID('media', false)); // no cleaning except control chars - maybe external
+ $CACHE = calc_cache($INPUT->str('cache'));
+ $WIDTH = $INPUT->int('w');
+ $HEIGHT = $INPUT->int('h');
+ $REV = & $INPUT->ref('rev');
+ //sanitize revision
+ $REV = preg_replace('/[^0-9]/', '', $REV);
+
+ list($EXT, $MIME, $DL) = mimetype($MEDIA, false);
+ if($EXT === false) {
+ $EXT = 'unknown';
+ $MIME = 'application/octet-stream';
+ $DL = true;
}
- // send any non 200 status
- if($data['status'] != 200){
- header('HTTP/1.0 ' . $data['status'] . ' ' . $data['statusmessage']);
+
+ // check for permissions, preconditions and cache external files
+ list($STATUS, $STATUSMESSAGE) = checkFileStatus($MEDIA, $FILE, $REV);
+
+ // prepare data for plugin events
+ $data = array(
+ 'media' => $MEDIA,
+ 'file' => $FILE,
+ 'orig' => $FILE,
+ 'mime' => $MIME,
+ 'download' => $DL,
+ 'cache' => $CACHE,
+ 'ext' => $EXT,
+ 'width' => $WIDTH,
+ 'height' => $HEIGHT,
+ 'status' => $STATUS,
+ 'statusmessage' => $STATUSMESSAGE,
+ );
+
+ // handle the file status
+ $evt = new Doku_Event('FETCH_MEDIA_STATUS', $data);
+ if($evt->advise_before()) {
+ // redirects
+ if($data['status'] > 300 && $data['status'] <= 304) {
+ send_redirect($data['statusmessage']);
+ }
+ // send any non 200 status
+ if($data['status'] != 200) {
+ http_status($data['status'], $data['statusmessage']);
+ }
+ // die on errors
+ if($data['status'] > 203) {
+ print $data['statusmessage'];
+ exit;
+ }
}
- // die on errors
- if($data['status'] > 203){
- print $data['statusmessage'];
- exit;
+ $evt->advise_after();
+ unset($evt);
+
+ //handle image resizing/cropping
+ if((substr($MIME, 0, 5) == 'image') && $WIDTH) {
+ if($HEIGHT) {
+ $data['file'] = $FILE = media_crop_image($data['file'], $EXT, $WIDTH, $HEIGHT);
+ } else {
+ $data['file'] = $FILE = media_resize_image($data['file'], $EXT, $WIDTH, $HEIGHT);
+ }
}
- }
- $evt->advise_after();
- unset($evt);
-
- //handle image resizing/cropping
- if((substr($MIME,0,5) == 'image') && $WIDTH){
- if($HEIGHT){
- $data['file'] = $FILE = media_crop_image($data['file'],$EXT,$WIDTH,$HEIGHT);
- }else{
- $data['file'] = $FILE = media_resize_image($data['file'],$EXT,$WIDTH,$HEIGHT);
+
+ // finally send the file to the client
+ $evt = new Doku_Event('MEDIA_SENDFILE', $data);
+ if($evt->advise_before()) {
+ sendFile($data['file'], $data['mime'], $data['download'], $data['cache']);
}
- }
+ // Do something after the download finished.
+ $evt->advise_after();
- // finally send the file to the client
- $evt = new Doku_Event('MEDIA_SENDFILE', $data);
- if ($evt->advise_before()) {
- sendFile($data['file'],$data['mime'],$data['download'],$data['cache']);
- }
- // Do something after the download finished.
- $evt->advise_after();
+}// END DO main
/* ------------------------------------------------------------------------ */
@@ -93,51 +96,50 @@
* @author Andreas Gohr <andi@splitbrain.org>
* @author Ben Coburn <btcoburn@silicodon.net>
*/
-function sendFile($file,$mime,$dl,$cache){
- global $conf;
- $fmtime = @filemtime($file);
- // send headers
- header("Content-Type: $mime");
- // smart http caching headers
- if ($cache==-1) {
- // cache
- // cachetime or one hour
- header('Expires: '.gmdate("D, d M Y H:i:s", time()+max($conf['cachetime'], 3600)).' GMT');
- header('Cache-Control: public, proxy-revalidate, no-transform, max-age='.max($conf['cachetime'], 3600));
- header('Pragma: public');
- } else if ($cache>0) {
- // recache
- // remaining cachetime + 10 seconds so the newly recached media is used
- header('Expires: '.gmdate("D, d M Y H:i:s", $fmtime+$conf['cachetime']+10).' GMT');
- header('Cache-Control: public, proxy-revalidate, no-transform, max-age='.max($fmtime-time()+$conf['cachetime']+10, 0));
- header('Pragma: public');
- } else if ($cache==0) {
- // nocache
- header('Cache-Control: must-revalidate, no-transform, post-check=0, pre-check=0');
- header('Pragma: public');
- }
- //send important headers first, script stops here if '304 Not Modified' response
- http_conditionalRequest($fmtime);
-
-
- //download or display?
- if($dl){
- header('Content-Disposition: attachment; filename="'.utf8_basename($file).'";');
- }else{
- header('Content-Disposition: inline; filename="'.utf8_basename($file).'";');
- }
-
- //use x-sendfile header to pass the delivery to compatible webservers
- if (http_sendfile($file)) exit;
-
- // send file contents
- $fp = @fopen($file,"rb");
- if($fp){
- http_rangeRequest($fp,filesize($file),$mime);
- }else{
- header("HTTP/1.0 500 Internal Server Error");
- print "Could not read $file - bad permissions?";
- }
+function sendFile($file, $mime, $dl, $cache) {
+ global $conf;
+ $fmtime = @filemtime($file);
+ // send headers
+ header("Content-Type: $mime");
+ // smart http caching headers
+ if($cache == -1) {
+ // cache
+ // cachetime or one hour
+ header('Expires: '.gmdate("D, d M Y H:i:s", time() + max($conf['cachetime'], 3600)).' GMT');
+ header('Cache-Control: public, proxy-revalidate, no-transform, max-age='.max($conf['cachetime'], 3600));
+ header('Pragma: public');
+ } else if($cache > 0) {
+ // recache
+ // remaining cachetime + 10 seconds so the newly recached media is used
+ header('Expires: '.gmdate("D, d M Y H:i:s", $fmtime + $conf['cachetime'] + 10).' GMT');
+ header('Cache-Control: public, proxy-revalidate, no-transform, max-age='.max($fmtime - time() + $conf['cachetime'] + 10, 0));
+ header('Pragma: public');
+ } else if($cache == 0) {
+ // nocache
+ header('Cache-Control: must-revalidate, no-transform, post-check=0, pre-check=0');
+ header('Pragma: public');
+ }
+ //send important headers first, script stops here if '304 Not Modified' response
+ http_conditionalRequest($fmtime);
+
+ //download or display?
+ if($dl) {
+ header('Content-Disposition: attachment; filename="'.utf8_basename($file).'";');
+ } else {
+ header('Content-Disposition: inline; filename="'.utf8_basename($file).'";');
+ }
+
+ //use x-sendfile header to pass the delivery to compatible webservers
+ if(http_sendfile($file)) exit;
+
+ // send file contents
+ $fp = @fopen($file, "rb");
+ if($fp) {
+ http_rangeRequest($fp, filesize($file), $mime);
+ } else {
+ http_status(500);
+ print "Could not read $file - bad permissions?";
+ }
}
/**
@@ -148,43 +150,43 @@ function sendFile($file,$mime,$dl,$cache){
*
* @author Gerry Weissbach <gerry.w@gammaproduction.de>
* @param $media reference to the media id
- * @param $file reference to the file variable
+ * @param $file reference to the file variable
* @returns array(STATUS, STATUSMESSAGE)
*/
-function checkFileStatus(&$media, &$file, $rev='') {
- global $MIME, $EXT, $CACHE, $INPUT;
-
- //media to local file
- if(preg_match('#^(https?)://#i',$media)){
- //check hash
- if(substr(md5(auth_cookiesalt().$media),0,6) !== $INPUT->str('hash')){
- return array( 412, 'Precondition Failed');
- }
- //handle external images
- if(strncmp($MIME,'image/',6) == 0) $file = media_get_from_URL($media,$EXT,$CACHE);
- if(!$file){
- //download failed - redirect to original URL
- return array( 302, $media );
- }
- }else{
- $media = cleanID($media);
- if(empty($media)){
- return array( 400, 'Bad request' );
+function checkFileStatus(&$media, &$file, $rev = '') {
+ global $MIME, $EXT, $CACHE, $INPUT;
+
+ //media to local file
+ if(preg_match('#^(https?)://#i', $media)) {
+ //check hash
+ if(substr(md5(auth_cookiesalt().$media), 0, 6) !== $INPUT->str('hash')) {
+ return array(412, 'Precondition Failed');
+ }
+ //handle external images
+ if(strncmp($MIME, 'image/', 6) == 0) $file = media_get_from_URL($media, $EXT, $CACHE);
+ if(!$file) {
+ //download failed - redirect to original URL
+ return array(302, $media);
+ }
+ } else {
+ $media = cleanID($media);
+ if(empty($media)) {
+ return array(400, 'Bad request');
+ }
+
+ //check permissions (namespace only)
+ if(auth_quickaclcheck(getNS($media).':X') < AUTH_READ) {
+ return array(403, 'Forbidden');
+ }
+ $file = mediaFN($media, $rev);
}
- //check permissions (namespace only)
- if(auth_quickaclcheck(getNS($media).':X') < AUTH_READ){
- return array( 403, 'Forbidden' );
+ //check file existance
+ if(!@file_exists($file)) {
+ return array(404, 'Not Found');
}
- $file = mediaFN($media, $rev);
- }
-
- //check file existance
- if(!@file_exists($file)){
- return array( 404, 'Not Found' );
- }
- return array(200, null);
+ return array(200, null);
}
/**
@@ -194,12 +196,12 @@ function checkFileStatus(&$media, &$file, $rev='') {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function calc_cache($cache){
- global $conf;
+function calc_cache($cache) {
+ global $conf;
- if(strtolower($cache) == 'nocache') return 0; //never cache
- if(strtolower($cache) == 'recache') return $conf['cachetime']; //use standard cache
- return -1; //cache endless
+ if(strtolower($cache) == 'nocache') return 0; //never cache
+ if(strtolower($cache) == 'recache') return $conf['cachetime']; //use standard cache
+ return -1; //cache endless
}
//Setup VIM: ex: et ts=2 :
diff --git a/lib/exe/js.php b/lib/exe/js.php
index 41d3e735c..4ff48133e 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -62,7 +62,7 @@ function js_out(){
DOKU_INC.'lib/scripts/locktimer.js',
DOKU_INC.'lib/scripts/linkwiz.js',
DOKU_INC.'lib/scripts/media.js',
- DOKU_INC.'lib/scripts/compatibility.js',
+# deprecated DOKU_INC.'lib/scripts/compatibility.js',
# disabled for FS#1958 DOKU_INC.'lib/scripts/hotkeys.js',
DOKU_INC.'lib/scripts/behaviour.js',
DOKU_INC.'lib/scripts/page.js',
diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php
index 04dd178cc..53d438321 100644
--- a/lib/exe/mediamanager.php
+++ b/lib/exe/mediamanager.php
@@ -36,19 +36,16 @@
// do not display the manager if user does not have read access
if($AUTH < AUTH_READ && !$fullscreen) {
- header('HTTP/1.0 403 Forbidden');
+ http_status(403);
die($lang['accessdenied']);
}
- // create the given namespace (just for beautification)
- if($AUTH >= AUTH_UPLOAD) { io_createNamespace("$NS:xxx", 'media'); }
-
// handle flash upload
if(isset($_FILES['Filedata'])){
$_FILES['upload'] =& $_FILES['Filedata'];
$JUMPTO = media_upload($NS,$AUTH);
if($JUMPTO == false){
- header("HTTP/1.0 400 Bad Request");
+ http_status(400);
echo 'Upload failed';
}
echo 'ok';
diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php
index 5e6c197d0..c09daa17c 100644
--- a/lib/exe/xmlrpc.php
+++ b/lib/exe/xmlrpc.php
@@ -29,10 +29,10 @@ class dokuwiki_xmlrpc_server extends IXR_Server {
return $result;
} catch (RemoteAccessDeniedException $e) {
if (!isset($_SERVER['REMOTE_USER'])) {
- header('HTTP/1.1 401 Unauthorized');
+ http_status(401);
return new IXR_Error(-32603, "server error. not authorized to call method $methodname");
} else {
- header('HTTP/1.1 403 Forbidden');
+ http_status(403);
return new IXR_Error(-32604, "server error. forbidden to call the method $methodname");
}
} catch (RemoteException $e) {
diff --git a/lib/plugins/acl/script.js b/lib/plugins/acl/script.js
index 0ba91cdc9..c3763dc8d 100644
--- a/lib/plugins/acl/script.js
+++ b/lib/plugins/acl/script.js
@@ -117,11 +117,3 @@ var dw_acl = {
};
jQuery(dw_acl.init);
-
-var acl = {
- init: DEPRECATED_WRAP(dw_acl.init, dw_acl),
- userselhandler: DEPRECATED_WRAP(dw_acl.userselhandler, dw_acl),
- loadinfo: DEPRECATED_WRAP(dw_acl.loadinfo, dw_acl),
- parseatt: DEPRECATED_WRAP(dw_acl.parseatt, dw_acl),
- treehandler: DEPRECATED_WRAP(dw_acl.treehandler, dw_acl)
-};
diff --git a/lib/plugins/auth.php b/lib/plugins/auth.php
index 42dbf1859..c14a04dfb 100644
--- a/lib/plugins/auth.php
+++ b/lib/plugins/auth.php
@@ -434,6 +434,7 @@ class DokuWiki_Auth_Plugin extends DokuWiki_Plugin {
if(isset($conf['auth'][$plugin])) $oldconf = (array) $conf['auth'][$plugin];
$conf['plugin'][$plugin] = array_merge($default, $oldconf, $conf['plugin'][$plugin]);
+ $this->conf =& $conf['plugin'][$plugin];
$this->configloaded = true;
}
}
diff --git a/lib/plugins/config/settings/config.class.php b/lib/plugins/config/settings/config.class.php
index a3cfae9f8..4a84d6dc8 100644
--- a/lib/plugins/config/settings/config.class.php
+++ b/lib/plugins/config/settings/config.class.php
@@ -84,7 +84,7 @@ if (!class_exists('configuration')) {
array_shift($param);
} else {
$class = 'setting_undefined';
- $param = NULL;
+ $param = null;
}
if (!in_array($class, $no_default_check) && !isset($default[$key])) {
@@ -358,13 +358,13 @@ if (!class_exists('setting')) {
class setting {
var $_key = '';
- var $_default = NULL;
- var $_local = NULL;
- var $_protected = NULL;
+ var $_default = null;
+ var $_local = null;
+ var $_protected = null;
var $_pattern = '';
var $_error = false; // only used by those classes which error check
- var $_input = NULL; // only used by those classes which error check
+ var $_input = null; // only used by those classes which error check
var $_cautionList = array(
'basedir' => 'danger', 'baseurl' => 'danger', 'savedir' => 'danger', 'cookiedir' => 'danger', 'useacl' => 'danger', 'authtype' => 'danger', 'superuser' => 'danger', 'userewrite' => 'danger',
@@ -372,7 +372,7 @@ if (!class_exists('setting')) {
'allowdebug' => 'security', 'htmlok' => 'security', 'phpok' => 'security', 'iexssprotect' => 'security', 'xmlrpc' => 'security', 'fullpath' => 'security'
);
- function setting($key, $params=NULL) {
+ function setting($key, $params=null) {
$this->_key = $key;
if (is_array($params)) {
@@ -661,6 +661,7 @@ if (!class_exists('setting_email')) {
class setting_email extends setting_string {
var $_pattern = SETTING_EMAIL_PATTERN; // no longer required, retained for backward compatibility - FIXME, may not be necessary
var $_multiple = false;
+ var $_placeholders = false;
/**
* update setting with user provided value $input
@@ -674,15 +675,36 @@ if (!class_exists('setting_email')) {
$value = is_null($this->_local) ? $this->_default : $this->_local;
if ($value == $input) return false;
+ if($input === ''){
+ $this->_local = $input;
+ return true;
+ }
+ $mail = $input;
+
+ if($this->_placeholders){
+ // replace variables with pseudo values
+ $mail = str_replace('@USER@','joe',$mail);
+ $mail = str_replace('@NAME@','Joe Schmoe',$mail);
+ $mail = str_replace('@MAIL@','joe@example.com',$mail);
+ }
+ // multiple mail addresses?
if ($this->_multiple) {
- $mails = array_filter(array_map('trim', explode(',', $input)));
+ $mails = array_filter(array_map('trim', explode(',', $mail)));
} else {
- $mails = array($input);
+ $mails = array($mail);
}
+ // check them all
foreach ($mails as $mail) {
- if (!mail_isvalid($mail)) {
+ // only check the address part
+ if(preg_match('#(.*?)<(.*?)>#', $mail, $matches)){
+ $addr = $matches[2];
+ }else{
+ $addr = $mail;
+ }
+
+ if (!mail_isvalid($addr)) {
$this->_error = true;
$this->_input = $input;
return false;
@@ -695,46 +717,15 @@ if (!class_exists('setting_email')) {
}
}
+/**
+ * @deprecated 2013-02-16
+ */
if (!class_exists('setting_richemail')) {
class setting_richemail extends setting_email {
-
- /**
- * update setting with user provided value $input
- * if value fails error check, save it
- *
- * @return boolean true if changed, false otherwise (incl. on error)
- */
- function update($input) {
- if (is_null($input)) return false;
- if ($this->is_protected()) return false;
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- // replace variables with pseudo values
- $test = $input;
- $test = str_replace('@USER@','joe',$test);
- $test = str_replace('@NAME@','Joe Schmoe',$test);
- $test = str_replace('@MAIL@','joe@example.com',$test);
-
- // now only check the address part
- if(preg_match('#(.*?)<(.*?)>#',$test,$matches)){
- $text = trim($matches[1]);
- $addr = $matches[2];
- }else{
- $addr = $test;
- }
-
- if ($test !== '' && !mail_isvalid($addr)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
-
- $this->_local = $input;
- return true;
- }
-
+ function update($input) {
+ $this->_placeholders = true;
+ return parent::update($input);
+ }
}
}
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index 585015085..bdbc4311f 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -20,9 +20,7 @@
* 'numericopt' - like above, but accepts empty values
* 'onoff' - checkbox input, setting output 0|1
* 'multichoice' - select input (single choice), setting output with quotes, required _choices parameter
- * 'email' - text input, input must conform to email address format, setting output in quotes
- * 'richemail' - text input, input must conform to email address format but accepts variables and
- * emails with a real name prepended (when email address is given in <>)
+ * 'email' - text input, input must conform to email address format
* 'password' - password input, minimal input validation, setting output text in quotes, maybe encoded
* according to the _code parameter
* 'dirchoice' - as multichoice, selection choices based on folders found at location specified in _dir
@@ -129,7 +127,7 @@ $meta['_authentication'] = array('fieldset');
$meta['useacl'] = array('onoff');
$meta['autopasswd'] = array('onoff');
$meta['authtype'] = array('authtype');
-$meta['passcrypt'] = array('multichoice','_choices' => array('smd5','md5','apr1','sha1','ssha','lsmd5','crypt','mysql','my411','kmd5','pmd5','hmd5','mediawiki','bcrypt','sha512'));
+$meta['passcrypt'] = array('multichoice','_choices' => array('smd5','md5','apr1','sha1','ssha','lsmd5','crypt','mysql','my411','kmd5','pmd5','hmd5','mediawiki','bcrypt','djangomd5','djangosha1','sha512'));
$meta['defaultgroup']= array('string');
$meta['superuser'] = array('string');
$meta['manager'] = array('string');
@@ -177,8 +175,8 @@ $meta['_notifications'] = array('fieldset');
$meta['subscribers'] = array('onoff');
$meta['subscribe_time'] = array('numeric');
$meta['notify'] = array('email', '_multiple' => true);
-$meta['registernotify'] = array('email');
-$meta['mailfrom'] = array('richemail');
+$meta['registernotify'] = array('email', '_multiple' => true);
+$meta['mailfrom'] = array('email', '_placeholders' => true);
$meta['mailprefix'] = array('string');
$meta['htmlmail'] = array('onoff');
diff --git a/lib/plugins/config/style.css b/lib/plugins/config/style.css
index 397328937..054021ed8 100644
--- a/lib/plugins/config/style.css
+++ b/lib/plugins/config/style.css
@@ -154,15 +154,6 @@
}
-/* IE6 correction */
-* html #config__manager .selection label {
- padding-top: 2px;
-}
-
-#config__manager .selection input.checkbox {
- padding-left: 0.7em;
-}
-
#config__manager .other {
clear: both;
padding-top: 0.5em;
diff --git a/lib/plugins/info/plugin.info.txt b/lib/plugins/info/plugin.info.txt
index 5c7d583c0..053743639 100644
--- a/lib/plugins/info/plugin.info.txt
+++ b/lib/plugins/info/plugin.info.txt
@@ -1,7 +1,7 @@
base info
author Andreas Gohr
email andi@splitbrain.org
-date 2012-02-04
+date 2013-02-16
name Info Plugin
desc Displays information about various DokuWiki internals
url http://dokuwiki.org/plugin:info
diff --git a/lib/plugins/info/syntax.php b/lib/plugins/info/syntax.php
index d813aa23a..97b28076b 100644
--- a/lib/plugins/info/syntax.php
+++ b/lib/plugins/info/syntax.php
@@ -60,9 +60,6 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
if($format == 'xhtml'){
//handle various info stuff
switch ($data[0]){
- case 'version':
- $renderer->doc .= getVersion();
- break;
case 'syntaxmodes':
$renderer->doc .= $this->_syntaxmodes_xhtml();
break;
diff --git a/lib/plugins/plugin/lang/ar/lang.php b/lib/plugins/plugin/lang/ar/lang.php
index 8327e5ce3..a1a778131 100644
--- a/lib/plugins/plugin/lang/ar/lang.php
+++ b/lib/plugins/plugin/lang/ar/lang.php
@@ -50,4 +50,4 @@ $lang['enabled'] = 'الاضافة %s فُعلت. ';
$lang['notenabled'] = 'تعذر تفعيل الاضافة %s، تحقق من اذونات الملف.';
$lang['disabled'] = 'عُطلت الإضافة %s.';
$lang['notdisabled'] = 'تعذر تعطيل الإضافة %s، تحقق من اذونات الملف.';
-$lang['packageinstalled'] = 'حزمة الإضافة (%d plugin(s): %Xs) ثبتت بنجاج.';
+$lang['packageinstalled'] = 'حزمة الإضافة (%d plugin(s): %s) ثبتت بنجاج.';
diff --git a/lib/plugins/plugin/lang/hi/lang.php b/lib/plugins/plugin/lang/hi/lang.php
index ab29c6550..67b177256 100644
--- a/lib/plugins/plugin/lang/hi/lang.php
+++ b/lib/plugins/plugin/lang/hi/lang.php
@@ -6,7 +6,6 @@
* @author yndesai@gmail.com
*/
$lang['unknown'] = 'अज्ञात';
-$lang['deleted'] = 'मिटाया हुआ';
$lang['date'] = 'दिनांक:';
$lang['author'] = 'लेखक:';
$lang['error'] = 'अज्ञात त्रुटि हुइ';
diff --git a/lib/plugins/plugin/lang/pl/lang.php b/lib/plugins/plugin/lang/pl/lang.php
index 1d3bbbc03..faaa69630 100644
--- a/lib/plugins/plugin/lang/pl/lang.php
+++ b/lib/plugins/plugin/lang/pl/lang.php
@@ -60,4 +60,4 @@ $lang['enabled'] = 'Wtyczka %s włączona.';
$lang['notenabled'] = 'Nie udało się uruchomić wtyczki %s, sprawdź uprawnienia dostępu do plików.';
$lang['disabled'] = 'Wtyczka %s wyłączona.';
$lang['notdisabled'] = 'Nie udało się wyłączyć wtyczki %s, sprawdź uprawnienia dostępu do plików.';
-$lang['packageinstalled'] = 'Pakiet wtyczek (%d wtyczki:% s) zainstalowany pomyślnie.';
+$lang['packageinstalled'] = 'Pakiet wtyczek (%d wtyczki: %s) zainstalowany pomyślnie.';
diff --git a/lib/plugins/plugin/lang/zh-tw/lang.php b/lib/plugins/plugin/lang/zh-tw/lang.php
index 7b38a02c8..56149e79e 100644
--- a/lib/plugins/plugin/lang/zh-tw/lang.php
+++ b/lib/plugins/plugin/lang/zh-tw/lang.php
@@ -56,4 +56,4 @@ $lang['enabled'] = '附加元件 %s 已啟用。';
$lang['notenabled'] = '附加元件 %s 無法啟用,請檢查檔案權限。';
$lang['disabled'] = '附加元件 %s 已停用。';
$lang['notdisabled'] = '附加元件 %s 無法停用,請檢查檔案權限。';
-$lang['packageinstalled'] = '附加元件 (%d 附加元件%s: %s) 已安裝好。';
+$lang['packageinstalled'] = '附加元件 (%d 附加元件: %s) 已安裝好。';
diff --git a/lib/plugins/usermanager/lang/ca-valencia/lang.php b/lib/plugins/usermanager/lang/ca-valencia/lang.php
index 5b0c628ed..c39c2f9b3 100644
--- a/lib/plugins/usermanager/lang/ca-valencia/lang.php
+++ b/lib/plugins/usermanager/lang/ca-valencia/lang.php
@@ -33,7 +33,7 @@ $lang['delete_ok'] = '%d usuaris borrats';
$lang['delete_fail'] = 'Erro borrant %d.';
$lang['update_ok'] = 'Usuari actualisat correctament';
$lang['update_fail'] = 'Erro actualisant usuari';
-$lang['update_exists'] = 'Erro canviant el nom de l\'usuari, el nom d\'usuari que ha donat ya existix (els demés canvis s\'aplicaran).';
+$lang['update_exists'] = 'Erro canviant el nom de l\'usuari (%s), el nom d\'usuari que ha donat ya existix (els demés canvis s\'aplicaran).';
$lang['start'] = 'primera';
$lang['prev'] = 'anterior';
$lang['next'] = 'següent';
diff --git a/lib/scripts/linkwiz.js b/lib/scripts/linkwiz.js
index bb04828b4..c55650d68 100644
--- a/lib/scripts/linkwiz.js
+++ b/lib/scripts/linkwiz.js
@@ -50,6 +50,9 @@ var dw_linkwiz = {
jQuery(dw_linkwiz.result).css('position', 'relative');
dw_linkwiz.$entry = jQuery('#link__wiz_entry');
+ if(JSINFO.namespace){
+ dw_linkwiz.$entry.val(JSINFO.namespace+':');
+ }
// attach event handlers
jQuery('#link__wiz .ui-dialog-titlebar-close').click(dw_linkwiz.hide);
@@ -102,7 +105,7 @@ var dw_linkwiz = {
/**
* Get one of the results by index
*
- * @param int result div to return
+ * @param num int result div to return
* @returns DOMObject or null
*/
getResult: function(num){
@@ -113,7 +116,7 @@ var dw_linkwiz = {
/**
* Get one of the results by index
*
- * @param int result div to return
+ * @param num int result div to return
* @returns jQuery object
*/
$getResult: function(num) {
diff --git a/lib/scripts/qsearch.js b/lib/scripts/qsearch.js
index 0c3609ada..e5cc73b49 100644
--- a/lib/scripts/qsearch.js
+++ b/lib/scripts/qsearch.js
@@ -12,6 +12,7 @@ var dw_qsearch = {
$inObj: null,
$outObj: null,
timer: null,
+ curRequest: null,
/**
* initialize the quick search
@@ -35,12 +36,16 @@ var dw_qsearch = {
// attach eventhandler to search field
do_qsearch = function () {
+ // abort any previous request
+ if (dw_qsearch.curRequest != null) {
+ dw_qsearch.curRequest.abort();
+ }
var value = dw_qsearch.$inObj.val();
if (value === '') {
dw_qsearch.clear_results();
return;
}
- jQuery.post(
+ dw_qsearch.curRequest = jQuery.post(
DOKU_BASE + 'lib/exe/ajax.php',
{
call: 'qsearch',
@@ -84,6 +89,8 @@ var dw_qsearch = {
onCompletion: function(data) {
var max, $links, too_big;
+ dw_qsearch.curRequest = null;
+
if (data === '') {
dw_qsearch.clear_results();
return;
diff --git a/lib/tpl/dokuwiki/css/_edit.css b/lib/tpl/dokuwiki/css/_edit.css
index 0c66c75b7..92ce62126 100644
--- a/lib/tpl/dokuwiki/css/_edit.css
+++ b/lib/tpl/dokuwiki/css/_edit.css
@@ -13,7 +13,6 @@
.dokuwiki div.toolbar {
margin-bottom: .5em;
- overflow: hidden;
}
#draft__status {
float: right;
diff --git a/lib/tpl/dokuwiki/script.js b/lib/tpl/dokuwiki/script.js
index 3ed8dbabe..375500f78 100644
--- a/lib/tpl/dokuwiki/script.js
+++ b/lib/tpl/dokuwiki/script.js
@@ -1,11 +1,10 @@
/**
* We handle several device classes based on browser width.
- * see http://twitter.github.com/bootstrap/scaffolding.html#responsive
*
- * - desktop: 980+
- * - mobile: < 980
- * - tablet 481 - 979 (ostensibly for tablets in portrait mode)
- * - phone <= 480
+ * - desktop: > __tablet_width__ (as set in style.ini)
+ * - mobile:
+ * - tablet <= __tablet_width__
+ * - phone <= __phone_width__
*/
var device_class = ''; // not yet known
var device_classes = 'desktop mobile tablet phone';