[TASK] Move XLIFF handling to t3lib
[Packages/TYPO3.CMS.git] / t3lib / thumbs.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Generates a thumbnail and returns an image stream, either GIF/PNG or JPG
29 *
30 * Revised for TYPO3 3.6 July/2003 by Kasper Skårhøj
31 *
32 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
33 */
34
35
36 // *******************************
37 // Set error reporting
38 // *******************************
39 error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
40
41
42
43 // ******************
44 // Constants defined
45 // ******************
46 define('TYPO3_OS', stristr(PHP_OS,'win')&&!stristr(PHP_OS,'darwin')?'WIN':'');
47 define('TYPO3_MODE','BE');
48
49 if(!defined('PATH_thisScript')) {
50 define('PATH_thisScript', str_replace('//', '/', str_replace('\\', '/',
51 (PHP_SAPI == 'fpm-fcgi' || PHP_SAPI == 'cgi' || PHP_SAPI == 'isapi' || PHP_SAPI == 'cgi-fcgi') &&
52 ($_SERVER['ORIG_PATH_TRANSLATED'] ? $_SERVER['ORIG_PATH_TRANSLATED'] : $_SERVER['PATH_TRANSLATED']) ?
53 ($_SERVER['ORIG_PATH_TRANSLATED'] ? $_SERVER['ORIG_PATH_TRANSLATED'] : $_SERVER['PATH_TRANSLATED']) :
54 ($_SERVER['ORIG_SCRIPT_FILENAME'] ? $_SERVER['ORIG_SCRIPT_FILENAME'] : $_SERVER['SCRIPT_FILENAME']))));
55 }
56
57 if(!defined('PATH_site')) define('PATH_site', preg_replace('/[^\/]*.[^\/]*$/','',PATH_thisScript)); // the path to the website folder (see init.php)
58 if(!defined('PATH_t3lib')) define('PATH_t3lib', PATH_site.'t3lib/');
59 define('PATH_typo3conf', PATH_site.'typo3conf/');
60 define('TYPO3_mainDir', 'typo3/'); // This is the directory of the backend administration for the sites of this TYPO3 installation.
61 define('PATH_typo3', PATH_site.TYPO3_mainDir);
62
63
64 // ******************
65 // Including config
66 // ******************
67 require_once(PATH_t3lib.'class.t3lib_div.php');
68 require_once(PATH_t3lib.'class.t3lib_extmgm.php');
69
70 require(PATH_t3lib.'config_default.php');
71 if (!defined ('TYPO3_db')) {
72 die ('The configuration file was not included.');
73 }
74 if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['image_processing']) {
75 die ('ImageProcessing was disabled!');
76 }
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 /**
95 * Class for generating a thumbnail from the input parameters given to the script
96 *
97 * Input GET var, &file: relative or absolute reference to an imagefile. WILL be validated against PATH_site / lockRootPath
98 * Input GET var, &size: integer-values defining size of thumbnail, format '[int]' or '[int]x[int]'
99 *
100 * Relative paths MUST BE the first two characters ONLY: eg: '../dir/file.gif', otherwise it is expect to be absolute
101 *
102 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
103 * @package TYPO3
104 * @subpackage t3lib
105 */
106 class SC_t3lib_thumbs {
107 var $include_once = array();
108
109 var $outdir = 'typo3temp/'; // The output directory of temporary files in PATH_site
110 var $output = '';
111 var $sizeDefault='56x56';
112
113 var $imageList; // Coming from $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']
114 var $input; // Contains the absolute path to the file for which to make a thumbnail (after init())
115
116 // Internal, static: GPvar:
117 var $file; // Holds the input filename (GET: file)
118 var $size; // Holds the input size (GET: size)
119 var $mtime = 0; // Last modification time of the supplied file
120
121
122 /**
123 * Initialize; reading parameters with GPvar and checking file path
124 * Results in internal var, $this->input, being set to the absolute path of the file for which to make the thumbnail.
125 *
126 * @return void
127 */
128 function init() {
129 // Setting GPvars:
130 $file = t3lib_div::_GP('file');
131 $size = t3lib_div::_GP('size');
132 $md5sum = t3lib_div::_GP('md5sum');
133
134 // Image extension list is set:
135 $this->imageList = $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']; // valid extensions. OBS: No spaces in the list, all lowercase...
136
137 // If the filereference $this->file is relative, we correct the path
138 if (substr($file,0,3)=='../') {
139 $file = PATH_site.substr($file,3);
140 }
141
142 // Now the path is absolute.
143 // Checking for backpath and double slashes + the thumbnail can be made from files which are in the PATH_site OR the lockRootPath only!
144 if (t3lib_div::isAllowedAbsPath($file)) {
145 $mtime = filemtime($file);
146 }
147
148 // Do an MD5 check to prevent viewing of images without permission
149 $OK = FALSE;
150 if ($mtime) {
151 // Always use the absolute path for this check!
152 $check = basename($file).':'.$mtime.':'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'];
153 $md5_real = t3lib_div::shortMD5($check);
154 if (!strcmp($md5_real,$md5sum)) {
155 $OK = TRUE;
156 }
157 }
158
159 if ($OK) {
160 $this->input = $file;
161 $this->size = $size;
162 $this->mtime = $mtime;
163 } else {
164 throw new RuntimeException(
165 'TYPO3 Fatal Error: Image does not exist and/or MD5 checksum did not match.',
166 1270853950
167 );
168 }
169 }
170
171 /**
172 * Create the thumbnail
173 * Will exit before return if all is well.
174 *
175 * @return void
176 */
177 function main() {
178 // If file exists, we make a thumbsnail of the file.
179 if ($this->input && file_exists($this->input)) {
180
181 // Check file extension:
182 $reg = array();
183 if (preg_match('/(.*)\.([^\.]*$)/', $this->input, $reg)) {
184 $ext=strtolower($reg[2]);
185 $ext=($ext=='jpeg') ? 'jpg' : $ext;
186 if ($ext=='ttf') {
187 $this->fontGif($this->input); // Make font preview... (will not return)
188 } elseif (!t3lib_div::inList($this->imageList, $ext)) {
189 $this->errorGif('Not imagefile!', $ext, basename($this->input));
190 }
191 } else {
192 $this->errorGif('Not imagefile!', 'No ext!', basename($this->input));
193 }
194
195 // ... so we passed the extension test meaning that we are going to make a thumbnail here:
196 if (!$this->size) $this->size = $this->sizeDefault; // default
197
198 // I added extra check, so that the size input option could not be fooled to pass other values. That means the value is exploded, evaluated to an integer and the imploded to [value]x[value]. Furthermore you can specify: size=340 and it'll be translated to 340x340.
199 $sizeParts = explode('x', $this->size . 'x' . $this->size); // explodes the input size (and if no "x" is found this will add size again so it is the same for both dimensions)
200 $sizeParts = array(t3lib_utility_Math::forceIntegerInRange($sizeParts[0], 1, 1000), t3lib_utility_Math::forceIntegerInRange($sizeParts[1], 1, 1000)); // Cleaning it up, only two parameters now.
201 $this->size = implode('x', $sizeParts); // Imploding the cleaned size-value back to the internal variable
202 $sizeMax = max($sizeParts); // Getting max value
203
204 // Init
205 $outpath = PATH_site . $this->outdir;
206
207 // Should be - ? 'png' : 'gif' - , but doesn't work (ImageMagick prob.?)
208 // René: png work for me
209 $thmMode = t3lib_utility_Math::forceIntegerInRange($GLOBALS['TYPO3_CONF_VARS']['GFX']['thumbnails_png'], 0);
210 $outext = ($ext!='jpg' || ($thmMode & 2)) ? ($thmMode & 1 ? 'png' : 'gif') : 'jpg';
211
212 $outfile = 'tmb_' . substr(md5($this->input . $this->mtime . $this->size), 0, 10) . '.' . $outext;
213 $this->output = $outpath . $outfile;
214
215 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im']) {
216 // If thumbnail does not exist, we generate it
217 if (!file_exists($this->output)) {
218 $parameters = '-sample ' . $this->size . ' ' . $this->wrapFileName($this->input) . '[0] ' . $this->wrapFileName($this->output);
219 $cmd = t3lib_div::imageMagickCommand('convert', $parameters);
220 t3lib_utility_Command::exec($cmd);
221 if (!file_exists($this->output)) {
222 $this->errorGif('No thumb','generated!', basename($this->input));
223 } else {
224 t3lib_div::fixPermissions($this->output);
225 }
226 }
227 // The thumbnail is read and output to the browser
228 if($fd = @fopen($this->output,'rb')) {
229 header('Content-type: image/' . $outext);
230 fpassthru($fd);
231 fclose($fd);
232 } else {
233 $this->errorGif('Read problem!', '', $this->output);
234 }
235 } else exit;
236 } else {
237 $this->errorGif('No valid','inputfile!', basename($this->input));
238 }
239 }
240
241
242
243
244
245
246
247
248
249
250
251 /***************************
252 *
253 * OTHER FUNCTIONS:
254 *
255 ***************************/
256
257 /**
258 * Creates error image based on gfx/notfound_thumb.png
259 * Requires GD lib enabled, otherwise it will exit with the three textstrings outputted as text.
260 * Outputs the image stream to browser and exits!
261 *
262 * @param string Text line 1
263 * @param string Text line 2
264 * @param string Text line 3
265 * @return void
266 */
267 function errorGif($l1,$l2,$l3) {
268 if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']) {
269 throw new RuntimeException(
270 'TYPO3 Fatal Error: No gdlib. ' . $l1 . ' ' . $l2 . ' ' . $l3,
271 1270853952
272 );
273 }
274
275 // Creates the basis for the error image
276 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png']) {
277 header('Content-type: image/png');
278 $im = imagecreatefrompng(PATH_typo3 . 'gfx/notfound_thumb.png');
279 } else {
280 header('Content-type: image/gif');
281 $im = imagecreatefromgif(PATH_typo3 . 'gfx/notfound_thumb.gif');
282 }
283 // Sets background color and print color.
284 $white = imageColorAllocate($im, 0, 0, 0);
285 $black = imageColorAllocate($im, 255, 255, 0);
286
287 // Prints the text strings with the build-in font functions of GD
288 $x=0;
289 $font=0;
290 if ($l1) {
291 imagefilledrectangle($im, $x, 9, 56, 16, $black);
292 imageString($im,$font,$x,9,$l1,$white);
293 }
294 if ($l2) {
295 imagefilledrectangle($im, $x, 19, 56, 26, $black);
296 imageString($im,$font,$x,19,$l2,$white);
297 }
298 if ($l3) {
299 imagefilledrectangle($im, $x, 29, 56, 36, $black);
300 imageString($im,$font,$x,29,substr($l3,-14),$white);
301 }
302
303 // Outputting the image stream and exit
304 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png']) {
305 imagePng($im);
306 } else {
307 imageGif($im);
308 }
309 imagedestroy($im);
310 exit;
311 }
312
313 /**
314 * Creates a font-preview thumbnail.
315 * This means a PNG/GIF file with the text "AaBbCc...." set with the font-file given as input and in various sizes to show how the font looks
316 * Requires GD lib enabled.
317 * Outputs the image stream to browser and exits!
318 *
319 * @param string The filepath to the font file (absolute, probably)
320 * @return void
321 */
322 function fontGif($font) {
323 if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']) {
324 throw new RuntimeException(
325 'TYPO3 Fatal Error: No gdlib.',
326 1270853953
327 );
328 }
329
330 // Create image and set background color to white.
331 $im = imageCreate(250, 76);
332 $white = imageColorAllocate($im, 255, 255, 255);
333 $col = imageColorAllocate($im, 0, 0, 0);
334
335 // The test string and offset in x-axis.
336 $string = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÆæØøÅåÄäÖöÜüß';
337 $x=13;
338
339 // Print (with non-ttf font) the size displayed
340 imagestring ($im, 1, 0, 2, '10', $col);
341 imagestring ($im, 1, 0, 15, '12', $col);
342 imagestring ($im, 1, 0, 30, '14', $col);
343 imagestring ($im, 1, 0, 47, '18', $col);
344 imagestring ($im, 1, 0, 68, '24', $col);
345
346 // Print with ttf-font the test string
347 imagettftext ($im, t3lib_div::freetypeDpiComp(10), 0, $x, 8, $col, $font, $string);
348 imagettftext ($im, t3lib_div::freetypeDpiComp(12), 0, $x, 21, $col, $font, $string);
349 imagettftext ($im, t3lib_div::freetypeDpiComp(14), 0, $x, 36, $col, $font, $string);
350 imagettftext ($im, t3lib_div::freetypeDpiComp(18), 0, $x, 53, $col, $font, $string);
351 imagettftext ($im, t3lib_div::freetypeDpiComp(24), 0, $x, 74, $col, $font, $string);
352
353 // Output PNG or GIF based on $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png']
354 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png']) {
355 header('Content-type: image/png');
356 imagePng($im);
357 } else {
358 header('Content-type: image/gif');
359 imageGif($im);
360 }
361 imagedestroy($im);
362 exit;
363 }
364
365 /**
366 * Escapes a file name so it can safely be used on the command line.
367 *
368 * @param string $inputName filename to safeguard, must not be empty
369 *
370 * @return string $inputName escaped as needed
371 */
372 protected function wrapFileName($inputName) {
373 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['UTF8filesystem']) {
374 $currentLocale = setlocale(LC_CTYPE, 0);
375 setlocale(LC_CTYPE, $GLOBALS['TYPO3_CONF_VARS']['SYS']['systemLocale']);
376 }
377 $escapedInputName = escapeshellarg($inputName);
378 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['UTF8filesystem']) {
379 setlocale(LC_CTYPE, $currentLocale);
380 }
381 return $escapedInputName;
382 }
383 }
384
385 if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/thumbs.php'])) {
386 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/thumbs.php']);
387 }
388
389
390
391
392 // Make instance:
393 $SOBE = t3lib_div::makeInstance('SC_t3lib_thumbs');
394 $SOBE->init();
395 $SOBE->main();
396
397 ?>