From 16da53707f58789e682c411b417847aeb74ba681 Mon Sep 17 00:00:00 2001
From: Simon Leblanc <contact@leblanc-simon.eu>
Date: Fri, 28 Nov 2014 05:12:21 +0100
Subject: [PATCH] First implementation of the installer

---
 app/inc/constants.php.template |   7 +-
 app/inc/init.php               |  13 ++-
 install.mysql.auto.sql         |   8 ++
 install.php                    | 187 +++++++++++++++++++++++++++++++++
 4 files changed, 207 insertions(+), 8 deletions(-)
 create mode 100644 install.mysql.auto.sql
 create mode 100644 install.php

diff --git a/app/inc/constants.php.template b/app/inc/constants.php.template
index 82567d63..da740537 100644
--- a/app/inc/constants.php.template
+++ b/app/inc/constants.php.template
@@ -20,11 +20,8 @@
 // FRAMADATE version
 const VERSION = 0.8;
 
-// Server name
-const STUDS_URL = '<www.mydomain.com>';
-
 // Application name
-const NOMAPPLICATION = "<Application name>";
+const NOMAPPLICATION = '<Application name>';
 
 // Database administrator email
 const ADRESSEMAILADMIN = '<email address>';
@@ -36,7 +33,7 @@ const ADRESSEMAILREPONSEAUTO = '<no-reply@mydomain.com>';
 const BASE = '<database name>';
 
 // Database user
-const USERBASE = "<database user>";
+const USERBASE = '<database user>';
 
 // Database password
 const USERPASSWD = '<database password>';
