]> dev.renevier.net Git - syp.git/blob - inc/html/install.php
postgresql support
[syp.git] / inc / html / install.php
1 <?php
2 /* Copyright (c) 2009 Arnaud Renevier, Inc, published under the modified BSD
3    license. */
4 ?>
5 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
6        "http://www.w3.org/TR/html4/loose.dtd">  
7 <html lang="<?php echo $lang?>">
8 <head>
9       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
10       <link rel="stylesheet" href="./media/install.css" type="text/css" >
11       <title><?php ptrans ('SYP wizard')?></title>
12       <script type="text/javascript">
13       var sypStrings = {
14             emptyPasswordError: "<?php ptrans('Password cannot be empty')?>"
15       };
16
17       function init () {
18         if (document.getElementById('db_host')) { 
19             document.getElementById('db_host').focus();
20             document.getElementById('db_host').select();
21         } else if (document.getElementById('admin_pass')) { 
22             document.getElementById('admin_pass').focus();
23             document.getElementById('admin_pass').select();
24         }
25       }
26
27       function checkpwd () {
28           var pass = document.getElementById('admin_pass').value;
29           if (!pass) {
30               document.getElementById('empty_pass_error').innerHTML = sypStrings.emptyPasswordError;
31               document.getElementById('empty_pass_error').style.display = "block";
32               document.getElementById('admin_pass').focus();
33               return false;
34           }
35           return true;
36       }
37       </script>
38 </head>
39 <body onload="init()">
40
41 <?php
42
43     define ("CONFIG_FILE", "./inc/settings.php");
44
45     require_once ("./inc/install_utils.php");
46
47     if (version_compare (PHP_VERSION, '5.0.0', '<')) {
48         par_error_and_leave (trans ("You need at least PHP version 5"));
49     }
50
51     function error_unwritable_config () {
52         par_error_and_leave (trans ("Cannot save config file. You need either to set inc/ writable, or use manual method. See README.txt for more informations."));
53     }
54
55     function create_install_form () {
56         if (isset ($_POST ["db_form_submit"])) {
57             $type = $_POST ["db_type"];
58             $host = $_POST ["db_host"];
59             $name = $_POST ["db_name"];
60             $user = $_POST ["db_user"];
61             $prefix = $_POST ["db_prefix"];
62             $title = $_POST ["site_title"];
63         } else {
64             $type = "mysql";
65             $host = "localhost";
66             $user = "syp";
67             $name = "syp";
68             $prefix = "syp_";
69             $title = "SYP";
70         }
71
72         print '<form method="post" action="' . $_SERVER ["REQUEST_URI"] .  '"><fieldset>' . "\n";
73         print '<legend>' . trans ("SYP configuration") . '</legend>' . "\n";
74
75         $drivers = array();
76         $handle = opendir("./inc/db");
77         if (!$handle) {
78             par_error_and_leave (trans ('Could not list <code>inc/db</code> directory'));
79         }
80         while (false !== ($file = readdir($handle))) {
81             if ($file == "." or $file == "..") {
82                 continue;
83             }
84             $driver_name = substr($file,0,strrpos($file,'.'));
85             if ($driver_name == "anydb") {
86                 continue;
87             }
88             array_push ($drivers, $driver_name);
89         }
90         closedir($handle);
91
92
93         print '<div><label for="db_type" title="' .
94               trans ("You can specify a database backend. Mysql is the most available for standard web hosting services.") .
95               '">' . trans ("database backend:") . '</label>' . "\n" .
96               '<select id="db_type" name="db_type">'. "\n";
97         foreach ($drivers as $driver) {
98             if ($driver == $type) {
99                 print '<option name="' . $driver . '" selected="true">' . $driver . '</option>' . "\n";
100             } else {
101                 print '<option name="' . $driver . '">' . $driver . '</option>' . "\n";
102             }
103         }
104         print "</select>" . "\n";
105
106         print '<div><label for="db_host" title="' .
107               trans ("address of the database server (example: localhost, db.myhost.com or 192.168.0.15).") .
108               '">' . trans ("database server hostname:") . '</label>' . "\n" .
109               '<input id="db_host" name="db_host" value="' . $host . '"></div>' . "\n";
110
111         print '<div><label for="db_name" title="' .
112               trans ("The name of the database that SYP will be installed into. The database must exist.") .
113               '">' . trans ("database name:") . '</label>' . "\n" .
114               '<input id="db_name" name="db_name" value="' . $name . '"></div>' . "\n";
115
116         print '<div><label for="db_user" title="' .
117               trans ("The username with which you connect to the database.") .
118               '">' . trans ("database user:") . '</label>' . "\n" .
119               '<input id="db_user" name="db_user" value="' . $user . '"></div>' . "\n";
120
121         print '<div><label for="db_pass" title="' .
122               trans ("The password with which you connect to the database.") .
123               '">' . trans ("database password:") . '</label>' . "\n" .
124               '<input id="db_pass" name="db_pass" type="password"></div>' . "\n";
125
126         print '<div><label for="db_prefix" title="' .
127               trans ("You can specify a table prefix. This way you can run multiple SYP installations in the same database, each with its own prefix.") .
128               '">' . trans ("tables prefix:") . '</label>' . "\n" .
129               '<input id="db_prefix" name="db_prefix" value="' . $prefix . '">' . "\n";
130
131         print '<div><label for="site_title" title="' .
132               trans ("The title you want to give to your SYP site.") .
133               '">' . trans ("site title:") . '</label>' . "\n" .
134               '<input id="site_title" name="site_title" value="' . $title . '">' . "\n";
135
136         print '<div><input id="db_form_submit" name="db_form_submit" type="submit" value="' . trans ("Start install") . '"></div>';
137         print '</fieldset></form>';
138     }
139
140     if (file_exists (CONFIG_FILE)) {
141         require_once (CONFIG_FILE);
142     } else if (isset ($_POST["db_form_submit"])) { // user has submitted form
143
144         function _unquote($gpc_str) {
145            if (!isset ($gpc_str)) {
146                return $gpc_str;
147            }
148            if (get_magic_quotes_gpc ()) {
149                 return stripslashes ($gpc_str);
150            } else {
151                return $gpc_str;
152            }
153         }
154
155         define (DBTYPE, _unquote ($_POST ["db_type"]));
156         define (DBHOST, _unquote ($_POST ["db_host"]));
157         define (DBNAME, _unquote ($_POST ["db_name"]));
158         define (DBUSER, _unquote ($_POST ["db_user"]));
159         define (DBPWD, _unquote ($_POST ["db_pass"]));
160         define (DBPREFIX, _unquote ($_POST ["db_prefix"]));
161         define (SITETITLE, _unquote ($_POST ["site_title"]));
162
163         // default values
164         define (UPLOADDIR, "upload");
165         define (THUMBSDIR, "upload/_thumbs");
166     } else {
167         if (!is_writable (dirname (CONFIG_FILE))) {
168             error_unwritable_config ();
169         }
170
171         create_install_form ();
172         leave ();
173     }
174
175     if (!include_once ("./inc/db/" . DBTYPE . ".php")) {
176         par_error_and_leave (trans("Unkown backend: ", DBTYPE));
177     }
178     require_once ("./inc/utils.php");
179
180     try {
181         $connection->connect (DBHOST, DBUSER, DBPWD, DBNAME, DBPREFIX);
182     } catch (Exception $e) {
183         switch ($e->getMessage ()) {
184             case anydbConnection::err_driver_unavailable:
185                 par_error ($connection->getdbname() . ': ' . trans ('not supported'));
186                 break;
187             case anydbConnection::err_connection:
188                 par_error (trans ('Could not connect to database.'));
189                 break;
190             case anydbConnection::err_unknown_database:
191                 par_error (trans ('Database does not exist.'));
192                 break;
193             default:
194                 par_error (trans ('Unknown error when connecting to database.'));
195                 break;
196         }
197
198         if (isset ($_POST ["db_form_submit"])) {
199             // user had submited database informations. They seem to be wrong.
200             // Ask again.
201             create_install_form ();
202         }
203         leave ();
204     }
205
206     // we can connect to table. If config file does not exist, try to create it now.
207     if (!file_exists (CONFIG_FILE)) {
208         $handle = fopen ("./inc/settings.php.in", "r");
209         $lines = array();
210         if ($handle) {
211             while (!feof ($handle)) {
212                 $line = fgets ($handle, 4096);
213                 foreach (array ("DBTYPE", "DBHOST", "DBNAME", "DBUSER", "DBPWD", "DBPREFIX", "SITETITLE") as $value) {
214                     $pattern = "(define\s+\(\s*\"$value\"\s*,\s*\")[^\"]*(\"\s*\)\s*;)";
215                     if (preg_match( "/$pattern/", $line, $match )) {
216                         $line = $match[1] . addslashes (constant ($value)) . $match[2];
217                         break;
218                     }
219                 }
220                 array_push ($lines, $line);
221             }
222             fclose ($handle);
223         } else {
224             par_error_and_leave (trans ('Could not read <code>inc/settings.php.in</code>'));
225         }
226
227         $handle = fopen(CONFIG_FILE, 'w');
228         if (!$handle) {
229             error_unwritable_config ();
230         }
231         fwrite ($handle, join($lines));
232         par_success (trans ('Config file created'));
233     } else {
234         par_success (trans ('Config file exists'));
235     }
236
237     try {
238         $users_table_exists = $connection->users_table_exists ();
239     } catch(Exception $e) {
240         par_error_and_leave (trans ('Unknown error when checking user table.'));
241     }
242
243     if ($users_table_exists) {
244         par_success (trans ('Found user table.'));
245     } else {
246         $empty_pass = (isset ($_POST ["admin_pass"]) && (strlen ($_POST ["admin_pass"]) == 0));
247         if ($_POST ["admin_pass"]) {
248             try {
249                 $connection->create_users_table (true);
250             } catch (Exception $e) {
251                 par_error_and_leave (trans ('Error when creating user table.'));
252             }
253             par_success (trans ('User table created.'));
254             try {
255                 $connection->setpwd ("admin", $_POST ["admin_pass"]);
256             } catch (Exception $e) {
257                 par_error_and_leave (trans ('Error when initializing password.'));
258             }
259             par_success (trans ('Admin password initialized.'));
260
261         } else {
262             print ('<form class="center" method="post" action="" onsubmit="return checkpwd()">
263                     <label for="admin_pass">' . trans ("choose admin password") . '</label>
264                     <input id="admin_pass" name="admin_pass" type="password">');
265             if ($empty_pass) {
266                 print ('<p class="error" id="empty_pass_error">' . trans('Password cannot be empty') . '</p>');
267             } else {
268                 print ('<p class="error" style="display: none" id="empty_pass_error"></p>');
269             }
270             print ('<br><input type="submit"></form>');
271             leave ();
272         }
273     }
274
275     try {
276         $items_table_exists = $connection->items_table_exists ();
277     } catch (Exception $e) {
278         par_error_and_leave (trans ('Unknown error when checking data table.'));
279     }
280     if ($items_table_exists) {
281         par_success (trans ('Found data table.'));
282     } else {
283         try {
284             $connection->create_items_table (true);
285         } catch (Exception $e) {
286             par_error_and_leave (trans ('Error when creating data table.'));
287         }
288         par_success (trans ('Data table created.'));
289     }
290
291     safe_create_writable_dir (UPLOADDIR);
292     safe_create_writable_dir (getthumbsdir ());
293
294     if (!function_exists ("gd_info")) {
295         par_warn (trans ('It looks like GD extension is not installed.'));
296     }
297
298     par_success (trans ('SYP is installed. You can now go to <a href="admin.en.php">admin area</a>'));
299 ?>
300
301 </body>
302 </html>