OSDN Git Service

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