You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

307 lines
8.1 KiB

<?php
require_once('../system/Lang/i18n.php');
require_once('../system/Lang/languages.php');
function get_mysql_port() {
$port = ini_get('mysql.default_port');
if($port == "")
$port = ini_get('mysqli.default_port');
if($port == "")
$port = 3306;
return $port;
}
$err = array();
function set_error($error_name, $error_message)
{
global $err;
$err[$error_name] = $error_message;
}
function err($error_name)
{
global $err;
if(isset($err[$error_name])) {
return $err[$error_name];
} else {
return false;
}
}
function has_errors()
{
global $err;
return count($err);
}
function test_dir($dir)
{
return (file_exists($dir) && is_dir($dir) && is_writable($dir));
}
function list_themes()
{
$dir = opendir('../themes');
$themes = array();
while($theme = readdir($dir)) {
if(preg_match('/^\.+$/', $theme)
|| !is_dir('../themes/'.$theme)) {
continue;
}
$themes[$theme] = $theme;
}
return $themes;
}
function list_lang()
{
$dir = opendir('../i18n');
$langs = array('en' => 'English');
$languages = get_lang_list();
while($lang = readdir($dir)) {
if(!preg_match('/\.po$/', $lang)) {
continue;
}
$lang = substr($lang, 0, strlen($lang) - 3);
$langs[$lang] = $languages[$lang];
}
return $langs;
}
function test_requirements()
{
$errors = array();
if(!(version_compare(PHP_VERSION, '5.3.0') >= 0)) {
$errors[] = t("PHP version mismatch. Movim requires PHP 5.3 minimum.")." ".t("Actual version : "). PHP_VERSION .
'<div class="guidance">'.t("Update your PHP version or contact your server administrator").'</div>';
}
if(!extension_loaded('curl')) {
$errors[] = t("Movim requires the %s extension.", 'PHP Curl') .
'<div class="guidance">'.t("Install %s and %s packages", 'php5-curl', 'curl').'</div>';
}
if(!extension_loaded('gd')) {
$errors[] = t("Movim requires the %s extension.", 'PHP GD') .
'<div class="guidance">'.t("Install the %s package", 'php5-gd').'</div>';
}
if(!extension_loaded('SimpleXML')) {
$errors[] = t("Movim requires the %s extension.", 'SimpleXML') .
'<div class="guidance">'.t("Install the %s package", 'php5-cli').'</div>';
}
if(!test_dir('../')) {
$errors[] = t("Movim's folder must be writable.") .
'<div class="guidance">'.t("Enable read and write rights on Movim's root folder").'</div>';
}
/*if(!test_dir('user')) {
$errors[] = t("The <em>%s</em> folder must exist and be writable.", 'user');
}
if(!test_dir('log')) {
$errors[] = t("The <em>%s</em> folder must exist and be writable.", 'log');
}*/
// Must have sqlite or mysql (so far...)
if(!extension_loaded('mysql') && !class_exists('SQLite3')) {
$exts = array('MySQL', 'SQLite');
$exts_txt = implode(t("or"), $exts);
$errors[] = t("Movim requires the %s extension.", $exts_txt);
}
global $databases;
if(extension_loaded('mysql'))
$databases['mysql'] = 'MySQL';
if(class_exists('SQLite3'))
$databases['sqlite'] = 'SQLite';
return (count($errors) > 0)? $errors : false;
}
function get_checkbox($name, $if = 'true', $else = 'false')
{
return (isset($_POST[$name])? $if : $else);
}
function test_bosh($boshhost, $port, $suffix, $host)
{
$url = (get_checkbox('boshCookieHTTPS') == "true")? 'https://' : 'http://';
$url .= $boshhost.":".$port.'/'.$suffix;
$headers = array('Accept-Encoding: gzip, deflate', 'Content-Type: text/xml; charset=utf-8');
$data = "
<body content='text/xml; charset=utf-8'
hold='1'
rid='1573741820'
to='".$host."'
secure='true'
wait='60'
xml:lang='en'
xmpp:version='1.0'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:xmpp='urn:xmpp:xbosh'/>";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$rs = array();
$rs['content'] = curl_exec($ch);
$rs['errno'] = curl_errno($ch);
$rs['errmsg'] = curl_error($ch);
$rs['header'] = curl_getinfo($ch);
if($rs['errno']) {
set_error('bosh', t("Bosh connection failed with error `%s'", $rs['errmsg']));
return false;
}
curl_close($ch);
$arr = simplexml_load_string($rs["content"]);
if(is_object($arr))
$att = $arr->attributes();
if($att['type'] == 'terminate') {
set_error('bosh', t("XMPP connection through Bosh failed with error `%s'", $att['condition']));
}
else if(isset($att['sid'])) {
return true;
}
else {
return false;
}
}
function make_xml($stuff)
{
static $level = 0;
$buffer = "";
// Putting the XML declaration
if($level == 0) {
$buffer = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
}
// Indentation
$indent = "";
for($i = 0; $i < $level; $i++) {
$indent.= " ";
}
// Doing the job
foreach($stuff as $tag => $value) {
if(is_array($value)) {
$buffer.= $indent.'<'.$tag.'>'.PHP_EOL;
$level++;
$buffer.= make_xml($value);
$buffer.= $indent.'</'.$tag.'>'.PHP_EOL;
} else {
$buffer.= "$indent<$tag>$value</$tag>".PHP_EOL;
}
}
$level--;
return $buffer;
}
function perform_install()
{
// Creating the folders.
if(!test_dir('../user') && !@mkdir('../user')) {
echo t("Couldn't create directory '%s'.", 'user');
return false;
}
if(!test_dir('../log') && !@mkdir('../log')) {
echo t("Couldn't create directory '%s'.", 'log');
return false;
}
if(!test_dir('../config') && !@mkdir('../config')) {
echo t("Couldn't create directory '%s'.", 'config');
return false;
}
// Creating the configuration file.
$conf = array(
'config' => array(
'theme' => $_POST['theme'],
'defLang' => $_POST['language'],
'boshCookieTTL' => $_POST['boshCookieTTL'],
'boshCookiePath' => $_POST['boshCookiePath'],
'boshCookieDomain' => get_checkbox('boshCookieDomain'),
'boshCookieHTTPS' => get_checkbox('boshCookieHTTPS'),
'boshCookieHTTPOnly' => get_checkbox('boshCookieHTTPOnly'),
'logLevel' => $_POST['verbosity'],
'accountCreation' => get_checkbox('accountCreation', 1, 0),
'host' => $_POST['host'],
'domain' => $_POST['domain'],
'defBoshHost' => $_POST['defBoshHost'],
'defBoshSuffix' => $_POST['defBoshSuffix'],
'defBoshPort' => $_POST['defBoshPort'],
'storageDriver' => $_POST['storage'],
'storageConnection' => $_POST['database'],
'proxyEnabled' => get_checkbox('proxyEnabled'),
'proxyURL' => $_POST['proxyURL'],
'proxyPort' => $_POST['proxyPort'],
),
);
if(!@file_put_contents('../config/conf.xml', make_xml($conf))) {
echo t("Couldn't create configuration file '%s'.", 'config/conf.xml');
return false;
}
return true;
}
$step = 'part1.php';
if(isset($_POST['install'])) {
// We test the Bosh configuration
if(!test_bosh($_POST['defBoshHost'], $_POST['defBoshPort'], $_POST['defBoshSuffix'], $_POST['host'])) {
goto loadpage;
}
// We create the configuration file
perform_install();
// We try to connect to the database
try {
include('../init.php');
} catch (Exception $e) {
set_error('bdd', t("Database connection failed with error `%s'", $e->getMessage()));
goto loadpage;
}
// We create correctly the tables
global $sdb;
$contact = new Contact();
$sdb->create($contact);
$conf = new ConfVar();
$sdb->create($conf);
$message = new Message();
$sdb->create($message);
$presence = new Presence();
$sdb->create($presence);
$attachment = new Attachment();
$sdb->create($attachment);
$step = 'part2.php';
}
loadpage:
require($step);
?>