diff --git a/app/inc/init.php b/app/inc/init.php
index 2a13d2b2..912d6e5c 100644
--- a/app/inc/init.php
+++ b/app/inc/init.php
@@ -23,9 +23,16 @@ if (ini_get('date.timezone') == '') {
 // Autoloading of dependencies with Composer
 require_once __DIR__ . '/../../vendor/autoload.php';
 
-include_once __DIR__ . '/constants.php';
-include_once __DIR__ . '/i18n.php';
+require_once __DIR__ . '/constants.php';
+require_once __DIR__ . '/i18n.php';
 
 $connect = NewADOConnection(BASE_TYPE);
-$connect->Connect(SERVEURBASE, USERBASE, USERPASSWD, BASE);
+
+if ('pdo' === BASE_TYPE) {
+    $database_host = 'mysql:host='.SERVEURBASE;
+} else {
+    $database_host = SERVEURBASE;
+}
+
+$connect->Connect($database_host, USERBASE, USERPASSWD, BASE);
 $err = 0;
diff --git a/install.mysql.auto.sql b/install.mysql.auto.sql
new file mode 100644
index 00000000..a42245e1
--- /dev/null
+++ b/install.mysql.auto.sql
@@ -0,0 +1,8 @@
+CREATE TABLE IF NOT EXISTS `comments` (`id_comment` int(11) unsigned NOT NULL AUTO_INCREMENT, `id_sondage` char(16) NOT NULL, `comment` text NOT NULL, `usercomment` text, PRIMARY KEY (`id_comment`), KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `sondage` (`id_sondage` char(16) NOT NULL, `commentaires` text, `mail_admin` varchar(128) DEFAULT NULL, `nom_admin` varchar(64) DEFAULT NULL, `titre` text, `id_sondage_admin` char(24) DEFAULT NULL, `date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `date_fin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `format` varchar(2) DEFAULT NULL, `mailsonde` tinyint(1) DEFAULT '0', `statut` int(11) NOT NULL DEFAULT '1' COMMENT '1 = actif ; 0 = inactif ; ', UNIQUE KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `sujet_studs` (`id_sondage` char(16) NOT NULL, `sujet` text, KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `user_studs` (`id_users` int(11) unsigned NOT NULL AUTO_INCREMENT, `nom` varchar(64) NOT NULL, `id_sondage` char(16) NOT NULL, `reponses` text NOT NULL, PRIMARY KEY (`id_users`), KEY `id_sondage` (`id_sondage`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
+
+INSERT INTO `sondage` (`id_sondage`, `commentaires`, `mail_admin`, `nom_admin`, `titre`, `id_sondage_admin`, `date_fin`, `format`) VALUES ('aqg259dth55iuhwm','Repas de Noel du service','Stephanie@retaillard.com','Stephanie', 'Repas de Noel','aqg259dth55iuhwmy9d8jlwk', FROM_UNIXTIME('1627100361'),'D+');
+INSERT INTO `sujet_studs` (`id_sondage`, `sujet`) VALUES ('aqg259dth55iuhwm','1225839600@12h,1225839600@19h,1226012400@12h,1226012400@19h,1226876400@12h,1226876400@19h,1227049200@12h,1227049200@19h,1227826800@12h,1227826800@19h');
+INSERT INTO `user_studs` (`nom`, `id_sondage`, `reponses`, `id_users`) VALUES ('marcel','aqg259dth55iuhwm','0110111101','933'), ('paul','aqg259dth55iuhwm','1011010111','935'), ('sophie','aqg259dth55iuhwm','1110110000','945'), ('barack','aqg259dth55iuhwm','0110000','948'), ('takashi','aqg259dth55iuhwm','0000110100','951'), ('albert','aqg259dth55iuhwm','1010110','975'), ('alfred','aqg259dth55iuhwm','0110010','1135'), ('marcs','aqg259dth55iuhwm','0100001010','1143'), ('laure','aqg259dth55iuhwm','0011000','1347'), ('benda','aqg259dth55iuhwm','1101101100','1667'), ('Albert','aqg259dth55iuhwm','1111110011','1668');
diff --git a/install.php b/install.php
new file mode 100644
index 00000000..0e12bad6
--- /dev/null
+++ b/install.php
@@ -0,0 +1,187 @@
+<?php
+
+$configuration_file = __DIR__.'/app/inc/constants.php';
+
+if (file_exists($configuration_file) === true) {
+    header('Location: index.php');
+    exit;
+}
+
+if (isset($_POST['install']) === true) {
+    ini_set('max_execution_time', 0);
+    ob_start();
+
+    // Composer exist ?
+    $locations = array(
+        __DIR__.'/composer.phar',
+        //'/usr/bin/composer',
+        '/usr/bin/composer.phar',
+        //'/usr/local/bin/composer',
+        '/usr/local/bin/composer.phar',
+    );
+    $composer = null;
+    foreach ($locations as $location) {
+        if (file_exists($location) === true) {
+            $composer = $location;
+            break;
+        }
+    }
+
+    // If composer not found, download it !
+    if (null === $composer) {
+        if (!file_put_contents(__DIR__.'/composer.phar', file_get_contents('https://getcomposer.org/composer.phar'))) {
+            die('Installation impossible : impossible to find composer !');
+        }
+        $composer = __DIR__.'/composer.phar';
+    }
+
+    try {
+        echo "Utilisation de ".$composer.'<br />';
+        ob_flush();
+        flush();
+
+        require_once 'phar://'.$composer.'/src/bootstrap.php';
+        ob_flush();
+        flush();
+
+        $composer_home = getenv('COMPOSER_HOME');
+        $personal_home = getenv('HOME');
+        if (empty($composer_home) === true && empty($personal_home) === true) {
+            putenv('COMPOSER_HOME='.sys_get_temp_dir());
+        }
+
+        $application = new \Composer\Console\Application();
+        $application->setAutoExit(false);
+        $command = $application->find('install');
+        $input = new \Symfony\Component\Console\Input\ArrayInput(array(
+            'command' => 'install',
+            '-d' => __DIR__,
+            '-vvv',
+            '--optimize-autoloader',
+        ));
+        $fhandle = fopen('php://output', 'wb');
+        $output = new \Symfony\Component\Console\Output\StreamOutput($fhandle);
+
+        $application->run($input, $output);
+        fclose($fhandle);
+        ob_flush();
+        flush();
+
+        // Save configuration
+        $configuration = file_get_contents($configuration_file.'.template');
+        if (false === $configuration) {
+            throw new \Exception('Impossible to read template configuration');
+        }
+
+        $configuration = str_replace(
+            array(
+                '\'<Application name>\'',
+                '\'<email address>\'',
+                '\'<no-reply@mydomain.com>\'',
+                '\'<database name>\'',
+                '\'<database user>\'',
+                '\'<database password>\'',
+                '\'<database server>\'',
+                '\'<database type>\'',
+            ),
+            array(
+                var_export($_POST['title'], true),
+                var_export($_POST['email'], true),
+                var_export($_POST['no-reply-email'], true),
+                var_export($_POST['db-name'], true),
+                var_export($_POST['db-user'], true),
+                var_export($_POST['db-pass'], true),
+                var_export($_POST['db-host'], true),
+                var_export($_POST['db-type'], true),
+            ),
+            $configuration
+        );
+
+        if (file_put_contents($configuration_file, $configuration) === false) {
+            throw new \Exception('Impossible to save configuration');
+        }
+
+        // Inject database
+        require_once __DIR__.'/app/inc/init.php';
+
+        $sqls = explode("\n", file_get_contents(__DIR__.'/install.mysql.auto.sql'));
+        foreach ($sqls as $sql) {
+            $sql = trim($sql);
+            if (empty($sql) === true) {
+                continue;
+            }
+
+            $query = $connect->Prepare($sql);
+            $cleaning = $connect->Execute($query);
+        }
+
+        ob_flush();
+        flush();
+        ob_end_clean();
+    } catch (Exception $e) {
+        echo '<br /><b>'.$e->getMessage().'</b><br />';
+        echo "<pre>".$e->getTraceAsString()."</pre>";
+        die('installation failed');
+    }
+}
+?><!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8" />
+        <title>OpenSondage Installation</title>
+        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
+    </head>
+    <body>
+        <div class="container">
+            <h1>OpenSondage Installation</h1>
+            <form action="" method="post" role="form">
+                <fieldset>
+                    <legend>General</legend>
+
+                    <div class="form-group">
+                        <label for="title">Title</label>
+                        <input type="text" class="form-control" id="title" name="title" placeholder="Application name" required>
+                    </div>
+                    <div class="form-group">
+                        <label for="email">Administrator email</label>
+                        <input type="email" class="form-control" id="email" name="email" placeholder="Email of the administrator" required>
+                    </div>
+                    <div class="form-group">
+                        <label for="no-reply-email">No-reply email</label>
+                        <input type="email" class="form-control" id="no-reply-email" name="no-reply-email" placeholder="Email for automatic responses" required>
+                    </div>
+                </fieldset>
+                <fieldset>
+                    <legend>Database</legend>
+
+                    <div class="form-group">
+                        <label for="db-type">Type</label>
+                        <select name="db-type" id="db-type" required>
+                            <option value="pdo">PDO - MySQL</option>
+                            <option value="mysql">MySQL</option>
+                        </select>
+                    </div>
+                    <div class="form-group">
+                        <label for="db-host">Host</label>
+                        <input type="text" class="form-control" id="db-host" name="db-host" value="localhost" required>
+                    </div>
+                    <div class="form-group">
+                        <label for="db-name">Database name</label>
+                        <input type="text" class="form-control" id="db-name" name="db-name" value="opensondage" required>
+                    </div>
+                    <div class="form-group">
+                        <label for="db-user">Username</label>
+                        <input type="text" class="form-control" id="db-user" name="db-user" value="root" required>
+                    </div>
+                    <div class="form-group">
+                        <label for="db-pass">Password</label>
+                        <input type="password" class="form-control" id="db-pass" name="db-pass" value="">
+                    </div>
+                </fieldset>
+
+                <input type="submit" class="btn btn-default" name="install" value="Install">
+            </form>
+        </div>
+    </body>
+</html>
+
-- 
GitLab