OSDN Git Service

MERGE: リビジョン1747のマージ。./install/index.phpの修正。
[nucleus-jp/nucleus-next.git] / install / index.php
1 <?php\r
2 /*\r
3  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
4  * Copyright (C) 2002-2012 The Nucleus Group\r
5  *\r
6  * This program is free software; you can redistribute it and/or\r
7  * modify it under the terms of the GNU General Public License\r
8  * as published by the Free Software Foundation; either version 2\r
9  * of the License, or (at your option) any later version.\r
10  * (see nucleus/documentation/index.html#license for more info)\r
11  *\r
12  * This script will install the Nucleus tables in your SQL-database,\r
13  * and initialize the data in those tables.\r
14  */\r
15 \r
16 /**\r
17  * @license http://nucleuscms.org/license.txt GNU General Public License\r
18  * @copyright Copyright (C) 2002-2012 The Nucleus Group\r
19  * @version $Id: index.php 1745 2012-04-12 23:45:47Z sakamocchi $
20  */\r
21 \r
22 /* global values initialize */\r
23 $CONF = array();\r
24 \r
25 /* reporting all errors for support */\r
26 error_reporting(E_ALL);\r
27 \r
28 $minimum_php_version = '5.0.6';\r
29 $minimum_mysql_version = '3.23';\r
30 \r
31 $page_footer_copyright = '&copy; 2001-2012 The Nucleus Groupe . Running Nucleus CMS v4.00';\r
32 \r
33 // begin if: server's PHP version is below the minimum; halt installation\r
34 if ( version_compare(PHP_VERSION, $minimum_php_version, '<') )\r
35 {\r
36         exit('<div style="font-size: xx-large;"> Nucleus requires at least PHP version ' . $minimum_php_version . '</div>');\r
37 }\r
38 \r
39 // make sure there's no unnecessary escaping: # set_magic_quotes_runtime(0);\r
40 if ( version_compare(PHP_VERSION, '5.3.0', '<') )\r
41 {\r
42         ini_set('magic_quotes_runtime', '0');\r
43 }\r
44 \r
45 /* default installed plugins and skins */\r
46 $aConfPlugsToInstall = array('NP_SecurityEnforcer', 'NP_SkinFiles', 'NP_Text');\r
47 $aConfSkinsToImport = array('atom', 'rss2.0', 'rsd', 'default');\r
48 \r
49 // Check if some important files\r
50 do_check_files();\r
51 \r
52 /* i18n class is needed for internationalization */\r
53 include_once('../nucleus/libs/i18n.php');\r
54 if ( !i18n::init('UTF-8', './locales') )\r
55 {\r
56         exit('<div style="font-size: xx-large;"> Failed to initialize iconv or mbstring extension. Would you please contact the administrator of your PHP server? </div>');\r
57 }\r
58 \r
59 // check if mysql support is installed; this check may not make sense, as is, in a version past 3.5x\r
60 if ( !function_exists('mysql_query') && !function_exists('mysqli_query') )\r
61 {\r
62         exit('<div style="font-size: xx-large;"> Your PHP version does not have support for MySQL :( </div>');\r
63 }\r
64 \r
65 // include core classes that are needed for login & plugin handling\r
66 include_once('../nucleus/libs/mysql.php');\r
67 \r
68 // added for 3.5 sql_* wrapper\r
69 global $MYSQL_HANDLER;\r
70 \r
71 if ( !isset($MYSQL_HANDLER) )\r
72 {\r
73         $MYSQL_HANDLER = array('mysql', '');\r
74 }\r
75 include_once('../nucleus/libs/sql/' . $MYSQL_HANDLER[0] . '.php');\r
76 \r
77 session_start();\r
78 if ( count($_GET) == 0 && count($_POST) == 0 )\r
79 {\r
80         unset($_SESSION['param_manager']);\r
81 }\r
82 \r
83 // restore the $param from the session\r
84 if ( array_key_exists('param_manager', $_SESSION) )\r
85 {\r
86         $param = $_SESSION['param_manager'];\r
87 }\r
88 else\r
89 {\r
90         $param = new ParamManager();\r
91 }\r
92 \r
93 // include translation file\r
94 if ( array_key_exists('locale', $_POST) ) $param->set_locale();\r
95 i18n::set_current_locale($param->locale);\r
96 $translation_file = './locales/' . i18n::get_current_locale() . '.' . i18n::get_current_charset() . '.php';\r
97 if ( !file_exists($translation_file) )\r
98 {\r
99         $translation_file = './locales/en_Latn_US.UTF-8.php';\r
100 }\r
101 include($translation_file);\r
102 \r
103 do_action();\r
104 \r
105 // $param is saved to the session\r
106 if ( isset($param) )\r
107 {\r
108         $_SESSION['param_manager'] = $param;\r
109 }\r
110 else\r
111 {\r
112         unset($_SESSION['param_manager']);\r
113 }\r
114 exit;\r
115 \r
116 /**\r
117  * installer action\r
118  */\r
119 function do_action()\r
120 {\r
121         global $param;\r
122 \r
123         if ( array_key_exists('action', $_POST) )\r
124         {\r
125                 $isPostback = true;\r
126         }\r
127         else\r
128         {\r
129                 $isPostback = false;\r
130         }\r
131 \r
132         // mode change\r
133         if ( array_key_exists('mode', $_REQUEST) )\r
134         {\r
135                 if ( $_REQUEST['mode'] == 'detail' )\r
136                 {\r
137                         $param->set_state('detail');\r
138                 }\r
139                 elseif ( $_REQUEST['mode'] == 'simple' )\r
140                 {\r
141                         $param->set_state('mysql');\r
142                 }\r
143         }\r
144 \r
145         // input parameter check\r
146         if ( $isPostback )\r
147         {\r
148                 switch ( $param->state )\r
149                 {\r
150                         case 'locale':\r
151                                 $param->set_locale();\r
152                                 $param->set_state('mysql');\r
153                                 $isPostback = false;\r
154                                 break;\r
155                         case 'mysql':\r
156                                 if ( count($param->check_mysql_parameters()) == 0 )\r
157                                 {\r
158                                         $param->set_state('weblog');\r
159                                         $isPostback = false;\r
160                                 }\r
161                                 break;\r
162                         case 'weblog':\r
163                                 if ( count($param->check_user_parameters()) == 0\r
164                                         && count($param->check_weblog_parameters()) == 0 )\r
165                                 {\r
166                                         $param->set_state('install');\r
167                                         $isPostback = false;\r
168                                 }\r
169                                 break;\r
170                         case 'detail':\r
171                                 if ( $param->check_all_parameters() )\r
172                                 {\r
173                                         $param->set_state('install');\r
174                                         $isPostback = false;\r
175                                 }\r
176                                 break;\r
177                 }\r
178         }\r
179 \r
180         // page render\r
181         show_header();\r
182         switch ( $param->state )\r
183         {\r
184                 case 'locale':\r
185                         show_select_locale_form();\r
186                         break;\r
187                 case 'mysql':\r
188                         show_database_setting_form($isPostback);\r
189                         break;\r
190                 case 'weblog':\r
191                         show_blog_setting_form($isPostback);\r
192                         break;\r
193                 case 'detail':\r
194                         show_detail_setting_form($isPostback);\r
195                         break;\r
196                 case 'install':\r
197                         show_install_complete_form();\r
198                         break;\r
199         }\r
200         show_footer();\r
201 }\r
202 \r
203 /**\r
204  * header tag of the installation screens\r
205  **/\r
206 function show_header()\r
207 {\r
208         global $param;\r
209 \r
210         /* HTTP 1.1 application for no caching */\r
211         header("Cache-Control: no-cache, must-revalidate");\r
212         header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");\r
213         header('Content-Type: text/html; charset=' . i18n::get_current_charset());\r
214 ?>\r
215 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
216 <html xmlns="http://www.w3.org/1999/xhtml">\r
217         <head>\r
218                 <title><?php echo _TITLE; ?></title>\r
219                 <link rel="stylesheet" type="text/css" href="./styles/inst.css" />\r
220                 <style type="text/css">\r
221                 <!--\r
222                 <?php echo _BODYFONTSTYLE; ?>\r
223                 -->\r
224                 </style>\r
225                 <script type="text/javascript">\r
226                         function SelectText( element ) {\r
227                                 window.setTimeout( function() { element.select() }, 0 );\r
228                         }\r
229                         var isSubmit = false;\r
230                         function OnceSubmit() {\r
231                                 if (!isSubmit) {\r
232                                         isSubmit = true;\r
233                                         window.setTimeout( function() { isSubmit = false; }, 10000 );\r
234                                         return true;\r
235                                 }\r
236                                 return false;\r
237                         }\r
238                 </script>\r
239         </head>\r
240         <body>\r
241                 <div id="header">\r
242                         <div id="navigation">\r
243                                 <h1><img src="./styles/nucleus_rogo.png" alt="NucleusCMS" /></h1>\r
244                                 <ul>\r
245 <?php\r
246         if ( in_array($param->state, array('mysql', 'weblog', 'install')) )\r
247         {\r
248                 echo '<li>', _STEP1, '</li><li';\r
249                 if ( $param->state == 'mysql' )\r
250                 {\r
251                         echo ' class="gry"';\r
252                 }\r
253                 echo '>&nbsp; &gt; &nbsp;', _STEP2, '</li><li';\r
254                 if ( in_array($param->state, array('mysql', 'weblog')) )\r
255                 {\r
256                         echo ' class="gry"';\r
257                 }\r
258                 echo '>&nbsp; &gt; &nbsp;', _STEP3, "</li>\n";\r
259         }\r
260         if ( in_array($param->state, array('mysql', 'weblog', 'detail')) )\r
261         {\r
262                 echo '<li class="rightbox">';\r
263                 if ( in_array($param->state, array('mysql', 'weblog')) )\r
264                 {\r
265                         echo '<a href="./?mode=detail">', _MODE2, '</a>';\r
266                 }\r
267                 else\r
268                 {\r
269                         echo '<a href="./?mode=simple">', _MODE1, '</a>';\r
270                 }\r
271                 echo '</li>';\r
272         }\r
273 ?>\r
274                                 </ul>\r
275                         </div>\r
276                 </div>\r
277 <?php\r
278 }\r
279 \r
280 /**\r
281  * footer tag of the installation screens\r
282  **/\r
283 function show_footer()\r
284 {\r
285         global $page_footer_copyright;\r
286 ?>\r
287                 <div id="footer">\r
288                         <?php echo $page_footer_copyright; ?>\r
289                 </div>\r
290         </body>\r
291 </html>\r
292 <?php\r
293 }\r
294 \r
295 /**\r
296  * Display the form for language select\r
297  */\r
298 function show_select_locale_form()\r
299 {\r
300         // Get the browser language that can be displayed\r
301         // TODO: default locale select simple implementation\r
302         $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);\r
303         foreach ( $languages as $language )\r
304         {\r
305                 $language = preg_replace('#([\w]+).*#', '$1', $language);\r
306                 break;\r
307         }\r
308 \r
309         $locales = array(\r
310                 array('en_Latn_US', 'English - United States'),\r
311                 array('ja_Jpan_JP', 'Japanese - Japan')\r
312         );\r
313 ?>\r
314                 <div id="container">\r
315                         <p style="font-size:152%;font-weight:bold;">\r
316                                 Select your locale:\r
317                         </p>\r
318                         <form method="post" action="./index.php">\r
319 \r
320                                 <div class="prt">\r
321                                         <select name="locale">\r
322 <?php\r
323         foreach ( $locales as $locale )\r
324         {\r
325                 echo "<option value=\"$locale[0]\"";\r
326                 if ( i18n::strpos($locale[0], $language) === 0 )\r
327                 {\r
328                         echo ' selected';\r
329                 }\r
330                 echo ">$locale[1]</option>\n";\r
331         }\r
332 ?>\r
333                                         </select>\r
334                                         <p class="sbt">\r
335                                                 <button type="submit" name="action" value="locale" class="sbt_arw">START</button>\r
336                                         </p>\r
337                                 </div>\r
338                         </form>\r
339                 </div>\r
340 <?php\r
341 }\r
342 \r
343 /**\r
344  * Display the form to set up a database\r
345  * @param bool $isPostback\r
346  */\r
347 function show_database_setting_form($isPostback)\r
348 {\r
349         global $param, $minimum_mysql_version;\r
350 \r
351         $config_writable = canConfigFileWritable();\r
352         $mysql_version = getMySqlVersion();\r
353 ?>\r
354                 <div id="container">\r
355                         <p class="msg">\r
356 <?php\r
357         echo _SIMPLE_NAVI1;\r
358         if ( $config_writable != '' )\r
359         {\r
360                 echo '<span class="err">', $config_writable, '</span>';\r
361         }\r
362         if ( $mysql_version == '0.0.0' )\r
363         {\r
364                 echo '<span class="err">', _DBVERSION_UNKOWN, '</span>';\r
365         }\r
366         elseif ( version_compare($mysql_version, $minimum_mysql_version, '<') )\r
367         {\r
368                 echo '<span class="err">', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), '</span>';\r
369         }\r
370 ?>\r
371                         </p>\r
372                         <form method="post" action="./index.php">\r
373                                 <div class="prt">\r
374                                         <h2><?php echo _DB_HEADER; ?></h2>\r
375                                         <p class="msg">\r
376 <?php\r
377         if ( $isPostback )\r
378         {\r
379                 $errors = $param->check_mysql_parameters();\r
380                 if ( is_array($errors) )\r
381                 {\r
382                         foreach ( $errors as $error )\r
383                         {\r
384                                 echo '<span class="err">', $error, "</span>\n";\r
385                         }\r
386                 }\r
387         }\r
388 ?>\r
389                                         </p>\r
390                                         <table>\r
391                                                 <tr>\r
392                                                         <th><span class="nam"><?php echo _DB_FIELD1; ?></span><span class="sub"><?php echo _DB_FIELD1_DESC; ?></span></th>\r
393                                                                 <td><input type="text" name="mysql_host" value="<?php echo $param->mysql_host; ?>" /></td>\r
394                                                 </tr>\r
395                                                 <tr>\r
396                                                         <th><span class="nam"><?php echo _DB_FIELD2; ?></span><span class="sub"><?php echo _DB_FIELD2_DESC; ?></span></th>\r
397                                                                 <td><input type="text" name="mysql_user" value="<?php echo $param->mysql_user; ?>" /></td>\r
398                                                 </tr>\r
399                                                 <tr>\r
400                                                         <th><span class="nam"><?php echo _DB_FIELD3; ?></span></th>\r
401                                                                 <td><input type="text" name="mysql_password" value="<?php echo $param->mysql_password; ?>" /></td>\r
402                                                 </tr>\r
403                                                 <tr>\r
404                                                         <th><span class="nam"><?php echo _DB_FIELD4; ?></span><span class="sub"><?php echo _DB_FIELD4_DESC; ?></span></th>\r
405                                                                 <td><input type="text" name="mysql_database" value="<?php echo $param->mysql_database; ?>" /></td>\r
406                                                 </tr>\r
407                                         </table>\r
408                                         <p class="sbt">\r
409                                                 <button type="submit" name="mode" value="detail" class="sbt_sqr"><?php echo _MODE2; ?></button>\r
410                                                 <button type="submit" name="action" value="mysql" class="sbt_arw"><?php echo _NEXT; ?></button>\r
411                                         </p>\r
412                                         <p class="msg">\r
413                                                 <?php echo _DB_TEXT1; ?>\r
414                                         </p>\r
415                                 </div>\r
416                         </form>\r
417                 </div>\r
418 <?php\r
419 }\r
420 \r
421 /**\r
422  * Displays a form to the blog settings\r
423  * @param bool $isPostback\r
424  */\r
425 function show_blog_setting_form($isPostback)\r
426 {\r
427         global $param;\r
428 ?>\r
429                 <div id="container">\r
430                         <p class="msg">\r
431                                 <?php echo _SIMPLE_NAVI2; ?>\r
432                         </p>\r
433                         <form method="post" action="./index.php">\r
434                                 <div class="prt">\r
435                                         <h2><?php echo _BLOG_HEADER; ?></h2>\r
436                                         <p class="msg">\r
437 <?php\r
438         if ( $isPostback )\r
439         {\r
440                 $errors = $param->check_weblog_parameters();\r
441                 if ( is_array($errors) )\r
442                 {\r
443                         foreach ( $errors as $error )\r
444                         {\r
445                                 echo '<span class="err">', $error, "</span>\n";\r
446                         }\r
447                 }\r
448         }\r
449 ?>\r
450                                         </p>\r
451                                         <table>\r
452                                                 <tr>\r
453                                                         <th><span class="nam"><?php echo _BLOG_FIELD1; ?></span></th>\r
454                                                                 <td><input type="text" name="blog_name" value="<?php echo $param->blog_name; ?>" /></td>\r
455                                                 </tr>\r
456                                                 <tr>\r
457                                                         <th><span class="nam"><?php echo _BLOG_FIELD2; ?></span><span class="sub"><?php echo _BLOG_FIELD2_DESC; ?></span></th>\r
458                                                                 <td><input type="text" name="blog_shortname" value="<?php echo $param->blog_shortname; ?>" /></td>\r
459                                                 </tr>\r
460                                         </table>\r
461                                 </div>\r
462 \r
463                                 <div class="prt">\r
464                                         <h2><?php echo _ADMIN_HEADER; ?></h2>\r
465                                         <p class="msg">\r
466 <?php\r
467         if ( $isPostback )\r
468         {\r
469                 $errors = $param->check_user_parameters();\r
470                 if ( is_array($errors) )\r
471                 {\r
472                         foreach ( $errors as $error )\r
473                         {\r
474                                 echo '<span class="err">', $error, "</span>\n";\r
475                         }\r
476                 }\r
477         }\r
478 ?>\r
479                                         </p>\r
480                                         <table>\r
481                                                 <tr>\r
482                                                         <th><span class="nam"><?php echo _ADMIN_FIELD1; ?></span></th>\r
483                                                                 <td><input type="text" name="user_realname" value="<?php echo $param->user_realname; ?>" /></td>\r
484                                                 </tr>\r
485                                                 <tr>\r
486                                                         <th><span class="nam"><?php echo _ADMIN_FIELD2; ?></span><span class="sub"><?php echo _ADMIN_FIELD2_DESC; ?></span></th>\r
487                                                                 <td><input type="text" name="user_name" value="<?php echo $param->user_name; ?>" /></td>\r
488                                                 </tr>\r
489                                                 <tr>\r
490                                                         <th><span class="nam"><?php echo _ADMIN_FIELD3; ?></span></th>\r
491                                                                 <td><input type="password" name="user_password" /></td>\r
492                                                 </tr>\r
493                                                 <tr>\r
494                                                         <th><span class="nam"><?php echo _ADMIN_FIELD4; ?></span></th>\r
495                                                                 <td><input type="password" name="user_password2" /></td>\r
496                                                 </tr>\r
497                                                 <tr>\r
498                                                         <th><span class="nam"><?php echo _ADMIN_FIELD5; ?></span></th>\r
499                                                                 <td><input type="text" name="user_email" value="<?php echo $param->user_email; ?>" /></td>\r
500                                                 </tr>\r
501                                         </table>\r
502                                         <p class="sbt">\r
503                                                 <button type="submit" name="action" value="weblog" class="sbt_arw" onclick="OnceSubmit()"><?php echo _INSTALL; ?></button>\r
504                                         </p>\r
505                                 </div>\r
506                         </form>\r
507                 </div>\r
508 <?php\r
509 }\r
510 \r
511 /**\r
512  * Displays a form to the detail settings\r
513  * @param bool $isPostback\r
514  */\r
515 function show_detail_setting_form($isPostback)\r
516 {\r
517         global $param, $minimum_mysql_version;\r
518 \r
519         $mysql_version = getMySqlVersion();\r
520 ?>\r
521                 <div id="container_detailed">\r
522                         <p class="msg">\r
523                                 <?php echo _DETAIL_NAVI1; ?>\r
524 <?php\r
525         if ( $isPostback && !$param->check_all_parameters() )\r
526         {\r
527                 echo '<span class="err">', _VALID_ERROR, "</span>\n";\r
528         }\r
529 ?>\r
530                         </p>\r
531                         <ul class="msg">\r
532                                 <li>PHP: <?php echo phpversion(); ?></li>\r
533                                 <li>MySQL:\r
534 <?php\r
535         echo ($mysql_version == '0.0.0') ? _DBVERSION_UNKOWN : $mysql_version;\r
536         if ( version_compare($mysql_version, $minimum_mysql_version, '<') )\r
537         {\r
538                 echo '<span class="err">', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), '</span>';\r
539         }\r
540 ?></li>\r
541                         </ul>\r
542                         <form method="post" action="">\r
543 \r
544                                 <div class="prt">\r
545                                         <h2><?php echo _DETAIL_HEADER1; ?></h2>\r
546                                         <p class="msg">\r
547 <?php\r
548         if ( $isPostback )\r
549         {\r
550                 $errors = $param->check_mysql_parameters();\r
551                 if ( is_array($errors) )\r
552                 {\r
553                         foreach ( $errors as $error )\r
554                         {\r
555                                 echo '<span class="err">', $error, "</span>\n";\r
556                         }\r
557                 }\r
558         }\r
559 ?>\r
560                                         </p>\r
561                                         <table>\r
562                                                 <tr>\r
563                                                         <th><span class="nam"><?php echo _DB_FIELD1; ?></span><span class="sub"><?php echo _DB_FIELD1_DESC; ?></span></th>\r
564                                                                 <td><input type="text" name="mysql_host" value="<?php echo $param->mysql_host; ?>" /></td>\r
565                                                 </tr>\r
566                                                 <tr>\r
567                                                         <th><span class="nam"><?php echo _DB_FIELD2; ?></span><span class="sub"><?php echo _DB_FIELD2_DESC; ?></span></th>\r
568                                                                 <td><input type="text" name="mysql_user" value="<?php echo $param->mysql_user; ?>" /></td>\r
569                                                 </tr>\r
570                                                 <tr>\r
571                                                         <th><span class="nam"><?php echo _DB_FIELD3; ?></span></th>\r
572                                                                 <td><input type="text" name="mysql_password" value="<?php echo $param->mysql_password; ?>" /></td>\r
573                                                 </tr>\r
574                                                 <tr>\r
575                                                         <th><span class="nam"><?php echo _DB_FIELD4; ?></span><span class="sub"><?php echo _DB_FIELD4_DESC; ?></span></th>\r
576                                                                 <td><input type="text" name="mysql_database" value="<?php echo $param->mysql_database; ?>" /></td>\r
577                                                 </tr>\r
578                                                 <tr>\r
579                                                         <th><span class="nam"><?php echo _DB_FIELD5; ?></span><span class="sub"><?php echo _DB_FIELD5_DESC; ?></span></th>\r
580                                                                 <td><input type="text" name="mysql_tablePrefix" value="<?php echo $param->mysql_tablePrefix; ?>" /></td>\r
581                                                 </tr>\r
582                                         </table>\r
583 \r
584                                         <h2><?php echo _DETAIL_HEADER2; ?></h2>\r
585                                         <p class="msg">\r
586 <?php\r
587         if ( $isPostback )\r
588         {\r
589                 $errors = $param->check_uri_parameters();\r
590                 if ( is_array($errors) )\r
591                 {\r
592                         foreach ( $errors as $error )\r
593                         {\r
594                                 echo '<span class="err">', $error, "</span>\n";\r
595                         }\r
596                 }\r
597                 $errors = $param->check_path_parameters();\r
598                 if ( is_array($errors) )\r
599                 {\r
600                         foreach ( $errors as $error )\r
601                         {\r
602                                 echo '<span class="err">', $error, "</span>\n";\r
603                         }\r
604                 }\r
605         }\r
606 ?>\r
607                                         </p>\r
608                                         <table>\r
609                                                 <tr>\r
610                                                         <th><span class="nam"><?php echo _PATH_FIELD1; ?></span></th>\r
611                                                                 <td><input type="text" name="IndexURL" value="<?php echo $param->IndexURL; ?>" /></td>\r
612                                                 </tr>\r
613                                                 <tr>\r
614                                                         <th><span class="nam"><?php echo _PATH_FIELD2; ?></span></th>\r
615                                                                 <td><input type="text" name="AdminURL" value="<?php echo $param->AdminURL; ?>" /></td>\r
616                                                 </tr>\r
617                                                 <tr>\r
618                                                         <th><span class="nam"><?php echo _PATH_FIELD3; ?></span></th>\r
619                                                                 <td><input type="text" name="AdminPath" value="<?php echo $param->AdminPath; ?>" /></td>\r
620                                                 </tr>\r
621                                                 <tr>\r
622                                                         <th><span class="nam"><?php echo _PATH_FIELD4; ?></span></th>\r
623                                                                 <td><input type="text" name="MediaURL" value="<?php echo $param->MediaURL; ?>" /></td>\r
624                                                 </tr>\r
625                                                 <tr>\r
626                                                         <th><span class="nam"><?php echo _PATH_FIELD5; ?></span></th>\r
627                                                                 <td><input type="text" name="MediaPath" value="<?php echo $param->MediaPath; ?>" /></td>\r
628                                                 </tr>\r
629                                                 <tr>\r
630                                                         <th><span class="nam"><?php echo _PATH_FIELD6; ?></span></th>\r
631                                                                 <td><input type="text" name="SkinsURL" value="<?php echo $param->SkinsURL; ?>" /></td>\r
632                                                 </tr>\r
633                                                 <tr>\r
634                                                         <th><span class="nam"><?php echo _PATH_FIELD7; ?></span></th>\r
635                                                                 <td><input type="text" name="SkinsPath" value="<?php echo $param->SkinsPath; ?>" /></td>\r
636                                                 </tr>\r
637                                                 <tr>\r
638                                                         <th><span class="nam"><?php echo _PATH_FIELD8; ?></span></th>\r
639                                                                 <td><input type="text" name="PluginURL" value="<?php echo $param->PluginURL; ?>" /></td>\r
640                                                 </tr>\r
641                                                 <tr>\r
642                                                         <th><span class="nam"><?php echo _PATH_FIELD9; ?></span></th>\r
643                                                                 <td><input type="text" name="ActionURL" value="<?php echo $param->ActionURL; ?>" /></td>\r
644                                                 </tr>\r
645                                         </table>\r
646                                         <p class="msg">\r
647                                                 <?php echo _DETAIL_TEXT3; ?>\r
648                                         </p>\r
649 \r
650                                         <h2><?php echo _DETAIL_HEADER3; ?></h2>\r
651                                         <p class="msg">\r
652 <?php\r
653         echo _DETAIL_TEXT4;\r
654         if ( $isPostback )\r
655         {\r
656                 $errors = $param->check_user_parameters();\r
657                 if ( is_array($errors) )\r
658                 {\r
659                         foreach ( $errors as $error )\r
660                         {\r
661                                 echo '<span class="err">', $error, "</span>\n";\r
662                         }\r
663                 }\r
664         }\r
665 ?>\r
666                                         </p>\r
667                                         <table>\r
668                                                 <tr>\r
669                                                         <th><span class="nam"><?php echo _ADMIN_FIELD1; ?></span></th>\r
670                                                                 <td><input type="text" name="user_realname" value="<?php echo $param->user_realname; ?>" /></td>\r
671                                                 </tr>\r
672                                                 <tr>\r
673                                                         <th><span class="nam"><?php echo _ADMIN_FIELD2; ?></span><span class="sub"><?php echo _ADMIN_FIELD2_DESC; ?></span></th>\r
674                                                                 <td><input type="text" name="user_name" value="<?php echo $param->user_name; ?>" /></td>\r
675                                                 </tr>\r
676                                                 <tr>\r
677                                                         <th><span class="nam"><?php echo _ADMIN_FIELD3; ?></span></th>\r
678                                                                 <td><input type="password" name="user_password" /></td>\r
679                                                 </tr>\r
680                                                 <tr>\r
681                                                         <th><span class="nam"><?php echo _ADMIN_FIELD4; ?></span></th>\r
682                                                                 <td><input type="password" name="user_password2" /></td>\r
683                                                 </tr>\r
684                                                 <tr>\r
685                                                         <th><span class="nam"><?php echo _ADMIN_FIELD5; ?></span></th>\r
686                                                                 <td><input type="text" name="user_email" value="<?php echo $param->user_email; ?>" /></td>\r
687                                                 </tr>\r
688                                         </table>\r
689 \r
690                                         <h2><?php echo _DETAIL_HEADER4; ?></h2>\r
691                                         <p class="msg">\r
692 <?php\r
693         echo _DETAIL_TEXT5;\r
694         if ( $isPostback )\r
695         {\r
696                 $errors = $param->check_weblog_parameters();\r
697                 if ( is_array($errors) )\r
698                 {\r
699                         foreach ( $errors as $error )\r
700                         {\r
701                                 echo '<span class="err">', $error, "</span>\n";\r
702                         }\r
703                 }\r
704         }\r
705 ?>\r
706                                         </p>\r
707                                         <table>\r
708                                                 <tr>\r
709                                                         <th><span class="nam"><?php echo _BLOG_FIELD1; ?></span></th>\r
710                                                                 <td><input type="text" name="blog_name" value="<?php echo $param->blog_name; ?>" /></td>\r
711                                                 </tr>\r
712                                                 <tr>\r
713                                                         <th><span class="nam"><?php echo _BLOG_FIELD2; ?></span><span class="sub"><?php echo _BLOG_FIELD2_DESC; ?></span></th>\r
714                                                                 <td><input type="text" name="blog_shortname" value="<?php echo $param->blog_shortname; ?>" /></td>\r
715                                                 </tr>\r
716                                         </table>\r
717 \r
718                                         <p class="msg">\r
719                                                 <?php echo _DETAIL_TEXT6; ?>\r
720                                         </p>\r
721 \r
722                                         <p class="sbt">\r
723                                                 <button type="submit" name="action" value="detail" class="sbt_arw" onclick="OnceSubmit()"><?php echo _INSTALL; ?></button>\r
724                                         </p>\r
725                                 </div>\r
726                         </form>\r
727                 </div>\r
728 <?php\r
729 }\r
730 \r
731 /**\r
732  * Displays a screen to signal the completion of the installation\r
733  */\r
734 function show_install_complete_form()\r
735 {\r
736         global $MYSQL_HANDLER, $param;\r
737         $errors = do_install();\r
738 ?>\r
739                 <div id="container">\r
740                         <p class="msg">\r
741 <?php\r
742         if ( is_array($errors) && count($errors) > 0 )\r
743         {\r
744                 echo _INST_ERROR;\r
745                 foreach ( $errors as $error )\r
746                 {\r
747                         echo '<span class="err">', $error, "</span>\n";\r
748                 }\r
749         }\r
750         else\r
751         {\r
752                 echo _INST_TEXT;\r
753                 if ( array_key_exists('config_data', $_SESSION) )\r
754                 {\r
755                         echo '<span class="err">', _INST_TEXT4, '</span>';\r
756 ?>\r
757 <textarea id="config_text" readonly="readonly" onfocus="SelectText(this);"><?php echo htmlentities($_SESSION['config_data'], null, i18n::get_current_charset()) ?></textarea>\r
758 <?php\r
759                 }\r
760                 else\r
761                 {\r
762                         echo '<span class="err">', _INST_TEXT5, '</span>';\r
763                 }\r
764 ?>\r
765                         </p>\r
766                         <form method="post" action="./index.php">\r
767                                 <div class="prt">\r
768                                         <h2><?php echo _INST_HEADER1; ?></h2>\r
769                                         <p class="msg">\r
770                                                 <?php echo sprintf(_INST_TEXT1, $param->blog_name); ?>\r
771                                         </p>\r
772                                         <p class="sbt">\r
773                                                 <button type="button" name="toBlog" onclick="location.href='<?php echo $param->IndexURL; ?>';" class="sbt_arw"><?php echo _INST_BUTTON1; ?></button>\r
774                                         </p>\r
775                                 </div>\r
776 \r
777                                 <div class="prt">\r
778                                         <h2><?php echo _INST_HEADER2; ?></h2>\r
779                                         <p class="msg">\r
780                                                 <?php echo _INST_TEXT2; ?>\r
781                                         </p>\r
782                                         <p class="sbt">\r
783                                                 <button type="button" name="toMng" onclick="location.href='<?php echo $param->AdminURL; ?>';" class="sbt_arw"><?php echo _INST_BUTTON2; ?></button>\r
784                                         </p>\r
785                                 </div>\r
786 \r
787                                 <div class="prt">\r
788                                         <h2><?php echo _INST_HEADER3; ?></h2>\r
789                                         <p class="msg">\r
790                                                 <?php echo _INST_TEXT3; ?>\r
791                                         </p>\r
792                                         <p class="sbt">\r
793                                                 <button type="button" name="toAddBlog" onclick="location.href='<?php echo $param->AdminURL; ?>index.php?action=createnewlog';" class="sbt_arw"><?php echo _INST_BUTTON3; ?></button>\r
794                                         </p>\r
795                                 </div>\r
796                         </form>\r
797 <?php\r
798         }\r
799 ?>\r
800                 </div>\r
801 <?php\r
802         unset($param);\r
803 }\r
804 \r
805 /**\r
806  * The installation process itself\r
807  * @return array error messages\r
808  */\r
809 function do_install()\r
810 {\r
811         global $param;\r
812         global $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE, $MYSQL_PREFIX, $MYSQL_CONN;\r
813         global $DIR_NUCLEUS, $DIR_MEDIA, $DIR_SKINS, $DIR_PLUGINS, $DIR_LANG, $DIR_LIBS;\r
814         $errors = array();\r
815 \r
816         /*\r
817          * 1. put all param-vars into vars\r
818          */\r
819         $MYSQL_HOST             = $param->mysql_host;\r
820         $MYSQL_USER             = $param->mysql_user;\r
821         $MYSQL_PASSWORD = $param->mysql_password;\r
822         $MYSQL_DATABASE = $param->mysql_database;\r
823         $MYSQL_PREFIX   = $param->mysql_tablePrefix;\r
824 \r
825         $DIR_NUCLEUS    = $param->AdminPath;\r
826         $DIR_MEDIA              = $param->MediaPath;\r
827         $DIR_SKINS              = $param->SkinsPath;\r
828         $DIR_PLUGINS    = $DIR_NUCLEUS . 'plugins/';\r
829         $DIR_LOCALES    = $DIR_NUCLEUS . 'locales/';\r
830         $DIR_LIBS               = $DIR_NUCLEUS . 'libs/';\r
831 \r
832         /*\r
833          * 2.open mySQL connection\r
834          */\r
835         $MYSQL_CONN = @sql_connect_args($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD);\r
836         if ( $MYSQL_CONN == false )\r
837         {\r
838                 $errors[] = _DBCONNECT_ERROR;\r
839                 return $errors;\r
840         }\r
841 \r
842         /*\r
843          * 3. try to create database if needed\r
844          */\r
845         if ( !sql_query("CREATE DATABASE IF NOT EXISTS {$MYSQL_DATABASE}") )\r
846         {\r
847                 $errors[] = _INST_ERROR1 . ': ' . sql_error();\r
848         }\r
849 \r
850         /*\r
851          * 4. try to select database\r
852          */\r
853         if ( !sql_select_db($MYSQL_DATABASE) )\r
854         {\r
855                 $errors[] = _INST_ERROR2;\r
856         }\r
857         sql_set_charset('utf8');\r
858 \r
859         if ( count($errors) > 0 )\r
860         {\r
861                 return $errors;\r
862         }\r
863 \r
864         /*\r
865          * 5. execute queries\r
866          */\r
867         $table_names = array(\r
868                 'nucleus_actionlog',\r
869                 'nucleus_ban',\r
870                 'nucleus_blog',\r
871                 'nucleus_category',\r
872                 'nucleus_comment',\r
873                 'nucleus_config',\r
874                 'nucleus_item',\r
875                 'nucleus_karma',\r
876                 'nucleus_member',\r
877                 'nucleus_plugin',\r
878                 'nucleus_skin',\r
879                 'nucleus_template',\r
880                 'nucleus_team',\r
881                 'nucleus_activation',\r
882                 'nucleus_tickets'\r
883         );\r
884 \r
885         $prefixed_table_names = array();\r
886         foreach ( $table_names as $table_name )\r
887         {\r
888                 $prefixed_table_names[] = $MYSQL_PREFIX . $table_name;\r
889         }\r
890 \r
891         // table exists check\r
892         $result = sql_query('SHOW TABLES');\r
893         while ( $row = mysql_fetch_array($result, MYSQL_NUM) )\r
894         {\r
895                 if ( in_array($row[0], $prefixed_table_names) )\r
896                 {\r
897                         $errors[] = _INST_ERROR3;\r
898                         break;\r
899                 }\r
900         }\r
901         if ( count($errors) > 0 )\r
902         {\r
903                 return $errors;\r
904         }\r
905 \r
906         $filename = 'install.sql';\r
907         $fd = fopen($filename, 'r');\r
908         $queries = fread($fd, filesize($filename));\r
909         fclose($fd);\r
910 \r
911         $queries = preg_split('#(;\n|;\r)#', $queries);\r
912 \r
913         foreach ( $queries as $query )\r
914         {\r
915                 if ( preg_match('/\w+/', $query) )\r
916                 {\r
917                         if ( $MYSQL_PREFIX )\r
918                         {\r
919                                 $query = str_replace($table_names, $prefixed_table_names, $query);\r
920                         }\r
921 \r
922                         if ( !sql_query($query) )\r
923                         {\r
924                                 $errors[] = _INST_ERROR4 . ' (<small>' . $query . '</small>): ' . sql_error();\r
925                         }\r
926                 }\r
927         }\r
928 \r
929         /*\r
930          * 6. put needed records\r
931          */\r
932         /* push first post */\r
933         $query = "INSERT INTO %s VALUES (1, '%s', '%s', '%s', 1, 1, '%s', 0, 0, 0, 1, 0, 1)";\r
934         $query = sprintf($query, tableName('nucleus_item'), _1ST_POST_TITLE, _1ST_POST, _1ST_POST2, i18n::formatted_datetime('mysql', time()));\r
935         if ( !sql_query($query) )\r
936         {\r
937                 $errors[] = _INST_ERROR4 . ' (<small>' . $newpost . '</small>): ' . sql_error();\r
938         }\r
939 \r
940         /* push configurations */\r
941         array_merge($errors, updateConfig('IndexURL', $param->IndexURL));\r
942         array_merge($errors, updateConfig('AdminURL', $param->AdminURL));\r
943         array_merge($errors, updateConfig('MediaURL', $param->MediaURL));\r
944         array_merge($errors, updateConfig('SkinsURL', $param->SkinsURL));\r
945         array_merge($errors, updateConfig('PluginURL', $param->PluginURL));\r
946         array_merge($errors, updateConfig('ActionURL', $param->ActionURL));\r
947         array_merge($errors, updateConfig('AdminEmail', $param->user_email));\r
948         array_merge($errors, updateConfig('SiteName', $param->blog_name));\r
949         array_merge($errors, updateConfig('Locale', i18n::get_current_locale()));\r
950 \r
951         /* escape strings for SQL */\r
952         $user_name                      = sql_real_escape_string($param->user_name);\r
953         $user_realname          = sql_real_escape_string($param->user_realname);\r
954         $user_password          = sql_real_escape_string(md5($param->user_password));\r
955         $user_email                     = sql_real_escape_string($param->user_email);\r
956         $blog_name                      = sql_real_escape_string($param->blog_name);\r
957         $blog_shortname         = sql_real_escape_string($param->blog_shortname);\r
958         $config_indexurl        = sql_real_escape_string($param->IndexURL);\r
959 \r
960         /* push super admin */\r
961         $query = "UPDATE %s SET mname = '%s', mrealname = '%s', mpassword = '%s', memail = '%s', murl = '%s', madmin = 1, mcanlogin = 1 WHERE mnumber = 1";\r
962         $query = sprintf($query, tableName('nucleus_member'), $user_name, $user_realname, $user_password, $user_email, $config_indexurl);\r
963         if ( !sql_query($query) )\r
964         {\r
965                 $errors[] = _INST_ERROR5 . ': ' . sql_error();\r
966         }\r
967 \r
968         /* push new weblog */\r
969         $query = "UPDATE %s SET bname = '%s', bshortname = '%s', burl = '%s' WHERE bnumber = 1";\r
970         $query = sprintf($query, tableName('nucleus_blog'), $blog_name, $blog_shortname, $config_indexurl);\r
971         if ( !sql_query($query) )\r
972         {\r
973                 $errors[] = _INST_ERROR6 . ': ' . sql_error();\r
974         }\r
975 \r
976         /* push default category */\r
977         $query = "UPDATE %s SET cname = '%s', cdesc = '%s' WHERE catid = 1";\r
978         $query = sprintf($query, tableName('nucleus_category'), _GENERALCAT_NAME, _GENERALCAT_DESC);\r
979         if ( !sql_query($query) )\r
980         {\r
981                 $errors[] = _INST_ERROR6 . ': ' . sql_error();\r
982         }\r
983 \r
984         sql_close();\r
985 \r
986         /*\r
987          * 7. install default plugins and skins\r
988          */\r
989         global $aConfPlugsToInstall, $aConfSkinsToImport;\r
990         $aSkinErrors = array();\r
991         $aPlugErrors = array();\r
992 \r
993         if ( (count($aConfPlugsToInstall) > 0) || (count($aConfSkinsToImport) > 0) )\r
994         {\r
995                 include_once($DIR_LIBS . 'globalfunctions.php');\r
996                 global $manager;\r
997                 if ( !isset($manager) )\r
998                 {\r
999                         $manager = new Manager();\r
1000                 }\r
1001 \r
1002                 include_once($DIR_LIBS . 'skinie.php');\r
1003                 \r
1004                 $aSkinErrors = installCustomSkins();\r
1005                 if ( count($aSkinErrors) > 0 )\r
1006                 {\r
1007                         array_merge($errors, $aSkinErrors);\r
1008                 }\r
1009 \r
1010                 $query          = "SELECT sdnumber FROM %s WHERE sdname='default'";\r
1011                 $query          = sprintf($query, tableName('nucleus_skin_desc'));\r
1012                 $res            = sql_query($query);\r
1013                 $obj            = sql_fetch_assoc($res);\r
1014                 $defSkinID      = (integer) $obj['sdnumber'];\r
1015 \r
1016                 $query = "UPDATE %s SET bdefskin=%d WHERE bnumber=1";\r
1017                 $query = sprintf($query, tableName('nucleus_blog'), $defSkinID);\r
1018                 sql_query($query);\r
1019                 $query = "UPDATE %s SET value=%d WHERE name='BaseSkin'";\r
1020                 $query = sprintf($query, tableName('nucleus_config'), $defSkinID);\r
1021                 sql_query($query);\r
1022 \r
1023                 $aPlugErrors = installCustomPlugs();\r
1024                 if ( count($aPlugErrors) > 0 )\r
1025                 {\r
1026                         array_merge($errors, $aPlugErrors);\r
1027                 }\r
1028         }\r
1029 \r
1030         /*\r
1031          * 8. Write config file ourselves (if possible)\r
1032          */\r
1033         $config_data = '<' . '?php' . "\n";\r
1034         $config_data .= "// mySQL connection information\n";\r
1035         $config_data .= "\$MYSQL_HOST = '" . $MYSQL_HOST . "';\n";\r
1036         $config_data .= "\$MYSQL_USER = '" . $MYSQL_USER . "';\n";\r
1037         $config_data .= "\$MYSQL_PASSWORD = '" . $MYSQL_PASSWORD . "';\n";\r
1038         $config_data .= "\$MYSQL_DATABASE = '" . $MYSQL_DATABASE . "';\n";\r
1039         $config_data .= "\$MYSQL_PREFIX = '" . $MYSQL_PREFIX . "';\n";\r
1040         $config_data .= "// new in 3.50. first element is db handler, the second is the db driver used by the handler\n";\r
1041         $config_data .= "// default is \$MYSQL_HANDLER = array('mysql','mysql');\n";\r
1042         $config_data .= "//\$MYSQL_HANDLER = array('mysql','mysql');\n";\r
1043         $config_data .= "//\$MYSQL_HANDLER = array('pdo','mysql');\n";\r
1044         $config_data .= "\$MYSQL_HANDLER = array('" . $MYSQL_HANDLER[0] . "','" . $MYSQL_HANDLER[1] . "');\n";\r
1045         $config_data .= "\n";\r
1046         $config_data .= "// main nucleus directory\n";\r
1047         $config_data .= "\$DIR_NUCLEUS = '" . $DIR_NUCLEUS . "';\n";\r
1048         $config_data .= "\n";\r
1049         $config_data .= "// path to media dir\n";\r
1050         $config_data .= "\$DIR_MEDIA = '" . $DIR_MEDIA . "';\n";\r
1051         $config_data .= "\n";\r
1052         $config_data .= "// extra skin files for imported skins\n";\r
1053         $config_data .= "\$DIR_SKINS = '" . $DIR_SKINS . "';\n";\r
1054         $config_data .= "\n";\r
1055         $config_data .= "// these dirs are normally sub dirs of the nucleus dir, but \n";\r
1056         $config_data .= "// you can redefine them if you wish\n";\r
1057         $config_data .= "\$DIR_PLUGINS = \$DIR_NUCLEUS . 'plugins/';\n";\r
1058         $config_data .= "\$DIR_LOCALES = \$DIR_NUCLEUS . 'locales/';\n";\r
1059         $config_data .= "\$DIR_LIBS = \$DIR_NUCLEUS . 'libs/';\n";\r
1060         $config_data .= "\n";\r
1061         $config_data .= "// include libs\n";\r
1062         $config_data .= "include(\$DIR_LIBS.'globalfunctions.php');\n";\r
1063         $config_data .= "?" . ">";\r
1064 \r
1065         $result = false;\r
1066         if ( @!file_exists('../config.php') || is_writable('../config.php') )\r
1067         {\r
1068                 if ( $fp = @fopen('../config.php', 'w') )\r
1069                 {\r
1070                         $result = @fwrite($fp, $config_data, i18n::strlen($config_data));\r
1071                         fclose($fp);\r
1072                 }\r
1073         }\r
1074 \r
1075         if ( $result )\r
1076         {\r
1077                 // try to change the read-only permission.\r
1078                 if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )\r
1079                 {\r
1080                         @chmod('../config.php', 0444);\r
1081                 }\r
1082         }\r
1083         else\r
1084         {\r
1085                 $_SESSION['config_data'] = $config_data;\r
1086         }\r
1087 \r
1088         return $errors;\r
1089 }\r
1090 \r
1091 /**\r
1092  * Confirm that you can write to the configuration file\r
1093  * @return string error message\r
1094  */\r
1095 function canConfigFileWritable()\r
1096 {\r
1097         if ( @file_exists('../config.php') && @!is_writable('../config.php') )\r
1098         {\r
1099                 // try to change the read-write permission.\r
1100                 if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )\r
1101                 {\r
1102                         @chmod('../config.php', 0666);\r
1103                 }\r
1104 \r
1105                 if ( @!is_writable('../config.php') )\r
1106                 {\r
1107                         return _INST_ERROR8;\r
1108                 }\r
1109         }\r
1110         return '';\r
1111 }\r
1112 \r
1113 /**\r
1114  * To obtain the version of MySQL\r
1115  * @return string\r
1116  */\r
1117 function getMySqlVersion()\r
1118 {\r
1119         global $minimum_mysql_version, $errors;\r
1120         // Turn on output buffer\r
1121         // Needed to repress the output of the sql function that are\r
1122         // not part of php (in this case the @ operator doesn't work)\r
1123         ob_start();\r
1124 \r
1125         // note: this piece of code is taken from phpMyAdmin\r
1126         $conn = sql_connect_args('localhost', '', '');\r
1127         $result = @sql_query('SELECT VERSION() AS version', $conn);\r
1128 \r
1129         if ( $result != FALSE && sql_num_rows($result) > 0 )\r
1130         {\r
1131                 $row = sql_fetch_array($result);\r
1132                 $match = preg_split('#\.#', $row['version']);\r
1133         }\r
1134         else\r
1135         {\r
1136                 $result = @sql_query('SHOW VARIABLES LIKE \'version\'', $conn);\r
1137 \r
1138                 if ( $result != FALSE && @sql_num_rows($result) > 0 )\r
1139                 {\r
1140                         $row = sql_fetch_row($result);\r
1141                         $match = preg_split('#\.#', $row[1]);\r
1142                 }\r
1143                 else\r
1144                 {\r
1145                         $output = (function_exists('shell_exec')) ? @shell_exec('mysql -V') : '0.0.0';\r
1146                         preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version);\r
1147                         $match = preg_split('#\.#', $version[0]);\r
1148 \r
1149                         if ( $match[0] == '' )\r
1150                         {\r
1151                                 $match = array('0', '0', '0');\r
1152                         }\r
1153                 }\r
1154         }\r
1155 \r
1156         @sql_disconnect($conn);\r
1157 \r
1158         //End and clean output buffer\r
1159         ob_end_clean();\r
1160 \r
1161         return implode($match, '.');\r
1162 }\r
1163 \r
1164 /**\r
1165  * Add a table prefix if it is used\r
1166  *\r
1167  * @param string $input table name with prefix\r
1168  * @return string\r
1169  */\r
1170 function tableName($input)\r
1171 {\r
1172         global $MYSQL_PREFIX;\r
1173         if ( $MYSQL_PREFIX )\r
1174         {\r
1175                 return $MYSQL_PREFIX . $input;\r
1176         }\r
1177         else\r
1178         {\r
1179                 return $input;\r
1180         }\r
1181 }\r
1182 \r
1183 /**\r
1184  * Install custom plugins\r
1185  */\r
1186 function installCustomPlugs()\r
1187 {\r
1188         global $aConfPlugsToInstall, $DIR_LIBS, $manager;\r
1189 \r
1190         $aErrors = array();\r
1191         if ( count($aConfPlugsToInstall) == 0 )\r
1192         {\r
1193                 return $aErrors;\r
1194         }\r
1195 \r
1196         $res = sql_query('SELECT * FROM ' . tableName('nucleus_plugin'));\r
1197         $numCurrent = sql_num_rows($res);\r
1198 \r
1199         foreach ( $aConfPlugsToInstall as $plugName )\r
1200         {\r
1201                 $query = 'INSERT INTO ' . tableName('nucleus_plugin') . ' (porder, pfile) VALUES (' . (++$numCurrent) . ", '" . sql_real_escape_string($plugName) . "')";\r
1202                 sql_query($query);\r
1203 \r
1204                 $manager->clearCachedInfo('installedPlugins');\r
1205                 $plugin =& $manager->getPlugin($plugName);\r
1206                 $plugin->setID($numCurrent);\r
1207 \r
1208                 if ( !$plugin )\r
1209                 {\r
1210                         sql_query('DELETE FROM ' . tableName('nucleus_plugin') . " WHERE pfile = '" . sql_real_escape_string($plugName) . "'");\r
1211                         $numCurrent--;\r
1212                         array_push($aErrors, sprintf(_INST_ERROR9, $plugName));\r
1213                         continue;\r
1214                 }\r
1215                 $plugin->install();\r
1216         }\r
1217 \r
1218         sql_query('DELETE FROM ' . tableName('nucleus_plugin_event'));\r
1219         $res = sql_query('SELECT pid, pfile FROM ' . tableName('nucleus_plugin'));\r
1220 \r
1221         while ( $o = sql_fetch_object($res) )\r
1222         {\r
1223                 $pid = $o->pid;\r
1224                 $plug =& $manager->getPlugin($o->pfile);\r
1225 \r
1226                 if ( $plug )\r
1227                 {\r
1228                         $eventList = $plug->getEventList();\r
1229                         foreach ( $eventList as $eventName )\r
1230                         {\r
1231                                 sql_query('INSERT INTO ' . tableName('nucleus_plugin_event') . ' (pid, event) VALUES (' . $pid . ", '" . $eventName . "')");\r
1232                         }\r
1233                 }\r
1234         }\r
1235         return $aErrors;\r
1236 }\r
1237 \r
1238 /**\r
1239  * Install custom skins\r
1240  * Prepares the installation of custom skins\r
1241  */\r
1242 function installCustomSkins()\r
1243 {\r
1244         global $aConfSkinsToImport, $DIR_LIBS, $DIR_SKINS;\r
1245 \r
1246         $aErrors = array();\r
1247         if ( count($aConfSkinsToImport) == 0 )\r
1248         {\r
1249                 return $aErrors;\r
1250         }\r
1251 \r
1252         $importer = new SkinImport();\r
1253 \r
1254         foreach ( $aConfSkinsToImport as $skinName )\r
1255         {\r
1256                 $importer->reset();\r
1257                 $skinFile = $DIR_SKINS . $skinName . '/skinbackup.xml';\r
1258 \r
1259                 if ( !@file_exists($skinFile) )\r
1260                 {\r
1261                         array_push($aErrors, sprintf(_INST_ERROR10, $skinFile));\r
1262                         continue;\r
1263                 }\r
1264 \r
1265                 $error = $importer->readFile($skinFile);\r
1266 \r
1267                 if ( $error )\r
1268                 {\r
1269                         array_push($aErrors, sprintf(_INST_ERROR11, $skinName) . ' : ' . $error);\r
1270                         continue;\r
1271                 }\r
1272 \r
1273                 $error = $importer->writeToDatabase(1);\r
1274 \r
1275                 if ( $error )\r
1276                 {\r
1277                         array_push($aErrors, sprintf(_INST_ERROR12, $skinName) . ' : ' . $error);\r
1278                         continue;\r
1279                 }\r
1280         }\r
1281         return $aErrors;\r
1282 }\r
1283 \r
1284 /**\r
1285  * Check if some important files of the Nucleus CMS installation are available\r
1286  * Give an error if one or more files are not accessible\r
1287  */\r
1288 function do_check_files()\r
1289 {\r
1290         $missingfiles = array();\r
1291         $files = array(\r
1292                 './install.sql',\r
1293                 '../index.php',\r
1294                 '../action.php',\r
1295                 '../nucleus/index.php',\r
1296                 '../nucleus/media.php',\r
1297                 '../nucleus/libs/ACTION.php',\r
1298                 '../nucleus/libs/ACTIONLOG.php',\r
1299                 '../nucleus/libs/ACTIONS.php',\r
1300                 '../nucleus/libs/ADMIN.php',\r
1301                 '../nucleus/libs/BaseActions.php',\r
1302                 '../nucleus/libs/BLOG.php',\r
1303                 '../nucleus/libs/BODYACTIONS.php',\r
1304                 '../nucleus/libs/COMMENT.php',\r
1305                 '../nucleus/libs/COMMENTACTIONS.php',\r
1306                 '../nucleus/libs/COMMENTS.php',\r
1307                 '../nucleus/libs/ENCAPSULATE.php',\r
1308                 '../nucleus/libs/ENTITY.php',\r
1309                 '../nucleus/libs/globalfunctions.php',\r
1310                 '../nucleus/libs/i18n.php',\r
1311                 '../nucleus/libs/ITEM.php',\r
1312                 '../nucleus/libs/ITEMACTIONS.php',\r
1313                 '../nucleus/libs/LINK.php',\r
1314                 '../nucleus/libs/MANAGER.php',\r
1315                 '../nucleus/libs/MEDIA.php',\r
1316                 '../nucleus/libs/MEMBER.php',\r
1317                 '../nucleus/libs/mysql.php',\r
1318                 '../nucleus/libs/NOTIFICATION.php',\r
1319                 '../nucleus/libs/PAGEFACTORY.php',\r
1320                 '../nucleus/libs/PARSER.php',\r
1321                 '../nucleus/libs/PLUGIN.php',\r
1322                 '../nucleus/libs/PLUGINADMIN.php',\r
1323                 '../nucleus/libs/SEARCH.php',\r
1324                 '../nucleus/libs/showlist.php',\r
1325                 '../nucleus/libs/SKIN.php',\r
1326                 '../nucleus/libs/TEMPLATE.php',\r
1327                 '../nucleus/libs/vars4.1.0.php',\r
1328                 '../nucleus/libs/xmlrpc.inc.php',\r
1329                 '../nucleus/libs/xmlrpcs.inc.php',\r
1330                 '../nucleus/libs/sql/mysql.php'\r
1331         );\r
1332 \r
1333         $count = count($files);\r
1334         for ( $i = 0; $i < $count; $i++ )\r
1335         {\r
1336                 if ( !is_readable($files[$i]) )\r
1337                 {\r
1338                         array_push($missingfiles, 'File <b>' . $files[$i] . '</b> is missing or not readable.<br />');\r
1339                 }\r
1340         }\r
1341 \r
1342         if ( count($missingfiles) > 0 )\r
1343         {\r
1344                 exit(implode("\n", $missingfiles));\r
1345         }\r
1346 }\r
1347 \r
1348 /**\r
1349  * Updates the configuration in the database\r
1350  *\r
1351  * @param string $name name of the config var\r
1352  * @param string $value new value of the config var\r
1353  * @return array\r
1354  */\r
1355 function updateConfig($name, $value)\r
1356 {\r
1357         $errors = array();\r
1358         $name = sql_real_escape_string($name);\r
1359         $value = trim(sql_real_escape_string($value));\r
1360 \r
1361         $query = "UPDATE %s SET value = '%s' WHERE name = '%s'";\r
1362         $query = sprintf($query, tableName('nucleus_config'), $value, $name);\r
1363 \r
1364         if ( !sql_query($query) )\r
1365         {\r
1366                 $errors[] = _INST_ERROR4 . ': ' . sql_error();\r
1367         }\r
1368         return $errors;\r
1369 }\r
1370 \r
1371 class ParamManager\r
1372 {\r
1373         /* process parameter */\r
1374         public $state;\r
1375         public $locale;\r
1376 \r
1377         /* mysql connection parameters */\r
1378         public $mysql_host;\r
1379         public $mysql_user;\r
1380         public $mysql_password;\r
1381         public $mysql_database;\r
1382         public $mysql_tablePrefix;\r
1383 \r
1384         /* weblog configuration parameters */\r
1385         public $blog_name;\r
1386         public $blog_shortname;\r
1387 \r
1388         /* member configuration parameters */\r
1389         public $user_name;\r
1390         public $user_realname;\r
1391         public $user_password;\r
1392         private $user_password2;\r
1393         public $user_email;\r
1394 \r
1395         /* URI parameters  */\r
1396         private $root_url;\r
1397         public $IndexURL;\r
1398         public $AdminURL;\r
1399         public $MediaURL;\r
1400         public $SkinsURL;\r
1401         public $PluginURL;\r
1402         public $ActionURL;\r
1403 \r
1404         /* path parameters */\r
1405         private $root_path;\r
1406         public $AdminPath;\r
1407         public $MediaPath;\r
1408         public $SkinsPath;\r
1409 \r
1410         /**\r
1411          * constructor\r
1412          */\r
1413         public function __construct()\r
1414         {\r
1415                 $this->init();\r
1416         }\r
1417 \r
1418         public function init()\r
1419         {\r
1420                 // set default values\r
1421                 $this->state = 'locale';\r
1422                 $this->install_mode = 'simple';\r
1423                 $this->locale = 'en_Latn_US';\r
1424                 $this->mysql_host = @ini_get('mysql.default_host');\r
1425                 $this->blog_name = 'My Nucleus CMS';\r
1426                 $this->blog_shortname = 'mynucleuscms';\r
1427 \r
1428                 /* root path */\r
1429                 $directory_separator = preg_quote(DIRECTORY_SEPARATOR, '|');\r
1430                 $this->root_path = implode('/', preg_split("|$directory_separator|", realpath(dirname(__FILE__) . '/..')));\r
1431                 if ( substr($this->root_path, -1, 1) !== '/' )\r
1432                 {\r
1433                         $this->root_path .= '/';\r
1434                 }\r
1435                 $base_path_pcre = preg_quote($this->root_path, '|');\r
1436 \r
1437                 /* current directry name */\r
1438                 $directory_name = preg_replace("#{$base_path_pcre}#", '', implode('/', preg_split("#{$directory_separator}#", realpath(dirname(__FILE__)))));\r
1439                 $directory_name_pcre = preg_quote($directory_name, '|');\r
1440 \r
1441                 /* root uri */\r
1442                 $root_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];\r
1443                 $this->root_url = preg_replace("|$directory_name_pcre(.*)$|", '', $root_url);\r
1444 \r
1445                 $this->AdminPath = $this->root_path . 'nucleus/';\r
1446                 $this->MediaPath = $this->root_path . 'media/';\r
1447                 $this->SkinsPath = $this->root_path . 'skins/';\r
1448 \r
1449                 $this->IndexURL  = $this->root_url;\r
1450                 $this->AdminURL  = $this->root_url . 'nucleus/';\r
1451                 $this->MediaURL  = $this->root_url . 'media/';\r
1452                 $this->SkinsURL  = $this->root_url . 'skins/';\r
1453                 $this->PluginURL = $this->root_url . 'nucleus/plugins/';\r
1454                 $this->ActionURL = $this->root_url . 'action.php';\r
1455         }\r
1456 \r
1457         private function read_parameter($parameter)\r
1458         {\r
1459                 foreach ( $parameter as $element )\r
1460                 {\r
1461                         if ( array_key_exists($element, $_POST) )\r
1462                         {\r
1463                                 $this->$element = $_POST[$element];\r
1464                         }\r
1465                 }\r
1466         }\r
1467 \r
1468         public function set_state($state)\r
1469         {\r
1470                 $states = array('locale', 'mysql', 'weblog', 'detail', 'install');\r
1471                 if ( in_array($state, $states) )\r
1472                 {\r
1473                         $this->state = $state;\r
1474                 }\r
1475         }\r
1476 \r
1477         public function set_locale()\r
1478         {\r
1479                 $this->read_parameter(array('locale'));\r
1480 \r
1481                 if ( !in_array($this->locale, i18n::get_available_locale_list()) )\r
1482                 {\r
1483                         $this->locale = 'en_Latn_US';\r
1484                 }\r
1485         }\r
1486 \r
1487         public function check_mysql_parameters()\r
1488         {\r
1489                 $parameters = array('mysql_host', 'mysql_user', 'mysql_password', 'mysql_database', 'mysql_tablePrefix');\r
1490                 $this->read_parameter($parameters);\r
1491 \r
1492                 $errors = array();\r
1493                 if ( $this->mysql_host == '' )\r
1494                 {\r
1495                         $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD1);\r
1496                 }\r
1497 \r
1498                 if ( $this->mysql_user == '' )\r
1499                 {\r
1500                         $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD2);\r
1501                 }\r
1502                 \r
1503                 if ( $this->mysql_user != ''\r
1504                         && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_user) )\r
1505                 {\r
1506                         $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD2);\r
1507                 }\r
1508                 \r
1509                 if ( $this->mysql_database == '' )\r
1510                 {\r
1511                         $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD4);\r
1512                 }\r
1513 \r
1514                 if ( $this->mysql_database != ''\r
1515                         && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_database) )\r
1516                 {\r
1517                         $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD4);\r
1518                 }\r
1519 \r
1520                 if ( $this->mysql_tablePrefix != ''\r
1521                         && !preg_match('/^[a-z0-9_]+$/i', $this->mysql_tablePrefix) )\r
1522                 {\r
1523                         $errors[] = sprintf(_VALID_ERROR3, _DB_FIELD5);\r
1524                 }\r
1525                 \r
1526                 if ( count($errors) == 0 )\r
1527                 {\r
1528                         $mysql_conn = @sql_connect_args($this->mysql_host, $this->mysql_user, $this->mysql_password);\r
1529                         if ( $mysql_conn == false )\r
1530                         {\r
1531                                 $errors[] = _DBCONNECT_ERROR;\r
1532                         }\r
1533                         else\r
1534                         {\r
1535                                 @sql_close($mysql_conn);\r
1536                         }\r
1537                 }\r
1538 \r
1539                 return $errors;\r
1540         }\r
1541 \r
1542         public function check_user_parameters()\r
1543         {\r
1544                 $parameters = array('user_name', 'user_realname', 'user_password', 'user_password2', 'user_email');\r
1545                 $this->read_parameter($parameters);\r
1546 \r
1547                 $errors = array();\r
1548                 if ( $this->user_realname == '' )\r
1549                 {\r
1550                         $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD1);\r
1551                 }\r
1552 \r
1553                 if ( $this->user_name == '' )\r
1554                 {\r
1555                         $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD2);\r
1556                 }\r
1557                 elseif ( !preg_match("/^[a-z0-9]+([ a-z0-9]*[a-z0-9]+)?$/i", $this->user_name) )\r
1558                 {\r
1559                         $errors[] = _VALID_ERROR5;\r
1560                 }\r
1561 \r
1562                 if ( $this->user_password == '' || $this->user_password2 == '' )\r
1563                 {\r
1564                         $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD3);\r
1565                         $this->user_password = '';\r
1566                 }\r
1567                 elseif ( $this->user_password != $this->user_password2 )\r
1568                 {\r
1569                         $errors[] = _VALID_ERROR6;\r
1570                         $this->user_password = '';\r
1571                 }\r
1572 \r
1573                 if ( !preg_match("/^[a-z0-9\._+\-]+@[a-z0-9\._\-]+\.[a-z]{2,6}$/i", $this->user_email) )\r
1574                 {\r
1575                         $errors[] = _VALID_ERROR7;\r
1576                 }\r
1577 \r
1578                 return $errors;\r
1579         }\r
1580 \r
1581         public function check_weblog_parameters()\r
1582         {\r
1583                 $parameters = array('blog_name', 'blog_shortname');\r
1584                 $this->read_parameter($parameters);\r
1585 \r
1586                 $errors = array();\r
1587                 if ( $this->blog_name == '' )\r
1588                 {\r
1589                         $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD1);\r
1590                 }\r
1591 \r
1592                 if ( $this->blog_shortname == '' )\r
1593                 {\r
1594                         $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD2);\r
1595                 }\r
1596 \r
1597                 if ( !preg_match("/^[a-z0-9]+$/i", $this->blog_shortname) )\r
1598                 {\r
1599                         $errors[] = _VALID_ERROR4;\r
1600                 }\r
1601 \r
1602                 return $errors;\r
1603         }\r
1604 \r
1605         public function check_uri_parameters()\r
1606         {\r
1607                 $parameters = array('IndexURL', 'AdminURL', 'MediaURL', 'SkinsURL', 'PluginURL', 'ActionURL');\r
1608                 $this->read_parameter($parameters);\r
1609 \r
1610                 $errors = array();\r
1611                 if ( substr($this->IndexURL, -1, 1) !== '/' )\r
1612                 {\r
1613                         $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD1);\r
1614                 }\r
1615 \r
1616                 if ( substr($this->AdminURL, -1, 1) !== '/' )\r
1617                 {\r
1618                         $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD2);\r
1619                 }\r
1620 \r
1621                 if ( substr($this->MediaURL, -1, 1) !== '/' )\r
1622                 {\r
1623                         $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD4);\r
1624                 }\r
1625 \r
1626                 if ( substr($this->SkinsURL, -1, 1) !== '/' )\r
1627                 {\r
1628                         $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD6);\r
1629                 }\r
1630 \r
1631                 if ( substr($this->PluginURL, -1, 1) !== '/' )\r
1632                 {\r
1633                         $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD8);\r
1634                 }\r
1635 \r
1636                 if ( strrchr($this->ActionURL, '/') != '/action.php' )\r
1637                 {\r
1638                         $errors[] = sprintf(_VALID_ERROR9, _PATH_FIELD9);\r
1639                 }\r
1640 \r
1641                 return $errors;\r
1642         }\r
1643 \r
1644         public function check_path_parameters()\r
1645         {\r
1646                 $parameters = array('AdminPath', 'MediaPath', 'SkinsPath');\r
1647                 $this->read_parameter($parameters);\r
1648 \r
1649                 $separators = array('/', DIRECTORY_SEPARATOR);\r
1650                 $errors = array();\r
1651                 if ( !in_array(substr($this->AdminPath, -1, 1), $separators) )\r
1652                 {\r
1653                         $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD3);\r
1654                 }\r
1655                 elseif ( !file_exists($this->AdminPath) )\r
1656                 {\r
1657                         $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD3);\r
1658                 }\r
1659 \r
1660                 if ( !in_array(substr($this->MediaPath, -1, 1), $separators) )\r
1661                 {\r
1662                         $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD5);\r
1663                 }\r
1664                 elseif ( !file_exists($this->MediaPath) )\r
1665                 {\r
1666                         $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD5);\r
1667                 }\r
1668 \r
1669                 if ( !in_array(substr($this->SkinsPath, -1, 1), $separators) )\r
1670                 {\r
1671                         $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD7);\r
1672                 }\r
1673                 elseif ( !file_exists($this->SkinsPath) )\r
1674                 {\r
1675                         $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD7);\r
1676                 }\r
1677 \r
1678                 return $errors;\r
1679         }\r
1680 \r
1681         /**\r
1682          * check all parameters\r
1683          * @return bool\r
1684          */\r
1685         public function check_all_parameters()\r
1686         {\r
1687                 $this->set_locale();\r
1688 \r
1689                 $isValid = true;\r
1690                 $isValid &= (count($this->check_mysql_parameters()) == 0);\r
1691                 $isValid &= (count($this->check_user_parameters()) == 0);\r
1692                 $isValid &= (count($this->check_weblog_parameters()) == 0);\r
1693                 $isValid &= (count($this->check_uri_parameters()) == 0);\r
1694                 $isValid &= (count($this->check_path_parameters()) == 0);\r
1695 \r
1696                 return $isValid;\r
1697         }\r
1698 }\r