/modules/UpgradeWizard/uw_utils.php
PHP | 4475 lines | 3282 code | 539 blank | 654 comment | 836 complexity | 9837434d4d6640181bbc0908b18d8abc MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
Large files files are truncated, but you can click here to view the full file
- <?php
- if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
- /*********************************************************************************
- * SugarCRM Community Edition is a customer relationship management program developed by
- * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Affero General Public License version 3 as published by the
- * Free Software Foundation with the addition of the following permission added
- * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
- * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
- * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Affero General Public License along with
- * this program; if not, see http://www.gnu.org/licenses or write to the Free
- * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- *
- * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
- * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
- *
- * The interactive user interfaces in modified source and object code versions
- * of this program must display Appropriate Legal Notices, as required under
- * Section 5 of the GNU Affero General Public License version 3.
- *
- * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
- * these Appropriate Legal Notices must retain the display of the "Powered by
- * SugarCRM" logo. If the display of the logo is not reasonably feasible for
- * technical reasons, the Appropriate Legal Notices must display the words
- * "Powered by SugarCRM".
- ********************************************************************************/
- /**
- * Helper function for upgrade - get path from upload:// name
- * @param string $path
- * return string
- */
- function getUploadRelativeName($path)
- {
- if(class_exists('UploadFile')) {
- return UploadFile::realpath($path);
- }
- if(substr($path, 0, 9) == "upload://") {
- $path = rtrim($GLOBALS['sugar_config']['upload_dir'], "/\\")."/".substr($path, 9);
- }
- return $path;
- }
- /**
- * Backs-up files that are targeted for patch/upgrade to a restore directory
- * @param string rest_dir Full path to the directory containing the original, replaced files.
- * @param string install_file Full path to the uploaded patch/upgrade zip file
- * @param string unzip_dir Full path to the unzipped files in a temporary directory
- * @param string zip_from_dir Name of directory that the unzipped files containing the actuall replacement files
- * @param array errors Collection of errors to be displayed at end of process
- * @param string path Optional full path to the log file.
- * @return array errors
- */
- function commitMakeBackupFiles($rest_dir, $install_file, $unzip_dir, $zip_from_dir, $errors, $path='') {
- global $mod_strings;
- // create restore file directory
- sugar_mkdir($rest_dir, 0775, true);
- if(file_exists($rest_dir) && is_dir($rest_dir)){
- logThis('backing up files to be overwritten...', $path);
- $newFiles = findAllFiles(clean_path($unzip_dir . '/' . $zip_from_dir), array());
- // keep this around for canceling
- $_SESSION['uw_restore_dir'] = getUploadRelativeName($rest_dir);
- foreach ($newFiles as $file) {
- if (strpos($file, 'md5'))
- continue;
- // get name of current file to place in restore directory
- $cleanFile = str_replace(clean_path($unzip_dir . '/' . $zip_from_dir), '', $file);
- // make sure the directory exists
- $cleanDir = $rest_dir . '/' . dirname($cleanFile);
- sugar_mkdir($cleanDir, 0775, true);
- $oldFile = clean_path(getcwd() . '/' . $cleanFile);
- // only copy restore files for replacements - ignore new files from patch
- if (is_file($oldFile)) {
- if (is_writable($rest_dir)) {
- logThis('Backing up file: ' . $oldFile, $path);
- if (!copy($oldFile, $rest_dir . '/' . $cleanFile)) {
- logThis('*** ERROR: could not backup file: ' . $oldFile, $path);
- $errors[] = "{$mod_strings['LBL_UW_BACKUP']}::{$mod_strings['ERR_UW_FILE_NOT_COPIED']}: {$oldFile}";
- } else {
- $backupFilesExist = true;
- }
- } else {
- logThis('*** ERROR: directory not writable: ' . $rest_dir, $path);
- $errors[] = "{$mod_strings['LBL_UW_BACKUP']}::{$mod_strings['ERR_UW_DIR_NOT_WRITABLE']}: {$oldFile}";
- }
- }
- }
- }
- logThis('file backup done.', $path);
- return $errors;
- }
- /**
- * Copies files from the unzipped patch to the destination.
- * @param string unzip_dir Full path to the temporary directory created during unzip operation.
- * @param string zip_from_dir Name of folder containing the unzipped files; usually the name of the Patch without the
- * extension.
- * @param string path Optional full path to alternate upgradeWizard log file.
- * @return array Two element array containing to $copiedFiles and $skippedFiles.
- */
- function commitCopyNewFiles($unzip_dir, $zip_from_dir, $path='') {
- logThis('Starting file copy process...', $path);
- global $sugar_version;
- $backwardModules='';
- if(substr($sugar_version,0,1) >= 5){
- $modules = getAllModules();
- $backwardModules = array();
- foreach($modules as $mod){
- if(is_dir(clean_path(getcwd().'/modules/'.$mod.'/.500'))){
- $files = array();
- $files= findAllFiles(clean_path(getcwd().'/modules/'.$mod.'/.500'),$files);
- if(sizeof($files) >0){
- //backward compatibility is on
- $backwardModules[] = $mod;
- }
- }
- }
- }
- $newFiles = findAllFiles(clean_path($unzip_dir . '/' . $zip_from_dir), array());
- $zipPath = clean_path($unzip_dir . '/' . $zip_from_dir);
- // handle special do-not-overwrite conditions
- $doNotOverwrite = array();
- $doNotOverwrite[] = '__stub';
- if(isset($_REQUEST['overwrite_files_serial'])) {
- $doNotOverwrite = explode('::', $_REQUEST['overwrite_files_serial']);
- }
- $copiedFiles = array();
- $skippedFiles = array();
- foreach($newFiles as $file) {
- $cleanFile = str_replace($zipPath, '', $file);
- $srcFile = $zipPath . $cleanFile;
- $targetFile = clean_path(getcwd() . '/' . $cleanFile);
- if($backwardModules != null && sizeof($backwardModules) >0){
- foreach($backwardModules as $mod){
- $splitPath = explode('/',trim($cleanFile));
- if('modules' == trim($splitPath[1]) && $mod == trim($splitPath[2])){
- $cleanFile = str_replace('/modules/'.$mod, '/modules/'.$mod.'/.500', $cleanFile);
- $targetFile = clean_path(getcwd() . '/' . $cleanFile);
- }
- }
- }
- if(!is_dir(dirname($targetFile))) {
- mkdir_recursive(dirname($targetFile)); // make sure the directory exists
- }
- if((!file_exists($targetFile)) || /* brand new file */
- (!in_array($targetFile, $doNotOverwrite)) /* manual diff file */
- ) {
- // handle sugar_version.php
- if(strpos($targetFile, 'sugar_version.php') !== false && !preg_match('/\/portal\/sugar_version\.php$/i', $targetFile)) {
- logThis('Skipping "sugar_version.php" - file copy will occur at end of successful upgrade', $path);
- $_SESSION['sugar_version_file'] = $srcFile;
- continue;
- }
- //logThis('Copying file to destination: ' . $targetFile, $path);
- if(!copy($srcFile, $targetFile)) {
- logThis('*** ERROR: could not copy file: ' . $targetFile, $path);
- } else {
- $copiedFiles[] = $targetFile;
- }
- } else {
- //logThis('Skipping file: ' . $targetFile, $path);
- $skippedFiles[] = $targetFile;
- }
- }
- logThis('File copy done.', $path);
- $ret = array();
- $ret['copiedFiles'] = $copiedFiles;
- $ret['skippedFiles'] = $skippedFiles;
- return $ret;
- }
- //On cancel put back the copied files from 500 to 451 state
- function copyFilesOnCancel($step){
- //place hoder for cancel action
- }
- function removeFileFromPath($file,$path, $deleteNot=array()){
- $removed = 0;
- $cur = $path . '/' . $file;
- if(file_exists($cur)){
- $del = true;
- foreach($deleteNot as $dn){
- if($cur == $dn){
- $del = false;
- }
- }
- if($del){
- unlink($cur);
- $removed++;
- }
- }
- if(!file_exists($path))return $removed;
- $d = dir($path);
- while(false !== ($e = $d->read())){ // Fixed bug. !== is required to literally match the type and value of false, so that a filename that could evaluate and cast to false, ie "false" or "0", still allows the while loop to continue. From example at http://www.php.net/manual/en/function.dir.php
- $next = $path . '/'. $e;
- if(substr($e, 0, 1) != '.' && is_dir($next)){
- $removed += removeFileFromPath($file, $next, $deleteNot);
- }
- }
- $d->close(); // from example at http://www.php.net/manual/en/function.dir.php
- return $removed;
- }
- /**
- * This function copies/overwrites between directories
- *
- * @param string the directory name to remove
- * @param boolean whether to just empty the given directory, without deleting the given directory.
- * @return boolean True/False whether the directory was deleted.
- */
- function copyRecursiveBetweenDirectories($from,$to){
- if(file_exists($from)){
- $modifiedFiles = array();
- $modifiedFiles = findAllFiles(clean_path($from), $modifiedFiles);
- $cwd = clean_path(getcwd());
- foreach($modifiedFiles as $file) {
- $srcFile = clean_path($file);
- if (strpos($srcFile,".svn") === false) {
- $targetFile = str_replace($from, $to, $srcFile);
- if(!is_dir(dirname($targetFile))) {
- mkdir_recursive(dirname($targetFile)); // make sure the directory exists
- }
- // handle sugar_version.php
- if(strpos($targetFile, 'sugar_version.php') !== false && !preg_match('/\/portal\/sugar_version\.php$/i', $targetFile)) {
- logThis('Skipping "sugar_version.php" - file copy will occur at end of successful upgrade', $targetFile);
- $_SESSION['sugar_version_file'] = $srcFile;
- continue;
- }
- if(!copy($srcFile, $targetFile)) {
- logThis("*** ERROR: could not copy file $srcFile to $targetFile");
- }
- }
- }
- }
- }
- function deleteDirectory($dirname,$only_empty=false) {
- if (!is_dir($dirname))
- return false;
- $dscan = array(realpath($dirname));
- $darr = array();
- while (!empty($dscan)) {
- $dcur = array_pop($dscan);
- $darr[] = $dcur;
- if ($d=opendir($dcur)) {
- while ($f=readdir($d)) {
- if ($f=='.' || $f=='..')
- continue;
- $f=$dcur.'/'.$f;
- if (is_dir($f))
- $dscan[] = $f;
- else
- unlink($f);
- }
- closedir($d);
- }
- }
- $i_until = ($only_empty)? 1 : 0;
- for ($i=count($darr)-1; $i>=$i_until; $i--) {
- if (rmdir($darr[$i]))
- logThis('Success :Copying file to destination: ' . $darr[$i]);
- else
- logThis('Copy problem:Copying file to destination: ' . $darr[$i]);
- }
- return (($only_empty)? (count(scandir)<=2) : (!is_dir($dirname)));
- }
- /**
- * Get all the customized modules. Compare the file md5s with the base md5s
- * If a file has been modified then put the module in the list of customized
- * modules. Show the list in the preflight check UI.
- */
- function deleteAndOverWriteSelectedFiles($unzip_dir, $zip_from_dir,$delete_dirs){
- if($delete_dirs != null){
- foreach($delete_dirs as $del_dir){
- deleteDirectory($del_dir);
- $newFiles = findAllFiles(clean_path($unzip_dir . '/' . $zip_from_dir.'/'.$del_dir), array());
- $zipPath = clean_path($unzip_dir . '/' . $zip_from_dir.'/'.$del_dir);
- $copiedFiles = array();
- $skippedFiles = array();
- foreach($newFiles as $file) {
- $cleanFile = str_replace($zipPath, '', $file);
- $srcFile = $zipPath . $cleanFile;
- $targetFile = clean_path(getcwd() . '/' . $cleanFile);
- if(!is_dir(dirname($targetFile))) {
- mkdir_recursive(dirname($targetFile)); // make sure the directory exists
- }
- if(!file_exists($targetFile)){
- // handle sugar_version.php
- if(strpos($targetFile, 'sugar_version.php') !== false) {
- logThis('Skipping sugar_version.php - file copy will occur at end of successful upgrade');
- $_SESSION['sugar_version_file'] = $srcFile;
- continue;
- }
- //logThis('Copying file to destination: ' . $targetFile);
- if(!copy($srcFile, $targetFile)) {
- logThis('*** ERROR: could not copy file: ' . $targetFile);
- } else {
- $copiedFiles[] = $targetFile;
- }
- } else {
- //logThis('Skipping file: ' . $targetFile);
- $skippedFiles[] = $targetFile;
- }
- }
- }
- }
- $ret = array();
- $ret['copiedFiles'] = $copiedFiles;
- $ret['skippedFiles'] = $skippedFiles;
- return $ret;
- }
- //Default is empty the directory. For removing set it to false
- // to use this function to totally remove a directory, write:
- // recursive_remove_directory('path/to/directory/to/delete',FALSE);
- // to use this function to empty a directory, write:
- // recursive_remove_directory('path/to/full_directory');
- function recursive_empty_or_remove_directory($directory, $exclude_dirs=null,$exclude_files=null,$empty=TRUE)
- {
- // if the path has a slash at the end we remove it here
- if(substr($directory,-1) == '/')
- {
- $directory = substr($directory,0,-1);
- }
- // if the path is not valid or is not a directory ...
- if(!file_exists($directory) || !is_dir($directory))
- {
- // ... we return false and exit the function
- return FALSE;
- // ... if the path is not readable
- }elseif(!is_readable($directory))
- {
- // ... we return false and exit the function
- return FALSE;
- // ... else if the path is readable
- }else{
- // we open the directory
- $handle = opendir($directory);
- // and scan through the items inside
- while (FALSE !== ($item = readdir($handle)))
- {
- // if the filepointer is not the current directory
- // or the parent directory
- if($item != '.' && $item != '..')
- {
- // we build the new path to delete
- $path = $directory.'/'.$item;
- // if the new path is a directory
- //add another check if the dir is in the list to exclude delete
- if(is_dir($path) && $exclude_dirs != null && in_array($path,$exclude_dirs)){
- //do nothing
- }
- else if(is_dir($path))
- {
- // we call this function with the new path
- recursive_empty_or_remove_directory($path);
- }
- // if the new path is a file
- else{
- // we remove the file
- if($exclude_files != null && in_array($path,$exclude_files)){
- //do nothing
- }
- else{
- unlink($path);
- }
- }
- }
- }
- // close the directory
- closedir($handle);
- // if the option to empty is not set to true
- if($empty == FALSE)
- {
- // try to delete the now empty directory
- if(!rmdir($directory))
- {
- // return false if not possible
- return FALSE;
- }
- }
- // return success
- return TRUE;
- }
- }
- // ------------------------------------------------------------
- function getAllCustomizedModules() {
- require_once('files.md5');
- $return_array = array();
- $modules = getAllModules();
- foreach($modules as $mod) {
- //find all files in each module if the files have been modified
- //as compared to the base version then add the module to the
- //customized modules array
- $modFiles = findAllFiles(clean_path(getcwd())."/modules/$mod", array());
- foreach($modFiles as $file){
- $fileContents = file_get_contents($file);
- $file = str_replace(clean_path(getcwd()),'',$file);
- if($md5_string['./' . $file]){
- if(md5($fileContents) != $md5_string['./' . $file]) {
- //A file has been customized in the module. Put the module into the
- // customized modules array.
- echo 'Changed File'.$file;
- $return_array[$mod];
- break;
- }
- }
- else{
- // This is a new file in user's version and indicates that module has been
- //customized. Put the module in the customized array.
- echo 'New File'.$file;
- $return_array[$mod];
- break;
- }
- }
- } //foreach
- return $return_array;
- }
- /**
- * Array of all Modules in the version bein upgraded
- * This method returns an Array of all modules
- * @return $modules Array of modules.
- */
- function getAllModules() {
- $modules = array();
- $d = dir('modules');
- while($e = $d->read()){
- if(substr($e, 0, 1) == '.' || !is_dir('modules/' . $e))continue;
- $modules[] = $e;
- }
- return $modules;
- }
- //Remove files with the smae md5
- function removeMd5MatchingFiles($deleteNot=array()){
- $md5_string = array();
- if(file_exists(clean_path(getcwd().'/files.md5'))){
- require(clean_path(getcwd().'/files.md5'));
- }
- $modulesAll = getAllModules();
- foreach($modulesAll as $mod){
- $allModFiles = array();
- if(is_dir('modules/'.$mod)){
- $allModFiles = findAllFiles('modules/'.$mod,$allModFiles);
- foreach($allModFiles as $file){
- if(file_exists($file) && !in_array(basename($file),$deleteNot)){
- if(isset($md5_string['./'.$file])) {
- $fileContents = file_get_contents($file);
- if(md5($fileContents) == $md5_string['./'.$file]) {
- unlink($file);
- }
- }
- }
- }
- }
- }
- }
- /**
- * Handles requirements for creating reminder Tasks and Emails
- * @param array skippedFiles Array of files that were not overwriten and must be manually mereged.
- * @param string path Optional full path to alternate upgradeWizard log.
- */
- function commitHandleReminders($skippedFiles, $path='') {
- global $mod_strings;
- global $current_user;
- if(empty($mod_strings))
- $mod_strings = return_module_language('en_us', 'UpgradeWizard');
- if(empty($current_user->id)) {
- $current_user->getSystemUser();
- }
- if(count($skippedFiles) > 0) {
- $desc = $mod_strings['LBL_UW_COMMIT_ADD_TASK_OVERVIEW'] . "\n\n";
- $desc .= $mod_strings['LBL_UW_COMMIT_ADD_TASK_DESC_1'];
- $desc .= $_SESSION['uw_restore_dir'] . "\n\n";
- $desc .= $mod_strings['LBL_UW_COMMIT_ADD_TASK_DESC_2'] . "\n\n";
- foreach($skippedFiles as $file) {
- $desc .= $file . "\n";
- }
- //MFH #13468
- /// Not using new TimeDate stuff here because it needs to be compatible with 6.0
- $nowDate = gmdate('Y-m-d');
- $nowTime = gmdate('H:i:s');
- $nowDateTime = $nowDate . ' ' . $nowTime;
- if($_REQUEST['addTaskReminder'] == 'remind') {
- logThis('Adding Task for admin for manual merge.', $path);
- $task = new Task();
- $task->name = $mod_strings['LBL_UW_COMMIT_ADD_TASK_NAME'];
- $task->description = $desc;
- $task->date_due = $nowDate;
- $task->time_due = $nowTime;
- $task->priority = 'High';
- $task->status = 'Not Started';
- $task->assigned_user_id = $current_user->id;
- $task->created_by = $current_user->id;
- $task->date_entered = $nowDateTime;
- $task->date_modified = $nowDateTime;
- $task->save();
- }
- if($_REQUEST['addEmailReminder'] == 'remind') {
- logThis('Sending Reminder for admin for manual merge.', $path);
- $email = new Email();
- $email->assigned_user_id = $current_user->id;
- $email->name = $mod_strings['LBL_UW_COMMIT_ADD_TASK_NAME'];
- $email->description = $desc;
- $email->description_html = nl2br($desc);
- $email->from_name = $current_user->full_name;
- $email->from_addr = $current_user->email1;
- $email->to_addrs_arr = $email->parse_addrs($current_user->email1, '', '', '');
- $email->cc_addrs_arr = array();
- $email->bcc_addrs_arr = array();
- $email->date_entered = $nowDateTime;
- $email->date_modified = $nowDateTime;
- $email->send();
- $email->save();
- }
- }
- }
- function deleteCache(){
- //Clean modules from cache
- $cachedir = sugar_cached('modules');
- if(is_dir($cachedir)){
- $allModFiles = array();
- $allModFiles = findAllFiles($cachedir,$allModFiles, true);
- foreach($allModFiles as $file) {
- if(file_exists($file)) {
- if(is_dir($file)) {
- rmdir_recursive($file);
- } else {
- unlink($file);
- }
- }
- }
- }
- //Clean jsLanguage from cache
- $cachedir = sugar_cached('jsLanguage');
- if(is_dir($cachedir)){
- $allModFiles = array();
- $allModFiles = findAllFiles($cachedir,$allModFiles);
- foreach($allModFiles as $file){
- if(file_exists($file)){
- unlink($file);
- }
- }
- }
- //Clean smarty from cache
- $cachedir = sugar_cached('smarty');
- if(is_dir($cachedir)){
- $allModFiles = array();
- $allModFiles = findAllFiles($cachedir,$allModFiles);
- foreach($allModFiles as $file){
- if(file_exists($file)){
- unlink($file);
- }
- }
- }
- //Rebuild dashlets cache
- require_once('include/Dashlets/DashletCacheBuilder.php');
- $dc = new DashletCacheBuilder();
- $dc->buildCache();
- }
- function deleteChance(){
- //Clean folder from cache
- if(is_dir('include/SugarObjects/templates/chance')){
- rmdir_recursive('include/SugarObjects/templates/chance');
- }
- if(is_dir('include/SugarObjects/templates/chance')){
- if(!isset($_SESSION['chance'])){
- $_SESSION['chance'] = '';
- }
- $_SESSION['chance'] = 'include/SugarObjects/templates/chance';
- //rename('include/SugarObjects/templates/chance','include/SugarObjects/templates/chance_removeit');
- }
- }
- /**
- * upgradeUWFiles
- * This function copies upgrade wizard files from new patch if that dir exists
- *
- * @param $file String path to uploaded zip file
- */
- function upgradeUWFiles($file) {
- $cacheUploadUpgradesTemp = mk_temp_dir(sugar_cached("upgrades/temp"));
- unzip($file, $cacheUploadUpgradesTemp);
- if(!file_exists("$cacheUploadUpgradesTemp/manifest.php")) {
- logThis("*** ERROR: no manifest file detected while bootstraping upgrade wizard files!");
- return;
- } else {
- include("$cacheUploadUpgradesTemp/manifest.php");
- }
- $allFiles = array();
- $from_dir = "{$cacheUploadUpgradesTemp}/{$manifest['copy_files']['from_dir']}";
- // Localization
- if(file_exists("$from_dir/include/Localization/Localization.php")) {
- $allFiles[] = "$from_dir/include/Localization/Localization.php";
- }
- // upgradeWizard
- if(file_exists("$from_dir/modules/UpgradeWizard")) {
- $allFiles[] = findAllFiles("$from_dir/modules/UpgradeWizard", $allFiles);
- }
- // moduleInstaller
- if(file_exists("$from_dir/ModuleInstall")) {
- $allFiles[] = findAllFiles("$from_dir/ModuleInstall", $allFiles);
- }
- if(file_exists("$from_dir/include/javascript/yui")) {
- $allFiles[] = findAllFiles("$from_dir/include/javascript/yui", $allFiles);
- }
- if(file_exists("$from_dir/HandleAjaxCall.php")) {
- $allFiles[] = "$from_dir/HandleAjaxCall.php";
- }
- if(file_exists("$from_dir/include/SugarTheme")) {
- $allFiles[] = findAllFiles("$from_dir/include/SugarTheme", $allFiles);
- }
- if(file_exists("$from_dir/include/SugarCache")) {
- $allFiles[] = findAllFiles("$from_dir/include/SugarCache", $allFiles);
- }
- if(file_exists("$from_dir/include/utils/external_cache.php")) {
- $allFiles[] = "$from_dir/include/utils/external_cache.php";
- }
- if(file_exists("$from_dir/include/upload_file.php")) {
- $allFiles[] = "$from_dir/include/upload_file.php";
- }
- if(file_exists("$from_dir/include/file_utils.php")) {
- $allFiles[] = "$from_dir/include/file_utils.php";
- }
- if(file_exists("$from_dir/include/upload_file.php")) {
- $allFiles[] = "$from_dir/include/upload_file.php";
- }
- if(file_exists("$from_dir/include/utils/sugar_file_utils.php")) {
- $allFiles[] = "$from_dir/include/utils/sugar_file_utils.php";
- }
- // users
- if(file_exists("$from_dir/modules/Users")) {
- $allFiles[] = findAllFiles("$from_dir/modules/Users", $allFiles);
- }
- upgradeUWFilesCopy($allFiles, $from_dir);
- }
- /**
- * upgradeUWFilesCopy
- *
- * This function recursively copies files from the upgradeUWFiles Array
- * @see upgradeUWFiles
- *
- * @param array $allFiles Array of files to copy over after zip file has been uploaded
- * @param string $from_dir Source directory
- */
- function upgradeUWFilesCopy($allFiles, $from_dir)
- {
- foreach($allFiles as $file)
- {
- if(is_array($file))
- {
- upgradeUWFilesCopy($file, $from_dir);
- } else {
- $destFile = str_replace($from_dir."/", "", $file);
- if(!is_dir(dirname($destFile))) {
- mkdir_recursive(dirname($destFile)); // make sure the directory exists
- }
- if(stristr($file,'uw_main.tpl'))
- logThis('Skipping "'.$file.'" - file copy will during commit step.');
- else {
- logThis('updating UpgradeWizard code: '.$destFile);
- copy_recursive($file, $destFile);
- }
- }
- }
- }
- /**
- * gets valid patch file names that exist in upload/upgrade/patch/
- */
- function getValidPatchName($returnFull = true) {
- global $base_upgrade_dir;
- global $mod_strings;
- global $uh;
- global $sugar_version;
- global $sugar_config;
- $uh = new UpgradeHistory();
- list($base_upgrade_dir, $base_tmp_upgrade_dir) = getUWDirs();
- $return = array();
- // scan for new files (that are not installed)
- logThis('finding new files for upgrade');
- $upgrade_content = '';
- $upgrade_contents = findAllFiles($base_upgrade_dir, array(), false, 'zip');
- //other variations of zip file i.e. ZIP, zIp,zIP,Zip,ZIp,ZiP
- $ready = "<ul>\n";
- $ready .= "
- <table>
- <tr>
- <td></td>
- <td align=left>
- <b>{$mod_strings['LBL_ML_NAME']}</b>
- </td>
- <td align=left>
- <b>{$mod_strings['LBL_ML_TYPE']}</b>
- </td>
- <td align=left>
- <b>{$mod_strings['LBL_ML_VERSION']}</b>
- </td>
- <td align=left>
- <b>{$mod_strings['LBL_ML_PUBLISHED']}</b>
- </td>
- <td align=left>
- <b>{$mod_strings['LBL_ML_UNINSTALLABLE']}</b>
- </td>
- <td align=left>
- <b>{$mod_strings['LBL_ML_DESCRIPTION']}</b>
- </td>
- </tr>";
- $disabled = '';
- // assume old patches are there.
- $upgradeToVersion = array(); // fill with valid patches - we will only use the latest qualified found patch
- // cn: bug 10609 - notices for uninitialized variables
- $icon = '';
- $name = '';
- $type = '';
- $version = '';
- $published_date = '';
- $uninstallable = '';
- $description = '';
- $disabled = '';
- foreach($upgrade_contents as $upgrade_content) {
- if(!preg_match("#.*\.zip\$#i", $upgrade_content)) {
- continue;
- }
- $the_base = basename($upgrade_content);
- $the_md5 = md5_file($upgrade_content);
- $md5_matches = $uh->findByMd5($the_md5);
- /* If a patch is in the /patch dir AND has no record in the upgrade_history table we assume that it's the one we want.
- * Edge-case: manual upgrade with a FTP of a patch; UH table has no entry for it. Assume nothing. :( */
- if(0 == sizeof($md5_matches)) {
- $target_manifest = remove_file_extension( $upgrade_content ) . '-manifest.php';
- require_once($target_manifest);
- if(empty($manifest['version'])) {
- logThis("*** Potential error: patch found with no version [ {$upgrade_content} ]");
- continue;
- }
- if(!isset($manifest['type']) || $manifest['type'] != 'patch') {
- logThis("*** Potential error: patch found with either no 'type' or non-patch type [ {$upgrade_content} ]");
- continue;
- }
- $upgradeToVersion[$manifest['version']] = urlencode($upgrade_content);
- $name = empty($manifest['name']) ? $upgrade_content : $manifest['name'];
- $version = empty($manifest['version']) ? '' : $manifest['version'];
- $published_date = empty($manifest['published_date']) ? '' : $manifest['published_date'];
- $icon = '';
- $description = empty($manifest['description']) ? 'None' : $manifest['description'];
- $uninstallable = empty($manifest['is_uninstallable']) ? 'No' : 'Yes';
- $type = getUITextForType( $manifest['type'] );
- $manifest_type = $manifest['type'];
- if(empty($manifest['icon'])) {
- $icon = getImageForType( $manifest['type'] );
- } else {
- $path_parts = pathinfo( $manifest['icon'] );
- $icon = "<!--not_in_theme!--><img src=\"" . remove_file_extension( $upgrade_content ) . "-icon." . $path_parts['extension'] . "\">";
- }
- }
- }
- // cn: bug 10488 use the NEWEST upgrade/patch available when running upgrade wizard.
- ksort($upgradeToVersion);
- $upgradeToVersion = array_values($upgradeToVersion);
- $newest = array_pop($upgradeToVersion);
- $_SESSION['install_file'] = urldecode($newest); // in-case it was there from a prior.
- logThis("*** UW using [ {$_SESSION['install_file']} ] as source for patch files.");
- $cleanUpgradeContent = urlencode($_SESSION['install_file']);
- // cn: 10606 - cannot upload a patch file since this returned always.
- if(!empty($cleanUpgradeContent)) {
- $ready .= "<tr><td>$icon</td><td>$name</td><td>$type</td><td>$version</td><td>$published_date</td><td>$uninstallable</td><td>$description</td>\n";
- $ready .=<<<eoq
- <td>
- <form action="index.php" method="post">
- <input type="hidden" name="module" value="UpgradeWizard">
- <input type="hidden" name="action" value="index">
- <input type="hidden" name="step" value="{$_REQUEST['step']}">
- <input type="hidden" name="run" value="delete">
- <input type=hidden name="install_file" value="{$cleanUpgradeContent}" />
- <input type=submit value="{$mod_strings['LBL_BUTTON_DELETE']}" />
- </form>
- </td></table>
- eoq;
- $disabled = "DISABLED";
- }
- if(empty($cleanUpgradeContent)){
- $ready .= "<tr><td colspan='7'><i>None</i></td>\n";
- $ready .= "</table>\n";
- }
- $ready .= "<br></ul>\n";
- $return['ready'] = $ready;
- $return['disabled'] = $disabled;
- if($returnFull) {
- return $return;
- }
- }
- /**
- * finalizes upgrade by setting upgrade versions in DB (config table) and sugar_version.php
- * @return bool true on success
- */
- function updateVersions($version) {
- global $db;
- global $sugar_config;
- global $path;
- logThis('At updateVersions()... updating config table and sugar_version.php.', $path);
- // handle file copy
- if(isset($_SESSION['sugar_version_file']) && !empty($_SESSION['sugar_version_file'])) {
- if(!copy($_SESSION['sugar_version_file'], clean_path(getcwd().'/sugar_version.php'))) {
- logThis('*** ERROR: sugar_version.php could not be copied to destination! Cannot complete upgrade', $path);
- return false;
- } else {
- logThis('sugar_version.php successfully updated!', $path);
- }
- } else {
- logThis('*** ERROR: no sugar_version.php file location found! - cannot complete upgrade...', $path);
- return false;
- }
- $q1 = "DELETE FROM config WHERE category = 'info' AND name = 'sugar_version'";
- $q2 = "INSERT INTO config (category, name, value) VALUES ('info', 'sugar_version', '{$version}')";
- logThis('Deleting old DB version info from config table.', $path);
- $db->query($q1);
- logThis('Inserting updated version info into config table.', $path);
- $db->query($q2);
- logThis('updateVersions() complete.', $path);
- return true;
- }
- /**
- * gets a module's lang pack - does not need to be a SugarModule
- * @param lang string Language
- * @param module string Path to language folder
- * @return array mod_strings
- */
- function getModuleLanguagePack($lang, $module) {
- $mod_strings = array();
- if(!empty($lang) && !empty($module)) {
- $langPack = clean_path(getcwd().'/'.$module.'/language/'.$lang.'.lang.php');
- $langPackEn = clean_path(getcwd().'/'.$module.'/language/en_us.lang.php');
- if (file_exists($langPack))
- {
- include($langPack);
- }
- elseif (file_exists($langPackEn))
- {
- include($langPackEn);
- }
- }
- return $mod_strings;
- }
- /**
- * checks system compliance for 4.5+ codebase
- * @return array Mixed values
- */
- function checkSystemCompliance() {
- global $sugar_config;
- global $current_language;
- global $db;
- global $mod_strings;
- global $app_strings;
- if(!defined('SUGARCRM_MIN_MEM')) {
- define('SUGARCRM_MIN_MEM', 40);
- }
- $installer_mod_strings = getModuleLanguagePack($current_language, './install');
- $ret = array();
- $ret['error_found'] = false;
- // PHP version
- $php_version = constant('PHP_VERSION');
- $check_php_version_result = check_php_version($php_version);
- switch($check_php_version_result) {
- case -1:
- $ret['phpVersion'] = "<b><span class=stop>{$installer_mod_strings['ERR_CHECKSYS_PHP_INVALID_VER']} {$php_version} )</span></b>";
- $ret['error_found'] = true;
- break;
- case 0:
- $ret['phpVersion'] = "<b><span class=go>{$installer_mod_strings['ERR_CHECKSYS_PHP_UNSUPPORTED']} {$php_version} )</span></b>";
- break;
- case 1:
- $ret['phpVersion'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_PHP_OK']} {$php_version} )</span></b>";
- break;
- }
- // database and connect
- $canInstall = $db->canInstall();
- if ($canInstall !== true)
- {
- $ret['error_found'] = true;
- if (count($canInstall) == 1)
- {
- $ret['dbVersion'] = "<b><span class=stop>" . $installer_mod_strings[$canInstall[0]] . "</span></b>";
- }
- else
- {
- $ret['dbVersion'] = "<b><span class=stop>" . sprintf($installer_mod_strings[$canInstall[0]], $canInstall[1]) . "</span></b>";
- }
- }
- // XML Parsing
- if(function_exists('xml_parser_create')) {
- $ret['xmlStatus'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- } else {
- $ret['xmlStatus'] = "<b><span class=stop>{$installer_mod_strings['LBL_CHECKSYS_NOT_AVAILABLE']}</span></b>";
- $ret['error_found'] = true;
- }
- // cURL
- if(function_exists('curl_init')) {
- $ret['curlStatus'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- } else {
- $ret['curlStatus'] = "<b><span class=go>{$installer_mod_strings['ERR_CHECKSYS_CURL']}</span></b>";
- $ret['error_found'] = false;
- }
- // mbstrings
- if(function_exists('mb_strlen')) {
- $ret['mbstringStatus'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- } else {
- $ret['mbstringStatus'] = "<b><span class=stop>{$installer_mod_strings['ERR_CHECKSYS_MBSTRING']}</span></b>";
- $ret['error_found'] = true;
- }
- // imap
- if(function_exists('imap_open')) {
- $ret['imapStatus'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- } else {
- $ret['imapStatus'] = "<b><span class=go>{$installer_mod_strings['ERR_CHECKSYS_IMAP']}</span></b>";
- $ret['error_found'] = false;
- }
- // safe mode
- if('1' == ini_get('safe_mode')) {
- $ret['safeModeStatus'] = "<b><span class=stop>{$installer_mod_strings['ERR_CHECKSYS_SAFE_MODE']}</span></b>";
- $ret['error_found'] = true;
- } else {
- $ret['safeModeStatus'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- }
- // call time pass by ref
- if('1' == ini_get('allow_call_time_pass_reference')) {
- $ret['callTimeStatus'] = "<b><span class=stop>{$installer_mod_strings['ERR_CHECKSYS_CALL_TIME']}</span></b>";
- //continue upgrading
- } else {
- $ret['callTimeStatus'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- }
- // memory limit
- $ret['memory_msg'] = "";
- $memory_limit = "-1";//ini_get('memory_limit');
- $sugarMinMem = constant('SUGARCRM_MIN_MEM');
- // logic based on: http://us2.php.net/manual/en/ini.core.php#ini.memory-limit
- if( $memory_limit == "" ){ // memory_limit disabled at compile time, no memory limit
- $ret['memory_msg'] = "<b><span class=\"go\">{$installer_mod_strings['LBL_CHECKSYS_MEM_OK']}</span></b>";
- } elseif( $memory_limit == "-1" ){ // memory_limit enabled, but set to unlimited
- $ret['memory_msg'] = "<b><span class=\"go\">{$installer_mod_strings['LBL_CHECKSYS_MEM_UNLIMITED']}</span></b>";
- } else {
- rtrim($memory_limit, 'M');
- $memory_limit_int = (int) $memory_limit;
- if( $memory_limit_int < constant('SUGARCRM_MIN_MEM') ){
- $ret['memory_msg'] = "<b><span class=\"stop\">{$installer_mod_strings['ERR_CHECKSYS_MEM_LIMIT_1']}" . constant('SUGARCRM_MIN_MEM') . "{$installer_mod_strings['ERR_CHECKSYS_MEM_LIMIT_2']}</span></b>";
- $ret['error_found'] = true;
- } else {
- $ret['memory_msg'] = "<b><span class=\"go\">{$installer_mod_strings['LBL_CHECKSYS_OK']} ({$memory_limit})</span></b>";
- }
- }
- // zip support
- if (!class_exists("ZipArchive"))
- {
- $ret['ZipStatus'] = "<b><span class=stop>{$installer_mod_strings['ERR_CHECKSYS_ZIP']}</span></b>";
- $ret['error_found'] = true;
- } else {
- $ret['ZipStatus'] = "<b><span class=go>{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- }
- // Suhosin allow to use upload://
- $ret['stream_msg'] = '';
- if (UploadStream::getSuhosinStatus() == true)
- {
- $ret['stream_msg'] = "<b><span class=\"go\">{$installer_mod_strings['LBL_CHECKSYS_OK']}</span></b>";
- }
- else
- {
- $ret['stream_msg'] = "<b><span class=\"stop\">{$app_strings['ERR_SUHOSIN']}</span></b>";
- $ret['error_found'] = true;
- }
- /* mbstring.func_overload
- $ret['mbstring.func_overload'] = '';
- $mb = ini_get('mbstring.func_overload');
- if($mb > 1) {
- $ret['mbstring.func_overload'] = "<b><span class=\"stop\">{$mod_strings['ERR_UW_MBSTRING_FUNC_OVERLOAD']}</b>";
- $ret['error_found'] = true;
- }
- */
- return $ret;
- }
- /**
- * is a file that we blow away automagically
- */
- function isAutoOverwriteFile($file) {
- $overwriteDirs = array(
- './sugar_version.php',
- './modules/UpgradeWizard/uw_main.tpl',
- );
- $file = trim('.'.str_replace(clean_path(getcwd()), '', $file));
- if(in_array($file, $overwriteDirs)) {
- return true;
- }
- $fileExtension = substr(strrchr($file, "."), 1);
- if($fileExtension == 'tpl' || $fileExtension == 'html') {
- return false;
- }
- return true;
- }
- /**
- * flatfile logger
- */
- function logThis($entry, $path='') {
- global $mod_strings;
- if(file_exists('include/utils/sugar_file_utils.php')){
- require_once('include/utils/sugar_file_utils.php');
- }
- $log = empty($path) ? clean_path(getcwd().'/upgradeWizard.log') : clean_path($path);
- // create if not exists
- if(!file_exists($log)) {
- if(function_exists('sugar_fopen')){
- $fp = @sugar_fopen($log, 'w+'); // attempts to create file
- }
- else{
- $fp = fopen($log, 'w+'); // attempts to create file
- }
- if(!is_resource($fp)) {
- $GLOBALS['log']->fatal('UpgradeWizard could not create the upgradeWizard.log file');
- die($mod_strings['ERR_UW_LOG_FILE_UNWRITABLE']);
- }
- } else {
- if(function_exists('sugar_fopen')){
- $fp = @sugar_fopen($log, 'a+'); // write pointer at end of file
- }
- else{
- $fp = @fopen($log, 'a+'); // write pointer at end of file
- }
- if(!is_resource($fp)) {
- $GLOBALS['log']->fatal('UpgradeWizard could not open/lock upgradeWizard.log file');
- die($mod_strings['ERR_UW_LOG_FILE_UNWRITABLE']);
- }
- }
- $line = date('r').' [UpgradeWizard] - '.$entry."\n";
- if(@fwrite($fp, $line) === false) {
- $GLOBALS['log']->fatal('UpgradeWizard could not write to upgradeWizard.log: '.$entry);
- die($mod_strings['ERR_UW_LOG_FILE_UNWRITABLE']);
- }
- if(is_resource($fp)) {
- fclose($fp);
- }
- }
- /**
- * @params : none
- * @author: nsingh
- * @desc This function is to be used in the upgrade process to preserve changes/customaizations made to pre 5.1 quickcreate layout.
- * Prior to 5.1 we have been using editviewdefs as the base for quickcreatedefs. If a custom field was added to edit view layout, it
- * was automatically picked up by the quick create. [Addresses Bug 21469]
- * This function will check if customizations were made, and will create quickcreatedefs.php in the /cutom/working/$module_name directory.
- **/
- function updateQuickCreateDefs(){
- $d = dir('modules');
- $studio_modules = array();
- while($e = $d->read()){ //collect all studio modules.
- if(substr($e, 0, 1) == '.' || !is_dir('modules/' . $e))continue;
- if(file_exists('modules/' . $e . '/metadata/studio.php'))
- {
- array_push($studio_modules, $e);
- }
- }
- foreach( $studio_modules as $modname ){ //for each studio enabled module
- //Check !exists modules/$modname/metadata/quickcreatedefs.php &&
- //exists custom/$modname/editviewdefs.php (module was customized) &&
- //!exists custom/$modname/quickcreateviewdefs.php
- $editviewdefs = "custom/working/modules/".$modname."/metadata/editviewdefs.php";
- $quickcreatedefs = "custom/working/modules/".$modname."/metadata/quickcreatedefs.php";
- if ( !file_exists("modules/".$modname."/metadata/quickcreatedefs.php") &&
- file_exists($editviewdefs) &&
- !file_exists($quickcreatedefs) ){
- //clone editviewdef and save it in custom/working/modules/metadata
- $GLOBALS['log']->debug("Copying editviewdefs.php as quickcreatedefs.php for the $modname module in custom/working/modules/$modname/metadata!");
- if(copy( $editviewdefs, $quickcreatedefs)){
- if(file_exists($quickcreatedefs) && is_readable($quickcreatedefs)){
- $file = file($quickcreatedefs);
- //replace 'EditView' with 'QuickCreate'
- $fp = fopen($quickcreatedefs,'w');
- foreach($file as &$line){
- if(preg_match('/^\s*\'EditView\'\s*=>\s*$/', $line) > 0){
- $line = "'QuickCreate' =>\n";
- }
- fwrite($fp, $line);
- }
- //write back.
- fclose($fp);
- }
- else{
- $GLOBALS['log']->debug("Failed to replace 'EditView' with QuickCreate because $quickcreatedefs is either not readable or does not exist.");
- }
- }else{
- $GLOBALS['log']->debug("Failed to copy $editviewdefs to $quickcreatedefs!");
- }
- }
- }
- }
- /**
- * test perms for CREATE queries
- */
- function testPermsCreate($db, $out) {
- logThis('Checking CREATE TABLE permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("CREATE TABLE")) {
- logThis('cannot CREATE TABLE!');
- $out['db']['dbNoCreate'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_CREATE']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for INSERT
- */
- function testPermsInsert($db, $out, $skip=false) {
- logThis('Checking INSERT INTO permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("INSERT")) {
- logThis('cannot INSERT INTO!');
- $out['db']['dbNoInsert'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_INSERT']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for UPDATE TABLE
- */
- function testPermsUpdate($db, $out, $skip=false) {
- logThis('Checking UPDATE TABLE permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("UPDATE")) {
- logThis('cannot UPDATE TABLE!');
- $out['db']['dbNoUpdate'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_UPDATE']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for SELECT
- */
- function testPermsSelect($db, $out, $skip=false) {
- logThis('Checking SELECT permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("SELECT")) {
- logThis('cannot SELECT!');
- $out['db']['dbNoSelect'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_SELECT']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for DELETE
- */
- function testPermsDelete($db, $out, $skip=false) {
- logThis('Checking DELETE FROM permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("DELETE")) {
- logThis('cannot DELETE FROM!');
- $out['db']['dbNoDelete'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_DELETE']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for ALTER TABLE ADD COLUMN
- */
- function testPermsAlterTableAdd($db, $out, $skip=false) {
- logThis('Checking ALTER TABLE ADD COLUMN permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("ADD COLUMN")) {
- logThis('cannot ADD COLUMN!');
- $out['db']['dbNoAddColumn'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_ADD_COLUMN']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for ALTER TABLE ADD COLUMN
- */
- function testPermsAlterTableChange($db, $out, $skip=false) {
- logThis('Checking ALTER TABLE CHANGE COLUMN permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("CHANGE COLUMN")) {
- logThis('cannot CHANGE COLUMN!');
- $out['db']['dbNoChangeColumn'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_CHANGE_COLUMN']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for ALTER TABLE DROP COLUMN
- */
- function testPermsAlterTableDrop($db, $out, $skip=false) {
- logThis('Checking ALTER TABLE DROP COLUMN permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("DROP COLUMN")) {
- logThis('cannot DROP COLUMN!');
- $out['db']['dbNoDropColumn'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_DROP_COLUMN']}</span></td></tr>";
- }
- return $out;
- }
- /**
- * test perms for DROP TABLE
- */
- function testPermsDropTable($db, $out, $skip=false) {
- logThis('Checking DROP TABLE permissions...');
- global $mod_strings;
- if(!$db->checkPrivilege("DROP TABLE")) {
- logThis('cannot DROP TABLE!');
- $out['db']['dbNoDropTable'] = true;
- $out['dbOut'] .= "<tr><td align='left'><span class='error'>{$mod_strings['LBL_UW_DB_NO_DROP_TABLE']}</span></td></tr>";
- }
- return $out;
- }
- function getFormattedError($error, $query) {
- $error = "<div><b>".$error;
- $error .= "</b>::{$query}</div>";
- return $error;
- }
- /**
- * parses a query finding the table name
- * @param string query The query
- * @return string table The table
- */
- function getTableFromQuery($query) {
- $standardQueries = array('ALTER TABLE', 'DROP TABLE', 'CREATE TABLE', 'INSERT INTO', 'UPDATE', 'DELETE FROM');
- $query = preg_replace("/[^A-Za-z0-9\_\s]/", "", $query);
- $query = trim(str_replace($standardQueries, '', $query));
- $firstSpc = strpos($query, " ");
- $end = ($firstSpc > 0) ? $firstSpc : strlen($query);
- $table = substr($query, 0, $end);
- return $table;
- }
- //prelicense check
- function preLicenseCheck() {
- require_once('modules/UpgradeWizard/uw_files.php');
- global $sugar_config;
- global $mod_strings;
- global $sugar_version;
- if(!isset($sugar_version) || empty($sugar_version)) {
- require_once('./sugar_version.php');
- }
- if(!isset($_SESSION['unzip_dir']) || empty($_SESSION['unzip_dir'])) {
- logThis('unzipping files in upgrade archive...');
- $errors = array();
- list($base_upgrade_dir, $base_tmp_upgrade_dir) = getUWDirs();
- $unzip_dir = '';
- //also come up with mechanism to read from upgrade-progress file
- if(!isset($_SESSION['install_file']) || empty($_SESSION['install_file']) || !is_file($_SESSION['install_file'])) {
- if (file_exists(clean_path($base_tmp_upgrade_dir)) && $handle = opendir(clean_path($base_tmp_upgrade_dir))) {
- while (false !== ($file = readdir($handle))) {
- if($file !="." && $file !="..") {
- if(is_file($base_tmp_upgrade_dir."/".$file."/manifest.php")){
- require_once($base_tmp_upgrade_dir."/".$file."/manifest.php");
- $package_name= $manifest['copy_files']['from_dir'];
- if(file_exists($base_tmp_upgrade_dir."/".$file."/".$package_name) && file_exists($base_tmp_upgrade_dir."/".$file."/scripts") && file_exists($base_tmp_upgrade_dir."/".$file."/manifest.php")){
- $unzip_dir = $base_tmp_upgrade_dir."/".$file;
- if(file_exists("$base_upgrade_dir/patch/".$package_name.'.zip')){
- $_SESSION['install_file'] = $package_name.".zip";
- break;
- }
- }
- }
- }
- }
- }
- }
- if(empty($_SESSION['install_file'])){
- unlinkUWTempFiles();
- resetUwSession();
- echo 'Upload File not found so redirecting to Upgrade Start ';
- $redirect_new_wizard = $sugar_config['site_url' ].'/index.php?module=UpgradeWizard&action=index';
- echo '<form name="redirect" action="' .$redirect_new_wizard. '" method="POST">';
- $upgrade_directories_not_found =<<<eoq
- <table cellpadding="3" cellspacing="0" border="0">
- <tr>
- <th colspan="2" align="left">
- <span class='error'><b>'Upload file missing or has been deleted. Refresh the page to go back to UpgradeWizard start'</b></span>
- </th>
- </tr>
- </table>
- eoq;
- $uwMain = $upgrade_directories_not_found;
- return '';
- }
- $install_file = "$base_upgrade_dir/patch/".basename(urldecode( $_SESSION['install_file'] ));
- $show_files = true;
- if(empty($unzip_dir)){
- $unzip_dir = mk_temp_dir( $base_tmp_upgrade_dir );
- }
- $zip_from_dir = ".";
- $zip_to_dir = ".";
- $zip_force_copy = array();
- if(!$unzip_dir){
- logThis('Could not create a temporary directory using mk_temp_dir( $base_tmp_upgrade_dir )');
- die($mod_strings['ERR_UW_NO_CREATE_TMP_DIR']);
- }
- //double check whether unzipped .
- if(file_exists($unzip_dir ."/scripts") && file_exists($unzip_dir."/manifest.php")){
- //already unzipped
- }
- else{
- unzip( $install_file, $unzip_dir );
- }
- // assumption -- already validated manifest.php at time of upload
- require_once( "$unzip_dir/manifest.php" );
- if( isset( $manifest['copy_files']['from_dir'] ) && $manifest['copy_files']['from_dir'] != "" ){
- $zip_from_dir = $manifest['copy_files']['from_dir'];
- }
- if( isset( $manifest['copy_files']['to_dir'] ) && $manifest['copy_files']['to_dir'] != "" ){
- $zip_to_dir = $manifest['copy_files']['to_dir'];
- }
- if( isset( $manifest['copy_files']['force_copy'] ) && $manifest['copy_files']['force_copy'] != "" ){
- $zip_force_copy = $manifest['copy_files']['force_copy'];
- }
- if( isset( $manifest['version'] ) ){
- $version = $manifest['version'];
- }
- if( !is_writable( "config.php" ) ){
- return $mod_strings['ERR_UW_CONFIG'];
- }
- $_SESSION['unzip_dir'] = clean_path($unzip_dir);
- $_SESSION['zip_from_dir'] = clean_path($…
Large files files are truncated, but you can click here to view the full file