*/ global $translation; include PATH_LANGUAGECONT."translation.".SYS_LANG; class Installer extends Controller { public $path_config; public $path_languages; public $path_plugins; public $path_xmlforms; public $path_shared; public $path_sep; public $link; #resource for database connection public function __construct () { $this->path_config = PATH_CORE . 'config/'; $this->path_languages = PATH_CORE . 'content/languages/'; $this->path_plugins = PATH_CORE . 'plugins/'; $this->path_xmlforms = PATH_CORE . 'xmlform/'; $this->path_public = PATH_HOME . 'public_html/index.html'; $this->path_shared = PATH_TRUNK . 'shared/'; $this->path_sep = PATH_SEP; } public function index ($httpData) { $licenseContent = file_get_contents( PATH_TRUNK . 'LICENSE.txt' ); $this->includeExtJS( 'installer/CardLayout', false ); $this->includeExtJS( 'installer/Wizard', false ); $this->includeExtJS( 'installer/Header', false ); $this->includeExtJS( 'installer/Card', false ); $this->includeExtJS( 'installer/installer_cards' ); $this->includeExtJS( 'installer/main', false ); $this->setJSVar( 'licenseTxt', $licenseContent ); $this->setJSVar( 'path_config', $this->path_config ); $this->setJSVar( 'path_languages', $this->path_languages ); $this->setJSVar( 'path_plugins', $this->path_plugins ); $this->setJSVar( 'path_xmlforms', $this->path_xmlforms ); $this->setJSVar( 'path_public', $this->path_public ); $this->setJSVar( 'path_shared', $this->path_shared ); $this->setJSVar( 'path_sep', $this->path_sep ); $this->setView( 'installer/main' ); G::RenderPage( 'publish', 'extJs' ); } public function newSite () { $textStep1 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP4_1'); $textStep2 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP5'); $this->includeExtJS( 'installer/CardLayout', false ); $this->includeExtJS( 'installer/Wizard', false ); $this->includeExtJS( 'installer/Header', false ); $this->includeExtJS( 'installer/Card', false ); $this->includeExtJS( 'installer/newSite', false ); $this->setJSVar( 'textStep1', $textStep1 ); $this->setJSVar( 'textStep2', $textStep2 ); $this->setJSVar( 'DB_ADAPTER', DB_ADAPTER ); $aux = explode( ':', DB_HOST ); $this->setJSVar( 'DB_HOST', $aux[0] ); $this->setJSVar( 'DB_PORT', isset( $aux[1] ) ? $aux[1] : (DB_ADAPTER == 'mssql' ? '1433' : '3306') ); $this->setJSVar( 'DB_NAME', 'workflow' ); $this->setJSVar( 'DB_USER', '' ); $this->setJSVar( 'DB_PASS', '' ); $this->setJSVar( 'pathConfig', PATH_CORE . 'config' . PATH_SEP ); $this->setJSVar( 'pathLanguages', PATH_LANGUAGECONT ); $this->setJSVar( 'pathPlugins', PATH_PLUGINS ); $this->setJSVar( 'pathXmlforms', PATH_XMLFORM ); $this->setJSVar( 'pathShared', PATH_DATA ); $this->setView( 'installer/newSite' ); G::RenderPage( 'publish', 'extJs' ); } public function getSystemInfo () { //$echo ""; //print_r ($valu);die(); $this->setResponseType( 'json' ); // PHP info and verification $phpVer = phpversion(); preg_match( '/[0-9\.]+/', $phpVer, $match ); $phpVerNum = (float) $match[0]; $info = new stdclass(); $info->php = new stdclass(); $info->mysql = new stdclass(); $info->mssql = new stdclass(); $info->openssl = new stdclass(); $info->curl = new stdclass(); $info->dom = new stdclass(); $info->gd = new stdclass(); $info->multibyte = new stdclass(); $info->soap = new stdclass(); $info->ldap = new stdclass(); $info->memory = new stdclass(); $info->php->version = phpversion(); $info->php->result = version_compare(phpversion(), '5.2.10') >= 0 ? true : false; // MYSQL info and verification $info->mysql->result = false; if (function_exists( 'mysql_query' )) { $mysqlVer = mysql_get_client_info(); preg_match( '/[0-9\.]+/', $mysqlVer, $match ); $mysqlNum = (float) $match[0]; $info->mysql->version = 'Client API version ' . $mysqlVer; $info->mysql->result = $mysqlNum >= 5.0 ? true : false; } // MSSQL info and verification $info->mssql->result = false; $info->mssql->version = G::LoadTranslation('ID_NOT_ENABLED'); if (function_exists( 'mssql_query' )) { $info->mssql->result = true; $info->mssql->version = G::LoadTranslation('ID_ENABLED'); } // OpenSSL info $info->openssl->result = false; $info->openssl->version = G::LoadTranslation('ID_NOT_ENABLED'); if (function_exists( 'openssl_open' )) { $info->openssl->result = true; $info->openssl->version = G::LoadTranslation('ID_ENABLED'); } // Curl info $info->curl->result = false; $info->curl->version = G::LoadTranslation('ID_NOT_ENABLED'); if (function_exists( 'curl_version' )) { $info->curl->result = true; $version = curl_version(); $info->curl->version = 'cURL ' . $version['version']; $info->openssl->version = $version['ssl_version']; } // DOMDocument info $info->dom->result = false; $info->dom->version = G::LoadTranslation('ID_NOT_ENABLED'); if (class_exists( 'DOMDocument' )) { $info->dom->result = true; $info->dom->version = G::LoadTranslation('ID_ENABLED'); } // GD info $info->gd->result = false; $info->gd->version = G::LoadTranslation('ID_NOT_ENABLED'); if (function_exists( 'gd_info' )) { $info->gd->result = true; $gdinfo = gd_info(); $info->gd->version = $gdinfo['GD Version']; } // Multibyte info $info->multibyte->result = false; $info->multibyte->version = G::LoadTranslation('ID_NOT_ENABLED'); if (function_exists( 'mb_check_encoding' )) { $info->multibyte->result = true; $info->multibyte->version = G::LoadTranslation('ID_ENABLED'); } // soap info $info->soap->result = false; $info->soap->version = G::LoadTranslation('ID_NOT_ENABLED'); if (class_exists( 'SoapClient' )) { $info->soap->result = true; $info->soap->version = G::LoadTranslation('ID_ENABLED'); } // ldap info $info->ldap->result = false; $info->ldap->version = G::LoadTranslation('ID_NOT_ENABLED'); if (function_exists( 'ldap_connect' )) { $info->ldap->result = true; $info->ldap->version = G::LoadTranslation('ID_ENABLED'); } // memory limit verification $memory = (int) ini_get( "memory_limit" ); $info->memory->version = $memory . 'M'; if ($memory > 80) { $info->memory->result = true; } else { $info->memory->result = false; } return $info; } public function is_dir_writable ($path) { return G::is_writable_r( $path ); } public function getPermissionInfo () { $this->setResponseType( 'json' ); $info = new StdClass(); $info->success = true; $noWritableFiles = array (); // pathConfig $info->pathConfig = new stdclass(); $info->pathConfig->message = G::LoadTranslation('ID_INDEX_NOT_WRITEABLE'); $info->pathConfig->result = G::is_writable_r( $_REQUEST['pathConfig'], $noWritableFiles ); if ($info->pathConfig->result) { $info->pathConfig->message = G::LoadTranslation('ID_WRITEABLE'); } else { $info->success = false; } $info->pathLanguages = new stdclass(); $info->pathLanguages->message = G::LoadTranslation('ID_INDEX_NOT_WRITEABLE'); $info->pathLanguages->result = G::is_writable_r( $_REQUEST['pathLanguages'], $noWritableFiles ); if ($info->pathLanguages->result) { $info->pathLanguages->message = G::LoadTranslation('ID_WRITEABLE'); } else { $info->success = false; } $info->pathPlugins = new stdclass(); $info->pathPlugins->message = G::LoadTranslation('ID_INDEX_NOT_WRITEABLE'); $info->pathPlugins->result = G::is_writable_r( $_REQUEST['pathPlugins'], $noWritableFiles ); if ($info->pathPlugins->result) { $info->pathPlugins->message = G::LoadTranslation('ID_WRITEABLE'); } else { $info->success = false; } $info->pathXmlforms = new stdclass(); $info->pathXmlforms->message = G::LoadTranslation('ID_INDEX_NOT_WRITEABLE'); $info->pathXmlforms->result = G::is_writable_r( $_REQUEST['pathXmlforms'], $noWritableFiles ); if ($info->pathXmlforms->result) { $info->pathXmlforms->message = G::LoadTranslation('ID_WRITEABLE'); } else { $info->success = false; } $info->pathPublic = new stdclass(); $info->pathShared = new stdclass(); $info->pathPublic->message = G::LoadTranslation('ID_INDEX_NOT_WRITEABLE'); $info->pathPublic->result = G::is_writable_r( $_REQUEST['pathPublic'], $noWritableFiles ); if ($info->pathPublic->result) { $info->pathShared->message = G::LoadTranslation('ID_WRITEABLE'); } else { $info->success = false; } $info->pathShared->message = G::LoadTranslation('ID_INDEX_NOT_WRITEABLE'); $info->pathShared->result = G::is_writable_r( $_REQUEST['pathShared'], $noWritableFiles ); if ($info->pathShared->result) { $info->pathShared->message = G::LoadTranslation('ID_WRITEABLE'); } else { G::verifyPath( $_REQUEST['pathShared'], true ); $info->pathShared->result = G::is_writable_r( $_REQUEST['pathShared'], $noWritableFiles ); if ($info->pathShared->result) { $info->pathShared->message = G::LoadTranslation('ID_WRITEABLE'); } else { $info->success = false; } } if ($info->pathShared->result) { $aux = pathinfo( $_REQUEST['pathLogFile'] ); G::verifyPath( $aux['dirname'], true ); if (is_dir( $aux['dirname'] )) { if (! file_exists( $_REQUEST['pathLogFile'] )) { @file_put_contents( $_REQUEST['pathLogFile'], '' ); } } } $info->pathLogFile = new stdclass(); $info->pathLogFile->message = G::LoadTranslation('ID_CREATE_LOG_INSTALLATION'); $info->pathLogFile->result = file_exists( $_REQUEST['pathLogFile'] ); if ($info->pathLogFile->result) { $info->pathLogFile->message = G::LoadTranslation('ID_INSTALLATION_LOG'); } if ($info->success) { $info->notify = G::LoadTranslation('ID_SUCCESS_DIRECTORIES_WRITABLE'); } else { $info->notify = G::LoadTranslation('ID_DIRECTORIES_NOT_WRITABLE'); } $info->noWritableFiles = $noWritableFiles; return $info; } public function testConnection () { $this->setResponseType( 'json' ); if ($_REQUEST['db_engine'] == 'mysql') { return $this->testMySQLconnection(); } else { return $this->testMSSQLconnection(); } } /** * log the queries and other information to install.log, * the install.log files should be placed in shared/logs * for that reason we are using the $_REQUEST of pathShared */ public function installLog ($text) { $serverAddr = $_SERVER['SERVER_ADDR']; //if this function is called outside the createWorkspace, just returns and do nothing if (! isset( $_REQUEST['pathShared'] )) { return; } //log file is in shared/logs $pathShared = trim( $_REQUEST['pathShared'] ); if (substr( $pathShared, - 1 ) != '/') { $pathShared .= '/'; } $pathSharedLog = $pathShared . 'log/'; G::verifyPath($pathSharedLog, true); $logFile = $pathSharedLog . 'install.log'; if (! is_file( $logFile )) { G::mk_dir( dirname( $pathShared ) ); $fpt = fopen( $logFile, 'w' ); if ($fpt !== null) { fwrite( $fpt, sprintf( "%s %s\n", date( 'Y:m:d H:i:s' ), '----- '. G::LoadTranslation('ID_STARTING_LOG_FILE') .' ------' ) ); fclose( $fpt ); } else { throw (new Exception( G::LoadTranslation('ID_FILE_NOT_WRITEABLE', SYS_LANG, Array($logFile) ) )); return $false; } } $fpt = fopen( $logFile, 'a' ); fwrite( $fpt, sprintf( "%s %s\n", date( 'Y:m:d H:i:s' ), trim( $text ) ) ); fclose( $fpt ); return true; } /** * function to create a workspace * in fact this function is calling appropiate functions for mysql and mssql */ public function createWorkspace () { $pathSharedPartner = trim( $_REQUEST['pathShared'] ); if (file_exists($pathSharedPartner.'partner.info')) { $_REQUEST['PARTNER_FLAG'] = true; } $this->setResponseType( 'json' ); if ($_REQUEST['db_engine'] == 'mysql') { $info = $this->createMySQLWorkspace(); } else { $info = $this->createMSSQLWorkspace(); } return $info; } public function forceTogenerateTranslationsFiles ($url) { $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, (isset( $_SERVER['HTTPS'] ) ? ($_SERVER['HTTPS'] != '' ? 'https://' : 'http://') : 'http://') . $_SERVER['HTTP_HOST'] . '/js/ext/translation.en.js?r=' . rand( 1, 10000 ) ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_FRESH_CONNECT, 1 ); curl_setopt( $ch, CURLOPT_TIMEOUT, 60 ); curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 20 ); curl_exec( $ch ); curl_close( $ch ); } /** * send a query to MySQL and log the query */ public function mysqlQuery ($sql) { $this->installLog( $sql ); $query = @mysql_query( $sql, $this->link ); if (! $query) { $errorMessage = mysql_error( $this->link ); $this->installLog( G::LoadTranslation('ID_MYSQL_ERROR', SYS_LANG, Array($errorMessage) ) ); throw new Exception( $errorMessage ); return false; } @mysql_free_result( $query ); return true; } /** * send a query to MSSQL and log the query */ public function mssqlQuery ($sql) { $this->installLog( $sql ); $query = @mssql_query( $sql, $this->link ); if (! $query) { $errorMessage = mssql_get_last_message(); $this->installLog( G::LoadTranslation('ID_MYSQL_ERROR', SYS_LANG, Array($errorMessage) )); throw (new Exception( $errorMessage )); return false; } @mssql_free_result( $query ); return true; } /** * query_sql_file send many statements to server * * @param string $file * @param string $connection * @return array $report */ public function mysqlFileQuery ($file) { if (! is_file( $file )) { throw (new Exception( G::LoadTranslation('ID_SQL_FILE_INVALID', SYS_LANG, Array($file) ) )); return $false; } $this->installLog( G::LoadTranslation('ID_PROCESING', SYS_LANG, Array($file) )); $startTime = microtime( true ); // $content = file_get_contents($file); // $queries = explode(';', $content); // foreach( $queries as $sql) { // if (trim($sql) != '') { // $query = @mysql_query($sql, $this->link); // if (!$query) { // $errorMessage = mysql_error($this->link); // $this->installLog ( sprintf ( 'MySQL error: %s Query: %s ', $errorMessage, $sql ) ); // throw ( new Exception ( $errorMessage ) ); // return false; // } // } // } //erik: New Update, to support more complex queries $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, $this->link ); } $endTime = microtime( true ); $this->installLog( G::LoadTranslation('ID_FILE_PROCESSED', SYS_LANG, Array(basename( $file ), $endTime - $startTime )) ); return true; } /** * query_sql_file send many statements to server * * @param string $file * @param string $connection * @return array $report */ public function mssqlFileQuery ($file) { if (! is_file( $file )) { throw (new Exception( G::LoadTranslation('ID_SQL_FILE_INVALID', SYS_LANG, Array($file) ))); return $false; } $this->installLog( G::LoadTranslation('ID_PROCESING', SYS_LANG, Array($file) )); $startTime = microtime( true ); $content = file_get_contents( $file ); $queries = explode( ';', $content ); foreach ($queries as $sql) { $query = @mssql_query( $sql, $this->link ); if (! $query) { $errorMessage = mssql_get_last_message(); $this->installLog( G::LoadTranslation('ID_MYSQL_ERROR',SYS_LANG, Array( $errorMessage . G::LoadTranslation('ID_QUERY') .": ". $sql) )); throw (new Exception( $errorMessage )); return false; } } $endTime = microtime( true ); $this->installLog( G::LoadTranslation('ID_FILE_PROCESSED', SYS_LANG, Array(basename( $file ), $endTime - $startTime )) ); return true; } /** * set Grant Privileges for MySQL * * @param string $psUser * @param string $psPassword * @param string $psDatabase * @return void */ public function setGrantPrivilegesMySQL ($psUser, $psPassword, $psDatabase, $host) { $host = ($host == 'localhost' || $host == '127.0.0.1' ? 'localhost' : '%'); $query = sprintf( "GRANT ALL PRIVILEGES ON `%s`.* TO %s@'%s' IDENTIFIED BY '%s' WITH GRANT OPTION", $psDatabase, $psUser, $host, $psPassword ); $this->mysqlQuery( $query ); } /** * set Grant Privileges for SQLServer * * @param string $psUser * @param string $psPassword * @param string $psDatabase * @return void */ public function setGrantPrivilegesMSSQL ($psUser, $psPassword, $psDatabase) { $query = sprintf( "IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'%s') DROP LOGIN [%s]", $psUser, $psUser ); $this->mssqlQuery( $query ); $query = sprintf( "CREATE LOGIN [%s] WITH PASSWORD=N'%s', DEFAULT_DATABASE=[%s], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF ", $psUser, $psPassword, $psDatabase ); $this->mssqlQuery( $query ); $query = sprintf( "USE %s;", $psDatabase ); $this->mssqlQuery( $query ); $query = sprintf( "IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'%s') DROP USER [%s]", $psUser, $psUser ); $this->mssqlQuery( $query ); $query = sprintf( "CREATE USER %s FOR LOGIN %s;", $psUser, $psUser ); $this->mssqlQuery( $query ); $query = sprintf( "sp_addrolemember 'db_owner', '%s' ", $psUser ); $this->mssqlQuery( $query ); $query = sprintf( "sp_addrolemember 'db_ddladmin', '%s' ", $psUser ); $this->mssqlQuery( $query ); $query = sprintf( "sp_addrolemember 'db_accessadmin', '%s' ", $psUser ); $this->mssqlQuery( $query ); $query = sprintf( "use master " ); $this->mssqlQuery( $query ); return true; } public function createMySQLWorkspace () { ini_set( 'max_execution_time', '0' ); $info = new StdClass(); $info->result = false; $info->message = ''; $info->canRedirect = true; $db_hostname = trim( $_REQUEST['db_hostname'] ); $db_port = trim( $_REQUEST['db_port'] ); $db_username = trim( $_REQUEST['db_username'] ); $db_password = trim( $_REQUEST['db_password'] ); $wf = trim( $_REQUEST['wfDatabase'] ); $rb = trim( $_REQUEST['rbDatabase'] ); $rp = trim( $_REQUEST['rpDatabase'] ); $workspace = trim( $_REQUEST['workspace'] ); $pathConfig = trim( $_REQUEST['pathConfig'] ); $pathLanguages = trim( $_REQUEST['pathLanguages'] ); $pathPlugins = trim( $_REQUEST['pathPlugins'] ); $pathShared = trim( $_REQUEST['pathShared'] ); $pathXmlforms = trim( $_REQUEST['pathXmlforms'] ); $adminPassword = trim( $_REQUEST['adminPassword'] ); $adminUsername = trim( $_REQUEST['adminUsername'] ); $deleteDB = ($_REQUEST['deleteDB'] == 'true'); if (substr( $pathShared, - 1 ) != '/') { $pathShared .= '/'; } $this->installLog( '-------------------------------------------' ); $this->installLog( G::LoadTranslation('ID_CREATING_WORKSPACE', SYS_LANG, Array($workspace))); try { $db_host = ($db_port != '' && $db_port != 3306) ? $db_hostname . ':' . $db_port : $db_hostname; $this->link = @mysql_connect( $db_host, $db_username, $db_password ); $this->installLog( G::LoadTranslation('ID_CONNECT_TO_SERVER', SYS_LANG, Array($db_hostname, $db_port, $db_username ) )); if ($deleteDB) { $q = sprintf( 'DROP DATABASE IF EXISTS %s;', $wf, $wf ); $this->mysqlQuery( $q ); $q = sprintf( 'DROP DATABASE IF EXISTS %s;', $rb, $rb ); $this->mysqlQuery( $q ); $q = sprintf( 'DROP DATABASE IF EXISTS %s;', $rp, $rp ); $this->mysqlQuery( $q ); } // CREATE databases wf_workflow, rb_workflow and rp_workflow $q = sprintf( 'CREATE DATABASE IF NOT EXISTS %s;', $wf, $wf ); $this->mysqlQuery( $q ); $q = sprintf( 'CREATE DATABASE IF NOT EXISTS %s;', $rb, $rb ); $this->mysqlQuery( $q ); $q = sprintf( 'CREATE DATABASE IF NOT EXISTS %s;', $rp, $rp ); $this->mysqlQuery( $q ); // CREATE users and GRANT Privileges $wfPass = G::generate_password( 12 ); $rbPass = G::generate_password( 12 ); $rpPass = G::generate_password( 12 ); $this->setGrantPrivilegesMySQL( $wf, $wfPass, $wf, $db_hostname ); $this->setGrantPrivilegesMySQL( $rb, $rbPass, $rb, $db_hostname ); $this->setGrantPrivilegesMySQL( $rp, $rpPass, $rp, $db_hostname ); // Generate the db.php file and folders $pathSharedSites = $pathShared; $path_site = $pathShared . "/sites/" . $workspace . "/"; $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 ); $dbText = "getNameSystem($pathSharedSites); if ($systemName != '') { $dbText .= " define ('SYSTEM_NAME', " . $systemName . ");\n"; } } $this->installLog( G::LoadTranslation('ID_CREATING', SYS_LANG, Array($db_file) )); file_put_contents( $db_file, $dbText ); // Generate the databases.php file $databases_file = $path_site . 'databases.php'; $dbData = sprintf( "\$dbAdapter = '%s';\n", 'mysql' ); $dbData .= sprintf( "\$dbHost = '%s';\n", $db_host ); $dbData .= sprintf( "\$dbName = '%s';\n", $wf ); $dbData .= sprintf( "\$dbUser = '%s';\n", $wf ); $dbData .= sprintf( "\$dbPass = '%s';\n", $wfPass ); $dbData .= sprintf( "\$dbRbacHost = '%s';\n", $db_host ); $dbData .= sprintf( "\$dbRbacName = '%s';\n", $rb ); $dbData .= sprintf( "\$dbRbacUser = '%s';\n", $rb ); $dbData .= sprintf( "\$dbRbacPass = '%s';\n", $rbPass ); $dbData .= sprintf( "\$dbReportHost = '%s';\n", $db_host ); $dbData .= sprintf( "\$dbReportName = '%s';\n", $rp ); $dbData .= sprintf( "\$dbReportUser = '%s';\n", $rp ); $dbData .= sprintf( "\$dbReportPass = '%s';\n", $rpPass ); $databasesText = str_replace( '{dbData}', $dbData, @file_get_contents( PATH_HOME . 'engine/templates/installer/databases.tpl' ) ); $this->installLog( G::LoadTranslation('ID_CREATING', SYS_LANG, Array($databases_file) )); file_put_contents( $databases_file, $databasesText ); // Execute scripts to create and populates databases $query = sprintf( "USE %s;", $rb ); $this->mysqlQuery( $query ); $this->mysqlFileQuery( PATH_RBAC_HOME . 'engine/data/mysql/schema.sql' ); $this->mysqlFileQuery( PATH_RBAC_HOME . 'engine/data/mysql/insert.sql' ); $query = sprintf( "USE %s;", $wf ); $this->mysqlQuery( $query ); $this->mysqlFileQuery( PATH_HOME . 'engine/data/mysql/schema.sql' ); $this->mysqlFileQuery( PATH_HOME . 'engine/data/mysql/insert.sql' ); if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) { $this->setPartner(); $this->setConfiguration(); } // Create the triggers if (file_exists( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationInsert.sql' ) && file_exists( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationUpdate.sql' ) && file_exists( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationUpdate.sql' ) && file_exists( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationDelete.sql' ) && file_exists( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerContentUpdate.sql' )) { $this->mysqlQuery( @file_get_contents( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationInsert.sql' ) ); $this->mysqlQuery( @file_get_contents( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationUpdate.sql' ) ); $this->mysqlQuery( @file_get_contents( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationUpdate.sql' ) ); $this->mysqlQuery( @file_get_contents( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationDelete.sql' ) ); $this->mysqlQuery( @file_get_contents( PATH_HOME . 'engine/methods/setup/setupSchemas/triggerContentUpdate.sql' ) ); $this->mysqlQuery( "INSERT INTO `CONFIGURATION` ( `CFG_UID`, `CFG_VALUE` ) VALUES ( 'APP_CACHE_VIEW_ENGINE', '" . mysql_real_escape_string( serialize( array ('LANG' => 'en','STATUS' => 'active' ) ) ) . "' )" ); } // Change admin user $query = sprintf( "USE %s;", $wf ); $this->mysqlQuery( $query ); $query = sprintf( "UPDATE USERS SET USR_USERNAME = '%s', USR_PASSWORD = '%s' WHERE USR_UID = '00000000000000000000000000000001' ", $adminUsername, md5( $adminPassword ) ); $this->mysqlQuery( $query ); $query = sprintf( "USE %s;", $rb ); $this->mysqlQuery( $query ); $query = sprintf( "UPDATE USERS SET USR_USERNAME = '%s', USR_PASSWORD = '%s' WHERE USR_UID = '00000000000000000000000000000001' ", $adminUsername, md5( $adminPassword ) ); $this->mysqlQuery( $query ); // Write the paths_installed.php file (contains all the information configured so far) if (! file_exists( FILE_PATHS_INSTALLED )) { $sh = md5( filemtime( PATH_GULLIVER . '/class.g.php' ) ); $h = G::encrypt( $db_hostname . $sh . $db_username . $sh . $db_password, $sh ); $dbText = "installLog( G::LoadTranslation('ID_CREATING', SYS_LANG, Array(FILE_PATHS_INSTALLED) )); file_put_contents( FILE_PATHS_INSTALLED, $dbText ); } /** * AppCacheView Build */ define( 'HASH_INSTALLATION', $h ); define( 'SYSTEM_HASH', $sh ); define( 'PATH_DB', $pathShared . 'sites' . PATH_SEP ); define( 'SYS_SYS', $workspace ); require_once ("propel/Propel.php"); Propel::init( PATH_CORE . "config/databases.php" ); $con = Propel::getConnection( 'workflow' ); require_once ('classes/model/AppCacheView.php'); $lang = 'en'; //setup the appcacheview object, and the path for the sql files $appCache = new AppCacheView(); $appCache->setPathToAppCacheFiles( PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP ); //Update APP_DELEGATION.DEL_LAST_INDEX data $res = $appCache->updateAppDelegationDelLastIndex($lang, true); //APP_DELEGATION INSERT $res = $appCache->triggerAppDelegationInsert( $lang, true ); //APP_DELEGATION Update $res = $appCache->triggerAppDelegationUpdate( $lang, true ); //APPLICATION UPDATE $res = $appCache->triggerApplicationUpdate( $lang, true ); //APPLICATION DELETE $res = $appCache->triggerApplicationDelete( $lang, true ); //CONTENT UPDATE $res = $appCache->triggerContentUpdate( $lang, true ); //build using the method in AppCacheView Class $res = $appCache->fillAppCacheView( $lang ); //end AppCacheView Build //erik: for new env conf handling G::loadClass( 'system' ); $envFile = PATH_CONFIG . 'env.ini'; // getting configuration from env.ini $sysConf = System::getSystemConfiguration( $envFile ); $langUri = 'en'; if (isset($sysConf['default_lang'])) { $langUri = $sysConf['default_lang']; } $skinUri = 'classic'; if (isset($sysConf['default_skin'])) { $skinUri = $sysConf['default_skin']; } $updatedConf['default_lang'] = $langUri; $updatedConf['default_skin'] = $skinUri; $info->uri = PATH_SEP . 'sys' . $_REQUEST['workspace'] . PATH_SEP . $langUri . PATH_SEP . $skinUri . PATH_SEP . 'login' . PATH_SEP . 'login'; $indexFileUpdated = true; if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) { $this->buildParternExtras($adminUsername, $adminPassword, $_REQUEST['workspace'], $langUri); } else { try { G::update_php_ini( $envFile, $updatedConf ); } catch (Exception $e) { $info->result = false; $info->message = G::LoadTranslation('ID_PROCESSMAKER_WRITE_CONFIG_INDEX', SYS_LANG, Array($envFile)); $info->message .= G::LoadTranslation('ID_PROCESSMAKER_UI_NOT_INSTALL'); $this->installLog( G::LoadTranslation('ID_INSTALL_BUT_ERROR', SYS_LANG, Array('env.ini'))); return $info; } try { // update the main index file $indexFileUpdated = System::updateIndexFile(array('lang' => 'en','skin' => $updatedConf['default_skin'])); } catch (Exception $e) { $info->result = false; $info->message = G::LoadTranslation('ID_PROCESSMAKER_WRITE_CONFIG_INDEX', SYS_LANG, Array(PATH_HTML . "index.html.")); $info->message .= G::LoadTranslation('ID_PROCESSMAKER_UI_NOT_INSTALL'); $this->installLog( G::LoadTranslation('ID_INSTALL_BUT_ERROR', SYS_LANG, Array('index.html'))); return $info; } } $this->installLog( G::LoadTranslation('ID_INDEX_FILE_UPDATED', SYS_LANG, Array($indexFileUpdated, $sysConf['default_lang'],$sysConf['default_skin']))); $this->installLog( G::LoadTranslation('ID_INSTALL_SUCESS') ); $info->result = true; $info->message = G::LoadTranslation('ID_INSTALL_SUCESS'); $info->messageFinish = G::LoadTranslation('ID_PROCESSMAKER_SUCCESS_INSTALLED', SYS_LANG, Array($workspace));; } catch (Exception $e) { $info->canRedirect = false; $info->result = false; $info->message = $e->getMessage(); } return $info; } public function createMSSQLWorkspace () { ini_set( 'max_execution_time', '0' ); $info->result = false; $info->message = ''; $db_hostname = trim( $_REQUEST['db_hostname'] ); $db_port = trim( $_REQUEST['db_port'] ); $db_username = trim( $_REQUEST['db_username'] ); $db_password = trim( $_REQUEST['db_password'] ); $wf = trim( $_REQUEST['wfDatabase'] ); $rb = trim( $_REQUEST['rbDatabase'] ); $rp = trim( $_REQUEST['rpDatabase'] ); $workspace = trim( $_REQUEST['workspace'] ); $pathConfig = trim( $_REQUEST['pathConfig'] ); $pathLanguages = trim( $_REQUEST['pathLanguages'] ); $pathPlugins = trim( $_REQUEST['pathPlugins'] ); $pathShared = trim( $_REQUEST['pathShared'] ); $pathXmlforms = trim( $_REQUEST['pathXmlforms'] ); $adminPassword = trim( $_REQUEST['adminPassword'] ); $adminUsername = trim( $_REQUEST['adminUsername'] ); $deleteDB = ($_REQUEST['deleteDB'] == 'true'); if (substr( $pathShared, - 1 ) != '/') { $pathShared .= '/'; } $this->installLog( '-------------------------------------------' ); $this->installLog( G::LoadTranslation('ID_CREATING_WORKSPACE', SYS_LANG, Array($workspace) ) ); try { $db_host = ($db_port != '' && $db_port != 1433) ? $db_hostname . ':' . $db_port : $db_hostname; $this->link = @mssql_connect( $db_host, $db_username, $db_password ); $this->installLog( G::LoadTranslation('ID_CONNECT_TO_SERVER', SYS_LANG, Array( $db_hostname, $db_port, $db_username )) ); $this->mssqlQuery( 'USE [master]' ); // DROP databases wf_workflow, rb_workflow and rp_workflow if ($deleteDB) { $q = sprintf( "IF EXISTS (SELECT name FROM sys.databases WHERE name='%s' ) DROP DATABASE %s", $wf, $wf ); $this->mssqlQuery( $q ); $q = sprintf( "IF EXISTS (SELECT name FROM sys.databases WHERE name='%s' ) DROP DATABASE %s", $rb, $rb ); $this->mssqlQuery( $q ); $q = sprintf( "IF EXISTS (SELECT name FROM sys.databases WHERE name='%s' ) DROP DATABASE %s", $rp, $rp ); $this->mssqlQuery( $q ); } // CREATE databases wf_workflow, rb_workflow and rp_workflow $q = sprintf( "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name='%s' ) CREATE DATABASE %s", $wf, $wf ); $this->mssqlQuery( $q ); $q = sprintf( "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name='%s' ) CREATE DATABASE %s", $rb, $rb ); $this->mssqlQuery( $q ); $q = sprintf( "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name='%s' ) CREATE DATABASE %s", $rp, $rp ); $this->mssqlQuery( $q ); //CREATE users and GRANT Privileges $wfPass = G::generate_password( 12 ); $rbPass = G::generate_password( 12 ); $rpPass = G::generate_password( 12 ); $this->setGrantPrivilegesMSSQL( $wf, $wfPass, $wf ); $this->setGrantPrivilegesMSSQL( $rb, $rbPass, $rb ); $this->setGrantPrivilegesMSSQL( $rp, $rpPass, $rp ); //Generate the db.php file and folders $path_site = $pathShared . "/sites/" . $workspace . "/"; $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 ); $dbText = "getNameSystem($pathShared); if ($systemName != '') { $dbText .= " define ('SYSTEM_NAME', " . $systemName . ");\n"; } } $this->installLog( G::LoadTranslation('ID_CREATING', SYS_LANG, Array($db_file) )); file_put_contents( $db_file, $dbText ); // Generate the databases.php file $databases_file = $path_site . 'databases.php'; $dbData = sprintf( "\$dbAdapter = '%s';\n", 'mssql' ); $dbData .= sprintf( "\$dbHost = '%s';\n", $db_host ); $dbData .= sprintf( "\$dbName = '%s';\n", $wf ); $dbData .= sprintf( "\$dbUser = '%s';\n", $wf ); $dbData .= sprintf( "\$dbPass = '%s';\n", $wfPass ); $dbData .= sprintf( "\$dbRbacHost = '%s';\n", $db_host ); $dbData .= sprintf( "\$dbRbacName = '%s';\n", $rb ); $dbData .= sprintf( "\$dbRbacUser = '%s';\n", $rb ); $dbData .= sprintf( "\$dbRbacPass = '%s';\n", $rbPass ); $dbData .= sprintf( "\$dbReportHost = '%s';\n", $db_host ); $dbData .= sprintf( "\$dbReportName = '%s';\n", $rp ); $dbData .= sprintf( "\$dbReportUser = '%s';\n", $rp ); $dbData .= sprintf( "\$dbReportPass = '%s';\n", $rpPass ); $databasesText = str_replace( '{dbData}', $dbData, @file_get_contents( PATH_HOME . 'engine/templates/installer/databases.tpl' ) ); $this->installLog( G::LoadTranslation('ID_CREATING', SYS_LANG, Array($databases_file) )); file_put_contents( $databases_file, $databasesText ); //execute scripts to create and populates databases $query = sprintf( "USE %s;", $rb ); $this->mssqlQuery( $query ); $this->mssqlFileQuery( PATH_RBAC_HOME . 'engine/data/mssql/schema.sql' ); $this->mssqlFileQuery( PATH_RBAC_HOME . 'engine/data/mssql/insert.sql' ); $query = sprintf( "USE %s;", $wf ); $this->mssqlQuery( $query ); $this->mssqlFileQuery( PATH_HOME . 'engine/data/mssql/schema.sql' ); $this->mssqlFileQuery( PATH_HOME . 'engine/data/mssql/insert.sql' ); // Create the triggers if (file_exists( PATH_HOME . 'engine/plugins/enterprise/data/triggerAppDelegationInsert.sql' ) && file_exists( PATH_HOME . 'engine/plugins/enterprise/data/triggerAppDelegationUpdate.sql' ) && file_exists( PATH_HOME . 'engine/plugins/enterprise/data/triggerApplicationUpdate.sql' ) && file_exists( PATH_HOME . 'engine/plugins/enterprise/data/triggerApplicationDelete.sql' ) && file_exists( PATH_HOME . 'engine/plugins/enterprise/data/triggerContentUpdate.sql' )) { $this->mssqlQuery( @file_get_contents( PATH_HOME . 'engine/plugins/enterprise/data/triggerAppDelegationInsert.sql' ) ); $this->mssqlQuery( @file_get_contents( PATH_HOME . 'engine/plugins/enterprise/data/triggerAppDelegationUpdate.sql' ) ); $this->mssqlQuery( @file_get_contents( PATH_HOME . 'engine/plugins/enterprise/data/triggerApplicationUpdate.sql' ) ); $this->mssqlQuery( @file_get_contents( PATH_HOME . 'engine/plugins/enterprise/data/triggerApplicationDelete.sql' ) ); $this->mssqlQuery( @file_get_contents( PATH_HOME . 'engine/plugins/enterprise/data/triggerContentUpdate.sql' ) ); $this->mssqlQuery( "INSERT INTO CONFIGURATION ( CFG_UID, CFG_VALUE ) VALUES ( 'APP_CACHE_VIEW_ENGINE', '" . addslashes( serialize( array ('LANG' => 'en','STATUS' => 'active' ) ) ) . "' )" ); } //change admin user $query = sprintf( "USE %s;", $wf ); $this->mssqlQuery( $query ); $query = sprintf( "UPDATE USERS SET USR_USERNAME = '%s', USR_PASSWORD = '%s' WHERE USR_UID = '00000000000000000000000000000001' ", $adminUsername, md5( $adminPassword ) ); $this->mssqlQuery( $query ); $query = sprintf( "USE %s;", $rb ); $this->mssqlQuery( $query ); $query = sprintf( "UPDATE USERS SET USR_USERNAME = '%s', USR_PASSWORD = '%s' WHERE USR_UID = '00000000000000000000000000000001' ", $adminUsername, md5( $adminPassword ) ); $this->mssqlQuery( $query ); // Write the paths_installed.php file (contains all the information configured so far) if (! file_exists( FILE_PATHS_INSTALLED )) { $sh = md5( filemtime( PATH_GULLIVER . '/class.g.php' ) ); $h = G::encrypt( $db_hostname . $sh . $db_username . $sh . $db_password . '1', $sh ); $dbText = "installLog( G::LoadTranslation('ID_CREATING', SYS_LANG, Array(FILE_PATHS_INSTALLED) )); file_put_contents( FILE_PATHS_INSTALLED, $dbText ); } $this->installLog( G::LoadTranslation('ID_INSTALL_SUCESS') ); $info->result = true; $info->message = G::LoadTranslation('ID_INSTALL_SUCESS'); $info->url = '/sys' . $_REQUEST['workspace'] . '/en/classic/main/login'; $info->messageFinish = G::LoadTranslation('ID_PROCESSMAKER_SUCCESS_INSTALLED', SYS_LANG, Array($workspace));; } catch (Exception $e) { $info->result = false; $info->message = $e->getMessage(); } return $info; } public function getNameSystem ($siteShared = '') { $systemName = ''; error_log('PASE --------'); error_log($siteShared); if ($siteShared == '') { $siteShared = trim( $_REQUEST['pathShared'] ); } if (substr( $siteShared, - 1 ) != '/') { $siteShared .= '/'; } error_log('2 --------'); error_log($siteShared . 'partner.info'); if (file_exists($siteShared . 'partner.info')) { $dataInfo = parse_ini_file($siteShared . 'partner.info'); if (isset($dataInfo['system_name'])) { $systemName = trim($dataInfo['system_name']); } } return $systemName; } public function getEngines () { $this->setResponseType( 'json' ); $engines = array (); if (function_exists( 'mysql_query' )) { $engine = new stdclass(); $engine->id = 'mysql'; $engine->label = 'MySQL'; $engines[] = $engine; } /** * DISABLED TEMPORARELY * if (function_exists('mssql_query')) { * $engine = new stdclass(); * $engine->id = 'mssql'; * $engine->label = 'Microsoft SQL Server'; * $engines[] = $engine; * } */ return $engines; } public function checkDatabases () { $this->setResponseType( 'json' ); $info = new stdclass(); if ($_REQUEST['db_engine'] == 'mysql') { $link = @mysql_connect( $_REQUEST['db_hostname'], $_REQUEST['db_username'], $_REQUEST['db_password'] ); $dataset = @mysql_query( "show databases like '" . $_REQUEST['wfDatabase'] . "'", $link ); $info->wfDatabaseExists = (@mysql_num_rows( $dataset ) > 0); $dataset = @mysql_query( "show databases like '" . $_REQUEST['rbDatabase'] . "'", $link ); $info->rbDatabaseExists = (@mysql_num_rows( $dataset ) > 0); $dataset = @mysql_query( "show databases like '" . $_REQUEST['rpDatabase'] . "'", $link ); $info->rpDatabaseExists = (@mysql_num_rows( $dataset ) > 0); } else { $link = @mssql_connect( $_REQUEST['db_hostname'], $_REQUEST['db_username'], $_REQUEST['db_password'] ); $dataset = @mssql_query( "select * from sys.databases where name = '" . $_REQUEST['wfDatabase'] . "'", $link ); $info->wfDatabaseExists = (@mssql_num_rows( $dataset ) > 0); $dataset = @mssql_query( "select * from sys.databases where name = '" . $_REQUEST['rbDatabase'] . "'", $link ); $info->rbDatabaseExists = (@mssql_num_rows( $dataset ) > 0); $dataset = @mssql_query( "select * from sys.databases where name = '" . $_REQUEST['rpDatabase'] . "'", $link ); $info->rpDatabaseExists = (@mssql_num_rows( $dataset ) > 0); } $info->errMessage = G::LoadTranslation('ID_DATABASE_EXISTS_OVERWRITE'); return $info; } /** * Privates functions section, non callable by http request */ private function testMySQLconnection () { $info = new StdClass(); $info->result = false; $info->message = ''; if (! function_exists( "mysql_connect" )) { $info->message = G::LoadTranslation('ID_PHP_MYSQL_NOT _INSTALL'); return $info; } $db_hostname = $_REQUEST['db_hostname']; $db_port = $_REQUEST['db_port']; $db_username = $_REQUEST['db_username']; $db_password = $_REQUEST['db_password']; $fp = @fsockopen( $db_hostname, $db_port, $errno, $errstr, 30 ); if (! $fp) { $info->message .= G::LoadTranslation('ID_CONNECTION_ERROR', SYS_LANG, Array($errstr ($errno))); return $info; } $db_host = ($db_port != '' && $db_port != 1433) ? $db_hostname . ':' . $db_port : $db_hostname; $link = @mysql_connect( $db_host, $db_username, $db_password ); if (! $link) { $info->message .= G::LoadTranslation('ID_MYSQL_CREDENTIALS_WRONG'); return $info; } $res = @mysql_query( "SELECT * FROM `information_schema`.`USER_PRIVILEGES` where (GRANTEE = \"'$db_username'@'$db_hostname'\" OR GRANTEE = \"'$db_username'@'%'\") and PRIVILEGE_TYPE = 'SUPER' ", $link ); $row = @mysql_fetch_array( $res ); $hasSuper = is_array( $row ); @mysql_free_result( $res ); @mysql_close( $link ); if (! $hasSuper) { $info->message .= G::LoadTranslation('ID_CONNECTION_ERROR_PRIVILEGE', SYS_LANG, Array($db_username)); return $info; } $info->message .= G::LoadTranslation('ID_MYSQL_SUCCESS_CONNECT'); $info->result = true; return $info; } private function testMSSQLconnection () { $info->result = false; $info->message = ''; if (! function_exists( "mssql_connect" )) { $info->message = G::LoadTranslation('ID_PHP_MSSQL_NOT_INSTALLED'); return $info; } $db_hostname = $_REQUEST['db_hostname']; $db_port = $_REQUEST['db_port']; $db_username = $_REQUEST['db_username']; $db_password = $_REQUEST['db_password']; $fp = @fsockopen( $db_hostname, $db_port, $errno, $errstr, 30 ); if (! $fp) { $info->message .= G::LoadTranslation('ID_CONNECTION_ERROR', SYS_LANG, Array($errstr ($errno))); return $info; } $db_host = ($db_port != '' && $db_port != 1433) ? $db_hostname . ':' . $db_port : $db_hostname; $link = @mssql_connect( $db_host, $db_username, $db_password ); if (! $link) { $info->message .= G::LoadTranslation('ID_MYSQL_CREDENTIALS_WRONG'); return $info; } //checking if user has the dbcreator role $hasDbCreator = false; $hasSecurityAdmin = false; $hasSysAdmin = false; $res = @mssql_query( "EXEC sp_helpsrvrolemember 'dbcreator' ", $link ); $row = mssql_fetch_array( $res ); while (is_array( $row )) { if ($row['MemberName'] == $db_username) { $hasDbCreator = true; } $row = mssql_fetch_array( $res ); } mssql_free_result( $res ); $res = @mssql_query( "EXEC sp_helpsrvrolemember 'sysadmin' ", $link ); $row = mssql_fetch_array( $res ); while (is_array( $row )) { if ($row['MemberName'] == $db_username) { $hasSysAdmin = true; } $row = mssql_fetch_array( $res ); } mssql_free_result( $res ); $res = @mssql_query( "EXEC sp_helpsrvrolemember 'SecurityAdmin' ", $link ); $row = mssql_fetch_array( $res ); while (is_array( $row )) { if ($row['MemberName'] == $db_username) { $hasSecurityAdmin = true; } $row = mssql_fetch_array( $res ); } mssql_free_result( $res ); if (! ($hasSysAdmin || ($hasSecurityAdmin && $hasDbCreator))) { $info->message .= G::LoadTranslation('ID_CONNECTION_ERROR_SECURITYADMIN', SYS_LANG, Array($db_username) ); return $info; } $info->message .= G::LoadTranslation('ID_MSSQL_SUCCESS_CONNECT'); $info->result = true; return $info; } public function setPartner() { if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) { // Execute sql for partner $pathMysqlPartner = PATH_CORE . 'data' . PATH_SEP . 'partner' . PATH_SEP . 'mysql' . PATH_SEP; if (G::verifyPath($pathMysqlPartner)) { $res = array(); $filesSlq = glob($pathMysqlPartner . '*.sql'); foreach ($filesSlq as $value) { $this->mysqlFileQuery($value); } } // Execute to change of skin $pathSkinPartner = PATH_CORE . 'data' . PATH_SEP . 'partner' . PATH_SEP . 'skin' . PATH_SEP; if (G::verifyPath($pathSkinPartner)) { $res = array(); $fileTar = glob($pathSkinPartner . '*.tar'); foreach ($fileTar as $value) { $dataFile = pathinfo($value); $nameSkinTmp = $dataFile['filename']; G::LoadThirdParty( 'pear/Archive', 'Tar' ); $tar = new Archive_Tar( $value ); $pathSkinTmp = $pathSkinPartner . 'tmp' . PATH_SEP; G::rm_dir($pathSkinTmp); G::verifyPath($pathSkinTmp, true); chmod( $pathSkinTmp, 0777); $tar->extract($pathSkinTmp); $pathSkinName = $pathSkinTmp . $nameSkinTmp . PATH_SEP; chmod( $pathSkinName, 0777); G::verifyPath(PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp', true); $skinClassic = PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp' . PATH_SEP; if (is_dir($pathSkinName)) { $this->copyFile($pathSkinName, $skinClassic); } G::rm_dir(PATH_CORE . 'skinEngine' . PATH_SEP . 'base'); rename(PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp', PATH_CORE . 'skinEngine' . PATH_SEP . 'base'); G::rm_dir(PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp'); break; } } } } function copyFile($fromDir, $toDir, $chmod=0777) { $errors = array(); $messages = array(); if (!is_writable($toDir)) { $errors[]='target '.$toDir.' is not writable'; } if (!is_dir($toDir)) { $errors[]='target '.$toDir.' is not a directory'; } if (!is_dir($fromDir)) { $errors[]='source '.$fromDir.' is not a directory'; } if (!empty($errors)) { return false; } $exceptions = array ('.','..'); $handle = opendir($fromDir); while (false !== ($item=readdir($handle))) { if (!in_array($item,$exceptions)) { $from = str_replace('//','/',$fromDir.'/'.$item); $to = str_replace('//','/',$toDir.'/'.$item); if (is_file($from)) { if (@copy($from,$to)) { chmod($to,$chmod); touch($to,filemtime($from)); } } if (is_dir($from)) { if (@mkdir($to)) { chmod($to,$chmod); } $this->copyFile($from,$to,$chmod); } } } closedir($handle); } public function setConfiguration() { $query = <<mysqlQuery($query); } public function buildParternExtras($username, $password, $workspace, $lang) { ini_set('max_execution_time', '0'); ini_set('memory_limit', '256M'); $serv = 'http://'; if (isset($_SERVER['HTTPS']) && trim($_SERVER['HTTPS']) != '') { $serv = 'https://'; } $serv .= $_SERVER['SERVER_NAME']; if (isset($_SERVER['SERVER_PORT']) && trim($_SERVER['SERVER_PORT']) != '') { $serv .= ':' . $_SERVER['SERVER_PORT']; } // create session $cookiefile = sys_get_temp_dir() . PATH_SEP . 'curl-session'; $fp = fopen($cookiefile, "w"); fclose($fp); chmod($cookiefile, 0777); $user = urlencode($username); $pass = urlencode($password); $lang = urlencode($lang); $ch = curl_init(); // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/classic/login/authentication"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, "form[USR_USERNAME]=$user&form[USR_PASSWORD]=$pass&form[USER_LANG]=$lang"); curl_setopt($ch, CURLOPT_TIMEOUT, 90); $output = curl_exec($ch); curl_close($ch); /** * Upload translation .po file */ $ch = curl_init(); $postData = array(); // File to upload/post $postData['form[LANGUAGE_FILENAME]'] = "@".PATH_CORE."content/translations/processmaker.$lang.po"; curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/classic/setup/languages_Import"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_VERBOSE, 0); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 90); $output = curl_exec($ch); curl_close($ch); /** * Upload skin file */ $ch = curl_init(); $postData = array(); $skins = glob(PATH_CORE."data/partner/*.tar"); if (count($skins) > 0) { $skin = $skins[0]; $postData['overwrite_files'] = "on"; $postData['workspace'] = "global"; $postData['option'] = "standardupload"; $postData['action'] = "importSkin"; // File to upload/post $postData['uploadedFile'] = "@".$skin; curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/classic/setup/skin_Ajax"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_VERBOSE, 0); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 90); $output = curl_exec($ch); curl_close($ch); } /** * Upload plugin file */ $ch = curl_init(); $postData = array(); // resolv the plugin name $plugins = glob(PATH_CORE."plugins/*.tar"); if (count($plugins) > 0) { $pluginName = $plugins[0]; // File to upload/post $postData['form[PLUGIN_FILENAME]'] = "@{$pluginName}"; curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/classic/setup/pluginsImportFile"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_VERBOSE, 0); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 90); $output = curl_exec($ch); curl_close($ch); } } }