83 public static function exec($command, &
$output =
null, &$returnValue = 0)
98 $gfxConf =
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'];
101 $path = $gfxConf[
'processor_path'];
103 $path = GeneralUtility::fixWindowsFilePath($path);
105 if ($command ===
'combine') {
106 $command =
'composite';
109 if ($gfxConf[
'processor'] ===
'GraphicsMagick') {
119 if ($parameters && $command !==
'identify') {
121 if ($gfxConf[
'processor_stripColorProfileByDefault']
122 && $gfxConf[
'processor_stripColorProfileCommand'] !==
''
123 && strpos($parameters, $gfxConf[
'processor_stripColorProfileCommand']) ===
false
124 && $parameters !==
'-version'
125 && strpos($parameters,
'###SkipStripProfile###') ===
false
127 $parameters = $gfxConf[
'processor_stripColorProfileCommand'] .
' ' . $parameters;
129 $parameters = str_replace(
'###SkipStripProfile###',
'', $parameters);
133 if ($parameters && $command ===
'convert') {
134 $parameters =
'-auto-orient ' . $parameters;
137 if ($command !==
'identify' && $gfxConf[
'processor_interlace']) {
138 $parameters =
'-interlace ' . $gfxConf[
'processor_interlace'] .
' ' . $parameters;
140 $cmdLine = $path .
' ' . $parameters;
142 if ($command ===
'composite') {
144 $paramsArrCount = count($paramsArr);
145 if ($paramsArrCount > 5) {
146 $tmp = $paramsArr[$paramsArrCount - 3];
147 $paramsArr[$paramsArrCount - 3] = $paramsArr[$paramsArrCount - 4];
148 $paramsArr[$paramsArrCount - 4] = $tmp;
150 $cmdLine = $path .
' ' . implode(
' ', $paramsArr);
168 if ($handler && !self::checkCommand($handler)) {
172 if (self::$applications[$cmd][
'valid'] ??
false) {
176 if (isset(self::$applications[$cmd][
'valid'])) {
180 foreach (self::$paths as $path => $validPath) {
186 if (@is_file($path . $cmd)) {
187 self::$applications[$cmd][
'app'] = $cmd;
188 self::$applications[$cmd][
'path'] = $path;
189 self::$applications[$cmd][
'valid'] =
true;
192 if (@is_file($path . $cmd .
'.exe')) {
193 self::$applications[$cmd][
'app'] = $cmd .
'.exe';
194 self::$applications[$cmd][
'path'] = $path;
195 self::$applications[$cmd][
'valid'] =
true;
200 $filePath = realpath($path . $cmd);
201 if ($filePath && @is_executable($filePath)) {
202 self::$applications[$cmd][
'app'] = $cmd;
203 self::$applications[$cmd][
'path'] = $path;
204 self::$applications[$cmd][
'valid'] =
true;
214 $cmd = @
self::exec(
'which ' . self::escapeShellArgument($cmd));
215 if (@is_executable($cmd)) {
216 self::$applications[$cmd][
'app'] = $cmd;
218 self::$applications[$cmd][
'valid'] =
true;
234 public static function getCommand($cmd, $handler =
'', $handlerOpt =
'')
247 $handler .=
' ' . escapeshellcmd($handlerOpt) .
' ';
251 if (!self::checkCommand($cmd)) {
254 $cmd = self::$applications[$cmd][
'path'] . self::$applications[$cmd][
'app'] .
' ';
256 return trim($handler . $cmd);
275 public static function getPaths($addInvalid =
false)
284 foreach (
$paths as $path => $validPath) {
298 protected static function init()
300 if (
$GLOBALS[
'TYPO3_CONF_VARS'][
'BE'][
'disable_exec_function']) {
303 if (!self::$initialized) {
306 self::$initialized =
true;
321 if (!is_array(self::$paths)) {
331 if (!preg_match(
'#^/#', $path)) {
334 if (!isset(self::$paths[$path])) {
335 if (@is_dir($path)) {
336 self::$paths[$path] = $path;
338 self::$paths[$path] =
false;
346 foreach (self::$paths as $path => $valid) {
348 if ($valid && !@is_dir($path)) {
349 self::$paths[$path] =
false;
364 if (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'binSetup']) {
365 $binSetup = str_replace([
'\'.chr(10).\
'',
'\' . LF . \
''], LF,
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'binSetup']);
366 $pathSetup = preg_split(
'/[\n,]+/', $binSetup);
367 foreach ($pathSetup as $val) {
368 if (trim($val) ===
'') {
371 list($cmd, $cmdPath) = GeneralUtility::trimExplode(
'=', $val,
true, 2);
374 $cmdArr[$cmd][
'valid'] =
true;
393 if ($imPath =
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'processor_path_lzw'] ?:
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'processor_path']) {
395 $pathsArr[$imPath] = $imPath;
399 if (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'binPath']) {
400 $sysPath = GeneralUtility::trimExplode(
',',
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'binPath'],
true);
401 foreach ($sysPath as $val) {
403 $sysPathArr[$val] = $val;
411 $envPath = GeneralUtility::trimExplode($sep, $serverPath,
true);
412 foreach ($envPath as $val) {
414 $sysPathArr[$val] = $val;
420 $sysPathArr = array_merge($sysPathArr, [
421 '/usr/bin/' =>
'/usr/bin/',
422 '/usr/local/bin/' =>
'/usr/local/bin/',
426 $pathsArr = array_merge($pathsArr, $sysPathArr);
437 protected static function fixPath($path)
439 return str_replace(
'//',
'/', $path .
'/');
452 $isUTF8Filesystem = !empty(
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'UTF8filesystem']);
453 $currentLocale =
false;
454 if ($isUTF8Filesystem) {
455 $currentLocale = setlocale(LC_CTYPE, 0);
456 setlocale(LC_CTYPE,
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'systemLocale']);
459 $output = array_map(
'escapeshellarg', $input);
461 if ($isUTF8Filesystem && $currentLocale !==
false) {
462 setlocale(LC_CTYPE, $currentLocale);
476 $paramsArr = explode(
' ', trim($parameters));
480 foreach ($paramsArr as $k => $v) {
481 if ($quoteActive > -1) {
482 $paramsArr[$quoteActive] .=
' ' . $v;
483 unset($paramsArr[$k]);
484 if (substr($v, -1) === $paramsArr[$quoteActive][0]) {
487 } elseif (!trim($v)) {
489 unset($paramsArr[$k]);
490 } elseif (preg_match(
'/^(["\'])/', $v) && substr($v, -1) !== $v[0]) {
495 return array_values($paramsArr);