This commit is contained in:
Marco Antonio Nina Mena
2018-02-01 13:06:32 +00:00
committed by Paula Quispe
parent a67180b139
commit a50d3c5e5e
12 changed files with 1856 additions and 1570 deletions

View File

@@ -68,11 +68,11 @@ function lookup($target)
try {
switch ($driver) {
case 'mysql':
if ($link = mysqli_connect(DB_HOST, DB_USER, DB_PASS)) {
$v = mysqli_get_server_info($link);
} else {
throw new Exception(mysqli_error($link));
}
$results = \Illuminate\Support\Facades\DB::select(DB::raw("select version()"));
preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $results[0]->{'version()'}, $version);
$v = $version[0];
break;
}
return (isset($v))?$v:'none';

File diff suppressed because it is too large Load Diff

View File

@@ -1,83 +1,53 @@
<?php
/**
* class.database_base.php
*
* @package gulliver.system
*
* ProcessMaker Open Source Edition
* Copyright (C) 2004 - 2008 Colosa Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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/>.
*
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*
*/
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
/**
*
*
* Database Maintenance class
*
* author Erik A. Ortiz <erik@colosa.com, aortiz.erik@gmail.com>
* date May 17th, 2010
*
* @package gulliver.system
*/
class DataBaseMaintenance
{
private $host;
private $user;
private $passwd;
private $host = null;
private $user = null;
private $passwd = null;
private $link;
private $dbName;
private $connect = null;
private $dbName = null;
public $result;
protected $tmpDir;
protected $tmpDir = null;
protected $outfile;
protected $infile;
protected $isWindows;
/**
* __construct
* DataBaseMaintenance constructor.
*
* @param string $host is null
* @param string $user is null
* @param string $passwd is null
* @param string $host
* @param string $user
* @param string $passwd
*
* @return none
*/
public function __construct($host = null, $user = null, $passwd = null)
{
$this->tmpDir = './';
$this->link = null;
$this->dbName = null;
$this->setConnection(null);
$this->setDbName(null);
$this->isWindows = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
if (isset($host) && isset($user) && isset($passwd)) {
$this->host = $host;
$this->user = $user;
$this->passwd = $passwd;
}
$this->setUser($user);
$this->setHost($host);
$this->setPasswd($passwd);
}
/**
* setUser
*
* @param string $user
*
* @return none
*/
public function setUser($user)
{
@@ -85,11 +55,9 @@ class DataBaseMaintenance
}
/**
* setPasswd
* Set Password
*
* @param string $passwd
*
* @return none
*/
public function setPasswd($passwd)
{
@@ -97,11 +65,9 @@ class DataBaseMaintenance
}
/**
* setHost
* Set Host
*
* @param string $host
*
* @return none
*/
public function setHost($host)
{
@@ -109,11 +75,9 @@ class DataBaseMaintenance
}
/**
* setTempDir
* Set TempDir
*
* @param string $tmpDir
*
* @return none
*/
public function setTempDir($tmpDir)
{
@@ -124,7 +88,64 @@ class DataBaseMaintenance
}
/**
* getTempDir
* Set Db Name
*
* @param $dbName
*/
public function setDbName($dbName)
{
$this->dbName = $dbName;
}
/**
* Set Connection
*
* @param $name
*/
public function setConnection($name)
{
$this->connect = 'DB_' . $name;
}
/**
* Get User
* @return string
*/
public function getUser()
{
return $this->user;
}
/**
* Get Password
* @return string
*/
public function getPasswd()
{
return $this->passwd;
}
/**
* Get Host
* @return string
*/
public function getHost()
{
return $this->host;
}
/**
* Get Name Connection
*
* @return string
*/
public function getConnect()
{
return $this->connect;
}
/**
* get TempDir
*
* @return $this->tmpDir
*/
@@ -134,116 +155,74 @@ class DataBaseMaintenance
}
/**
* status
* Get Name DB
*
* @return $this->link
* @return string
*/
public function status()
public function getDbName()
{
return $$this->link;
return $this->dbName;
}
/**
* connect
* Connect to DB
*
* @param string $dbname is null
*
* @return none
*/
public function connect($dbname = null)
{
if ($this->link != null) {
mysqli_close($this->link);
$this->link = null;
}
if (isset($dbname)) {
$this->dbName = $dbname;
}
$this->link = mysqli_connect($this->host, $this->user, $this->passwd, $this->dbName);
if (!$this->link) {
throw new Exception("Couldn't connect to host {$this->host} with user {$this->user}");
}
mysqli_query($this->link, "SET NAMES 'utf8';");
mysqli_query($this->link, "SET FOREIGN_KEY_CHECKS=0;");
if ($this->dbName != null) {
$this->selectDataBase($this->dbName);
}
}
/**
* setDbName
*
* @param string $dbname is null
*
* @return none
*/
public function setDbName($dbname)
{
$this->dbName = $dbname;
}
/**
* selectDataBase
*
* @param string $dbname
* @param $dbname
* @param string $dbName
*
* @throws Exception
*/
public function selectDataBase($dbname)
public function connect($dbName)
{
$this->setDbName($dbname);
if (!mysqli_select_db($this->link, $this->dbName)) {
throw new Exception("Couldn't select database $dbname");
try {
$this->setConnection($dbName);
$this->setDbName($dbName);
InstallerModule::setNewConnection(
$this->getConnect(),
$this->getHost(),
$this->getUser(),
$this->getPasswd(),
$this->getDbName(),
'');
DB::connection($this->getConnect())
->statement("SET NAMES 'utf8'");
DB::connection($this->getConnect())
->statement('SET FOREIGN_KEY_CHECKS=0');
} catch (QueryException $exception) {
throw new Exception("Couldn't connect to host {$this->getHost()} with user {$this->getUser()}" . $exception->getMessage());
}
}
/**
* query
* Query
*
* @param string $sql
*
* @return $aRows
* @return array
* @throws Exception
*/
public function query($sql)
{
$this->result = mysqli_query($this->link, $sql);
if ($this->result) {
$aRows = [];
while ($aRow = mysqli_fetch_assoc($this->result)) {
$aRows[] = $aRow;
}
return $aRows;
} else {
return false;
try {
$result = DB::connection($this->getConnect())
->select($sql);
return $result;
} catch (QueryException $exception) {
throw new Exception("Couldn't connect to host {$this->getHost()} with user {$this->getUser()}" . $exception->getMessage());
}
}
/**
* error
*
* @return mysqli_error()
*/
public function error()
{
return mysqli_error($this->link);
}
/**
* getTablesList
* get Tables List
*
* @return array
* @throws Exception
*/
public function getTablesList()
{
$this->result = mysqli_query($this->link, 'SHOW TABLES;');
$rows = [];
while ($row = mysqli_fetch_row($this->result)) {
$rows[] = $row[0];
}
return $rows;
return $this->query('SHOW TABLES');
}
/**
@@ -255,25 +234,26 @@ class DataBaseMaintenance
*/
public function dumpData($table)
{
$this->outfile = $this->tmpDir . $table . '.dump';
try {
$this->outfile = $this->tmpDir . $table . '.dump';
//if the file exists delete it
if (is_file($this->outfile)) {
@unlink($this->outfile);
}
//if the file exists delete it
if (is_file($this->outfile)) {
@unlink($this->outfile);
}
$sql = "SELECT * INTO OUTFILE '{$this->outfile}' FIELDS TERMINATED BY '\t|\t' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\t\t\r\r\n' FROM $table";
// The mysql_escape_string function has been DEPRECATED as of PHP 5.3.0.
// Commented that is not assigned to a variable.
// mysql_escape_string("';");
if (!@mysqli_query($this->link, $sql)) {
$sql = "SELECT * INTO OUTFILE '{$this->outfile}' FIELDS TERMINATED BY '\t|\t' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\t\t\r\r\n' FROM $table";
DB::connection($this->getConnect())->raw($sql);
return true;
} catch (QueryException $exception) {
$ws = (!empty(config('system.workspace'))) ? config('system.workspace') : 'Undefined Workspace';
Bootstrap::registerMonolog('MysqlCron', 400, mysqli_error($this->link), ['sql' => $sql], $ws, 'processmaker.log');
$varRes = mysqli_error($this->link) . "\n";
Bootstrap::registerMonolog('MysqlCron', 400, $exception->getMessage(), ['sql' => $sql], $ws, 'processmaker.log');
$varRes = $exception->getMessage() . "\n";
G::outRes($varRes);
return false;
}
return true;
}
/**
@@ -285,16 +265,20 @@ class DataBaseMaintenance
*/
public function restoreData($backupFile)
{
$tableName = str_replace('.dump', '', basename($backupFile));
$sql = "LOAD DATA INFILE '$backupFile' INTO TABLE $tableName FIELDS TERMINATED BY '\t|\t' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\t\t\r\r\n'";
if (!@mysqli_query($this->link, $sql)) {
try {
$tableName = str_replace('.dump', '', basename($backupFile));
$sql = "LOAD DATA INFILE '$backupFile' INTO TABLE $tableName FIELDS TERMINATED BY '\t|\t' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\t\t\r\r\n'";
DB::connection($this->getConnect())->raw($sql);
return true;
} catch (QueryException $exception) {
$ws = (!empty(config("system.workspace"))) ? config("system.workspace") : "Wokspace Undefined";
Bootstrap::registerMonolog('MysqlCron', 400, mysqli_error($this->link), ['sql' => $sql], $ws, 'processmaker.log');
$varRes = mysqli_error($this->link) . "\n";
Bootstrap::registerMonolog('MysqlCron', 400, $exception->getMessage(), ['sql' => $sql], $ws, 'processmaker.log');
$varRes = $exception->getMessage() . "\n";
G::outRes($varRes);
return false;
}
return true;
}
/**
@@ -302,24 +286,22 @@ class DataBaseMaintenance
*
* @param string $type default value null
*
* @return none
* @throws Exception
*/
public function restoreAllData($type = null)
{
$aTables = $this->getTablesList();
foreach ($aTables as $table) {
if (isset($type) && $type == 'sql') {
$this->infile = $this->tmpDir . $table . ".sql";
foreach ($this->getTablesList() as $table) {
if (isset($type) && $type === 'sql') {
$this->infile = $this->tmpDir . $table . '.sql';
if (is_file($this->infile)) {
$queries = $this->restoreFromSql($this->infile, true);
if (!isset($queries)) {
$queries = "unknown";
$queries = 'unknown';
}
printf("%-59s%20s", "Restored table $table", "$queries queries\n");
}
} else {
$this->infile = $this->tmpDir . $table . ".dump";
$this->infile = $this->tmpDir . $table . '.dump';
if (is_file($this->infile)) {
$this->restoreData($this->infile);
printf("%20s %s %s\n", 'Restoring data from ', $this->infile, " in table $table");
@@ -329,63 +311,27 @@ class DataBaseMaintenance
}
/**
* createDb
* Create DB
*
* @param string $dbname
* @param string $drop default value false
* @param boolean $drop
*
* @return none
* @return bool
* @throws Exception
*/
public function createDb($dbname, $drop = false)
{
if ($drop) {
$sql = "DROP DATABASE IF EXISTS $dbname;";
if (!mysqli_query($this->link, $sql)) {
throw new Exception(mysqli_error($this->link));
try {
if ($drop) {
DB::connection($this->getConnect())->statement("DROP DATABASE IF EXISTS $dbname");
}
}
$sql = "CREATE DATABASE IF NOT EXISTS $dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
if (!mysqli_query($this->link, $sql)) {
throw new Exception(mysqli_error($this->link));
}
}
/**
* restoreFromSql2
*
* @param string $sqlfile
*
* @return none
*/
public function restoreFromSql2($sqlfile)
{
ini_set('memory_limit', '512M');
if (!is_file($sqlfile)) {
throw new Exception("the $sqlfile doesn't exist!");
}
$query = file_get_contents($sqlfile);
$mysqli = new mysqli($this->host, $this->user, $this->passwd, $this->dbName);
DB::connection($this->getConnect())->statement("CREATE DATABASE IF NOT EXISTS $dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
return true;
} catch (QueryException $exception) {
throw new Exception($exception->getMessage());
}
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
}
$result->free();
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
}
/**
@@ -397,36 +343,36 @@ class DataBaseMaintenance
*/
public function backupDataBase($outfile)
{
$password = escapeshellarg($this->passwd);
$password = escapeshellarg($this->getPasswd());
//On Windows, escapeshellarg() instead replaces percent signs, exclamation
//marks (delayed variable substitution) and double quotes with spaces and
//adds double quotes around the string.
//See: http://php.net/manual/en/function.escapeshellarg.php
if ($this->isWindows) {
$password = $this->escapeshellargCustom($this->passwd);
$password = $this->escapeshellargCustom($this->getPasswd());
}
$aHost = explode(':', $this->host);
$aHost = explode(':', $this->getHost());
$dbHost = $aHost[0];
if (isset($aHost[1])) {
$dbPort = $aHost[1];
$command = 'mysqldump'
. ' --user=' . $this->user
. ' --user=' . $this->getUser()
. ' --password=' . $password
. ' --host=' . $dbHost
. ' --port=' . $dbPort
. ' --opt'
. ' --skip-comments'
. ' ' . $this->dbName
. ' ' . $this->getDbName()
. ' > ' . $outfile;
} else {
$command = 'mysqldump'
. ' --host=' . $dbHost
. ' --user=' . $this->user
. ' --user=' . $this->getUser()
. ' --opt'
. ' --skip-comments'
. ' --password=' . $password
. ' ' . $this->dbName
. ' ' . $this->getDbName()
. ' > ' . $outfile;
}
shell_exec($command);
@@ -448,21 +394,21 @@ class DataBaseMaintenance
*/
private function escapeshellargCustom($string, $quotes = "")
{
if ($quotes === "") {
if ($quotes === '') {
$quotes = $this->isWindows ? "\"" : "'";
}
$n = strlen($string);
$special = ["!", "%", "\""];
$substring = "";
$substring = '';
$result1 = [];
$result2 = [];
for ($i = 0; $i < $n; $i++) {
if (in_array($string[$i], $special, true)) {
$result2[] = $string[$i];
$result1[] = $substring;
$substring = "";
$substring = '';
} else {
$substring = $substring . $string[$i];
$substring .= $string[$i];
}
}
$result1[] = $substring;
@@ -471,43 +417,47 @@ class DataBaseMaintenance
for ($i = 0; $i < $n; $i++) {
$result1[$i] = trim(escapeshellarg($result1[$i]), $quotes);
if (isset($result2[$i])) {
$result1[$i] = $result1[$i] . $result2[$i];
$result1[$i] .= $result2[$i];
}
}
//add simple quotes, see escapeshellarg function
$newString = $quotes . implode("", $result1) . $quotes;
$newString = $quotes . implode('', $result1) . $quotes;
return $newString;
}
/**
* restoreFromSql
* Restore from sql
*
* @param string $sqlfile
* @param string $sqlFile
* @param string $type
*
* @return boolean false or true
* @throws Exception
*/
public function restoreFromSql($sqlfile, $type = 'file')
public function restoreFromSql($sqlFile, $type = 'file')
{
ini_set('memory_limit', '64M');
if ($type == 'file' && !is_file($sqlfile)) {
throw new Exception("the $sqlfile doesn't exist!");
if ($type == 'file' && !is_file($sqlFile)) {
throw new Exception("the $sqlFile doesn't exist!");
}
$metaFile = str_replace('.sql', '.meta', $sqlfile);
$metaFile = str_replace('.sql', '.meta', $sqlFile);
$queries = 0;
if (is_file($metaFile)) {
echo "Using $metaFile as metadata.\n";
$fp = fopen($sqlfile, 'rb');
$fp = fopen($sqlFile, 'rb');
$fpmd = fopen($metaFile, 'r');
while ($offset = fgets($fpmd, 1024)) {
$buffer = intval($offset); //reading the size of $oData
$query = fread($fp, $buffer); //reading string $oData
$queries += 1;
$queries++;
if (!mysqli_query($this->link, $query)) {
$varRes = mysqli_error($this->link) . "\n";
try {
DB::connection($this->getConnect())->raw($query);
} catch (QueryException $exception) {
$varRes = $exception->getMessage() . "\n";
G::outRes($varRes);
$varRes = "==>" . $query . "<==\n";
G::outRes($varRes);
@@ -516,45 +466,25 @@ class DataBaseMaintenance
} else {
$queries = null;
try {
$mysqli = new mysqli($this->host, $this->user, $this->passwd, $this->dbName);
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($type === 'file') {
$query = file_get_contents($sqlfile);
$query = file_get_contents($sqlFile);
} elseif ($type === 'string') {
$query = $sqlfile;
$query = $sqlFile;
} else {
return false;
}
if (trim($query) == "") {
if (empty(trim($query))) {
return false;
}
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
//printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
//printf("-----------------\n");
}
} while ($mysqli->next_result());
} else {
throw new Exception(mysqli_error($mysqli));
try {
DB::connection($this->getConnect())->raw($query);
} catch (QueryException $exception) {
throw new Exception($exception->getMessage());
}
/* close connection */
$mysqli->close();
} catch (Exception $e) {
echo $query;
$token = strtotime("now");
@@ -574,19 +504,18 @@ class DataBaseMaintenance
*/
public function getSchemaFromTable($tablename)
{
//$tableSchema = "/* Structure for table `$tablename` */\n";
//$tableSchema .= "DROP TABLE IF EXISTS `$tablename`;\n\n";
$tableSchema = "";
$sql = "show create table `$tablename`; ";
$result = mysqli_query($this->link, $sql);
if ($result) {
if ($row = mysqli_fetch_assoc($result)) {
$tableSchema .= $row['Create Table'] . ";\n\n";
try {
$tableSchema = '';
$result = DB::connection($this->getConnect())->select("show create table `$tablename`");
if ($result) {
$tableSchema = $result['Create Table'] . ";\n\n";
}
mysqli_free_result($result);
} else {
G::outRes(mysqli_error($this->link));
} catch (QueryException $exception) {
G::outRes($exception->getMessage());
}
return $tableSchema;
}

View File

@@ -1,30 +1,6 @@
<?php
/**
* cliUpgrade.php
*
* ProcessMaker Open Source Edition
* Copyright (C) 2011 Colosa Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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/>.
*
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*
* @author Alexandre Rosenfeld <alexandre@colosa.com>
* @package workflow-engine-bin-tasks
*/
use Illuminate\Support\Facades\DB;
use ProcessMaker\Core\System;
CLI::taskName('upgrade');
@@ -296,25 +272,24 @@ function run_unify_database($args)
$metadata["version"] = 1;
list($dbHost, $dbUser, $dbPass) = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH));
$link = mysqli_connect($dbHost, $dbUser, $dbPass);
$connectionName = 'UPGRADE';
InstallerModule::setNewConnection($connectionName, $dbHost, $dbUser, $dbPass,'', '');
foreach ($metadata['databases'] as $db) {
$dbName = $metadata['DB_NAME'];
CLI::logging("+> Restoring {$db['name']} to $dbName database\n");
$aParameters = array('dbHost'=>$dbHost,'dbUser'=>$dbUser,'dbPass'=>$dbPass);
$aParameters = ['dbHost'=>$dbHost,'dbUser'=>$dbUser,'dbPass'=>$dbPass];
$restore = $workspace->executeScript($dbName, "$tempDirectory/{$db['name']}.sql", $aParameters, $link);
$restore = $workspace->executeScript($dbName, "$tempDirectory/{$db['name']}.sql", $aParameters, $connectionName);
if ($restore) {
CLI::logging("+> Remove {$db['name']} database\n");
$sql = "DROP DATABASE IF EXISTS {$db['name']};";
if (!mysqli_query($link, $sql)) {
throw new Exception(mysqli_error($link));
}
DB::connection($connectionName)->statement("DROP DATABASE IF EXISTS {$db['name']}");
}
}
DB::disconnect($connectionName);
CLI::logging("Removing temporary files\n");
G::rm_dir($tempDirectory);

View File

@@ -1,5 +1,7 @@
<?php
use Illuminate\Support\Facades\DB;
/**
* Class MultipleFilesBackup
* create a backup of this workspace
@@ -20,12 +22,12 @@ class MultipleFilesBackup
* @filename contains the path and filename of the comppress file(s).
* @size got the Max size of the compressed files, by default if the $size less to zero will mantains 1000 Mb as Max size.
*/
public function MultipleFilesBackup($filename, $size)
public function __construct($filename, $size)
{
if (!empty($filename)) {
$this->filename = $filename;
}
if (!empty($size) && (int) $size > 0) {
if (!empty($size) && (int)$size > 0) {
$this->fileSize = $size;
}
}
@@ -91,6 +93,7 @@ class MultipleFilesBackup
G::rm_dir($tempDirectory);
}
}
/* Restore from file(s) commpressed by letsBackup function, into a temporary directory
* @ filename got the name and path of the compressed file(s), if there are many files with file extention as a numerical series, the extention should be discriminated.
* @ srcWorkspace contains the workspace to be restored.
@@ -162,14 +165,14 @@ class MultipleFilesBackup
CLI::logging(CLI::warning("> Workspace $backupWorkspace found, but not restoring.") . "\n");
continue;
} else {
CLI::logging("> Restoring " . CLI::info($backupWorkspace) . " to " . CLI::info($workspaceName) . "\n");
CLI::logging('> Restoring ' . CLI::info($backupWorkspace) . ' to ' . CLI::info($workspaceName) . "\n");
}
$workspace = new WorkspaceTools($workspaceName);
if ($workspace->workspaceExists()) {
if ($overwrite) {
CLI::logging(CLI::warning("> Workspace $workspaceName already exist, overwriting!") . "\n");
} else {
throw new Exception("Destination workspace already exist (use -o to overwrite)");
throw new Exception('Destination workspace already exist (use -o to overwrite)');
}
}
if (file_exists($workspace->path)) {
@@ -196,31 +199,35 @@ class MultipleFilesBackup
list($dbHost, $dbUser, $dbPass) = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH));
CLI::logging("> Connecting to system database in '$dbHost'\n");
$link = mysqli_connect($dbHost, $dbUser, $dbPass);
mysqli_query($link, "SET NAMES 'utf8';");
mysqli_query($link, "SET FOREIGN_KEY_CHECKS=0;");
if (!$link) {
throw new Exception('Could not connect to system database: ' . mysqli_error($link));
try {
$connectionLestRestore = 'RESTORE';
InstallerModule::setNewConnection($connectionLestRestore, $dbHost, $dbUser, $dbPass, '', '');
DB::connection($connectionLestRestore)
->statement("SET NAMES 'utf8'");
DB::connection($connectionLestRestore)
->statement('SET FOREIGN_KEY_CHECKS=0');
} catch (Exception $exception) {
throw new Exception('Could not connect to system database: ' . $exception->getMessage());
}
$onedb = false;
if (strpos($metadata->DB_RBAC_NAME, 'rb_') === false) {
$onedb = true;
} else {
$onedb = false;
}
$newDBNames = $workspace->resetDBInfo($dbHost, $createWorkspace, $onedb);
$aParameters = array('dbHost' => $dbHost, 'dbUser' => $dbUser, 'dbPass' => $dbPass);
$aParameters = ['dbHost' => $dbHost, 'dbUser' => $dbUser, 'dbPass' => $dbPass];
foreach ($metadata->databases as $db) {
$dbName = $newDBNames[$db->name];
CLI::logging("+> Restoring database {$db->name} to $dbName\n");
$workspace->executeSQLScript($dbName, "$tempDirectory/{$db->name}.sql", $aParameters, 1, $link);
$workspace->createDBUser($dbName, $db->pass, "localhost", $dbName, $link);
$workspace->createDBUser($dbName, $db->pass, "%", $dbName, $link);
$workspace->executeSQLScript($dbName, "$tempDirectory/{$db->name}.sql", $aParameters, 1, $connectionLestRestore);
$workspace->createDBUser($dbName, $db->pass, "localhost", $dbName, $connectionLestRestore);
$workspace->createDBUser($dbName, $db->pass, "%", $dbName, $connectionLestRestore);
}
$workspace->upgradeCacheView(false);
mysqli_close($link);
}
CLI::logging("Removing temporary files\n");
G::rm_dir($tempDirectory);

View File

@@ -1,5 +1,7 @@
<?php
use Illuminate\Support\Facades\DB;
class Net
{
public $hostname;
@@ -223,30 +225,20 @@ class Net
if (isset($this->db_user) && (isset($this->db_passwd) || $this->db_passwd == "") && (isset($this->db_sourcename) || $flagTns == 1)) {
switch ($pDbDriver) {
case 'mysql':
// Note, we suppress warnings on the connection calls because we want to avoid displaying warning
// When utilizing this code in an API call. Otherwise it will return invalid JSON overall.
if ($this->db_passwd == '') {
$link = @mysqli_connect($this->ip . (($this->db_port != '') && ($this->db_port != 0) ? ':' . $this->db_port : ''), $this->db_user, $this->db_sourcename);
} else {
$link = @mysqli_connect($this->ip . (($this->db_port != '') && ($this->db_port != 0) ? ':' . $this->db_port : ''), $this->db_user, $this->db_passwd, $this->db_sourcename);
}
if ($link) {
if (mysqli_ping($link)) {
$stat->status = 'SUCCESS';
$this->errstr = "";
$this->errno = 0;
} else {
$this->error = "Lost MySql Connection";
$this->errstr = "NET::MYSQL->Lost Connection";
$this->errno = 10010;
}
} else {
$this->error = "MySql connection refused!";
$this->errstr = "NET::MYSQL->The connection was refused";
try {
InstallerModule::setNewConnection('NET', $this->ip, $this->db_user, $this->db_passwd, $this->db_sourcename, $this->db_port);
$stat->status = 'SUCCESS';
$this->errstr = '';
$this->errno = 0;
} catch (Exception $exception) {
$this->error = 'MySql connection refused!';
$this->errstr = 'NET::MYSQL->The connection was refused';
$this->errno = 10001;
}
break;
case 'pgsql':
//todo
$this->db_port = ($this->db_port == "") ? "5432" : $this->db_port;
$link = @pg_connect("host='$this->ip' port='$this->db_port' user='$this->db_user' password='$this->db_passwd' dbname='$this->db_sourcename'");
if ($link) {
@@ -260,6 +252,7 @@ class Net
}
break;
case 'mssql':
//todo
if ($this->db_instance != "") {
$str_port = "";
$link = @mssql_connect($this->ip . "\\" . $this->db_instance, $this->db_user, $this->db_passwd);
@@ -279,6 +272,7 @@ class Net
}
break;
case 'oracle':
//todo
try {
if ($flagTns == 0) {
$this->db_port = ($this->db_port == "" || $this->db_port == 0) ? "1521" : $this->db_port;
@@ -349,28 +343,23 @@ class Net
if (isset($this->db_user) && (isset($this->db_passwd) || $this->db_passwd == "") && (isset($this->db_sourcename) || $flagTns == 1)) {
switch ($pDbDriver) {
case 'mysql':
$link = mysqli_connect($this->ip . (($this->db_port !== '') && ($this->db_port !== 0) ? ':' . $this->db_port : ''), $this->db_user, $this->db_passwd, $this->db_sourcename);
$db = mysqli_select_db($link, $this->db_sourcename);
$this->error = 'MySql connection refused!';
$this->errstr = 'NET::MYSQL->The connection was refused';
$this->errno = 10001;
try {
$this->errstr = 'NET::MYSQL->The connection was refused';
$this->errno = 10001;
$connection = 'NET_' . $this->db_sourcename;
InstallerModule::setNewConnection($connection, $this->ip, $this->db_user, $this->db_passwd, $this->db_sourcename, $this->db_port);
if ($link) {
$this->error = 'The $this->db_sourcename data base does\'n exist!';
$this->errstr = 'NET::MYSQL->Select data base failed';
$this->errno = 10011;
if ($db) {
$result = mysqli_query($link, 'show tables;');
$this->error = 'the user $this->db_user doesn\'t have privileges to run queries!';
$this->errstr = 'NET::MYSQL->Test query failed';
$this->errno = 10100;
if ($result) {
$stat->status = 'SUCCESS';
$this->errstr = '';
$this->errno = 0;
mysqli_free_result($result);
}
$this->errstr = 'NET::MYSQL->Test query failed';
$this->errno = 10100;
$result = DB::connection($connection)->statement('show tables');
if ($result) {
$stat->status = 'SUCCESS';
$this->errstr = '';
$this->errno = 0;
}
} catch (Exception $exception) {
$this->error = $exception->getMessage();
}
break;
case 'pgsql':

View File

@@ -1,5 +1,7 @@
<?php
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use ProcessMaker\Core\Installer;
use ProcessMaker\Core\System;
use ProcessMaker\Util\FixReferencePath;
@@ -751,55 +753,51 @@ class WorkspaceTools
*/
public function getSchema($rbac = false)
{
$oDataBase = $this->getDatabase($rbac);
$database = $this->getDatabase($rbac);
$aOldSchema = [];
$oldSchema = [];
try {
$oDataBase->iFetchType = MYSQLI_NUM;
$oDataset1 = $oDataBase->executeQuery($oDataBase->generateShowTablesSQL());
$database->iFetchType = MYSQLI_NUM;
$result = $database->executeQuery($database->generateShowTablesSQL());
} catch (Exception $e) {
$oDataBase->logQuery($e->getmessage());
$database->logQuery($e->getmessage());
return null;
}
//going thru all tables in current WF_ database
while ($aRow1 = $oDataBase->getRegistry($oDataset1)) {
$aPrimaryKeys = [];
$sTable = strtoupper($aRow1[0]);
foreach ($result as $table) {
$table = strtoupper($table);
//get description of each table, ( column and primary keys )
//$oDataset2 = $oDataBase->executeQuery( $oDataBase->generateDescTableSQL($aRow1[0]) );
$oDataset2 = $oDataBase->executeQuery($oDataBase->generateDescTableSQL($sTable));
$aOldSchema[$sTable] = [];
$oDataBase->iFetchType = MYSQLI_ASSOC;
while ($aRow2 = $oDataBase->getRegistry($oDataset2)) {
$aOldSchema[$sTable][$aRow2['Field']]['Field'] = $aRow2['Field'];
$aOldSchema[$sTable][$aRow2['Field']]['Type'] = $aRow2['Type'];
$aOldSchema[$sTable][$aRow2['Field']]['Null'] = $aRow2['Null'];
$aOldSchema[$sTable][$aRow2['Field']]['Default'] = $aRow2['Default'];
$database->iFetchType = MYSQLI_ASSOC;
$description = $database->executeQuery($database->generateDescTableSQL($table));
$oldSchema[$table] = [];
foreach ($description as $field) {
$oldSchema[$table][$field['Field']]['Field'] = $field['Field'];
$oldSchema[$table][$field['Field']]['Type'] = $field['Type'];
$oldSchema[$table][$field['Field']]['Null'] = $field['Null'];
$oldSchema[$table][$field['Field']]['Default'] = $field['Default'];
}
//get indexes of each table SHOW INDEX FROM `ADDITIONAL_TABLES`; -- WHERE Key_name <> 'PRIMARY'
$oDataset2 = $oDataBase->executeQuery($oDataBase->generateTableIndexSQL($aRow1[0]));
$oDataBase->iFetchType = MYSQLI_ASSOC;
while ($aRow2 = $oDataBase->getRegistry($oDataset2)) {
if (!isset($aOldSchema[$sTable]['INDEXES'])) {
$aOldSchema[$sTable]['INDEXES'] = [];
$description = $database->executeQuery($database->generateTableIndexSQL($table));
foreach ($description as $field) {
if (!isset($oldSchema[$table]['INDEXES'])) {
$oldSchema[$table]['INDEXES'] = [];
}
if (!isset($aOldSchema[$sTable]['INDEXES'][$aRow2['Key_name']])) {
$aOldSchema[$sTable]['INDEXES'][$aRow2['Key_name']] = [];
if (!isset($oldSchema[$table]['INDEXES'][$field['Key_name']])) {
$oldSchema[$table]['INDEXES'][$field['Key_name']] = [];
}
$aOldSchema[$sTable]['INDEXES'][$aRow2['Key_name']][] = $aRow2['Column_name'];
$oldSchema[$table]['INDEXES'][$field['Key_name']][] = $field['Column_name'];
}
$oDataBase->iFetchType = MYSQLI_NUM; //this line is neccesary because the next fetch needs to be with MYSQLI_NUM
}
//finally return the array with old schema obtained from the Database
if (count($aOldSchema) === 0) {
$aOldSchema = null;
if (count($oldSchema) === 0) {
$oldSchema = null;
}
return $aOldSchema;
return $oldSchema;
}
/**
@@ -1154,14 +1152,14 @@ class WorkspaceTools
$this->setFormatRows();
$workspaceSchema = $this->getSchema($rbac);
$oDataBase = $this->getDatabase($rbac);
$database = $this->getDatabase($rbac);
if (!$onedb) {
if ($rbac) {
$rename = System::verifyRbacSchema($workspaceSchema);
if (count($rename) > 0) {
foreach ($rename as $tableName) {
$oDataBase->executeQuery($oDataBase->generateRenameTableSQL($tableName));
$database->executeQuery($database->generateRenameTableSQL($tableName));
}
}
}
@@ -1184,19 +1182,19 @@ class WorkspaceTools
}
}
$oDataBase->iFetchType = $this->num;
$database->iFetchType = $this->num;
$oDataBase->logQuery(count($changes));
$database->logQuery(count($changes));
if (!empty($changes['tablesToAdd'])) {
CLI::logging("-> " . count($changes['tablesToAdd']) . " tables to add\n");
}
foreach ($changes['tablesToAdd'] as $sTable => $aColumns) {
$oDataBase->executeQuery($oDataBase->generateCreateTableSQL($sTable, $aColumns));
$database->executeQuery($database->generateCreateTableSQL($sTable, $aColumns));
if (isset($changes['tablesToAdd'][$sTable]['INDEXES'])) {
foreach ($changes['tablesToAdd'][$sTable]['INDEXES'] as $indexName => $aIndex) {
$oDataBase->executeQuery($oDataBase->generateAddKeysSQL($sTable, $indexName, $aIndex));
$database->executeQuery($database->generateAddKeysSQL($sTable, $indexName, $aIndex));
}
}
}
@@ -1210,17 +1208,17 @@ class WorkspaceTools
foreach ($aAction as $sColumn => $vData) {
switch ($sAction) {
case 'DROP':
$oDataBase->executeQuery($oDataBase->generateDropColumnSQL($sTable, $vData));
$database->executeQuery($database->generateDropColumnSQL($sTable, $vData));
break;
case 'ADD':
if ($oDataBase->checkPatchHor1787($sTable, $sColumn, $vData)) {
$oDataBase->executeQuery($oDataBase->generateCheckAddColumnSQL($sTable, $sColumn, $vData));
$oDataBase->executeQuery($oDataBase->deleteAllIndexesIntable($sTable, $sColumn, $vData));
if ($database->checkPatchHor1787($sTable, $sColumn, $vData)) {
$database->executeQuery($database->generateCheckAddColumnSQL($sTable, $sColumn, $vData));
$database->executeQuery($database->deleteAllIndexesIntable($sTable, $sColumn, $vData));
}
$oDataBase->executeQuery($oDataBase->generateAddColumnSQL($sTable, $sColumn, $vData));
$database->executeQuery($database->generateAddColumnSQL($sTable, $sColumn, $vData));
break;
case 'CHANGE':
$oDataBase->executeQuery($oDataBase->generateChangeColumnSQL($sTable, $sColumn, $vData));
$database->executeQuery($database->generateChangeColumnSQL($sTable, $sColumn, $vData));
break;
}
}
@@ -1232,7 +1230,7 @@ class WorkspaceTools
}
foreach ($changes['tablesWithNewIndex'] as $sTable => $aIndexes) {
foreach ($aIndexes as $sIndexName => $aIndexFields) {
$oDataBase->executeQuery($oDataBase->generateAddKeysSQL($sTable, $sIndexName, $aIndexFields));
$database->executeQuery($database->generateAddKeysSQL($sTable, $sIndexName, $aIndexFields));
}
}
@@ -1241,8 +1239,8 @@ class WorkspaceTools
}
foreach ($changes['tablesToAlterIndex'] as $sTable => $aIndexes) {
foreach ($aIndexes as $sIndexName => $aIndexFields) {
$oDataBase->executeQuery($oDataBase->generateDropKeySQL($sTable, $sIndexName));
$oDataBase->executeQuery($oDataBase->generateAddKeysSQL($sTable, $sIndexName, $aIndexFields));
$database->executeQuery($database->generateDropKeySQL($sTable, $sIndexName));
$database->executeQuery($database->generateAddKeysSQL($sTable, $sIndexName, $aIndexFields));
}
}
$this->closeDatabase();
@@ -1288,7 +1286,7 @@ class WorkspaceTools
case 4:
$sql = $dataBase->generateSelectSQL($data['table'], $data['keys'], $data['data']);
$dataset = $dataBase->executeQuery($sql);
if ($dataBase->getRegistry($dataset)) {
if ($dataset) {
$sql = $dataBase->generateDeleteSQL($data['table'], $data['keys'], $data['data']);
$dataBase->executeQuery($sql);
}
@@ -1414,31 +1412,31 @@ class WorkspaceTools
/**
* exports this workspace database to the specified path
*
* This function is used mainly for backup purposes.
*
* @param string $path the directory where to create the sql files
* @param boolean $onedb
*
* @return array
* @throws Exception
*/
public function exportDatabase($path, $onedb = false)
{
$dbInfo = $this->getDBInfo();
$databases = ['wf', 'rp', 'rb'];
if ($onedb) {
$databases = array("rb", "rp");
} elseif ($dbInfo['DB_NAME'] == $dbInfo['DB_RBAC_NAME']) {
$databases = array("wf");
} else {
$databases = array("wf", "rp", "rb");
$databases = ['rb', 'rp'];
} else if ($dbInfo['DB_NAME'] === $dbInfo['DB_RBAC_NAME']) {
$databases = ['wf'];
}
$dbNames = [];
foreach ($databases as $db) {
$dbInfo = $this->getDBCredentials($db);
$oDbMaintainer = new DataBaseMaintenance($dbInfo["host"], $dbInfo["user"], $dbInfo["pass"]);
CLI::logging("Saving database {$dbInfo["name"]}\n");
$oDbMaintainer->connect($dbInfo["name"]);
$oDbMaintainer->setTempDir($path . "/");
$oDbMaintainer->backupDataBase($oDbMaintainer->getTempDir() . $dbInfo["name"] . ".sql");
$oDbMaintainer = new DataBaseMaintenance($dbInfo['host'], $dbInfo['user'], $dbInfo['pass']);
CLI::logging("Saving database {$dbInfo['name']}\n");
$oDbMaintainer->connect($dbInfo['name']);
$oDbMaintainer->setTempDir($path . '/');
$oDbMaintainer->backupDataBase($oDbMaintainer->getTempDir() . $dbInfo['name'] . '.sql');
$dbNames[] = $dbInfo;
}
return $dbNames;
@@ -1548,29 +1546,29 @@ class WorkspaceTools
* @param string $password password
* @param string $hostname the hostname the user will be connecting from
* @param string $database the database to grant permissions
* @param string $connection name
*
* @throws Exception
*/
public function createDBUser($username, $password, $hostname, $database, $connection = null)
public function createDBUser($username, $password, $hostname, $database, $connection)
{
mysqli_select_db($connection, 'mysql');
$hosts = explode(':', $hostname);
$hostname = array_shift($hosts);
try {
$message = 'Unable to retrieve users: ';
$hosts = explode(':', $hostname);
$hostname = array_shift($hosts);
$sqlstmt = "SELECT * FROM user WHERE user = '$username' AND host = '$hostname'";
$result = mysqli_query($connection, $sqlstmt);
if ($result === false) {
throw new Exception('Unable to retrieve users: ' . mysqli_error($connection));
}
$users = mysqli_num_rows($result);
if ($users === 0) {
CLI::logging("Creating user $username for $hostname\n");
$result = mysqli_query($connection, "CREATE USER '$username'@'$hostname' IDENTIFIED BY '$password'");
if ($result === false) {
throw new Exception("Unable to create user $username: " . mysqli_error($connection));
$result = DB::connection($connection)->select(DB::raw("SELECT * FROM mysql.user WHERE user = '$username' AND host = '$hostname'"));
if (count($result) === 0) {
$message = "Unable to create user $username: ";
CLI::logging("Creating user $username for $hostname\n");
DB::connection($connection)->statement("CREATE USER '$username'@'$hostname' IDENTIFIED BY '$password'");
}
}
$result = mysqli_query($connection, "GRANT ALL ON $database.* TO '$username'@'$hostname'");
if ($result === false) {
throw new Exception("Unable to grant priviledges to user $username: " . mysqli_error($connection));
$message = "Unable to grant priviledges to user $username: ";
DB::connection($connection)->statement("GRANT ALL ON $database.* TO '$username'@'$hostname'");
} catch (QueryException $exception) {
throw new Exception($message . $exception->getMessage());
}
}
@@ -1596,19 +1594,20 @@ class WorkspaceTools
* @param string $database the database to execute this script into
* @param $parameters
* @param int $versionBackupEngine
* @param object $connection
* @param string $connection
*/
public function executeSQLScript($database, $filename, $parameters, $versionBackupEngine = 1, $connection = null)
public function executeSQLScript($database, $filename, $parameters, $versionBackupEngine = 1, $connection)
{
mysqli_query($connection, 'CREATE DATABASE IF NOT EXISTS ' . mysqli_real_escape_string($connection, $database));
DB::connection($connection)
->statement('CREATE DATABASE IF NOT EXISTS ' . $database);
//check function shell_exec
$disabled_functions = ini_get('disable_functions');
$flag = false;
if ($disabled_functions != '') {
if (!empty($disabled_functions)) {
$arr = explode(',', $disabled_functions);
sort($arr);
if (in_array("shell_exec", $arr)) {
if (in_array('shell_exec', $arr)) {
$flag = true;
}
}
@@ -1619,8 +1618,8 @@ class WorkspaceTools
$flagFunction = shell_exec('mysql --version');
}
$arrayRegExpEngineSearch = array("/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i", "/SET\s*FOREIGN_KEY_CHECKS\s*=\s*0\s*;/");
$arrayRegExpEngineReplace = array(") ENGINE=\\1 DEFAULT CHARSET=utf8", ") ENGINE=\\1", "SET FOREIGN_KEY_CHECKS=0;\nSET unique_checks=0;\nSET AUTOCOMMIT=0;");
$arrayRegExpEngineSearch = ["/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i", "/SET\s*FOREIGN_KEY_CHECKS\s*=\s*0\s*;/"];
$arrayRegExpEngineReplace = [") ENGINE=\\1 DEFAULT CHARSET=utf8", ") ENGINE=\\1", "SET FOREIGN_KEY_CHECKS=0;\nSET unique_checks=0;\nSET AUTOCOMMIT=0;"];
//replace DEFINER
$script = preg_replace('/DEFINER=[^*]*/', '', file_get_contents($filename));
@@ -1632,8 +1631,8 @@ class WorkspaceTools
$script = preg_replace($arrayRegExpEngineSearch, $arrayRegExpEngineReplace, file_get_contents($filename));
file_put_contents($filename, $script . "\nCOMMIT;");
} else {
$arrayRegExpEngineSearch = array("/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i");
$arrayRegExpEngineReplace = array(") ENGINE=\\1 DEFAULT CHARSET=utf8", ") ENGINE=\\1");
$arrayRegExpEngineSearch = ["/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i"];
$arrayRegExpEngineReplace = [") ENGINE=\\1 DEFAULT CHARSET=utf8", ") ENGINE=\\1"];
$script = preg_replace($arrayRegExpEngineSearch, $arrayRegExpEngineReplace, file_get_contents($filename));
file_put_contents($filename, $script);
}
@@ -1647,7 +1646,7 @@ class WorkspaceTools
. ' --port=' . $dbPort
. ' --user=' . $parameters['dbUser']
. ' --password=' . escapeshellarg($parameters['dbPass'])
. ' --database=' . mysqli_real_escape_string($connection, $database)
. ' --database=' . $database
. ' --default_character_set utf8'
. ' --execute="SOURCE ' . $filename . '"';
} else {
@@ -1655,7 +1654,7 @@ class WorkspaceTools
. ' --host=' . $dbHost
. ' --user=' . $parameters['dbUser']
. ' --password=' . escapeshellarg($parameters['dbPass'])
. ' --database=' . mysqli_real_escape_string($connection, $database)
. ' --database=' . $database
. ' --default_character_set utf8'
. ' --execute="SOURCE ' . $filename . '"';
}
@@ -1663,7 +1662,8 @@ class WorkspaceTools
} else {
//If the safe mode of the server is actived
try {
mysqli_select_db($connection, $database);
$connection = 'RESTORE_' . $database;
InstallerModule::setNewConnection($connection, $parameters['dbHost'], $parameters['dbUser'], $parameters['dbPass'], $database, '');
//Replace TYPE by ENGINE
$script = preg_replace($arrayRegExpEngineSearch, $arrayRegExpEngineReplace, file_get_contents($filename));
@@ -1677,51 +1677,55 @@ class WorkspaceTools
foreach ($lines as $j => $line) {
// Remove comments from the script
$line = trim($line);
if (strpos($line, "--") === 0) {
$line = substr($line, 0, strpos($line, "--"));
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;
$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) {
if (strrpos($line, ';') !== strlen($line) - 1) {
$previous = $line;
continue;
}
$line = substr($line, 0, strrpos($line, ";"));
$line = substr($line, 0, strrpos($line, ';'));
if (strrpos($line, "INSERT INTO") !== false) {
if (strrpos($line, 'INSERT INTO') !== false) {
$insert = true;
if ($insert) {
$result = mysqli_query($connection, "START TRANSACTION");
DB::connection($connection)->beginTransaction();
$insert = false;
}
$result = mysqli_query($connection, $line);
$result = DB::connection($connection)->statement($line);
continue;
} else {
if (!$insert) {
$result = mysqli_query($connection, "COMMIT");
DB::connection($connection)->commitTransaction();
$insert = true;
}
}
$result = mysqli_query($connection, $line);
$result = DB::connection($connection)->statement($line);
if ($result === false) {
throw new Exception("Error when running script '$filename', line $j, query '$line': " . mysqli_error($connection));
DB::connection($connection)->rollbackTransaction();
throw new Exception("Error when running script '$filename', line $j, query '$line' ");
}
}
if (!$insert) {
$result = mysqli_query($connection, "COMMIT");
DB::connection($connection)->commitTransaction();
}
} catch (Exception $e) {
CLI::logging(CLI::error("Error:" . "There are problems running script '$filename': " . $e));
} catch (QueryException $exception) {
DB::connection($connection)->rollbackTransaction();
throw new Exception("Error when running script '$filename', line $j, query '$line': " . $exception->getMessage());
}
}
}
@@ -1919,28 +1923,31 @@ class WorkspaceTools
if ($port != '') {
$dbHost = $dbHost . $port; //127.0.0.1:3306
}
$aParameters = array('dbHost' => $dbHost, 'dbUser' => $dbUser, 'dbPass' => $dbPass);
$aParameters = ['dbHost' => $dbHost, 'dbUser' => $dbUser, 'dbPass' => $dbPass];
//Restore
if (empty(config("system.workspace"))) {
define("SYS_SYS", $workspaceName);
config(["system.workspace" => $workspaceName]);
if (empty(config('system.workspace'))) {
define('SYS_SYS', $workspaceName);
config(['system.workspace' => $workspaceName]);
}
if (!defined("PATH_DATA_SITE")) {
define("PATH_DATA_SITE", PATH_DATA . "sites" . PATH_SEP . config("system.workspace") . PATH_SEP);
if (!defined('PATH_DATA_SITE')) {
define('PATH_DATA_SITE', PATH_DATA . 'sites' . PATH_SEP . config('system.workspace') . PATH_SEP);
}
$pmVersionWorkspaceToRestore = (preg_match("/^([\d\.]+).*$/", $metadata->PM_VERSION, $arrayMatch)) ? $arrayMatch[1] : "";
$pmVersionWorkspaceToRestore = preg_match("/^([\d\.]+).*$/", $metadata->PM_VERSION, $arrayMatch) ? $arrayMatch[1] : '';
CLI::logging("> Connecting to system database in '$dbHost'\n");
$link = mysqli_connect($dbHost, $dbUser, $dbPass);
mysqli_query($link, "SET NAMES 'utf8';");
mysqli_query($link, "SET FOREIGN_KEY_CHECKS=0;");
mysqli_query($link, "SET GLOBAL log_bin_trust_routine_creators = 1;");
if (!$link) {
throw new Exception('Could not connect to system database: ' . mysqli_error($link));
try {
$connection = 'RESTORE';
InstallerModule::setNewConnection('RESTORE', $dbHost, $dbUser, $dbPass, '', '');
DB::connection($connection)
->statement("SET NAMES 'utf8'");
DB::connection($connection)
->statement('SET FOREIGN_KEY_CHECKS=0');
} catch (Exception $exception) {
throw new Exception('Could not connect to system database: ' . $exception->getMessage());
}
$dbName = '';
@@ -1952,17 +1959,16 @@ class WorkspaceTools
if (isset($newDBNames['DB_USER'])) {
$dbUser = $newDBNames['DB_USER'];
}
if (mysqli_select_db($link, $dbName)) {
if (!$overwrite) {
throw new Exception("Destination Database already exist (use -o to overwrite)");
}
$result = DB::connection($connection)->select("show databases like '$dbName'");
if (count($result) > 0 && !$overwrite) {
throw new Exception("Destination Database already exist (use -o to overwrite)");
}
CLI::logging("+> Restoring database {$db->name} to $dbName\n");
$versionBackupEngine = (isset($metadata->backupEngineVersion)) ? $metadata->backupEngineVersion : 1;
$workspace->executeSQLScript($dbName, "$tempDirectory/{$db->name}.sql", $aParameters, $versionBackupEngine, $link);
$workspace->createDBUser($dbUser, ($workspace->dbGrantUserPassword != '' ? $workspace->dbGrantUserPassword : $db->pass), "localhost", $dbName, $link);
$workspace->createDBUser($dbUser, ($workspace->dbGrantUserPassword != '' ? $workspace->dbGrantUserPassword : $db->pass), "%", $dbName, $link);
$workspace->executeSQLScript($dbName, "$tempDirectory/{$db->name}.sql", $aParameters, $versionBackupEngine, $connection);
$workspace->createDBUser($dbUser, ($workspace->dbGrantUserPassword != '' ? $workspace->dbGrantUserPassword : $db->pass), "localhost", $dbName, $connection);
$workspace->createDBUser($dbUser, ($workspace->dbGrantUserPassword != '' ? $workspace->dbGrantUserPassword : $db->pass), "%", $dbName, $connection);
}
}
@@ -2048,7 +2054,6 @@ class WorkspaceTools
//Updating generated class files for PM Tables
passthru(PHP_BINARY . ' processmaker regenerate-pmtable-classes ' . $workspace->name);
mysqli_close($link);
}
CLI::logging("Removing temporary files\n");

View File

@@ -1,43 +1,7 @@
<?php
/**
* Content.php
*
* @package workflow.engine.classes.model
*
* ProcessMaker Open Source Edition
* Copyright (C) 2004 - 2011 Colosa Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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/>.
*
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*
*/
//require_once 'classes/model/om/BaseContent.php';
use Illuminate\Support\Facades\DB;
/**
* Skeleton subclass for representing a row from the 'CONTENT' table.
*
*
*
* You should add additional methods to this class to meet the
* application requirements. This class will only be generated as
* long as it does not already exist in the output directory.
*
* @package workflow.engine.classes.model
*/
class Content extends BaseContent
{
public $langs;
@@ -335,51 +299,56 @@ class Content extends BaseContent
$this->rowsUnchanged = 0;
$this->rowsClustered = 0;
//Creating table CONTENT_BACKUP
$connection = Propel::getConnection('workflow');
$oStatement = $connection->prepareStatement("CREATE TABLE IF NOT EXISTS `CONTENT_BACKUP` (
$workSpace = new WorkspaceTools($workSpace);
$workSpace->getDBInfo();
$connection = 'regenerate';
InstallerModule::setNewConnection(
$connection,
$workSpace->dbHost,
$workSpace->dbUser,
$workSpace->dbPass,
$workSpace->dbName,
'',
['PDO::MYSQL_ATTR_INIT_COMMAND' => 'SET SESSION SQL_BIG_SELECTS=1']);
$query = "CREATE TABLE IF NOT EXISTS `CONTENT_BACKUP` (
`CON_CATEGORY` VARCHAR(30) default '' NOT NULL,
`CON_PARENT` VARCHAR(32) default '' NOT NULL,
`CON_ID` VARCHAR(100) default '' NOT NULL,
`CON_LANG` VARCHAR(10) default '' NOT NULL,
`CON_VALUE` MEDIUMTEXT NOT NULL,
CONSTRAINT CONTENT_BACKUP_PK PRIMARY KEY (CON_CATEGORY,CON_PARENT,CON_ID,CON_LANG)
)Engine=InnoDB DEFAULT CHARSET='utf8' COMMENT='Table for add content';");
$oStatement->executeQuery();
)Engine=InnoDB DEFAULT CHARSET='utf8' COMMENT='Table for add content'";
$sql = ' SELECT DISTINCT CON_LANG FROM CONTENT ';
$stmt = $connection->createStatement();
$rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC);
while ($rs->next()) {
$row = $rs->getRow();
$language = $row['CON_LANG'];
if (array_search($row['CON_LANG'], $langs) === false) {
Content::removeLanguageContent($row['CON_LANG']);
DB::connection($connection)->statement($query);
$languages = DB::table('CONTENT')->select('CON_LANG')->distinct()->get();
foreach ($languages as $value) {
if (array_search($value->CON_LANG, $langs) === false) {
Content::removeLanguageContent($value->CON_LANG);
}
}
$sql = " SELECT CON_ID, CON_CATEGORY, CON_LANG, CON_PARENT, CON_VALUE
FROM CONTENT
ORDER BY CON_ID, CON_CATEGORY, CON_PARENT, CON_LANG";
DB::connection($connection)->statement('SET NAMES "utf8"');
DB::connection($connection)->statement('SET FOREIGN_KEY_CHECKS=0');
DB::connection($connection)->statement('SET SQL_BIG_SELECTS=1');
$workSpace = new WorkspaceTools($workSpace);
$workSpace->getDBInfo();
$mysqli = new mysqli($workSpace->dbHost, $workSpace->dbUser, $workSpace->dbPass, $workSpace->dbName) or die("Could not connect");
$mysqli->query( 'SET NAMES "utf8";');
$mysqli->query( 'SET FOREIGN_KEY_CHECKS=0;');
$mysqli->query( 'SET OPTION SQL_BIG_SELECTS=1');
$result = $mysqli->query( $sql, MYSQLI_USE_RESULT);
$result = DB::table('CONTENT')
->select('CON_ID', 'CON_CATEGORY', 'CON_LANG', 'CON_PARENT', 'CON_VALUE')
->orderBy('CON_ID', 'CON_CATEGORY', 'CON_LANG', 'CON_PARENT', 'CON_VALUE')
->get();
$list = [];
$default = [];
$sw = array('CON_ID' => '','CON_CATEGORY' => '','CON_PARENT' => ''
);
while ($row = $result->fetch_assoc()) {
$sw = ['CON_ID' => '', 'CON_CATEGORY' => '', 'CON_PARENT' => ''];
foreach ($result as $value) {
$row = (array)$value;
if ($sw['CON_ID'] === $row['CON_ID'] && $sw['CON_CATEGORY'] === $row['CON_CATEGORY'] && $sw['CON_PARENT'] === $row['CON_PARENT']) {
$list[] = $row;
} else {
$this->rowsClustered ++;
$this->rowsClustered++;
if (count($langs) !== count($list)) {
$this->checkLanguage($list, $default);
} else {
@@ -399,37 +368,30 @@ class Content extends BaseContent
if ($sw['CON_LANG'] === $langs[$key]) {
$default = $row;
}
$this->rowsProcessed ++;
$this->rowsProcessed++;
}
if (count($langs) !== count($list)) {
$this->checkLanguage($list, $default);
} else {
$this->rowsUnchanged += count($langs);
}
mysqli_free_result($result);
$total = $this->rowsProcessed + $this->rowsInserted;
$result->close();
$statement = $connection->prepareStatement("REPLACE INTO CONTENT
DB::connection($connection)->statement('REPLACE INTO CONTENT
SELECT CON_CATEGORY, CON_PARENT, CON_ID , CON_LANG, CON_VALUE
FROM CONTENT_BACKUP");
$statement->executeQuery();
FROM CONTENT_BACKUP');
$statement = $connection->prepareStatement("DROP TABLE CONTENT_BACKUP");
$statement->executeQuery();
DB::connection($connection)->statement('DROP TABLE CONTENT_BACKUP');
//close connection
$sql = "SELECT * FROM information_schema.processlist WHERE command = 'Sleep' and user = SUBSTRING_INDEX(USER(),'@',1) and db = DATABASE() ORDER BY id;";
$stmt = $connection->createStatement();
$rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC);
while ($rs->next()) {
$row = $rs->getRow();
$oStatement = $connection->prepareStatement("kill ". $row['ID']);
$oStatement->executeQuery();
$result = DB::connection($connection)
->select("SELECT * FROM information_schema.processlist WHERE command = 'Sleep' and user = SUBSTRING_INDEX(USER(),'@',1) and db = DATABASE() ORDER BY id");
foreach ($result as $value) {
DB::connection($connection)->statement('kill ' . $value->ID);
}
if (! isset($_SERVER['SERVER_NAME'])) {
if (!isset($_SERVER['SERVER_NAME'])) {
CLI::logging("Rows Processed ---> $this->rowsProcessed ..... \n");
CLI::logging("Rows Clustered ---> $this->rowsClustered ..... \n");
CLI::logging("Rows Unchanged ---> $this->rowsUnchanged ..... \n");
@@ -457,12 +419,14 @@ class Content extends BaseContent
public function fastInsertContent($ConCategory, $ConParent, $ConId, $ConLang, $ConValue)
{
$connection = Propel::getConnection('workflow');
$ConValue = mysqli_real_escape_string($connection, $ConValue);
$statement = $connection->prepareStatement("INSERT INTO CONTENT_BACKUP (
CON_CATEGORY, CON_PARENT, CON_ID , CON_LANG, CON_VALUE)
VALUES ('$ConCategory', '$ConParent', '$ConId', '$ConLang', '$ConValue');");
$statement->executeQuery();
DB::table('CONTENT_BACKUP')
->insert([
'CON_CATEGORY' => $ConCategory,
'CON_PARENT' => $ConParent,
'CON_ID' => $ConId,
'CON_LANG' => $ConLang,
'CON_VALUE' => $ConValue
]);
}
public function removeLanguageContent($lanId)

View File

@@ -1,7 +1,12 @@
<?php
use ProcessMaker\Util\Common;
use ProcessMaker\Core\System;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
global $translation;
include PATH_LANGUAGECONT . "translation." . SYS_LANG;
@@ -18,7 +23,18 @@ class InstallerModule extends Controller
public $link; #resource for database connection
/**
* Default name for connection
*
* @var string
*/
const CONNECTION_INSTALL = 'install';
const CONNECTION_TEST_INSTALL = 'testInstall';
/**
* Constructor
* We defined the paths for the installer
*/
public function __construct()
{
$this->path_config = PATH_CORE . 'config/';
@@ -116,6 +132,56 @@ class InstallerModule extends Controller
}
}
/**
* Set config connection
*
* @param string $nameConnection name Connection
* @param string $host
* @param string $user
* @param string $pass
* @param string $database
* @param int $port
* @param array $options
*
* @throws Exception
*/
public static function setNewConnection($nameConnection, $host, $user, $pass, $database, $port, $options = [])
{
try {
if (empty($port)) {
$dbHost = explode(':', $host);
$port = 3306;
if (count($dbHost) > 1) {
$port = $dbHost[1];
}
$host = $dbHost[0];
}
config(['database.connections.' . $nameConnection => [
'driver' => 'mysql',
'host' => $host,
'port' => $port,
'database' => $database,
'username' => $user,
'password' => $pass,
'unix_socket' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => 'InnoDB',
'options' => $options
]]);
DB::connection($nameConnection)->getPdo();
} catch (Exception $e) {
throw new Exception(G::LoadTranslation('ID_MYSQL_CREDENTIALS_WRONG'));
}
}
/**
* Get system information for review the requirements to install ProcessMaker
*
* @return object
*/
public function getSystemInfo()
{
$this->setResponseType('json');
@@ -241,7 +307,7 @@ class InstallerModule extends Controller
$this->setResponseType('json');
$info = new StdClass();
$info->success = true;
$noWritableFiles = array();
$noWritableFiles = [];
$noWritable = G::LoadTranslation('ID_INDEX_NOT_WRITEABLE');
$writable = G::LoadTranslation('ID_WRITEABLE');
@@ -387,16 +453,15 @@ class InstallerModule extends Controller
* the install.log files should be placed in shared/logs
* for that reason we are using the $_REQUEST of pathShared
*/
public function installLog($text)
private 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) != '/') {
if (substr($pathShared, -1) !== '/') {
$pathShared .= '/';
}
$pathSharedLog = $pathShared . 'log/';
@@ -410,12 +475,11 @@ class InstallerModule extends Controller
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))));
throw new Exception(G::LoadTranslation('ID_FILE_NOT_WRITEABLE', SYS_LANG, [$logFile]));
return $false;
}
}
$filter = new InputFilter();
$logFile = $filter->validateInput($logFile, 'path');
@@ -497,26 +561,12 @@ class InstallerModule extends Controller
}
/**
* send a query to MySQL and log the query
*/
public function mysqlQuery($sql)
{
$this->installLog($sql);
$query = mysqli_query($this->link, $sql);
if (!$query) {
$errorMessage = mysqli_error($this->link);
$this->installLog(G::LoadTranslation('ID_MYSQL_ERROR', SYS_LANG, array($errorMessage)));
throw new \Exception($errorMessage);
return false;
}
if (is_object($query)) {
mysqli_free_result($query);
}
return true;
}
/**
* send a query to MSSQL and log the query
* Send a query to MSSQL and log the query
*
* @param string $sql
*
* @return boolean
* @throws Exception
*/
public function mssqlQuery($sql)
{
@@ -544,32 +594,30 @@ class InstallerModule extends Controller
public function mysqlFileQuery($file)
{
if (!is_file($file)) {
throw (new Exception(G::LoadTranslation('ID_SQL_FILE_INVALID', SYS_LANG, array($file))));
throw new Exception(G::LoadTranslation('ID_SQL_FILE_INVALID', SYS_LANG, [$file]));
return $false;
}
$this->installLog(G::LoadTranslation('ID_PROCESING', SYS_LANG, array($file)));
$this->installLog(G::LoadTranslation('ID_PROCESING', SYS_LANG, [$file]));
$startTime = microtime(true);
//New Update, to support more complex queries
$lines = file($file);
$previous = null;
$errors = '';
mysqli_query($this->link, "SET NAMES 'utf8';");
DB::connection(self::CONNECTION_INSTALL)
->statement("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 (strpos($line, '--') === 0) {
$line = substr($line, 0, strpos($line, '--'));
}
if (empty($line)) {
continue;
}
if (strpos($line, "#") === 0) {
$line = substr($line, 0, strpos($line, "#"));
if (strpos($line, '#') === 0) {
$line = substr($line, 0, strpos($line, '#'));
}
if (empty($line)) {
@@ -578,23 +626,24 @@ class InstallerModule extends Controller
// Concatenate the previous line, if any, with the current
if ($previous) {
$line = $previous . " " . $line;
$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) {
if (strrpos($line, ';') !== strlen($line) - 1) {
$previous = $line;
continue;
}
$line = substr($line, 0, strrpos($line, ";"));
mysqli_query($this->link, $line);
$line = substr($line, 0, strrpos($line, ';'));
DB::connection(self::CONNECTION_INSTALL)
->statement($line);
}
$endTime = microtime(true);
$this->installLog(G::LoadTranslation('ID_FILE_PROCESSED', SYS_LANG, array(basename($file), $endTime - $startTime)));
$this->installLog(G::LoadTranslation('ID_FILE_PROCESSED', SYS_LANG, [basename($file), $endTime - $startTime]));
return true;
}
@@ -636,31 +685,25 @@ class InstallerModule extends Controller
* @param string $psUser
* @param string $psPassword
* @param string $psDatabase
* @return void
* @param string $host
*
* @throws Exception
*/
public function setGrantPrivilegesMySQL($psUser, $psPassword, $psDatabase, $host)
private function setGrantPrivilegesMySQL($psUser, $psPassword, $psDatabase, $host)
{
$filter = new InputFilter();
$host = ($host == 'localhost' || $host == '127.0.0.1' ? 'localhost' : '%');
try {
$host = $host === 'localhost' || $host === '127.0.0.1' ? 'localhost' : '%';
$query = "GRANT ALL PRIVILEGES ON `%s`.* TO %s@'%s' IDENTIFIED BY '%s' WITH GRANT OPTION";
$sql = sprintf($query, $psDatabase, $psUser, $host, $psPassword);
$sql = $filter->preventSqlInjection($query, array($psDatabase, $psUser, $host, $psPassword), $this->link);
$query = mysqli_query($this->link, $sql);
$query = "GRANT ALL PRIVILEGES ON `$psDatabase`.* TO $psUser@'$host' IDENTIFIED BY '$psPassword' WITH GRANT OPTION";
DB::connection(self::CONNECTION_INSTALL)
->statement($query);
if (!$query) {
$errorMessage = mysqli_error($this->link);
$this->installLog(G::LoadTranslation('ID_MYSQL_ERROR', SYS_LANG, array($errorMessage)));
if (mysqli_errno($this->link) === 1410 || mysqli_errno($this->link) === 1132) {
$errorMessage .= '. ' . G::LoadTranslation('ID_INSTALL_USE_CURRENT_USER');
}
throw new Exception($errorMessage);
return false;
$this->installLog($query);
} catch (QueryException $e) {
$this->installLog(G::LoadTranslation('ID_MYSQL_ERROR', SYS_LANG, [$e->getMessage()]));
throw new Exception($e->getMessage());
}
if (is_object($query)) {
mysqli_free_result($query);
}
$this->installLog($sql);
}
/**
@@ -703,12 +746,11 @@ class InstallerModule extends Controller
return true;
}
private function file_get_contents_utf8($fn) {
$content = file_get_contents($fn);
return mb_convert_encoding($content, 'UTF-8',
mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}
/**
* Create a workspace in a MySQL database
*
* @return StdClass object
*/
public function createMySQLWorkspace()
{
$filter = new InputFilter();
@@ -726,76 +768,61 @@ class InstallerModule extends Controller
$db_password = urlencode(trim($_REQUEST['db_password']));
$db_password = urldecode($filter->validateInput($db_password));
$wf = trim($_REQUEST['wfDatabase']);
$rb = trim($_REQUEST['wfDatabase']);
$rp = trim($_REQUEST['wfDatabase']);
$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']);
$adminPassword = $filter->validateInput($adminPassword);
$adminUsername = trim($_REQUEST['adminUsername']);
$adminUsername = $filter->validateInput($adminUsername);
$deleteDB = ($_REQUEST['deleteDB'] == 'true');
$userLogged = (isset($_REQUEST['userLogged']) ? ($_REQUEST['userLogged'] == 'true') : false);
$deleteDB = $_REQUEST['deleteDB'] === 'true';
$userLogged = isset($_REQUEST['userLogged']) ? $_REQUEST['userLogged'] === 'true' : false;
$userLogged = $filter->validateInput($userLogged);
if (substr($pathShared, -1) != '/') {
if (substr($pathShared, -1) !== '/') {
$pathShared .= '/';
}
$this->installLog('-------------------------------------------');
$this->installLog(G::LoadTranslation('ID_CREATING_WORKSPACE', SYS_LANG, array($workspace)));
$this->installLog(G::LoadTranslation('ID_CREATING_WORKSPACE', SYS_LANG, [$workspace]));
try {
self::setNewConnection(self::CONNECTION_TEST_INSTALL, $db_hostname, $db_username, $db_password, '', $db_port);
$db_host = ($db_port != '' && $db_port != 3306) ? $db_hostname . ':' . $db_port : $db_hostname;
$this->link = mysqli_connect($db_host, $db_username, $db_password);
mysqli_set_charset($this->link, 'utf8');
$this->installLog(G::LoadTranslation('ID_CONNECT_TO_SERVER', SYS_LANG, array($db_hostname, $db_port, $db_username)));
$this->installLog(G::LoadTranslation('ID_CONNECT_TO_SERVER', SYS_LANG, [$db_hostname, $db_port, $db_username]));
if ($deleteDB) {
$q = sprintf('DROP DATABASE IF EXISTS %s;', $wf, $wf);
$this->mysqlQuery($q);
$query = sprintf('DROP DATABASE IF EXISTS %s', $wf);
DB::connection(self::CONNECTION_TEST_INSTALL)->statement($query);
}
// CREATE databases wf_workflow, rb_workflow and rp_workflow
$q = sprintf('CREATE DATABASE IF NOT EXISTS %s;', $wf, $wf);
$this->mysqlQuery($q);
// CREATE databases wf_workflow
DB::connection(self::CONNECTION_TEST_INSTALL)
->statement("CREATE DATABASE IF NOT EXISTS $wf");
self::setNewConnection(self::CONNECTION_INSTALL, $db_hostname, $db_username, $db_password, $wf, $db_port);
// CREATE users and GRANT Privileges
$wf_workspace = $wf;
$wfGrantUser = uniqid('wf_');
$rb_workspace = $wf;
$rp_workspace = $wf;
if (!$userLogged) {
$wfPass = G::generate_password(15);
$this->setGrantPrivilegesMySQL($wfGrantUser, $wfPass, $wf, $db_hostname);
$this->setGrantPrivilegesMySQL($wfGrantUser, $wfPass, $wf, $db_hostname);
$this->setGrantPrivilegesMySQL($wfGrantUser, $wfPass, $wf, $db_hostname);
} else {
$wfPass = $db_password;
$rbPass = $db_password;
$rpPass = $db_password;
$wf = $db_username;
$wfGrantUser = $db_username;
$rb = $db_username;
$rp = $db_username;
}
// Generate the db.php file and folders
$pathSharedSites = $pathShared;
$path_site = $pathShared . "/sites/" . $workspace . "/";
$path_site = $pathShared . '/sites/' . $workspace . '/';
@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);
@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_file = $path_site . 'db.php';
$dbText = "<?php\n";
@@ -816,13 +843,13 @@ class InstallerModule extends Controller
if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) {
$dbText .= "\n";
$dbText .= " define ('PARTNER_FLAG', " . ((defined('PARTNER_FLAG')) ? PARTNER_FLAG : ((isset($_REQUEST['PARTNER_FLAG'])) ? $_REQUEST['PARTNER_FLAG'] : 'false')) . ");\n";
if ($this->systemName != '') {
$dbText .= " define ('PARTNER_FLAG', " . (defined('PARTNER_FLAG') ? PARTNER_FLAG : isset($_REQUEST['PARTNER_FLAG']) ? $_REQUEST['PARTNER_FLAG'] : 'false') . ");\n";
if (!empty($this->systemName)) {
$dbText .= " define ('SYSTEM_NAME', '" . $this->systemName . "');\n";
}
}
$this->installLog(G::LoadTranslation('ID_CREATING', SYS_LANG, array($db_file)));
$this->installLog(G::LoadTranslation('ID_CREATING', SYS_LANG, [$db_file]));
file_put_contents($db_file, $dbText);
/*----------------------------------********---------------------------------*/
@@ -854,15 +881,8 @@ class InstallerModule extends Controller
$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;", $wf_workspace);
$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_workspace);
$this->mysqlQuery($query);
$this->mysqlFileQuery(PATH_HOME . 'engine/data/mysql/schema.sql');
$this->mysqlFileQuery(PATH_HOME . 'engine/data/mysql/insert.sql');
@@ -877,61 +897,86 @@ class InstallerModule extends Controller
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($this->file_get_contents_utf8(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationInsert.sql'));
$this->mysqlQuery($this->file_get_contents_utf8(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationUpdate.sql'));
$this->mysqlQuery($this->file_get_contents_utf8(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationUpdate.sql'));
$this->mysqlQuery($this->file_get_contents_utf8(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationDelete.sql'));
$this->mysqlQuery($this->file_get_contents_utf8(PATH_HOME . "engine/methods/setup/setupSchemas/triggerSubApplicationInsert.sql"));
$this->mysqlQuery($this->file_get_contents_utf8(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerContentUpdate.sql'));
DB::connection(self::CONNECTION_INSTALL)->raw(file_get_contents(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationInsert.sql'));
DB::connection(self::CONNECTION_INSTALL)->raw(file_get_contents(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerAppDelegationUpdate.sql'));
DB::connection(self::CONNECTION_INSTALL)->raw(file_get_contents(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationUpdate.sql'));
DB::connection(self::CONNECTION_INSTALL)->raw(file_get_contents(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerApplicationDelete.sql'));
DB::connection(self::CONNECTION_INSTALL)->raw(file_get_contents(PATH_HOME . 'engine/methods/setup/setupSchemas/triggerSubApplicationInsert.sql'));
DB::connection(self::CONNECTION_INSTALL)->raw(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',
'" . mysqli_real_escape_string(serialize(array('LANG' => 'en', 'STATUS' => 'active'
))) . "'
)");
DB::connection(self::CONNECTION_INSTALL)
->table('CONFIGURATION')
->insert([
'CFG_UID' => 'APP_CACHE_VIEW_ENGINE',
'CFG_VALUE' => serialize(['LANG' => 'en', 'STATUS' => 'active'])
]);
$this->mysqlQuery("INSERT INTO EMAIL_SERVER(MESS_UID, MESS_ENGINE) VALUES('" . \ProcessMaker\Util\Common::generateUID() . "', 'MAIL')");
DB::connection(self::CONNECTION_INSTALL)
->table('EMAIL_SERVER')
->insert([
'MESS_UID' => Common::generateUID(),
'MESS_ENGINE' => 'MAIL'
]);
}
// Change admin user
$query = sprintf("USE %s;", $wf_workspace);
$this->mysqlQuery($query);
$query = sprintf("UPDATE USERS SET USR_USERNAME = '%s', USR_LASTNAME = '%s', USR_PASSWORD = '%s' WHERE USR_UID = '00000000000000000000000000000001' ", $adminUsername, $adminUsername, G::encryptHash($adminPassword));
$this->mysqlQuery($query);
$query = sprintf("UPDATE RBAC_USERS SET USR_USERNAME = '%s', USR_LASTNAME = '%s', USR_PASSWORD = '%s' WHERE USR_UID = '00000000000000000000000000000001' ", $adminUsername, $adminUsername, G::encryptHash($adminPassword));
$this->mysqlQuery($query);
DB::connection(self::CONNECTION_INSTALL)
->table('USERS')
->where('USR_UID', '00000000000000000000000000000001')
->update([
'USR_USERNAME' => $adminUsername,
'USR_LASTNAME' => $adminUsername,
'USR_PASSWORD' => Bootstrap::hashPassword($adminPassword, Bootstrap::hashBcrypt)
]);
DB::connection(self::CONNECTION_INSTALL)
->table('RBAC_USERS')
->where('USR_UID', '00000000000000000000000000000001')
->update([
'USR_USERNAME' => $adminUsername,
'USR_LASTNAME' => $adminUsername,
'USR_PASSWORD' => Bootstrap::hashPassword($adminPassword, Bootstrap::hashBcrypt)
]);
// Write the paths_installed.php file (contains all the information configured so far)
if (!file_exists(FILE_PATHS_INSTALLED)) {
$sh = G::encryptOld(filemtime(PATH_GULLIVER . '/class.g.php'));
$h = G::encrypt($db_hostname . $sh . $db_username . $sh . $db_password, $sh);
$h = G::encrypt($db_host . $sh . $db_username . $sh . $db_password, $sh);
$dbText = "<?php\n";
$dbText .= sprintf(" define('PATH_DATA', '%s');\n", $pathShared);
$dbText .= sprintf(" define('PATH_C', '%s');\n", $pathShared . 'compiled/');
$dbText .= sprintf(" define('HASH_INSTALLATION', '%s');\n", $h);
$dbText .= sprintf(" define('SYSTEM_HASH', '%s');\n", $sh);
$this->installLog(G::LoadTranslation('ID_CREATING', SYS_LANG, array(FILE_PATHS_INSTALLED)));
$this->installLog(G::LoadTranslation('ID_CREATING', SYS_LANG, [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 );
config(["system.workspace" => $workspace]);
define('HASH_INSTALLATION', $h);
define('SYSTEM_HASH', $sh);
define('PATH_DB', $pathShared . 'sites' . PATH_SEP);
define('SYS_SYS', $workspace);
config(['system.workspace' => $workspace]);
require_once("propel/Propel.php");
System::setConnectionConfig(
'mysql',
$db_host,
$wf_workspace,
$wfGrantUser,
$wfPass,
$db_host,
$wf_workspace,
$wfGrantUser,
$wfPass,
$db_host,
$wf_workspace,
$wfGrantUser,
$wfPass);
Propel::init(PATH_CORE . "config/databases.php");
require_once('propel/Propel.php');
Propel::init(PATH_CORE . 'config/databases.php');
$con = Propel::getConnection('workflow');
require_once('classes/model/AppCacheView.php');
@@ -990,8 +1035,8 @@ class InstallerModule extends Controller
$info->uri = PATH_SEP . 'sys' . $_REQUEST['workspace'] . PATH_SEP . $langUri . PATH_SEP . $skinUri . PATH_SEP . 'login' . PATH_SEP . 'login';
//register PMDesigner Client
$http = (G::is_https() == true) ? 'https' : 'http';
$host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] != '80' ? ':' . $_SERVER['SERVER_PORT'] : '');
$http = G::is_https() ? 'https' : 'http';
$host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] !== '80' ? ':' . $_SERVER['SERVER_PORT'] : '');
$endpoint = sprintf(
'%s://%s/sys%s/%s/%s/oauth2/grant',
@@ -1003,15 +1048,17 @@ class InstallerModule extends Controller
);
// inserting the outh_client
if (!$userLogged) {
$query = sprintf("USE %s;", $wf);
} else {
$query = sprintf("USE %s;", trim($_REQUEST['wfDatabase']));
}
$this->mysqlQuery($query);
$query = ("INSERT INTO OAUTH_CLIENTS (CLIENT_ID,CLIENT_SECRET,CLIENT_NAME,CLIENT_DESCRIPTION,CLIENT_WEBSITE,REDIRECT_URI,USR_UID ) VALUES
('x-pm-local-client','179ad45c6ce2cb97cf1029e212046e81','PM Web Designer','ProcessMaker Web Designer App','www.processmaker.com','" . $endpoint . "','00000000000000000000000000000001' )");
$this->mysqlQuery($query);
DB::connection(self::CONNECTION_INSTALL)
->table('OAUTH_CLIENTS')
->insert([
'CLIENT_ID' => 'x-pm-local-client',
'CLIENT_SECRET' => '179ad45c6ce2cb97cf1029e212046e81',
'CLIENT_NAME' => 'PM Web Designer',
'CLIENT_DESCRIPTION' => 'ProcessMaker Web Designer App',
'CLIENT_WEBSITE' => 'www.processmaker.com',
'REDIRECT_URI' => $endpoint,
'USR_UID' => '00000000000000000000000000000001'
]);
$indexFileUpdated = true;
if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) {
@@ -1021,30 +1068,30 @@ class InstallerModule extends Controller
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_WRITE_CONFIG_INDEX', SYS_LANG, [$envFile]);
$info->message .= G::LoadTranslation('ID_PROCESSMAKER_UI_NOT_INSTALL');
$this->installLog(G::LoadTranslation('ID_INSTALL_BUT_ERROR', SYS_LANG, array('env.ini')));
$this->installLog(G::LoadTranslation('ID_INSTALL_BUT_ERROR', SYS_LANG, ['env.ini']));
return $info;
}
try {
// update the main index file
$indexFileUpdated = System::updateIndexFile(array('lang' => 'en', 'skin' => $updatedConf['default_skin']));
$indexFileUpdated = System::updateIndexFile(['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_WRITE_CONFIG_INDEX', SYS_LANG, [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')));
$this->installLog(G::LoadTranslation('ID_INSTALL_BUT_ERROR', SYS_LANG, ['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_INDEX_FILE_UPDATED', SYS_LANG, [$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));;
$info->messageFinish = G::LoadTranslation('ID_PROCESSMAKER_SUCCESS_INSTALLED', SYS_LANG, [$workspace]);
} catch (Exception $e) {
$info->canRedirect = false;
$info->result = false;
@@ -1185,7 +1232,7 @@ class InstallerModule extends Controller
$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->mysqlQuery(@file_get_contents(PATH_HOME . "engine/methods/setup/setupSchemas/triggerSubApplicationInsert.sql"));
$this->mssqlQuery(@file_get_contents(PATH_HOME . "engine/methods/setup/setupSchemas/triggerSubApplicationInsert.sql"));
$this->mssqlQuery(@file_get_contents(PATH_HOME . 'engine/plugins/enterprise/data/triggerContentUpdate.sql'));
$this->mssqlQuery("INSERT INTO CONFIGURATION (
CFG_UID,
@@ -1197,7 +1244,7 @@ class InstallerModule extends Controller
))) . "'
)");
$this->mssqlQuery("INSERT INTO EMAIL_SERVER(MESS_UID, MESS_ENGINE) VALUES('" . \ProcessMaker\Util\Common::generateUID() . "','MAIL')");
$this->mssqlQuery("INSERT INTO EMAIL_SERVER(MESS_UID, MESS_ENGINE) VALUES('" . Common::generateUID() . "','MAIL')");
}
//change admin user
@@ -1230,7 +1277,6 @@ class InstallerModule extends Controller
$info->message = G::LoadTranslation('ID_INSTALL_SUCESS');
$info->url = '/sys' . $_REQUEST['workspace'] . '/en/neoclassic/login/login';
$info->messageFinish = G::LoadTranslation('ID_PROCESSMAKER_SUCCESS_INSTALLED', SYS_LANG, array($workspace));
;
} catch (Exception $e) {
$info->result = false;
$info->message = $e->getMessage();
@@ -1254,10 +1300,15 @@ class InstallerModule extends Controller
return $systemName;
}
/**
* Get the Database engines list
*
* @return object
*/
public function getEngines()
{
$this->setResponseType('json');
$engines = array();
$engines = [];
if (function_exists('mysqli_query')) {
$engine = new stdclass();
$engine->id = 'mysql';
@@ -1290,15 +1341,13 @@ class InstallerModule extends Controller
switch ($_REQUEST['db_engine']) {
case 'mysql':
if ($db_port !== '3306') {
$db_hostname = $db_hostname . ':' . $db_port;
}
$wfDatabase = $filter->validateInput($_REQUEST['wfDatabase'], 'nosql');
$link = mysqli_connect($db_hostname, $db_username, $db_password, $wfDatabase);
$query = "show databases like '%s' ";
$query = $filter->preventSqlInjection($query, array($wfDatabase), $link);
$dataSet = mysqli_query($link, $query);
$info->wfDatabaseExists = (mysqli_num_rows($dataSet) > 0);
self::setNewConnection(self::CONNECTION_TEST_INSTALL, $db_hostname, $db_username, $db_password, '', $db_port);
$response = DB::connection(self::CONNECTION_TEST_INSTALL)
->select("show databases like '$wfDatabase'");
$info->wfDatabaseExists = count($response) > 0;
break;
case 'mssql':
$link = @mssql_connect($db_hostname, $db_username, $db_password);
@@ -1332,51 +1381,53 @@ class InstallerModule extends Controller
private function testMySQLConnection()
{
$filter = new InputFilter();
$info = new StdClass();
$info->result = false;
$info->message = '';
if (!function_exists('mysqli_connect')) {
$info->message = G::LoadTranslation('ID_PHP_MYSQLI_NOT_INSTALL');
return $info;
}
$dataRequest = $_REQUEST;
$db_hostname = $filter->validateInput($dataRequest['db_hostname']);
$db_port = $filter->validateInput($dataRequest['db_port']);
$db_username = $filter->validateInput($dataRequest['db_username']);
$db_password = urlencode($dataRequest['db_password']);
$db_password = urldecode($filter->validateInput($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;
}
try {
$filter = new InputFilter();
$info = new StdClass();
$info->result = false;
$info->message = '';
if (!function_exists('mysqli_connect')) {
$info->message = G::LoadTranslation('ID_PHP_MYSQLI_NOT_INSTALL');
return $info;
}
$dataRequest = $_REQUEST;
$db_hostname = $filter->validateInput($dataRequest['db_hostname']);
$db_port = $filter->validateInput($dataRequest['db_port']);
$db_username = $filter->validateInput($dataRequest['db_username']);
$db_password = urlencode($dataRequest['db_password']);
$db_password = urldecode($filter->validateInput($db_password));
$fp = @fsockopen($db_hostname, $db_port, $errno, $errstr, 30);
if (!$fp) {
$info->message .= G::LoadTranslation('ID_CONNECTION_ERROR', SYS_LANG, ["$errstr ($errno)"]);
return $info;
}
$db_host = ($db_port !== '' && $db_port !== 1433) ? $db_hostname . ':' . $db_port : $db_hostname;
$db_username = $filter->validateInput($db_username, 'nosql');
$db_hostname = $filter->validateInput($db_hostname, 'nosql');
$link = new mysqli($db_host, $db_username, $db_password);
if ($link->connect_error) {
$info->message .= G::LoadTranslation('ID_MYSQL_CREDENTIALS_WRONG');
return $info;
self::setNewConnection(self::CONNECTION_TEST_INSTALL, $db_hostname, $db_username, $db_password, '', $db_port);
$query = "SELECT * FROM `information_schema`.`USER_PRIVILEGES` where (GRANTEE = \"'$db_username'@'$db_hostname'\" OR GRANTEE = \"'$db_username'@'%%'\") ";
$response = DB::connection(self::CONNECTION_TEST_INSTALL)->select($query);
if (!is_array($response)) {
$info->message .= G::LoadTranslation('ID_CONNECTION_ERROR_PRIVILEGE', SYS_LANG, [$db_username]);
return $info;
}
$info->message .= G::LoadTranslation('ID_MYSQL_SUCCESS_CONNECT');
$info->result = true;
} catch (Exception $e) {
$info->result = false;
$info->message = G::LoadTranslation('ID_MYSQL_CREDENTIALS_WRONG');
}
$db_username = $filter->validateInput($db_username, 'nosql');
$db_hostname = $filter->validateInput($db_hostname, 'nosql');
$query = "SELECT * FROM `information_schema`.`USER_PRIVILEGES` where (GRANTEE = \"'%s'@'%s'\" OR GRANTEE = \"'%s'@'%%'\") ";
$query = $filter->preventSqlInjection($query, array($db_username, $db_hostname, $db_username), $link);
$res = $link->query($query);
$row = $res->fetch_array();
$hasSuper = is_array($row);
$res->free();
$link->close();
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;
}
/**
* This function test a SQL Server connection
*
* @return object
*/
private function testMSSQLConnection()
{
$filter = new InputFilter();
@@ -1400,6 +1451,7 @@ class InstallerModule extends Controller
$info->message .= G::LoadTranslation('ID_CONNECTION_ERROR', SYS_LANG, array("$errstr ($errno)"));
return $info;
}
\Illuminate\Support\Facades\DB::connection();
$db_host = ($db_port != '' && $db_port != 1433) ? $db_hostname . ':' . $db_port : $db_hostname;
@@ -1454,13 +1506,18 @@ class InstallerModule extends Controller
return $info;
}
public function setPartner()
/**
* This function define the partner behaviour when the PARTNER_FLAG is defined
* Execute to change of skin
*
* @return void
*/
private 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);
@@ -1470,7 +1527,6 @@ class InstallerModule extends Controller
// 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);
@@ -1503,10 +1559,19 @@ class InstallerModule extends Controller
}
}
/**
* Copy a directory or file
*
* @param string $fromDir
* @param string $toDir
* @param integer $chmod
*
* @return void
*/
public function copyFile($fromDir, $toDir, $chmod = 0777)
{
$errors = array();
$messages = array();
$errors = [];
$messages = [];
if (!is_writable($toDir)) {
$errors[] = 'target ' . $toDir . ' is not writable';
@@ -1546,32 +1611,33 @@ class InstallerModule extends Controller
closedir($handle);
}
public function setConfiguration()
{
//a:4:{s:26:"login_enableForgotPassword";b:0;s:27:"login_enableVirtualKeyboard";b:0;s:21:"login_defaultLanguage";s:5:"pt-BR";s:10:"dateFormat";s:15:"d \\d\\e F \\d\\e Y";}
$value = array(
'login_defaultLanguage' => "pt-BR",
"dateFormat" => 'd \d\e F \d\e Y'
);
$value = serialize($value);
$query = "INSERT INTO CONFIGURATION (CFG_UID, CFG_VALUE) VALUES ('ENVIRONMENT_SETTINGS', '" . mysqli_real_escape_string($this->link, $value) . "')";
$this->mysqlQuery($query);
}
public function buildParternExtras($username, $password, $workspace, $lang, $skinName)
/**
* Define build Pattern Extras related to:
* Upload translation .po file
* Upload skin file
* Upload plugin file
* Active plugins to enterprise
*
* @param string $username
* @param string $password
* @param string $workspace
* @param string $lang
* @param string $skinName
*
* @return void
*/
private function buildParternExtras($username, $password, $workspace, $lang, $skinName)
{
$filter = new InputFilter();
ini_set('max_execution_time', '0');
ini_set('memory_limit', '256M');
$serv = 'http://';
if (isset($_SERVER['HTTPS']) && trim($_SERVER['HTTPS']) != '') {
if (isset($_SERVER['HTTPS']) && !empty(trim($_SERVER['HTTPS']))) {
$serv = 'https://';
}
$serv .= $_SERVER['SERVER_NAME'];
if (isset($_SERVER['SERVER_PORT']) && trim($_SERVER['SERVER_PORT']) != '') {
if (isset($_SERVER['SERVER_PORT']) && !empty(trim($_SERVER['SERVER_PORT']))) {
$serv .= ':' . $_SERVER['SERVER_PORT'];
}
@@ -1610,7 +1676,7 @@ class InstallerModule extends Controller
*/
$ch = curl_init();
$postData = array();
$postData = [];
// File to upload/post
$postData['form[LANGUAGE_FILENAME]'] = "@" . PATH_CORE . "content/translations/processmaker.$lang.po";
@@ -1633,7 +1699,7 @@ class InstallerModule extends Controller
*/
$ch = curl_init();
$postData = array();
$postData = [];
$skins = glob(PATH_CORE . "data/partner/*.tar");
if (count($skins) > 0) {
@@ -1666,7 +1732,7 @@ class InstallerModule extends Controller
*/
$ch = curl_init();
$postData = array();
$postData = [];
// resolv the plugin name
$plugins = glob(PATH_CORE . "plugins/*.tar");
if (count($plugins) > 0) {
@@ -1703,7 +1769,7 @@ class InstallerModule extends Controller
foreach ($plugins as $value) {
$dataPlugin = pathinfo($value);
$namePlugin = $dataPlugin['filename'];
if ($value != 'enterprise') {
if ($value !== 'enterprise') {
$db_hostname = trim($_REQUEST['db_hostname']);
$db_hostname = $filter->validateInput($db_hostname);
$db_port = trim($_REQUEST['db_port']);
@@ -1717,12 +1783,15 @@ class InstallerModule extends Controller
$db_host = ($db_port != '' && $db_port != 3306) ? $db_hostname . ':' . $db_port : $db_hostname;
$link = mysqli_connect($db_host, $db_username, $db_password, $wf);
mysqli_select_db($link, $wf);
$res = mysqli_query($link, "SELECT STORE_ID FROM ADDONS_MANAGER WHERE ADDON_NAME = '" . $namePlugin . "'");
if ($row = mysqli_fetch_array($res)) {
$row = DB::connection(self::CONNECTION_INSTALL)
->table('ADDONS_MANAGER')
->select('STORE_ID')
->where('ADDON_NAME', $namePlugin)
->toArray();
if ($row) {
$ch = curl_init();
$postData = array();
$postData = [];
$postData['action'] = "enable";
$postData['addon'] = $namePlugin;
$postData['store'] = $row['STORE_ID'];

View File

@@ -1,64 +1,43 @@
<?php
/**
* upgrade_SystemAjax.php
*
* ProcessMaker Open Source Edition
* Copyright (C) 2004 - 2010 Colosa Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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/>.
*
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*/
global $DB_ADAPTER;
global $DB_HOST;
global $DB_USER;
global $DB_PASS;
global $DB_NAME;
set_time_limit( 0 );
set_time_limit(0);
$id = '';
if (isset( $_POST['id'] ))
if (isset($_POST['id']))
$id = $_POST['id'];
$aUpgradeData = unserialize( file_get_contents( PATH_DATA . 'log' . PATH_SEP . "upgrade.data.bin" ) );
$aWorkspaces = $aUpgradeData['workspaces'];
$upgradeData = unserialize(file_get_contents(PATH_DATA . 'log' . PATH_SEP . "upgrade.data.bin"));
$workspaces = $upgradeData['workspaces'];
if (is_array( $aWorkspaces ) && count( $aWorkspaces ) > 0) {
$workspace = array_shift( $aUpgradeData['workspaces'] );
if (is_array($workspaces) && count($workspaces) > 0) {
$workspace = array_shift($upgradeData['workspaces']);
eval( getDatabaseCredentials( PATH_DB . $workspace . PATH_SEP . 'db.php' ) );
$oDataBase = new database( $DB_ADAPTER, $DB_HOST, $DB_USER, $DB_PASS, $DB_NAME );
$oDataBase->iFetchType = MYSQL_NUM;
eval(getDatabaseCredentials(PATH_DB . $workspace . PATH_SEP . 'db.php'));
$database = new database($DB_ADAPTER, $DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
$database->iFetchType = MYSQLI_NUM;
//processing .po file
if ($aUpgradeData['sPoFile'] != '') {
if (!empty($upgradeData['sPoFile'])) {
$oLanguages = new languages();
$oLanguages->importLanguage( $aUpgradeData['sPoFile'], $aUpgradeData['bForceXmlPoFile'] );
$aUpgradeData['bForceXmlPoFile'] = false;
$oLanguages->importLanguage($upgradeData['sPoFile'], $upgradeData['bForceXmlPoFile']);
$upgradeData['bForceXmlPoFile'] = false;
}
if ($aUpgradeData['sSchemaFile'] != '')
processMasterSchemaFile( $aUpgradeData['sSchemaFile'] );
if ($upgradeData['sSchemaFile'] != '')
processMasterSchemaFile($upgradeData['sSchemaFile']);
//draw a gauge control indicating the progress in workspaces
$gauge = intval( (($aUpgradeData['wsQuantity'] - count( $aWorkspaces ) + 1) / $aUpgradeData['wsQuantity']) * 301 );
//draw a gauge control indicating the progress in workspaces
$gauge = intval((($upgradeData['wsQuantity'] - count($workspaces) + 1) / $upgradeData['wsQuantity']) * 301);
print "<table cellpadding=0><tr><td><img src='/images/ajax-loader.gif' border=0/></td><td>";
print "<div style='border-style:solid;border-width:1px; border-color: #A1C868; width:300px; height:19px;' >";
print "<div style='color:#FFF; height:16px; text-align:center; padding-top:3px; background-image: url(/skins/green/images/bm.jpg); background-repeat: repeat-x; width: {$gauge}px' ></div> </div>";
print "</td><td width='40%'><font color=black> Upgrading the workspace </font><b><font color=green>".$filter->xssFilterHard($workspace)."</font></b></td><td width=250 align=right>| ".$filter->xssFilterHard($id)." Remaining</td></tr></table>";
file_put_contents( PATH_DATA . 'log' . PATH_SEP . "upgrade.data.bin", serialize( $aUpgradeData ) );
print "</td><td width='40%'><font color=black> Upgrading the workspace </font><b><font color=green>" . $filter->xssFilterHard($workspace) . "</font></b></td><td width=250 align=right>| " . $filter->xssFilterHard($id) . " Remaining</td></tr></table>";
file_put_contents(PATH_DATA . 'log' . PATH_SEP . "upgrade.data.bin", serialize($upgradeData));
} else {
print "<table cellpadding=0><tr><td>&nbsp;&nbsp;&nbsp;&nbsp;</td><td>";
print "<div style='border-style:solid;border-width:1px; border-color: #A1C868; width:300px; height:19px;' >";
@@ -68,92 +47,92 @@ if (is_array( $aWorkspaces ) && count( $aWorkspaces ) > 0) {
die();
function getDatabaseCredentials ($dbFile)
function getDatabaseCredentials($dbFile)
{
$sContent = file_get_contents( $dbFile );
$sContent = str_replace( '<?php', '', $sContent );
$sContent = str_replace( '<?', '', $sContent );
$sContent = str_replace( '?>', '', $sContent );
$sContent = str_replace( 'define', '', $sContent );
$sContent = str_replace( "('", '$', $sContent );
$sContent = str_replace( "',", '=', $sContent );
$sContent = str_replace( ");", ';', $sContent );
$sContent = file_get_contents($dbFile);
$sContent = str_replace('<?php', '', $sContent);
$sContent = str_replace('<?', '', $sContent);
$sContent = str_replace('?>', '', $sContent);
$sContent = str_replace('define', '', $sContent);
$sContent = str_replace("('", '$', $sContent);
$sContent = str_replace("',", '=', $sContent);
$sContent = str_replace(");", ';', $sContent);
return $sContent;
}
function processMasterSchemaFile ($sSchemaFile)
function processMasterSchemaFile($schemaFile)
{
global $DB_ADAPTER;
global $DB_HOST;
global $DB_USER;
global $DB_PASS;
global $DB_NAME;
global $aUpgradeData;
global $upgradeData;
//convert newSchema to array
if (isset( $aUpgradeData['aNewSchema'] )) {
$aNewSchema = $aUpgradeData['aNewSchema'];
if (isset($upgradeData['aNewSchema'])) {
$newSchema = $upgradeData['aNewSchema'];
} else {
$aNewSchema = schemaToArray( $sSchemaFile );
$aUpgradeData['aNewSchema'] = $aNewSchema;
$newSchema = schemaToArray($schemaFile);
$upgradeData['aNewSchema'] = $newSchema;
}
$aOldSchema = processSchemaFile();
if (is_null( $aOldSchema )) {
$oldSchema = processSchemaFile();
if (is_null($oldSchema)) {
return;
}
$aChanges = obtainChanges( $aOldSchema, $aNewSchema );
$changes = obtainChanges($oldSchema, $newSchema);
$oDataBase = new database( $DB_ADAPTER, $DB_HOST, $DB_USER, $DB_PASS, $DB_NAME );
if (! $oDataBase->isConnected()) {
$database = new database($DB_ADAPTER, $DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (!$database->isConnected()) {
return;
}
$oDataBase->iFetchType = MYSQL_NUM;
$database->iFetchType = MYSQLI_NUM;
$oDataBase->logQuery( count( $aChanges ) );
$database->logQuery(count($changes));
foreach ($aChanges['tablesToAdd'] as $sTable => $aColumns) {
$oDataBase->executeQuery( $oDataBase->generateCreateTableSQL( $sTable, $aColumns ) );
if (isset( $aChanges['tablesToAdd'][$sTable]['INDEXES'] )) {
foreach ($aChanges['tablesToAdd'][$sTable]['INDEXES'] as $indexName => $aIndex) {
$oDataBase->executeQuery( $oDataBase->generateAddKeysSQL( $sTable, $indexName, $aIndex ) );
foreach ($changes['tablesToAdd'] as $table => $columns) {
$database->executeQuery($database->generateCreateTableSQL($table, $columns));
if (isset($changes['tablesToAdd'][$table]['INDEXES'])) {
foreach ($changes['tablesToAdd'][$table]['INDEXES'] as $indexName => $attribute) {
$database->executeQuery($database->generateAddKeysSQL($table, $indexName, $attribute));
}
}
}
foreach ($aChanges['tablesToAlter'] as $sTable => $aActions) {
foreach ($aActions as $sAction => $aAction) {
foreach ($aAction as $sColumn => $vData) {
switch ($sAction) {
foreach ($changes['tablesToAlter'] as $table => $actions) {
foreach ($actions as $key => $action) {
foreach ($action as $column => $data) {
switch ($key) {
case 'DROP':
$oDataBase->executeQuery( $oDataBase->generateDropColumnSQL( $sTable, $vData ) );
$database->executeQuery($database->generateDropColumnSQL($table, $data));
break;
case 'ADD':
$oDataBase->executeQuery( $oDataBase->generateAddColumnSQL( $sTable, $sColumn, $vData ) );
$database->executeQuery($database->generateAddColumnSQL($table, $column, $data));
break;
case 'CHANGE':
$oDataBase->executeQuery( $oDataBase->generateChangeColumnSQL( $sTable, $sColumn, $vData ) );
$database->executeQuery($database->generateChangeColumnSQL($table, $column, $data));
break;
}
}
}
}
foreach ($aChanges['tablesWithNewIndex'] as $sTable => $aIndexes) {
foreach ($aIndexes as $sIndexName => $aIndexFields) {
$oDataBase->executeQuery( $oDataBase->generateAddKeysSQL( $sTable, $sIndexName, $aIndexFields ) );
foreach ($changes['tablesWithNewIndex'] as $table => $index) {
foreach ($index as $indexName => $indexFields) {
$database->executeQuery($database->generateAddKeysSQL($table, $indexName, $indexFields));
}
}
foreach ($aChanges['tablesToAlterIndex'] as $sTable => $aIndexes) {
foreach ($aIndexes as $sIndexName => $aIndexFields) {
$oDataBase->executeQuery( $oDataBase->generateDropKeySQL( $sTable, $sIndexName ) );
$oDataBase->executeQuery( $oDataBase->generateAddKeysSQL( $sTable, $sIndexName, $aIndexFields ) );
foreach ($changes['tablesToAlterIndex'] as $table => $index) {
foreach ($index as $indexName => $indexFields) {
$database->executeQuery($database->generateDropKeySQL($table, $indexName));
$database->executeQuery($database->generateAddKeysSQL($table, $indexName, $indexFields));
}
}
$oDataBase->close();
$database->close();
}
function processSchemaFile ()
function processSchemaFile()
{
global $DB_ADAPTER;
global $DB_HOST;
@@ -162,232 +141,210 @@ function processSchemaFile ()
global $DB_NAME;
try {
$oldSchema = [];
$database = new database($DB_ADAPTER, $DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
$aOldSchema = array ();
$oDataBase = new database( $DB_ADAPTER, $DB_HOST, $DB_USER, $DB_PASS, $DB_NAME );
if (! $oDataBase->isConnected()) {
$oDataBase->logQuery( G::LoadTranslation('ID_DOES_NOT_EXIST_AVAILABLE_CONNECTION') );
if (!$database->isConnected()) {
$database->logQuery(G::LoadTranslation('ID_DOES_NOT_EXIST_AVAILABLE_CONNECTION'));
return null;
}
$oDataBase->iFetchType = MYSQL_NUM;
$oDataset1 = $oDataBase->executeQuery( $oDataBase->generateShowTablesSQL() );
$database->iFetchType = MYSQLI_NUM;
$result = $database->executeQuery($database->generateShowTablesSQL());
} catch (Exception $e) {
$oDataBase->logQuery( $e->getmessage() );
$database->logQuery($e->getmessage());
return null;
}
//going thru all tables in current WF_ database
while ($aRow1 = $oDataBase->getRegistry( $oDataset1 )) {
$aPrimaryKeys = array ();
$sTable = strtoupper( $aRow1[0] );
foreach ($result as $table) {
$table = strtoupper($table);
//get description of each table, ( column and primary keys )
//$oDataset2 = $oDataBase->executeQuery( $oDataBase->generateDescTableSQL($aRow1[0]) );
$oDataset2 = $oDataBase->executeQuery( $oDataBase->generateDescTableSQL( $sTable ) );
$aOldSchema[$sTable] = array ();
$oDataBase->iFetchType = MYSQL_ASSOC;
while ($aRow2 = $oDataBase->getRegistry( $oDataset2 )) {
$aOldSchema[$sTable][$aRow2['Field']]['Field'] = $aRow2['Field'];
$aOldSchema[$sTable][$aRow2['Field']]['Type'] = $aRow2['Type'];
$aOldSchema[$sTable][$aRow2['Field']]['Null'] = $aRow2['Null'];
$aOldSchema[$sTable][$aRow2['Field']]['Default'] = $aRow2['Default'];
$database->iFetchType = MYSQLI_ASSOC;
$description = $database->executeQuery($database->generateDescTableSQL($table));
$oldSchema[$table] = [];
foreach ($description as $field) {
$oldSchema[$table][$field['Field']]['Field'] = $field['Field'];
$oldSchema[$table][$field['Field']]['Type'] = $field['Type'];
$oldSchema[$table][$field['Field']]['Null'] = $field['Null'];
$oldSchema[$table][$field['Field']]['Default'] = $field['Default'];
}
//get indexes of each table SHOW INDEX FROM `ADDITIONAL_TABLES`; -- WHERE Key_name <> 'PRIMARY'
$oDataset2 = $oDataBase->executeQuery( $oDataBase->generateTableIndexSQL( $aRow1[0] ) );
$oDataBase->iFetchType = MYSQL_ASSOC;
while ($aRow2 = $oDataBase->getRegistry( $oDataset2 )) {
if (! isset( $aOldSchema[$sTable]['INDEXES'] )) {
$aOldSchema[$sTable]['INDEXES'] = array ();
$description = $database->executeQuery($database->generateTableIndexSQL($table));
foreach ($description as $field) {
if (!isset($oldSchema[$table]['INDEXES'])) {
$oldSchema[$table]['INDEXES'] = [];
}
if (! isset( $aOldSchema[$sTable]['INDEXES'][$aRow2['Key_name']] )) {
$aOldSchema[$sTable]['INDEXES'][$aRow2['Key_name']] = array ();
if (!isset($oldSchema[$table]['INDEXES'][$field['Key_name']])) {
$oldSchema[$table]['INDEXES'][$field['Key_name']] = [];
}
$aOldSchema[$sTable]['INDEXES'][$aRow2['Key_name']][] = $aRow2['Column_name'];
$oldSchema[$table]['INDEXES'][$field['Key_name']][] = $field['Column_name'];
}
$oDataBase->iFetchType = MYSQL_NUM; //this line is neccesary because the next fetch needs to be with MYSQL_NUM
}
//finally return the array with old schema obtained from the Database
if (count( $aOldSchema ) == 0)
$aOldSchema = null;
return $aOldSchema;
if (count($oldSchema) === 0) {
$oldSchema = null;
}
return $oldSchema;
}
//process the schema file in the patch file, and obtain an array
function schemaToArray ($sSchemaFile)
function schemaToArray($schemaFile)
{
try {
$aSchema = array ();
$oXml = new DomDocument();
$oXml->load( $sSchemaFile );
$aTables = $oXml->getElementsByTagName( 'table' );
foreach ($aTables as $oTable) {
$aPrimaryKeys = array ();
$sTableName = $oTable->getAttribute( 'name' );
$aSchema[$sTableName] = array ();
$aColumns = $oTable->getElementsByTagName( 'column' );
foreach ($aColumns as $oColumn) {
$sColumName = $oColumn->getAttribute( 'name' );
$aSchema[$sTableName][$sColumName] = array ();
$aVendors = $oColumn->getElementsByTagName( 'vendor' );
foreach ($aVendors as $oVendor) {
if ($oVendor->getAttribute( 'type' ) == DB_ADAPTER) {
$schema = [];
$xml = new DomDocument();
$xml->load($schemaFile);
$tables = $xml->getElementsByTagName('table');
foreach ($tables as $table) {
$primaryKeys = [];
$tableName = $table->getAttribute('name');
$schema[$tableName] = [];
$columns = $table->getElementsByTagName('column');
foreach ($columns as $column) {
$columnName = $column->getAttribute('name');
$schema[$tableName][$columnName] = [];
$vendors = $column->getElementsByTagName('vendor');
foreach ($vendors as $vendor) {
if ($vendor->getAttribute('type') == config('connections.driver')) {
break;
}
}
$aParameters = $oColumn->getElementsByTagName( 'parameter' );
foreach ($aParameters as $oParameter) {
$parameterName = ucwords( $oParameter->getAttribute( 'name' ) );
if ($parameterName == 'Key' && strtoupper( $oParameter->getAttribute( 'value' ) ) == 'PRI') {
$aPrimaryKeys[] = $oColumn->getAttribute( 'name' );
$parameters = $column->getElementsByTagName('parameter');
foreach ($parameters as $oParameter) {
$parameterName = ucwords($oParameter->getAttribute('name'));
if ($parameterName == 'Key' && strtoupper($oParameter->getAttribute('value')) == 'PRI') {
$primaryKeys[] = $column->getAttribute('name');
}
if (in_array( $parameterName, array ('Field','Type','Null','Default'
) )) {
$aSchema[$sTableName][$sColumName][$parameterName] = $oParameter->getAttribute( 'value' );
if (in_array($parameterName, ['Field', 'Type', 'Null', 'Default'])) {
$schema[$tableName][$columnName][$parameterName] = $oParameter->getAttribute('value');
}
}
}
if (is_array( $aPrimaryKeys ) && count( $aPrimaryKeys ) > 0) {
$aSchema[$sTableName]['INDEXES']['PRIMARY'] = $aPrimaryKeys;
if (is_array($primaryKeys) && count($primaryKeys) > 0) {
$schema[$tableName]['INDEXES']['PRIMARY'] = $primaryKeys;
}
$aIndexes = $oTable->getElementsByTagName( 'index' );
foreach ($aIndexes as $oIndex) {
$aIndex = array ();
$aIndexesColumns = $oIndex->getElementsByTagName( 'index-column' );
$index = $table->getElementsByTagName('index');
foreach ($index as $fieldIndex) {
$attribute = [];
$aIndexesColumns = $fieldIndex->getElementsByTagName('index-column');
foreach ($aIndexesColumns as $oIndexColumn) {
$aIndex[] = $oIndexColumn->getAttribute( 'name' );
$attribute[] = $oIndexColumn->getAttribute('name');
}
$aSchema[$sTableName]['INDEXES'][$oIndex->getAttribute( 'name' )] = $aIndex;
$schema[$tableName]['INDEXES'][$fieldIndex->getAttribute('name')] = $attribute;
}
}
return $aSchema;
return $schema;
} catch (Exception $oError) {
throw $oError;
}
}
function obtainChanges ($aOldSchema, $aNewSchema)
function obtainChanges($oldSchema, $newSchema)
{
//$aChanges = array('tablesToDelete' => array(), 'tablesToAdd' => array(), 'tablesToAlter' => array());
//Tables to delete, but this is disabled
//foreach ($aOldSchema as $sTableName => $aColumns) {
// if ( !isset($aNewSchema[$sTableName])) {
// if (!in_array($sTableName, array('KT_APPLICATION', 'KT_DOCUMENT', 'KT_PROCESS'))) {
// $aChanges['tablesToDelete'][] = $sTableName;
// }
// }
//}
$aChanges = array ('tablesToAdd' => array (),'tablesToAlter' => array (),'tablesWithNewIndex' => array (),'tablesToAlterIndex' => array ()
);
$changes = ['tablesToAdd' => [], 'tablesToAlter' => [], 'tablesWithNewIndex' => [], 'tablesToAlterIndex' => []];
//new tables to create and alter
foreach ($aNewSchema as $sTableName => $aColumns) {
if (! isset( $aOldSchema[$sTableName] )) {
$aChanges['tablesToAdd'][$sTableName] = $aColumns;
foreach ($newSchema as $tableName => $columns) {
if (!isset($oldSchema[$tableName])) {
$changes['tablesToAdd'][$tableName] = $columns;
} else {
//drop old columns
foreach ($aOldSchema[$sTableName] as $sColumName => $aParameters) {
if (! isset( $aNewSchema[$sTableName][$sColumName] )) {
if (! isset( $aChanges['tablesToAlter'][$sTableName] )) {
$aChanges['tablesToAlter'][$sTableName] = array ('DROP' => array (),'ADD' => array (),'CHANGE' => array ()
);
foreach ($oldSchema[$tableName] as $columnName => $parameters) {
if (!isset($newSchema[$tableName][$columnName])) {
if (!isset($changes['tablesToAlter'][$tableName])) {
$changes['tablesToAlter'][$tableName] = ['DROP' => [], 'ADD' => [], 'CHANGE' => []];
}
$aChanges['tablesToAlter'][$sTableName]['DROP'][$sColumName] = $sColumName;
$changes['tablesToAlter'][$tableName]['DROP'][$columnName] = $columnName;
}
}
//create new columns
//foreach ($aNewSchema[$sTableName] as $sColumName => $aParameters) {
foreach ($aColumns as $sColumName => $aParameters) {
if ($sColumName != 'INDEXES') {
if (! isset( $aOldSchema[$sTableName][$sColumName] )) { //this column doesnt exist in oldschema
if (! isset( $aChanges['tablesToAlter'][$sTableName] )) {
$aChanges['tablesToAlter'][$sTableName] = array ('DROP' => array (),'ADD' => array (),'CHANGE' => array ()
);
foreach ($columns as $columnName => $parameters) {
if ($columnName != 'INDEXES') {
if (!isset($oldSchema[$tableName][$columnName])) { //this column doesnt exist in oldschema
if (!isset($changes['tablesToAlter'][$tableName])) {
$changes['tablesToAlter'][$tableName] = ['DROP' => [], 'ADD' => [], 'CHANGE' => []];
}
$aChanges['tablesToAlter'][$sTableName]['ADD'][$sColumName] = $aParameters;
$changes['tablesToAlter'][$tableName]['ADD'][$columnName] = $parameters;
} else { //the column exists
$newField = $aNewSchema[$sTableName][$sColumName];
$oldField = $aOldSchema[$sTableName][$sColumName];
$newField = $newSchema[$tableName][$columnName];
$oldField = $oldSchema[$tableName][$columnName];
//both are null, no change is required
if (! isset( $newField['Default'] ) && ! isset( $oldField['Default'] ))
if (!isset($newField['Default']) && !isset($oldField['Default']))
$changeDefaultAttr = false;
//one of them is null, change IS required
if (! isset( $newField['Default'] ) && isset( $oldField['Default'] ) && $oldField['Default'] != '')
//one of them is null, change IS required
if (!isset($newField['Default']) && isset($oldField['Default']) && $oldField['Default'] != '')
$changeDefaultAttr = true;
if (isset( $newField['Default'] ) && ! isset( $oldField['Default'] ))
if (isset($newField['Default']) && !isset($oldField['Default']))
$changeDefaultAttr = true;
//both are defined and they are different.
if (isset( $newField['Default'] ) && isset( $oldField['Default'] )) {
if ($newField['Default'] != $oldField['Default'])
//both are defined and they are different.
if (isset($newField['Default']) && isset($oldField['Default'])) {
$changeDefaultAttr = false;
if ($newField['Default'] != $oldField['Default']) {
$changeDefaultAttr = true;
else
$changeDefaultAttr = false;
}
}
//special cases
// BLOB and TEXT columns cannot have DEFAULT values. http://dev.mysql.com/doc/refman/5.0/en/blob.html
if (in_array( strtolower( $newField['Type'] ), array ('text','mediumtext'
) ))
if (in_array(strtolower($newField['Type']), ['text', 'mediumtext']))
$changeDefaultAttr = false;
//#1067 - Invalid default value for datetime field
if (in_array( $newField['Type'], array ('datetime'
) ) && isset( $newField['Default'] ) && $newField['Default'] == '')
//#1067 - Invalid default value for datetime field
if (in_array($newField['Type'], ['datetime']) && isset($newField['Default']) && $newField['Default'] == '') {
$changeDefaultAttr = false;
}
//#1067 - Invalid default value for int field
if (substr( $newField['Type'], 0, 3 ) && isset( $newField['Default'] ) && $newField['Default'] == '')
//#1067 - Invalid default value for int field
if (substr($newField['Type'], 0, 3) && isset($newField['Default']) && $newField['Default'] == '') {
$changeDefaultAttr = false;
}
//if any difference exists, then insert the difference in aChanges
//if any difference exists, then insert the difference in aChanges
if ($newField['Field'] != $oldField['Field'] || $newField['Type'] != $oldField['Type'] || $newField['Null'] != $oldField['Null'] || $changeDefaultAttr) {
if (! isset( $aChanges['tablesToAlter'][$sTableName] )) {
$aChanges['tablesToAlter'][$sTableName] = array ('DROP' => array (),'ADD' => array (),'CHANGE' => array ()
);
if (!isset($changes['tablesToAlter'][$tableName])) {
$changes['tablesToAlter'][$tableName] = ['DROP' => [], 'ADD' => [], 'CHANGE' => []];
}
$changes['tablesToAlter'][$tableName]['CHANGE'][$columnName]['Field'] = $newField['Field'];
$changes['tablesToAlter'][$tableName]['CHANGE'][$columnName]['Type'] = $newField['Type'];
$changes['tablesToAlter'][$tableName]['CHANGE'][$columnName]['Null'] = $newField['Null'];
if (isset($newField['Default'])) {
$changes['tablesToAlter'][$tableName]['CHANGE'][$columnName]['Default'] = $newField['Default'];
} else {
$changes['tablesToAlter'][$tableName]['CHANGE'][$columnName]['Default'] = null;
}
$aChanges['tablesToAlter'][$sTableName]['CHANGE'][$sColumName]['Field'] = $newField['Field'];
$aChanges['tablesToAlter'][$sTableName]['CHANGE'][$sColumName]['Type'] = $newField['Type'];
$aChanges['tablesToAlter'][$sTableName]['CHANGE'][$sColumName]['Null'] = $newField['Null'];
if (isset( $newField['Default'] ))
$aChanges['tablesToAlter'][$sTableName]['CHANGE'][$sColumName]['Default'] = $newField['Default'];
else
$aChanges['tablesToAlter'][$sTableName]['CHANGE'][$sColumName]['Default'] = null;
}
}
} //only columns, no the indexes column
} //foreach $aColumns
} //foreach $columns
//now check the indexes of table
if (isset( $aNewSchema[$sTableName]['INDEXES'] )) {
foreach ($aNewSchema[$sTableName]['INDEXES'] as $indexName => $indexFields) {
if (! isset( $aOldSchema[$sTableName]['INDEXES'][$indexName] )) {
if (! isset( $aChanges['tablesWithNewIndex'][$sTableName] )) {
$aChanges['tablesWithNewIndex'][$sTableName] = array ();
if (isset($newSchema[$tableName]['INDEXES'])) {
foreach ($newSchema[$tableName]['INDEXES'] as $indexName => $indexFields) {
if (!isset($oldSchema[$tableName]['INDEXES'][$indexName])) {
if (!isset($changes['tablesWithNewIndex'][$tableName])) {
$changes['tablesWithNewIndex'][$tableName] = [];
}
$aChanges['tablesWithNewIndex'][$sTableName][$indexName] = $indexFields;
$changes['tablesWithNewIndex'][$tableName][$indexName] = $indexFields;
} else {
if ($aOldSchema[$sTableName]['INDEXES'][$indexName] != $indexFields) {
if (! isset( $aChanges['tablesToAlterIndex'][$sTableName] )) {
$aChanges['tablesToAlterIndex'][$sTableName] = array ();
if ($oldSchema[$tableName]['INDEXES'][$indexName] != $indexFields) {
if (!isset($changes['tablesToAlterIndex'][$tableName])) {
$changes['tablesToAlterIndex'][$tableName] = [];
}
$aChanges['tablesToAlterIndex'][$sTableName][$indexName] = $indexFields;
$changes['tablesToAlterIndex'][$tableName][$indexName] = $indexFields;
}
}
}
}
} //for-else table exists
} //for new schema
return $aChanges;
return $changes;
}

View File

@@ -4,9 +4,14 @@ namespace ProcessMaker\Core;
use AppCacheView;
use Archive_Tar;
use Bootstrap;
use Configuration;
use Exception;
use G;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use InstallerModule;
use ProcessMaker\Util\Common;
class Installer
{
@@ -16,6 +21,9 @@ class Installer
public $report = [];
private $connection_database;
const CONNECTION_INSTALL = 'install';
const CONNECTION_TEST_INSTALL = 'testInstall';
/**
* construct of insert
*
@@ -31,18 +39,41 @@ class Installer
*
* @param array $config
* @param boolean $confirmed
* @return void
* @return array
*/
public function create_site($config = array(), $confirmed = false)
public function create_site($config = [], $confirmed = false)
{
$this->options = G::array_concat(array('isset' => false, 'password' => G::generate_password(15), '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();
$this->options = G::array_concat([
'isset' => false,
'password' => G::generate_password(15),
'path_data' => @PATH_DATA,
'path_compiled' => @PATH_C,
'name' => $config['name'],
'database' => [],
'admin' => ['username' => 'admin', 'password' => 'admin'],
'advanced' => [
'ao_db_wf' => 'wf_' . $config['name'],
'ao_db_rb' => 'rb_' . $config['name'],
'ao_db_rp' => 'rp_' . $config['name'],
'ao_db_drop' => false
]
], $config);
$configuration = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH));
$host = explode(':', $configuration[0]);
if (count($host) < 2) {
$host[1] = 3306;
}
$configuration[0] = $host[0];
$this->options['database'] = G::array_concat([
'username' => @$configuration[1],
'password' => @$configuration[2],
'hostname' => @$configuration[0],
'port' => $host[1]
], $this->options['database']);
return $confirmed ? $this->make_site() : $this->create_site_test();
}
/**
@@ -67,30 +98,44 @@ class Installer
/**
* create_site_test
*
* @return void
* @return array
*/
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'];
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['admin']['username'],
(($result['isset']) ? false : true),
$result['admin']['password']
),
$name = preg_match('/^[\w]+$/i', trim($this->options['name'])) ? true : false;
$result = [
'path_data' => $this->is_dir_writable($this->options['path_data']),
'path_compiled' => $this->is_dir_writable($this->options['path_compiled']),
'database' => $this->check_connection(self::CONNECTION_TEST_INSTALL),
'access_level' => $this->cc_status,
'isset' => $this->options['isset'] === true ? $this->isset_site($this->options['name']) : false,
'microtime' => microtime(),
'workspace' => $this->options['name'],
'name' => [
'status' => $name,
'message' => $name ? 'PASSED' : 'Workspace name invalid'
],
'admin' => [
'username' => preg_match('/^[\w@\.-]+$/i', trim($this->options['admin']['username'])) ? true : false,
'password' => empty(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'];
return [
'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['admin']['username'],
$result['isset'] ? false : true,
$result['admin']['password']
),
'result' => $result
);
];
}
/**
@@ -102,9 +147,10 @@ class Installer
{
$test = $this->create_site_test();
if ($test["created"] == true || $this->options["advanced"]["ao_db_drop"] == true) {
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);
$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->wf_user_db = isset($this->options['advanced']['ao_user_wf']) ? $this->options['advanced']['ao_user_wf'] : uniqid('wf_');
@@ -118,36 +164,39 @@ class Installer
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 ' . $wf, 'Drop database $wf', self::CONNECTION_TEST_INSTALL);
}
$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 ' . $wf . ' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci', "Create database $wf", self::CONNECTION_TEST_INSTALL);
if ($this->cc_status == 1) {
$host = ($islocal) ? "localhost" : "%";
$this->run_query("GRANT ALL PRIVILEGES ON `$wf`.* TO {$this->wf_user_db}@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", "Grant privileges for user {$this->wf_user_db} on database $wf");
$this->run_query("GRANT ALL PRIVILEGES ON `$wf`.* TO {$this->wf_user_db}@'$host' IDENTIFIED BY '{$this->options['password']}' WITH GRANT OPTION", "Grant privileges for user {$this->wf_user_db} on database $wf", self::CONNECTION_TEST_INSTALL);
}
/* 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];
mysqli_select_db($this->connection_database, $wf);
InstallerModule::setNewConnection(
self::CONNECTION_INSTALL,
$this->options['database']['hostname'],
$this->options['database']['username'],
$this->options['database']['password'],
$this->wf_site_name,
$this->options['database']['port']);
$pws = PATH_WORKFLOW_MYSQL_DATA . $schema;
$qws = $this->query_sql_file(PATH_WORKFLOW_MYSQL_DATA . $schema, $this->connection_database);
$qws = $this->query_sql_file(PATH_WORKFLOW_MYSQL_DATA . $schema);
$this->log($qws, isset($qws['errors']));
$qwv = $this->query_sql_file(PATH_WORKFLOW_MYSQL_DATA . $values, $this->connection_database);
$qwv = $this->query_sql_file(PATH_WORKFLOW_MYSQL_DATA . $values);
$this->log($qwv, isset($qwv['errors']));
$http = (G::is_https() == true) ? 'https' : 'http';
$http = G::is_https() ? 'https' : 'http';
$lang = defined('SYS_LANG') ? SYS_LANG : 'en';
$host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] != '80' ? ':' . $_SERVER['SERVER_PORT'] : '');
$host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] !== '80' ? ':' . $_SERVER['SERVER_PORT'] : '');
$workspace = $this->options['name'];
$endpoint = sprintf(
@@ -159,33 +208,37 @@ class Installer
SYS_SKIN
);
// inserting the outh_client
$query = ("INSERT INTO OAUTH_CLIENTS (CLIENT_ID,CLIENT_SECRET,CLIENT_NAME,CLIENT_DESCRIPTION,CLIENT_WEBSITE,REDIRECT_URI,USR_UID ) VALUES
('x-pm-local-client','179ad45c6ce2cb97cf1029e212046e81','PM Web Designer','ProcessMaker Web Designer App','www.processmaker.com','" . $endpoint . "','00000000000000000000000000000001' )");
$this->run_query($query);
DB::connection(self::CONNECTION_INSTALL)
->table('OAUTH_CLIENTS')
->insert([
'CLIENT_ID' => 'x-pm-local-client',
'CLIENT_SECRET' => '179ad45c6ce2cb97cf1029e212046e81',
'CLIENT_NAME' => 'PM Web Designer',
'CLIENT_DESCRIPTION' => 'ProcessMaker Web Designer App',
'CLIENT_WEBSITE' => 'www.processmaker.com',
'REDIRECT_URI' => $endpoint,
'USR_UID' => '00000000000000000000000000000001'
]);
/* Dump schema rbac && data */
$pws = PATH_RBAC_MYSQL_DATA . $schema;
mysqli_select_db($this->connection_database, $rb);
$qrs = $this->query_sql_file(PATH_RBAC_MYSQL_DATA . $schema, $this->connection_database);
$qrs = $this->query_sql_file(PATH_RBAC_MYSQL_DATA . $schema);
$this->log($qrs, isset($qrs['errors']));
$qrv = $this->query_sql_file(PATH_RBAC_MYSQL_DATA . $values, $this->connection_database);
$qrv = $this->query_sql_file(PATH_RBAC_MYSQL_DATA . $values);
$this->log($qrv, isset($qrv['errors']));
mysqli_select_db($this->connection_database, $wf);
require_once("propel/Propel.php");
require_once('classes/model/AppCacheView.php');
$appCache = new AppCacheView();
$appCache->setPathToAppCacheFiles(PATH_METHODS . 'setup/setupSchemas/');
$triggers = $appCache->getTriggers("en");
$triggers = $appCache->getTriggers('en');
$this->log("Create 'cases list cache' triggers");
foreach ($triggers as $triggerName => $trigger) {
$this->run_query($trigger, "-> Trigger $triggerName");
$this->runTrigger($trigger, "-> Trigger $triggerName");
}
$path_site = $this->options['path_data'] . "/sites/" . $this->options['name'] . "/";
$path_site = $this->options['path_data'] . '/sites/' . $this->options['name'] . '/';
@mkdir($path_site, 0777, true);
@mkdir($path_site . "files/", 0777, true);
@@ -195,8 +248,27 @@ class Installer
@mkdir($path_site . "xmlForms", 0777, true);
//Generate the db.php file
$hostname = $this->options['database']['hostname'] . ':' . $this->options['database']['port'];
$username = $this->cc_status === 1 ? $this->wf_user_db : $this->options['database']['username'];
$password = $this->cc_status === 1 ? $this->options['password'] : $this->options['database']['password'];
$db_file = $path_site . 'db.php';
$db_text = "<?php\n" . "// Processmaker configuration\n" . "define ('DB_ADAPTER', 'mysql' );\n" . "define ('DB_HOST', '" . $this->options['database']['hostname'] . ":" . $myPort . "' );\n" . "define ('DB_NAME', '" . $wf . "' );\n" . "define ('DB_USER', '" . (($this->cc_status == 1) ? $this->wf_user_db : $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) ? $this->wf_user_db : $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) ? $this->wf_user_db : $this->options['database']['username']) . "' );\n" . "define ('DB_REPORT_PASS', '" . (($this->cc_status == 1) ? $this->options['password'] : $this->options['database']['password']) . "' );\n";
$db_text = "<?php\n"
. "// Processmaker configuration\n"
. " define ('DB_ADAPTER', 'mysql' );\n"
. " define ('DB_HOST', '" . $hostname . "' );\n"
. " define ('DB_NAME', '" . $wf . "' );\n"
. " define ('DB_USER', '" . $username . "' );\n"
. " define ('DB_PASS', '" . $password . "' );\n"
. " define ('DB_RBAC_HOST', '" . $hostname . "' );\n"
. " define ('DB_RBAC_NAME', '" . $rb . "' );\n"
. " define ('DB_RBAC_USER', '" . $username . "' );\n"
. " define ('DB_RBAC_PASS', '" . $password . "' );\n"
. " define ('DB_REPORT_HOST', '" . $hostname . "' );\n"
. " define ('DB_REPORT_NAME', '" . $rp . "' );\n"
. " define ('DB_REPORT_USER', '" . $username . "' );\n"
. " define ('DB_REPORT_PASS', '" . $password . "' );\n"
. "";
if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) {
$db_text .= "define ('PARTNER_FLAG', " . ((defined('PARTNER_FLAG') && PARTNER_FLAG != '') ? PARTNER_FLAG : ((isset($_REQUEST['PARTNER_FLAG'])) ? $_REQUEST['PARTNER_FLAG'] : 'false')) . ");\n";
if (defined('SYSTEM_NAME')) {
@@ -207,7 +279,7 @@ class Installer
$fp = @fopen($db_file, "w");
$this->log("Create: " . $db_file . " => " . ((!$fp) ? $fp : "OK") . "\n", $fp === false);
$ff = @fputs($fp, $db_text, strlen($db_text));
$ff = @fwrite($fp, $db_text, strlen($db_text));
$this->log("Write: " . $db_file . " => " . ((!$ff) ? $ff : "OK") . "\n", $ff === false);
fclose($fp);
@@ -218,7 +290,7 @@ class Installer
$fp = @fopen($envIniFile, 'w');
$this->log('Create: ' . $envIniFile . ' => ' . ((!$fp) ? $fp : 'OK') . "\n", $fp === false);
$ff = @fputs($fp, $content, strlen($content));
$ff = @fwrite($fp, $content, strlen($content));
$this->log('Write: ' . $envIniFile . ' => ' . ((!$ff) ? $ff : 'OK') . "\n", $ff === false);
fclose($fp);
/*----------------------------------********---------------------------------*/
@@ -227,9 +299,12 @@ class Installer
$this->setPartner();
$this->setAdmin();
$querySql = "INSERT INTO EMAIL_SERVER(MESS_UID, MESS_ENGINE) VALUES('" . \ProcessMaker\Util\Common::generateUID() . "', 'MAIL')";
$this->run_query($querySql);
DB::connection(self::CONNECTION_INSTALL)
->table('EMAIL_SERVER')
->insert([
'MESS_UID' => Common::generateUID(),
'MESS_ENGINE' => 'MAIL'
]);
}
return $test;
}
@@ -246,10 +321,9 @@ class Installer
// Execute sql for partner
$pathMysqlPartner = PATH_CORE . 'data' . PATH_SEP . 'partner' . PATH_SEP . 'mysql' . PATH_SEP;
if (G::verifyPath($pathMysqlPartner)) {
$res = [];
$filesSlq = glob($pathMysqlPartner . '*.sql');
foreach ($filesSlq as $value) {
$this->query_sql_file($value, $this->connection_database);
$this->query_sql_file($value);
}
}
@@ -406,10 +480,10 @@ class Installer
*/
public function setConfiguration()
{
$oConf = new Configuration();
$dataCondif = $oConf->getAll();
if (count($dataCondif)) {
foreach ($dataCondif as $value) {
$configuration = new Configuration();
$dataConfig = $configuration->getAll();
if (count($dataConfig)) {
foreach ($dataConfig as $value) {
if ($value['CFG_UID'] == 'ENVIRONMENT_SETTINGS') {
$query = 'INSERT INTO CONFIGURATION (CFG_UID, OBJ_UID, CFG_VALUE, PRO_UID, USR_UID, APP_UID) VALUES';
$query .= "('" .
@@ -419,7 +493,6 @@ class Installer
$value['PRO_UID'] . "', '" .
$value['USR_UID'] . "', '" .
$value['APP_UID'] . "')";
mysqli_select_db($this->connection_database, $this->wf_site_name);
$this->run_query($query, "Copy configuracion environment");
break;
}
@@ -434,59 +507,92 @@ class Installer
*/
public function setAdmin()
{
mysqli_select_db($this->connection_database, $this->wf_site_name);
// The mysql_escape_string function has been DEPRECATED as of PHP 5.3.0.
// $this->run_query('UPDATE USERS SET USR_USERNAME = \''.mysqli_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 = \'' . mysqli_real_escape_string($this->connection_database, $this->options['admin']['username']) . '\', ' . ' `USR_PASSWORD` = \'' . G::encryptHash($this->options['admin']['password']) . '\' ' . ' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', "Add 'admin' user in ProcessMaker (wf)");
mysqli_select_db($this->connection_database, $this->rbac_site_name);
// The mysql_escape_string function has been DEPRECATED as of PHP 5.3.0.
// $this->run_query('UPDATE USERS SET USR_USERNAME = \''.mysqli_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 RBAC_USERS SET USR_USERNAME = \'' . mysqli_real_escape_string($this->connection_database, $this->options['admin']['username']) . '\', ' . ' `USR_PASSWORD` = \'' . G::encryptHash($this->options['admin']['password']) . '\' ' . ' WHERE `USR_UID` = \'00000000000000000000000000000001\' LIMIT 1', "Add 'admin' user in ProcessMaker (rb)");
// Change admin user
DB::connection(self::CONNECTION_INSTALL)
->table('USERS')
->where('USR_UID', '00000000000000000000000000000001')
->update([
'USR_USERNAME' => $this->options['admin']['username'],
'USR_PASSWORD' => Bootstrap::hashPassword($this->options['admin']['password'], Bootstrap::hashBcrypt)
]);
DB::connection(self::CONNECTION_INSTALL)
->table('RBAC_USERS')
->where('USR_UID', '00000000000000000000000000000001')
->update([
'USR_USERNAME' => $this->options['admin']['username'],
'USR_PASSWORD' => Bootstrap::hashPassword($this->options['admin']['password'], Bootstrap::hashBcrypt)
]);
}
/**
* Run a mysql query on the current database and take care of logging and
* Run a mysql script 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
* @param string $connection default connection install
* @throws Exception
*/
private function run_query($query, $description = null)
private function runTrigger($query, $description = '', $connection = self::CONNECTION_INSTALL)
{
$result = mysqli_query($this->connection_database, $query);
$error = $result ? false : mysqli_error($this->connection_database);
$this->log(($description ? $description : $query) . " => " . (($error) ? $error : "OK") . "\n", $error);
$this->run_query($query, $description, $connection, 'RAW');
}
/**
* query_sql_file
* Run a mysql query on the current database and take care of logging and
* error handling.
*
* @param string $file
* @param string $connection
* @return array $report
* @param string $query SQL command
* @param string $description Description to log instead of $query
* @param string $connection default connection install
* @param string $type STATEMENT|RAW
*/
public function query_sql_file($file, $connection)
private function run_query($query, $description = '', $connection = self::CONNECTION_INSTALL, $type = 'STATEMENT')
{
try {
$message = '';
switch ($type) {
case 'STATEMENT':
DB::connection($connection)->statement($query);
break;
case 'RAW':
DB::connection($connection)->raw($query);
break;
}
} catch (QueryException $exception) {
$message = $exception->getMessage();
}
$this->log(!empty($description) ? $description : $query . ' => ' . (!empty($message) ? $message : 'OK') . "\n", !empty($message));
}
/**
* Query sql file
*
* @param $file
* @param string $connection
*/
public function query_sql_file($file, $connection = self::CONNECTION_INSTALL)
{
$lines = file($file);
$previous = null;
$errors = '';
mysqli_query($connection, "SET NAMES 'utf8';");
DB::connection($connection)
->statement("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 (strpos($line, '--') === 0) {
$line = substr($line, 0, strpos($line, '--'));
}
if (empty($line)) {
continue;
}
if (strpos($line, "#") === 0) {
$line = substr($line, 0, strpos($line, "#"));
if (strpos($line, '#') === 0) {
$line = substr($line, 0, strpos($line, '#'));
}
if (empty($line)) {
@@ -495,32 +601,23 @@ class Installer
// Concatenate the previous line, if any, with the current
if ($previous) {
$line = $previous . " " . $line;
$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) {
if (strrpos($line, ';') != strlen($line) - 1) {
$previous = $line;
continue;
}
$line = substr($line, 0, strrpos($line, ";"));
mysqli_query($connection, $line);
$line = substr($line, 0, strrpos($line, ';'));
DB::connection($connection)
->statement($line);
}
}
/**
* check_path
*
* @return void
* @todo Empty function
*/
private function check_path()
{
}
/**
* function find_root_path
*
@@ -573,7 +670,7 @@ class Installer
* getDirectoryFiles
*
* @param string $dir default value empty
* @return string $path
* @return array
*/
public function getDirectoryFiles($dir, $extension)
{
@@ -595,17 +692,24 @@ class Installer
/**
* check_db_empty
*
* @param string $dbName
* @param string$dbName
* @return boolean true or false
* @throws Exception
*/
public function check_db_empty($dbName)
{
$a = mysqli_select_db($this->connection_database, $dbName);
if (!$a) {
return true;
try
{
$result = DB::connection(self::CONNECTION_TEST_INSTALL)->select("show databases like '$dbName'");
if (!$result) {
return true;
} else {
$result = DB::connection(self::CONNECTION_TEST_INSTALL)->select("show tables from $dbName");
return !$result;
}
} catch (QueryException $exception) {
throw new Exception('User without permissions. ' . $exception->getMessage());
}
$q = mysqli_query($this->connection_database, 'SHOW TABLES');
return !(mysqli_num_rows($q) > 0);
}
/**
@@ -621,10 +725,10 @@ class Installer
$response['message'] = '';
if (!$this->connection_database) {
//new verification if the mysql extension is enabled
$response['message'] = class_exists('mysql_error') ? mysqli_error() : 'Mysql Module for PHP is not enabled!';
$response['message'] = 'Mysql Module for PHP is not enabled!';
} else {
if (!mysqli_select_db($this->connection_database, $dbName) && $this->cc_status != 1) {
$response['message'] = mysqli_error($this->connection_database);
if ($this->cc_status != 1) {
$result = DB::connection(self::CONNECTION_TEST_INSTALL)->select("show databases like '$dbName'");
} else {
if ($this->options['advanced']['ao_db_drop'] === true || $this->check_db_empty($dbName)) {
$response['status'] = true;
@@ -640,52 +744,79 @@ class Installer
/**
* check_connection
*
* @return Array $rt
* @return array $rt
*/
private function check_connection()
private function check_connection($nameConnection)
{
if (!function_exists('mysqli_connect')) {
$this->cc_status = 0;
$rt = array('connection' => false, 'grant' => 0, 'version' => false, 'message' => "ERROR: Mysql Module for PHP is not enabled, try install <b>php-mysql</b> package.", 'ao' => array('ao_db_wf' => false, 'ao_db_rb' => false, 'ao_db_rp' => false
)
);
} else {
$this->connection_database = mysqli_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: ' . mysqli_error($this->connection_database);
} else {
preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', mysqli_get_server_info($this->connection_database), $version);
$rt['version'] = version_compare(@$version[0], '4.1.0', '>=');
$this->cc_status = 0;
$rt = [
'connection' => false,
'grant' => 0,
'version' => false,
'message' => 'ERROR: Mysql Module for PHP is not enabled, try install <b>php-mysqli</b> package.',
'ao' => [
'ao_db_wf' => false,
'ao_db_rb' => false,
'ao_db_rp' => false
]
];
if (function_exists('mysqli_connect')) {
try {
InstallerModule::setNewConnection(
$nameConnection,
$this->options['database']['hostname'],
$this->options['database']['username'],
$this->options['database']['password'],
'',
$this->options['database']['port']);
$rt = [
'version' => false,
'ao' => [
'ao_db_wf' => false,
'ao_db_rb' => false,
'ao_db_rp' => false
]
];
$results = DB::connection($nameConnection)->select(DB::raw('select version()'));
preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $results[0]->{'version()'}, $version);
$rt['version'] = version_compare($mysql_version = $version[0], '4.1.0', '>=');
$rt['connection'] = true;
$dbNameTest = 'PROCESSMAKERTESTDC';
$db = mysqli_query($this->connection_database, 'CREATE DATABASE ' . $dbNameTest);
$db = DB::connection($nameConnection)->statement("CREATE DATABASE IF NOT EXISTS $dbNameTest");
$this->connection_database = true;
if (!$db) {
$this->cc_status = 3;
$rt['grant'] = 3;
$rt['message'] = 'Successful connection';
} else {
$usrTest = "wfrbtest";
$chkG = "GRANT ALL PRIVILEGES ON `" . $dbNameTest . "`.* TO " . $usrTest . "@'%' IDENTIFIED BY 'sample' WITH GRANT OPTION";
$ch = mysqli_query($this->connection_database, $chkG);
$usrTest = 'wfrbtest';
$chkG = "GRANT ALL PRIVILEGES ON `" . $dbNameTest . "`.* TO " . $usrTest . "@'%' IDENTIFIED BY '!Sample123' WITH GRANT OPTION";
$ch = DB::connection($nameConnection)
->statement($chkG);
if (!$ch) {
$this->cc_status = 2;
$rt['grant'] = 2;
$rt['message'] = 'Successful connection';
} else {
$this->cc_status = 1;
mysqli_query($this->connection_database, "DROP USER " . $usrTest . "@'%'");
DB::connection($nameConnection)
->statement("DROP USER " . $usrTest . "@'%'");
$rt['grant'] = 1;
$rt['message'] = 'Successful connection';
}
mysqli_query($this->connection_database, 'DROP DATABASE ' . $dbNameTest);
DB::connection($nameConnection)
->statement('DROP DATABASE ' . $dbNameTest);
}
} catch (Exception $exception) {
$rt['connection'] = false;
$rt['grant'] = 0;
$rt['message'] = 'Mysql error: ' . $exception->getMessage();
}
}
$rt['ao']['ao_db_wf'] = $this->check_db($this->options['advanced']['ao_db_wf']);
@@ -693,14 +824,15 @@ class Installer
}
/**
* log
* Log
*
* @param string $text
* @return void
* @param boolean $failed
* @throws Exception
*/
public function log($text, $failed = null)
public function log($text, $failed = false)
{
array_push($this->report, $text);
$this->report[] = $text;
if ($failed) {
throw new Exception(is_string($text) ? $text : var_export($text, true));
}

View File

@@ -4,9 +4,14 @@ namespace ProcessMaker\Core;
use Configurations;
use DomDocument;
use Exception;
use Faker;
use G;
use GzipFile;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use InputFilter;
use InstallerModule;
use Net;
use schema;
use WorkspaceTools;
@@ -66,7 +71,7 @@ class System
*/
public static function getPlugins()
{
$plugins = array();
$plugins = [];
foreach (glob(PATH_PLUGINS . "*") as $filename) {
$info = pathinfo($filename);
@@ -90,7 +95,7 @@ class System
public static function listWorkspaces()
{
$oDirectory = dir(PATH_DB);
$aWorkspaces = array();
$aWorkspaces = [];
foreach (glob(PATH_DB . "*") as $filename) {
if (is_dir($filename) && file_exists($filename . "/db.php")) {
$aWorkspaces[] = new WorkspaceTools(basename($filename));
@@ -150,7 +155,7 @@ class System
*/
public static function getSysInfo()
{
$ipe = isset($_SERVER['SSH_CONNECTION']) ? explode(" ", $_SERVER['SSH_CONNECTION']) : array();
$ipe = isset($_SERVER['SSH_CONNECTION']) ? explode(" ", $_SERVER['SSH_CONNECTION']) : [];
if (getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
@@ -194,7 +199,7 @@ class System
*/
$distro = trim($distro, "\"") . " (" . PHP_OS . ")";
$Fields = array();
$Fields = [];
$Fields['SYSTEM'] = $distro;
$Fields['PHP'] = phpversion();
$Fields['PM_VERSION'] = self::getVersion();
@@ -397,9 +402,9 @@ class System
fwrite($fp, "");
fclose($fp);
$aEnvironmentsUpdated = array();
$aEnvironmentsDiff = array();
$aErrors = array();
$aEnvironmentsUpdated = [];
$aEnvironmentsDiff = [];
$aErrors = [];
//now will verify each folder and file has permissions to write and add files.
if ($this->sUpgradeFileList != '') {
@@ -557,13 +562,13 @@ class System
$oDirectory = dir(PATH_DB);
//count db.php files ( workspaces )
$aWorkspaces = array();
$aWorkspaces = [];
while (($sObject = $oDirectory->read())) {
if (is_dir(PATH_DB . $sObject) && substr($sObject, 0, 1) != '.' && file_exists(PATH_DB . $sObject . PATH_SEP . 'db.php')) {
$aWorkspaces[] = $sObject;
}
}
$aUpgradeData = array();
$aUpgradeData = [];
$aUpgradeData['workspaces'] = $aWorkspaces;
$aUpgradeData['wsQuantity'] = count($aWorkspaces);
$aUpgradeData['sPoFile'] = $sPoFile;
@@ -732,19 +737,28 @@ class System
public static function getSchema($sSchemaFile)
{
/* This is the MySQL mapping that Propel uses (from MysqlPlatform.php) */
$mysqlTypes = array('NUMERIC' => "DECIMAL", 'LONGVARCHAR' => "MEDIUMTEXT", 'TIMESTAMP' => "DATETIME", 'BU_TIMESTAMP' => "DATETIME", 'BINARY' => "BLOB", 'VARBINARY' => "MEDIUMBLOB", 'LONGVARBINARY' => "LONGBLOB", 'BLOB' => "LONGBLOB", 'CLOB' => "LONGTEXT",
$mysqlTypes = [
'NUMERIC' => 'DECIMAL',
'LONGVARCHAR' => 'MEDIUMTEXT',
'TIMESTAMP' => 'DATETIME',
'BU_TIMESTAMP' => 'DATETIME',
'BINARY' => 'BLOB',
'VARBINARY' => 'MEDIUMBLOB',
'LONGVARBINARY' => 'LONGBLOB',
'BLOB' => 'LONGBLOB',
'CLOB' => 'LONGTEXT',
/* This is not from Propel, but is required to get INT right */
'INTEGER' => "INT"
);
'INTEGER' => 'INT'
];
$aSchema = array();
$aSchema = [];
$oXml = new DomDocument();
$oXml->load($sSchemaFile);
$aTables = $oXml->getElementsByTagName('table');
foreach ($aTables as $oTable) {
$aPrimaryKeys = array();
$aPrimaryKeys = [];
$sTableName = $oTable->getAttribute('name');
$aSchema[$sTableName] = array();
$aSchema[$sTableName] = [];
$aColumns = $oTable->getElementsByTagName('column');
foreach ($aColumns as $oColumn) {
$sColumName = $oColumn->getAttribute('name');
@@ -801,7 +815,7 @@ class System
}
$aIndexes = $oTable->getElementsByTagName('index');
foreach ($aIndexes as $oIndex) {
$aIndex = array();
$aIndex = [];
$aIndexesColumns = $oIndex->getElementsByTagName('index-column');
foreach ($aIndexesColumns as $oIndexColumn) {
$aIndex[] = $oIndexColumn->getAttribute('name');
@@ -820,7 +834,7 @@ class System
*/
public static function verifyRbacSchema($aOldSchema)
{
$aChanges = array();
$aChanges = [];
foreach ($aOldSchema as $sTableName => $aColumns) {
if (substr($sTableName, 0, 4) != 'RBAC') {
@@ -936,13 +950,13 @@ class System
foreach ($aNewSchema[$sTableName]['INDEXES'] as $indexName => $indexFields) {
if (!isset($aOldSchema[$sTableName]['INDEXES'][$indexName])) {
if (!isset($aChanges['tablesWithNewIndex'][$sTableName])) {
$aChanges['tablesWithNewIndex'][$sTableName] = array();
$aChanges['tablesWithNewIndex'][$sTableName] = [];
}
$aChanges['tablesWithNewIndex'][$sTableName][$indexName] = $indexFields;
} else {
if ($aOldSchema[$sTableName]['INDEXES'][$indexName] != $indexFields) {
if (!isset($aChanges['tablesToAlterIndex'][$sTableName])) {
$aChanges['tablesToAlterIndex'][$sTableName] = array();
$aChanges['tablesToAlterIndex'][$sTableName] = [];
}
$aChanges['tablesToAlterIndex'][$sTableName][$indexName] = $indexFields;
}
@@ -1007,11 +1021,11 @@ class System
}
//Get Skin Config files
$skinListArray = array();
$skinListArray = [];
$customSkins = glob(PATH_CUSTOM_SKINS . "*/config.xml");
if (!is_array($customSkins)) {
$customSkins = array();
$customSkins = [];
}
// getting al base skins
@@ -1045,7 +1059,7 @@ class System
if (isset($xmlConfigurationObj->result['skinConfiguration'])) {
$skinInformationArray = $skinFilesArray = $xmlConfigurationObj->result['skinConfiguration']['__CONTENT__']['information']['__CONTENT__'];
$res = array();
$res = [];
$res['SKIN_FOLDER_ID'] = strtolower($folderId);
foreach ($skinInformationArray as $keyInfo => $infoValue) {
@@ -1171,7 +1185,7 @@ class System
*/
public static function getQueryBlackList($globalIniFile = '')
{
$config = array();
$config = [];
if (empty($globalIniFile)) {
$blackListIniFile = PATH_CONFIG . 'execute-query-blacklist.ini';
$sysTablesIniFile = PATH_CONFIG . 'system-tables.ini';
@@ -1320,5 +1334,179 @@ class System
return $serverVersion;
}
/**
* Generate user name for test
*
* @param int $length
* @return string
*/
public static function generateUserName($length = 10)
{
$userName = 'PM_';
for ($i = 0; $i < $length - 3; $i++) {
$userName .= ($i % 3) === 0 ? '?' : '#';
}
$faker = Faker\Factory::create();
return $faker->bothify($userName);
}
/**
* Check permission the user in db
*
* @param string $adapter
* @param string $serverName
* @param int $port
* @param string $userName
* @param string $pass
* @param string $dbName
*
* @return array
*/
public static function checkPermissionsDbUser($adapter = 'mysql', $serverName, $port = 3306, $userName, $pass, $dbName = '')
{
if (empty($port)) {
//setting defaults ports
switch ($adapter) {
case 'mysql':
$port = 3306;
break;
case 'pgsql':
$port = 5432;
break;
case 'mssql':
$port = 1433;
break;
case 'oracle':
$port = 1521;
break;
}
}
$filter = new InputFilter();
$serverName = $filter->validateInput($serverName);
$userName = $filter->validateInput($userName);
$serverNet = new Net($serverName);
if ($serverNet->getErrno() !== 0) {
return [false, $serverNet->error];
}
$serverNet->scannPort($port);
if ($serverNet->getErrno() !== 0) {
return [false, $serverNet->error];
}
$serverNet->loginDbServer($userName, $pass);
$serverNet->setDataBase('', $port);
if ($serverNet->getErrno() !== 0) {
return [false, $serverNet->error];
}
$response = $serverNet->tryConnectServer($adapter);
if (!empty($response) && $response->status !== 'SUCCESS' && $serverNet->getErrno() !== 0) {
return [false, $serverNet->error];
}
$message = '';
$success = false;
$userName = $filter->validateInput($userName, 'nosql');
try {
$connection = 'SYSTEM';
InstallerModule::setNewConnection($connection, $serverName, $userName, $pass, $dbName, $port);
//Test Create Database
$dbNameTest = 'PROCESSMAKERTESTDC';
$result = DB::connection($connection)->statement("CREATE DATABASE $dbNameTest");
if ($result) {
//Test set permissions user
$usrTest = self::generateUserName(strlen($userName));
$passTest = '!Sample123_';
$result = DB::connection($connection)->statement("GRANT ALL PRIVILEGES ON `$dbNameTest`.* TO $usrTest@'%%' IDENTIFIED BY '$passTest' WITH GRANT OPTION");
if ($result) {
//Test Create user
$userTestCreate = self::generateUserName(strlen($userName));
$result = DB::connection($connection)->statement("CREATE USER '$userTestCreate'@'%%' IDENTIFIED BY '$passTest'");
if ($result) {
$success = true;
$message = G::LoadTranslation('ID_SUCCESSFUL_CONNECTION');
}
DB::connection($connection)->statement("DROP USER '$userTestCreate'@'%%'");
DB::connection($connection)->statement("DROP USER '$usrTest'@'%%'");
}
DB::connection($connection)->statement("DROP DATABASE $dbNameTest");
}
} catch (Exception $exception) {
$success = false;
$message = $exception->getMessage();
}
return [$success, !empty($message) ? $message : $serverNet->error];
}
/**
* Regenerate credentials paths installed
*
* @param string $host
* @param string $user
* @param string $pass
* @return bool
*/
public static function regenerateCredentiaslPathInstalled($host, $user, $pass)
{
$hashOld = G::encryptOld(filemtime(PATH_GULLIVER . "/class.g.php"));
$hash = G::encrypt($host . $hashOld . $user . $hashOld . $pass . $hashOld . (1), $hashOld);
$insertStatements = "define ( 'HASH_INSTALLATION','{$hash}' ); \ndefine ( 'SYSTEM_HASH', '{$hashOld}' ); \n";
$content = '';
$filename = PATH_HOME . 'engine' . PATH_SEP . 'config' . PATH_SEP . 'paths_installed.php';
$lines = file($filename);
$count = 1;
foreach ($lines as $line_num => $line) {
$pos = strpos($line, 'define');
if ($pos !== false && $count < 3) {
$content .= $line;
$count++;
}
}
$content = "<?php \n" . $content . "\n" . $insertStatements . "\n";
return file_put_contents($filename, $content) !== false;
}
/**
* Set Connection Configuration using "config" helper from "Laravel" with
* the constants defined in file "db.php"
*/
public static function setConnectionConfig(
$dbAdapter,
$dbHost,
$dbName,
$dbUser,
$dbPass,
$dbRbacHost,
$dbRbacName,
$dbRbacUser,
$dbRbacPass,
$dbReportHost,
$dbReportName,
$dbReportUser,
$dbReportPass)
{
config(['connections.driver' => $dbAdapter]);
config(['connections.workflow.host' => $dbHost]);
config(['connections.workflow.database' => $dbName]);
config(['connections.workflow.username' => $dbUser]);
config(['connections.workflow.password' => $dbPass]);
config(['connections.rbac.host' => $dbRbacHost]);
config(['connections.rbac.database' => $dbRbacName]);
config(['connections.rbac.username' => $dbRbacUser]);
config(['connections.rbac.password' => $dbRbacPass]);
config(['connections.report.host' => $dbReportHost]);
config(['connections.report.database' => $dbReportName]);
config(['connections.report.username' => $dbReportUser]);
config(['connections.report.password' => $dbReportPass]);
}
}
// end System class