Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 1999-2004 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00209 class t3lib_div { 00210 00211 00212 00213 00214 00215 /************************* 00216 * 00217 * GET/POST Variables 00218 * 00219 * Background: 00220 * Input GET/POST variables in PHP may have their quotes escaped with "\" or not depending on configuration. 00221 * TYPO3 has always converted quotes to BE escaped if the configuration told that they would not be so. 00222 * But the clean solution is that quotes are never escaped and that is what the functions below offers. 00223 * Eventually TYPO3 should provide this in the global space as well. 00224 * In the transitional phase (or forever..?) we need to encourage EVERY to read and write GET/POST vars through the API functions below. 00225 * 00226 *************************/ 00227 00239 function _GP($var) { 00240 if(empty($var)) return; 00241 $value = isset($_POST[$var]) ? $_POST[$var] : $_GET[$var]; 00242 if (isset($value)) { 00243 if (is_array($value)) { t3lib_div::stripSlashesOnArray($value); } else { $value = stripslashes($value); } 00244 } 00245 return $value; 00246 } 00247 00257 function _GET($var=NULL) { 00258 $value = ($var === NULL) ? $_GET : (empty($var) ? NULL : $_GET[$var]); 00259 if (isset($value)) { // Removes slashes since TYPO3 has added them regardless of magic_quotes setting. 00260 if (is_array($value)) { t3lib_div::stripSlashesOnArray($value); } else { $value = stripslashes($value); } 00261 } 00262 return $value; 00263 } 00264 00274 function _POST($var=NULL) { 00275 $value = ($var === NULL) ? $_POST : (empty($var) ? NULL : $_POST[$var]); 00276 if (isset($value)) { // Removes slashes since TYPO3 has added them regardless of magic_quotes setting. 00277 if (is_array($value)) { t3lib_div::stripSlashesOnArray($value); } else { $value = stripslashes($value); } 00278 } 00279 return $value; 00280 } 00281 00290 function _GETset($inputGet,$key='') { 00291 // ADDS slashes since TYPO3 standard currently is that slashes MUST be applied (regardless of magic_quotes setting). 00292 if (strcmp($key,'')) { 00293 if (is_array($inputGet)) { t3lib_div::addSlashesOnArray($inputGet); } else { $inputGet = addslashes($inputGet); } 00294 $GLOBALS['HTTP_GET_VARS'][$key] = $_GET[$key] = $inputGet; 00295 } elseif (is_array($inputGet)){ 00296 t3lib_div::addSlashesOnArray($inputGet); 00297 $GLOBALS['HTTP_GET_VARS'] = $_GET = $inputGet; 00298 } 00299 } 00300 00313 function GPvar($var,$strip=0) { 00314 if(empty($var)) return; 00315 $value = isset($_POST[$var]) ? $_POST[$var] : $_GET[$var]; 00316 if (isset($value) && is_string($value)) { $value = stripslashes($value); } // Originally check '&& get_magic_quotes_gpc() ' but the values of $_GET are always slashed regardless of get_magic_quotes_gpc() because HTTP_POST/GET_VARS are run through addSlashesOnArray in the very beginning of index_ts.php eg. 00317 if ($strip && isset($value) && is_array($value)) { t3lib_div::stripSlashesOnArray($value); } 00318 return $value; 00319 } 00320 00330 function GParrayMerged($var) { 00331 $postA = is_array($_POST[$var]) ? $_POST[$var] : array(); 00332 $getA = is_array($_GET[$var]) ? $_GET[$var] : array(); 00333 $mergedA = t3lib_div::array_merge_recursive_overrule($getA,$postA); 00334 t3lib_div::stripSlashesOnArray($mergedA); 00335 return $mergedA; 00336 } 00337 00338 00339 00340 00341 00342 00343 00344 00345 00346 00347 /************************* 00348 * 00349 * IMAGE FUNCTIONS 00350 * 00351 *************************/ 00352 00353 00374 function gif_compress($theFile, $type) { 00375 $gfxConf = $GLOBALS['TYPO3_CONF_VARS']['GFX']; 00376 $returnCode=''; 00377 if ($gfxConf['gif_compress'] && strtolower(substr($theFile,-4,4))=='.gif') { // GIF... 00378 if (($type=='IM' || !$type) && $GLOBALS['TYPO3_CONF_VARS']['GFX']['im'] && $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw']) { // IM 00379 exec($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'].'convert "'.$theFile.'" "'.$theFile.'"'); 00380 $returnCode='IM'; 00381 } elseif (($type=='GD' || !$type) && $gfxConf['gdlib'] && !$gfxConf['gdlib_png']) { // GD 00382 $tempImage = imageCreateFromGif($theFile); 00383 imageGif($tempImage, $theFile); 00384 imageDestroy($tempImage); 00385 $returnCode='GD'; 00386 } 00387 } 00388 return $returnCode; 00389 } 00390 00400 function png_to_gif_by_imagemagick($theFile) { 00401 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['png_to_gif'] 00402 && $GLOBALS['TYPO3_CONF_VARS']['GFX']['im'] 00403 && $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'] 00404 && strtolower(substr($theFile,-4,4))=='.png' 00405 && @is_file($theFile)) { // IM 00406 $newFile = substr($theFile,0,-4).'.gif'; 00407 exec($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'].'convert "'.$theFile.'" "'.$newFile.'"'); 00408 $theFile = $newFile; 00409 // unlink old file?? May be bad idea bacause TYPO3 would then recreate the file every time as TYPO3 thinks the file is not generated because it's missing!! So do not unlink $theFile here!! 00410 } 00411 return $theFile; 00412 } 00413 00424 function read_png_gif($theFile,$output_png=0) { 00425 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im'] && @is_file($theFile)) { 00426 $ext = strtolower(substr($theFile,-4,4)); 00427 if ( 00428 ((string)$ext=='.png' && $output_png) || 00429 ((string)$ext=='.gif' && !$output_png) 00430 ) { 00431 return $theFile; 00432 } else { 00433 $newFile = PATH_site.'typo3temp/readPG_'.md5($theFile.'|'.filemtime($theFile)).($output_png?'.png':'.gif'); 00434 exec($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path'].'convert "'.$theFile.'" "'.$newFile.'"'); 00435 if (@is_file($newFile)) return $newFile; 00436 } 00437 } 00438 } 00439 00440 00441 00442 00443 00444 00445 00446 00447 00448 00449 00450 00451 00452 00453 00454 /************************* 00455 * 00456 * STRING FUNCTIONS 00457 * 00458 *************************/ 00459 00473 function fixed_lgd($string,$origChars,$preStr='...') { 00474 $chars = abs($origChars); 00475 if ($chars >= 4) { 00476 if(strlen($string)>$chars) { 00477 return $origChars < 0 ? 00478 $preStr.trim(substr($string, -($chars-3))) : 00479 trim(substr($string, 0, $chars-3)).$preStr; 00480 } 00481 } 00482 return $string; 00483 } 00484 00498 function fixed_lgd_pre($string,$chars) { 00499 return strrev(t3lib_div::fixed_lgd(strrev($string),$chars)); 00500 } 00501 00512 function fixed_lgd_cs($string,$chars) { 00513 if (is_object($GLOBALS['LANG'])) { 00514 return $GLOBALS['LANG']->csConvObj->crop($GLOBALS['LANG']->charSet,$string,$chars,'...'); 00515 } else { 00516 return t3lib_div::fixed_lgd($string, $chars); 00517 } 00518 } 00519 00529 function breakTextForEmail($str,$implChar="\n",$charWidth=76) { 00530 $lines = explode(chr(10),$str); 00531 $outArr=array(); 00532 while(list(,$lStr)=each($lines)) { 00533 $outArr = array_merge($outArr,t3lib_div::breakLinesForEmail($lStr,$implChar,$charWidth)); 00534 } 00535 return implode(chr(10),$outArr); 00536 } 00537 00548 function breakLinesForEmail($str,$implChar="\n",$charWidth=76) { 00549 $lines=array(); 00550 $l=$charWidth; 00551 $p=0; 00552 while(strlen($str)>$p) { 00553 $substr=substr($str,$p,$l); 00554 if (strlen($substr)==$l) { 00555 $count = count(explode(' ',trim(strrev($substr)))); 00556 if ($count>1) { // OK... 00557 $parts = explode(' ',strrev($substr),2); 00558 $theLine = strrev($parts[1]); 00559 } else { 00560 $afterParts = explode(' ',substr($str,$l+$p),2); 00561 $theLine = $substr.$afterParts[0]; 00562 } 00563 if (!strlen($theLine)) {break; } // Error, because this would keep us in an endless loop. 00564 } else { 00565 $theLine=$substr; 00566 } 00567 00568 $lines[]=trim($theLine); 00569 $p+=strlen($theLine); 00570 if (!trim(substr($str,$p,$l))) break; // added... 00571 } 00572 return implode($implChar,$lines); 00573 } 00574 00583 function cmpIP($baseIP, $list) { 00584 $IPpartsReq = explode('.',$baseIP); 00585 if (count($IPpartsReq)==4) { 00586 $values = t3lib_div::trimExplode(',',$list,1); 00587 00588 foreach($values as $test) { 00589 list($test,$mask) = explode('/',$test); 00590 00591 if(intval($mask)) { 00592 // "192.168.3.0/24" 00593 $lnet = ip2long($test); 00594 $lip = ip2long($baseIP); 00595 $binnet = str_pad( decbin($lnet),32,'0','STR_PAD_LEFT'); 00596 $firstpart = substr($binnet,0,$mask); 00597 $binip = str_pad( decbin($lip),32,'0','STR_PAD_LEFT'); 00598 $firstip = substr($binip,0,$mask); 00599 $yes = (strcmp($firstpart,$firstip)==0); 00600 } else { 00601 // "192.168.*.*" 00602 $IPparts = explode('.',$test); 00603 $yes = 1; 00604 reset($IPparts); 00605 while(list($index,$val)=each($IPparts)) { 00606 $val = trim($val); 00607 if (strcmp($val,'*') && strcmp($IPpartsReq[$index],$val)) { 00608 $yes=0; 00609 } 00610 } 00611 } 00612 if ($yes) return true; 00613 } 00614 } 00615 return false; 00616 } 00617 00625 function cmpFQDN($baseIP, $list) { 00626 if (count(explode('.',$baseIP))==4) { 00627 $resolvedHostName = explode('.', gethostbyaddr($baseIP)); 00628 $values = t3lib_div::trimExplode(',',$list,1); 00629 00630 foreach($values as $test) { 00631 $hostNameParts = explode('.',$test); 00632 $yes = 1; 00633 00634 foreach($hostNameParts as $index => $val) { 00635 $val = trim($val); 00636 if (strcmp($val,'*') && strcmp($resolvedHostName[$index],$val)) { 00637 $yes=0; 00638 } 00639 } 00640 if ($yes) return true; 00641 } 00642 } 00643 return false; 00644 } 00645 00655 function inList($in_list,$item) { 00656 return strstr(','.$in_list.',', ','.$item.','); 00657 } 00658 00667 function rmFromList($element,$list) { 00668 $items = explode(',',$list); 00669 while(list($k,$v)=each($items)) { 00670 if ($v==$element) {unset($items[$k]);} 00671 } 00672 return implode(',',$items); 00673 } 00674 00685 function intInRange($theInt,$min,$max=2000000000,$zeroValue=0) { 00686 // Returns $theInt as an integer in the integerspace from $min to $max 00687 $theInt = intval($theInt); 00688 if ($zeroValue && !$theInt) {$theInt=$zeroValue;} // If the input value is zero after being converted to integer, zeroValue may set another default value for it. 00689 if ($theInt<$min){$theInt=$min;} 00690 if ($theInt>$max){$theInt=$max;} 00691 return $theInt; 00692 } 00693 00701 function intval_positive($theInt) { 00702 $theInt = intval($theInt); 00703 if ($theInt<0){$theInt=0;} 00704 return $theInt; 00705 } 00706 00714 function int_from_ver($verNumberStr) { 00715 $verParts = explode('.',$verNumberStr); 00716 return intval((int)$verParts[0].str_pad((int)$verParts[1],3,'0',STR_PAD_LEFT).str_pad((int)$verParts[2],3,'0',STR_PAD_LEFT)); 00717 } 00718 00726 function md5int($str) { 00727 return hexdec(substr(md5($str),0,7)); 00728 } 00729 00739 function shortMD5($input, $len=10) { 00740 return substr(md5($input),0,$len); 00741 } 00742 00752 function uniqueList($in_list, $secondParameter=NULL) { 00753 if (is_array($in_list)) die('t3lib_div::uniqueList() does NOT support array arguments anymore! Only string comma lists!'); 00754 if (isset($secondParameter)) die('t3lib_div::uniqueList() does NOT support more than a single argument value anymore. You have specified more than one.'); 00755 00756 return implode(',',array_unique(t3lib_div::trimExplode(',',$in_list,1))); 00757 } 00758 00766 function split_fileref($fileref) { 00767 if ( ereg('(.*/)(.*)$',$fileref,$reg) ) { 00768 $info['path'] = $reg[1]; 00769 $info['file'] = $reg[2]; 00770 } else { 00771 $info['path'] = ''; 00772 $info['file'] = $fileref; 00773 } 00774 $reg=''; 00775 if ( ereg('(.*)\.([^\.]*$)',$info['file'],$reg) ) { 00776 $info['filebody'] = $reg[1]; 00777 $info['fileext'] = strtolower($reg[2]); 00778 $info['realFileext'] = $reg[2]; 00779 } else { 00780 $info['filebody'] = $info['file']; 00781 $info['fileext'] = ''; 00782 } 00783 reset($info); 00784 return $info; 00785 } 00786 00803 function dirname($path) { 00804 $p=t3lib_div::revExplode('/',$path,2); 00805 return count($p)==2?$p[0]:''; 00806 } 00807 00819 function modifyHTMLColor($color,$R,$G,$B) { 00820 // This takes a hex-color (# included!) and adds $R, $G and $B to the HTML-color (format: #xxxxxx) and returns the new color 00821 $nR = t3lib_div::intInRange(hexdec(substr($color,1,2))+$R,0,255); 00822 $nG = t3lib_div::intInRange(hexdec(substr($color,3,2))+$G,0,255); 00823 $nB = t3lib_div::intInRange(hexdec(substr($color,5,2))+$B,0,255); 00824 return '#'. 00825 substr('0'.dechex($nR),-2). 00826 substr('0'.dechex($nG),-2). 00827 substr('0'.dechex($nB),-2); 00828 } 00829 00839 function modifyHTMLColorAll($color,$all) { 00840 return t3lib_div::modifyHTMLColor($color,$all,$all,$all); 00841 } 00842 00850 function rm_endcomma($string) { 00851 return ereg_replace(',$','',$string); 00852 } 00853 00863 function danish_strtoupper($string) { 00864 $value = strtoupper($string); 00865 return strtr($value, 'áéúíâêûôîæøåäöü', 'ÁÉÚÍÄËÜÖÏÆØÅÄÖÜ'); 00866 } 00867 00878 function convUmlauts($str) { 00879 $pat = array ( '/ä/', '/Ä/', '/ö/', '/Ö/', '/ü/', '/Ü/', '/ß/', '/å/', '/Å/', '/ø/', '/Ø/', '/æ/', '/Æ/' ); 00880 $repl = array ( 'ae', 'Ae', 'oe', 'Oe', 'ue', 'Ue', 'ss', 'aa', 'AA', 'oe', 'OE', 'ae', 'AE' ); 00881 return preg_replace($pat,$repl,$str); 00882 } 00883 00891 function testInt($var) { 00892 return !strcmp($var,intval($var)); 00893 } 00894 00903 function isFirstPartOfStr($str,$partStr) { 00904 // Returns true, if the first part of a $str equals $partStr and $partStr is not '' 00905 $psLen = strlen($partStr); 00906 if ($psLen) { 00907 return substr($str,0,$psLen)==(string)$partStr; 00908 } else return false; 00909 } 00910 00919 function formatSize($sizeInBytes,$labels='') { 00920 00921 // Set labels: 00922 if (strlen($labels) == 0) { 00923 $labels = ' | K| M| G'; 00924 } else { 00925 $labels = str_replace('"','',$labels); 00926 } 00927 $labelArr = explode('|',$labels); 00928 00929 // Find size: 00930 if ($sizeInBytes>900) { 00931 if ($sizeInBytes>900000000) { // GB 00932 $val = $sizeInBytes/(1024*1024*1024); 00933 return number_format($val, (($val<20)?1:0), '.', '').$labelArr[3]; 00934 } 00935 elseif ($sizeInBytes>900000) { // MB 00936 $val = $sizeInBytes/(1024*1024); 00937 return number_format($val, (($val<20)?1:0), '.', '').$labelArr[2]; 00938 } else { // KB 00939 $val = $sizeInBytes/(1024); 00940 return number_format($val, (($val<20)?1:0), '.', '').$labelArr[1]; 00941 } 00942 } else { // Bytes 00943 return $sizeInBytes.$labelArr[0]; 00944 } 00945 } 00946 00954 function convertMicrotime($microtime) { 00955 $parts = explode(' ',$microtime); 00956 return round(($parts[0]+$parts[1])*1000); 00957 } 00958 00968 function splitCalc($string,$operators) { 00969 $res = Array(); 00970 $sign='+'; 00971 while($string) { 00972 $valueLen=strcspn($string,$operators); 00973 $value=substr($string,0,$valueLen); 00974 $res[] = Array($sign,trim($value)); 00975 $sign=substr($string,$valueLen,1); 00976 $string=substr($string,$valueLen+1); 00977 } 00978 reset($res); 00979 return $res; 00980 } 00981 00990 function calcPriority($string) { 00991 $string=ereg_replace('[[:space:]]*','',$string); // removing all whitespace 00992 $string='+'.$string; // Ensuring an operator for the first entrance 00993 $qm='\*\/\+-^%'; 00994 $regex = '(['.$qm.'])(['.$qm.']?[0-9\.]*)'; 00995 // split the expression here: 00996 preg_match_all('/'.$regex.'/',$string,$reg); 00997 00998 reset($reg[2]); 00999 $number=0; 01000 $Msign='+'; 01001 $err=''; 01002 $buffer=doubleval(current($reg[2])); 01003 next($reg[2]); // Advance pointer 01004 while(list($k,$v)=each($reg[2])) { 01005 $v=doubleval($v); 01006 $sign = $reg[1][$k]; 01007 if ($sign=='+' || $sign=='-') { 01008 $number = $Msign=='-' ? $number-=$buffer : $number+=$buffer; 01009 $Msign = $sign; 01010 $buffer=$v; 01011 } else { 01012 if ($sign=='/') {if ($v) $buffer/=$v; else $err='dividing by zero';} 01013 if ($sign=='%') {if ($v) $buffer%=$v; else $err='dividing by zero';} 01014 if ($sign=='*') {$buffer*=$v;} 01015 if ($sign=='^') {$buffer=pow($buffer,$v);} 01016 } 01017 } 01018 $number = $Msign=='-' ? $number-=$buffer : $number+=$buffer; 01019 return $err ? 'ERROR: '.$err : $number; 01020 } 01021 01030 function calcParenthesis($string) { 01031 $securC=100; 01032 do { 01033 $valueLenO=strcspn($string,'('); 01034 $valueLenC=strcspn($string,')'); 01035 if ($valueLenC==strlen($string) || $valueLenC < $valueLenO) { 01036 $value = t3lib_div::calcPriority(substr($string,0,$valueLenC)); 01037 $string = $value.substr($string,$valueLenC+1); 01038 return $string; 01039 } else { 01040 $string = substr($string,0,$valueLenO).t3lib_div::calcParenthesis(substr($string,$valueLenO+1)); 01041 } 01042 // Security: 01043 $securC--; 01044 if ($securC<=0) break; 01045 } while($valueLenO<strlen($string)); 01046 return $string; 01047 } 01048 01056 function htmlspecialchars_decode($value) { 01057 $value = str_replace('>','>',$value); 01058 $value = str_replace('<','<',$value); 01059 $value = str_replace('"','"',$value); 01060 $value = str_replace('&','&',$value); 01061 return $value; 01062 } 01063 01071 function deHSCentities($str) { 01072 return ereg_replace('&([#[:alnum:]]*;)','&\1',$str); 01073 } 01074 01084 function slashJS($string,$extended=0,$char="'") { 01085 if ($extended) {$string = str_replace ("\\", "\\\\", $string);} 01086 return str_replace ($char, "\\".$char, $string); 01087 } 01088 01097 function rawUrlEncodeJS($str) { 01098 return str_replace('%20',' ',rawurlencode($str)); 01099 } 01100 01109 function rawUrlEncodeFP($str) { 01110 return str_replace('%2F','/',rawurlencode($str)); 01111 } 01112 01120 function validEmail($email) { 01121 $email = trim ($email); 01122 if (strstr($email,' ')) return FALSE; 01123 return ereg('^[A-Za-z0-9\._-]+[@][A-Za-z0-9\._-]+[\.].[A-Za-z0-9]+$',$email) ? TRUE : FALSE; 01124 } 01125 01135 function formatForTextarea($content) { 01136 return chr(10).htmlspecialchars($content); 01137 } 01138 01139 01140 01141 01142 01143 01144 01145 01146 01147 01148 01149 01150 /************************* 01151 * 01152 * ARRAY FUNCTIONS 01153 * 01154 *************************/ 01155 01166 function inArray($in_array,$item) { 01167 if (is_array($in_array)) { 01168 while (list(,$val)=each($in_array)) { 01169 if (!is_array($val) && !strcmp($val,$item)) return true; 01170 } 01171 } 01172 } 01173 01183 function intExplode($delim, $string) { 01184 $temp = explode($delim,$string); 01185 while(list($key,$val)=each($temp)) { 01186 $temp[$key]=intval($val); 01187 } 01188 reset($temp); 01189 return $temp; 01190 } 01191 01202 function revExplode($delim, $string, $count=0) { 01203 $temp = explode($delim,strrev($string),$count); 01204 while(list($key,$val)=each($temp)) { 01205 $temp[$key]=strrev($val); 01206 } 01207 $temp=array_reverse($temp); 01208 reset($temp); 01209 return $temp; 01210 } 01211 01222 function trimExplode($delim, $string, $onlyNonEmptyValues=0) { 01223 $temp = explode($delim,$string); 01224 $newtemp=array(); 01225 while(list($key,$val)=each($temp)) { 01226 if (!$onlyNonEmptyValues || strcmp('',trim($val))) { 01227 $newtemp[]=trim($val); 01228 } 01229 } 01230 reset($newtemp); 01231 return $newtemp; 01232 } 01233 01244 function uniqueArray($valueArray) { 01245 return array_unique($valueArray); 01246 } 01247 01256 function removeArrayEntryByValue($array,$cmpValue) { 01257 if (is_array($array)) { 01258 reset($array); 01259 while(list($k,$v)=each($array)) { 01260 if (is_array($v)) { 01261 $array[$k] = t3lib_div::removeArrayEntryByValue($v,$cmpValue); 01262 } else { 01263 if (!strcmp($v,$cmpValue)) { 01264 unset($array[$k]); 01265 } 01266 } 01267 } 01268 } 01269 reset($array); 01270 return $array; 01271 } 01272 01284 function implodeArrayForUrl($name,$theArray,$str='',$skipBlank=0,$rawurlencodeParamName=0) { 01285 if (is_array($theArray)) { 01286 foreach($theArray as $Akey => $AVal) { 01287 $thisKeyName = $name ? $name.'['.$Akey.']' : $Akey; 01288 if (is_array($AVal)) { 01289 $str = t3lib_div::implodeArrayForUrl($thisKeyName,$AVal,$str,$skipBlank,$rawurlencodeParamName); 01290 } else { 01291 if (!$skipBlank || strcmp($AVal,'')) { 01292 $str.='&'.($rawurlencodeParamName ? rawurlencode($thisKeyName) : $thisKeyName). 01293 '='.rawurlencode($AVal); // strips slashes because _POST / _GET input is with slashes... 01294 } 01295 } 01296 } 01297 } 01298 return $str; 01299 } 01300 01311 function compileSelectedGetVarsFromArray($varList,$getArray,$GPvarAlt=1) { 01312 $keys = t3lib_div::trimExplode(',',$varList,1); 01313 $outArr=array(); 01314 foreach($keys as $v) { 01315 if (isset($getArray[$v])) { 01316 $outArr[$v]=$getArray[$v]; 01317 } elseif ($GPvarAlt) { 01318 $outArr[$v]=t3lib_div::_GP($v); 01319 } 01320 } 01321 return $outArr; 01322 } 01323 01334 function addSlashesOnArray(&$theArray) { 01335 if (is_array($theArray)) { 01336 reset($theArray); 01337 while(list($Akey,$AVal)=each($theArray)) { 01338 if (is_array($AVal)) { 01339 t3lib_div::addSlashesOnArray($theArray[$Akey]); 01340 } else { 01341 $theArray[$Akey] = addslashes($AVal); 01342 } 01343 } 01344 reset($theArray); 01345 } 01346 } 01347 01358 function stripSlashesOnArray(&$theArray) { 01359 if (is_array($theArray)) { 01360 reset($theArray); 01361 while(list($Akey,$AVal)=each($theArray)) { 01362 if (is_array($AVal)) { 01363 t3lib_div::stripSlashesOnArray($theArray[$Akey]); 01364 } else { 01365 $theArray[$Akey] = stripslashes($AVal); 01366 } 01367 } 01368 reset($theArray); 01369 } 01370 } 01371 01380 function slashArray($arr,$cmd) { 01381 if ($cmd=='strip') t3lib_div::stripSlashesOnArray($arr); 01382 if ($cmd=='add') t3lib_div::addSlashesOnArray($arr); 01383 return $arr; 01384 } 01385 01397 function array_merge_recursive_overrule($arr0,$arr1,$notAddKeys=0,$includeEmtpyValues=true) { 01398 reset($arr1); 01399 while(list($key,$val) = each($arr1)) { 01400 if(is_array($arr0[$key])) { 01401 if (is_array($arr1[$key])) { 01402 $arr0[$key] = t3lib_div::array_merge_recursive_overrule($arr0[$key],$arr1[$key],$notAddKeys); 01403 } 01404 } else { 01405 if ($notAddKeys) { 01406 if (isset($arr0[$key])) { 01407 if ($includeEmtpyValues OR $val) { 01408 $arr0[$key] = $val; 01409 } 01410 } 01411 } else { 01412 if ($includeEmtpyValues OR $val) { 01413 $arr0[$key] = $val; 01414 } 01415 } 01416 } 01417 } 01418 reset($arr0); 01419 return $arr0; 01420 } 01421 01430 function array_merge($arr1,$arr2) { 01431 return $arr2+$arr1; 01432 } 01433 01443 function csvValues($row,$delim=',',$quote='"') { 01444 reset($row); 01445 $out=array(); 01446 while(list(,$value)=each($row)) { 01447 list($valPart) = explode(chr(10),$value); 01448 $valPart = trim($valPart); 01449 $out[]=str_replace($quote,$quote.$quote,$valPart); 01450 } 01451 $str = $quote.implode($quote.$delim.$quote,$out).$quote; 01452 return $str; 01453 } 01454 01455 01456 01457 01458 01459 01460 01461 01462 01463 01464 01465 01466 01467 01468 01469 01470 /************************* 01471 * 01472 * HTML/XML PROCESSING 01473 * 01474 *************************/ 01475 01485 function get_tag_attributes($tag) { 01486 $components = t3lib_div::split_tag_attributes($tag); 01487 $name = ''; // attribute name is stored here 01488 $valuemode = ''; 01489 if (is_array($components)) { 01490 while (list($key,$val) = each ($components)) { 01491 if ($val != '=') { // Only if $name is set (if there is an attribute, that waits for a value), that valuemode is enabled. This ensures that the attribute is assigned it's value 01492 if ($valuemode) { 01493 if ($name) { 01494 $attributes[$name] = $val; 01495 $name = ''; 01496 } 01497 } else { 01498 if ($key = strtolower(ereg_replace('[^a-zA-Z0-9]','',$val))) { 01499 $attributes[$key] = ''; 01500 $name = $key; 01501 } 01502 } 01503 $valuemode = ''; 01504 } else { 01505 $valuemode = 'on'; 01506 } 01507 } 01508 if (is_array($attributes)) reset($attributes); 01509 return $attributes; 01510 } 01511 } 01512 01522 function split_tag_attributes($tag) { 01523 $tag_tmp = trim(eregi_replace ('^<[^[:space:]]*','',trim($tag))); 01524 // Removes any > in the end of the string 01525 $tag_tmp = trim(eregi_replace ('>$','',$tag_tmp)); 01526 01527 while (strcmp($tag_tmp,'')) { // Compared with empty string instead , 030102 01528 $firstChar=substr($tag_tmp,0,1); 01529 if (!strcmp($firstChar,'"') || !strcmp($firstChar,"'")) { 01530 $reg=explode($firstChar,$tag_tmp,3); 01531 $value[]=$reg[1]; 01532 $tag_tmp=trim($reg[2]); 01533 } elseif (!strcmp($firstChar,'=')) { 01534 $value[] = '='; 01535 $tag_tmp = trim(substr($tag_tmp,1)); // Removes = chars. 01536 } else { 01537 // There are '' around the value. We look for the next ' ' or '>' 01538 $reg = split('[[:space:]=]',$tag_tmp,2); 01539 $value[] = trim($reg[0]); 01540 $tag_tmp = trim(substr($tag_tmp,strlen($reg[0]),1).$reg[1]); 01541 } 01542 } 01543 if (is_array($value)) reset($value); 01544 return $value; 01545 } 01546 01556 function implodeAttributes($arr,$xhtmlSafe=FALSE,$dontOmitBlankAttribs=FALSE) { 01557 if (is_array($arr)) { 01558 if ($xhtmlSafe) { 01559 $newArr=array(); 01560 foreach($arr as $p => $v) { 01561 if (!isset($newArr[strtolower($p)])) $newArr[strtolower($p)] = htmlspecialchars($v); 01562 } 01563 $arr = $newArr; 01564 } 01565 $list = array(); 01566 foreach($arr as $p => $v) { 01567 if (strcmp($v,'') || $dontOmitBlankAttribs) {$list[]=$p.'="'.$v.'"';} 01568 } 01569 return implode(' ',$list); 01570 } 01571 } 01572 01583 function implodeParams($arr,$xhtmlSafe=FALSE,$dontOmitBlankAttribs=FALSE) { 01584 return t3lib_div::implodeAttributes($arr,$xhtmlSafe,$dontOmitBlankAttribs); 01585 } 01586 01598 function wrapJS($string, $linebreak=TRUE) { 01599 if(trim($string)) { 01600 // <script wrapped in nl? 01601 $cr = $linebreak? "\n" : ''; 01602 01603 // remove nl from the beginning 01604 $string = preg_replace ('/^\n+/', '', $string); 01605 // re-ident to one tab using the first line as reference 01606 if(preg_match('/^(\t+)/',$string,$match)) { 01607 $string = str_replace($match[1],"\t", $string); 01608 } 01609 $string = $cr.'<script type="text/javascript"> 01610 /*<![CDATA[*/ 01611 '.$string.' 01612 /*]]>*/ 01613 </script>'.$cr; 01614 } 01615 return trim($string); 01616 } 01617 01618 01628 function xml2tree($string,$depth=999) { 01629 $parser = xml_parser_create(); 01630 $vals = array(); 01631 $index = array(); 01632 01633 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); 01634 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0); 01635 xml_parse_into_struct($parser, $string, $vals, $index); 01636 01637 if (xml_get_error_code($parser)) return 'Line '.xml_get_current_line_number($parser).': '.xml_error_string(xml_get_error_code($parser)); 01638 xml_parser_free($parser); 01639 01640 $stack = array( array() ); 01641 $stacktop = 0; 01642 $startPoint=0; 01643 01644 unset($tagi); 01645 foreach($vals as $key => $val) { 01646 $type = $val['type']; 01647 01648 // open tag: 01649 if ($type=='open' || $type=='complete') { 01650 $stack[$stacktop++] = $tagi; 01651 01652 if ($depth==$stacktop) { 01653 $startPoint=$key; 01654 } 01655 01656 $tagi = array('tag' => $val['tag']); 01657 01658 if(isset($val['attributes'])) $tagi['attrs'] = $val['attributes']; 01659 if(isset($val['value'])) $tagi['values'][] = $val['value']; 01660 } 01661 // finish tag: 01662 if ($type=='complete' || $type=='close') { 01663 $oldtagi = $tagi; 01664 $tagi = $stack[--$stacktop]; 01665 $oldtag = $oldtagi['tag']; 01666 unset($oldtagi['tag']); 01667 01668 if ($depth==($stacktop+1)) { 01669 if ($key-$startPoint > 0) { 01670 $partArray = array_slice( 01671 $vals, 01672 $startPoint+1, 01673 $key-$startPoint-1 01674 ); 01675 #$oldtagi=array('XMLvalue'=>t3lib_div::xmlRecompileFromStructValArray($partArray)); 01676 $oldtagi['XMLvalue']=t3lib_div::xmlRecompileFromStructValArray($partArray); 01677 } else { 01678 $oldtagi['XMLvalue']=$oldtagi['values'][0]; 01679 } 01680 } 01681 01682 $tagi['ch'][$oldtag][] = $oldtagi; 01683 unset($oldtagi); 01684 } 01685 // cdata 01686 if($type=='cdata') { 01687 $tagi['values'][] = $val['value']; 01688 } 01689 } 01690 return $tagi['ch']; 01691 } 01692 01714 function array2xml($array,$NSprefix='',$level=0,$docTag='phparray',$spaceInd=0, $options=array(),$parentTagName='') { 01715 // The list of byte values which will trigger binary-safe storage. If any value has one of these char values in it, it will be encoded in base64 01716 $binaryChars = chr(0).chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8). 01717 chr(11).chr(12).chr(14).chr(15).chr(16).chr(17).chr(18).chr(19). 01718 chr(20).chr(21).chr(22).chr(23).chr(24).chr(25).chr(26).chr(27).chr(28).chr(29). 01719 chr(30).chr(31); 01720 // Set indenting mode: 01721 $indentChar = $spaceInd ? ' ' : chr(9); 01722 $indentN = $spaceInd>0 ? $spaceInd : 1; 01723 01724 // Init output variable: 01725 $output=''; 01726 01727 // Traverse the input array 01728 if (is_array($array)) { 01729 foreach($array as $k=>$v) { 01730 $attr = ''; 01731 $tagName = $k; 01732 01733 // Construct the tag name. 01734 if (!strcmp(intval($tagName),$tagName)) { // If integer...; 01735 if ($options['useNindex']) { // If numeric key, prefix "n" 01736 $tagName = 'n'.$tagName; 01737 } else { // Use special tag for num. keys: 01738 $attr.=' index="'.$tagName.'"'; 01739 $tagName = $options['useIndexTagForNum'] ? $options['useIndexTagForNum'] : 'numIndex'; 01740 } 01741 } elseif($options['useIndexTagForAssoc']) { // Use tag for all associative keys: 01742 $attr.=' index="'.htmlspecialchars($tagName).'"'; 01743 $tagName = $options['useIndexTagForAssoc']; 01744 } elseif(isset($options['parentTagMap'][$parentTagName])) { // Use tag based on parent tag name: 01745 $attr.=' index="'.htmlspecialchars($tagName).'"'; 01746 $tagName = (string)$options['parentTagMap'][$parentTagName]; 01747 } 01748 01749 // The tag name is cleaned up so only alphanumeric chars (plus - and _) are in there and not longer than 100 chars either. 01750 $tagName = substr(ereg_replace('[^[:alnum:]_-]','',$tagName),0,100); 01751 01752 // If the value is an array then we will call this function recursively: 01753 if (is_array($v)) { 01754 // Sub elements: 01755 $content = chr(10).t3lib_div::array2xml($v,$NSprefix,$level+1,'',$spaceInd,$options,$tagName). 01756 str_pad('',($level+1)*$indentN,$indentChar); 01757 $attr.=' type="array"'; 01758 } else { // Just a value: 01759 01760 // Look for binary chars: 01761 if (strcspn($v,$binaryChars) != strlen($v)) { // Go for base64 encoding if the initial segment NOT matching any binary char has the same length as the whole string! 01762 // If the value contained binary chars then we base64-encode it an set an attribute to notify this situation: 01763 $content = chr(10).chunk_split(base64_encode($v)); 01764 $attr.=' base64="1"'; 01765 } else { 01766 // Otherwise, just htmlspecialchar the stuff: 01767 $content = htmlspecialchars($v); 01768 $dType = gettype($v); 01769 if ($dType!='string') { $attr.=' type="'.$dType.'"'; } 01770 } 01771 } 01772 01773 // Add the element to the output string: 01774 $output.=str_pad('',($level+1)*$indentN,$indentChar).'<'.$NSprefix.$tagName.$attr.'>'.$content.'</'.$NSprefix.$tagName.'>'.chr(10); 01775 } 01776 } 01777 01778 // If we are at the outer-most level, then we finally wrap it all in the document tags and return that as the value: 01779 if (!$level) { 01780 $output = 01781 '<'.$docTag.'>'.chr(10). 01782 $output. 01783 '</'.$docTag.'>'; 01784 } 01785 01786 return $output; 01787 } 01788 01799 function xml2array($string,$NSprefix='') { 01800 global $TYPO3_CONF_VARS; 01801 01802 // Create parser: 01803 $parser = xml_parser_create(); 01804 $vals = array(); 01805 $index = array(); 01806 01807 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); 01808 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0); 01809 01810 // PHP5 fix of charset awareness: 01811 // Problem is: PHP5 apparently detects the charset of the XML file (or defaults to utf-8) and will AUTOMATICALLY convert the content to either utf-8, iso-8859-1 or us-ascii. PHP4 just passed the content through without taking action regarding the charset. 01812 // In TYPO3 we expect that the charset of XML content is NOT handled in the parser but internally in TYPO3 instead. THerefore it would be very nice if PHP5 could be configured to NOT process the charset of the files. But this is not possible for now. 01813 // What we do here fixes the problem but ONLY if the charset is utf-8, iso-8859-1 or us-ascii. That should work for most TYPO3 installations, in particular if people use utf-8 which we highly recommend. 01814 if ((double)phpversion()>=5) { 01815 unset($ereg_result); 01816 ereg('^[[:space:]]*<\?xml[^>]*encoding[[:space:]]*=[[:space:]]*"([^"]*)"',substr($string,0,200),$ereg_result); 01817 $theCharset = $ereg_result[1] ? $ereg_result[1] : ($TYPO3_CONF_VARS['BE']['forceCharset'] ? $TYPO3_CONF_VARS['BE']['forceCharset'] : 'iso-8859-1'); 01818 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $theCharset); // us-ascii / utf-8 / iso-8859-1 01819 } 01820 01821 // Parse content: 01822 xml_parse_into_struct($parser, $string, $vals, $index); 01823 01824 // If error, return error message: 01825 if (xml_get_error_code($parser)) return 'Line '.xml_get_current_line_number($parser).': '.xml_error_string(xml_get_error_code($parser)); 01826 xml_parser_free($parser); 01827 01828 // Init vars: 01829 $stack = array(array()); 01830 $stacktop = 0; 01831 $current=array(); 01832 $tagName=''; 01833 01834 // Traverse the parsed XML structure: 01835 foreach($vals as $key => $val) { 01836 01837 // First, process the tag-name (which is used in both cases, whether "complete" or "close") 01838 $tagName = $val['tag']; 01839 01840 // Test for name space: 01841 $tagName = ($NSprefix && substr($tagName,0,strlen($NSprefix))==$NSprefix) ? substr($tagName,strlen($NSprefix)) : $tagName; 01842 01843 // Test for numeric tag, encoded on the form "nXXX": 01844 $testNtag = substr($tagName,1); // Closing tag. 01845 $tagName = (substr($tagName,0,1)=='n' && !strcmp(intval($testNtag),$testNtag)) ? intval($testNtag) : $tagName; 01846 01847 // Test for alternative index value: 01848 if (strlen($val['attributes']['index'])) { $tagName = $val['attributes']['index']; } 01849 01850 // Setting tag-values, manage stack: 01851 switch($val['type']) { 01852 case 'open': // If open tag it means there is an array stored in sub-elements. Therefore increase the stackpointer and reset the accumulation array: 01853 $current[$tagName] = array(); // Setting blank place holder 01854 $stack[$stacktop++] = $current; 01855 $current = array(); 01856 break; 01857 case 'close': // If the tag is "close" then it is an array which is closing and we decrease the stack pointer. 01858 $oldCurrent = $current; 01859 $current = $stack[--$stacktop]; 01860 end($current); // Going to the end of array to get placeholder key, key($current), and fill in array next: 01861 $current[key($current)] = $oldCurrent; 01862 unset($oldCurrent); 01863 break; 01864 case 'complete': // If "complete", then it's a value. If the attribute "base64" is set, then decode the value, otherwise just set it. 01865 if ($val['attributes']['base64']) { 01866 $current[$tagName] = base64_decode($val['value']); 01867 } else { 01868 $current[$tagName] = (string)$val['value']; // Had to cast it as a string - otherwise it would be evaluate false if tested with isset()!! 01869 01870 // Cast type: 01871 switch((string)$val['attributes']['type']) { 01872 case 'integer': 01873 $current[$tagName] = (integer)$current[$tagName]; 01874 break; 01875 case 'double': 01876 $current[$tagName] = (double)$current[$tagName]; 01877 break; 01878 case 'boolean': 01879 $current[$tagName] = (bool)$current[$tagName]; 01880 break; 01881 case 'array': 01882 $current[$tagName] = array(); // MUST be an empty array since it is processed as a value; Empty arrays would end up here because they would have no tags inside... 01883 break; 01884 } 01885 } 01886 break; 01887 } 01888 } 01889 01890 // Finally return the content of the document tag. 01891 return $current[$tagName]; 01892 } 01893 01901 function xmlRecompileFromStructValArray($vals) { 01902 $XMLcontent=''; 01903 01904 foreach($vals as $val) { 01905 $type = $val['type']; 01906 01907 // open tag: 01908 if ($type=='open' || $type=='complete') { 01909 $XMLcontent.='<'.$val['tag']; 01910 if(isset($val['attributes'])) { 01911 foreach($val['attributes'] as $k => $v) { 01912 $XMLcontent.=' '.$k.'="'.htmlspecialchars($v).'"'; 01913 } 01914 } 01915 if ($type=='complete') { 01916 if(isset($val['value'])) { 01917 $XMLcontent.='>'.htmlspecialchars($val['value']).'</'.$val['tag'].'>'; 01918 } else $XMLcontent.='/>'; 01919 } else $XMLcontent.='>'; 01920 01921 if ($type=='open' && isset($val['value'])) { 01922 $XMLcontent.=htmlspecialchars($val['value']); 01923 } 01924 } 01925 // finish tag: 01926 if ($type=='close') { 01927 $XMLcontent.='</'.$val['tag'].'>'; 01928 } 01929 // cdata 01930 if($type=='cdata') { 01931 $XMLcontent.=htmlspecialchars($val['value']); 01932 } 01933 } 01934 01935 return $XMLcontent; 01936 } 01937 01945 function xmlGetHeaderAttribs($xmlData) { 01946 $xmlHeader = substr(trim($xmlData),0,200); 01947 $reg=array(); 01948 if (eregi('^<\?xml([^>]*)\?\>',$xmlHeader,$reg)) { 01949 return t3lib_div::get_tag_attributes($reg[1]); 01950 } 01951 } 01952 01953 01954 01955 01956 01957 01958 01959 01960 01961 01962 01963 /************************* 01964 * 01965 * FILES FUNCTIONS 01966 * 01967 *************************/ 01968 01977 function getURL($url) { 01978 $content = ''; 01979 01980 // (Proxy support implemented by Arco <arco@appeltaart.mine.nu>) 01981 if((substr($url,0,7)=='http://') && ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlUse']=='1')) { 01982 //external URL without error checking. 01983 $ch = curl_init(); 01984 curl_setopt ($ch,CURLOPT_URL, $url); 01985 curl_setopt ($ch,CURLOPT_HEADER, 0); 01986 curl_setopt ($ch,CURLOPT_RETURNTRANSFER, 1); 01987 01988 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyServer']) { 01989 curl_setopt ($ch, CURLOPT_PROXY, $GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyServer']); 01990 01991 // I don't know if it will be needed 01992 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyTunnel']) { 01993 curl_setopt ($ch, CURLOPT_HTTPPROXYTUNNEL, $GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyTunnel'] ); 01994 } 01995 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyUserPass']) { 01996 curl_setopt ($ch, CURLOPT_PROXYUSERPWD, $GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyUserPass'] ); 01997 } 01998 } 01999 $content=curl_exec ($ch); 02000 curl_close ($ch); 02001 return $content; 02002 } elseif($fd = fopen($url,'rb')) { 02003 while (!feof($fd)) { 02004 $content.=fread($fd, 5000); 02005 } 02006 fclose($fd); 02007 return $content; 02008 } 02009 } 02010 02019 function writeFile($file,$content) { 02020 if($fd = fopen($file,'wb')) { 02021 fwrite( $fd, $content); 02022 fclose( $fd ); 02023 02024 // Setting file system mode & group ownership of file: 02025 if (@is_file($file) && TYPO3_OS!='WIN') { 02026 @chmod($file, octdec($GLOBALS['TYPO3_CONF_VARS']['BE']['fileCreateMask'])); // "@" is there because file is not necessarily OWNED by the user 02027 if($GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']) { // skip this if createGroup is empty 02028 @chgrp($file, $GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']); // "@" is there because file is not necessarily OWNED by the user 02029 } 02030 } 02031 02032 return true; 02033 } 02034 } 02035 02044 function writeFileToTypo3tempDir($filepath,$content) { 02045 02046 // Parse filepath into directory and basename: 02047 $fI = pathinfo($filepath); 02048 $fI['dirname'].= '/'; 02049 02050 // Check parts: 02051 if (t3lib_div::validPathStr($filepath) && $fI['basename'] && strlen($fI['basename'])<60) { 02052 if (defined('PATH_site')) { 02053 $dirName = PATH_site.'typo3temp/'; // Setting main temporary directory name (standard) 02054 if (@is_dir($dirName)) { 02055 if (t3lib_div::isFirstPartOfStr($fI['dirname'],$dirName)) { 02056 02057 // Checking if the "subdir" is found: 02058 $subdir = substr($fI['dirname'],strlen($dirName)); 02059 if ($subdir) { 02060 if (ereg('^[[:alnum:]_]+\/$',$subdir)) { 02061 $dirName.= $subdir; 02062 if (!@is_dir($dirName)) { 02063 t3lib_div::mkdir($dirName); 02064 } 02065 } else return 'Subdir, "'.$subdir.'", was NOT on the form "[a-z]/"'; 02066 } 02067 // Checking dir-name again (sub-dir might have been created): 02068 if (@is_dir($dirName)) { 02069 if ($filepath == $dirName.$fI['basename']) { 02070 t3lib_div::writeFile($filepath, $content); 02071 if (!@is_file($filepath)) return 'File not written to disk! Write permission error in filesystem?'; 02072 } else return 'Calculated filelocation didn\'t match input $filepath!'; 02073 } else return '"'.$dirName.'" is not a directory!'; 02074 } else return '"'.$fI['dirname'].'" was not within directory PATH_site + "typo3temp/"'; 02075 } else return 'PATH_site + "typo3temp/" was not a directory!'; 02076 } else return 'PATH_site constant was NOT defined!'; 02077 } else return 'Input filepath "'.$filepath.'" was generally invalid!'; 02078 } 02079 02087 function mkdir($theNewFolder) { 02088 $theNewFolder = ereg_replace('\/$','',$theNewFolder); 02089 if (mkdir($theNewFolder, octdec($GLOBALS['TYPO3_CONF_VARS']['BE']['folderCreateMask']))){ 02090 chmod($theNewFolder, octdec($GLOBALS['TYPO3_CONF_VARS']['BE']['folderCreateMask'])); //added this line, because the mode at 'mkdir' has a strange behaviour sometimes 02091 02092 if($GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']) { // skip this if createGroup is empty 02093 chgrp($theNewFolder, $GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']); 02094 } 02095 return TRUE; 02096 } 02097 } 02098 02107 function get_dirs($path) { 02108 if ($path) { 02109 $d = @dir($path); 02110 if (is_object($d)) { 02111 while($entry=$d->read()) { 02112 if (@is_dir($path.'/'.$entry) && $entry!= '..' && $entry!= '.') { 02113 $filearray[]=$entry; 02114 } 02115 } 02116 $d->close(); 02117 } else return 'error'; 02118 return $filearray; 02119 } 02120 } 02121 02132 function getFilesInDir($path,$extensionList='',$prependPath=0,$order='') { 02133 02134 // Initialize variabels: 02135 $filearray = array(); 02136 $sortarray = array(); 02137 $path = ereg_replace('\/$','',$path); 02138 02139 // Find files+directories: 02140 if (@is_dir($path)) { 02141 $extensionList = strtolower($extensionList); 02142 $d = dir($path); 02143 if (is_object($d)) { 02144 while($entry=$d->read()) { 02145 if (@is_file($path.'/'.$entry)) { 02146 $fI = pathinfo($entry); 02147 $key = md5($path.'/'.$entry); 02148 if (!$extensionList || t3lib_div::inList($extensionList,strtolower($fI['extension']))) { 02149 $filearray[$key]=($prependPath?$path.'/':'').$entry; 02150 if ($order=='mtime') {$sortarray[$key]=filemtime($path.'/'.$entry);} 02151 elseif ($order) {$sortarray[$key]=$entry;} 02152 } 02153 } 02154 } 02155 $d->close(); 02156 } else return 'error opening path: "'.$path.'"'; 02157 } 02158 02159 // Sort them: 02160 if ($order) { 02161 asort($sortarray); 02162 reset($sortarray); 02163 $newArr=array(); 02164 while(list($k,$v)=each($sortarray)) { 02165 $newArr[$k]=$filearray[$k]; 02166 } 02167 $filearray=$newArr; 02168 } 02169 02170 // Return result 02171 reset($filearray); 02172 return $filearray; 02173 } 02174 02186 function getAllFilesAndFoldersInPath($fileArr,$path,$extList='',$regDirs=0,$recursivityLevels=99) { 02187 if ($regDirs) $fileArr[] = $path; 02188 $fileArr = array_merge($fileArr, t3lib_div::getFilesInDir($path,$extList,1,1)); 02189 02190 $dirs = t3lib_div::get_dirs($path); 02191 if (is_array($dirs) && $recursivityLevels>0) { 02192 foreach ($dirs as $subdirs) { 02193 if ((string)$subdirs!='') { 02194 $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr,$path.$subdirs.'/',$extList,$regDirs,$recursivityLevels-1); 02195 } 02196 } 02197 } 02198 return $fileArr; 02199 } 02200 02209 function removePrefixPathFromList($fileArr,$prefixToRemove) { 02210 foreach($fileArr as $k => $absFileRef) { 02211 if(t3lib_div::isFirstPartOfStr($absFileRef,$prefixToRemove)) { 02212 $fileArr[$k] = substr($absFileRef,strlen($prefixToRemove)); 02213 } else return 'ERROR: One or more of the files was NOT prefixed with the prefix-path!'; 02214 } 02215 return $fileArr; 02216 } 02217 02225 function fixWindowsFilePath($theFile) { 02226 return str_replace('//','/', str_replace('\\','/', $theFile)); 02227 } 02228 02237 function resolveBackPath($pathStr) { 02238 $parts = explode('/',$pathStr); 02239 $output=array(); 02240 foreach($parts as $pV) { 02241 if ($pV=='..') { 02242 if ($c) { 02243 array_pop($output); 02244 $c--; 02245 } else $output[]=$pV; 02246 } else { 02247 $c++; 02248 $output[]=$pV; 02249 } 02250 } 02251 return implode('/',$output); 02252 } 02253 02264 function locationHeaderUrl($path) { 02265 $uI = parse_url($path); 02266 if (substr($path,0,1)=='/') { // relative to HOST 02267 $path = t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').$path; 02268 } elseif (!$uI['scheme']) { // No scheme either 02269 $path = t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR').$path; 02270 } 02271 return $path; 02272 } 02273 02274 02275 02276 02277 02278 02279 02280 02281 02282 02283 02284 02285 02286 02287 02288 02289 /************************* 02290 * 02291 * DEBUG helper FUNCTIONS 02292 * 02293 *************************/ 02294 02304 function debug_ordvalue($string,$characters=100) { 02305 if(strlen($string) < $characters) $characters = strlen($string); 02306 for ($i=0; $i<$characters; $i++) { 02307 $valuestring.=' '.ord(substr($string,$i,1)); 02308 } 02309 return trim($valuestring); 02310 } 02311 02321 function view_array($array_in) { 02322 if (is_array($array_in)) { 02323 $result='<table border="1" cellpadding="1" cellspacing="0" bgcolor="white">'; 02324 if (!count($array_in)) {$result.= '<tr><td><font face="Verdana,Arial" size="1"><b>'.htmlspecialchars("EMPTY!").'</b></font></td></tr>';} 02325 while (list($key,$val)=each($array_in)) { 02326 $result.= '<tr><td><font face="Verdana,Arial" size="1">'.htmlspecialchars((string)$key).'</font></td><td>'; 02327 if (is_array($array_in[$key])) { 02328 $result.=t3lib_div::view_array($array_in[$key]); 02329 } else 02330 $result.= '<font face="Verdana,Arial" size="1" color="red">'.nl2br(htmlspecialchars((string)$val)).'<br /></font>'; 02331 $result.= '</td></tr>'; 02332 } 02333 $result.= '</table>'; 02334 } else { 02335 $result = false; 02336 } 02337 return $result; 02338 } 02339 02349 function print_array($array_in) { 02350 echo t3lib_div::view_array($array_in); 02351 } 02352 02364 function debug($var="",$brOrHeader=0) { 02365 if ($brOrHeader && !t3lib_div::testInt($brOrHeader)) { 02366 echo '<table border="0" cellpadding="0" cellspacing="0" bgcolor="white" style="border:0px; margin-top:3px; margin-bottom:3px;"><tr><td style="background-color:#bbbbbb; font-family: verdana,arial; font-weight: bold; font-size: 10px;">'.htmlspecialchars((string)$brOrHeader).'</td></tr><td>'; 02367 } elseif ($brOrHeader<0) { 02368 for($a=0;$a<abs(intval($brOrHeader));$a++){echo '<br />';} 02369 } 02370 02371 if (is_array($var)) { 02372 t3lib_div::print_array($var); 02373 } elseif (is_object($var)) { 02374 echo '<b>|Object:<pre>'; 02375 print_r($var); 02376 echo '</pre>|</b>'; 02377 } elseif ((string)$var!='') { 02378 echo '<b>|'.htmlspecialchars((string)$var).'|</b>'; 02379 } else { 02380 echo '<b>| debug |</b>'; 02381 } 02382 02383 if ($brOrHeader && !t3lib_div::testInt($brOrHeader)) { 02384 echo '</td></tr></table>'; 02385 } elseif ($brOrHeader>0) { 02386 for($a=0;$a<intval($brOrHeader);$a++){echo '<br />';} 02387 } 02388 } 02389 02390 02391 02392 02393 02394 02395 02396 02397 02398 02399 02400 02401 02402 02403 02404 02405 02406 02407 02408 02409 02410 02411 02412 02413 02414 02415 02416 02417 02418 02419 02420 02421 /************************* 02422 * 02423 * SYSTEM INFORMATION 02424 * 02425 *************************/ 02426 02433 function getThisUrl() { 02434 $p=parse_url(t3lib_div::getIndpEnv('TYPO3_REQUEST_SCRIPT')); // Url of this script 02435 $dir=t3lib_div::dirname($p['path']).'/'; // Strip file 02436 $url = str_replace('//','/',$p['host'].($p['port']?':'.$p['port']:'').$dir); 02437 return $url; 02438 } 02439 02449 function linkThisScript($getParams=array()) { 02450 $parts = t3lib_div::getIndpEnv('SCRIPT_NAME'); 02451 $params = t3lib_div::_GET(); 02452 02453 foreach($getParams as $k => $v) { 02454 if (strcmp($v,'')) { 02455 $params[$k]=$v; 02456 } else unset($params[$k]); 02457 } 02458 02459 $pString = t3lib_div::implodeArrayForUrl('',$params); 02460 02461 return $pString ? $parts.'?'.ereg_replace('^&','',$pString) : $parts; 02462 } 02463 02473 function linkThisUrl($url,$getParams=array()) { 02474 $parts = parse_url($url); 02475 if ($parts['query']) { 02476 parse_str($parts['query'],$getP); 02477 } else { 02478 $getP = array(); 02479 } 02480 02481 $getP = t3lib_div::array_merge_recursive_overrule($getP,$getParams); 02482 $uP = explode('?',$url); 02483 02484 $params = t3lib_div::implodeArrayForUrl('',$getP); 02485 $outurl = $uP[0].($params ? '?'.substr($params, 1) : ''); 02486 02487 return $outurl; 02488 } 02489 02498 function getIndpEnv($getEnvName) { 02499 /* 02500 Conventions: 02501 output from parse_url(): 02502 URL: http://username:password@192.168.1.4:8080/typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/?arg1,arg2,arg3&p1=parameter1&p2[key]=value#link1 02503 [scheme] => 'http' 02504 [user] => 'username' 02505 [pass] => 'password' 02506 [host] => '192.168.1.4' 02507 [port] => '8080' 02508 [path] => '/typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/' 02509 [query] => 'arg1,arg2,arg3&p1=parameter1&p2[key]=value' 02510 [fragment] => 'link1' 02511 02512 Further definition: [path_script] = '/typo3/32/temp/phpcheck/index.php' 02513 [path_dir] = '/typo3/32/temp/phpcheck/' 02514 [path_info] = '/arg1/arg2/arg3/' 02515 [path] = [path_script/path_dir][path_info] 02516 02517 02518 Keys supported: 02519 02520 URI______: 02521 REQUEST_URI = [path]?[query] = /typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/?arg1,arg2,arg3&p1=parameter1&p2[key]=value 02522 HTTP_HOST = [host][:[port]] = 192.168.1.4:8080 02523 SCRIPT_NAME = [path_script]++ = /typo3/32/temp/phpcheck/index.php // NOTICE THAT SCRIPT_NAME will return the php-script name ALSO. [path_script] may not do that (eg. '/somedir/' may result in SCRIPT_NAME '/somedir/index.php')! 02524 PATH_INFO = [path_info] = /arg1/arg2/arg3/ 02525 QUERY_STRING = [query] = arg1,arg2,arg3&p1=parameter1&p2[key]=value 02526 HTTP_REFERER = [scheme]://[host][:[port]][path] = http://192.168.1.4:8080/typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/?arg1,arg2,arg3&p1=parameter1&p2[key]=value 02527 (Notice: NO username/password + NO fragment) 02528 02529 CLIENT____: 02530 REMOTE_ADDR = (client IP) 02531 REMOTE_HOST = (client host) 02532 HTTP_USER_AGENT = (client user agent) 02533 HTTP_ACCEPT_LANGUAGE = (client accept language) 02534 02535 SERVER____: 02536 SCRIPT_FILENAME = Absolute filename of script (Differs between windows/unix). On windows 'C:\\blabla\\blabl\\' will be converted to 'C:/blabla/blabl/' 02537 02538 Special extras: 02539 TYPO3_HOST_ONLY = [host] = 192.168.1.4 02540 TYPO3_PORT = [port] = 8080 (blank if 80, taken from host value) 02541 TYPO3_REQUEST_HOST = [scheme]://[host][:[port]] 02542 TYPO3_REQUEST_URL = [scheme]://[host][:[port]][path]?[query] (sheme will by default be 'http' until we can detect if it's https - 02543 TYPO3_REQUEST_SCRIPT = [scheme]://[host][:[port]][path_script] 02544 TYPO3_REQUEST_DIR = [scheme]://[host][:[port]][path_dir] 02545 TYPO3_SITE_URL = [scheme]://[host][:[port]][path_dir] of the TYPO3 website frontend 02546 TYPO3_SITE_SCRIPT = [script / Speaking URL] of the TYPO3 website 02547 TYPO3_DOCUMENT_ROOT = Absolute path of root of documents: TYPO3_DOCUMENT_ROOT.SCRIPT_NAME = SCRIPT_FILENAME (typically) 02548 02549 Notice: [fragment] is apparently NEVER available to the script! 02550 02551 02552 Testing suggestions: 02553 - Output all the values. 02554 - In the script, make a link to the script it self, maybe add some parameters and click the link a few times so HTTP_REFERER is seen 02555 - ALSO TRY the script from the ROOT of a site (like 'http://www.mytest.com/' and not 'http://www.mytest.com/test/' !!) 02556 02557 */ 02558 02559 # if ($getEnvName=='HTTP_REFERER') return ''; 02560 switch((string)$getEnvName) { 02561 case 'SCRIPT_NAME': 02562 return (php_sapi_name()=='cgi'||php_sapi_name()=='cgi-fcgi')&&($_SERVER['ORIG_PATH_INFO']?$_SERVER['ORIG_PATH_INFO']:$_SERVER['PATH_INFO']) ? ($_SERVER['ORIG_PATH_INFO']?$_SERVER['ORIG_PATH_INFO']:$_SERVER['PATH_INFO']) : ($_SERVER['ORIG_SCRIPT_NAME']?$_SERVER['ORIG_SCRIPT_NAME']:$_SERVER['SCRIPT_NAME']); 02563 break; 02564 case 'SCRIPT_FILENAME': 02565 return str_replace('//','/', str_replace('\\','/', (php_sapi_name()=='cgi'||php_sapi_name()=='isapi' ||php_sapi_name()=='cgi-fcgi')&&($_SERVER['ORIG_PATH_TRANSLATED']?$_SERVER['ORIG_PATH_TRANSLATED']:$_SERVER['PATH_TRANSLATED'])? ($_SERVER['ORIG_PATH_TRANSLATED']?$_SERVER['ORIG_PATH_TRANSLATED']:$_SERVER['PATH_TRANSLATED']):($_SERVER['ORIG_SCRIPT_FILENAME']?$_SERVER['ORIG_SCRIPT_FILENAME']:$_SERVER['SCRIPT_FILENAME']))); 02566 break; 02567 case 'REQUEST_URI': 02568 // Typical application of REQUEST_URI is return urls, forms submitting to itselt etc. Eg: returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI')) 02569 if (!$_SERVER['REQUEST_URI']) { // This is for ISS/CGI which does not have the REQUEST_URI available. 02570 return '/'.ereg_replace('^/','',t3lib_div::getIndpEnv('SCRIPT_NAME')). 02571 ($_SERVER['QUERY_STRING']?'?'.$_SERVER['QUERY_STRING']:''); 02572 } else return $_SERVER['REQUEST_URI']; 02573 break; 02574 case 'PATH_INFO': 02575 // $_SERVER['PATH_INFO']!=$_SERVER['SCRIPT_NAME'] is necessary because some servers (Windows/CGI) are seen to set PATH_INFO equal to script_name 02576 // Further, there must be at least one '/' in the path - else the PATH_INFO value does not make sense. 02577 // IF 'PATH_INFO' never works for our purpose in TYPO3 with CGI-servers, then 'php_sapi_name()=='cgi'' might be a better check. Right now strcmp($_SERVER['PATH_INFO'],t3lib_div::getIndpEnv('SCRIPT_NAME')) will always return false for CGI-versions, but that is only as long as SCRIPT_NAME is set equal to PATH_INFO because of php_sapi_name()=='cgi' (see above) 02578 // if (strcmp($_SERVER['PATH_INFO'],t3lib_div::getIndpEnv('SCRIPT_NAME')) && count(explode('/',$_SERVER['PATH_INFO']))>1) { 02579 if (php_sapi_name()!='cgi'&&php_sapi_name()!='cgi-fcgi') { 02580 return $_SERVER['PATH_INFO']; 02581 } else return ''; 02582 break; 02583 // These are let through without modification 02584 case 'REMOTE_ADDR': 02585 case 'REMOTE_HOST': 02586 case 'HTTP_REFERER': 02587 case 'HTTP_HOST': 02588 case 'HTTP_USER_AGENT': 02589 case 'HTTP_ACCEPT_LANGUAGE': 02590 case 'QUERY_STRING': 02591 return $_SERVER[$getEnvName]; 02592 break; 02593 case 'TYPO3_DOCUMENT_ROOT': 02594 // Some CGI-versions (LA13CGI) and mod-rewrite rules on MODULE versions will deliver a 'wrong' DOCUMENT_ROOT (according to our description). Further various aliases/mod_rewrite rules can disturb this as well. 02595 // Therefore the DOCUMENT_ROOT is now always calculated as the SCRIPT_FILENAME minus the end part shared with SCRIPT_NAME. 02596 $SFN = t3lib_div::getIndpEnv('SCRIPT_FILENAME'); 02597 $SN_A = explode('/',strrev(t3lib_div::getIndpEnv('SCRIPT_NAME'))); 02598 $SFN_A = explode('/',strrev($SFN)); 02599 $acc = array(); 02600 while(list($kk,$vv)=each($SN_A)) { 02601 if (!strcmp($SFN_A[$kk],$vv)) { 02602 $acc[] = $vv; 02603 } else break; 02604 } 02605 $commonEnd=strrev(implode('/',$acc)); 02606 if (strcmp($commonEnd,'')) $DR = substr($SFN,0,-(strlen($commonEnd)+1)); 02607 return $DR; 02608 break; 02609 case 'TYPO3_HOST_ONLY': 02610 $p = explode(':',$_SERVER['HTTP_HOST']); 02611 return $p[0]; 02612 break; 02613 case 'TYPO3_PORT': 02614 $p = explode(':',$_SERVER['HTTP_HOST']); 02615 return $p[1]; 02616 break; 02617 case 'TYPO3_REQUEST_HOST': 02618 return (t3lib_div::getIndpEnv('TYPO3_SSL') ? 'https://' : 'http://'). 02619 $_SERVER['HTTP_HOST']; 02620 break; 02621 case 'TYPO3_REQUEST_URL': 02622 return t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').t3lib_div::getIndpEnv('REQUEST_URI'); 02623 break; 02624 case 'TYPO3_REQUEST_SCRIPT': 02625 return t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').t3lib_div::getIndpEnv('SCRIPT_NAME'); 02626 break; 02627 case 'TYPO3_REQUEST_DIR': 02628 return t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').t3lib_div::dirname(t3lib_div::getIndpEnv('SCRIPT_NAME')).'/'; 02629 break; 02630 case 'TYPO3_SITE_URL': 02631 if (defined('PATH_thisScript') && defined('PATH_site')) { 02632 $lPath = substr(dirname(PATH_thisScript),strlen(PATH_site)).'/'; 02633 $url = t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR'); 02634 $siteUrl = substr($url,0,-strlen($lPath)); 02635 if (substr($siteUrl,-1)!='/') $siteUrl.='/'; 02636 return $siteUrl; 02637 } else return ''; 02638 break; 02639 case 'TYPO3_SITE_SCRIPT': 02640 return substr(t3lib_div::getIndpEnv('TYPO3_REQUEST_URL'),strlen(t3lib_div::getIndpEnv('TYPO3_SITE_URL'))); 02641 break; 02642 case 'TYPO3_SSL': 02643 return $_SERVER['SSL_SESSION_ID'] || !strcmp($_SERVER['HTTPS'],'on') ? TRUE : FALSE; 02644 break; 02645 case '_ARRAY': 02646 $out = array(); 02647 // Here, list ALL possible keys to this function for debug display. 02648 $envTestVars = t3lib_div::trimExplode(',',' 02649 HTTP_HOST, 02650 TYPO3_HOST_ONLY, 02651 TYPO3_PORT, 02652 PATH_INFO, 02653 QUERY_STRING, 02654 REQUEST_URI, 02655 HTTP_REFERER, 02656 TYPO3_REQUEST_HOST, 02657 TYPO3_REQUEST_URL, 02658 TYPO3_REQUEST_SCRIPT, 02659 TYPO3_REQUEST_DIR, 02660 TYPO3_SITE_URL, 02661 TYPO3_SITE_SCRIPT, 02662 TYPO3_SSL, 02663 SCRIPT_NAME, 02664 TYPO3_DOCUMENT_ROOT, 02665 SCRIPT_FILENAME, 02666 REMOTE_ADDR, 02667 REMOTE_HOST, 02668 HTTP_USER_AGENT, 02669 HTTP_ACCEPT_LANGUAGE',1); 02670 reset($envTestVars); 02671 while(list(,$v)=each($envTestVars)) { 02672 $out[$v]=t3lib_div::getIndpEnv($v); 02673 } 02674 reset($out); 02675 return $out; 02676 break; 02677 } 02678 } 02679 02687 function milliseconds() { 02688 $p=explode(' ',microtime()); 02689 return round(($p[0]+$p[1])*1000); 02690 } 02691 02699 function clientInfo($useragent='') { 02700 if (!$useragent) $useragent=t3lib_div::getIndpEnv('HTTP_USER_AGENT'); 02701 02702 $bInfo=array(); 02703 // Which browser? 02704 if (strstr($useragent,'Konqueror')) { 02705 $bInfo['BROWSER']= 'konqu'; 02706 } elseif (strstr($useragent,'Opera')) { 02707 $bInfo['BROWSER']= 'opera'; 02708 } elseif (strstr($useragent,'MSIE 4') || strstr($useragent,'MSIE 5') || strstr($useragent,'MSIE 6')) { 02709 $bInfo['BROWSER']= 'msie'; 02710 } elseif (strstr($useragent,'Mozilla/4') || strstr($useragent,'Mozilla/5')) { 02711 $bInfo['BROWSER']='net'; 02712 } 02713 if ($bInfo['BROWSER']) { 02714 // Browser version 02715 switch($bInfo['BROWSER']) { 02716 case 'net': 02717 $bInfo['VERSION']= doubleval(substr($useragent,8)); 02718 if (strstr($useragent,'Netscape6/')) {$bInfo['VERSION']=doubleval(substr(strstr($useragent,'Netscape6/'),10));} 02719 if (strstr($useragent,'Netscape/7')) {$bInfo['VERSION']=doubleval(substr(strstr($useragent,'Netscape/7'),9));} 02720 break; 02721 case 'msie': 02722 $tmp = strstr($useragent,'MSIE'); 02723 $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,4))); 02724 break; 02725 case 'opera': 02726 $tmp = strstr($useragent,'Opera'); 02727 $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,5))); 02728 break; 02729 case 'konqu': 02730 $tmp = strstr($useragent,'Konqueror/'); 02731 $bInfo['VERSION'] = doubleval(substr($tmp,10)); 02732 break; 02733 } 02734 // Client system 02735 if (strstr($useragent,'Win')) { 02736 $bInfo['SYSTEM'] = 'win'; 02737 } elseif (strstr($useragent,'Mac')) { 02738 $bInfo['SYSTEM'] = 'mac'; 02739 } elseif (strstr($useragent,'Linux') || strstr($useragent,'X11') || strstr($useragent,'SGI') || strstr($useragent,' SunOS ') || strstr($useragent,' HP-UX ')) { 02740 $bInfo['SYSTEM'] = 'unix'; 02741 } 02742 } 02743 // Is true if the browser supports css to format forms, especially the width 02744 $bInfo['FORMSTYLE']=($bInfo['BROWSER']=='msie' || ($bInfo['BROWSER']=='net'&&$bInfo['VERSION']>=5) || $bInfo['BROWSER']=='opera' || $bInfo['BROWSER']=='konqu'); 02745 02746 return $bInfo; 02747 } 02748 02749 02750 02751 02752 02753 02754 02755 02756 02757 02758 02759 02760 02761 02762 02763 02764 02765 02766 02767 02768 02769 02770 02771 /************************* 02772 * 02773 * TYPO3 SPECIFIC FUNCTIONS 02774 * 02775 *************************/ 02776 02786 function getFileAbsFileName($filename,$onlyRelative=1,$relToTYPO3_mainDir=0) { 02787 if (!strcmp($filename,'')) return ''; 02788 02789 if ($relToTYPO3_mainDir) { 02790 if (!defined('PATH_typo3')) return ''; 02791 $relPathPrefix = PATH_typo3; 02792 } else { 02793 $relPathPrefix = PATH_site; 02794 } 02795 if (substr($filename,0,4)=='EXT:') { // extension 02796 list($extKey,$local) = explode('/',substr($filename,4),2); 02797 $filename=''; 02798 if (strcmp($extKey,'') && t3lib_extMgm::isLoaded($extKey) && strcmp($local,'')) { 02799 $filename = t3lib_extMgm::extPath($extKey).$local; 02800 } 02801 } elseif (!t3lib_div::isAbsPath($filename)) { // relative. Prepended with $relPathPrefix 02802 $filename=$relPathPrefix.$filename; 02803 } elseif ($onlyRelative && !t3lib_div::isFirstPartOfStr($filename,$relPathPrefix)) { // absolute, but set to blank if not allowed 02804 $filename=''; 02805 } 02806 if (strcmp($filename,'') && t3lib_div::validPathStr($filename)) { // checks backpath. 02807 return $filename; 02808 } 02809 } 02810 02822 function validPathStr($theFile) { 02823 if (!strstr($theFile,'//') && !strstr($theFile,'..') && !strstr($theFile,'\\')) return true; 02824 } 02825 02833 function isAbsPath($path) { 02834 return TYPO3_OS=='WIN' ? substr($path,1,2)==':/' : substr($path,0,1)=='/'; 02835 } 02836 02844 function isAllowedAbsPath($path) { 02845 if (t3lib_div::isAbsPath($path) && 02846 t3lib_div::validPathStr($path) && 02847 ( t3lib_div::isFirstPartOfStr($path,PATH_site) 02848 || 02849 ($GLOBALS['TYPO3_CONF_VARS']['BE']['lockRootPath'] && t3lib_div::isFirstPartOfStr($path,$GLOBALS['TYPO3_CONF_VARS']['BE']['lockRootPath'])) 02850 ) 02851 ) return true; 02852 } 02853 02861 function verifyFilenameAgainstDenyPattern($filename) { 02862 if (strcmp($filename,'') && strcmp($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'],'')) { 02863 $result = eregi($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'],$filename); 02864 if ($result) return false; // so if a matching filename is found, return false; 02865 } 02866 return true; 02867 } 02868 02879 function upload_copy_move($source,$destination) { 02880 if (is_uploaded_file($source)) { 02881 $uploaded = TRUE; 02882 // Return the value of move_uploaded_file, and if false the temporary $source is still around so the user can use unlink to delete it: 02883 $uploadedResult = move_uploaded_file($source, $destination); 02884 } else { 02885 $uploaded = FALSE; 02886 @copy($source,$destination); 02887 } 02888 02889 // Setting file system mode & group ownership of file: 02890 if (@is_file($destination) && TYPO3_OS!='WIN') { 02891 chmod($destination, octdec($GLOBALS['TYPO3_CONF_VARS']['BE']['fileCreateMask'])); 02892 if($GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']) { // skip this if createGroup is empty 02893 chgrp($destination, $GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']); 02894 } 02895 } 02896 02897 // If here the file is copied and the temporary $source is still around, so when returning false the user can try unlink to delete the $source 02898 return $uploaded ? $uploadedResult : FALSE; 02899 } 02900 02911 function upload_to_tempfile($uploadedFileName) { 02912 if (is_uploaded_file($uploadedFileName)) { 02913 $tempFile = t3lib_div::tempnam('upload_temp_'); 02914 move_uploaded_file($uploadedFileName, $tempFile); 02915 return @is_file($tempFile) ? $tempFile : ''; 02916 } 02917 } 02918 02929 function unlink_tempfile($uploadedTempFileName) { 02930 if ($uploadedTempFileName && t3lib_div::validPathStr($uploadedTempFileName) && t3lib_div::isFirstPartOfStr($uploadedTempFileName,PATH_site.'typo3temp/') && @is_file($uploadedTempFileName)) { 02931 if (unlink($uploadedTempFileName)) return TRUE; 02932 } 02933 } 02934 02945 function tempnam($filePrefix) { 02946 return tempnam(PATH_site.'typo3temp/',$filePrefix); 02947 } 02948 02958 function stdAuthCode($uid_or_record,$fields='') { 02959 if (is_array($uid_or_record)) { 02960 $recCopy_temp=array(); 02961 if ($fields) { 02962 $fieldArr = t3lib_div::trimExplode(',',$fields,1); 02963 reset($fieldArr); 02964 while(list($k,$v)=each($fieldArr)) { 02965 $recCopy_temp[$k]=$recCopy[$v]; 02966 } 02967 } else { 02968 $recCopy_temp=$recCopy; 02969 } 02970 $preKey = implode('|',$recCopy_temp); 02971 } else { 02972 $preKey = $uid_or_record; 02973 } 02974 02975 $authCode = $preKey.'||'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']; 02976 $authCode = substr(md5($authCode),0,8); 02977 return $authCode; 02978 } 02979 02992 function loadTCA($table) { 02993 global $TCA,$LANG_GENERAL_LABELS; 02994 if (isset($TCA[$table]) && !is_array($TCA[$table]['columns']) && $TCA[$table]['ctrl']['dynamicConfigFile']) { 02995 if (!strcmp(substr($TCA[$table]['ctrl']['dynamicConfigFile'],0,6),'T3LIB:')) { 02996 include(PATH_t3lib.'stddb/'.substr($TCA[$table]['ctrl']['dynamicConfigFile'],6)); 02997 } elseif (t3lib_div::isAbsPath($TCA[$table]['ctrl']['dynamicConfigFile']) && @is_file($TCA[$table]['ctrl']['dynamicConfigFile'])) { // Absolute path... 02998 include($TCA[$table]['ctrl']['dynamicConfigFile']); 02999 } else include(PATH_typo3conf.$TCA[$table]['ctrl']['dynamicConfigFile']); 03000 } 03001 } 03002 03012 function resolveSheetDefInDS($dataStructArray,$sheet='sDEF') { 03013 if (is_array($dataStructArray['sheets'])) { 03014 $singleSheet = FALSE; 03015 if (!isset($dataStructArray['sheets'][$sheet])) { 03016 $sheet='sDEF'; 03017 } 03018 $dataStruct = $dataStructArray['sheets'][$sheet]; 03019 03020 // If not an array, but still set, then regard it as a relative reference to a file: 03021 if ($dataStruct && !is_array($dataStruct)) { 03022 $file = t3lib_div::getFileAbsFileName($dataStruct); 03023 if ($file && @is_file($file)) { 03024 $dataStruct = t3lib_div::xml2array(t3lib_div::getUrl($file)); 03025 } 03026 } 03027 } else { 03028 $singleSheet = TRUE; 03029 $dataStruct = $dataStructArray; 03030 $sheet = 'sDEF'; // Default sheet 03031 } 03032 return array($dataStruct,$sheet,$singleSheet); 03033 } 03034 03042 function resolveAllSheetsInDS($dataStructArray) { 03043 if (is_array($dataStructArray['sheets'])) { 03044 $out=array('sheets'=>array()); 03045 foreach($dataStructArray['sheets'] as $sheetId => $sDat) { 03046 list($ds,$aS) = t3lib_div::resolveSheetDefInDS($dataStructArray,$sheetId); 03047 if ($sheetId==$aS) { 03048 $out['sheets'][$aS]=$ds; 03049 } 03050 } 03051 } else { 03052 list($ds) = t3lib_div::resolveSheetDefInDS($dataStructArray); 03053 $out = array('sheets' => array('sDEF' => $ds)); 03054 } 03055 return $out; 03056 } 03057 03071 function callUserFunction($funcName,&$params,&$ref,$checkPrefix='user_',$silent=0) { 03072 global $TYPO3_CONF_VARS; 03073 03074 // Check persistent object and if found, call directly and exit. 03075 if (is_array($GLOBALS['T3_VAR']['callUserFunction'][$funcName])) { 03076 return call_user_method( 03077 $GLOBALS['T3_VAR']['callUserFunction'][$funcName]['method'], 03078 $GLOBALS['T3_VAR']['callUserFunction'][$funcName]['obj'], 03079 $params, 03080 $ref 03081 ); 03082 } 03083 03084 // Check file-reference prefix; if found, require_once() the file (should be library of code) 03085 if (strstr($funcName,':')) { 03086 list($file,$funcRef) = t3lib_div::revExplode(':',$funcName,2); 03087 $requireFile = t3lib_div::getFileAbsFileName($file); 03088 if ($requireFile) require_once($requireFile); 03089 } else { 03090 $funcRef = $funcName; 03091 } 03092 03093 // Check for persistent object token, "&" 03094 if (substr($funcRef,0,1)=='&') { 03095 $funcRef = substr($funcRef,1); 03096 $storePersistentObject = TRUE; 03097 } else { 03098 $storePersistentObject = FALSE; 03099 } 03100 03101 // Check prefix is valid: 03102 if ($checkPrefix && 03103 !t3lib_div::isFirstPartOfStr(trim($funcRef),$checkPrefix) && 03104 !t3lib_div::isFirstPartOfStr(trim($funcRef),'tx_') 03105 ) { 03106 if (!$silent) debug("Function/Class '".$funcRef."' was not prepended with '".$checkPrefix."'",1); 03107 return FALSE; 03108 } 03109 03110 // Call function or method: 03111 $parts = explode('->',$funcRef); 03112 if (count($parts)==2) { // Class 03113 03114 // Check if class/method exists: 03115 if (class_exists($parts[0])) { 03116 03117 // Get/Create object of class: 03118 if ($storePersistentObject) { // Get reference to current instance of class: 03119 if (!is_object($GLOBALS['T3_VAR']['callUserFunction_classPool'][$parts[0]])) { 03120 $GLOBALS['T3_VAR']['callUserFunction_classPool'][$parts[0]] = &t3lib_div::makeInstance($parts[0]); 03121 } 03122 $classObj = &$GLOBALS['T3_VAR']['callUserFunction_classPool'][$parts[0]]; 03123 } else { // Create new object: 03124 $classObj = &t3lib_div::makeInstance($parts[0]); 03125 } 03126 03127 if (method_exists($classObj, $parts[1])) { 03128 03129 // If persistent object should be created, set reference: 03130 if ($storePersistentObject) { 03131 $GLOBALS['T3_VAR']['callUserFunction'][$funcName] = array ( 03132 'method' => $parts[1], 03133 'obj' => &$classObj 03134 ); 03135 } 03136 // Call method: 03137 $content = call_user_method( 03138 $parts[1], 03139 $classObj, 03140 $params, 03141 $ref 03142 ); 03143 } else { 03144 if (!$silent) debug("<strong>ERROR:</strong> No method name '".$parts[1]."' in class ".$parts[0],1); 03145 } 03146 } else { 03147 if (!$silent) debug("<strong>ERROR:</strong> No class named: ".$parts[0],1); 03148 } 03149 } else { // Function 03150 if (function_exists($funcRef)) { 03151 $content = call_user_func($funcRef, $params, $ref); 03152 } else { 03153 if (!$silent) debug("<strong>ERROR:</strong> No function named: ".$funcRef,1); 03154 } 03155 } 03156 return $content; 03157 } 03158 03170 function &getUserObj($classRef,$checkPrefix='user_',$silent=0) { 03171 global $TYPO3_CONF_VARS; 03172 // Check persistent object and if found, call directly and exit. 03173 if (is_object($GLOBALS['T3_VAR']['getUserObj'][$classRef])) { 03174 return $GLOBALS['T3_VAR']['getUserObj'][$classRef]; 03175 } else { 03176 03177 // Check file-reference prefix; if found, require_once() the file (should be library of code) 03178 if (strstr($classRef,':')) { 03179 list($file,$class) = t3lib_div::revExplode(':',$classRef,2); 03180 $requireFile = t3lib_div::getFileAbsFileName($file); 03181 if ($requireFile) require_once($requireFile); 03182 } else { 03183 $class = $classRef; 03184 } 03185 03186 // Check for persistent object token, "&" 03187 if (substr($class,0,1)=='&') { 03188 $class = substr($class,1); 03189 $storePersistentObject = TRUE; 03190 } else { 03191 $storePersistentObject = FALSE; 03192 } 03193 03194 // Check prefix is valid: 03195 if ($checkPrefix && 03196 !t3lib_div::isFirstPartOfStr(trim($class),$checkPrefix) && 03197 !t3lib_div::isFirstPartOfStr(trim($class),'tx_') 03198 ) { 03199 if (!$silent) debug("Class '".$class."' was not prepended with '".$checkPrefix."'",1); 03200 return FALSE; 03201 } 03202 03203 // Check if class exists: 03204 if (class_exists($class)) { 03205 $classObj = &t3lib_div::makeInstance($class); 03206 03207 // If persistent object should be created, set reference: 03208 if ($storePersistentObject) { 03209 $GLOBALS['T3_VAR']['getUserObj'][$classRef] = &$classObj; 03210 } 03211 03212 return $classObj; 03213 } else { 03214 if (!$silent) debug("<strong>ERROR:</strong> No class named: ".$class,1); 03215 } 03216 } 03217 } 03218 03228 function &makeInstance($className) { 03229 return class_exists('ux_'.$className) ? t3lib_div::makeInstance('ux_'.$className) : new $className; 03230 } 03231 03240 function makeInstanceClassName($className) { 03241 return class_exists('ux_'.$className) ? t3lib_div::makeInstanceClassName('ux_'.$className) : $className; 03242 } 03243 03254 function &makeInstanceService($serviceType, $serviceSubType='', $excludeServiceKeys=array()) { 03255 global $T3_SERVICES, $T3_VAR, $TYPO3_CONF_VARS; 03256 03257 $error = FALSE; 03258 03259 if (!is_array($excludeServiceKeys) ) { 03260 $excludeServiceKeys = t3lib_div::trimExplode(',', $excludeServiceKeys, 1); 03261 } 03262 while ($info = t3lib_extMgm::findService($serviceType, $serviceSubType, $excludeServiceKeys)) { 03263 03264 // Check persistent object and if found, call directly and exit. 03265 if (is_object($GLOBALS['T3_VAR']['makeInstanceService'][$info['className']])) { 03266 // reset service and return object 03267 $T3_VAR['makeInstanceService'][$info['className']]->reset(); 03268 return $GLOBALS['T3_VAR']['makeInstanceService'][$info['className']]; 03269 03270 // include file and create object 03271 } elseif (@is_file($info['classFile'])) { 03272 require_once ($info['classFile']); 03273 $obj = t3lib_div::makeInstance($info['className']); 03274 if (is_object($obj)) { 03275 if(!@is_callable(array($obj,'init'))) { 03276 // use silent logging??? I don't think so. 03277 die ('Broken service:'.t3lib_div::view_array($info)); 03278 } 03279 $obj->info = $info; 03280 if ($obj->init()) { // service available? 03281 03282 // create persistent object 03283 $T3_VAR['makeInstanceService'][$info['className']] = &$obj; 03284 03285 // needed to delete temp files 03286 register_shutdown_function(array(&$obj, '__destruct')); 03287 03288 return $obj; // object is passed as reference by funtion definition 03289 } 03290 $error = $obj->getLastErrorArray(); 03291 unset($obj); 03292 } 03293 } 03294 // deactivate the service 03295 t3lib_extMgm::deactivateService($info['serviceType'],$info['serviceKey']); 03296 } 03297 return $error; 03298 } 03299 03315 function plainMailEncoded($email,$subject,$message,$headers='',$enc='',$charset='ISO-8859-1',$dontEncodeSubject=0) { 03316 switch((string)$enc) { 03317 case 'base64': 03318 $headers=trim($headers).chr(10). 03319 'Mime-Version: 1.0'.chr(10). 03320 'Content-Type: text/plain; charset="'.$charset.'"'.chr(10). 03321 'Content-Transfer-Encoding: base64'; 03322 03323 $message=trim(chunk_split(base64_encode($message.chr(10)))).chr(10); // Adding chr(10) because I think MS outlook 2002 wants it... may be removed later again. 03324 03325 if (!$dontEncodeSubject) $subject='=?'.$charset.'?B?'.base64_encode($subject).'?='; 03326 break; 03327 case 'quoted-printable': 03328 $headers=trim($headers).chr(10). 03329 'Mime-Version: 1.0'.chr(10). 03330 'Content-Type: text/plain; charset="'.$charset.'"'.chr(10). 03331 'Content-Transfer-Encoding: quoted-printable'; 03332 03333 $message=t3lib_div::quoted_printable($message); 03334 03335 if (!$dontEncodeSubject) $subject='=?'.$charset.'?Q?'.trim(t3lib_div::quoted_printable(ereg_replace('[[:space:]]','_',$subject),1000)).'?='; 03336 break; 03337 case '8bit': 03338 $headers=trim($headers).chr(10). 03339 'Mime-Version: 1.0'.chr(10). 03340 'Content-Type: text/plain; charset="'.$charset.'"'.chr(10). 03341 'Content-Transfer-Encoding: 8bit'; 03342 break; 03343 } 03344 $headers=trim(implode(chr(10),t3lib_div::trimExplode(chr(10),$headers,1))); // make sure no empty lines are there. 03345 03346 mail($email,$subject,$message,$headers); 03347 } 03348 03360 function quoted_printable($string,$maxlen=76) { 03361 $newString = ''; 03362 $theLines = explode(chr(10),$string); // Break lines. Doesn't work with mac eol's which seems to be 13. But 13-10 or 10 will work 03363 while (list(,$val)=each($theLines)) { 03364 $val = ereg_replace(chr(13).'$','',$val); // removes possible character 13 at the end of line 03365 03366 $newVal = ''; 03367 $theValLen = strlen($val); 03368 $len = 0; 03369 for ($index=0;$index<$theValLen;$index++) { 03370 $char = substr($val,$index,1); 03371 $ordVal =Ord($char); 03372 if ($len>($maxlen-4) || ($len>(($maxlen-10)-4)&&$ordVal==32)) { 03373 $len=0; 03374 $newVal.='='.chr(13).chr(10); 03375 } 03376 if (($ordVal>=33 && $ordVal<=60) || ($ordVal>=62 && $ordVal<=126) || $ordVal==9 || $ordVal==32) { 03377 $newVal.=$char; 03378 $len++; 03379 } else { 03380 $newVal.=sprintf('=%02X',$ordVal); 03381 $len+=3; 03382 } 03383 } 03384 $newVal = ereg_replace(chr(32).'$','=20',$newVal); // replaces a possible SPACE-character at the end of a line 03385 $newVal = ereg_replace(chr(9).'$','=09',$newVal); // replaces a possible TAB-character at the end of a line 03386 $newString.=$newVal.chr(13).chr(10); 03387 } 03388 return ereg_replace(chr(13).chr(10).'$','',$newString); 03389 } 03390 03402 function substUrlsInPlainText($message,$urlmode='76',$index_script_url='') { 03403 // Substitute URLs with shorter links: 03404 $urlSplit=explode('http://',$message); 03405 reset($urlSplit); 03406 while(list($c,$v)=each($urlSplit)) { 03407 if ($c) { 03408 $newParts = split('[[:space:]]|\)|\(',$v,2); 03409 $newURL='http://'.$newParts[0]; 03410 switch((string)$urlmode) { 03411 case 'all': 03412 $newURL=t3lib_div::makeRedirectUrl($newURL,0,$index_script_url); 03413 break; 03414 case '76': 03415 $newURL=t3lib_div::makeRedirectUrl($newURL,76,$index_script_url); 03416 break; 03417 } 03418 $urlSplit[$c]=$newURL.substr($v,strlen($newParts[0])); 03419 } 03420 } 03421 03422 $message=implode('',$urlSplit); 03423 return $message; 03424 } 03425 03436 function makeRedirectUrl($inUrl,$l=0,$index_script_url='') { 03437 if (strlen($inUrl)>$l) { 03438 $md5 = substr(md5($inUrl),0,20); 03439 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('md5hash', 'cache_md5params', 'md5hash="'.$GLOBALS['TYPO3_DB']->quoteStr($md5, 'cache_md5params').'"'); 03440 if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res)) { 03441 $insertFields = array( 03442 'md5hash' => $md5, 03443 'tstamp' => time(), 03444 'type' => 2, 03445 'params' => $inUrl 03446 ); 03447 03448 $GLOBALS['TYPO3_DB']->exec_INSERTquery('cache_md5params', $insertFields); 03449 } 03450 $inUrl=($index_script_url ? $index_script_url : t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR')). 03451 '?RDCT='.$md5; 03452 } 03453 return $inUrl; 03454 } 03455 03463 function freetypeDpiComp($font_size) { 03464 $dpi = intval($GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi']); 03465 if ($dpi!=72) $font_size = $font_size/$dpi*72; 03466 return $font_size; 03467 } 03468 03482 function devLog($msg, $extKey, $severity=0, $dataVar=FALSE) { 03483 global $TYPO3_CONF_VARS; 03484 03485 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['devLog'])) { 03486 $params = array('msg'=>$msg, 'extKey'=>$extKey, 'severity'=>$severity, 'dataVar'=>$dataVar); 03487 $fakeThis = FALSE; 03488 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['devLog'] as $hookMethod) { 03489 t3lib_div::callUserFunction($hookMethod,$params,$fakeThis); 03490 } 03491 } 03492 } 03493 03503 function arrayToLogString($arr, $valueList=array(), $valueLength=20) { 03504 $str = ''; 03505 if(is_array($arr)) { 03506 if (!is_array($valueList)) { 03507 $valueList = explode(',', $valueList); 03508 } 03509 foreach($arr as $key => $value) { 03510 if (!count($valueList) OR (count($valueList) AND in_array($key, $valueList))) { 03511 $str .= (string)$key.trim(': '.t3lib_div::fixed_lgd(str_replace("\n",'|',(string)$value), $valueLength)).'; '; 03512 } 03513 } 03514 } 03515 return $str; 03516 } 03517 } 03518 03519 ?>