.
*
* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
* California 94120-7775, or email info@knowledgetree.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* KnowledgeTree" logo and retain the original copyright notice. If the display of the
* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
* must display the words "Powered by KnowledgeTree" and retain the original
* copyright notice.
*
* @copyright 2008-2009, KnowledgeTree Inc.
* @license GNU General Public License version 3
* @author KnowledgeTree Team
* @package Installer
* @version Version 0.1
*/
class complete extends Step {
/**
* List of services to check
*
* @access private
* @var array
*/
private $services_check = 'tick';
private $paths_check = 'tick';
private $privileges_check = 'tick';
private $database_check = 'tick';
private $migrate_check = false;
public $silent = true;
private $servicesValidation = false;
private $pathsSection = true;
private $databaseSection = true;
private $privilegesSection = true;
function doStep() {
$this->temp_variables = array("step_name"=>"complete", "silent"=>$this->silent);
$this->temp_variables['isCE'] = false;
$type = $this->util->getVersionType();
if($type == "community")
$this->temp_variables['isCE'] = true;
$this->doRun();
return 'landing';
}
function doRun() {
$this->checkFileSystem(); // check filesystem (including location of document directory and logging)
$this->checkDb(); // check database
$this->checkServices(); // check services
$this->checkInstallType(); // Set silent mode variables
$this->storeSilent(); // Set silent mode variables
}
/**
* Check all the system paths
*
*/
private function checkFileSystem()
{
// defaults
$this->temp_variables['varDirectory'] = '';
$this->temp_variables['documentRoot'] = '';
$this->temp_variables['logDirectory'] = '';
$this->temp_variables['tmpDirectory'] = '';
$this->temp_variables['uploadDirectory'] = '';
$this->temp_variables['config'] = '';
$this->temp_variables['docLocation'] = '';
$docRoot = '';
$config = $this->getDataFromSession("configuration"); // retrieve path information from session
$paths = $config['paths'];
$html = '
| '
. '%s | ';
$pathhtml = ' | '
. '%s | '
. '%s | ';
if(is_array($paths)) { // check paths are writeable
foreach ($paths as $path)
{
$output = '';
$path['path'] = $class = strtolower(substr($path['path'],0,1)).substr($path['path'],1); // Damn you windows
$result = $this->util->checkPermission($path['path']);
$output = sprintf($pathhtml, $result['class'], $path['path'],
(($result['class'] == 'tick') ? 'class="green"' : 'class="error"' ),
(($result['class'] == 'tick') ? 'Writeable' : 'Not Writeable' ));
$this->temp_variables[($path['setting'] != '') ? $path['setting'] : 'config'] = $output;
if($result['class'] != 'tick') {
$this->pathsSection = false;
$this->paths_check = $result['class'];
}
// for document location check
if ($path['setting'] == 'documentRoot') {
$docRoot = $path['path'];
}
}
}
// check document path internal/external to web root
// compare SYSTEM_DIR to root path of documentRoot
// NOTE preg_replace is to ensure all slash separators are the same (forward slash)
$sysDir = preg_replace('/\\\\+|\/+/', '\/', SYSTEM_DIR);
$docRoot = preg_replace('/\\\\+|\/+/', '\/', $docRoot);
if (($pos = strpos($docRoot, $sysDir)) !== false) {
$this->temp_variables['docLocation'] = ' | '
. 'Your document directory is set to the default, which is inside the web root. '
. 'This may present a security problem if your documents can be accessed from the web, '
. 'working around the permission system in KnowledgeTree. | ';
$this->paths_check = 'cross_orange';
$this->warnings[] = 'Move var directory';
$this->pathsSection = false;
}
else {
$this->temp_variables['docLocation'] = sprintf($html, 'tick', '', 'Your document directory is outside the web root.');
}
}
/**
* Check if a database connection can be made
*
*/
private function checkDb()
{
// defaults
$this->temp_variables['dbConnectAdmin'] = '';
$this->temp_variables['dbConnectUser'] = '';
$this->temp_variables['dbPrivileges'] = '';
$this->temp_variables['dbTransaction'] = '';
$html = ' | '
. '%s | ';
// retrieve database information from session
$dbconf = $this->getDataFromSession("database");
// make db connection - admin
$this->util->dbUtilities->load($dbconf['dhost'], $dbconf['dport'], $dbconf['dmsname'], $dbconf['dmspassword'], $dbconf['dname']);
$loaded = $this->util->dbUtilities->getDatabaseLink();
if (!$loaded) {
$this->database_check = 'cross';
$this->temp_variables['dbConnectAdmin'] .= sprintf($html, 'cross', 'class="error"', 'Unable to connect to database (user: ' . $dbconf['dmsname'] . ')');
$this->privilegesSection = false;
}
else
{
$this->temp_variables['dbConnectAdmin'] .= sprintf($html, 'tick', '', 'Database connectivity successful (user: ' . $dbconf['dmsname'] . ')');
}
// make db connection - user
$this->util->dbUtilities->load($dbconf['dhost'], $dbconf['dport'], $dbconf['dmsusername'], $dbconf['dmsuserpassword'], $dbconf['dname']);
$loaded = $this->util->dbUtilities->getDatabaseLink();
// if we can log in to the database, check access
// TODO check write access?
if ($loaded)
{
$this->temp_variables['dbConnectUser'] .= sprintf($html, 'tick', '', 'Database connectivity successful (user: ' . $dbconf['dmsusername'] . ')');
$qresult = $this->util->dbUtilities->query('SELECT COUNT(id) FROM documents');
if (!$qresult)
{
$this->temp_variables['dbPrivileges'] .= ' | '
. ''
. 'Unable to do a basic database query. Error: ' . $this->util->dbUtilities->getLastError() . ' | ';
$this->privileges_check = 'cross';
$this->privilegesSection = false;
}
else
{
$this->temp_variables['dbPrivileges'] .= sprintf($html, 'tick', '', 'Basic database query successful');
}
// check transaction support
$sTable = 'system_settings';
$this->util->dbUtilities->startTransaction();
$this->util->dbUtilities->query('INSERT INTO ' . $sTable . ' (name, value) VALUES ("transactionTest", "1")');
$this->util->dbUtilities->rollback();
$res = $this->util->dbUtilities->query("SELECT id FROM $sTable WHERE name = 'transactionTest' LIMIT 1");
if (!$res) {
$this->temp_variables['dbTransaction'] .= sprintf($html, 'cross', 'class="error"', 'Transaction support not available in database');
$this->privileges_check = 'cross';
$this->privilegesSection = false;
} else {
$this->temp_variables['dbTransaction'] .= sprintf($html, 'tick', '', 'Database has transaction support');
}
$this->util->dbUtilities->query('DELETE FROM ' . $sTable . ' WHERE name = "transactionTest"');
}
else
{
$this->temp_variables['dbConnectUser'] .= sprintf($html, 'cross', 'class="error"', 'Unable to connect to database (user: ' . $dbconf['dmsusername'] . ')');
}
}
/**
* Check if all services are deactivated
*
*/
private function checkServices()
{
$services = new services();
foreach ($services->getServices() as $serviceName) {
$className = OS.$serviceName;
$service = new $className();
$service->load();
$status = $services->serviceStarted($service);
if($status) {
$this->temp_variables[$serviceName."Status"] = 'tick';
} else {
$this->temp_variables[$serviceName."Status"] = 'cross_orange';
$this->services_check = 'cross_orange';
}
}
return true;
}
/**
* Check the install type and store
*
*/
function checkInstallType() {
if ($this->util->isMigration()) {
$this->migrate_check = true;
$this->registerPlugins(); // Set silent mode variables
} else {
$this->migrate_check = false;
}
}
/**
* Register extra commercial plugins
*
*/
private function registerPlugins() {
}
/**
* Set all silent mode varibles
*
*/
private function storeSilent() {
$this->temp_variables['services_check'] = $this->services_check;
$this->temp_variables['paths_check'] = $this->paths_check;
$this->temp_variables['privileges_check'] = $this->privileges_check;
$this->temp_variables['database_check'] = $this->database_check;
$this->temp_variables['migrate_check'] = $this->migrate_check;
$this->temp_variables['servicesValidation'] = $this->servicesValidation;
$this->temp_variables['pathsSection'] = $this->pathsSection;
$this->temp_variables['databaseSection'] = $this->databaseSection;
$this->temp_variables['privilegesSection'] = $this->privilegesSection;
}
}
?>