riainvoice/application/modules/setup/controllers/Setup.php
gandhimathi Bharathirajan c940cb1a2c all files
2017-09-11 14:38:03 +05:30

444 lines
13 KiB
PHP

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/*
* InvoicePlane
*
* @author InvoicePlane Developers & Contributors
* @copyright Copyright (c) 2012 - 2017 InvoicePlane.com
* @license https://invoiceplane.com/license.txt
* @link https://invoiceplane.com
*/
/**
* Class Setup
*/
class Setup extends MX_Controller
{
public $errors = 0;
/**
* Setup constructor.
*/
public function __construct()
{
if (env_bool('DISABLE_SETUP', false)) {
show_error('The setup is disabled.', 403);
}
parent::__construct();
$this->load->library('session');
$this->load->helper('file');
$this->load->helper('directory');
$this->load->helper('url');
$this->load->helper('language');
$this->load->helper('trans');
$this->load->helper('settings');
$this->load->helper('echo');
$this->load->model('mdl_setup');
$this->load->module('layout');
if (!$this->session->userdata('ip_lang')) {
$this->session->set_userdata('ip_lang', 'english');
} else {
set_language($this->session->userdata('ip_lang'));
}
$this->lang->load('ip', $this->session->userdata('ip_lang'));
}
public function index()
{
redirect('setup/language');
}
public function language()
{
if ($this->input->post('btn_continue')) {
$this->session->set_userdata('ip_lang', $this->input->post('ip_lang'));
$this->session->set_userdata('install_step', 'prerequisites');
redirect('setup/prerequisites');
}
// Reset the session cache
$this->session->unset_userdata('install_step');
$this->session->unset_userdata('is_upgrade');
// Get all languages
$languages = get_available_languages();
$this->layout->set('languages', $languages);
$this->layout->buffer('content', 'setup/language');
$this->layout->render('setup');
}
public function prerequisites()
{
if ($this->session->userdata('install_step') <> 'prerequisites') {
redirect('setup/language');
}
if ($this->input->post('btn_continue')) {
$this->session->set_userdata('install_step', 'configure_database');
redirect('setup/configure_database');
}
$this->layout->set(
array(
'basics' => $this->check_basics(),
'writables' => $this->check_writables(),
'errors' => $this->errors
)
);
$this->layout->buffer('content', 'setup/prerequisites');
$this->layout->render('setup');
}
/**
* @return array
*/
private function check_basics()
{
$checks = array();
$php_required = '5.6';
$php_installed = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;
if ($php_installed < $php_required) {
$this->errors += 1;
$checks[] = array(
'message' => sprintf(trans('php_version_fail'), $php_installed, $php_required),
'success' => 0
);
} else {
$checks[] = array(
'message' => trans('php_version_success'),
'success' => 1
);
}
if (!ini_get('date.timezone')) {
$checks[] = array(
'message' => sprintf(trans('php_timezone_fail'), date_default_timezone_get()),
'success' => 1,
'warning' => 1
);
} else {
$checks[] = array(
'message' => trans('php_timezone_success'),
'success' => 1
);
}
return $checks;
}
/**
* @return array
*/
private function check_writables()
{
$checks = array();
$writables = array(
'./ipconfig.php',
'./uploads',
'./uploads/archive',
'./uploads/customer_files',
'./uploads/temp',
'./uploads/temp/mpdf',
'./application/logs',
);
foreach ($writables as $writable) {
if (!is_writable($writable)) {
$checks[] = array(
'message' => $writable . ' ' . trans('is_not_writable'),
'success' => 0
);
$this->errors += 1;
} else {
$checks[] = array(
'message' => $writable . ' ' . trans('is_writable'),
'success' => 1
);
}
}
return $checks;
}
public function configure_database()
{
if ($this->session->userdata('install_step') <> 'configure_database') {
redirect('setup/prerequisites');
}
if ($this->input->post('btn_continue')) {
$this->load_ci_database();
// This might be an upgrade - check if it is
if (!$this->db->table_exists('ip_versions')) {
// This appears to be an install
$this->session->set_userdata('install_step', 'install_tables');
redirect('setup/install_tables');
} else {
// This appears to be an upgrade
$this->session->set_userdata('is_upgrade', true);
$this->session->set_userdata('install_step', 'upgrade_tables');
redirect('setup/upgrade_tables');
}
}
if ($this->input->post('db_hostname')) {
// Write a new database configuration to the ipconfig.php file
$this->write_database_config(
$this->input->post('db_hostname'),
$this->input->post('db_username'),
$this->input->post('db_password'),
$this->input->post('db_database'),
$this->input->post('db_port')
);
}
// Check if the set credentials are correct
$check_database = $this->check_database();
$this->layout->set('database', $check_database);
$this->layout->set('errors', $this->errors);
$this->layout->buffer('content', 'setup/configure_database');
$this->layout->render('setup');
}
/**
* Load the database connection trough CodeIgniter
*/
private function load_ci_database()
{
$this->load->database();
}
/**
* @param $hostname
* @param $username
* @param $password
* @param $database
* @param int $port
*/
private function write_database_config($hostname, $username, $password, $database, $port = 3306)
{
$config = file_get_contents(IPCONFIG_FILE);
$config = preg_replace("/DB_HOSTNAME=(.*)?/", "DB_HOSTNAME=" . $hostname, $config);
$config = preg_replace("/DB_USERNAME=(.*)?/", "DB_USERNAME=" . $username, $config);
$config = preg_replace("/DB_PASSWORD=(.*)?/", "DB_PASSWORD=" . $password, $config);
$config = preg_replace("/DB_DATABASE=(.*)?/", "DB_DATABASE=" . $database, $config);
$config = preg_replace("/DB_PORT=(.*)?/", "DB_PORT=" . $port, $config);
write_file(IPCONFIG_FILE, $config);
}
/**
* @return array
*/
private function check_database()
{
// Reload the ipconfig.php file
global $dotenv;
$dotenv->overload();
// Load the database config and configure it to test the connection
include(APPPATH . 'config/database.php');
$db = $db['default'];
$db['autoinit'] = false;
$db['db_debug'] = false;
// Check if there is some configuration set
if (empty($db['hostname'])) {
$this->errors += 1;
return array(
'message' => trans('cannot_connect_database_server'),
'success' => false,
);
}
// Initialize the database connection, turn off automatic error reporting to display connection issues manually
error_reporting(0);
$db_object = $this->load->database($db, true);
// Try to initialize the database connection
$can_connect = $db_object->conn_id ? true : false;
if (!$can_connect) {
$this->errors += 1;
return array(
'message' => trans('setup_db_cannot_connect'),
'success' => false,
);
}
return array(
'message' => trans('database_properly_configured'),
'success' => true,
);
}
public function install_tables()
{
if ($this->session->userdata('install_step') <> 'install_tables') {
redirect('setup/prerequisites');
}
if ($this->input->post('btn_continue')) {
$this->session->set_userdata('install_step', 'upgrade_tables');
redirect('setup/upgrade_tables');
}
$this->load_ci_database();
$this->layout->set(
array(
'success' => $this->mdl_setup->install_tables(),
'errors' => $this->mdl_setup->errors
)
);
$this->layout->buffer('content', 'setup/install_tables');
$this->layout->render('setup');
}
public function upgrade_tables()
{
if ($this->session->userdata('install_step') <> 'upgrade_tables') {
redirect('setup/prerequisites');
}
if ($this->input->post('btn_continue')) {
if (!$this->session->userdata('is_upgrade')) {
$this->session->set_userdata('install_step', 'create_user');
redirect('setup/create_user');
} else {
$this->session->set_userdata('install_step', 'complete');
redirect('setup/complete');
}
}
$this->load_ci_database();
// Set a new encryption key if none exists
if (env('ENCRYPTION_KEY') === null) {
$this->set_encryption_key();
}
$this->layout->set(
array(
'success' => $this->mdl_setup->upgrade_tables(),
'errors' => $this->mdl_setup->errors
)
);
$this->layout->buffer('content', 'setup/upgrade_tables');
$this->layout->render('setup');
}
/**
* Set a new encryption key in the ipconfig.php file
*/
private function set_encryption_key()
{
$length = (env('ENCRYPTION_CIPHER') == 'AES-256' ? 32 : 16);
if (function_exists('random_bytes')) {
$key = 'base64:' . base64_encode(random_bytes($length));
} else {
$key = 'base64:' . base64_encode(openssl_random_pseudo_bytes($length));
}
$config = file_get_contents(IPCONFIG_FILE);
$config = preg_replace("/ENCRYPTION_KEY=(.*)?/", "ENCRYPTION_KEY=" . $key, $config);
write_file(IPCONFIG_FILE, $config);
}
public function create_user()
{
if ($this->session->userdata('install_step') <> 'create_user') {
redirect('setup/prerequisites');
}
$this->load_ci_database();
$this->load->model('users/mdl_users');
$this->load->helper('country');
if ($this->mdl_users->run_validation()) {
$db_array = $this->mdl_users->db_array();
$db_array['user_type'] = 1;
$this->mdl_users->save(null, $db_array);
$this->session->set_userdata('install_step', 'complete');
redirect('setup/complete');
}
$this->layout->set(
array(
'countries' => get_country_list(trans('cldr')),
'languages' => get_available_languages(),
)
);
$this->layout->buffer('content', 'setup/create_user');
$this->layout->render('setup');
}
public function complete()
{
if ($this->session->userdata('install_step') <> 'complete') {
redirect('setup/prerequisites');
}
// Additional tasks after setup is completed
$this->post_setup_tasks();
// Check if this is an update or the first install
// First get all version entries from the database and format them
$this->load_ci_database();
$versions = $this->db->query('SELECT * FROM ip_versions');
if ($versions->num_rows() > 0) {
foreach ($versions->result() as $row):
$data[] = $row;
endforeach;
}
// Then check if the first version entry is less than 30 minutes old
// If yes we assume that the user ran the setup a few minutes ago
if ($data[0]->version_date_applied < (time() - 1800)) {
$update = true;
} else {
$update = false;
}
$this->layout->set('update', $update);
$this->layout->buffer('content', 'setup/complete');
$this->layout->render('setup');
}
private function post_setup_tasks()
{
// Set SETUP_COMPLETED to true
$config = file_get_contents(IPCONFIG_FILE);
$config = preg_replace("/SETUP_COMPLETED=(.*)?/", "SETUP_COMPLETED=true", $config);
write_file(IPCONFIG_FILE, $config);
}
}