.
*
* 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 {
/**
* Reference to Database object
*
* @author KnowledgeTree Team
* @access private
* @var object
*/
private $_dbhandler = null;
/**
* 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';
protected $silent = true;
protected $util = null;
public function __construct() {
$this->temp_variables = array("step_name"=>"complete", "silent"=>$this->silent);
$this->_dbhandler = new dbUtil();
$this->util = new InstallUtil();
}
function doStep() {
$this->doRun();
return 'landing';
}
function doRun() {
// check filesystem (including location of document directory and logging)
$this->checkFileSystem();
// check database
$this->checkDb();
// check services
$this->checkServices();
$this->storeSilent();// Set silent mode variables
}
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 = '';
// retrieve path information from session
$config = $this->getDataFromSession("configuration");
$paths = $config['paths'];
$html = '
| '
. '%s | ';
$pathhtml = ' | '
. '%s | '
. '%s | ';
// check paths are writeable
if(is_array($paths)) {
foreach ($paths as $path)
{
$output = '';
$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->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. | ';
if($this->paths_check == 'tick')
$this->paths_check = 'cross_orange';
$this->warnings[] = 'Move var directory';
}
else {
$this->temp_variables['docLocation'] = sprintf($html, 'tick', '', 'Your document directory is outside the web root.');
}
}
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
$loaded = $this->_dbhandler->load($dbconf['dhost'], $dbconf['dmsname'], $dbconf['dmspassword'], $dbconf['dname']);
if (!$loaded) {
$this->temp_variables['dbConnectAdmin'] .= ' | '
. 'Unable to connect to database (user: '
. $dbconf['dmsname'] . ') | ';
$this->database_check = 'cross';
$this->temp_variables['dbConnectAdmin'] .= sprintf($html, 'cross', 'class="error"', 'Unable to connect to database (user: ' . $dbconf['dmsname'] . ')');
}
else
{
$this->temp_variables['dbConnectAdmin'] .= sprintf($html, 'tick', '', 'Database connectivity successful (user: ' . $dbconf['dmsname'] . ')');
}
// make db connection - user
$loaded = $this->_dbhandler->load($dbconf['dhost'], $dbconf['dmsusername'], $dbconf['dmsuserpassword'], $dbconf['dname']);
// 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->_dbhandler->query('SELECT COUNT(id) FROM documents');
if (!$qresult)
{
$this->temp_variables['dbPrivileges'] .= ' | '
. ''
. 'Unable to do a basic database query. Error: ' . $this->_dbhandler->getLastError()
. ' | ';
$this->privileges_check = 'cross';
$this->privileges_check = 'cross';
}
else
{
$this->temp_variables['dbPrivileges'] .= sprintf($html, 'tick', '', 'Basic database query successful');
}
// check transaction support
$sTable = 'system_settings';
$this->_dbhandler->startTransaction();
$this->_dbhandler->query('INSERT INTO ' . $sTable . ' (name, value) VALUES ("transactionTest", "1")');
$this->_dbhandler->rollback();
$res = $this->_dbhandler->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';
} else {
$this->temp_variables['dbTransaction'] .= sprintf($html, 'tick', '', 'Database has transaction support');
}
$this->_dbhandler->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'] . ')');
}
}
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;
}
/**
* 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;
}
}
?>