1ed7b5f09Sandi<?php 215fae107Sandi/** 315fae107Sandi * File IO functions 415fae107Sandi * 515fae107Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 715fae107Sandi */ 815fae107Sandi 9ed7b5f09Sandi if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); 10ed7b5f09Sandi require_once(DOKU_INC.'inc/common.php'); 11ed7b5f09Sandi require_once(DOKU_INC.'inc/parser.php'); 12f3f0262cSandi 13f3f0262cSandi/** 14f3f0262cSandi * Returns the parsed text from the given sourcefile. Uses cache 15f3f0262cSandi * if exists. Creates it if not. 1615fae107Sandi * 1715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 18f3f0262cSandi */ 19f3f0262cSandifunction io_cacheParse($file){ 20f3f0262cSandi global $conf; 21f3f0262cSandi global $CACHEGROUP; 22f3f0262cSandi global $parser; //we read parser options 23f3f0262cSandi $parsed = ''; 24f3f0262cSandi $cache = $conf['datadir'].'/.cache/'; 25f3f0262cSandi $cache .= md5($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].$CACHEGROUP); 26f3f0262cSandi $purge = $conf['datadir'].'/.cache/purgefile'; 27f3f0262cSandi 28f3f0262cSandi // check if cache can be used 29f3f0262cSandi $cachetime = @filemtime($cache); 30f3f0262cSandi 31f3f0262cSandi if( @file_exists($cache) // does the cachefile exist 32f3f0262cSandi && @file_exists($file) // and does the source exist 33f3f0262cSandi && !isset($_REQUEST['purge']) // no purge param was set 34f3f0262cSandi && filesize($cache) // and contains the cachefile any data 35f3f0262cSandi && ((time() - $cachetime) < $conf['cachetime']) // and is cachefile young enough 36f3f0262cSandi && ($cachetime > filemtime($file)) // and newer than the source 37f3f0262cSandi && ($cachetime > @filemtime($purge)) // and newer than the purgefile 38f3f0262cSandi && ($cachetime > filemtime('conf/dokuwiki.php')) // and newer than the config file 39f3f0262cSandi && ($cachetime > @filemtime('conf/local.php')) // and newer than the local config file 40f3f0262cSandi && ($cachetime > filemtime('inc/parser.php')) // and newer than the parser 41f3f0262cSandi && ($cachetime > filemtime('inc/format.php'))) // and newer than the formating functions 42f3f0262cSandi { 43f3f0262cSandi $parsed = io_readFile($cache); //give back cache 44f3f0262cSandi $parsed .= "\n<!-- cachefile $cache used -->\n"; 45f3f0262cSandi }elseif(@file_exists($file)){ 46f3f0262cSandi $parsed = parse(io_readFile($file)); //sets global parseroptions 47f3f0262cSandi if($parser['cache']){ 48f3f0262cSandi io_saveFile($cache,$parsed); //save cachefile 49f3f0262cSandi $parsed .= "\n<!-- no cachefile used, but created -->\n"; 50f3f0262cSandi }else{ 51f3f0262cSandi @unlink($cache); //try to delete cachefile 52f3f0262cSandi $parsed .= "\n<!-- no cachefile used, caching forbidden -->\n"; 53f3f0262cSandi } 54f3f0262cSandi } 55f3f0262cSandi 56f3f0262cSandi return $parsed; 57f3f0262cSandi} 58f3f0262cSandi 59f3f0262cSandi/** 6015fae107Sandi * Returns content of $file as cleaned string. 6115fae107Sandi * 6215fae107Sandi * Uses gzip if extension is .gz 6315fae107Sandi * 6415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 65f3f0262cSandi */ 66f3f0262cSandifunction io_readFile($file){ 67f3f0262cSandi $ret = ''; 68f3f0262cSandi if(@file_exists($file)){ 69f3f0262cSandi if(substr($file,-3) == '.gz'){ 70f3f0262cSandi $ret = join('',gzfile($file)); 71f3f0262cSandi }else{ 72f3f0262cSandi $ret = join('',file($file)); 73f3f0262cSandi } 74f3f0262cSandi } 75f3f0262cSandi return cleanText($ret); 76f3f0262cSandi} 77f3f0262cSandi 78f3f0262cSandi/** 7915fae107Sandi * Saves $content to $file. 80f3f0262cSandi * 8115fae107Sandi * Uses gzip if extension is .gz 8215fae107Sandi * 8315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 8415fae107Sandi * @return bool true on success 85f3f0262cSandi */ 86f3f0262cSandifunction io_saveFile($file,$content){ 87f3f0262cSandi io_makeFileDir($file); 88f3f0262cSandi if(substr($file,-3) == '.gz'){ 89f3f0262cSandi $fh = @gzopen($file,'wb9'); 90f3f0262cSandi if(!$fh){ 91f3f0262cSandi msg("Writing $file failed",-1); 92f3f0262cSandi return false; 93f3f0262cSandi } 94f3f0262cSandi gzwrite($fh, $content); 95f3f0262cSandi gzclose($fh); 96f3f0262cSandi }else{ 97f3f0262cSandi $fh = @fopen($file,'wb'); 98f3f0262cSandi if(!$fh){ 99f3f0262cSandi msg("Writing $file failed",-1); 100f3f0262cSandi return false; 101f3f0262cSandi } 102f3f0262cSandi fwrite($fh, $content); 103f3f0262cSandi fclose($fh); 104f3f0262cSandi } 105f3f0262cSandi return true; 106f3f0262cSandi} 107f3f0262cSandi 108f3f0262cSandi/** 109f3f0262cSandi * Create the directory needed for the given file 11015fae107Sandi * 11115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 112f3f0262cSandi */ 113f3f0262cSandifunction io_makeFileDir($file){ 114f3f0262cSandi global $conf; 115f3f0262cSandi 116f3f0262cSandi $dir = dirname($file); 117*3dc3a5f1Sandi if($conf['safemodehack']){ 118*3dc3a5f1Sandi preg_replace('/^'.preg_quote(realpath($conf['ftp']['root']),'/').'/','',$dir); 119*3dc3a5f1Sandi } 120f3f0262cSandi umask($conf['dmask']); 121f3f0262cSandi if(!is_dir($dir)){ 122f3f0262cSandi io_mkdir_p($dir) || msg("Creating directory $dir failed",-1); 123f3f0262cSandi } 124f3f0262cSandi umask($conf['umask']); 125f3f0262cSandi} 126f3f0262cSandi 127f3f0262cSandi/** 128f3f0262cSandi * Creates a directory hierachy. 129f3f0262cSandi * 13015fae107Sandi * @link http://www.php.net/manual/en/function.mkdir.php 131f3f0262cSandi * @author <saint@corenova.com> 132*3dc3a5f1Sandi * @author Andreas Gohr <andi@splitbrain.org> 133f3f0262cSandi */ 134f3f0262cSandifunction io_mkdir_p($target){ 135*3dc3a5f1Sandi global $conf; 136f3f0262cSandi if (is_dir($target)||empty($target)) return 1; // best case check first 137f3f0262cSandi if (@file_exists($target) && !is_dir($target)) return 0; 138*3dc3a5f1Sandi //recursion 139*3dc3a5f1Sandi if (io_mkdir_p(substr($target,0,strrpos($target,'/')))){ 140*3dc3a5f1Sandi if($conf['safemodehack']){ 141*3dc3a5f1Sandi return io_mkdir_ftp($target); 142*3dc3a5f1Sandi }else{ 143f3f0262cSandi return @mkdir($target,0777); // crawl back up & create dir tree 144*3dc3a5f1Sandi } 145*3dc3a5f1Sandi } 146f3f0262cSandi return 0; 147f3f0262cSandi} 148f3f0262cSandi 149f3f0262cSandi/** 150*3dc3a5f1Sandi * Creates a directory using FTP 151*3dc3a5f1Sandi * 152*3dc3a5f1Sandi * This is used when the safemode workaround is enabled 153*3dc3a5f1Sandi * 154*3dc3a5f1Sandi * @author <andi@splitbrain.org> 155*3dc3a5f1Sandi */ 156*3dc3a5f1Sandifunction io_mkdir_ftp($dir){ 157*3dc3a5f1Sandi global $conf; 158*3dc3a5f1Sandi 159*3dc3a5f1Sandi if(!function_exists('ftp_connect')){ 160*3dc3a5f1Sandi msg("FTP support not found - safemode workaround not usable",-1); 161*3dc3a5f1Sandi return false; 162*3dc3a5f1Sandi } 163*3dc3a5f1Sandi 164*3dc3a5f1Sandi $conn = @ftp_connect($conf['ftp']['host'],$conf['ftp']['port'],10); 165*3dc3a5f1Sandi if(!$conn){ 166*3dc3a5f1Sandi msg("FTP connection failed",-1); 167*3dc3a5f1Sandi return false; 168*3dc3a5f1Sandi } 169*3dc3a5f1Sandi 170*3dc3a5f1Sandi if(!@ftp_login($conn, $conf['ftp']['user'], $conf['ftp']['pass'])){ 171*3dc3a5f1Sandi msg("FTP login failed",-1); 172*3dc3a5f1Sandi return false; 173*3dc3a5f1Sandi } 174*3dc3a5f1Sandi 175*3dc3a5f1Sandi //create directory 176*3dc3a5f1Sandi $ok = @ftp_mkdir($conn, $dir); 177*3dc3a5f1Sandi //set permissions (using the directory umask) 178*3dc3a5f1Sandi @ftp_site($conn,sprintf("CHMOD %04o %s",$perm & (0777 - $conf['dmask']),$dir)); 179*3dc3a5f1Sandi 180*3dc3a5f1Sandi ftp_close($conn); 181*3dc3a5f1Sandi return $ok; 182*3dc3a5f1Sandi} 183*3dc3a5f1Sandi 184*3dc3a5f1Sandi/** 185f3f0262cSandi * Runs an external command and returns it's output as string 18615fae107Sandi * 18715fae107Sandi * @author Harry Brueckner <harry_b@eml.cc> 18815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 189*3dc3a5f1Sandi * @deprecated 190f3f0262cSandi */ 191f3f0262cSandifunction io_runcmd($cmd){ 192f3f0262cSandi $fh = popen($cmd, "r"); 193f3f0262cSandi if(!$fh) return false; 194f3f0262cSandi $ret = ''; 195f3f0262cSandi while (!feof($fh)) { 196f3f0262cSandi $ret .= fread($fh, 8192); 197f3f0262cSandi } 198f3f0262cSandi pclose($fh); 199f3f0262cSandi return $ret; 200f3f0262cSandi} 201f3f0262cSandi 202f3f0262cSandi?> 203