public function getArchiveFileName( $path, $seeds, $prefix = null, $realm = null ) { $dirElements = array(); $dirElements[] = $this->ArchiveDir; if ( isset( $realm ) ) { $dirElements[]= $realm; } $seed = implode ( '', $seeds ); $hash = hash( $this->hashAlgorithm, $seed ); $multiLevelDir = eZDir::createMultiLevelPath( substr( $hash, 0 , $this->ArchiveDirLevels ), $this->ArchiveDirLevels ); $dirElements[] = $multiLevelDir; $fileDirectory = implode( '/', $dirElements ); if ( !file_exists( $fileDirectory ) ) { eZDir::mkdir( $fileDirectory, false, true ); } $archiveFileName = $fileDirectory . '/'; if ( isset( $prefix ) ) { $archiveFileName .= $prefix . '-'; } $archiveFileName .= $hash; return $archiveFileName; }
function install( $package, $installType, $parameters, $name, $os, $filename, $subdirectory, $content, &$installParameters, &$installData ) { $collectionName = $parameters['collection']; $installVariables = array(); if ( isset( $installParameters['variables'] ) ) $installVariables = $installParameters['variables']; $iniFileVariables = false; if ( isset( $installParameters['ini'] ) ) $iniFileVariables = $installParameters['ini']; $fileList = $package->fileList( $collectionName ); if ( $fileList ) { foreach ( $fileList as $fileItem ) { $newFilePath = false; if ( $fileItem['type'] == 'thumbnail' ) { } else { $filePath = $package->fileItemPath( $fileItem, $collectionName ); if ( is_dir( $filePath ) ) { $newFilePath = $package->fileStorePath( $fileItem, $collectionName, $installParameters['path'], $installVariables ); eZDir::mkdir( $newFilePath, false, true ); } else { $newFilePath = $package->fileStorePath( $fileItem, $collectionName, $installParameters['path'], $installVariables ); if ( preg_match( "#^(.+)/[^/]+$#", $newFilePath, $matches ) ) { eZDir::mkdir( $matches[1], false, true ); } eZFileHandler::copy( $filePath, $newFilePath ); } } if ( $fileItem['type'] == 'ini' and $iniFileVariables and $newFilePath ) { $fileRole = $fileItem['role']; $fileRoleValue = $fileItem['role-value']; $fileVariableName = $fileItem['variable-name']; $fileName = $fileItem['name']; if ( $fileVariableName and isset( $installParameters['variables'][$fileVariableName] ) ) $fileRoleValue = $installParameters['variables'][$fileVariableName]; if ( isset( $iniFileVariables[$fileRole][$fileRoleValue][$fileName] ) ) { $variables = $iniFileVariables[$fileRole][$fileRoleValue][$fileName]; $ini = eZINI::fetchFromFile( $newFilePath ); $ini->setVariables( $variables ); $ini->save( false, false, false, false, false ); } } } } return true; }
function moveIfNeeded($oldPath, $newPath) { global $fileToRemove; $success = true; $cli = eZCLI::instance(); if (!file_exists($newPath)) { if (!file_exists($oldPath)) { $cli->warning('Source file not exist : ' . $oldPath); return false; } eZDir::mkdir( dirname( $newPath ), false, true ); $success = copy($oldPath, $newPath); $cli = eZCLI::instance(); if ($success) { $fileToRemove[] = $oldPath; $cli->notice('Move ' . $oldPath . ' => ' . $newPath); } else { $cli->warning('Fail to move ' . $oldPath . ' => ' . $newPath); } } else { $fileToRemove[] = $oldPath; } return $success; }
static function create($filename, $directory = false, $data = false, $atomic = false) { $filepath = $filename; if ($directory) { if (!file_exists($directory)) { eZDir::mkdir($directory, false, true); // eZDebugSetting::writeNotice( 'ezfile-create', "Created directory $directory", 'eZFile::create' ); } $filepath = $directory . '/' . $filename; } // If atomic creation is needed we will use a temporary // file when writing the data, then rename it to the correct path. if ($atomic) { $realpath = $filepath; $dirname = dirname($filepath); if (strlen($dirname) != 0) { $dirname .= "/"; } $filepath = $dirname . "ezfile-tmp." . md5($filepath . getmypid() . mt_rand()); } $file = fopen($filepath, 'wb'); if ($file) { // eZDebugSetting::writeNotice( 'ezfile-create', "Created file $filepath", 'eZFile::create' ); if ($data) { fwrite($file, $data); } fclose($file); if ($atomic) { eZFile::rename($filepath, $realpath); } return true; } // eZDebugSetting::writeNotice( 'ezfile-create', "Failed creating file $filepath", 'eZFile::create' ); return false; }
/** * Downloads file. * * Sets $this->ErrorMsg in case of an error. * * \private * \param $url URL. * \param $outDir Directory where to put downloaded file to. * \param $forcedFileName Force saving downloaded file under this name. * \return false on error, path to downloaded package otherwise. */ function downloadFile($url, $outDir, $forcedFileName = false) { $fileName = $outDir . "/" . ($forcedFileName ? $forcedFileName : basename($url)); eZDebug::writeNotice("Downloading file '{$fileName}' from {$url}"); // Create the out directory if not exists. if (!file_exists($outDir)) { eZDir::mkdir($outDir, false, true); } // First try CURL if (extension_loaded('curl')) { $ch = curl_init($url); $fp = eZStepSiteTypes::fopen($fileName, 'wb'); if ($fp === false) { $this->ErrorMsg = ezpI18n::tr('design/standard/setup/init', 'Cannot write to file') . ': ' . $this->FileOpenErrorMsg; return false; } curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); // Get proxy $ini = eZINI::instance(); $proxy = $ini->hasVariable('ProxySettings', 'ProxyServer') ? $ini->variable('ProxySettings', 'ProxyServer') : false; if ($proxy) { curl_setopt($ch, CURLOPT_PROXY, $proxy); $userName = $ini->hasVariable('ProxySettings', 'User') ? $ini->variable('ProxySettings', 'User') : false; $password = $ini->hasVariable('ProxySettings', 'Password') ? $ini->variable('ProxySettings', 'Password') : false; if ($userName) { curl_setopt($ch, CURLOPT_PROXYUSERPWD, "{$userName}:{$password}"); } } if (!curl_exec($ch)) { $this->ErrorMsg = curl_error($ch); return false; } curl_close($ch); fclose($fp); } else { $parsedUrl = parse_url($url); $checkIP = isset($parsedUrl['host']) ? ip2long(gethostbyname($parsedUrl['host'])) : false; if ($checkIP === false) { return false; } // If we don't have CURL installed we used standard fopen urlwrappers // Note: Could be blocked by not allowing remote calls. if (!copy($url, $fileName)) { $buf = eZHTTPTool::sendHTTPRequest($url, 80, false, 'eZ Publish', false); $header = false; $body = false; if (eZHTTPTool::parseHTTPResponse($buf, $header, $body)) { eZFile::create($fileName, false, $body); } else { $this->ErrorMsg = ezpI18n::tr('design/standard/setup/init', 'Failed to copy %url to local file %filename', null, array("%url" => $url, "%filename" => $fileName)); return false; } } } return $fileName; }
function eZMutex($name) { $this->Name = md5($name); $mutexPath = eZDir::path(array(eZSys::cacheDirectory(), 'ezmutex')); eZDir::mkdir($mutexPath, false, true); $this->FileName = eZDir::path(array($mutexPath, $this->Name)); $this->MetaFileName = eZDir::path(array($mutexPath, $this->Name . '_meta')); }
/** * Constructs a new CjwNewsletterTransportFile * * @param string $mailDir * @return void */ public function __construct($mailDir = 'var/log/mail') { // $this->mailDir = eZSys::siteDir().eZSys::varDirectory().'/log/mail'; if (is_dir($mailDir) or eZDir::mkdir($mailDir, false, true)) { $this->mailDir = $mailDir; } else { // TODO Fehlerbehandlung wenn verzeichnis nicht angelegt werden kann } }
function copyDir( $source, $destination ) { // Attempt to create destination dir. $status = eZDir::mkdir( $destination ); // If no success: bail out. if ( !$status ) { return false; } // Get the contents of the directory. $entries = getDirEntries( $source ); // Bail if contents is unavailable. if ( $entries == false ) { return false; } // Else: contents is OK: else { // Copy each and every entry: foreach ( $entries as $entry ) { if ( $entry ) { $from = "$source/$entry"; $to = "$destination/$entry"; // Is this a directory? -> special case. if ( is_dir( $from ) ) { $status = copyDir( $from, $to ); if (!$status) { return false; } } // Else: simple file case. else { $status = copy( $from, $to ); if (!$status) { return false; } } } } } // Phew: if we got this far then everything is OK. return true; }
/** * Creates a new cache storage for a given location through eZ Publish cluster mechanism * Options can contain the 'ttl' ( Time-To-Life ). This is per default set * to 1 day. * * @param string $location Path to the cache location inside the cluster * @param array(string=>string) $options Options for the cache. */ public function __construct($location, $options = array()) { $path = eZSys::cacheDirectory() . '/rest/' . $location; if (!file_exists($path)) { if (!eZDir::mkdir($path, false, true)) { throw new ezcBaseFilePermissionException($path, ezcBaseFileException::WRITE, 'Cache location is not writeable.'); } } parent::__construct($path); $this->properties['options'] = new ezpCacheStorageClusterOptions($options); }
function store($sub_dir = false, $suffix = false, $mimeData = false) { if (!$this->IsTemporary) { eZDebug::writeError("Cannot store non temporary file: " . $this->Filename, "eZHTTPFile"); return false; } $this->IsTemporary = false; $ini = eZINI::instance(); // $storage_dir = $ini->variable( "FileSettings", "VarDir" ) . '/' . $ini->variable( "FileSettings", "StorageDir" ); $storage_dir = eZSys::storageDirectory(); if ($sub_dir !== false) { $dir = $storage_dir . "/{$sub_dir}/"; } else { $dir = $storage_dir . "/"; } if ($mimeData) { $dir = $mimeData['dirpath']; } if (!$mimeData) { $dir .= $this->MimeCategory; } if (!file_exists($dir)) { if (!eZDir::mkdir($dir, false, true)) { return false; } } $suffixString = false; if ($suffix != false) { $suffixString = ".{$suffix}"; } if ($mimeData) { $dest_name = $mimeData['url']; } else { $dest_name = $dir . "/" . md5(basename($this->Filename) . microtime() . mt_rand()) . $suffixString; } if (!move_uploaded_file($this->Filename, $dest_name)) { eZDebug::writeError("Failed moving uploaded file " . $this->Filename . " to destination {$dest_name}"); unlink($dest_name); $ret = false; } else { $ret = true; $this->Filename = $dest_name; $perm = $ini->variable("FileSettings", "StorageFilePermissions"); $oldumask = umask(0); chmod($dest_name, octdec($perm)); umask($oldumask); // Write log message to storage.log $storageDir = $dir . "/"; eZLog::writeStorageLog(basename($this->Filename), $storageDir); } return $ret; }
/** * @return mixed */ public function getCssFilePath() { if ( is_null($this->_cssFilePath) ) { $cssDirectory = eZSys::cacheDirectory() . '/css'; $this->_cssFilePath = $cssDirectory .'/' . md5( $this->getLessFilePath() ) . '.css'; if ( !file_exists( $cssDirectory )) { eZDir::mkdir( $cssDirectory ); } } return $this->_cssFilePath; }
function add($packageType, $package, $cli, $parameters) { $siteINI = eZINI::instance(); $extensionDir = $siteINI->variable('ExtensionSettings', 'ExtensionDirectory'); //$cli->output( var_export( $parameters, true ) ); foreach ($parameters as $scriptItem) { $cli->output('adding install script ' . $cli->style('dir') . $scriptItem['filename'] . $cli->style('dir-end')); $sourceDir = $scriptItem['source-directory']; $targetDir = $package->path() . '/' . $scriptItem['sub-directory']; eZDir::mkdir($targetDir, false, true); eZDir::copy($sourceDir, $targetDir, false); $package->appendInstall('ezinstallscript', false, false, true, $scriptItem['filename'], $scriptItem['sub-directory'], array('content' => false)); } }
/** * tmp dir for mail parser * ezvardir / cjw_newsletter/tmp/ * @return string dirname */ public function getTmpDir($createDirIfNotExists = true) { $varDir = eZSys::varDirectory(); // $dir = $varDir . "/cjw_newsletter/tmp/"; $dir = eZDir::path(array($varDir, 'cjw_newsletter', 'tmp')); $fileSep = eZSys::fileSeparator(); $filePath = $dir . $fileSep; if ($createDirIfNotExists === true) { if (!file_exists($filePath)) { eZDir::mkdir($filePath, false, true); } } return $filePath; }
function copyFilesFromDB($excludeScopes, $remove) { global $cli, $fileHandler; $cli->output("Exporting files from database:"); $filePathList = $fileHandler->getFileList($excludeScopes, true); foreach ($filePathList as $filePath) { $cli->output("- " . $filePath); eZDir::mkdir(dirname($filePath), false, true); $fileHandler->fileFetch($filePath); if ($remove) { $fileHandler->fileDelete($filePath); } } $cli->output(); }
/** * Creates a new cache storage for a given location through eZ Publish cluster mechanism * Options can contain the 'ttl' ( Time-To-Life ). This is per default set * to 1 day. * @param string $location Path to the cache location inside the cluster * @param array(string=>string) $options Options for the cache. */ public function __construct( $location, $options = array() ) { $apiName = ezpRestPrefixFilterInterface::getApiProviderName(); $apiVersion = ezpRestPrefixFilterInterface::getApiVersion(); $location = eZSys::cacheDirectory().'/rest/'.$location; if( !file_exists( $location ) ) { if( !eZDir::mkdir( $location, false, true ) ) { throw new ezcBaseFilePermissionException( $location, ezcBaseFileException::WRITE, 'Cache location is not writeable.' ); } } parent::__construct( $location ); $this->properties['options'] = new ezpCacheStorageClusterOptions( $options ); }
/** * Logs the string $logString to the logfile webservices.log * in the current log directory (usually var/log). * If logging is disabled, nothing is done. * * In dev mode, also writes to the eZP logs to ease debugging (this happens * regardless of the logging level set for the extension itself) */ static function appendLogEntry($logString, $debuglevel) { $ini = eZINI::instance('site.ini'); if ($ini->variable('DebugSettings', 'DebugOutput') == 'enabled' && $ini->variable('TemplateSettings', 'DevelopmentMode') == 'enabled') { switch ($debuglevel) { case 'info': case 'notice': eZDebug::writeNotice($logString, 'ggwebservices'); break; case 'debug': eZDebug::writeDebug($logString, 'ggwebservices'); break; case 'warning': eZDebug::writeWarning($logString, 'ggwebservices'); break; case 'error': case 'critical': eZDebug::writeError($logString, 'ggwebservices'); break; } } if (!self::isLoggingEnabled($debuglevel)) { return false; } $varDir = eZSys::varDirectory(); $logDir = 'log'; $logName = 'webservices.log'; $fileName = $varDir . '/' . $logDir . '/' . $logName; if (!file_exists($varDir . '/' . $logDir)) { //include_once( 'lib/ezfile/classes/ezdir.php' ); eZDir::mkdir($varDir . '/' . $logDir, 0775, true); } if ($logFile = fopen($fileName, 'a')) { $nowTime = date("Y-m-d H:i:s : "); $text = $nowTime . $logString; /*if ( $label ) $text .= ' [' . $label . ']';*/ fwrite($logFile, $text . "\n"); fclose($logFile); } }
static function writeStorageLog($name, $dir = false) { $ini = eZINI::instance(); $varDir = $ini->variable('FileSettings', 'VarDir'); $logDir = $ini->variable('FileSettings', 'LogDir'); $logName = 'storage.log'; $fileName = $varDir . '/' . $logDir . '/' . $logName; $oldumask = @umask(0); clearstatcache(true, $fileName); $fileExisted = file_exists($fileName); if ($fileExisted and filesize($fileName) > eZLog::maxLogSize()) { if (eZLog::rotateLog($fileName)) { $fileExisted = false; } } else { if (!$fileExisted and !file_exists($varDir . '/' . $logDir)) { eZDir::mkdir($varDir . '/' . $logDir, false, true); } } if ($dir !== false) { $dir = preg_replace("#/\$#", "", $dir); $dir .= "/"; } else { $dir = ""; } $logFile = @fopen($fileName, "a"); if ($logFile) { $time = strftime("%b %d %Y %H:%M:%S", strtotime("now")); $logMessage = "[ " . $time . " ] [" . $dir . $name . "]\n"; @fwrite($logFile, $logMessage); @fclose($logFile); if (!$fileExisted) { $permissions = octdec($ini->variable('FileSettings', 'LogFilePermissions')); @chmod($fileName, $permissions); } @umask($oldumask); } else { eZDebug::writeError('Couldn\'t create the log file "' . $fileName . '"', __METHOD__); } }
function writeFile(&$logFileData, &$string, $verbosityLevel, $alwaysLog = false) { $enabled = eZDebug::isDebugEnabled(); if (!$alwaysLog and !$enabled) { return; } if (!$alwaysLog and !$this->isLogFileEnabled($verbosityLevel)) { return; } $oldHandleType = eZDebug::setHandleType(self::HANDLE_TO_PHP); $logDir = $logFileData[0]; $logName = $logFileData[1]; $fileName = $logDir . $logName; if (!file_exists($logDir)) { eZDir::mkdir($logDir, false, true); } $oldumask = @umask(0); clearstatcache(true, $fileName); $fileExisted = file_exists($fileName); if ($fileExisted and filesize($fileName) > eZDebug::maxLogSize()) { if (eZDebug::rotateLog($fileName)) { $fileExisted = false; } } $logFile = @fopen($fileName, "a"); if ($logFile) { $time = strftime("%b %d %Y %H:%M:%S", strtotime("now")); $ip = eZSys::clientIP(); if (!$ip) { $ip = eZSys::serverVariable('HOSTNAME', true); } $notice = "[ " . $time . " ] [" . $ip . "] " . $string . "\n"; @fwrite($logFile, $notice); @fclose($logFile); if (!$fileExisted) { $ini = eZINI::instance(); $permissions = octdec($ini->variable('FileSettings', 'LogFilePermissions')); @chmod($fileName, $permissions); } @umask($oldumask); } else { @umask($oldumask); $logEnabled = $this->isLogFileEnabled($verbosityLevel); $this->setLogFileEnabled(false, $verbosityLevel); if ($verbosityLevel != self::LEVEL_ERROR or $logEnabled) { eZDebug::setHandleType($oldHandleType); $this->writeError("Cannot open log file '{$fileName}' for writing\n" . "The web server must be allowed to modify the file.\n" . "File logging for '{$fileName}' is disabled.", 'eZDebug::writeFile'); } } eZDebug::setHandleType($oldHandleType); }
/** * Converts the source image $sourceMimeData into the destination image * $destinationMimeData. * * @param mixed $sourceMimeData Source image, either a mimedata array or the * source image path * @param mixed $destinationMimeData * Either a mimedata array or the target image path * @param mixed $aliasName * Target alias (small, medium, large...) * @param array $parameters * Optional parameters. Known ones so far: (basename) * @return bool */ function convert( $sourceMimeData, &$destinationMimeData, $aliasName = false, $parameters = array() ) { // if the local file doesn't exist, we need to fetch it locally if ( !file_exists( $sourceMimeData['url'] ) ) { $sourceFileHandler = eZClusterFileHandler::instance( $sourceMimeData['url'] ); $sourceFileHandler->fetch(); } if ( is_string( $sourceMimeData ) ) $sourceMimeData = eZMimeType::findByFileContents( $sourceMimeData ); $this->analyzeImage( $sourceMimeData ); $currentMimeData = $sourceMimeData; $handlers = $this->ImageHandlers; $supportedMIMEMap = $this->SupportedMIMEMap; if ( is_string( $destinationMimeData ) ) { $destinationPath = $destinationMimeData; $destinationMimeData = eZMimeType::findByFileContents( $destinationPath ); } $filters = array(); $alias = false; if ( $aliasName ) { $aliasList = $this->aliasList(); if ( isset( $aliasList[$aliasName] ) ) { $alias = $aliasList[$aliasName]; $filters = $alias['filters']; if ( $alias['mime_type'] ) { eZMimeType::changeMIMEType( $destinationMimeData, $alias['mime_type'] ); } } } $mimeTypeOverride = $this->mimeTypeOverride( $sourceMimeData ); if ( $mimeTypeOverride ) $alias['override_mime_type'] = $mimeTypeOverride; if ( isset( $parameters['filters'] ) ) { $filters = array_merge( $filters, $parameters['filters'] ); } $wantedFilters = $filters; $mimeTypeFilters = $this->mimeTypeFilters( $sourceMimeData ); if ( is_array( $mimeTypeFilters ) ) $wantedFilters = array_merge( $wantedFilters, $mimeTypeFilters ); $filters = array(); foreach ( array_keys( $wantedFilters ) as $wantedFilterKey ) { $wantedFilter = $wantedFilters[$wantedFilterKey]; if ( !$this->isFilterSupported( $wantedFilter['name'] ) ) { eZDebug::writeWarning( "The filter '" . $wantedFilter['name'] . "' is not supported by any of the image handlers, will ignore this filter", __METHOD__ ); continue; } $filters[] = $wantedFilter; } if ( !$destinationMimeData['is_valid'] ) { $destinationDirPath = $destinationMimeData['dirpath']; $destinationBasename = $destinationMimeData['basename']; if ( isset( $supportedMIMEMap[$sourceMimeData['name']] ) ) { $destinationMimeData = $sourceMimeData; if ( $alias['mime_type'] ) { eZMimeType::changeMIMEType( $destinationMimeData, $alias['mime_type'] ); } eZMimeType::changeFileData( $destinationMimeData, $destinationDirPath, $destinationBasename ); } else { $hasDestination = false; foreach ( $handlers as $handler ) { $gotMimeData = true; while( $gotMimeData ) { $gotMimeData = false; $outputMimeData = $handler->outputMIMEType( $this, $sourceMimeData, false, $this->SupportedFormats, $aliasName ); if ( $outputMimeData and isset( $supportedMIMEMap[$outputMimeData['name']] ) ) { $destinationMimeData = $outputMimeData; eZMimeType::changeFileData( $destinationMimeData, $destinationDirPath, $destinationBasename ); $hasDestination = true; $gotMimeData = true; break; } } } if ( !$hasDestination ) { if ( isset( $sourceFileHandler ) ) $sourceFileHandler->deleteLocal(); return false; } } } $wantedFilters = $filters; $filters = array(); foreach ( array_keys( $wantedFilters ) as $wantedFilterKey ) { $wantedFilter = $wantedFilters[$wantedFilterKey]; if ( !$this->isFilterAllowed( $wantedFilter['name'], $destinationMimeData ) ) { continue; } $filters[] = $wantedFilter; } $result = true; $tempFiles = array(); if ( $currentMimeData['name'] != $destinationMimeData['name'] or count( $filters ) > 0 ) { while ( $currentMimeData['name'] != $destinationMimeData['name'] or count( $filters ) > 0 ) { $nextMimeData = false; $nextHandler = false; foreach ( $handlers as $handler ) { if ( !$handler ) continue; $handlerFilters = array(); $leftoverFilters = array(); foreach ( $filters as $filter ) { if ( $handler->isFilterSupported( $filter ) ) $handlerFilters[] = $filter; else $leftoverFilters[] = $filter; } $outputMimeData = $handler->outputMIMEType( $this, $currentMimeData, $destinationMimeData, $this->SupportedFormats, $aliasName ); if ( $outputMimeData['name'] == $destinationMimeData['name'] and count( $handlerFilters ) > 0 ) { $nextMimeData = $outputMimeData; $nextHandler = $handler; break; } if ( $outputMimeData and !$nextMimeData ) { $nextMimeData = $outputMimeData; $nextHandler = $handler; } } if ( !$nextMimeData ) { eZDebug::writeError( "None of the handlers can convert MIME-Type " . $currentMimeData['name'], __METHOD__ ); if ( isset( $sourceFile ) ) $sourceFile->deleteLocal(); return false; } $useTempImage = false; if ( $nextMimeData['name'] == $destinationMimeData['name'] and count( $leftoverFilters ) == 0 ) { $nextMimeData['dirpath'] = $destinationMimeData['dirpath']; } else { $useTempImage = true; $nextMimeData['dirpath'] = $this->temporaryImageDirPath(); } eZMimeType::changeDirectoryPath( $nextMimeData, $nextMimeData['dirpath'] ); if ( $nextMimeData['dirpath'] and !file_exists( $nextMimeData['dirpath'] ) ) eZDir::mkdir( $nextMimeData['dirpath'], false, true ); if ( $currentMimeData['name'] == $nextMimeData['name'] and count( $handlerFilters ) == 0 ) { if ( $currentMimeData['url'] != $nextMimeData['url'] ) { if ( eZFileHandler::copy( $currentMimeData['url'], $nextMimeData['url'] ) ) { if ( $useTempImage ) $tempFiles[] = $nextMimeData['url']; } else { $result = false; break; } } $currentMimeData = $nextMimeData; } else { if ( $nextHandler->convert( $this, $currentMimeData, $nextMimeData, $handlerFilters ) ) { if ( $useTempImage ) $tempFiles[] = $nextMimeData['url']; } else { $result = false; break; } // store the converted file to cluster if the conversion is between mime name $fileHandler = eZClusterFileHandler::instance(); $fileHandler->fileStore( $nextMimeData['url'], 'image', false, $nextMimeData['name'] ); $currentMimeData = $nextMimeData; } $filters = $leftoverFilters; } } else { $useCopy = false; if ( $aliasName and $aliasName != 'original' ) { $destinationMimeData['filename'] = $destinationMimeData['basename'] . '_' . $aliasName . '.' . $destinationMimeData['suffix']; if ( $destinationMimeData['dirpath'] ) $destinationMimeData['url'] = $destinationMimeData['dirpath'] . '/' . $destinationMimeData['filename']; else $destinationMimeData['url'] = $destinationMimeData['filename']; } if ( $sourceMimeData['url'] != $destinationMimeData['url'] ) { if ( $useCopy ) { eZFileHandler::copy( $sourceMimeData['url'], $destinationMimeData['url'] ); } else { eZFileHandler::linkCopy( $sourceMimeData['url'], $destinationMimeData['url'], false ); } $currentMimeData = $destinationMimeData; } } foreach ( $tempFiles as $tempFile ) { if ( !@unlink( $tempFile ) ) { eZDebug::writeError( "Failed to unlink temporary image file $tempFile", __METHOD__ ); } } $destinationMimeData = $currentMimeData; if ( $aliasName && $aliasName != 'original' ) { if ( $result ) { $destinationFilePath = $destinationMimeData['url']; $fileHandler = eZClusterFileHandler::instance(); $fileHandler->fileStore( $destinationFilePath, 'image', true, $destinationMimeData['name'] ); } if ( isset( $sourceFileHandler ) ) $sourceFileHandler->deleteLocal(); } return $result; }
function eZSetupTestDirectoryPermissions($type) { $dirList = eZSetupConfigVariableArray($type, 'CheckList'); $ini = eZINI::instance(); $dirPermission = $ini->variable('FileSettings', 'StorageDirPermissions'); $result = true; $resultElements = array(); $resultElementsByErrorCode = array(); $rootDir = eZSys::rootDir(); $dirPermOctal = octdec($dirPermission); foreach ($dirList as $dir) { if (empty($dir)) { continue; } $resultElement = array(); $resultElement['file'] = $dir; $resultElement['result'] = 1; // ok by default $resultElement['permission'] = false; $dir = eZDir::cleanPath($dir); if (!file_exists($dir)) { // if directory does not exist then try to create it if (empty($rootDir)) { $dirPath = './' . $dir; } else { $dirPath = $rootDir . '/' . $dir; } $res = eZDir::mkdir($dirPath, $dirPermOctal); if ($res) { $resultElement['permission'] = $dirPermission; $resultElement['result'] = 1; } else { $result = false; $resultElement['result'] = 2; // unable to create unexistent dir } } else { if (is_dir($dir)) { $resultElement['permission'] = $dirPermission; if (!eZSetupPrvtAreDirAndFilesWritable($dir)) { $result = false; $resultElement['result'] = 3; // dir has wrong permissions } } else { if (is_file($dir)) { $result = false; $resultElement['result'] = 4; // dir exists but it is a file } } } $resultElements[] = $resultElement; $resultElementsByErrorCode[$resultElement['result']][] = $resultElement; } $safeMode = ini_get('safe_mode') != 0; $userInfo = eZSetupPrvPosixExtension(); return array('result' => $result, 'safe_mode' => $safeMode, 'user_info' => $userInfo, 'persistent_data' => array('result' => array('value' => $result)), 'current_path' => realpath('.'), 'result_elements' => $resultElements, 'result_elements_by_error_code' => $resultElementsByErrorCode); }
/** * Creates the cache path if it doesn't exist, and returns the cache * directory. The $userId parameter is used to create multi-level directory names * * @params int $userId * @return string Cache directory for the user */ static function getCacheDir($userId = 0) { $dir = eZSys::cacheDirectory() . '/user-info' . eZDir::createMultilevelPath($userId, 5); if (!is_dir($dir)) { eZDir::mkdir($dir, false, true); } return $dir; }
function initializePackage($siteType, &$accessMap, $charset, &$extraLanguageCodes, &$allLanguages, &$primaryLanguage, &$admin, &$resultArray) { // Time limit #3: // We set the time limit to 5 minutes to ensure we have enough time // to initialize the site. However we only set if the current limit // is too small $maxTime = ini_get('max_execution_time'); if ($maxTime != 0 and $maxTime < 5 * 60) { @set_time_limit(5 * 60); } switch ($siteType['access_type']) { case 'port': $userSiteaccessName = $siteType['identifier'] . '_' . 'user'; $adminSiteaccessName = $siteType['identifier'] . '_' . 'admin'; $accessMap['port'][$siteType['access_type_value']] = $userSiteaccessName; $accessMap['port'][$siteType['admin_access_type_value']] = $adminSiteaccessName; break; case 'hostname': $userSiteaccessName = $siteType['identifier'] . '_' . 'user'; $adminSiteaccessName = $siteType['identifier'] . '_' . 'admin'; $accessMap['hostname'][$siteType['access_type_value']] = $userSiteaccessName; $accessMap['hostname'][$siteType['admin_access_type_value']] = $adminSiteaccessName; break; case 'url': default: $userSiteaccessName = $siteType['access_type_value']; $adminSiteaccessName = $siteType['admin_access_type_value']; $accessMap['url'][$siteType['access_type_value']] = $userSiteaccessName; $accessMap['url'][$siteType['admin_access_type_value']] = $adminSiteaccessName; break; } $accessMap['accesses'][] = $userSiteaccessName; $accessMap['accesses'][] = $adminSiteaccessName; $accessMap['sites'][] = $userSiteaccessName; $userDesignName = $siteType['identifier']; $languageObjects = $allLanguages; $databaseMap = eZSetupDatabaseMap(); $databaseInfo = $this->PersistenceList['database_info']; $databaseInfo['info'] = $databaseMap[$databaseInfo['type']]; $dbServer = $databaseInfo['server']; $dbPort = $databaseInfo['port']; // $dbName = $databaseInfo['dbname']; $dbSocket = $databaseInfo['socket']; $dbUser = $databaseInfo['user']; $dbPwd = $databaseInfo['password']; $dbCharset = $charset; $dbDriver = $databaseInfo['info']['driver']; $dbName = $siteType['database']; $dbParameters = array('server' => $dbServer, 'port' => $dbPort, 'user' => $dbUser, 'password' => $dbPwd, 'socket' => $dbSocket, 'database' => $dbName, 'charset' => $dbCharset); $db = eZDB::instance($dbDriver, $dbParameters, true); if (!$db->isConnected()) { $resultArray['errors'][] = array('code' => 'EZSW-005', 'text' => "Failed connecting to database {$dbName}\n" . $db->errorMessage()); return false; } eZDB::setInstance($db); $result = true; // Initialize the database by inserting schema and data if (!isset($siteType['existing_database'])) { $siteType['existing_database'] = false; } if ($siteType['existing_database'] == eZStepInstaller::DB_DATA_REMOVE) { eZDBTool::cleanup($db); } if ($siteType['existing_database'] != eZStepInstaller::DB_DATA_KEEP) { $result = true; $schemaArray = eZDbSchema::read('share/db_schema.dba', true); if (!$schemaArray) { $resultArray['errors'][] = array('code' => 'EZSW-001', 'message' => "Failed loading database schema file share/db_schema.dba"); $result = false; } if ($result) { $result = true; $dataArray = eZDbSchema::read('share/db_data.dba', true); if (!$dataArray) { $resultArray['errors'][] = array('code' => 'EZSW-002', 'text' => "Failed loading database data file share/db_data.dba"); $result = false; } if ($result) { $schemaArray = array_merge($schemaArray, $dataArray); $schemaArray['type'] = strtolower($db->databaseName()); $schemaArray['instance'] = $db; $result = true; $dbSchema = eZDbSchema::instance($schemaArray); if (!$dbSchema) { $resultArray['errors'][] = array('code' => 'EZSW-003', 'text' => "Failed loading " . $db->databaseName() . " schema handler"); $result = false; } if ($result) { $result = true; // This will insert the schema, then the data and // run any sequence value correction SQL if required $params = array('schema' => true, 'data' => true); if ($db->databaseName() == 'mysql') { $engines = $db->arrayQuery('SHOW ENGINES'); foreach ($engines as $engine) { if ($engine['Engine'] == 'InnoDB' && in_array($engine['Support'], array('YES', 'DEFAULT'))) { $params['table_type'] = 'innodb'; break; } } } if (!$dbSchema->insertSchema($params)) { $resultArray['errors'][] = array('code' => 'EZSW-004', 'text' => "Failed inserting data to " . $db->databaseName() . "\n" . $db->errorMessage()); $result = false; } } } } if ($result) { // Inserting data from the dba-data files of the datatypes eZDataType::loadAndRegisterAllTypes(); $registeredDataTypes = eZDataType::registeredDataTypes(); foreach ($registeredDataTypes as $dataType) { if (!$dataType->importDBDataFromDBAFile()) { $resultArray['errors'][] = array('code' => 'EZSW-002', 'text' => "Failed importing datatype related data into database: \n" . 'datatype - ' . $dataType->DataTypeString . ", \n" . 'dba-data file - ' . $dataType->getDBAFilePath()); } } } } if (!$result) { return false; } // Database initialization done // Prepare languages $primaryLanguageLocaleCode = $primaryLanguage->localeCode(); $primaryLanguageName = $primaryLanguage->languageName(); $prioritizedLanguages = array_merge(array($primaryLanguageLocaleCode), $extraLanguageCodes); $installParameters = array('path' => '.'); $installParameters['ini'] = array(); $siteINIChanges = array(); $url = $siteType['url']; if (preg_match("#^[a-zA-Z0-9]+://(.*)\$#", $url, $matches)) { $url = $matches[1]; } $siteINIChanges['SiteAccessSettings'] = array('RelatedSiteAccessList' => $accessMap['accesses']); $siteINIChanges['ContentSettings'] = array('TranslationList' => implode(';', $extraLanguageCodes)); $siteINIChanges['SiteSettings'] = array('SiteName' => $siteType['title'], 'SiteURL' => $url); $siteINIChanges['DatabaseSettings'] = array('DatabaseImplementation' => $dbDriver, 'Server' => $dbServer, 'Port' => $dbPort, 'Database' => $dbName, 'User' => $dbUser, 'Password' => $dbPwd, 'Charset' => false); $siteINIChanges['FileSettings'] = array('VarDir' => 'var/' . $siteType['identifier']); if (trim($dbSocket) != '') { $siteINIChanges['DatabaseSettings']['Socket'] = $dbSocket; } else { $siteINIChanges['DatabaseSettings']['Socket'] = 'disabled'; } if ($admin['email']) { $siteINIChanges['InformationCollectionSettings'] = array('EmailReceiver' => false); $siteINIChanges['UserSettings'] = array('RegistrationEmail' => false); $siteINIChanges['MailSettings'] = array('AdminEmail' => $admin['email'], 'EmailSender' => false); } $siteINIChanges['RegionalSettings'] = array('Locale' => $primaryLanguage->localeFullCode(), 'ContentObjectLocale' => $primaryLanguage->localeCode(), 'SiteLanguageList' => $prioritizedLanguages); if ($primaryLanguage->localeCode() == 'eng-GB') { $siteINIChanges['RegionalSettings']['TextTranslation'] = 'disabled'; } else { $siteINIChanges['RegionalSettings']['TextTranslation'] = 'enabled'; } $installParameters['ini']['siteaccess'][$adminSiteaccessName]['site.ini.append'] = $siteINIChanges; $installParameters['ini']['siteaccess'][$userSiteaccessName]['site.ini.append'] = $siteINIChanges; $installParameters['ini']['siteaccess'][$userSiteaccessName]['site.ini']['DesignSettings'] = array('SiteDesign' => $userDesignName); $installParameters['variables']['user_siteaccess'] = $userSiteaccessName; $installParameters['variables']['admin_siteaccess'] = $adminSiteaccessName; $installParameters['variables']['design'] = $userDesignName; $tmpSiteINI = eZINI::create('site.ini'); // Set ReadOnlySettingsCheck to false: towards // Ignore site.ini[eZINISettings].ReadonlySettingList[] settings when saving ini variables. $tmpSiteINI->setReadOnlySettingsCheck(false); $tmpSiteINI->setVariable('FileSettings', 'VarDir', $siteINIChanges['FileSettings']['VarDir']); // Change the current translation variables, before other parts start using them $tmpSiteINI->setVariable('RegionalSettings', 'Locale', $siteINIChanges['RegionalSettings']['Locale']); $tmpSiteINI->setVariable('RegionalSettings', 'ContentObjectLocale', $siteINIChanges['RegionalSettings']['ContentObjectLocale']); $tmpSiteINI->setVariable('RegionalSettings', 'TextTranslation', $siteINIChanges['RegionalSettings']['TextTranslation']); $tmpSiteINI->save(false, '.append.php', false, true, "settings/siteaccess/{$userSiteaccessName}"); /* $typeFunctionality = eZSetupFunctionality( $siteType['identifier'] ); $extraFunctionality = array_merge( isset( $this->PersistenceList['additional_packages'] ) ? $this->PersistenceList['additional_packages'] : array(), $typeFunctionality['required'] ); $extraFunctionality = array_unique( $extraFunctionality ); */ // Add a policy to permit editors using OE eZPolicy::createNew(3, array('ModuleName' => 'ezoe', 'FunctionName' => '*')); // Install site package and it's required packages $sitePackageName = $this->chosenSitePackage(); $sitePackage = eZPackage::fetch($sitePackageName); if (!is_object($sitePackage)) { $resultArray['errors'][] = array('code' => 'EZSW-041', 'text' => " Could not fetch site package: '{$sitePackageName}'"); return false; } $dependecies = $sitePackage->attribute('dependencies'); $requires = $dependecies['requires']; $requiredPackages = array(); // Include setting files $settingsFiles = $sitePackage->attribute('settings-files'); foreach ($settingsFiles as $settingsFileName) { if (file_exists($sitePackage->path() . '/settings/' . $settingsFileName)) { include_once $sitePackage->path() . '/settings/' . $settingsFileName; } } // Call user function for additional setup tasks. if (function_exists('eZSitePreInstall')) { eZSitePreInstall($siteType); } // Make sure objects use the selected main language instead of eng-GB if ($primaryLanguageLocaleCode != 'eng-GB') { $engLanguageObj = eZContentLanguage::fetchByLocale('eng-GB'); $engLanguageID = (int) $engLanguageObj->attribute('id'); $updateSql = "UPDATE ezcontent_language\nSET\nlocale='{$primaryLanguageLocaleCode}',\nname='{$primaryLanguageName}'\nWHERE\nid={$engLanguageID}"; $db->query($updateSql); eZContentLanguage::expireCache(); $primaryLanguageObj = eZContentLanguage::fetchByLocale($primaryLanguageLocaleCode); // Add it if it is missing (most likely) if (!$primaryLanguageObj) { $primaryLanguageObj = eZContentLanguage::addLanguage($primaryLanguageLocaleCode, $primaryLanguageName); } $primaryLanguageID = (int) $primaryLanguageObj->attribute('id'); // Find objects which are always available if ($db->databaseName() == 'oracle') { $sql = "SELECT id\nFROM\nezcontentobject\nWHERE\nbitand( language_mask, 1 ) = 1"; } else { $sql = "SELECT id\nFROM\nezcontentobject\nWHERE\nlanguage_mask & 1 = 1"; } $objectList = array(); $list = $db->arrayQuery($sql); foreach ($list as $row) { $objectList[] = (int) $row['id']; } $inSql = 'IN ( ' . implode(', ', $objectList) . ')'; // Updates databases that have eng-GB data to the new locale. $updateSql = "UPDATE ezcontentobject_name\nSET\ncontent_translation='{$primaryLanguageLocaleCode}',\nreal_translation='{$primaryLanguageLocaleCode}',\nlanguage_id={$primaryLanguageID}\nWHERE\ncontent_translation='eng-GB' OR\nreal_translation='eng-GB'"; $db->query($updateSql); // Fix always available $updateSql = "UPDATE ezcontentobject_name\nSET\nlanguage_id=language_id+1\nWHERE\ncontentobject_id {$inSql}"; $db->query($updateSql); // attributes $updateSql = "UPDATE ezcontentobject_attribute\nSET\nlanguage_code='{$primaryLanguageLocaleCode}',\nlanguage_id={$primaryLanguageID}\nWHERE\nlanguage_code='eng-GB'"; $db->query($updateSql); // Fix always available $updateSql = "UPDATE ezcontentobject_attribute\nSET\nlanguage_id=language_id+1\nWHERE\ncontentobject_id {$inSql}"; $db->query($updateSql); // version $updateSql = "UPDATE ezcontentobject_version\nSET\ninitial_language_id={$primaryLanguageID},\nlanguage_mask={$primaryLanguageID}\nWHERE\ninitial_language_id={$engLanguageID}"; $db->query($updateSql); // Fix always available $updateSql = "UPDATE ezcontentobject_version\nSET\nlanguage_mask=language_mask+1\nWHERE\ncontentobject_id {$inSql}"; $db->query($updateSql); // object $updateSql = "UPDATE ezcontentobject\nSET\ninitial_language_id={$primaryLanguageID},\nlanguage_mask={$primaryLanguageID}\nWHERE\ninitial_language_id={$engLanguageID}"; $db->query($updateSql); // Fix always available $updateSql = "UPDATE ezcontentobject\nSET\nlanguage_mask=language_mask+1\nWHERE\nid {$inSql}"; $db->query($updateSql); // content object state groups & states $mask = $primaryLanguageID | 1; $db->query("UPDATE ezcobj_state_group\n SET language_mask = {$mask}, default_language_id = {$primaryLanguageID}\n WHERE default_language_id = {$engLanguageID}"); $db->query("UPDATE ezcobj_state\n SET language_mask = {$mask}, default_language_id = {$primaryLanguageID}\n WHERE default_language_id = {$engLanguageID}"); $db->query("UPDATE ezcobj_state_group_language\n SET language_id = {$primaryLanguageID}\n WHERE language_id = {$engLanguageID}"); $db->query("UPDATE ezcobj_state_language\n SET language_id = {$primaryLanguageID}\n WHERE language_id = {$engLanguageID}"); // ezcontentclass_name $updateSql = "UPDATE ezcontentclass_name\nSET\nlanguage_locale='{$primaryLanguageLocaleCode}'\nWHERE\nlanguage_locale='eng-GB'"; $db->query($updateSql); // use high-level api, because it's impossible to update serialized names with direct sqls. // use direct access to 'NameList' to avoid unnecessary sql-requests and because // we do 'replacement' of existing language(with some 'id') with another language code. $contentClassList = eZContentClass::fetchList(); foreach ($contentClassList as $contentClass) { $classAttributes = $contentClass->fetchAttributes(); foreach ($classAttributes as $classAttribute) { $classAttribute->NameList->setName($classAttribute->NameList->name('eng-GB'), $primaryLanguageLocaleCode); $classAttribute->NameList->setAlwaysAvailableLanguage($primaryLanguageLocaleCode); $classAttribute->NameList->removeName('eng-GB'); $classAttribute->store(); } $contentClass->NameList->setName($contentClass->NameList->name('eng-GB'), $primaryLanguageLocaleCode); $contentClass->NameList->setAlwaysAvailableLanguage($primaryLanguageLocaleCode); $contentClass->NameList->removeName('eng-GB'); $contentClass->NameList->setHasDirtyData(false); // to not update 'ezcontentclass_name', because we've already updated it. $contentClass->store(); } } // Setup all languages foreach ($allLanguages as $languageObject) { $primaryLanguageObj = eZContentLanguage::fetchByLocale($languageObject->localeCode()); // Add it if it is missing (most likely) if (!$primaryLanguageObj) { $primaryLanguageObj = eZContentLanguage::addLanguage($languageObject->localeCode(), $languageObject->internationalLanguageName()); } } eZContentLanguage::expireCache(); // Make sure priority list is changed to the new chosen languages eZContentLanguage::setPrioritizedLanguages($prioritizedLanguages); if ($siteType['existing_database'] != eZStepInstaller::DB_DATA_KEEP) { $user = eZUser::instance(14); // Must be initialized to make node assignments work correctly if (!is_object($user)) { $resultArray['errors'][] = array('code' => 'EZSW-020', 'text' => "Could not fetch administrator user object"); return false; } // Make sure Admin is the currently logged in user // This makes sure all new/changed objects get this as creator $user->loginCurrent(); // by default(if 'language_map' is not set) create all necessary languages $languageMap = isset($this->PersistenceList['package_info']) && isset($this->PersistenceList['package_info']['language_map']) ? $this->PersistenceList['package_info']['language_map'] : true; if (is_array($languageMap) && count($languageMap) > 0) { // // Create necessary languages and set them as "prioritized languages" to avoid // drawbacks in fetch functions, like eZContentObjectTreeNode::fetch(). // $prioritizedLanguageObjects = eZContentLanguage::prioritizedLanguages(); // returned objects foreach ($languageMap as $fromLanguage => $toLanguage) { if ($toLanguage != 'skip') { $prioritizedLanguageObjects[] = eZContentLanguage::fetchByLocale($toLanguage, true); } } $prioritizedLanguageLocales = array(); foreach ($prioritizedLanguageObjects as $language) { $locale = $language->attribute('locale'); if (!in_array($locale, $prioritizedLanguageLocales)) { $prioritizedLanguageLocales[] = $locale; } } eZContentLanguage::setPrioritizedLanguages($prioritizedLanguageLocales); } foreach ($requires as $require) { if ($require['type'] != 'ezpackage') { continue; } $packageName = $require['name']; $package = eZPackage::fetch($packageName, false, false, false); if (is_object($package)) { $requiredPackages[] = $package; if ($package->attribute('install_type') == 'install') { $installParameters = array('use_dates_from_package' => true, 'site_access_map' => array('*' => $userSiteaccessName), 'top_nodes_map' => array('*' => 2), 'design_map' => array('*' => $userDesignName), 'language_map' => $languageMap, 'restore_dates' => true, 'user_id' => $user->attribute('contentobject_id'), 'non-interactive' => true); $status = $package->install($installParameters); if (!$status) { $errorText = "Unable to install package '{$packageName}'"; if (isset($installParameters['error']['description'])) { $errorText .= ": " . $installParameters['error']['description']; } $resultArray['errors'][] = array('code' => 'EZSW-051', 'text' => $errorText); return false; } } } else { $resultArray['errors'][] = array('code' => 'EZSW-050', 'text' => "Could not fetch required package: '{$packageName}'"); return false; } unset($package); } } $GLOBALS['eZContentObjectDefaultLanguage'] = $primaryLanguageLocaleCode; $nodeRemoteMap = array(); $rows = $db->arrayQuery("SELECT node_id, remote_id FROM ezcontentobject_tree"); foreach ($rows as $row) { $remoteID = $row['remote_id']; if (strlen(trim($remoteID)) > 0) { $nodeRemoteMap[$remoteID] = $row['node_id']; } } $objectRemoteMap = array(); $rows = $db->arrayQuery("SELECT id, remote_id FROM ezcontentobject"); foreach ($rows as $row) { $remoteID = $row['remote_id']; if (strlen(trim($remoteID)) > 0) { $objectRemoteMap[$remoteID] = $row['id']; } } $classRemoteMap = array(); $rows = $db->arrayQuery("SELECT id, identifier, remote_id FROM ezcontentclass"); foreach ($rows as $row) { $remoteID = $row['remote_id']; if (strlen(trim($remoteID)) > 0) { $classRemoteMap[$remoteID] = array('id' => $row['id'], 'identifier' => $row['identifier']); } } $siteCSS = false; $classesCSS = false; foreach ($requiredPackages as $package) { if ($package->attribute('type') == 'sitestyle') { $fileList = $package->fileList('default'); foreach ($fileList as $file) { $fileIdentifier = $file["variable-name"]; if ($fileIdentifier == 'sitecssfile') { $siteCSS = $package->fileItemPath($file, 'default'); } else { if ($fileIdentifier == 'classescssfile') { $classesCSS = $package->fileItemPath($file, 'default'); } } } } } $parameters = array('node_remote_map' => $nodeRemoteMap, 'object_remote_map' => $objectRemoteMap, 'class_remote_map' => $classRemoteMap, 'preview_design' => $userDesignName, 'design_list' => array($userDesignName, 'admin2', 'admin'), 'user_siteaccess' => $userSiteaccessName, 'admin_siteaccess' => $adminSiteaccessName, 'package_object' => $sitePackage, 'siteaccess_urls' => $this->siteaccessURLs(), 'access_map' => $accessMap, 'site_type' => $siteType, 'all_language_codes' => $prioritizedLanguages); $siteINIStored = false; $siteINIAdminStored = false; $designINIStored = false; if (function_exists('eZSiteINISettings')) { $extraSettings = eZSiteINISettings($parameters); } else { $extraSettings = array(); } if (function_exists('eZSiteAdminINISettings')) { $extraAdminSettings = eZSiteAdminINISettings($parameters); } else { $extraAdminSettings = array(); } if (function_exists('eZSiteCommonINISettings')) { $extraCommonSettings = eZSiteCommonINISettings($parameters); } else { $extraCommonSettings = array(); } $isUntranslatedSettingAdded = false; foreach ($extraAdminSettings as $key => $extraAdminSetting) { if ($extraAdminSetting['name'] == 'site.ini') { $extraAdminSettings[$key]['settings']['RegionalSettings']['ShowUntranslatedObjects'] = 'enabled'; $isUntranslatedSettingAdded = true; break; } } if (!$isUntranslatedSettingAdded) { $extraAdminSettings[] = array('name' => 'site.ini', 'settings' => array('RegionalSettings' => array('ShowUntranslatedObjects' => 'enabled'))); } // Enable OE and ODF extensions by default $extensionsToEnable = array(); // Included in "fat" install, needs to override $extraCommonSettings extensions $extensionsPrepended = array('ezjscore', 'ezoe', 'ezformtoken'); foreach (array('ezie', 'ezodf', 'ezprestapiprovider', 'ezmultiupload', 'eztags', 'ezautosave', 'ez_network', 'ez_network_demo') as $extension) { if (file_exists("extension/{$extension}")) { $extensionsToEnable[] = $extension; } } $settingAdded = false; foreach ($extraCommonSettings as $key => $extraCommonSetting) { if ($extraCommonSetting['name'] == 'site.ini' && isset($extraCommonSettings[$key]['settings']['ExtensionSettings']['ActiveExtensions'])) { $settingAdded = true; $extraCommonSettings[$key]['settings']['ExtensionSettings']['ActiveExtensions'] = array_merge($extensionsPrepended, $extraCommonSettings[$key]['settings']['ExtensionSettings']['ActiveExtensions'], $extensionsToEnable); break; } } if (!$settingAdded) { $extraCommonSettings[] = array('name' => 'site.ini', 'settings' => array('ExtensionSettings' => array('ActiveExtensions' => array_merge($extensionsPrepended, $extensionsToEnable)))); } // Enable dynamic tree menu for the admin interface by default $enableDynamicTreeMenuAdded = false; foreach ($extraAdminSettings as $key => $extraSetting) { if ($extraSetting['name'] == 'contentstructuremenu.ini') { if (isset($extraSetting['settings']['TreeMenu'])) { $extraAdminSettings[$key]['settings']['TreeMenu']['Dynamic'] = 'enabled'; } else { $extraAdminSettings[$key]['settings'] = array('TreeMenu' => array('Dynamic' => 'enabled')); } $enableDynamicTreeMenuAdded = true; break; } } if (!$enableDynamicTreeMenuAdded) { $extraAdminSettings[] = array('name' => 'contentstructuremenu.ini', 'settings' => array('TreeMenu' => array('Dynamic' => 'enabled'))); } $resultArray['common_settings'] = $extraCommonSettings; foreach ($extraSettings as $extraSetting) { if ($extraSetting === false) { continue; } $iniName = $extraSetting['name']; $settings = $extraSetting['settings']; $resetArray = false; if (isset($extraSetting['reset_arrays'])) { $resetArray = $extraSetting['reset_arrays']; } $tmpINI = eZINI::create($iniName); // Set ReadOnlySettingsCheck to false: towards // Ignore site.ini[eZINISettings].ReadonlySettingList[] settings when saving ini variables. $tmpINI->setReadOnlySettingsCheck(false); $tmpINI->setVariables($settings); if ($iniName == 'site.ini') { $siteINIStored = true; $tmpINI->setVariables($siteINIChanges); $tmpINI->setVariable('DesignSettings', 'SiteDesign', $userDesignName); $tmpINI->setVariable('DesignSettings', 'AdditionalSiteDesignList', array('base')); } else { if ($iniName == 'design.ini') { if ($siteCSS) { $tmpINI->setVariable('StylesheetSettings', 'SiteCSS', $siteCSS); } if ($classesCSS) { $tmpINI->setVariable('StylesheetSettings', 'ClassesCSS', $classesCSS); } $designINIStored = true; } } $tmpINI->save(false, '.append.php', false, true, "settings/siteaccess/{$userSiteaccessName}", $resetArray); if ($siteType['existing_database'] != eZStepInstaller::DB_DATA_KEEP) { // setting up appropriate data in look&feel object $templateLookClass = eZContentClass::fetchByIdentifier('template_look', true); if ($templateLookClass) { $objectList = $templateLookClass->objectList(); if ($objectList and count($objectList) > 0) { $templateLookObject = current($objectList); $dataMap = $templateLookObject->fetchDataMap(); if (isset($dataMap['title'])) { $dataMap['title']->setAttribute('data_text', $siteINIChanges['SiteSettings']['SiteName']); $dataMap['title']->store(); } if (isset($dataMap['siteurl'])) { $dataMap['siteurl']->setAttribute('data_text', $siteINIChanges['SiteSettings']['SiteURL']); $dataMap['siteurl']->store(); } if (isset($dataMap['email'])) { $dataMap['email']->setAttribute('data_text', $siteINIChanges['MailSettings']['AdminEmail']); $dataMap['email']->store(); } $objectName = $templateLookClass->contentObjectName($templateLookObject); $templateLookObject->setName($objectName); $templateLookObject->store(); } } } } foreach ($extraAdminSettings as $extraSetting) { if ($extraSetting === false) { continue; } $iniName = $extraSetting['name']; $settings = $extraSetting['settings']; $resetArray = false; if (isset($extraSetting['reset_arrays'])) { $resetArray = $extraSetting['reset_arrays']; } $tmpINI = eZINI::create($iniName); $tmpINI->setVariables($settings); if ($iniName == 'site.ini') { $siteINIAdminStored = true; $tmpINI->setVariables($siteINIChanges); $tmpINI->setVariable('SiteAccessSettings', 'RequireUserLogin', 'true'); $tmpINI->setVariable('DesignSettings', 'SiteDesign', 'admin2'); $tmpINI->setVariable('DesignSettings', 'AdditionalSiteDesignList', array('admin')); $tmpINI->setVariable('SiteSettings', 'LoginPage', 'custom'); $tmpINI->setVariable('SiteSettings', 'DefaultPage', 'content/dashboard'); } $tmpINI->save(false, '.append.php', false, true, "settings/siteaccess/{$adminSiteaccessName}", $resetArray); } if (!$siteINIAdminStored) { $siteINI = eZINI::create('site.ini'); // Set ReadOnlySettingsCheck to false: towards // Ignore site.ini[eZINISettings].ReadonlySettingList[] settings when saving ini variables. $siteINI->setReadOnlySettingsCheck(false); $siteINI->setVariables($siteINIChanges); $siteINI->setVariable('SiteAccessSettings', 'RequireUserLogin', 'true'); $siteINI->setVariable('DesignSettings', 'SiteDesign', 'admin2'); $tmpINI->setVariable('DesignSettings', 'AdditionalSiteDesignList', array('admin')); $siteINI->setVariable('SiteSettings', 'LoginPage', 'custom'); $siteINI->setVariable('SiteSettings', 'DefaultPage', 'content/dashboard'); $siteINI->save(false, '.append.php', false, false, "settings/siteaccess/{$adminSiteaccessName}", true); } if (!$siteINIStored) { $siteINI = eZINI::create('site.ini'); // Set ReadOnlySettingsCheck to false: towards // Ignore site.ini[eZINISettings].ReadonlySettingList[] settings when saving ini variables. $siteINI->setReadOnlySettingsCheck(false); $siteINI->setVariables($siteINIChanges); $siteINI->setVariable('DesignSettings', 'SiteDesign', $userDesignName); $siteINI->setVariable('DesignSettings', 'AdditionalSiteDesignList', array('base')); $siteINI->save(false, '.append.php', false, true, "settings/siteaccess/{$userSiteaccessName}", true); } if (!$designINIStored) { $designINI = eZINI::create('design.ini'); // Set ReadOnlySettingsCheck to false: towards // Ignore site.ini[eZINISettings].ReadonlySettingList[] settings when saving ini variables. $designINI->setReadOnlySettingsCheck(false); if ($siteCSS) { $designINI->setVariable('StylesheetSettings', 'SiteCSS', $siteCSS); } if ($classesCSS) { $designINI->setVariable('StylesheetSettings', 'ClassesCSS', $classesCSS); } $designINI->save(false, '.append.php', false, true, "settings/siteaccess/{$userSiteaccessName}"); } eZDir::mkdir("design/" . $userDesignName); eZDir::mkdir("design/" . $userDesignName . "/templates"); eZDir::mkdir("design/" . $userDesignName . "/stylesheets"); eZDir::mkdir("design/" . $userDesignName . "/images"); eZDir::mkdir("design/" . $userDesignName . "/override"); eZDir::mkdir("design/" . $userDesignName . "/override/templates"); if ($siteType['existing_database'] == eZStepInstaller::DB_DATA_KEEP) { return true; } // Try and remove user/login without limitation from the anonymous user $anonRole = eZRole::fetchByName('Anonymous'); if (is_object($anonRole)) { $anonPolicies = $anonRole->policyList(); foreach ($anonPolicies as $anonPolicy) { if ($anonPolicy->attribute('module_name') == 'user' and $anonPolicy->attribute('function_name') == 'login') { $anonPolicy->removeThis(); break; } } } // Setup all roles according to site chosen and addons if (function_exists('eZSiteRoles')) { $extraRoles = eZSiteRoles($parameters); foreach ($extraRoles as $extraRole) { if (!$extraRole) { continue; } $extraRoleName = $extraRole['name']; $role = eZRole::fetchByName($extraRoleName); if (!is_object($role)) { $role = eZRole::create($extraRoleName); $role->store(); } $roleID = $role->attribute('id'); if (isset($extraRole['policies'])) { $extraPolicies = $extraRole['policies']; foreach ($extraPolicies as $extraPolicy) { if (isset($extraPolicy['limitation'])) { $role->appendPolicy($extraPolicy['module'], $extraPolicy['function'], $extraPolicy['limitation']); } else { $role->appendPolicy($extraPolicy['module'], $extraPolicy['function']); } } } if (isset($extraRole['assignments'])) { $roleAssignments = $extraRole['assignments']; foreach ($roleAssignments as $roleAssignment) { $assignmentIdentifier = false; $assignmentValue = false; if (isset($roleAssignment['limitation'])) { $assignmentIdentifier = $roleAssignment['limitation']['identifier']; $assignmentValue = $roleAssignment['limitation']['value']; } $role->assignToUser($roleAssignment['user_id'], $assignmentIdentifier, $assignmentValue); } } } } // Setup user preferences based on the site chosen and addons if (function_exists('eZSitePreferences')) { $prefs = eZSitePreferences($parameters); foreach ($prefs as $prefEntry) { if (!$prefEntry) { continue; } $prefUserID = $prefEntry['user_id']; foreach ($prefEntry['preferences'] as $pref) { $prefName = $pref['name']; $prefValue = $pref['value']; if (!eZPreferences::setValue($prefName, $prefValue, $prefUserID)) { $resultArray['errors'][] = array('code' => 'EZSW-070', 'text' => "Could not create ezpreference '{$prefValue}' for {$prefUserID}"); return false; } } } } $publishAdmin = false; $userAccount = eZUser::fetch(14); if (!is_object($userAccount)) { $resultArray['errors'][] = array('code' => 'EZSW-020', 'text' => "Could not fetch administrator user object"); return false; } $userObject = $userAccount->attribute('contentobject'); if (!is_object($userObject)) { $resultArray['errors'][] = array('code' => 'EZSW-021', 'text' => "Could not fetch administrator content object"); return false; } $newUserObject = $userObject->createNewVersion(false, false); if (!is_object($newUserObject)) { $resultArray['errors'][] = array('code' => 'EZSW-022', 'text' => "Could not create new version of administrator content object"); return false; } $dataMap = $newUserObject->attribute('data_map'); $error = false; if (trim($admin['email'])) { if (!isset($dataMap['user_account'])) { $resultArray['errors'][] = array('code' => 'EZSW-023', 'text' => "Administrator content object does not have a 'user_account' attribute"); return false; } $userAccount->setInformation(14, 'admin', $admin['email'], $admin['password'], $admin['password']); $dataMap['user_account']->setContent($userAccount); $dataMap['user_account']->store(); $publishAdmin = true; $userAccount->store(); } if (trim($admin['first_name']) or trim($admin['last_name'])) { if (!isset($dataMap['first_name'])) { $resultArray['errors'][] = array('code' => 'EZSW-023', 'text' => "Administrator content object does not have a 'first_name' field"); $error = true; } if (!isset($dataMap['last_name'])) { $resultArray['errors'][] = array('code' => 'EZSW-024', 'text' => "Administrator content object does not have a 'last_name' field"); $error = true; } if ($error) { return false; } $dataMap['first_name']->setAttribute('data_text', $admin['first_name']); $dataMap['first_name']->store(); $dataMap['last_name']->setAttribute('data_text', $admin['last_name']); $dataMap['last_name']->store(); $newUserObject->store(); $publishAdmin = true; } if ($publishAdmin) { $operationResult = eZOperationHandler::execute('content', 'publish', array('object_id' => $newUserObject->attribute('contentobject_id'), 'version' => $newUserObject->attribute('version'))); if ($operationResult['status'] != eZModuleOperationInfo::STATUS_CONTINUE) { $resultArray['errors'][] = array('code' => 'EZSW-025', 'text' => "Failed to properly publish the administrator object"); return false; } } // Call user function for additional setup tasks. if (function_exists('eZSitePostInstall')) { eZSitePostInstall($parameters); } // get all siteaccesses. do it via 'RelatedSiteAccessesList' settings. $adminSiteINI = eZINI::instance('site.ini' . '.append.php', "settings/siteaccess/{$adminSiteaccessName}"); $relatedSiteAccessList = $adminSiteINI->variable('SiteAccessSettings', 'RelatedSiteAccessList'); // Adding override for 'tiny_image' view for 'multi-option2' datatype foreach ($relatedSiteAccessList as $siteAccess) { $tmpOverrideINI = new eZINI('override.ini' . '.append.php', "settings/siteaccess/{$siteAccess}", null, null, null, true, true); $tmpOverrideINI->setVariable('tiny_image', 'Source', 'content/view/tiny.tpl'); $tmpOverrideINI->setVariable('tiny_image', 'MatchFile', 'tiny_image.tpl'); $tmpOverrideINI->setVariable('tiny_image', 'Subdir', 'templates'); $tmpOverrideINI->setVariable('tiny_image', 'Match', array('class_identifier' => 'image')); $tmpOverrideINI->save(); } $accessMap = $parameters['access_map']; // Call user function for some text which will be displayed at 'Finish' screen if (function_exists('eZSiteFinalText')) { $text = eZSiteFinalText($parameters); if (!isset($this->PersistenceList['final_text'])) { $this->PersistenceList['final_text'] = array(); } $this->PersistenceList['final_text'][] = $text; } // ensure that evaluated policy wildcards in the user info cache // will be up to date with the currently activated modules eZCache::clearByID('user_info_cache'); return true; }
protected function __mkdir_p( $dir ) { // create parent directories $dirElements = explode( '/', $dir ); if ( count( $dirElements ) == 0 ) return true; $result = true; $currentDir = $dirElements[0]; if ( $currentDir != '' && !file_exists( $currentDir ) && !eZDir::mkdir( $currentDir, false ) ) return false; for ( $i = 1; $i < count( $dirElements ); ++$i ) { $dirElement = $dirElements[$i]; if ( strlen( $dirElement ) == 0 ) continue; $currentDir .= '/' . $dirElement; if ( !file_exists( $currentDir ) && !eZDir::mkdir( $currentDir, false ) ) return false; $result = true; } return $result; }
function createInstallNode($package, $installNode, $installItem, $installType) { $installNode->setAttribute('original-path', $installItem['path']); $installNode->setAttribute('database-type', $installItem['database-type']); $originalPath = $installItem['path']; $installDirectory = $package->path() . '/' . eZDBPackageHandler::sqlDirectory(); if ($installItem['database-type']) { $installDirectory .= '/' . $installItem['database-type']; } if (!file_exists($installDirectory)) { eZDir::mkdir($installDirectory, false, true); } eZFileHandler::copy($originalPath, $installDirectory . '/' . $installItem['filename']); }
/** * Create the wildcard cache * * The wildcard caches are splitted between several files: * 'wildcard_<md5>_index.php': contains regexps for wildcards * 'wildcard_<md5>_0.php', * 'wildcard_<md5>_1.php', * ... * 'wildcard_<md5>_N.php': contains cached wildcards. * Each file has info about eZURLWildcard::WILDCARDS_PER_CACHE_FILE wildcards. * @return void */ protected static function createWildcardsIndex() { self::cacheInfoDirectories( $wildcardCacheDir, $wildcardCacheFile, $wildcardCachePath, $wildcardKeys ); if ( !file_exists( $wildcardCacheDir ) ) { eZDir::mkdir( $wildcardCacheDir, false, true ); } // Index file (wildcard_md5_index.php) $wildcardsIndex = array(); $limit = self::WILDCARDS_PER_CACHE_FILE; $offset = 0; $cacheFilesCount = 0; $wildcardNum = 0; while( 1 ) { $wildcards = self::fetchList( $offset, $limit, false ); if ( count( $wildcards ) === 0 ) { break; } // sub cache file (wildcard_md5_<i>.php) $wildcardDetails = array(); $currentSubCacheFile = self::loadCacheFile( $cacheFilesCount ); foreach ( $wildcards as $wildcard ) { $wildcardsIndex[] = self::matchRegexpCode( $wildcard ); $wildcardDetails[$wildcardNum] = self::matchReplaceCode( $wildcard ); ++$wildcardNum; } $binaryData = "<" . "?php\nreturn ". var_export( $wildcardDetails, true ) . ";\n?" . ">\n"; $currentSubCacheFile->storeContents( $binaryData, "wildcard-cache-$cacheFilesCount", 'php', true ); $offset += $limit; ++$cacheFilesCount; } $indexCacheFile = self::loadCacheFile(); $indexBinaryData = "<" . "?php\nreturn ". var_export( $wildcardsIndex, true ) . ";\n?" . ">\n"; $indexCacheFile->storeContents( $indexBinaryData, "wildcard-cache-index", 'php', true ); return $wildcardsIndex; // end index cache file }
static function storeCache($key) { $translationCache = eZTranslationCache::cacheTable(); if (!isset($translationCache[$key])) { eZDebug::writeWarning("Translation cache for key '{$key}' does not exist, cannot store cache", __METHOD__); return; } $internalCharset = eZTextCodec::internalCharset(); // $cacheFileKey = "$key-$internalCharset"; $cacheFileKey = $key; $cacheFileName = md5($cacheFileKey) . '.php'; $cache =& $translationCache[$key]; if (!file_exists(eZTranslationCache::cacheDirectory())) { eZDir::mkdir(eZTranslationCache::cacheDirectory(), false, true); } $php = new eZPHPCreator(eZTranslationCache::cacheDirectory(), $cacheFileName); $php->addRawVariable('eZTranslationCacheCodeDate', self::CODE_DATE); $php->addSpace(); $php->addRawVariable('CacheInfo', array('charset' => $internalCharset)); $php->addRawVariable('TranslationInfo', $cache['info']); $php->addSpace(); $php->addRawVariable('TranslationRoot', $cache['root']); $php->store(); }
function installTemplates( $templateList, $package, $subdirectory, &$installParameters ) { if ( !$templateList ) { return true; } $siteAccessDesignPathArray = array(); $templateRootPath = $package->path() . '/' . $subdirectory; foreach( $templateList->getElementsByTagName( 'file' ) as $fileNode ) { $originalSiteAccess = $fileNode->getAttribute( 'site-access' ); if ( isset( $installParameters['site_access_map'][$originalSiteAccess] ) ) { $newSiteAccess = $installParameters['site_access_map'][$originalSiteAccess]; } else { $newSiteAccess = $installParameters['site_access_map']['*']; } if ( !isset( $siteAccessDesignPathArray[$newSiteAccess] ) ) { $ini = eZINI::instance( 'site.ini', 'settings', null, null, true ); $ini->prependOverrideDir( "siteaccess/$newSiteAccess", false, 'siteaccess' ); $ini->loadCache(); if ( isset( $installParameters['design_map'] ) ) { $designMap = $installParameters['design_map']; if ( isset( $designMap[$originalSiteAccess] ) ) $siteAccessDesignPathArray[$newSiteAccess] = eZTemplateDesignResource::designStartPath() . '/' . $designMap[$originalSiteAccess]; else $siteAccessDesignPathArray[$newSiteAccess] = eZTemplateDesignResource::designStartPath() . '/' . $designMap['*']; } else { $siteAccessDesignPathArray[$newSiteAccess] = eZTemplateDesignResource::designStartPath() . '/' . $ini->variable( "DesignSettings", "StandardDesign" ); } } $path = ''; foreach( $fileNode->childNodes as $pathNode ) { if ( $pathNode->nodeName == 'path' ) { $path = $pathNode->nodeValue; break; } } $sourcePath = $templateRootPath . $path; $destinationPath = $siteAccessDesignPathArray[$newSiteAccess] . $path; eZDir::mkdir( eZDir::dirpath( $destinationPath ), false, true ); if ( !eZFileHandler::copy( $sourcePath, $destinationPath ) ) return false; // eZDebug::writeNotice( 'Copied: "' . $sourcePath . '" to: "' . $destinationPath . '"', __METHOD__ ); } return true; }
function checkDir($dirName) { if (!file_exists($dirName)) { global $autoMode; if ($autoMode == 'on') { $action = 'y'; } else { $action = getUserInput("Directory '{$dirName}' doesn't exist. Create? [y/n]: "); } if (strpos($action, 'n') === 0) { showError("Unable to continue. Aborting..."); } if (!eZDir::mkdir($dirName, false, true)) { showError("Unable to create dir '{$dirName}'. Aborting..."); } } return true; }
if ($options['export-path']) { $exportPath = $options['export-path']; } else { $exportPath = '/tmp/'; if (isset($_SERVER['TMPDIR'])) { $exportPath = $_SERVER['TMPDIR'] . '/'; } if (isset($_SERVER['USER'])) { $exportPath .= "ez-" . $_SERVER['USER']; } $exportPath .= "/dbupdate-check/"; } if (file_exists($exportPath)) { eZDir::recursiveDelete($exportPath, false); } eZDir::mkdir($exportPath, false, true); } // Figure out the current branch, we do not want to export it $currentBranch = eZPublishSDK::VERSION_MAJOR . '.' . eZPublishSDK::VERSION_MINOR; foreach ($dbTypes as $dbType) { foreach ($branches as $branch) { $basePath = 'update/database/' . $dbType . '/' . $branch; $versionList = $versions[$branch]; $useInfoFiles = false; if (isset($versionList['info_files'])) { $useInfoFiles = $versionList['info_files']; } if (isset($versionList['unstable'])) { $subdir = false; if (isset($versionList['unstable_subdir'])) { $subdir = '/' . $versionList['unstable_subdir'];
static function renameDir( $dir ) { // just rename. Actual removing will be performed by cronjob. // This directory renaming is only performed on the local filesystem // to ensure purging of really old data. If the DB file handler is in // use it will check the modified_subnode field of the tree structure // to determin expiry when the cache-block entry is accessed. if ( file_exists( $dir ) ) { if ( is_dir( $dir ) ) { $expiryCacheDir = eZTemplateCacheFunction::expiryTemplateBlockCacheDir(); $uniqid = md5( uniqid( 'ezpsubtreecache'. getmypid(), true ) ); $expiryCacheDir .= '/' . $uniqid[0] . '/' . $uniqid[1] . '/' . $uniqid[2] . '/' . $uniqid; if ( !file_exists( $expiryCacheDir ) ) { eZDir::mkdir( $expiryCacheDir, false, true ); } eZFile::rename( $dir, $expiryCacheDir, false, eZFile::APPEND_DEBUG_ON_FAILURE ); } else { eZDebug::writeWarning( "$dir should be a directory. Template-block caches for 'subtree_expiry' are not removed.", __METHOD__ ); } } }