/installation/installer/helper.php
PHP | 1469 lines | 1207 code | 99 blank | 163 comment | 72 complexity | 7be68a422d92b41b5271ea8d435d0af8 MD5 | raw file
Possible License(s): LGPL-2.1
- <?php
- /**
- * @version $Id: helper.php 10381 2008-06-01 03:35:53Z pasamio $
- * @package Joomla
- * @subpackage Installation
- * @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
- * @license GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant
- * to the GNU General Public License, and as distributed it includes or
- * is derivative of works licensed under the GNU General Public License or
- * other free or open source software licenses.
- * See COPYRIGHT.php for copyright notices and details.
- */
- // no direct access
- defined('_JEXEC') or die('Restricted access');
- /**
- * @package Joomla
- * @subpackage Installation
- */
- class JInstallationHelper
- {
- /**
- * @return string A guess at the db required
- */
- function detectDB()
- {
- $map = array ('mysql_connect' => 'mysql', 'mysqli_connect' => 'mysqli', 'mssql_connect' => 'mssql');
- foreach ($map as $f => $db)
- {
- if (function_exists($f))
- {
- return $db;
- }
- }
- return 'mysql';
- }
- /**
- * @param array
- * @return string
- */
- function errors2string(& $errors)
- {
- $buffer = '';
- foreach ($errors as $error)
- {
- $buffer .= 'SQL='.$error['msg'].":\n- - - - - - - - - -\n".$error['sql']."\n= = = = = = = = = =\n\n";
- }
- return $buffer;
- }
- /**
- * Creates a new database
- * @param object Database connector
- * @param string Database name
- * @param boolean utf-8 support
- * @param string Selected collation
- * @return boolean success
- */
- function createDatabase(& $db, $DBname, $DButfSupport)
- {
- if ($DButfSupport)
- {
- $sql = "CREATE DATABASE `$DBname` CHARACTER SET `utf8`";
- }
- else
- {
- $sql = "CREATE DATABASE `$DBname`";
- }
- $db->setQuery($sql);
- $db->query();
- $result = $db->getErrorNum();
- if ($result != 0)
- {
- return false;
- }
- return true;
- }
- /**
- * Sets character set of the database to utf-8 with selected collation
- * Used in instances of pre-existing database
- * @param object Database object
- * @param string Database name
- * @param string Selected collation
- * @return boolean success
- */
- function setDBCharset(& $db, $DBname)
- {
- if ($db->hasUTF())
- {
- $sql = "ALTER DATABASE `$DBname` CHARACTER SET `utf8`";
- $db->setQuery($sql);
- $db->query();
- $result = $db->getErrorNum();
- if ($result != 0) {
- return false;
- }
- }
- return true;
- }
- /**
- * Backs up existing tables
- * @param object Database connector
- * @param array An array of errors encountered
- */
- function backupDatabase(& $db, $DBname, $DBPrefix, & $errors)
- {
- // Initialize backup prefix variable
- // TODO: Should this be user-defined?
- $BUPrefix = 'bak_';
- $query = "SHOW TABLES FROM `$DBname`";
- $db->setQuery($query);
- $errors = array ();
- if ($tables = $db->loadResultArray())
- {
- foreach ($tables as $table)
- {
- if (strpos($table, $DBPrefix) === 0)
- {
- $butable = str_replace($DBPrefix, $BUPrefix, $table);
- $query = "DROP TABLE IF EXISTS `$butable`";
- $db->setQuery($query);
- $db->query();
- if ($db->getErrorNum())
- {
- $errors[$db->getQuery()] = $db->getErrorMsg();
- }
- $query = "RENAME TABLE `$table` TO `$butable`";
- $db->setQuery($query);
- $db->query();
- if ($db->getErrorNum())
- {
- $errors[$db->getQuery()] = $db->getErrorMsg();
- }
- }
- }
- }
- return count($errors);
- }
- /**
- * Deletes all database tables
- * @param object Database connector
- * @param array An array of errors encountered
- */
- function deleteDatabase(& $db, $DBname, $DBPrefix, & $errors)
- {
- $query = "SHOW TABLES FROM `$DBname`";
- $db->setQuery($query);
- $errors = array ();
- if ($tables = $db->loadResultArray())
- {
- foreach ($tables as $table)
- {
- if (strpos($table, $DBPrefix) === 0)
- {
- $query = "DROP TABLE IF EXISTS `$table`";
- $db->setQuery($query);
- $db->query();
- if ($db->getErrorNum())
- {
- $errors[$db->getQuery()] = $db->getErrorMsg();
- }
- }
- }
- }
- return count($errors);
- }
- /**
- *
- */
- function populateDatabase(& $db, $sqlfile, & $errors, $nexttask='mainconfig')
- {
- if( !($buffer = file_get_contents($sqlfile)) )
- {
- return -1;
- }
- $queries = JInstallationHelper::splitSql($buffer);
- foreach ($queries as $query)
- {
- $query = trim($query);
- if ($query != '' && $query {0} != '#')
- {
- $db->setQuery($query);
- //echo $query .'<br />';
- $db->query() or die($db->getErrorMsg());
- JInstallationHelper::getDBErrors($errors, $db );
- }
- }
- return count($errors);
- }
- /**
- * @param string
- * @return array
- */
- function splitSql($sql)
- {
- $sql = trim($sql);
- $sql = preg_replace("/\n\#[^\n]*/", '', "\n".$sql);
- $buffer = array ();
- $ret = array ();
- $in_string = false;
- for ($i = 0; $i < strlen($sql) - 1; $i ++) {
- if ($sql[$i] == ";" && !$in_string)
- {
- $ret[] = substr($sql, 0, $i);
- $sql = substr($sql, $i +1);
- $i = 0;
- }
- if ($in_string && ($sql[$i] == $in_string) && $buffer[1] != "\\")
- {
- $in_string = false;
- }
- elseif (!$in_string && ($sql[$i] == '"' || $sql[$i] == "'") && (!isset ($buffer[0]) || $buffer[0] != "\\"))
- {
- $in_string = $sql[$i];
- }
- if (isset ($buffer[1]))
- {
- $buffer[0] = $buffer[1];
- }
- $buffer[1] = $sql[$i];
- }
- if (!empty ($sql))
- {
- $ret[] = $sql;
- }
- return ($ret);
- }
- /**
- * Calculates the file/dir permissions mask
- */
- function getFilePerms($input, $type = 'file')
- {
- $perms = '';
- if (JArrayHelper::getValue($input, $type.'PermsMode', 0))
- {
- $action = ($type == 'dir') ? 'Search' : 'Execute';
- $perms = '0'. (JArrayHelper::getValue($input, $type.'PermsUserRead', 0) * 4 + JArrayHelper::getValue($input, $type.'PermsUserWrite', 0) * 2 + JArrayHelper::getValue($input, $type.'PermsUser'.$action, 0)). (JArrayHelper::getValue($input, $type.'PermsGroupRead', 0) * 4 + JArrayHelper::getValue($input, $type.'PermsGroupWrite', 0) * 2 + JArrayHelper::getValue($input, $type.'PermsGroup'.$action, 0)). (JArrayHelper::getValue($input, $type.'PermsWorldRead', 0) * 4 + JArrayHelper::getValue($input, $type.'PermsWorldWrite', 0) * 2 + JArrayHelper::getValue($input, $type.'PermsWorld'.$action, 0));
- }
- return $perms;
- }
- /**
- * Creates the admin user
- */
- function createAdminUser(& $vars)
- {
- $DBtype = JArrayHelper::getValue($vars, 'DBtype', 'mysql');
- $DBhostname = JArrayHelper::getValue($vars, 'DBhostname', '');
- $DBuserName = JArrayHelper::getValue($vars, 'DBuserName', '');
- $DBpassword = JArrayHelper::getValue($vars, 'DBpassword', '');
- $DBname = JArrayHelper::getValue($vars, 'DBname', '');
- $DBPrefix = JArrayHelper::getValue($vars, 'DBPrefix', '');
- $adminPassword = JArrayHelper::getValue($vars, 'adminPassword', '');
- $adminEmail = JArrayHelper::getValue($vars, 'adminEmail', '');
- jimport('joomla.user.helper');
- // Create random salt/password for the admin user
- $salt = JUserHelper::genRandomPassword(32);
- $crypt = JUserHelper::getCryptedPassword($adminPassword, $salt);
- $cryptpass = $crypt.':'.$salt;
- $vars['adminLogin'] = 'admin';
- $db = & JInstallationHelper::getDBO($DBtype, $DBhostname, $DBuserName, $DBpassword, $DBname, $DBPrefix);
- // create the admin user
- $installdate = date('Y-m-d H:i:s');
- $nullDate = $db->getNullDate();
- $query = "INSERT INTO #__users VALUES (62, 'Administrator', 'admin', ".$db->Quote($adminEmail).", ".$db->Quote($cryptpass).", 'Super Administrator', 0, 1, 25, '$installdate', '$nullDate', '', '')";
- $db->setQuery($query);
- if (!$db->query())
- {
- // is there already and existing admin in migrated data
- if ( $db->getErrorNum() == 1062 )
- {
- $vars['adminLogin'] = JText::_('Admin login in migrated content was kept');
- $vars['adminPassword'] = JText::_('Admin password in migrated content was kept');
- return;
- }
- else
- {
- echo $db->getErrorMsg();
- return;
- }
- }
- // add the ARO (Access Request Object)
- $query = "INSERT INTO #__core_acl_aro VALUES (10,'users','62',0,'Administrator',0)";
- $db->setQuery($query);
- if (!$db->query())
- {
- echo $db->getErrorMsg();
- return;
- }
- // add the map between the ARO and the Group
- $query = "INSERT INTO #__core_acl_groups_aro_map VALUES (25,'',10)";
- $db->setQuery($query);
- if (!$db->query())
- {
- echo $db->getErrorMsg();
- return;
- }
- }
- function & getDBO($driver, $host, $user, $password, $database, $prefix, $select = true)
- {
- static $db;
- if ( ! $db )
- {
- jimport('joomla.database.database');
- $options = array ( 'driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix, 'select' => $select );
- $db = & JDatabase::getInstance( $options );
- }
- return $db;
- }
- /**
- * Check the webserver user permissions for writing files/folders
- *
- * @static
- * @return boolean True if correct permissions exist
- * @since 1.5
- */
- function fsPermissionsCheck()
- {
- if(!is_writable(JPATH_ROOT.DS.'tmp')) {
- return false;
- }
- if(!mkdir(JPATH_ROOT.DS.'tmp'.DS.'test', 0755)) {
- return false;
- }
- if(!copy(JPATH_ROOT.DS.'tmp'.DS.'index.html', JPATH_ROOT.DS.'tmp'.DS.'test'.DS.'index.html')) {
- return false;
- }
- if(!chmod(JPATH_ROOT.DS.'tmp'.DS.'test'.DS.'index.html', 0777)) {
- return false;
- }
- if(!unlink(JPATH_ROOT.DS.'tmp'.DS.'test'.DS.'index.html')) {
- return false;
- }
- if(!rmdir(JPATH_ROOT.DS.'tmp'.DS.'test')) {
- return false;
- }
- return true;
- }
- /**
- * Find the ftp filesystem root for a given user/pass pair
- *
- * @static
- * @param string $user Username of the ftp user to determine root for
- * @param string $pass Password of the ftp user to determine root for
- * @return string Filesystem root for given FTP user
- * @since 1.5
- */
- function findFtpRoot($user, $pass, $host='127.0.0.1', $port='21')
- {
- jimport('joomla.client.ftp');
- $ftpPaths = array();
- // Connect and login to the FTP server (using binary transfer mode to be able to compare files)
- $ftp =& JFTP::getInstance($host, $port, array('type'=>FTP_BINARY));
- if (!$ftp->isConnected()) {
- return JError::raiseError('31', 'NOCONNECT');
- }
- if (!$ftp->login($user, $pass)) {
- return JError::raiseError('31', 'NOLOGIN');
- }
- // Get the FTP CWD, in case it is not the FTP root
- $cwd = $ftp->pwd();
- if ($cwd === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NOPWD');
- }
- $cwd = rtrim($cwd, '/');
- // Get list of folders in the CWD
- $ftpFolders = $ftp->listDetails(null, 'folders');
- if ($ftpFolders === false || count($ftpFolders) == 0) {
- return JError::raiseError('SOME_ERROR_CODE', 'NODIRECTORYLISTING');
- }
- for ($i=0, $n=count($ftpFolders); $i<$n; $i++) {
- $ftpFolders[$i] = $ftpFolders[$i]['name'];
- }
- // Check if Joomla! is installed at the FTP CWD
- $dirList = array('administrator', 'components', 'installation', 'language', 'libraries', 'plugins');
- if (count(array_diff($dirList, $ftpFolders)) == 0) {
- $ftpPaths[] = $cwd.'/';
- }
- // Process the list: cycle through all parts of JPATH_SITE, beginning from the end
- $parts = explode(DS, JPATH_SITE);
- $tmpPath = '';
- for ($i=count($parts)-1; $i>=0; $i--)
- {
- $tmpPath = '/'.$parts[$i].$tmpPath;
- if (in_array($parts[$i], $ftpFolders)) {
- $ftpPaths[] = $cwd.$tmpPath;
- }
- }
- // Check all possible paths for the real Joomla! installation
- $checkValue = file_get_contents(JPATH_LIBRARIES.DS.'joomla'.DS.'version.php');
- foreach ($ftpPaths as $tmpPath)
- {
- $filePath = rtrim($tmpPath, '/').'/libraries/joomla/version.php';
- $buffer = null;
- @$ftp->read($filePath, $buffer);
- if ($buffer == $checkValue)
- {
- $ftpPath = $tmpPath;
- break;
- }
- }
- // Close the FTP connection
- $ftp->quit();
- // Return the FTP root path
- if (isset($ftpPath)) {
- return $ftpPath;
- } else {
- return JError::raiseError('SOME_ERROR_CODE', 'Unable to autodetect the FTP root folder');
- }
- }
- /**
- * Verify the FTP configuration values are valid
- *
- * @static
- * @param string $user Username of the ftp user to determine root for
- * @param string $pass Password of the ftp user to determine root for
- * @return mixed Boolean true on success or JError object on fail
- * @since 1.5
- */
- function FTPVerify($user, $pass, $root, $host='127.0.0.1', $port='21')
- {
- jimport('joomla.client.ftp');
- $ftp = & JFTP::getInstance($host, $port);
- // Since the root path will be trimmed when it gets saved to configuration.php, we want to test with the same value as well
- $root = rtrim($root, '/');
- // Verify connection
- if (!$ftp->isConnected()) {
- return JError::raiseWarning('31', 'NOCONNECT');
- }
- // Verify username and password
- if (!$ftp->login($user, $pass)) {
- return JError::raiseWarning('31', 'NOLOGIN');
- }
- // Verify PWD function
- if ($ftp->pwd() === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NOPWD');
- }
- // Verify root path exists
- if (!$ftp->chdir($root)) {
- return JError::raiseWarning('31', 'NOROOT');
- }
- // Verify NLST function
- if (($rootList = $ftp->listNames()) === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NONLST');
- }
- // Verify LIST function
- if ($ftp->listDetails() === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NOLIST');
- }
- // Verify SYST function
- if ($ftp->syst() === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NOSYST');
- }
- // Verify valid root path, part one
- $checkList = array('CHANGELOG.php', 'COPYRIGHT.php', 'index.php', 'INSTALL.php', 'LICENSE.php');
- if (count(array_diff($checkList, $rootList))) {
- return JError::raiseWarning('31', 'INVALIDROOT');
- }
- // Verify RETR function
- $buffer = null;
- if ($ftp->read($root.'/libraries/joomla/version.php', $buffer) === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NORETR');
- }
- // Verify valid root path, part two
- $checkValue = file_get_contents(JPATH_LIBRARIES.DS.'joomla'.DS.'version.php');
- if ($buffer !== $checkValue) {
- return JError::raiseWarning('31', 'INVALIDROOT');
- }
- // Verify STOR function
- if ($ftp->create($root.'/ftp_testfile') === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NOSTOR');
- }
- // Verify DELE function
- if ($ftp->delete($root.'/ftp_testfile') === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NODELE');
- }
- // Verify MKD function
- if ($ftp->mkdir($root.'/ftp_testdir') === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NOMKD');
- }
- // Verify RMD function
- if ($ftp->delete($root.'/ftp_testdir') === false) {
- return JError::raiseError('SOME_ERROR_CODE', 'NORMD');
- }
- $ftp->quit();
- return true;
- }
- /**
- * Set default folder permissions
- *
- * @param string $path The full file path
- * @param string $buffer The buffer to write
- * @return boolean True on success
- * @since 1.5
- */
- function setDirPerms($dir, &$srv)
- {
- jimport('joomla.filesystem.path');
- /*
- * Initialize variables
- */
- $ftpFlag = false;
- $ftpRoot = $srv['ftpRoot'];
- /*
- * First we need to determine if the path is chmodable
- */
- if (!JPath::canChmod(JPath::clean(JPATH_SITE.DS.$dir)))
- {
- $ftpFlag = true;
- }
- // Do NOT use ftp if it is not enabled
- if (!$srv['ftpEnable'])
- {
- $ftpFlag = false;
- }
- if ($ftpFlag == true)
- {
- // Connect the FTP client
- jimport('joomla.client.ftp');
- $ftp = & JFTP::getInstance($srv['ftpHost'], $srv['ftpPort']);
- $ftp->login($srv['ftpUser'],$srv['ftpPassword']);
- //Translate path for the FTP account
- $path = JPath::clean($ftpRoot."/".$dir);
- /*
- * chmod using ftp
- */
- if (!$ftp->chmod($path, '0755'))
- {
- $ret = false;
- }
- $ftp->quit();
- $ret = true;
- }
- else
- {
- $path = JPath::clean(JPATH_SITE.DS.$dir);
- if (!@ chmod($path, octdec('0755')))
- {
- $ret = false;
- }
- else
- {
- $ret = true;
- }
- }
- return $ret;
- }
- function findMigration( &$args ) {
- print_r($args); jexit();
- }
- /**
- * Uploads a sql script and executes it. Script can be text file or zip/gz packed
- *
- * @static
- * @param array The installation variables
- * @param boolean true if the script is a migration script
- * @return string Success or error messages
- * @since 1.5
- */
- function uploadSql( &$args, $migration = false, $preconverted = false )
- {
- global $mainframe;
- $archive = '';
- $script = '';
- /*
- * Check for iconv
- */
- if ($migration && !$preconverted && !function_exists( 'iconv' ) ) {
- return JText::_( 'WARNICONV' );
- }
- /*
- * Get the uploaded file information
- */
- if( $migration )
- {
- $sqlFile = JRequest::getVar('migrationFile', '', 'files', 'array');
- }
- else
- {
- $sqlFile = JRequest::getVar('sqlFile', '', 'files', 'array');
- }
- /*
- * Make sure that file uploads are enabled in php
- */
- if (!(bool) ini_get('file_uploads'))
- {
- return JText::_('WARNINSTALLFILE');
- }
- /*
- * Make sure that zlib is loaded so that the package can be unpacked
- */
- if (!extension_loaded('zlib'))
- {
- return JText::_('WARNINSTALLZLIB');
- }
- /*
- * If there is no uploaded file, we have a problem...
- */
- if (!is_array($sqlFile) || $sqlFile['size'] < 1)
- {
- return JText::_('WARNNOFILE');
- }
- /*
- * Move uploaded file
- */
- // Set permissions for tmp dir
- JInstallationHelper::_chmod(JPATH_SITE.DS.'tmp', 0777);
- jimport('joomla.filesystem.file');
- $uploaded = JFile::upload($sqlFile['tmp_name'], JPATH_SITE.DS.'tmp'.DS.$sqlFile['name']);
- if(!$uploaded) {
- return JText::_('WARNUPLOADFAILURE');
- }
- if( !eregi('.sql$', $sqlFile['name']) )
- {
- $archive = JPATH_SITE.DS.'tmp'.DS.$sqlFile['name'];
- }
- else
- {
- $script = JPATH_SITE.DS.'tmp'.DS.$sqlFile['name'];
- }
- // unpack archived sql files
- if ($archive )
- {
- $package = JInstallationHelper::unpack( $archive, $args );
- if ( $package === false )
- {
- return JText::_('WARNUNPACK');
- }
- $script = $package['folder'].DS.$package['script'];
- }
- $db = & JInstallationHelper::getDBO($args['DBtype'], $args['DBhostname'], $args['DBuserName'], $args['DBpassword'], $args['DBname'], $args['DBPrefix']);
- /*
- * If migration perform manipulations on script file before population
- */
- if ( $migration )
- {
- $script = JInstallationHelper::preMigrate($script, $args, $db);
- if ( $script == false )
- {
- return JText::_( 'Script operations failed' );
- }
- }
- $errors = null;
- $msg = '';
- $result = JInstallationHelper::populateDatabase($db, $script, $errors);
- /*
- * If migration, perform post population manipulations (menu table construction)
- */
- $migErrors = null;
- if ( $migration )
- {
- $migResult = JInstallationHelper::postMigrate( $db, $migErrors, $args );
- if ( $migResult != 0 )
- {
- /*
- * Merge populate and migrate processing errors
- */
- if( $result == 0 )
- {
- $result = $migResult;
- $errors = $migErrors;
- }
- else
- {
- $result += $migResult;
- $errors = array_merge( $errors, $migErrors );
- }
- }
- }
- /*
- * prepare sql error messages if returned from populate and migrate
- */
- if (!is_null($errors))
- {
- foreach($errors as $error)
- {
- $msg .= stripslashes( $error['msg'] );
- $msg .= chr(13)."-------------".chr(13);
- $txt = '<textarea cols="40" rows="4" name="instDefault" readonly="readonly" >'.JText::_("Database Errors Reported").chr(13).$msg.'</textarea>';
- }
- }
- else
- {
- // consider other possible errors from populate
- $msg = $result == 0 ? JText::_('SQL script installed successfully') : JText::_('Error installing SQL script') ;
- $txt = '<input size="50" value="'.$msg.'" readonly="readonly" />';
- }
- /*
- * Clean up
- */
- if ($archive)
- {
- JFile::delete( $archive );
- JFolder::delete( $package['folder'] );
- }
- else
- {
- JFile::delete( $script );
- }
- return $txt;
- }
- /**
- * Unpacks a compressed script file either as zip or gz/ Assumes single file in archive
- *
- * @static
- * @param string $p_filename The uploaded package filename or install directory
- * @return unpacked filename on success, False on error
- * @since 1.5
- */
- function unpack($p_filename, &$vars) {
- /*
- * Initialize variables
- */
- // Path to the archive
- $archivename = $p_filename;
- // Temporary folder to extract the archive into
- $tmpdir = uniqid('install_');
- // Clean the paths to use for archive extraction
- $extractdir = JPath::clean(dirname($p_filename).DS.$tmpdir);
- $archivename = JPath::clean($archivename);
- $result = JArchive::extract( $archivename, $extractdir);
- if ( $result === false ) {
- return false;
- }
- /*
- * return the file found in the extract folder and also folder name
- */
- if ($handle = opendir( $extractdir ))
- {
- while (false !== ($file = readdir($handle)))
- {
- if ($file != "." && $file != "..")
- {
- $script = $file;
- continue;
- }
- }
- closedir($handle);
- }
- $retval['script'] = $script;
- $retval['folder'] = $extractdir;
- return $retval;
- }
- function return_bytes($val) {
- $val = trim($val);
- $last = strtolower($val{strlen($val)-1});
- switch($last) {
- // The 'G' modifier is available since PHP 5.1.0
- case 'g':
- $val *= 1024;
- case 'm':
- $val *= 1024;
- case 'k':
- $val *= 1024;
- }
- return $val;
- }
- function replaceBuffer(&$buffer, $oldPrefix, $newPrefix, $srcEncoding) {
- $buffer = str_replace( $oldPrefix, $newPrefix, $buffer );
- /*
- * give temp name to menu and modules tables
- */
- $buffer = str_replace ( $newPrefix.'modules', $newPrefix.'modules_migration', $buffer );
- $buffer = str_replace ( $newPrefix.'menu', $newPrefix.'menu_migration', $buffer );
- /*
- * rename two aro_acl... field names
- */
- $buffer = preg_replace ( '/group_id(?!.{15,25}aro_id)/', 'id', $buffer );
- $buffer = preg_replace ( '/aro_id(?=.{1,6}section_value)/', 'id', $buffer );
- /*
- * convert to utf-8
- */
- if(function_exists('iconv')) {
- $buffer = iconv( $srcEncoding, 'utf-8//TRANSLIT', $buffer );
- }
- }
- function appendFile(&$buffer, $filename) {
- $fh = fopen($filename, 'a');
- fwrite($fh, $buffer);
- fclose($fh);
- }
- /**
- * Performs pre-populate conversions on a migration script
- *
- * @static
- * @param string $scriptName The uploaded / unpacked script file
- * $param array $args The installation varibables
- * @return converted filename on success, False on error
- * @since 1.5
- */
- function preMigrate( $scriptName, &$args, $db )
- {
- $maxread = 0;
- jimport('joomla.filesystem.file');
- if(function_exists('memory_get_usage')) {
- $memlimit = JInstallationHelper::return_bytes(ini_get('memory_limit'));
- $maxread = $memlimit / 16; // Read only a eigth of our max amount of memory, we could be up to a lot by now
- // By default this pegs us at 0.5MB
- }
- $buffer = '';
- $newPrefix = $args['DBPrefix'];
- /*
- * search and replace table prefixes
- */
- $oldPrefix = trim( $args['oldPrefix']);
- $oldPrefix = rtrim( $oldPrefix, '_' ) . '_';
- $srcEncoding = $args['srcEncoding'];
- if(!is_file($scriptName)) return false; // not a file?
- $newFile = dirname( $scriptName ).DS.'converted.sql';
- $tfilesize = filesize($scriptName);
- if($maxread > 0 && $tfilesize > 0 && $maxread < $tfilesize)
- {
- $parts = ceil($tfilesize / $maxread);
- file_put_contents( $newFile, '' ); // cleanse the file first
- for($i = 0; $i < $parts; $i++) {
- $buffer = JFile::read($scriptName, false, $maxread, $maxread,($i * $maxread));
- // Lets try and read a portion of the file
- JInstallationHelper::replaceBuffer($buffer, $oldPrefix, $newPrefix, $srcEncoding);
- JInstallationHelper::appendFile($buffer, $newFile);
- unset($buffer);
- }
- JFile::delete( $scriptName );
- } else {
- /*
- * read script file into buffer
- */
- if(is_file($scriptName)) {
- $buffer = file_get_contents( $scriptName );
- } else return false;
- if( $buffer == false ) return false;
- JInstallationHelper::replaceBuffer($buffer, $oldPrefix, $newPrefix, $srcEncoding);
- /*
- * write to file
- */
- //$newFile = dirname( $scriptName ).DS.'converted.sql';
- $ret = file_put_contents( $newFile, $buffer );
- unset($buffer); // Release the memory used by the buffer
- jimport('joomla.filesystem.file');
- JFile::delete( $scriptName );
- }
- /*
- * Create two empty temporary tables
- */
- $query = 'DROP TABLE IF EXISTS '.$newPrefix.'modules_migration';
- $db->setQuery( $query );
- $db->query();
- $query = 'DROP TABLE IF EXISTS '.$newPrefix.'menu_migration';
- $db->setQuery( $query );
- $db->query();
- $query = 'CREATE TABLE '.$newPrefix.'modules_migration SELECT * FROM '.$newPrefix.'modules WHERE 0';
- $db->setQuery( $query );
- $db->query();
- $query = 'CREATE TABLE '.$newPrefix.'modules_migration_menu SELECT * FROM '.$newPrefix.'modules_menu WHERE 0';
- $db->setQuery( $query );
- $db->Query();
- $query = 'CREATE TABLE '.$newPrefix.'menu_migration SELECT * FROM '.$newPrefix.'menu WHERE 0';
- $db->setQuery( $query );
- $db->query();
- return $newFile;
- }
- /**
- * Performs post-populate conversions after importing a migration script
- * These include constructing an appropriate menu table for core content items
- * and adding core modules from old site to the modules table
- *
- * @static
- * @param JDatabase
- * @param array errors (by ref)
- * @return error count
- * @since 1.5
- */
- function postMigrate( $db, & $errors, & $args ) {
- $newPrefix = $args['DBPrefix'];
- /*
- * Check to see if migration is from 4.5.1
- */
- $query = 'SELECT id FROM '.$newPrefix.'users WHERE usertype = "superadministrator"';
- $db->setQuery($query);
- $rows = $db->loadRowList( );
- JInstallationHelper::getDBErrors($errors, $db );
- /*
- * if it is, then fill usertype field with correct values from aro_group
- */
- if ( count($rows) > 0 )
- {
- $query = 'UPDATE '.$newPrefix.'users AS u, '.$newPrefix.'core_acl_aro_groups AS g' .
- ' SET u.usertype = g.value' .
- ' WHERE u.gid = g.id';
- $db->setQuery($query);
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- }
- /*
- * Construct the menu table based on old table references to core items
- */
- // Component - change all
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `type` = "component" WHERE `type` = "components";';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // Component Item Link
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = SUBSTRING(link, 1, LOCATE("&Itemid=", link) -1), `type` = "component" WHERE `type` = "component_item_link";';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // get com_contact id
- $query = 'SELECT `id` FROM `'.$newPrefix.'components` WHERE `option`="com_contact" AND `parent` = 0';
- $db->setQuery( $query );
- JInstallationHelper::getDBErrors($errors, $db );
- $compId = $db->loadResult();
- // contact category table
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("catid=", link), 0, "view=category&"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "contact_category_table"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // contact item link
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=view", link), 20, "view=contact&id"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "contact_item_link"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // fix up standalone contact
- $query = 'UPDATE `'. $newPrefix.'menu_migration` SET `link` = "index.php?option=com_contact&view=category" WHERE `link` = "index.php?option=com_contact"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // get com_content id
- $query = 'SELECT `id` FROM `'.$newPrefix.'components` WHERE `option`="com_content" AND `parent` = 0';
- $db->setQuery( $query );
- $compId = $db->loadResult();
- JInstallationHelper::getDBErrors($errors, $db );
- // front page
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = "index.php?option=com_content&view=frontpage", `type` = "component", `componentid` = '.$compId.' WHERE `link` LIKE "%option=com_frontpage%"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // content archive category or section
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = "index.php?option=com_content&view=archive", `type` = "component", `componentid` = '.$compId.' WHERE (`type` = "content_archive_category" OR `type` = "content_archive_section")';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // content blog category
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=blogcat", link), 17, "view=category&layout=blog"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "content_blog_category"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // content blog section
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=blogsec", link), 16, "view=section&layout=blog"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "content_blog_section";';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // content category
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=", link), LOCATE("&id=", link) - LOCATE("task=", link), "view=category"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "content_category"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // content item link and typed content
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=", link), 9, "view=article"), `type` = "component", `componentid` = '.$compId.' WHERE (`type` = "content_item_link" OR `type` = "content_typed")';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // content section
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=", link), 12, "view=section"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "content_section"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // get com_newsfeeds id
- $query = 'SELECT `id` FROM `'.$newPrefix.'components` WHERE `option`="com_newsfeeds" AND `parent` = 0';
- $db->setQuery( $query );
- $compId = $db->loadResult();
- JInstallationHelper::getDBErrors($errors, $db );
- // newsfeed categories
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = CONCAT(link, "&view=categories"), `componentid` = '.$compId.' WHERE `type` = "component" AND link LIKE "%option=com_newsfeeds%"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // newsfeed category table
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("catid=", link), 5, "view=category&catid"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "newsfeed_category_table"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // newsfeed link
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=", link), 9, "view=newsfeed"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "newsfeed_link"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // user checkin items
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("CheckIn", link), 7, "checkin") WHERE `type` = "url" AND link LIKE "%option=com_user&task=CheckIn%"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // user edit details
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("UserDetails", link), 11, "edit") WHERE `type` = "url" AND link LIKE "%option=com_user&task=UserDetails%"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // get com_weblinks id
- $query = 'SELECT `id` FROM `'.$newPrefix.'components` WHERE `option`="com_weblinks" AND `parent` = 0';
- $db->setQuery( $query );
- $compId = $db->loadResult();
- JInstallationHelper::getDBErrors($errors, $db );
- // weblinks categories
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = CONCAT(link, "&view=categories"), `componentid` = '.$compId.' WHERE `type` = "component" AND link LIKE "%option=com_weblinks%"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // weblinks category table
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("catid=", link), 5, "view=category&catid"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "weblink_category_table"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // weblinks submit new item
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = INSERT(link, LOCATE("task=", link), 8, "view=weblink&layout=form") WHERE `type` = "url" AND link LIKE "%option=com_weblinks%"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // get com_wrapper id
- $query = 'SELECT `id` FROM `'.$newPrefix.'components` WHERE `option`="com_wrapper" AND `parent` = 0';
- $db->setQuery( $query );
- JInstallationHelper::getDBErrors($errors, $db );
- $compId = $db->loadResult();
- // wrapper
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = CONCAT(link, "&view=wrapper"), `type` = "component", `componentid` = '.$compId.' WHERE `type` = "wrapper"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // set default to lowest ordering published on mainmenu
- $query = 'SELECT MIN( `ordering` ) FROM `'.$newPrefix.'menu_migration` WHERE `published` = 1 AND `parent` = 0 AND `menutype` = "mainmenu"';
- $db->setQuery( $query );
- $minorder = $db->loadResult();
- if(!$minorder) $minorder = 0;
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'SELECT `id` FROM `'.$newPrefix.'menu_migration` WHERE `published` = 1 AND `parent` = 0 AND `menutype` = "mainmenu" AND `ordering` = '.$minorder;
- $db->setQuery( $query );
- $menuitemid = $db->loadResult();
- JInstallationHelper::getDBErrors($errors, $db );
- if(!$menuitemid) $menuitemid = 1;
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `home` = 1 WHERE `id` = '.$menuitemid;
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // login and log out; component id and link update
- $query = 'SELECT id FROM `'.$newPrefix.'components` WHERE link like "option=com_user"';
- $db->setQuery($query);
- $componentid = $db->loadResult();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET componentid = '.$componentid .' WHERE link = "index.php?option=com_login"';
- $db->setQuery($query);
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET link = "index.php?option=com_user&view=login" WHERE link = "index.php?option=com_login"';
- $db->setQuery($query);
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // Search - Component ID Update
- $query = 'SELECT id FROM `'.$newPrefix.'components` WHERE link like "option=com_search"';
- $db->setQuery($query);
- $componentid = $db->loadResult();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET componentid = '.$componentid .' WHERE link like "index.php?option=com_search%"';
- $db->setQuery($query);
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- // tidy up urls with Itemids
- $query = 'UPDATE `'.$newPrefix.'menu_migration` SET `link` = SUBSTRING(`link`,1,LOCATE("&Itemid",`link`)-1) WHERE `type` = "url" AND `link` LIKE "%&Itemid=%"';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'SELECT DISTINCT `option` FROM '.$newPrefix.'components WHERE `option` != ""';
- $db->setQuery( $query );
- $lookup = $db->loadResultArray();
- JInstallationHelper::getDBErrors($errors, $db );
- $lookup[] = 'com_user&';
- // prepare to copy across
- $query = 'SELECT * FROM '.$newPrefix.'menu_migration';
- $db->setQuery( $query );
- $oldMenuItems = $db->loadObjectList();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'DELETE FROM '.$newPrefix.'menu WHERE 1';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'SELECT * FROM '.$newPrefix.'menu';
- $db->setQuery( $query );
- $newMenuItems = $db->loadObjectList();
- JInstallationHelper::getDBErrors($errors, $db );
- // filter out links to 3pd components
- foreach( $oldMenuItems as $item )
- {
- if ( $item->type == 'url' && !strpos( $item->link, 'com_') )
- {
- $newMenuItems[] = $item;
- }
- else if ( $item->type == 'url' && JInstallationHelper::isValidItem( $item->link, $lookup ) )
- {
- $newMenuItems[] = $item;
- }
- else if ( $item->type == 'component' ) //&& JInstallationHelper::isValidItem( $item->link, $lookup ))
- {
- // unpublish components that don't exist yet
- if(!JInstallationHelper::isValidItem( $item->link, $lookup )) $item->published = 0;
- $newMenuItems[] = $item;
- }
- }
- // build the menu table
- foreach ( $newMenuItems as $item )
- {
- $db->insertObject( $newPrefix.'menu', $item );
- JInstallationHelper::getDBErrors($errors, $db );
- }
- // fix possible orphaned sub menu items
- $query = 'UPDATE `'.$newPrefix.'menu` AS c LEFT OUTER JOIN `'.$newPrefix.'menu` AS p ON c.parent = p.id SET c.parent = 0 WHERE c.parent <> 0 AND p.id IS NULL';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- /*
- * Construct the menu_type table base on new menu table types
- */
- $query = 'SELECT DISTINCT `menutype` FROM '.$newPrefix.'menu WHERE 1';
- $db->setQuery( $query );
- JInstallationHelper::getDBErrors($errors, $db );
- $menuTypes = $db->loadResultArray();
- $query = 'TRUNCATE TABLE '.$newPrefix.'menu_types';
- $db->setQuery($query);
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- foreach( $menuTypes as $mType )
- {
- $query = 'INSERT INTO '.$newPrefix.'menu_types ( menutype, title ) VALUES ("'.$mType.'", "'.$mType.'");';
- $db->setQuery($query);
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- }
- /*
- * Add core client modules from old site to modules table as unpublished
- */
- $query = 'SELECT id FROM '.$newPrefix.'modules_migration WHERE client_id = 0 ';
- $db->setQuery( $query );
- $lookup = $db->loadResultArray();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'SELECT MAX(id) FROM '.$newPrefix.'modules ';
- $db->setQuery( $query );
- $nextId = $db->loadResult();
- JInstallationHelper::getDBErrors($errors, $db );
- jimport('joomla.filesystem.folder');
- jimport('joomla.filesystem.file');
- foreach( $lookup as $module )
- {
- $qry = 'SELECT * FROM '.$newPrefix.'modules_migration WHERE id = "'.$module.'" AND client_id = 0';
- $db->setQuery( $qry );
- if ( $row = $db->loadObject() ) {
- if($row->module == '') { $row->module = 'mod_custom'; }
- if(JFolder::exists(JPATH_SITE.DS.'modules'.DS.$row->module)) {
- $nextId++;
- $oldid = $row->id;
- $row->id = $nextId;
- $row->published = 0;
- if($db->insertObject( $newPrefix.'modules', $row )) {
- // Grab the old modules menu links and put them in too!
- $qry = 'SELECT * FROM '. $newPrefix .'modules_migration_menu WHERE moduleid = '. $oldid;
- $db->setQuery($qry);
- $entries = $db->loadObjectList();
- JInstallationHelper::getDBErrors($errors, $db );
- foreach($entries as $entry) {
- $entry->moduleid = $nextId;
- $db->insertObject($newPrefix.'modules_menu', $entry);
- JInstallationHelper::getDBErrors($errors, $db );
- }
- } else JInstallationHelper::getDBErrors($errors, $db );
- } // else the module doesn't exist?
- } else JInstallationHelper::getDBErrors($errors, $db );
- }
- // Put in breadcrumb module as per sample data
- $query = "INSERT INTO `".$newPrefix ."modules` VALUES (0, 'Breadcrumbs', '', 1, 'breadcrumb', 0, '0000-00-00 00:00:00', 1, 'mod_breadcrumbs', 0, 0, 1, 'moduleclass_sfx=\ncache=0\nshowHome=1\nhomeText=Home\nshowComponent=1\nseparator=\n\n', 1, 0, '');";
- $db->setQuery($query);
- $db->Query();
- JInstallationHelper::getDBErrors($errors, $db);
- /*
- * Clean up
- */
- $query = 'DROP TABLE IF EXISTS '.$newPrefix.'modules_migration';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'DROP TABLE IF EXISTS '.$newPrefix.'modules_migration_menu';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- $query = 'DROP TABLE IF EXISTS '.$newPrefix.'menu_migration';
- $db->setQuery( $query );
- $db->query();
- JInstallationHelper::getDBErrors($errors, $db );
- return count( $errors );
- }
- function isValidItem ( $link, $lookup )
- {
- foreach( $lookup as $component )
- {
- if ( strpos( $link, $component ) != false )
- {
- return true;
- }
- }
- return false;
- }
- function getDBErrors( & $errors, $db )
- {
- if ($db->getErrorNum() > 0)
- {
- $errors[] = array('msg' => $db->getErrorMsg(), 'sql' => $db->_sql);
- }
- }
- /**
- * Inserts ftp variables to mainframe registry
- * Needed to activate ftp layer for file operations in safe mode
- *
- * @param array The post values
- */
- function setFTPCfg( $vars )
- {
- global $mainframe;
- $arr = array();
- $arr['ftp_enable'] = $vars['ftpEnable'];
- $arr['ftp_user'] = $vars['ftpUser'];
- $arr['ftp_pass'] = $vars['ftpPassword'];
- $arr['ftp_root'] = $vars['ftpRoot'];
- $arr['ftp_host'] = $vars['ftpHost'];
- $arr['ftp_port'] = $vars['ftpPort'];
- $mainframe->setCfg( $arr, 'config' );
- }
- function _chmod( $path, $mode )
- {
- global $mainframe;
- $ret = false;
- // Initialize variables
- $ftpFlag = true;
- $ftpRoot = $mainframe->getCfg('ftp_root');
- // Do NOT use ftp if it is not enabled
- if ($mainframe->getCfg('ftp_enable') != 1) {
- $ftpFlag = false;
- }
- if ($ftpFlag == true)
- {
- // Connect the FTP client
- jimport('joomla.client.ftp');
- $ftp = & JFTP::getInstance($mainframe->getCfg('ftp_host'), $mainframe->getCfg('ftp_port'));
- $ftp->login($mainframe->getCfg('ftp_user'), $mainframe->getCfg('ftp_pass'));
- //Translate the destination path for the FTP account
- $path = JPath::clean(str_replace(JPATH_SITE, $ftpRoot, $path), '/');
- // do the ftp chmod
- if (!$ftp->chmod($path, $mode))
- {
- // FTP connector throws an error
- return false;
- }
- $ftp->quit();
- $ret = true;
- }
- else
- {
- $ret = @ chmod($path, $mode);
- }
- return $ret;
- }
- /** Borrowed from http://au.php.net/manual/en/ini.core.php comments */
- function let_to_num($v){ //This function transforms the php.ini notation for numbers (like '2M') to an integer (2*1024*1024 in this case)
- $l = substr($v, -1);
- $ret = substr($v, 0, -1);
- switch(strtoupper($l)){
- case 'P':
- $ret *= 1024;
- case 'T':
- $ret *= 1024;
- case 'G':
- $ret *= 1024;
- case 'M':
- $ret *= 1024;
- case 'K':
- $ret *= 1024;
- break;
- }
- return $ret;
- }
- }
- ?>