From ace3ab800678d3be2960a3c1bf598c06fcfabbdd Mon Sep 17 00:00:00 2001 From: Fernando Ontiveros Date: Tue, 9 Oct 2012 12:51:51 -0400 Subject: [PATCH] CODE STYLE class.Installer.php --- workflow/engine/classes/class.Installer.php | 960 +++++++++----------- 1 file changed, 440 insertions(+), 520 deletions(-) diff --git a/workflow/engine/classes/class.Installer.php b/workflow/engine/classes/class.Installer.php index d945ecf2c..262b9e1fa 100755 --- a/workflow/engine/classes/class.Installer.php +++ b/workflow/engine/classes/class.Installer.php @@ -1,6 +1,8 @@ . + * along with this program. If not, see . * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. @@ -31,8 +33,10 @@ // License: LGPL, see LICENSE //////////////////////////////////////////////////// + /** * Processmaker Installer + * * @package workflow.engine.ProcessMaker * @author maborak * @copyright 2008 COLOSA @@ -40,440 +44,372 @@ class Installer { - public $options = Array(); - public $result = Array(); - public $error = Array(); - public $report = Array(); - private $connection_database; - - /** - * construct of insert - * - * @param string $pPRO_UID - * @return void - */ - function __construct() - { - } - - /** - * create_site - * - * @param array $config - * @param boolean $confirmed - * @return void - */ - public function create_site($config = Array(), $confirmed = false) - { - $this->options=G::array_concat(Array( - 'isset'=>false, - 'password' =>G::generate_password(12), - 'path_data' =>@PATH_DATA, - 'path_compiled' =>@PATH_C, - 'name'=>$config['name'], - 'database'=>Array(), - 'admin'=>Array('username'=>'admin','password'=>'admin'), - 'advanced'=>Array( - 'ao_db_wf'=>'wf_'.$config['name'], - 'ao_db_rb'=>'rb_'.$config['name'], - 'ao_db_rp'=>'rp_'.$config['name'], - 'ao_db_drop'=>false - ) - ),$config); - $a = @explode(SYSTEM_HASH,G::decrypt(HASH_INSTALLATION,SYSTEM_HASH)); - $this->options['database']=G::array_concat(Array( - 'username'=>@$a[1], - 'password'=>@$a[2], - 'hostname'=>@$a[0] - ),$this->options['database']); - return ($confirmed===true)?$this->make_site():$this->create_site_test(); - } - - /** - * isset_site - * - * @param string $name Default value "workflow" - * @return string file_exists(PATH_DATA."sites/".$name); - */ - public function isset_site($name = "workflow") - { - return file_exists(PATH_DATA."sites/".$name); - } + public $options = Array (); + public $result = Array (); + public $error = Array (); + public $report = Array (); + private $connection_database; - /** - * create_site_test - * - * @return void - */ - private function create_site_test() - { - $name = (preg_match('/^[\w]+$/i',trim($this->options['name'])))?true:false; - $result=Array( - 'path_data' =>$this->is_dir_writable($this->options['path_data']), - 'path_compiled' =>$this->is_dir_writable($this->options['path_compiled']), - 'database' =>$this->check_connection(), - 'access_level'=>$this->cc_status, - 'isset'=>($this->options['isset']==true)?$this->isset_site($this->options['name']):false, - 'microtime'=>microtime(), - 'workspace'=>$this->options['name'], - 'name'=>array( - 'status'=>$name, - 'message'=>($name)?'PASSED':'Workspace name invalid' - ), - 'admin'=>array( - 'username'=>(preg_match('/^[\w@\.-]+$/i',trim($this->options['admin']['username'])))?true:false, - 'password'=>((trim($this->options['admin']['password'])=='')?false:true) - ) - ); - $result['name']['message'] = ($result['isset'])?'Workspace already exist':$result['name']['message']; - $result['name']['status'] = ($result['isset'])?false:$result['name']['status']; - //print_r($result); - return Array( - 'created'=>G::var_compare( - true, - $result['path_data'], - $result['database']['connection'], - $result['name']['status'], - $result['database']['version'], - $result['database']['ao']['ao_db_wf']['status'], - $result['database']['ao']['ao_db_rb']['status'], - $result['database']['ao']['ao_db_rp']['status'], - $result['admin']['username'], - (($result['isset'])?false:true), - $result['admin']['password']), - 'result'=>$result - ); - } - - /** - * make_site - * - * @return array $test - */ - private function make_site() - { - $test = $this->create_site_test(); - - if($test["created"] == true || $this->options["advanced"]["ao_db_drop"] == true) + /** + * construct of insert + * + * @param string $pPRO_UID + * @return void + */ + function __construct () { - /* Check if the hostname is local (localhost or 127.0.0.1) */ - $islocal = (strcmp(substr($this->options['database']['hostname'], 0, strlen('localhost')),'localhost')===0) || - (strcmp(substr($this->options['database']['hostname'], 0, strlen('127.0.0.1')),'127.0.0.1')===0); - - $this->wf_site_name = $wf = $this->options['advanced']['ao_db_wf']; - - $this->rbac_site_name = $rb = $this->options['advanced']['ao_db_rb']; - $this->report_site_name = $rp = $this->options['advanced']['ao_db_rp']; - - $schema = "schema.sql"; - $values = "insert.sql"; - - if($this->options['advanced']['ao_db_drop']===true) { - //Delete workspace directory if exists - - //Drop databases - $this->run_query("DROP DATABASE IF EXISTS ".$wf, "Drop database $wf"); - $this->run_query("DROP DATABASE IF EXISTS ".$rb, "Drop database $rb"); - $this->run_query("DROP DATABASE IF EXISTS ".$rp, "Drop database $rp"); - } - - $this->run_query("CREATE DATABASE IF NOT EXISTS ".$wf." DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci", - "Create database $wf"); - $this->run_query("CREATE DATABASE IF NOT EXISTS ".$rb." DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci", - "Create database $rb"); - $this->run_query("CREATE DATABASE IF NOT EXISTS ".$rp." DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci", - "Create database $rp"); - - if($this->cc_status==1) { - $host = ($islocal) ? "localhost" : "%"; - $this->run_query("GRANT ALL PRIVILEGES ON `$wf`.* TO $wf@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", - "Grant privileges for user $wf on database $wf"); - $this->run_query("GRANT ALL PRIVILEGES ON `$rb`.* TO $rb@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", - "Grant privileges for user $rb on database $rb"); - $this->run_query("GRANT ALL PRIVILEGES ON `$rp`.* TO $rp@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", - "Grant privileges for user $rp on database $rp"); - } - - /* Dump schema workflow && data */ - - $this->log("Import database schema:\n"); - $myPortA = explode(":",$this->options['database']['hostname']); - if(count($myPortA)<2) { - $myPortA[1]="3306"; - } - $myPort = $myPortA[1]; - $this->options['database']['hostname'] = $myPortA[0]; - - mysql_select_db($wf,$this->connection_database); - $pws = PATH_WORKFLOW_MYSQL_DATA.$schema; - $qws = $this->query_sql_file(PATH_WORKFLOW_MYSQL_DATA.$schema,$this->connection_database); - $this->log($qws, isset($qws['errors'])); - $qwv = $this->query_sql_file(PATH_WORKFLOW_MYSQL_DATA.$values,$this->connection_database); - $this->log($qwv, isset($qwv['errors'])); - - - /* Dump schema rbac && data */ - $pws = PATH_RBAC_MYSQL_DATA.$schema; - mysql_select_db($rb,$this->connection_database); - $qrs = $this->query_sql_file(PATH_RBAC_MYSQL_DATA.$schema,$this->connection_database); - $this->log($qrs, isset($qrs['errors'])); - $qrv = $this->query_sql_file(PATH_RBAC_MYSQL_DATA.$values,$this->connection_database); - $this->log($qrv, isset($qrv['errors'])); - - mysql_select_db($wf,$this->connection_database); - - require_once("propel/Propel.php"); - require_once('classes/model/AppCacheView.php'); - - $appCache = new AppCacheView(); - $appCache->setPathToAppCacheFiles ( PATH_METHODS . 'setup/setupSchemas/' ); - $triggers = $appCache->getTriggers("en"); - $this->log("Create 'cases list cache' triggers"); - foreach ($triggers as $triggerName => $trigger) { - $this->run_query($trigger, "-> Trigger $triggerName"); - } - - $path_site = $this->options['path_data']."/sites/".$this->options['name']."/"; - $db_file = $path_site."db.php"; - @mkdir($path_site,0777,true); - @mkdir($path_site."files/",0777,true); - @mkdir($path_site."mailTemplates/",0777,true); - @mkdir($path_site."public/",0777,true); - @mkdir($path_site."reports/",0777,true); - @mkdir($path_site."xmlForms",0777,true); - - $db_text = "options['database']['hostname'] . ":".$myPort."' );\n" . - "define ('DB_NAME', '" . $wf. "' );\n" . - "define ('DB_USER', '" . (($this->cc_status==1)?$wf:$this->options['database']['username']). "' );\n" . - "define ('DB_PASS', '" . (($this->cc_status==1)?$this->options['password']:$this->options['database']['password']). "' );\n" . - "define ('DB_RBAC_HOST', '". $this->options['database']['hostname'] .":".$myPort."' );\n" . - "define ('DB_RBAC_NAME', '". $rb . "' );\n" . - "define ('DB_RBAC_USER', '".(($this->cc_status==1)?$rb:$this->options['database']['username']) . "' );\n" . - "define ('DB_RBAC_PASS', '". (($this->cc_status==1)?$this->options['password']:$this->options['database']['password']) . "' );\n" . - "define ('DB_REPORT_HOST', '". $this->options['database']['hostname'] .":".$myPort."' );\n" . - "define ('DB_REPORT_NAME', '". $rp . "' );\n" . - "define ('DB_REPORT_USER', '".(($this->cc_status==1)?$rp:$this->options['database']['username']) . "' );\n" . - "define ('DB_REPORT_PASS', '". (($this->cc_status==1)?$this->options['password']:$this->options['database']['password']) . "' );\n" . - "?>"; - $fp = @fopen($db_file, "w"); - $this->log("Create: ".$db_file." => ".((!$fp)?$fp:"OK")."\n", $fp === FALSE); - $ff = @fputs( $fp, $db_text, strlen($db_text)); - $this->log("Write: ".$db_file." => ".((!$ff)?$ff:"OK")."\n", $ff === FALSE); - - fclose( $fp ); - $this->set_admin(); } - return $test; - } - - /** - * set_admin - * - * @return void - */ - public function set_admin() - { - mysql_select_db($this->wf_site_name,$this->connection_database); - // The mysql_escape_string function has been DEPRECATED as of PHP 5.3.0. - // $this->run_query('UPDATE USERS SET USR_USERNAME = \''.mysql_escape_string($this->options['admin']['username']).'\', `USR_PASSWORD` = \''.md5($this->options['admin']['password']).'\' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', - // "Add 'admin' user in ProcessMaker (wf)"); - $this->run_query('UPDATE USERS SET USR_USERNAME = \'' . mysql_real_escape_string($this->options['admin']['username']) . '\', ' . - ' `USR_PASSWORD` = \'' . md5($this->options['admin']['password']) . '\' ' . - ' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', - "Add 'admin' user in ProcessMaker (wf)"); - mysql_select_db($this->rbac_site_name,$this->connection_database); - // The mysql_escape_string function has been DEPRECATED as of PHP 5.3.0. - // $this->run_query('UPDATE USERS SET USR_USERNAME = \''.mysql_escape_string($this->options['admin']['username']).'\', `USR_PASSWORD` = \''.md5($this->options['admin']['password']).'\' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', - // "Add 'admin' user in ProcessMaker (rb)"); - $this->run_query('UPDATE USERS SET USR_USERNAME = \'' . mysql_real_escape_string($this->options['admin']['username']) . '\', ' . - ' `USR_PASSWORD` = \'' . md5($this->options['admin']['password']) . '\' ' . - ' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', - "Add 'admin' user in ProcessMaker (rb)"); - } - /** - * Run a mysql query on the current database and take care of logging and - * error handling. - * - * @param string $query SQL command - * @param string $description Description to log instead of $query - */ - private function run_query($query, $description = NULL) { - $result = @mysql_query($query, $this->connection_database); - $error = ($result) ? false : mysql_error(); - $this->log(($description ? $description : $query) . " => " . (($error) ? $error : "OK") . "\n", - $error); - } - - /** - * query_sql_file - * - * @param string $file - * @param string $connection - * @return array $report - */ - public function query_sql_file($file, $connection) - { - $lines = file($file); - $previous = NULL; - $errors = ''; - @mysql_query("SET NAMES 'utf8';"); - foreach ($lines as $j => $line) { - $line = trim($line); // Remove comments from the script - - if (strpos($line, "--") === 0) { - $line = substr($line, 0, strpos($line, "--")); - } - - if (empty($line)) { - continue; - } - - if (strpos($line, "#") === 0) { - $line = substr($line, 0, strpos($line, "#")); - } - - if (empty($line)) { - continue; - } - - // Concatenate the previous line, if any, with the current - if ($previous) { - $line = $previous . " " . $line; - } - $previous = NULL; - - // If the current line doesnt end with ; then put this line together - // with the next one, thus supporting multi-line statements. - if (strrpos($line, ";") != strlen($line) - 1) { - $previous = $line; - continue; - } - - $line = substr($line, 0, strrpos($line, ";")); - @mysql_query($line, $connection); - } - } - - /** - * check_path - * - * @return void - * @todo Empty function - */ - private function check_path() - { - - } - - /** - * function find_root_path - * - * @param string $path - * @return string $path - */ - private function find_root_path($path) - { - $i = 0; //prevent loop inifinity - while(!is_dir($path) && ($path = dirname($path)) && ((strlen($path)>1) && $i<10)) { - $i++; + /** + * create_site + * + * @param array $config + * @param boolean $confirmed + * @return void + */ + public function create_site ($config = Array(), $confirmed = false) + { + $this->options = G::array_concat( Array ('isset' => false,'password' => G::generate_password( 12 ),'path_data' => @PATH_DATA,'path_compiled' => @PATH_C,'name' => $config['name'],'database' => Array (),'admin' => Array ('username' => 'admin','password' => 'admin' + ),'advanced' => Array ('ao_db_wf' => 'wf_' . $config['name'],'ao_db_rb' => 'rb_' . $config['name'],'ao_db_rp' => 'rp_' . $config['name'],'ao_db_drop' => false + ) + ), $config ); + $a = @explode( SYSTEM_HASH, G::decrypt( HASH_INSTALLATION, SYSTEM_HASH ) ); + $this->options['database'] = G::array_concat( Array ('username' => @$a[1],'password' => @$a[2],'hostname' => @$a[0] + ), $this->options['database'] ); + return ($confirmed === true) ? $this->make_site() : $this->create_site_test(); } - return $path; - } - - /** - * file_permisions - * - * @param string $file - * @param integer $def default value 777 - * @return integer $def - */ - public function file_permisions($file, $def = 777) - { - if ( PHP_OS == 'WINNT' ) - return $def; - else - return (int)substr(sprintf('%o',@fileperms($file)),-4); - } - /** - * is_dir_writable - * - * @param string $dir default value empty - * @return string $path - */ - public function is_dir_writable($dir = '') - { - if (PHP_OS=='WINNT') { - $dir = $this->find_root_path($dir); - return file_exists ( $dir ); + /** + * isset_site + * + * @param string $name Default value "workflow" + * @return string file_exists(PATH_DATA."sites/".$name); + */ + public function isset_site ($name = "workflow") + { + return file_exists( PATH_DATA . "sites/" . $name ); } - else { - $dir = $this->find_root_path($dir); - return (is_writable($dir) && is_readable($dir)); - } - } - /** - * getDirectoryFiles - * - * @param string $dir default value empty - * @return string $path - */ - public function getDirectoryFiles($dir,$extension){ - $filesArray=array(); - if (file_exists($dir)) { - if ($handle = opendir($dir)) { - while (false !== ($file = readdir($handle))) { - $fileParts=explode(".",$file); - if($fileParts[count($fileParts)-1]==$extension) { - $filesArray[]=$file; - } - } - closedir($handle); - } + /** + * create_site_test + * + * @return void + */ + private function create_site_test () + { + $name = (preg_match( '/^[\w]+$/i', trim( $this->options['name'] ) )) ? true : false; + $result = Array ('path_data' => $this->is_dir_writable( $this->options['path_data'] ),'path_compiled' => $this->is_dir_writable( $this->options['path_compiled'] ),'database' => $this->check_connection(),'access_level' => $this->cc_status,'isset' => ($this->options['isset'] == true) ? $this->isset_site( $this->options['name'] ) : false,'microtime' => microtime(),'workspace' => $this->options['name'],'name' => array ('status' => $name,'message' => ($name) ? 'PASSED' : 'Workspace name invalid' + ),'admin' => array ('username' => (preg_match( '/^[\w@\.-]+$/i', trim( $this->options['admin']['username'] ) )) ? true : false,'password' => ((trim( $this->options['admin']['password'] ) == '') ? false : true) + ) + ); + $result['name']['message'] = ($result['isset']) ? 'Workspace already exist' : $result['name']['message']; + $result['name']['status'] = ($result['isset']) ? false : $result['name']['status']; + //print_r($result); + return Array ('created' => G::var_compare( true, $result['path_data'], $result['database']['connection'], $result['name']['status'], $result['database']['version'], $result['database']['ao']['ao_db_wf']['status'], $result['database']['ao']['ao_db_rb']['status'], $result['database']['ao']['ao_db_rp']['status'], $result['admin']['username'], (($result['isset']) ? false : true), $result['admin']['password'] ),'result' => $result + ); } - return $filesArray; - } - /** - * check_db_empty - * - * @param string $dbName - * @return boolean true or false - */ - public function check_db_empty($dbName) - { - $a = @mysql_select_db($dbName,$this->connection_database); - if(!$a) { - return true; + /** + * make_site + * + * @return array $test + */ + private function make_site () + { + $test = $this->create_site_test(); + + if ($test["created"] == true || $this->options["advanced"]["ao_db_drop"] == true) { + /* Check if the hostname is local (localhost or 127.0.0.1) */ + $islocal = (strcmp( substr( $this->options['database']['hostname'], 0, strlen( 'localhost' ) ), 'localhost' ) === 0) || (strcmp( substr( $this->options['database']['hostname'], 0, strlen( '127.0.0.1' ) ), '127.0.0.1' ) === 0); + + $this->wf_site_name = $wf = $this->options['advanced']['ao_db_wf']; + + $this->rbac_site_name = $rb = $this->options['advanced']['ao_db_rb']; + $this->report_site_name = $rp = $this->options['advanced']['ao_db_rp']; + + $schema = "schema.sql"; + $values = "insert.sql"; + + if ($this->options['advanced']['ao_db_drop'] === true) { + //Delete workspace directory if exists + + + //Drop databases + $this->run_query( "DROP DATABASE IF EXISTS " . $wf, "Drop database $wf" ); + $this->run_query( "DROP DATABASE IF EXISTS " . $rb, "Drop database $rb" ); + $this->run_query( "DROP DATABASE IF EXISTS " . $rp, "Drop database $rp" ); + } + + $this->run_query( "CREATE DATABASE IF NOT EXISTS " . $wf . " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci", "Create database $wf" ); + $this->run_query( "CREATE DATABASE IF NOT EXISTS " . $rb . " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci", "Create database $rb" ); + $this->run_query( "CREATE DATABASE IF NOT EXISTS " . $rp . " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci", "Create database $rp" ); + + if ($this->cc_status == 1) { + $host = ($islocal) ? "localhost" : "%"; + $this->run_query( "GRANT ALL PRIVILEGES ON `$wf`.* TO $wf@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", "Grant privileges for user $wf on database $wf" ); + $this->run_query( "GRANT ALL PRIVILEGES ON `$rb`.* TO $rb@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", "Grant privileges for user $rb on database $rb" ); + $this->run_query( "GRANT ALL PRIVILEGES ON `$rp`.* TO $rp@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", "Grant privileges for user $rp on database $rp" ); + } + + /* Dump schema workflow && data */ + + $this->log( "Import database schema:\n" ); + $myPortA = explode( ":", $this->options['database']['hostname'] ); + if (count( $myPortA ) < 2) { + $myPortA[1] = "3306"; + } + $myPort = $myPortA[1]; + $this->options['database']['hostname'] = $myPortA[0]; + + mysql_select_db( $wf, $this->connection_database ); + $pws = PATH_WORKFLOW_MYSQL_DATA . $schema; + $qws = $this->query_sql_file( PATH_WORKFLOW_MYSQL_DATA . $schema, $this->connection_database ); + $this->log( $qws, isset( $qws['errors'] ) ); + $qwv = $this->query_sql_file( PATH_WORKFLOW_MYSQL_DATA . $values, $this->connection_database ); + $this->log( $qwv, isset( $qwv['errors'] ) ); + + /* Dump schema rbac && data */ + $pws = PATH_RBAC_MYSQL_DATA . $schema; + mysql_select_db( $rb, $this->connection_database ); + $qrs = $this->query_sql_file( PATH_RBAC_MYSQL_DATA . $schema, $this->connection_database ); + $this->log( $qrs, isset( $qrs['errors'] ) ); + $qrv = $this->query_sql_file( PATH_RBAC_MYSQL_DATA . $values, $this->connection_database ); + $this->log( $qrv, isset( $qrv['errors'] ) ); + + mysql_select_db( $wf, $this->connection_database ); + + require_once ("propel/Propel.php"); + require_once ('classes/model/AppCacheView.php'); + + $appCache = new AppCacheView(); + $appCache->setPathToAppCacheFiles( PATH_METHODS . 'setup/setupSchemas/' ); + $triggers = $appCache->getTriggers( "en" ); + $this->log( "Create 'cases list cache' triggers" ); + foreach ($triggers as $triggerName => $trigger) { + $this->run_query( $trigger, "-> Trigger $triggerName" ); + } + + $path_site = $this->options['path_data'] . "/sites/" . $this->options['name'] . "/"; + $db_file = $path_site . "db.php"; + @mkdir( $path_site, 0777, true ); + @mkdir( $path_site . "files/", 0777, true ); + @mkdir( $path_site . "mailTemplates/", 0777, true ); + @mkdir( $path_site . "public/", 0777, true ); + @mkdir( $path_site . "reports/", 0777, true ); + @mkdir( $path_site . "xmlForms", 0777, true ); + + $db_text = "options['database']['hostname'] . ":" . $myPort . "' );\n" . "define ('DB_NAME', '" . $wf . "' );\n" . "define ('DB_USER', '" . (($this->cc_status == 1) ? $wf : $this->options['database']['username']) . "' );\n" . "define ('DB_PASS', '" . (($this->cc_status == 1) ? $this->options['password'] : $this->options['database']['password']) . "' );\n" . "define ('DB_RBAC_HOST', '" . $this->options['database']['hostname'] . ":" . $myPort . "' );\n" . "define ('DB_RBAC_NAME', '" . $rb . "' );\n" . "define ('DB_RBAC_USER', '" . (($this->cc_status == 1) ? $rb : $this->options['database']['username']) . "' );\n" . "define ('DB_RBAC_PASS', '" . (($this->cc_status == 1) ? $this->options['password'] : $this->options['database']['password']) . "' );\n" . "define ('DB_REPORT_HOST', '" . $this->options['database']['hostname'] . ":" . $myPort . "' );\n" . "define ('DB_REPORT_NAME', '" . $rp . "' );\n" . "define ('DB_REPORT_USER', '" . (($this->cc_status == 1) ? $rp : $this->options['database']['username']) . "' );\n" . "define ('DB_REPORT_PASS', '" . (($this->cc_status == 1) ? $this->options['password'] : $this->options['database']['password']) . "' );\n" . "?>"; + $fp = @fopen( $db_file, "w" ); + $this->log( "Create: " . $db_file . " => " . ((! $fp) ? $fp : "OK") . "\n", $fp === FALSE ); + $ff = @fputs( $fp, $db_text, strlen( $db_text ) ); + $this->log( "Write: " . $db_file . " => " . ((! $ff) ? $ff : "OK") . "\n", $ff === FALSE ); + + fclose( $fp ); + $this->set_admin(); + } + return $test; } - $q = @mysql_query('SHOW TABLES',$this->connection_database); - return (@mysql_num_rows($q)>0)?false:true; - } - - /** - * check_db - * - * @param string $dbName - * @return Array Array('status' => true or false,'message' => string) - */ - public function check_db($dbName) - { - if(!$this->connection_database) { - //erik: new verification if the mysql extension is enabled - $error = class_exists('mysql_error') ? mysql_error() : 'Mysql Module for PHP is not enabled!'; - return Array('status' => false, 'message' => $error); + + /** + * set_admin + * + * @return void + */ + public function set_admin () + { + mysql_select_db( $this->wf_site_name, $this->connection_database ); + // The mysql_escape_string function has been DEPRECATED as of PHP 5.3.0. + // $this->run_query('UPDATE USERS SET USR_USERNAME = \''.mysql_escape_string($this->options['admin']['username']).'\', `USR_PASSWORD` = \''.md5($this->options['admin']['password']).'\' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', + // "Add 'admin' user in ProcessMaker (wf)"); + $this->run_query( 'UPDATE USERS SET USR_USERNAME = \'' . mysql_real_escape_string( $this->options['admin']['username'] ) . '\', ' . ' `USR_PASSWORD` = \'' . md5( $this->options['admin']['password'] ) . '\' ' . ' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', "Add 'admin' user in ProcessMaker (wf)" ); + mysql_select_db( $this->rbac_site_name, $this->connection_database ); + // The mysql_escape_string function has been DEPRECATED as of PHP 5.3.0. + // $this->run_query('UPDATE USERS SET USR_USERNAME = \''.mysql_escape_string($this->options['admin']['username']).'\', `USR_PASSWORD` = \''.md5($this->options['admin']['password']).'\' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', + // "Add 'admin' user in ProcessMaker (rb)"); + $this->run_query( 'UPDATE USERS SET USR_USERNAME = \'' . mysql_real_escape_string( $this->options['admin']['username'] ) . '\', ' . ' `USR_PASSWORD` = \'' . md5( $this->options['admin']['password'] ) . '\' ' . ' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', "Add 'admin' user in ProcessMaker (rb)" ); } - else { - if(!mysql_select_db($dbName,$this->connection_database) && $this->cc_status!=1) { - return Array('status' => false, 'message' => mysql_error()); - } - else { -/* var_dump($this->options['advanced']['ao_db_drop'],$this->cc_status,$this->check_db_empty($dbName)); + + /** + * Run a mysql query on the current database and take care of logging and + * error handling. + * + * @param string $query SQL command + * @param string $description Description to log instead of $query + */ + private function run_query ($query, $description = NULL) + { + $result = @mysql_query( $query, $this->connection_database ); + $error = ($result) ? false : mysql_error(); + $this->log( ($description ? $description : $query) . " => " . (($error) ? $error : "OK") . "\n", $error ); + } + + /** + * query_sql_file + * + * @param string $file + * @param string $connection + * @return array $report + */ + public function query_sql_file ($file, $connection) + { + $lines = file( $file ); + $previous = NULL; + $errors = ''; + @mysql_query( "SET NAMES 'utf8';" ); + foreach ($lines as $j => $line) { + $line = trim( $line ); // Remove comments from the script + + + if (strpos( $line, "--" ) === 0) { + $line = substr( $line, 0, strpos( $line, "--" ) ); + } + + if (empty( $line )) { + continue; + } + + if (strpos( $line, "#" ) === 0) { + $line = substr( $line, 0, strpos( $line, "#" ) ); + } + + if (empty( $line )) { + continue; + } + + // Concatenate the previous line, if any, with the current + if ($previous) { + $line = $previous . " " . $line; + } + $previous = NULL; + + // If the current line doesnt end with ; then put this line together + // with the next one, thus supporting multi-line statements. + if (strrpos( $line, ";" ) != strlen( $line ) - 1) { + $previous = $line; + continue; + } + + $line = substr( $line, 0, strrpos( $line, ";" ) ); + @mysql_query( $line, $connection ); + } + } + + /** + * check_path + * + * @return void + * @todo Empty function + */ + private function check_path () + { + + } + + /** + * function find_root_path + * + * @param string $path + * @return string $path + */ + private function find_root_path ($path) + { + $i = 0; //prevent loop inifinity + while (! is_dir( $path ) && ($path = dirname( $path )) && ((strlen( $path ) > 1) && $i < 10)) { + $i ++; + } + return $path; + } + + /** + * file_permisions + * + * @param string $file + * @param integer $def default value 777 + * @return integer $def + */ + public function file_permisions ($file, $def = 777) + { + if (PHP_OS == 'WINNT') + return $def; + else + return (int) substr( sprintf( '%o', @fileperms( $file ) ), - 4 ); + } + + /** + * is_dir_writable + * + * @param string $dir default value empty + * @return string $path + */ + public function is_dir_writable ($dir = '') + { + if (PHP_OS == 'WINNT') { + $dir = $this->find_root_path( $dir ); + return file_exists( $dir ); + } else { + $dir = $this->find_root_path( $dir ); + return (is_writable( $dir ) && is_readable( $dir )); + } + } + + /** + * getDirectoryFiles + * + * @param string $dir default value empty + * @return string $path + */ + public function getDirectoryFiles ($dir, $extension) + { + $filesArray = array (); + if (file_exists( $dir )) { + if ($handle = opendir( $dir )) { + while (false !== ($file = readdir( $handle ))) { + $fileParts = explode( ".", $file ); + if ($fileParts[count( $fileParts ) - 1] == $extension) { + $filesArray[] = $file; + } + } + closedir( $handle ); + } + } + return $filesArray; + } + + /** + * check_db_empty + * + * @param string $dbName + * @return boolean true or false + */ + public function check_db_empty ($dbName) + { + $a = @mysql_select_db( $dbName, $this->connection_database ); + if (! $a) { + return true; + } + $q = @mysql_query( 'SHOW TABLES', $this->connection_database ); + return (@mysql_num_rows( $q ) > 0) ? false : true; + } + + /** + * check_db + * + * @param string $dbName + * @return Array Array('status' => true or false,'message' => string) + */ + public function check_db ($dbName) + { + if (! $this->connection_database) { + //erik: new verification if the mysql extension is enabled + $error = class_exists( 'mysql_error' ) ? mysql_error() : 'Mysql Module for PHP is not enabled!'; + return Array ('status' => false,'message' => $error + ); + } else { + if (! mysql_select_db( $dbName, $this->connection_database ) && $this->cc_status != 1) { + return Array ('status' => false,'message' => mysql_error() + ); + } else { + /* var_dump($this->options['advanced']['ao_db_drop'],$this->cc_status,$this->check_db_empty($dbName)); if(($this->options['advanced']['ao_db_drop']===false && $this->cc_status!=1 && !$this->check_db_empty($dbName)) ) { return Array('status'=>false,'message'=>'Database is not empty'); @@ -482,107 +418,91 @@ class Installer { return Array('status'=>true,'message'=>'OK'); }*/ - if($this->options['advanced']['ao_db_drop']===true || $this->check_db_empty($dbName)) { - return Array('status' => true, 'message' => 'PASSED'); + if ($this->options['advanced']['ao_db_drop'] === true || $this->check_db_empty( $dbName )) { + return Array ('status' => true,'message' => 'PASSED' + ); + } else { + return Array ('status' => false,'message' => 'Database is not empty' + ); + } + } } - else { - return Array('status' => false, 'message' => 'Database is not empty'); - } - } } - } - - /** - * check_connection - * - * @return Array $rt - */ - private function check_connection() - { - if(!function_exists("mysql_connect")) { - $this->cc_status = 0; - $rt = Array( - 'connection' => false, - 'grant' => 0, - 'version' => false, - 'message' => "ERROR: Mysql Module for PHP is not enabled, try install php-mysql package.", - 'ao'=>Array( - 'ao_db_wf' => false, - 'ao_db_rb' => false, - 'ao_db_rp' => false - ) - ); - } - else { - $this->connection_database = @mysql_connect($this->options['database']['hostname'],$this->options['database']['username'],$this->options['database']['password']); - $rt = Array( - 'version' => false, - 'ao'=>Array( - 'ao_db_wf' => false, - 'ao_db_rb' => false, - 'ao_db_rp' => false + + /** + * check_connection + * + * @return Array $rt + */ + private function check_connection () + { + if (! function_exists( "mysql_connect" )) { + $this->cc_status = 0; + $rt = Array ('connection' => false,'grant' => 0,'version' => false,'message' => "ERROR: Mysql Module for PHP is not enabled, try install php-mysql package.",'ao' => Array ('ao_db_wf' => false,'ao_db_rb' => false,'ao_db_rp' => false ) - ); - if(!$this->connection_database) { - $this->cc_status = 0; - $rt['connection'] = false; - $rt['grant'] = 0; - $rt['message'] = "Mysql error: ".mysql_error(); - } - else { - preg_match('@[0-9]+\.[0-9]+\.[0-9]+@',mysql_get_server_info($this->connection_database),$version); - $rt['version'] = version_compare(@$version[0],"4.1.0",">="); - $rt['connection'] = true; + ); + } else { + $this->connection_database = @mysql_connect( $this->options['database']['hostname'], $this->options['database']['username'], $this->options['database']['password'] ); + $rt = Array ('version' => false,'ao' => Array ('ao_db_wf' => false,'ao_db_rb' => false,'ao_db_rp' => false + ) + ); + if (! $this->connection_database) { + $this->cc_status = 0; + $rt['connection'] = false; + $rt['grant'] = 0; + $rt['message'] = "Mysql error: " . mysql_error(); + } else { + preg_match( '@[0-9]+\.[0-9]+\.[0-9]+@', mysql_get_server_info( $this->connection_database ), $version ); + $rt['version'] = version_compare( @$version[0], "4.1.0", ">=" ); + $rt['connection'] = true; - $dbNameTest = "PROCESSMAKERTESTDC"; - $db = @mysql_query("CREATE DATABASE ".$dbNameTest,$this->connection_database); - if(!$db) { - $this->cc_status = 3; - $rt['grant'] = 3; - //$rt['message'] = "Db GRANTS error: ".mysql_error(); - $rt['message'] = "Successful connection"; + $dbNameTest = "PROCESSMAKERTESTDC"; + $db = @mysql_query( "CREATE DATABASE " . $dbNameTest, $this->connection_database ); + if (! $db) { + $this->cc_status = 3; + $rt['grant'] = 3; + //$rt['message'] = "Db GRANTS error: ".mysql_error(); + $rt['message'] = "Successful connection"; + } else { + + //@mysql_drop_db("processmaker_testGA"); + $usrTest = "wfrbtest"; + $chkG = "GRANT ALL PRIVILEGES ON `" . $dbNameTest . "`.* TO " . $usrTest . "@'%' IDENTIFIED BY 'sample' WITH GRANT OPTION"; + $ch = @mysql_query( $chkG, $this->connection_database ); + if (! $ch) { + $this->cc_status = 2; + $rt['grant'] = 2; + //$rt['message'] = "USER PRIVILEGES ERROR"; + $rt['message'] = "Successful connection"; + } else { + $this->cc_status = 1; + @mysql_query( "DROP USER " . $usrTest . "@'%'", $this->connection_database ); + $rt['grant'] = 1; + $rt['message'] = "Successful connection"; + } + @mysql_query( "DROP DATABASE " . $dbNameTest, $this->connection_database ); + + } + // var_dump($wf,$rb,$rp); + } } - else { - - //@mysql_drop_db("processmaker_testGA"); - $usrTest = "wfrbtest"; - $chkG = "GRANT ALL PRIVILEGES ON `".$dbNameTest."`.* TO ".$usrTest."@'%' IDENTIFIED BY 'sample' WITH GRANT OPTION"; - $ch = @mysql_query($chkG,$this->connection_database); - if(!$ch) { - $this->cc_status = 2; - $rt['grant'] = 2; - //$rt['message'] = "USER PRIVILEGES ERROR"; - $rt['message'] = "Successful connection"; - } - else { - $this->cc_status = 1; - @mysql_query("DROP USER ".$usrTest."@'%'",$this->connection_database); - $rt['grant'] = 1; - $rt['message'] = "Successful connection"; - } - @mysql_query("DROP DATABASE ".$dbNameTest,$this->connection_database); - - } -// var_dump($wf,$rb,$rp); - } + $rt['ao']['ao_db_wf'] = $this->check_db( $this->options['advanced']['ao_db_wf'] ); + $rt['ao']['ao_db_rb'] = $this->check_db( $this->options['advanced']['ao_db_rb'] ); + $rt['ao']['ao_db_rp'] = $this->check_db( $this->options['advanced']['ao_db_rp'] ); + return $rt; + } + + /** + * log + * + * @param string $text + * @return void + */ + public function log ($text, $failed = NULL) + { + array_push( $this->report, $text ); + if ($failed) + throw new Exception( is_string( $text ) ? $text : var_export( $text, true ) ); } - $rt['ao']['ao_db_wf'] = $this->check_db($this->options['advanced']['ao_db_wf']); - $rt['ao']['ao_db_rb'] = $this->check_db($this->options['advanced']['ao_db_rb']); - $rt['ao']['ao_db_rp'] = $this->check_db($this->options['advanced']['ao_db_rp']); - return $rt; - } - - /** - * log - * - * @param string $text - * @return void - */ - public function log($text, $failed = NULL) - { - array_push($this->report,$text); - if ($failed) - throw new Exception(is_string($text) ? $text : var_export($text, true)); - } } ?>