diff options
Diffstat (limited to 'inc')
-rw-r--r-- | inc/DifferenceEngine.php | 10 | ||||
-rw-r--r-- | inc/HTTPClient.php | 466 | ||||
-rw-r--r-- | inc/Input.class.php | 5 | ||||
-rw-r--r-- | inc/JpegMeta.php | 2 | ||||
-rw-r--r-- | inc/Mailer.class.php | 4 | ||||
-rw-r--r-- | inc/PassHash.class.php | 2 | ||||
-rw-r--r-- | inc/auth.php | 29 | ||||
-rw-r--r-- | inc/config_cascade.php | 2 | ||||
-rw-r--r-- | inc/html.php | 60 | ||||
-rw-r--r-- | inc/lang/bg/lang.php | 8 | ||||
-rw-r--r-- | inc/lang/bg/mailtext.txt | 2 | ||||
-rw-r--r-- | inc/lang/bg/mailwrap.html | 13 | ||||
-rw-r--r-- | inc/lang/de-informal/lang.php | 21 | ||||
-rw-r--r-- | inc/lang/de-informal/mailwrap.html | 13 | ||||
-rw-r--r-- | inc/lang/de-informal/resetpwd.txt | 4 | ||||
-rw-r--r-- | inc/lang/de/lang.php | 1 | ||||
-rw-r--r-- | inc/lang/de/mailwrap.html | 13 | ||||
-rw-r--r-- | inc/lang/ru/lang.php | 4 | ||||
-rw-r--r-- | inc/lang/ru/resetpwd.txt | 3 | ||||
-rw-r--r-- | inc/media.php | 4 | ||||
-rw-r--r-- | inc/pageutils.php | 24 | ||||
-rw-r--r-- | inc/parser/xhtml.php | 22 | ||||
-rw-r--r-- | inc/template.php | 28 |
23 files changed, 456 insertions, 284 deletions
diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php index 0a7ce8e7c..1b68cf6d3 100644 --- a/inc/DifferenceEngine.php +++ b/inc/DifferenceEngine.php @@ -1039,8 +1039,8 @@ class TableDiffFormatter extends DiffFormatter { // Preserve whitespaces by converting some to non-breaking spaces. // Do not convert all of them to allow word-wrap. $val = parent::format($diff); - $val = str_replace(' ',' ', $val); - $val = preg_replace('/ (?=<)|(?<=[ >]) /', ' ', $val); + $val = str_replace(' ','  ', $val); + $val = preg_replace('/ (?=<)|(?<=[ >]) /', ' ', $val); return $val; } @@ -1078,7 +1078,7 @@ class TableDiffFormatter extends DiffFormatter { } function emptyLine() { - return '<td colspan="2"> </td>'; + return '<td colspan="2"> </td>'; } function contextLine($line) { @@ -1132,8 +1132,8 @@ class InlineDiffFormatter extends DiffFormatter { // Preserve whitespaces by converting some to non-breaking spaces. // Do not convert all of them to allow word-wrap. $val = parent::format($diff); - $val = str_replace(' ',' ', $val); - $val = preg_replace('/ (?=<)|(?<=[ >]) /', ' ', $val); + $val = str_replace(' ','  ', $val); + $val = preg_replace('/ (?=<)|(?<=[ >]) /', ' ', $val); return $val; } diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php index 26bee52a7..a25846c31 100644 --- a/inc/HTTPClient.php +++ b/inc/HTTPClient.php @@ -61,6 +61,8 @@ class DokuHTTPClient extends HTTPClient { } +class HTTPClientException extends Exception { } + /** * This class implements a basic HTTP client * @@ -227,7 +229,7 @@ class HTTPClient { $path = $uri['path']; if(empty($path)) $path = '/'; if(!empty($uri['query'])) $path .= '?'.$uri['query']; - if(isset($uri['port']) && !empty($uri['port'])) $port = $uri['port']; + if(!empty($uri['port'])) $port = $uri['port']; if(isset($uri['user'])) $this->user = $uri['user']; if(isset($uri['pass'])) $this->pass = $uri['pass']; @@ -249,7 +251,7 @@ class HTTPClient { // prepare headers $headers = $this->headers; $headers['Host'] = $uri['host']; - if($uri['port']) $headers['Host'].= ':'.$uri['port']; + if(!empty($uri['port'])) $headers['Host'].= ':'.$uri['port']; $headers['User-Agent'] = $this->agent; $headers['Referer'] = $this->referer; if ($this->keep_alive) { @@ -279,16 +281,13 @@ class HTTPClient { $headers['Proxy-Authorization'] = 'Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass); } - // stop time - $start = time(); - // already connected? $connectionId = $this->_uniqueConnectionId($server,$port); - $this->_debug('connection pool', $this->connections); + $this->_debug('connection pool', self::$connections); $socket = null; - if (isset($this->connections[$connectionId])) { + if (isset(self::$connections[$connectionId])) { $this->_debug('reusing connection', $connectionId); - $socket = $this->connections[$connectionId]; + $socket = self::$connections[$connectionId]; } if (is_null($socket) || feof($socket)) { $this->_debug('opening connection', $connectionId); @@ -302,222 +301,161 @@ class HTTPClient { // keep alive? if ($this->keep_alive) { - $this->connections[$connectionId] = $socket; + self::$connections[$connectionId] = $socket; } else { - unset($this->connections[$connectionId]); - } - } - - //set blocking - stream_set_blocking($socket,1); - - // build request - $request = "$method $request_url HTTP/".$this->http.HTTP_NL; - $request .= $this->_buildHeaders($headers); - $request .= $this->_getCookies(); - $request .= HTTP_NL; - $request .= $data; - - $this->_debug('request',$request); - - // select parameters - $sel_r = null; - $sel_w = array($socket); - $sel_e = null; - - // send request - $towrite = strlen($request); - $written = 0; - while($written < $towrite){ - // check timeout - if(time()-$start > $this->timeout){ - $this->status = -100; - $this->error = sprintf('Timeout while sending request (%.3fs)',$this->_time() - $this->start); - unset($this->connections[$connectionId]); - return false; - } - - // wait for stream ready or timeout (1sec) - if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){ - usleep(1000); - continue; - } - - // write to stream - $ret = fwrite($socket, substr($request,$written,4096)); - if($ret === false){ - $this->status = -100; - $this->error = 'Failed writing to socket'; - unset($this->connections[$connectionId]); - return false; + unset(self::$connections[$connectionId]); } - $written += $ret; } - // continue non-blocking - stream_set_blocking($socket,0); - - // read headers from socket - $r_headers = ''; - do{ - if(time()-$start > $this->timeout){ - $this->status = -100; - $this->error = sprintf('Timeout while reading headers (%.3fs)',$this->_time() - $this->start); - unset($this->connections[$connectionId]); - return false; - } - if(feof($socket)){ - $this->error = 'Premature End of File (socket)'; - unset($this->connections[$connectionId]); - return false; - } - usleep(1000); - $r_headers .= fgets($socket,1024); - }while(!preg_match('/\r?\n\r?\n$/',$r_headers)); - - $this->_debug('response headers',$r_headers); - - // check if expected body size exceeds allowance - if($this->max_bodysize && preg_match('/\r?\nContent-Length:\s*(\d+)\r?\n/i',$r_headers,$match)){ - if($match[1] > $this->max_bodysize){ - $this->error = 'Reported content length exceeds allowed response size'; - if ($this->max_bodysize_abort) - unset($this->connections[$connectionId]); - return false; + try { + //set non-blocking + stream_set_blocking($socket, false); + + // build request + $request = "$method $request_url HTTP/".$this->http.HTTP_NL; + $request .= $this->_buildHeaders($headers); + $request .= $this->_getCookies(); + $request .= HTTP_NL; + $request .= $data; + + $this->_debug('request',$request); + $this->_sendData($socket, $request, 'request'); + + // read headers from socket + $r_headers = ''; + do{ + $r_line = $this->_readLine($socket, 'headers'); + $r_headers .= $r_line; + }while($r_line != "\r\n" && $r_line != "\n"); + + $this->_debug('response headers',$r_headers); + + // check if expected body size exceeds allowance + if($this->max_bodysize && preg_match('/\r?\nContent-Length:\s*(\d+)\r?\n/i',$r_headers,$match)){ + if($match[1] > $this->max_bodysize){ + if ($this->max_bodysize_abort) + throw new HTTPClientException('Reported content length exceeds allowed response size'); + else + $this->error = 'Reported content length exceeds allowed response size'; + } } - } - // get Status - if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) { - $this->error = 'Server returned bad answer'; - unset($this->connections[$connectionId]); - return false; - } - $this->status = $m[2]; - - // handle headers and cookies - $this->resp_headers = $this->_parseHeaders($r_headers); - if(isset($this->resp_headers['set-cookie'])){ - foreach ((array) $this->resp_headers['set-cookie'] as $cookie){ - list($cookie) = explode(';',$cookie,2); - list($key,$val) = explode('=',$cookie,2); - $key = trim($key); - if($val == 'deleted'){ - if(isset($this->cookies[$key])){ - unset($this->cookies[$key]); + // get Status + if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) + throw new HTTPClientException('Server returned bad answer'); + + $this->status = $m[2]; + + // handle headers and cookies + $this->resp_headers = $this->_parseHeaders($r_headers); + if(isset($this->resp_headers['set-cookie'])){ + foreach ((array) $this->resp_headers['set-cookie'] as $cookie){ + list($cookie) = explode(';',$cookie,2); + list($key,$val) = explode('=',$cookie,2); + $key = trim($key); + if($val == 'deleted'){ + if(isset($this->cookies[$key])){ + unset($this->cookies[$key]); + } + }elseif($key){ + $this->cookies[$key] = $val; } - }elseif($key){ - $this->cookies[$key] = $val; } } - } - - $this->_debug('Object headers',$this->resp_headers); - // check server status code to follow redirect - if($this->status == 301 || $this->status == 302 ){ - // close the connection because we don't handle content retrieval here - // that's the easiest way to clean up the connection - fclose($socket); - unset($this->connections[$connectionId]); + $this->_debug('Object headers',$this->resp_headers); - if (empty($this->resp_headers['location'])){ - $this->error = 'Redirect but no Location Header found'; - return false; - }elseif($this->redirect_count == $this->max_redirect){ - $this->error = 'Maximum number of redirects exceeded'; - return false; - }else{ - $this->redirect_count++; - $this->referer = $url; - // handle non-RFC-compliant relative redirects - if (!preg_match('/^http/i', $this->resp_headers['location'])){ - if($this->resp_headers['location'][0] != '/'){ - $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port']. - dirname($uri['path']).'/'.$this->resp_headers['location']; - }else{ - $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port']. - $this->resp_headers['location']; + // check server status code to follow redirect + if($this->status == 301 || $this->status == 302 ){ + if (empty($this->resp_headers['location'])){ + throw new HTTPClientException('Redirect but no Location Header found'); + }elseif($this->redirect_count == $this->max_redirect){ + throw new HTTPClientException('Maximum number of redirects exceeded'); + }else{ + // close the connection because we don't handle content retrieval here + // that's the easiest way to clean up the connection + fclose($socket); + unset(self::$connections[$connectionId]); + + $this->redirect_count++; + $this->referer = $url; + // handle non-RFC-compliant relative redirects + if (!preg_match('/^http/i', $this->resp_headers['location'])){ + if($this->resp_headers['location'][0] != '/'){ + $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port']. + dirname($uri['path']).'/'.$this->resp_headers['location']; + }else{ + $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port']. + $this->resp_headers['location']; + } } + // perform redirected request, always via GET (required by RFC) + return $this->sendRequest($this->resp_headers['location'],array(),'GET'); } - // perform redirected request, always via GET (required by RFC) - return $this->sendRequest($this->resp_headers['location'],array(),'GET'); } - } - // check if headers are as expected - if($this->header_regexp && !preg_match($this->header_regexp,$r_headers)){ - $this->error = 'The received headers did not match the given regexp'; - unset($this->connections[$connectionId]); - return false; - } + // check if headers are as expected + if($this->header_regexp && !preg_match($this->header_regexp,$r_headers)) + throw new HTTPClientException('The received headers did not match the given regexp'); - //read body (with chunked encoding if needed) - $r_body = ''; - if(preg_match('/transfer\-(en)?coding:\s*chunked\r\n/i',$r_headers)){ - do { - unset($chunk_size); + //read body (with chunked encoding if needed) + $r_body = ''; + if((isset($this->resp_headers['transfer-encoding']) && $this->resp_headers['transfer-encoding'] == 'chunked') + || (isset($this->resp_headers['transfer-coding']) && $this->resp_headers['transfer-coding'] == 'chunked')){ + $abort = false; do { - if(feof($socket)){ - $this->error = 'Premature End of File (socket)'; - unset($this->connections[$connectionId]); - return false; + $chunk_size = ''; + while (preg_match('/^[a-zA-Z0-9]?$/',$byte=$this->_readData($socket,1,'chunk'))){ + // read chunksize until \r + $chunk_size .= $byte; + if (strlen($chunk_size) > 128) // set an abritrary limit on the size of chunks + throw new HTTPClientException('Allowed response size exceeded'); } - if(time()-$start > $this->timeout){ - $this->status = -100; - $this->error = sprintf('Timeout while reading chunk (%.3fs)',$this->_time() - $this->start); - unset($this->connections[$connectionId]); - return false; + $this->_readLine($socket, 'chunk'); // readtrailing \n + $chunk_size = hexdec($chunk_size); + + if($this->max_bodysize && $chunk_size+strlen($r_body) > $this->max_bodysize){ + if ($this->max_bodysize_abort) + throw new HTTPClientException('Allowed response size exceeded'); + $this->error = 'Allowed response size exceeded'; + $chunk_size = $this->max_bodysize - strlen($r_body); + $abort = true; } - $byte = fread($socket,1); - $chunk_size .= $byte; - } while (preg_match('/[a-zA-Z0-9]/',$byte)); // read chunksize including \r - - $byte = fread($socket,1); // readtrailing \n - $chunk_size = hexdec($chunk_size); - if ($chunk_size) { - $this_chunk = fread($socket,$chunk_size); - $r_body .= $this_chunk; - $byte = fread($socket,2); // read trailing \r\n - } - if($this->max_bodysize && strlen($r_body) > $this->max_bodysize){ - $this->error = 'Allowed response size exceeded'; - if ($this->max_bodysize_abort){ - unset($this->connections[$connectionId]); - return false; - } else { - break; + if ($chunk_size > 0) { + $r_body .= $this->_readData($socket, $chunk_size, 'chunk'); + $byte = $this->_readData($socket, 2, 'chunk'); // read trailing \r\n } - } - } while ($chunk_size); - }else{ - // read entire socket - while (!feof($socket)) { - if(time()-$start > $this->timeout){ - $this->status = -100; - $this->error = sprintf('Timeout while reading response (%.3fs)',$this->_time() - $this->start); - unset($this->connections[$connectionId]); - return false; - } - $r_body .= fread($socket,4096); - $r_size = strlen($r_body); - if($this->max_bodysize && $r_size > $this->max_bodysize){ - $this->error = 'Allowed response size exceeded'; + } 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); + if(strlen($r_body) > $this->max_bodysize){ if ($this->max_bodysize_abort) { - unset($this->connections[$connectionId]); - return false; + throw new HTTPClientException('Allowed response size exceeded'); } else { - break; + $this->error = 'Allowed response size exceeded'; } } - if(isset($this->resp_headers['content-length']) && - !isset($this->resp_headers['transfer-encoding']) && - $this->resp_headers['content-length'] == $r_size){ - // we read the content-length, finish here - break; + }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) { + $this->error = $err->getMessage(); + if ($err->getCode()) + $this->status = $err->getCode(); + unset(self::$connections[$connectionId]); + fclose($socket); + return false; } if (!$this->keep_alive || @@ -525,7 +463,7 @@ class HTTPClient { // close socket $status = socket_get_status($socket); fclose($socket); - unset($this->connections[$connectionId]); + unset(self::$connections[$connectionId]); } // decode gzip if needed @@ -547,6 +485,126 @@ 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 + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + function _sendData($socket, $data, $message) { + // select parameters + $sel_r = null; + $sel_w = array($socket); + $sel_e = null; + + // send request + $towrite = strlen($data); + $written = 0; + while($written < $towrite){ + // check timeout + $time_used = $this->_time() - $this->start; + if($time_used > $this->timeout) + throw new HTTPClientException(sprintf('Timeout while sending %s (%.3fs)',$message, $time_used), -100); + if(feof($socket)) + throw new HTTPClientException("Socket disconnected while writing $message"); + + // wait for stream ready or timeout + self::selecttimeout($this->timeout - $time_used, $sec, $usec); + if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){ + // write to stream + $nbytes = fwrite($socket, substr($data,$written,4096)); + if($nbytes === false) + throw new HTTPClientException("Failed writing to socket while sending $message", -100); + $written += $nbytes; + } + } + } + + /** + * Safely read data from a socket + * + * 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 + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + function _readData($socket, $nbytes, $message, $ignore_eof = false) { + // select parameters + $sel_r = array($socket); + $sel_w = null; + $sel_e = null; + + $r_data = ''; + // Does not return immediately so timeout and eof can be checked + if ($nbytes < 0) $nbytes = 0; + $to_read = $nbytes; + do { + $time_used = $this->_time() - $this->start; + if ($time_used > $this->timeout) + throw new HTTPClientException( + sprintf('Timeout while reading %s (%.3fs)', $message, $time_used), + -100); + if(feof($socket)) { + if(!$ignore_eof) + throw new HTTPClientException("Premature End of File (socket) while reading $message"); + break; + } + + if ($to_read > 0) { + // wait for stream ready or timeout + self::selecttimeout($this->timeout - $time_used, $sec, $usec); + if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){ + $bytes = fread($socket, $to_read); + if($bytes === false) + throw new HTTPClientException("Failed reading from socket while reading $message", -100); + $r_data .= $bytes; + $to_read -= strlen($bytes); + } + } + } while ($to_read > 0 && strlen($r_data) < $nbytes); + return $r_data; + } + + /** + * Safely read a \n-terminated line from a socket + * + * 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 + * @author Tom N Harris <tnharris@whoopdedo.org> + */ + function _readLine($socket, $message) { + // select parameters + $sel_r = array($socket); + $sel_w = null; + $sel_e = null; + + $r_data = ''; + do { + $time_used = $this->_time() - $this->start; + if ($time_used > $this->timeout) + throw new HTTPClientException( + sprintf('Timeout while reading %s (%.3fs)', $message, $time_used), + -100); + if(feof($socket)) + throw new HTTPClientException("Premature End of File (socket) while reading $message"); + + // wait for stream ready or timeout + self::selecttimeout($this->timeout - $time_used, $sec, $usec); + if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){ + $r_data = fgets($socket, 1024); + } + } while (!preg_match('/\n$/',$r_data)); + return $r_data; + } + + /** * print debug info * * @author Andreas Gohr <andi@splitbrain.org> @@ -566,12 +624,20 @@ class HTTPClient { /** * Return current timestamp in microsecond resolution */ - function _time(){ + static function _time(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } /** + * Calculate seconds and microseconds + */ + static function selecttimeout($time, &$sec, &$usec){ + $sec = floor($time); + $usec = (int)(($time - $sec) * 1000000); + } + + /** * convert given header string to Header array * * All Keys are lowercased. @@ -583,7 +649,7 @@ class HTTPClient { $lines = explode("\n",$string); array_shift($lines); //skip first line (status) foreach($lines as $line){ - list($key, $val) = explode(':',$line,2); + @list($key, $val) = explode(':',$line,2); $key = trim($key); $val = trim($val); $key = strtolower($key); diff --git a/inc/Input.class.php b/inc/Input.class.php index 1ea5e031f..f4174404a 100644 --- a/inc/Input.class.php +++ b/inc/Input.class.php @@ -118,6 +118,7 @@ class Input { public function int($name, $default = 0, $nonempty = false) { if(!isset($this->access[$name])) return $default; if(is_array($this->access[$name])) return $default; + if($this->access[$name] === '') return $default; if($nonempty && empty($this->access[$name])) return $default; return (int) $this->access[$name]; @@ -151,6 +152,8 @@ class Input { */ public function bool($name, $default = false, $nonempty = false) { if(!isset($this->access[$name])) return $default; + if(is_array($this->access[$name])) return $default; + if($this->access[$name] === '') return $default; if($nonempty && empty($this->access[$name])) return $default; return (bool) $this->access[$name]; @@ -223,4 +226,4 @@ class GetInput extends Input { parent::set($name, $value); $_REQUEST[$name] = $value; } -}
\ No newline at end of file +} diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php index 5c043fb6b..ac29bca66 100644 --- a/inc/JpegMeta.php +++ b/inc/JpegMeta.php @@ -2972,7 +2972,7 @@ class JpegMeta { elseif ($c == 62) $ascii .= '>'; elseif ($c == 32) - $ascii .= ' '; + $ascii .= ' '; elseif ($c > 32) $ascii .= chr($c); else diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php index fccf1dad9..c85e61395 100644 --- a/inc/Mailer.class.php +++ b/inc/Mailer.class.php @@ -132,8 +132,8 @@ class Mailer { public function setHeader($header, $value, $clean = true) { $header = str_replace(' ', '-', ucwords(strtolower(str_replace('-', ' ', $header)))); // streamline casing if($clean) { - $header = preg_replace('/[^\w \-\.\+\@]+/', '', $header); - $value = preg_replace('/[^\w \-\.\+\@<>]+/', '', $value); + $header = preg_replace('/[^a-zA-Z0-9_ \-\.\+\@]+/', '', $header); + $value = preg_replace('/[^a-zA-Z0-9_ \-\.\+\@<>]+/', '', $value); } // empty value deletes diff --git a/inc/PassHash.class.php b/inc/PassHash.class.php index f85766723..13be479cc 100644 --- a/inc/PassHash.class.php +++ b/inc/PassHash.class.php @@ -132,7 +132,7 @@ class PassHash { public function hash_smd5($clear, $salt = null) { $this->init_salt($salt, 8); - if(defined('CRYPT_MD5') && CRYPT_MD5) { + if(defined('CRYPT_MD5') && CRYPT_MD5 && $salt !== '') { return crypt($clear, '$1$'.$salt.'$'); } else { // Fall back to PHP-only implementation diff --git a/inc/auth.php b/inc/auth.php index d0f21c825..cedfdee36 100644 --- a/inc/auth.php +++ b/inc/auth.php @@ -123,23 +123,33 @@ function auth_setup() { */ function auth_loadACL() { global $config_cascade; + global $USERINFO; if(!is_readable($config_cascade['acl']['default'])) return array(); $acl = file($config_cascade['acl']['default']); //support user wildcard - if(isset($_SERVER['REMOTE_USER'])) { - $len = count($acl); - for($i = 0; $i < $len; $i++) { - if($acl[$i]{0} == '#') continue; - list($id, $rest) = preg_split('/\s+/', $acl[$i], 2); - $id = str_replace('%USER%', cleanID($_SERVER['REMOTE_USER']), $id); - $rest = str_replace('%USER%', auth_nameencode($_SERVER['REMOTE_USER']), $rest); - $acl[$i] = "$id\t$rest"; + $out = array(); + foreach($acl as $line) { + $line = trim($line); + if($line{0} == '#') continue; + list($id,$rest) = preg_split('/\s+/',$line,2); + + if(strstr($line, '%GROUP%')){ + foreach((array) $USERINFO['grps'] as $grp){ + $nid = str_replace('%GROUP%',cleanID($grp),$id); + $nrest = str_replace('%GROUP%','@'.auth_nameencode($grp),$rest); + $out[] = "$nid\t$nrest"; + } + } else { + $id = str_replace('%USER%',cleanID($_SERVER['REMOTE_USER']),$id); + $rest = str_replace('%USER%',auth_nameencode($_SERVER['REMOTE_USER']),$rest); + $out[] = "$id\t$rest"; } } - return $acl; + + return $out; } /** @@ -632,6 +642,7 @@ function auth_nameencode($name, $skip_group = false) { // never encode wildcard FS#1955 if($name == '%USER%') return $name; + if($name == '%GROUP%') return $name; if(!isset($cache[$name][$skip_group])) { if($skip_group && $name{0} == '@') { diff --git a/inc/config_cascade.php b/inc/config_cascade.php index e4a3df353..e1ab0eead 100644 --- a/inc/config_cascade.php +++ b/inc/config_cascade.php @@ -50,6 +50,8 @@ $config_cascade = array_merge( ), 'userstyle' => array( 'screen' => DOKU_CONF.'userstyle.css', + // @deprecated 2012-04-09: rtl will cease to be a mode of its own, + // please use "[dir=rtl]" in any css file in all, screen or print mode instead 'rtl' => DOKU_CONF.'userrtl.css', 'print' => DOKU_CONF.'userprint.css', 'feed' => DOKU_CONF.'userfeed.css', diff --git a/inc/html.php b/inc/html.php index 08b051f40..505474e0d 100644 --- a/inc/html.php +++ b/inc/html.php @@ -230,12 +230,12 @@ function html_show($txt=null){ //PreviewHeader echo '<br id="scroll__here" />'; echo p_locale_xhtml('preview'); - echo '<div class="preview">'; + echo '<div class="preview"><div class="pad">'; $html = html_secedit(p_render('xhtml',p_get_instructions($txt),$info),$secedit); if($INFO['prependTOC']) $html = tpl_toc(true).$html; echo $html; echo '<div class="clearer"></div>'; - echo '</div>'; + echo '</div></div>'; }else{ if ($REV) print p_locale_xhtml('showrev'); @@ -327,11 +327,11 @@ function html_search(){ flush(); //show progressbar - print '<div class="centeralign" id="dw__loading">'.NL; - print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL; + print '<div id="dw__loading">'.NL; + print '<script type="text/javascript"><!--//--><![CDATA[//><!--'.NL; print 'showLoadBar();'.NL; print '//--><!]]></script>'.NL; - print '<br /></div>'.NL; + print '</div>'.NL; flush(); //do quick pagesearch @@ -367,26 +367,30 @@ function html_search(){ //do fulltext search $data = ft_pageSearch($QUERY,$regex); if(count($data)){ + print '<dl class="search_results">'; $num = 1; foreach($data as $id => $cnt){ - print '<div class="search_result">'; + print '<dt>'; print html_wikilink(':'.$id,useHeading('navigation')?null:$id,$regex); if($cnt !== 0){ - print ': <span class="search_cnt">'.$cnt.' '.$lang['hits'].'</span><br />'; + print ': '.$cnt.' '.$lang['hits'].''; + } + print '</dt>'; + if($cnt !== 0){ if($num < FT_SNIPPET_NUMBER){ // create snippets for the first number of matches only - print '<div class="search_snippet">'.ft_snippet($id,$regex).'</div>'; + print '<dd>'.ft_snippet($id,$regex).'</dd>'; } $num++; } - print '</div>'; flush(); } + print '</dl>'; }else{ print '<div class="nothing">'.$lang['nothingfound'].'</div>'; } //hide progressbar - print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL; + print '<script type="text/javascript"><!--//--><![CDATA[//><!--'.NL; print 'hideLoadBar("dw__loading");'.NL; print '//--><!]]></script>'.NL; flush(); @@ -453,7 +457,7 @@ function html_revisions($first=0, $media_id = false){ if (!$media_id) print p_locale_xhtml('revisions'); - $params = array('id' => 'page__revisions'); + $params = array('id' => 'page__revisions', 'class' => 'changes'); if ($media_id) $params['action'] = media_managerURL(array('image' => $media_id), '&'); $form = new Doku_Form($params); @@ -491,7 +495,7 @@ function html_revisions($first=0, $media_id = false){ if (!$media_id) { $form->addElement(form_makeOpenTag('span', array('class' => 'sum'))); - $form->addElement(' – '); + $form->addElement(' – '); $form->addElement(htmlspecialchars($INFO['sum'])); $form->addElement(form_makeCloseTag('span')); } @@ -570,7 +574,7 @@ function html_revisions($first=0, $media_id = false){ if ($info['sum']) { $form->addElement(form_makeOpenTag('span', array('class' => 'sum'))); - if (!$media_id) $form->addElement(' – '); + if (!$media_id) $form->addElement(' – '); $form->addElement(htmlspecialchars($info['sum'])); $form->addElement(form_makeCloseTag('span')); } @@ -668,12 +672,13 @@ function html_recent($first=0, $show_changes='both'){ if (getNS($ID) != '') print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>'; - $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET')); + $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET', 'class' => 'changes')); $form->addHidden('sectok', null); $form->addHidden('do', 'recent'); $form->addHidden('id', $ID); if ($conf['mediarevisions']) { + $form->addElement('<div class="changeType">'); $form->addElement(form_makeListboxField( 'show_changes', array( @@ -686,6 +691,7 @@ function html_recent($first=0, $show_changes='both'){ array('class'=>'quickselect'))); $form->addElement(form_makeButton('submit', 'recent', $lang['btn_apply'])); + $form->addElement('</div>'); } $form->addElement(form_makeOpenTag('ul')); @@ -760,7 +766,7 @@ function html_recent($first=0, $show_changes='both'){ $form->addElement(html_wikilink(':'.$recent['id'],useHeading('navigation')?null:$recent['id'])); } $form->addElement(form_makeOpenTag('span', array('class' => 'sum'))); - $form->addElement(' – '.htmlspecialchars($recent['sum'])); + $form->addElement(' – '.htmlspecialchars($recent['sum'])); $form->addElement(form_makeCloseTag('span')); $form->addElement(form_makeOpenTag('span', array('class' => 'user'))); @@ -1389,7 +1395,7 @@ function html_edit(){ } $form->addHidden('target', $data['target']); - $form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar'))); + $form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar', 'class'=>'editBar'))); $form->addElement(form_makeOpenTag('div', array('id'=>'size__ctl'))); $form->addElement(form_makeCloseTag('div')); if ($wr) { @@ -1417,17 +1423,16 @@ function html_edit(){ if ($wr) { // sets changed to true when previewed - echo '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'. NL; + echo '<script type="text/javascript"><!--//--><![CDATA[//><!--'. NL; echo 'textChanged = ' . ($mod ? 'true' : 'false'); echo '//--><!]]></script>' . NL; } ?> - <div style="width:99%;"> + <div class="editBox"> <div class="toolbar"> - <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> - + <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> </div> <?php @@ -1721,11 +1726,11 @@ function html_TOC($toc){ if(!count($toc)) return ''; global $lang; $out = '<!-- TOC START -->'.DOKU_LF; - $out .= '<div class="toc">'.DOKU_LF; - $out .= '<div class="tocheader toctoggle" id="toc__header">'; + $out .= '<div id="dw__toc">'.DOKU_LF; + $out .= '<h3 class="toggle">'; $out .= $lang['toc']; - $out .= '</div>'.DOKU_LF; - $out .= '<div id="toc__inside">'.DOKU_LF; + $out .= '</h3>'.DOKU_LF; + $out .= '<div>'.DOKU_LF; $out .= html_buildlist($toc,'toc','html_list_toc','html_li_default',true); $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF; $out .= '<!-- TOC END -->'.DOKU_LF; @@ -1742,8 +1747,7 @@ function html_list_toc($item){ $link = $item['link']; } - return '<span class="li"><a href="'.$link.'" class="toc">'. - hsc($item['title']).'</a></span>'; + return '<a href="'.$link.'">'.hsc($item['title']).'</a>'; } /** diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php index 7a246024d..562dc78b3 100644 --- a/inc/lang/bg/lang.php +++ b/inc/lang/bg/lang.php @@ -9,8 +9,8 @@ */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; -$lang['doublequoteopening'] = '“'; //“ -$lang['doublequoteclosing'] = '”'; //” +$lang['doublequoteopening'] = '"'; //“ +$lang['doublequoteclosing'] = '"'; //” $lang['singlequoteopening'] = '‘'; //‘ $lang['singlequoteclosing'] = '’'; //’ $lang['apostrophe'] = '’'; //’ @@ -98,6 +98,7 @@ $lang['searchmedia_in'] = 'Търсене в %s'; $lang['txt_upload'] = 'Изберете файл за качване'; $lang['txt_filename'] = 'Качи като (незадължително)'; $lang['txt_overwrt'] = 'Презапиши съществуващите файлове'; +$lang['maxuploadsize'] = 'Макс. размер за отделните файлове е %s.'; $lang['lockedby'] = 'В момента е заключена от'; $lang['lockexpire'] = 'Ще бъде отключена на'; @@ -161,7 +162,7 @@ $lang['deletefail'] = '"%s" не може да бъде изтрит $lang['mediainuse'] = 'Файлът "%s" не бе изтрит - все още се ползва.'; $lang['namespaces'] = 'Именни пространства'; $lang['mediafiles'] = 'Налични файлове в'; -$lang['accessdenied'] = 'Нямате разрешение да преглеждате страницата.'; +$lang['accessdenied'] = 'Нямате необходимите права за преглеждане на страницата.'; $lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:'; $lang['mediaview'] = 'Преглед на оригиналния файл'; $lang['mediaroot'] = 'root'; @@ -290,7 +291,6 @@ $lang['i_superuser'] = 'Супер потребител'; $lang['i_problems'] = 'Открити са проблеми, които възпрепятстват инсталирането. Ще можете да продължите след като отстраните долуизброените проблеми.'; $lang['i_modified'] = 'Поради мерки за сигурност инсталаторът работи само с нови и непроменени инсталационни файлове. Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталиране на Dokuwiki</a>.'; - $lang['i_funcna'] = 'PHP функцията <code>%s</code> не е достъпна. Може би е забранена от доставчика на хостинг.'; $lang['i_phpver'] = 'Инсталираната версия <code>%s</code> на PHP е по-стара от необходимата <code>%s</code>. Актуализирайте PHP инсталацията.'; $lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!'; diff --git a/inc/lang/bg/mailtext.txt b/inc/lang/bg/mailtext.txt index ad0024a8d..a5f0cbd92 100644 --- a/inc/lang/bg/mailtext.txt +++ b/inc/lang/bg/mailtext.txt @@ -1,4 +1,4 @@ -Страница във DokuWiki е добавена или променена. Ето детайлите: +Страница в DokuWiki е добавена или променена. Ето детайлите: Дата : @DATE@ Браузър : @BROWSER@ diff --git a/inc/lang/bg/mailwrap.html b/inc/lang/bg/mailwrap.html new file mode 100644 index 000000000..26b0a1e6a --- /dev/null +++ b/inc/lang/bg/mailwrap.html @@ -0,0 +1,13 @@ +<html> +<head> + <title>@TITLE@</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +</head> +<body> + +@HTMLBODY@ + +<br /><hr /> +<small>Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@.</small> +</body> +</html> diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php index 61e5ef3d8..37469522f 100644 --- a/inc/lang/de-informal/lang.php +++ b/inc/lang/de-informal/lang.php @@ -16,7 +16,7 @@ * @author Alexander Fischer <tbanus@os-forge.net> * @author Juergen Schwarzer <jschwarzer@freenet.de> * @author Marcel Metz <marcel_metz@gmx.de> - * @author Matthias Schulte <mailinglist@lupo49.de> + * @author Matthias Schulte <dokuwiki@lupo49.de> * @author Christian Wichmann <nospam@zone0.de> * @author Pierre Corell <info@joomla-praxis.de> */ @@ -104,6 +104,7 @@ $lang['searchmedia_in'] = 'Suche in %s'; $lang['txt_upload'] = 'Datei zum Hochladen auswählen'; $lang['txt_filename'] = 'Hochladen als (optional)'; $lang['txt_overwrt'] = 'Bestehende Datei überschreiben'; +$lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.'; $lang['lockedby'] = 'Momentan gesperrt von'; $lang['lockexpire'] = 'Sperre läuft ab am'; $lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, solltest du sie durch einen Klick auf den Vorschau-Knopf verlängern.'; @@ -196,6 +197,11 @@ $lang['external_edit'] = 'Externe Bearbeitung'; $lang['summary'] = 'Zusammenfassung'; $lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.'; $lang['download'] = 'Download-Teil'; +$lang['tools'] = 'Werkzeuge'; +$lang['user_tools'] = 'Benutzer-Werkzeuge'; +$lang['site_tools'] = 'Webseiten-Werkzeuge'; +$lang['page_tools'] = 'Seiten-Werkzeuge'; +$lang['skip_to_content'] = 'zum Inhalt springen'; $lang['mail_newpage'] = 'Neue Seite:'; $lang['mail_changed'] = 'Seite geändert:'; $lang['mail_subscribe_list'] = 'Seite hat sich im Namespace geändert:'; @@ -248,13 +254,13 @@ $lang['img_keywords'] = 'Schlagwörter'; $lang['img_width'] = 'Breite'; $lang['img_height'] = 'Höhe'; $lang['img_manager'] = 'Im Medien-Manager anzeigen'; -$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementenliste von %s hinzugefügt'; -$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementenliste von %s'; +$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementliste von %s hinzugefügt'; +$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementliste von %s'; $lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden'; -$lang['subscr_unsubscribe_success'] = 'Die Seite %s wurde von der Abonnementenliste von %s entfernt'; -$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementenliste von %s'; -$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementenliste von %s'; -$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementenliste von %s'; +$lang['subscr_unsubscribe_success'] = 'Die Seite %s wurde von der Abonnementliste von %s entfernt'; +$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementliste von %s'; +$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementliste von %s'; +$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementliste von %s'; $lang['subscr_m_not_subscribed'] = 'Du hast kein Abonnement von dieser Seite oder dem Namensraum.'; $lang['subscr_m_new_header'] = 'Abonnementen hinzufügen'; $lang['subscr_m_current_header'] = 'Aktive Abonnements'; @@ -266,6 +272,7 @@ $lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Se $lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)'; $lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wende dich an den Admin.'; $lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wende dich an den Admin.'; +$lang['authpwdexpire'] = 'Dein Passwort läuft in %d Tag(en) ab, du solltest es es bald ändern.'; $lang['i_chooselang'] = 'Wähle deine Sprache'; $lang['i_installer'] = 'DokuWiki-Installation'; $lang['i_wikiname'] = 'Wiki-Name'; diff --git a/inc/lang/de-informal/mailwrap.html b/inc/lang/de-informal/mailwrap.html new file mode 100644 index 000000000..420fdf83e --- /dev/null +++ b/inc/lang/de-informal/mailwrap.html @@ -0,0 +1,13 @@ +<html> +<head> + <title>@TITLE@</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +</head> +<body> + +@HTMLBODY@ + +<br /><hr /> +<small>Diese Mail kommt vom DokuWiki auf @DOKUWIKIURL@.</small> +</body> +</html> diff --git a/inc/lang/de-informal/resetpwd.txt b/inc/lang/de-informal/resetpwd.txt new file mode 100644 index 000000000..8423bd801 --- /dev/null +++ b/inc/lang/de-informal/resetpwd.txt @@ -0,0 +1,4 @@ +====== Neues Passwort setzen ====== + +Bitte gib ein neues Passwort für deinen Wiki-Zugang ein. + diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php index cfbe04396..4ea75157b 100644 --- a/inc/lang/de/lang.php +++ b/inc/lang/de/lang.php @@ -106,6 +106,7 @@ $lang['searchmedia_in'] = 'Suche in %s'; $lang['txt_upload'] = 'Datei zum Hochladen auswählen'; $lang['txt_filename'] = 'Hochladen als (optional)'; $lang['txt_overwrt'] = 'Bestehende Datei überschreiben'; +$lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.'; $lang['lockedby'] = 'Momentan gesperrt von'; $lang['lockexpire'] = 'Sperre läuft ab am'; $lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, sollten Sie sie durch einen Klick auf den Vorschau-Knopf verlängern.'; diff --git a/inc/lang/de/mailwrap.html b/inc/lang/de/mailwrap.html new file mode 100644 index 000000000..420fdf83e --- /dev/null +++ b/inc/lang/de/mailwrap.html @@ -0,0 +1,13 @@ +<html> +<head> + <title>@TITLE@</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +</head> +<body> + +@HTMLBODY@ + +<br /><hr /> +<small>Diese Mail kommt vom DokuWiki auf @DOKUWIKIURL@.</small> +</body> +</html> diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php index 94af441b7..4c3d26b1d 100644 --- a/inc/lang/ru/lang.php +++ b/inc/lang/ru/lang.php @@ -55,6 +55,7 @@ $lang['btn_backtomedia'] = 'Вернуться к выбору медиа $lang['btn_subscribe'] = 'Подписаться (все правки)'; $lang['btn_profile'] = 'Профиль'; $lang['btn_reset'] = 'Сброс'; +$lang['btn_resendpwd'] = 'Установить новый пароль'; $lang['btn_draft'] = 'Править черновик'; $lang['btn_recover'] = 'Восстановить черновик'; $lang['btn_draftdel'] = 'Удалить черновик'; @@ -91,6 +92,7 @@ $lang['profnoempty'] = 'Логин и адрес электронно $lang['profchanged'] = 'Профиль пользователя успешно обновлён.'; $lang['pwdforget'] = 'Забыли пароль? Получите новый'; $lang['resendna'] = 'Данная вики не поддерживает повторную отправку пароля.'; +$lang['resendpwd'] = 'Установить новый пароль для'; $lang['resendpwdmissing'] = 'Вы должны заполнить все поля формы.'; $lang['resendpwdnouser'] = 'Пользователь с таким логином не обнаружен в нашей базе данных.'; $lang['resendpwdbadauth'] = 'Извините, неверный код авторизации. Убедитесь, что вы полностью скопировали ссылку. '; @@ -103,6 +105,7 @@ $lang['searchmedia_in'] = 'Поиск в %s'; $lang['txt_upload'] = 'Выберите файл для загрузки'; $lang['txt_filename'] = 'Введите имя файла в вики (необязательно)'; $lang['txt_overwrt'] = 'Перезаписать существующий файл'; +$lang['maxuploadsize'] = 'Максимальный размер загружаемого файла %s'; $lang['lockedby'] = 'В данный момент заблокирован'; $lang['lockexpire'] = 'Блокировка истекает в'; $lang['js']['willexpire'] = 'Ваша блокировка этой страницы на редактирование истекает в течении минуты.\nЧтобы предотвратить конфликты используйте кнопку "Просмотр" для сброса таймера блокировки.'; @@ -270,6 +273,7 @@ $lang['subscr_style_digest'] = 'сводка изменений по кажд $lang['subscr_style_list'] = 'перечислять изменившиеся страницы с прошлого уведомления'; $lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом своему администратору вики.'; $lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.'; +$lang['authpwdexpire'] = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее'; $lang['i_chooselang'] = 'Выберите свой язык/Choose your language'; $lang['i_installer'] = 'Установка «ДокуВики»'; $lang['i_wikiname'] = 'Название вики'; diff --git a/inc/lang/ru/resetpwd.txt b/inc/lang/ru/resetpwd.txt new file mode 100644 index 000000000..81a46a7d3 --- /dev/null +++ b/inc/lang/ru/resetpwd.txt @@ -0,0 +1,3 @@ +====== Установка нового пароля ====== + +Пожалуйста введите новый пароль для вашей учетной записи для этой вики. diff --git a/inc/media.php b/inc/media.php index 6c92225ff..4bca2e71a 100644 --- a/inc/media.php +++ b/inc/media.php @@ -1452,7 +1452,7 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false $size .= (int) $item['meta']->getField('File.Height'); echo '<dd class="size">'.$size.'</dd>'.NL; } else { - echo '<dd class="size"> </dd>'.NL; + echo '<dd class="size"> </dd>'.NL; } $date = dformat($item['mtime']); echo '<dd class="date">'.$date.'</dd>'.NL; @@ -1737,7 +1737,7 @@ function media_nstree_li($item){ if($item['open']){ $class .= ' open'; $img = DOKU_BASE.'lib/images/minus.gif'; - $alt = '−'; + $alt = '−'; }else{ $class .= ' closed'; $img = DOKU_BASE.'lib/images/plus.gif'; diff --git a/inc/pageutils.php b/inc/pageutils.php index 95f791364..5e741c491 100644 --- a/inc/pageutils.php +++ b/inc/pageutils.php @@ -623,3 +623,27 @@ function utf8_decodeFN($file){ return urldecode($file); } +/** + * Find a page in the current namespace (determined from $ID) or any + * higher namespace + * + * Used for sidebars, but can be used other stuff as well + * + * @todo add event hook + * @param string $page the pagename you're looking for + * @return string|false the full page id of the found page, false if any + */ +function page_findnearest($page){ + global $ID; + + $ns = $ID; + do { + $ns = getNS($ns); + $pageid = ltrim("$ns:$page",':'); + if(page_exists($pageid)){ + return $pageid; + } + } while($ns); + + return false; +} diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php index 4345b494f..2f09dbd4f 100644 --- a/inc/parser/xhtml.php +++ b/inc/parser/xhtml.php @@ -109,7 +109,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // open the footnote and set the anchor and backlink $this->doc .= '<div class="fn">'; - $this->doc .= '<sup><a href="#fnt__'.$id.'" id="fn__'.$id.'" name="fn__'.$id.'" class="fn_bot">'; + $this->doc .= '<sup><a href="#fnt__'.$id.'" id="fn__'.$id.'" class="fn_bot">'; $this->doc .= $id.')</a></sup> '.DOKU_LF; // get any other footnotes that use the same markup @@ -118,7 +118,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { if (count($alt)) { foreach ($alt as $ref) { // set anchor and backlink for the other footnotes - $this->doc .= ', <sup><a href="#fnt__'.($ref+1).'" id="fn__'.($ref+1).'" name="fn__'.($ref+1).'" class="fn_bot">'; + $this->doc .= ', <sup><a href="#fnt__'.($ref+1).'" id="fn__'.($ref+1).'" class="fn_bot">'; $this->doc .= ($ref+1).')</a></sup> '.DOKU_LF; } } @@ -181,9 +181,9 @@ class Doku_Renderer_xhtml extends Doku_Renderer { if ($level <= $conf['maxseclevel']) { $this->doc .= ' class="' . $this->startSectionEdit($pos, 'section', $text) . '"'; } - $this->doc .= '><a name="'.$hid.'" id="'.$hid.'">'; + $this->doc .= ' id="'.$hid.'">'; $this->doc .= $this->_xmlEntities($text); - $this->doc .= "</a></h$level>".DOKU_LF; + $this->doc .= "</h$level>".DOKU_LF; } function section_open($level) { @@ -316,7 +316,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } // output the footnote reference and link - $this->doc .= '<sup><a href="#fn__'.$id.'" name="fnt__'.$id.'" id="fnt__'.$id.'" class="fn_top">'.$id.')</a></sup>'; + $this->doc .= '<sup><a href="#fn__'.$id.'" id="fnt__'.$id.'" class="fn_top">'.$id.')</a></sup>'; } function listu_open() { @@ -471,8 +471,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $title = $this->_xmlEntities($this->acronyms[$acronym]); - $this->doc .= '<acronym title="'.$title - .'">'.$this->_xmlEntities($acronym).'</acronym>'; + $this->doc .= '<abbr title="'.$title + .'">'.$this->_xmlEntities($acronym).'</abbr>'; } else { $this->doc .= $this->_xmlEntities($acronym); @@ -483,7 +483,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { if ( array_key_exists($smiley, $this->smileys) ) { $title = $this->_xmlEntities($this->smileys[$smiley]); $this->doc .= '<img src="'.DOKU_BASE.'lib/images/smileys/'.$this->smileys[$smiley]. - '" class="middle" alt="'. + '" class="icon" alt="'. $this->_xmlEntities($smiley).'" />'; } else { $this->doc .= $this->_xmlEntities($smiley); @@ -549,7 +549,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { global $ID; $name = $this->_getLinkTitle($name, $hash, $isImage); $hash = $this->_headerToLink($hash); - $title = $ID.' ↵'; + $title = $ID.' ↵'; $this->doc .= '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">'; $this->doc .= $name; $this->doc .= '</a>'; @@ -1075,10 +1075,6 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $ret .= '<img src="'.ml($src,array('w'=>$width,'h'=>$height,'cache'=>$cache)).'"'; $ret .= ' class="media'.$align.'"'; - // make left/right alignment for no-CSS view work (feeds) - if($align == 'right') $ret .= ' align="right"'; - if($align == 'left') $ret .= ' align="left"'; - if ($title) { $ret .= ' title="' . $title . '"'; $ret .= ' alt="' . $title .'"'; diff --git a/inc/template.php b/inc/template.php index d007f47ef..76d4d4bbe 100644 --- a/inc/template.php +++ b/inc/template.php @@ -354,12 +354,8 @@ function tpl_metaheaders($alt=true){ } // load stylesheets - $head['link'][] = array('rel'=>'stylesheet', 'media'=>'screen', 'type'=>'text/css', + $head['link'][] = array('rel'=>'stylesheet', 'type'=>'text/css', 'href'=>DOKU_BASE.'lib/exe/css.php?t='.$conf['template'].'&tseed='.$tseed); - $head['link'][] = array('rel'=>'stylesheet', 'media'=>'all', 'type'=>'text/css', - 'href'=>DOKU_BASE.'lib/exe/css.php?s=all&t='.$conf['template'].'&tseed='.$tseed); - $head['link'][] = array('rel'=>'stylesheet', 'media'=>'print', 'type'=>'text/css', - 'href'=>DOKU_BASE.'lib/exe/css.php?s=print&t='.$conf['template'].'&tseed='.$tseed); // make $INFO and other vars available to JavaScripts $json = new JSON(); @@ -596,7 +592,7 @@ function tpl_get_action($type) { $accesskey = 'x'; break; case 'top': - $accesskey = 'x'; + $accesskey = 't'; $params = array(); $id = '#dokuwiki__top'; break; @@ -718,7 +714,7 @@ function tpl_searchform($ajax=true,$autocomplete=true){ * * @author Andreas Gohr <andi@splitbrain.org> */ -function tpl_breadcrumbs($sep='•'){ +function tpl_breadcrumbs($sep='•'){ global $lang; global $conf; @@ -761,7 +757,7 @@ function tpl_breadcrumbs($sep='•'){ * @author <fredrik@averpil.com> * @todo May behave strangely in RTL languages */ -function tpl_youarehere($sep=' » '){ +function tpl_youarehere($sep=' » '){ global $conf; global $ID; global $lang; @@ -847,7 +843,7 @@ function tpl_pageinfo($ret=false){ if($INFO['exists']){ $out = ''; $out .= $fn; - $out .= ' · '; + $out .= ' · '; $out .= $lang['lastmod']; $out .= ': '; $out .= $date; @@ -858,7 +854,7 @@ function tpl_pageinfo($ret=false){ $out .= ' ('.$lang['external_edit'].')'; } if($INFO['locked']){ - $out .= ' · '; + $out .= ' · '; $out .= $lang['lockedby']; $out .= ': '; $out .= editorinfo($INFO['locked']); @@ -1398,6 +1394,18 @@ function tpl_include_page($pageid,$print=true){ if(!$print) return $html; echo $html; + return $html; +} + +/** + * Include the sidebar, will check current namespaces first + */ +function tpl_sidebar($print=true){ + global $conf; + + $sidebar = page_findnearest($conf['sidebar']); + if($sidebar) return tpl_include_page($sidebar, $print); + return ''; } /** |