diff options
Diffstat (limited to 'inc')
-rw-r--r-- | inc/auth.php | 23 | ||||
-rw-r--r-- | inc/cliopts.php | 4 | ||||
-rw-r--r-- | inc/feedcreator.class.php | 56 | ||||
-rw-r--r-- | inc/html.php | 7 | ||||
-rw-r--r-- | inc/io.php | 190 | ||||
-rw-r--r-- | inc/lang/de/lang.php | 2 | ||||
-rw-r--r-- | inc/parser/renderer.php | 14 | ||||
-rw-r--r-- | inc/parser/xhtml.php | 87 | ||||
-rw-r--r-- | inc/remote.php | 2 | ||||
-rw-r--r-- | inc/template.php | 1 |
10 files changed, 261 insertions, 125 deletions
diff --git a/inc/auth.php b/inc/auth.php index 60b8c7c78..e04a6ca1a 100644 --- a/inc/auth.php +++ b/inc/auth.php @@ -739,28 +739,23 @@ function auth_aclcheck_cb($data) { $user = utf8_strtolower($user); $groups = array_map('utf8_strtolower', $groups); } - $user = $auth->cleanUser($user); + $user = auth_nameencode($auth->cleanUser($user)); $groups = array_map(array($auth, 'cleanGroup'), (array) $groups); - $user = auth_nameencode($user); //prepend groups with @ and nameencode - $cnt = count($groups); - for($i = 0; $i < $cnt; $i++) { - $groups[$i] = '@'.auth_nameencode($groups[$i]); + foreach($groups as &$group) { + $group = '@'.auth_nameencode($group); } $ns = getNS($id); $perm = -1; - if($user || count($groups)) { - //add ALL group - $groups[] = '@ALL'; - //add User - if($user) $groups[] = $user; - } else { - $groups[] = '@ALL'; - } - + //add ALL group + $groups[] = '@ALL'; + + //add User + if($user) $groups[] = $user; + //check exact match first $matches = preg_grep('/^'.preg_quote($id, '/').'[ \t]+([^ \t]+)[ \t]+/', $AUTH_ACL); if(count($matches)) { diff --git a/inc/cliopts.php b/inc/cliopts.php index 7d71c7dc9..d7d06119a 100644 --- a/inc/cliopts.php +++ b/inc/cliopts.php @@ -447,7 +447,7 @@ class Doku_Cli_Opts_Error { var $code; var $msg; - function Doku_Cli_Opts_Error($code, $msg) { + function __construct($code, $msg) { $this->code = $code; $this->msg = $msg; } @@ -468,7 +468,7 @@ class Doku_Cli_Opts_Container { var $options = array(); var $args = array(); - function Doku_Cli_Opts_Container($options) { + function __construct($options) { foreach ( $options[0] as $option ) { if ( false !== ( strpos($option[0], '--') ) ) { $opt_name = substr($option[0], 2); diff --git a/inc/feedcreator.class.php b/inc/feedcreator.class.php index b90da5724..fe444b39b 100644 --- a/inc/feedcreator.class.php +++ b/inc/feedcreator.class.php @@ -129,6 +129,9 @@ class FeedItem extends HtmlDescribable { // var $source; } +/** + * Class EnclosureItem + */ class EnclosureItem extends HtmlDescribable { /* * @@ -226,7 +229,7 @@ class FeedHtmlField { * Creates a new instance of FeedHtmlField. * @param string $parFieldContent: if given, sets the rawFieldContent property */ - function FeedHtmlField($parFieldContent) { + function __construct($parFieldContent) { if ($parFieldContent) { $this->rawFieldContent = $parFieldContent; } @@ -482,6 +485,8 @@ class FeedCreator extends HtmlDescribable { var $additionalElements = Array(); + var $_timeout; + /** * Adds an FeedItem to the feed. * @@ -505,7 +510,7 @@ class FeedCreator extends HtmlDescribable { * @param int $length the maximum length the string should be truncated to * @return string the truncated string */ - function iTrunc($string, $length) { + static function iTrunc($string, $length) { if (strlen($string)<=$length) { return $string; } @@ -604,6 +609,8 @@ class FeedCreator extends HtmlDescribable { /** * @since 1.4 * @access private + * + * @param string $filename */ function _redirect($filename) { // attention, heavily-commented-out-area @@ -697,7 +704,7 @@ class FeedDate { * Accepts RFC 822, ISO 8601 date formats as well as unix time stamps. * @param mixed $dateString optional the date this FeedDate will represent. If not specified, the current date and time is used. */ - function FeedDate($dateString="") { + function __construct($dateString="") { if ($dateString=="") $dateString = date("r"); if (is_numeric($dateString)) { @@ -878,7 +885,10 @@ class RSSCreator091 extends FeedCreator { */ var $RSSVersion; - function RSSCreator091() { + /** + * Constructor + */ + function __construct() { $this->_setRSSVersion("0.91"); $this->contentType = "application/rss+xml"; } @@ -886,6 +896,8 @@ class RSSCreator091 extends FeedCreator { /** * Sets this RSS feed's version number. * @access private + * + * @param $version */ function _setRSSVersion($version) { $this->RSSVersion = $version; @@ -1034,7 +1046,10 @@ class RSSCreator091 extends FeedCreator { */ class RSSCreator20 extends RSSCreator091 { - function RSSCreator20() { + /** + * Constructor + */ + function __construct() { parent::_setRSSVersion("2.0"); } @@ -1051,7 +1066,10 @@ class RSSCreator20 extends RSSCreator091 { */ class PIECreator01 extends FeedCreator { - function PIECreator01() { + /** + * Constructor + */ + function __construct() { $this->encoding = "utf-8"; } @@ -1113,7 +1131,10 @@ class PIECreator01 extends FeedCreator { */ class AtomCreator10 extends FeedCreator { - function AtomCreator10() { + /** + * Constructor + */ + function __construct() { $this->contentType = "application/atom+xml"; $this->encoding = "utf-8"; } @@ -1200,7 +1221,10 @@ class AtomCreator10 extends FeedCreator { */ class AtomCreator03 extends FeedCreator { - function AtomCreator03() { + /** + * Constructor + */ + function __construct() { $this->contentType = "application/atom+xml"; $this->encoding = "utf-8"; } @@ -1272,12 +1296,19 @@ class AtomCreator03 extends FeedCreator { * @author Kai Blankenhorn <kaib@bitfolge.de> */ class MBOXCreator extends FeedCreator { - - function MBOXCreator() { + /** + * Constructor + */ + function __construct() { $this->contentType = "text/plain"; $this->encoding = "utf-8"; } + /** + * @param string $input + * @param int $line_max + * @return string + */ function qp_enc($input = "", $line_max = 76) { $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); $lines = preg_split("/(?:\r\n|\r|\n)/", $input); @@ -1363,7 +1394,10 @@ class MBOXCreator extends FeedCreator { */ class OPMLCreator extends FeedCreator { - function OPMLCreator() { + /** + * Constructor + */ + function __construct() { $this->encoding = "utf-8"; } diff --git a/inc/html.php b/inc/html.php index 1ccc056de..0914a1762 100644 --- a/inc/html.php +++ b/inc/html.php @@ -2080,6 +2080,13 @@ function html_admin(){ $menu['config']['prompt'].'</a></div></li>'); } unset($menu['config']); + + if($menu['styling']){ + ptln(' <li class="admin_styling"><div class="li">'. + '<a href="'.wl($ID, array('do' => 'admin','page' => 'styling')).'">'. + $menu['styling']['prompt'].'</a></div></li>'); + } + unset($menu['styling']); } ptln('</ul>'); diff --git a/inc/io.php b/inc/io.php index 0636a4b62..704c5b1a6 100644 --- a/inc/io.php +++ b/inc/io.php @@ -107,13 +107,15 @@ function io_readFile($file,$clean=true){ $ret = ''; if(file_exists($file)){ if(substr($file,-3) == '.gz'){ - $ret = join('',gzfile($file)); + $ret = gzfile($file); + if(is_array($ret)) $ret = join('', $ret); }else if(substr($file,-4) == '.bz2'){ $ret = bzfile($file); }else{ $ret = file_get_contents($file); } } + if($ret === null) return false; if($ret !== false && $clean){ return cleanText($ret); }else{ @@ -127,22 +129,36 @@ function io_readFile($file,$clean=true){ * @author Andreas Gohr <andi@splitbrain.org> * * @param string $file filename - * @return string|bool content or false on error + * @param bool $array return array of lines + * @return string|array|bool content or false on error */ -function bzfile($file){ +function bzfile($file, $array=false) { $bz = bzopen($file,"r"); if($bz === false) return false; + if($array) $lines = array(); $str = ''; - while (!feof($bz)){ + while (!feof($bz)) { //8192 seems to be the maximum buffersize? $buffer = bzread($bz,8192); if(($buffer === false) || (bzerrno($bz) !== 0)) { return false; } $str = $str . $buffer; + if($array) { + $pos = strpos($str, "\n"); + while($pos !== false) { + $lines[] = substr($str, 0, $pos+1); + $str = substr($str, $pos+1); + $pos = strpos($str, "\n"); + } + } } bzclose($bz); + if($array) { + if($str !== '') $lines[] = $str; + return $lines; + } return $str; } @@ -191,13 +207,7 @@ function _io_writeWikiPage_action($data) { } /** - * Saves $content to $file. - * - * If the third parameter is set to true the given content - * will be appended. - * - * Uses gzip if extension is .gz - * and bz2 if extension is .bz2 + * Internal function to save contents to a file. * * @author Andreas Gohr <andi@splitbrain.org> * @@ -206,64 +216,97 @@ function _io_writeWikiPage_action($data) { * @param bool $append * @return bool true on success, otherwise false */ -function io_saveFile($file,$content,$append=false){ +function _io_saveFile($file, $content, $append) { global $conf; $mode = ($append) ? 'ab' : 'wb'; - $fileexists = file_exists($file); - io_makeFileDir($file); - io_lock($file); + if(substr($file,-3) == '.gz'){ $fh = @gzopen($file,$mode.'9'); - if(!$fh){ - msg("Writing $file failed",-1); - io_unlock($file); - return false; - } + if(!$fh) return false; gzwrite($fh, $content); gzclose($fh); }else if(substr($file,-4) == '.bz2'){ - $fh = @bzopen($file,$mode{0}); - if(!$fh){ - msg("Writing $file failed", -1); - io_unlock($file); - return false; + if($append) { + $bzcontent = bzfile($file); + if($bzcontent === false) return false; + $content = $bzcontent.$content; } + $fh = @bzopen($file,'w'); + if(!$fh) return false; bzwrite($fh, $content); bzclose($fh); }else{ $fh = @fopen($file,$mode); - if(!$fh){ - msg("Writing $file failed",-1); - io_unlock($file); - return false; - } + if(!$fh) return false; fwrite($fh, $content); fclose($fh); } if(!$fileexists and !empty($conf['fperm'])) chmod($file, $conf['fperm']); - io_unlock($file); return true; } /** - * Delete exact linematch for $badline from $file. + * Saves $content to $file. * - * Be sure to include the trailing newline in $badline + * If the third parameter is set to true the given content + * will be appended. * * Uses gzip if extension is .gz + * and bz2 if extension is .bz2 * - * 2005-10-14 : added regex option -- Christopher Smith <chris@jalakai.co.uk> + * @author Andreas Gohr <andi@splitbrain.org> * - * @author Steven Danz <steven-danz@kc.rr.com> + * @param string $file filename path to file + * @param string $content + * @param bool $append + * @return bool true on success, otherwise false + */ +function io_saveFile($file, $content, $append=false) { + io_makeFileDir($file); + io_lock($file); + if(!_io_saveFile($file, $content, $append)) { + msg("Writing $file failed",-1); + io_unlock($file); + return false; + } + io_unlock($file); + return true; +} + +/** + * Replace one or more occurrences of a line in a file. * - * @param string $file filename - * @param string $badline exact linematch to remove - * @param bool $regex use regexp? + * The default, when $maxlines is 0 is to delete all matching lines then append a single line. + * A regex that matches any part of the line will remove the entire line in this mode. + * Captures in $newline are not available. + * + * Otherwise each line is matched and replaced individually, up to the first $maxlines lines + * or all lines if $maxlines is -1. If $regex is true then captures can be used in $newline. + * + * Be sure to include the trailing newline in $oldline when replacing entire lines. + * + * Uses gzip if extension is .gz + * and bz2 if extension is .bz2 + * + * @author Steven Danz <steven-danz@kc.rr.com> + * @author Christopher Smith <chris@jalakai.co.uk> + * @author Patrick Brown <ptbrown@whoopdedo.org> + * + * @param string $file filename + * @param string $oldline exact linematch to remove + * @param string $newline new line to insert + * @param bool $regex use regexp? + * @param int $maxlines number of occurrences of the line to replace * @return bool true on success */ -function io_deleteFromFile($file,$badline,$regex=false){ +function io_replaceInFile($file, $oldline, $newline, $regex=false, $maxlines=0) { + if ((string)$oldline === '') { + trigger_error('$oldline parameter cannot be empty in io_replaceInFile()', E_USER_WARNING); + return false; + } + if (!file_exists($file)) return true; io_lock($file); @@ -271,41 +314,40 @@ function io_deleteFromFile($file,$badline,$regex=false){ // load into array if(substr($file,-3) == '.gz'){ $lines = gzfile($file); + }else if(substr($file,-4) == '.bz2'){ + $lines = bzfile($file, true); }else{ $lines = file($file); } - // remove all matching lines - if ($regex) { - $lines = preg_grep($badline,$lines,PREG_GREP_INVERT); - } else { - $pos = array_search($badline,$lines); //return null or false if not found - while(is_int($pos)){ - unset($lines[$pos]); - $pos = array_search($badline,$lines); + // make non-regexes into regexes + $pattern = $regex ? $oldline : '/^'.preg_quote($oldline,'/').'$/'; + $replace = $regex ? $newline : addcslashes($newline, '\$'); + + // remove matching lines + if ($maxlines > 0) { + $count = 0; + $matched = 0; + while (($count < $maxlines) && (list($i,$line) = each($lines))) { + // $matched will be set to 0|1 depending on whether pattern is matched and line replaced + $lines[$i] = preg_replace($pattern, $replace, $line, -1, $matched); + if ($matched) $count++; + } + } else if ($maxlines == 0) { + $lines = preg_grep($pattern, $lines, PREG_GREP_INVERT); + + if ((string)$newline !== ''){ + $lines[] = $newline; } + } else { + $lines = preg_replace($pattern, $replace, $lines); } if(count($lines)){ - $content = join('',$lines); - if(substr($file,-3) == '.gz'){ - $fh = @gzopen($file,'wb9'); - if(!$fh){ - msg("Removing content from $file failed",-1); - io_unlock($file); - return false; - } - gzwrite($fh, $content); - gzclose($fh); - }else{ - $fh = @fopen($file,'wb'); - if(!$fh){ - msg("Removing content from $file failed",-1); - io_unlock($file); - return false; - } - fwrite($fh, $content); - fclose($fh); + if(!_io_saveFile($file, join('',$lines), false)) { + msg("Removing content from $file failed",-1); + io_unlock($file); + return false; } }else{ @unlink($file); @@ -316,6 +358,22 @@ function io_deleteFromFile($file,$badline,$regex=false){ } /** + * Delete lines that match $badline from $file. + * + * Be sure to include the trailing newline in $badline + * + * @author Patrick Brown <ptbrown@whoopdedo.org> + * + * @param string $file filename + * @param string $badline exact linematch to remove + * @param bool $regex use regexp? + * @return bool true on success + */ +function io_deleteFromFile($file,$badline,$regex=false){ + return io_replaceInFile($file,$badline,null,$regex,0); +} + +/** * Tries to lock a file * * Locking is only done for io_savefile and uses directories diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php index b4ead79f2..c452042b6 100644 --- a/inc/lang/de/lang.php +++ b/inc/lang/de/lang.php @@ -2,7 +2,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) - * + * * @author Andreas Gohr <andi@splitbrain.org> * @author Christof <gagi@fin.de> * @author Anika Henke <anika@selfthinker.org> diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php index 35bdd0e3f..d7a3faef8 100644 --- a/inc/parser/renderer.php +++ b/inc/parser/renderer.php @@ -806,18 +806,26 @@ class Doku_Renderer extends DokuWiki_Plugin { $url = $this->interwiki[$shortcut]; } else { // Default to Google I'm feeling lucky - $url = 'http://www.google.com/search?q={URL}&btnI=lucky'; + $url = 'https://www.google.com/search?q={URL}&btnI=lucky'; $shortcut = 'go'; } //split into hash and url part - @list($reference, $hash) = explode('#', $reference, 2); + $hash = strrchr($reference, '#'); + if($hash) { + $reference = substr($reference, 0, -strlen($hash)); + $hash = substr($hash, 1); + } //replace placeholder if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#', $url)) { //use placeholders $url = str_replace('{URL}', rawurlencode($reference), $url); - $url = str_replace('{NAME}', $reference, $url); + //wiki names will be cleaned next, otherwise urlencode unsafe chars + $url = str_replace('{NAME}', ($url{0} === ':') ? $reference : + preg_replace_callback('/[[\\\\\]^`{|}#%]/', function($match) { + return rawurlencode($match[0]); + }, $reference), $url); $parsed = parse_url($reference); if(!$parsed['port']) $parsed['port'] = 80; $url = str_replace('{SCHEME}', $parsed['scheme'], $url); diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php index d1bf91a02..c544d9e32 100644 --- a/inc/parser/xhtml.php +++ b/inc/parser/xhtml.php @@ -761,27 +761,40 @@ class Doku_Renderer_xhtml extends Doku_Renderer { /** * Render a CamelCase link * - * @param string $link The link name + * @param string $link The link name + * @param bool $returnonly whether to return html or write to doc attribute * @see http://en.wikipedia.org/wiki/CamelCase */ - function camelcaselink($link) { - $this->internallink($link, $link); + function camelcaselink($link, $returnonly = false) { + if($returnonly) { + return $this->internallink($link, $link, null, true); + } else { + $this->internallink($link, $link); + } } /** * Render a page local link * - * @param string $hash hash link identifier - * @param string $name name for the link + * @param string $hash hash link identifier + * @param string $name name for the link + * @param bool $returnonly whether to return html or write to doc attribute */ - function locallink($hash, $name = null) { + function locallink($hash, $name = null, $returnonly = false) { global $ID; $name = $this->_getLinkTitle($name, $hash, $isImage); $hash = $this->_headerToLink($hash); $title = $ID.' ↵'; - $this->doc .= '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">'; - $this->doc .= $name; - $this->doc .= '</a>'; + + $doc = '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">'; + $doc .= $name; + $doc .= '</a>'; + + if($returnonly) { + return $doc; + } else { + $this->doc .= $doc; + } } /** @@ -884,10 +897,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { /** * Render an external link * - * @param string $url full URL with scheme - * @param string|array $name name for the link, array for media file + * @param string $url full URL with scheme + * @param string|array $name name for the link, array for media file + * @param bool $returnonly whether to return html or write to doc attribute */ - function externallink($url, $name = null) { + function externallink($url, $name = null, $returnonly = false) { global $conf; $name = $this->_getLinkTitle($name, $url, $isImage); @@ -926,7 +940,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { if($conf['relnofollow']) $link['more'] .= ' rel="nofollow"'; //output formatted - $this->doc .= $this->_formatLink($link); + if($returnonly) { + return $this->_formatLink($link); + } else { + $this->doc .= $this->_formatLink($link); + } } /** @@ -934,12 +952,13 @@ class Doku_Renderer_xhtml extends Doku_Renderer { * * You may want to use $this->_resolveInterWiki() here * - * @param string $match original link - probably not much use - * @param string|array $name name for the link, array for media file - * @param string $wikiName indentifier (shortcut) for the remote wiki - * @param string $wikiUri the fragment parsed from the original link + * @param string $match original link - probably not much use + * @param string|array $name name for the link, array for media file + * @param string $wikiName indentifier (shortcut) for the remote wiki + * @param string $wikiUri the fragment parsed from the original link + * @param bool $returnonly whether to return html or write to doc attribute */ - function interwikilink($match, $name = null, $wikiName, $wikiUri) { + function interwikilink($match, $name = null, $wikiName, $wikiUri, $returnonly = false) { global $conf; $link = array(); @@ -977,16 +996,21 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $link['title'] = htmlspecialchars($link['url']); //output formatted - $this->doc .= $this->_formatLink($link); + if($returnonly) { + return $this->_formatLink($link); + } else { + $this->doc .= $this->_formatLink($link); + } } /** * Link to windows share * - * @param string $url the link - * @param string|array $name name for the link, array for media file + * @param string $url the link + * @param string|array $name name for the link, array for media file + * @param bool $returnonly whether to return html or write to doc attribute */ - function windowssharelink($url, $name = null) { + function windowssharelink($url, $name = null, $returnonly = false) { global $conf; //simple setup @@ -1010,7 +1034,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $link['url'] = $url; //output formatted - $this->doc .= $this->_formatLink($link); + if($returnonly) { + return $this->_formatLink($link); + } else { + $this->doc .= $this->_formatLink($link); + } } /** @@ -1018,10 +1046,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { * * Honors $conf['mailguard'] setting * - * @param string $address Email-Address - * @param string|array $name name for the link, array for media file + * @param string $address Email-Address + * @param string|array $name name for the link, array for media file + * @param bool $returnonly whether to return html or write to doc attribute */ - function emaillink($address, $name = null) { + function emaillink($address, $name = null, $returnonly = false) { global $conf; //simple setup $link = array(); @@ -1053,7 +1082,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $link['title'] = $title; //output formatted - $this->doc .= $this->_formatLink($link); + if($returnonly) { + return $this->_formatLink($link); + } else { + $this->doc .= $this->_formatLink($link); + } } /** diff --git a/inc/remote.php b/inc/remote.php index 861353a19..3e032049d 100644 --- a/inc/remote.php +++ b/inc/remote.php @@ -234,7 +234,7 @@ class RemoteAPI { global $INPUT; if (!$conf['remote']) { - return false; + throw new RemoteAccessDeniedException('server error. RPC server not enabled.',-32604); //should not be here,just throw } if(!$conf['useacl']) { return true; diff --git a/inc/template.php b/inc/template.php index c7dea6b46..f918d1a04 100644 --- a/inc/template.php +++ b/inc/template.php @@ -297,6 +297,7 @@ function tpl_metaheaders($alt = true) { // prepare seed for js and css $tseed = $updateVersion; $depends = getConfigFiles('main'); + $depends[] = DOKU_CONF."tpl/".$conf['template']."/style.ini"; foreach($depends as $f) $tseed .= @filemtime($f); $tseed = md5($tseed); |