X-Git-Url: http://git.osdn.net/view?p=nucleus-jp%2Fnucleus-next.git;a=blobdiff_plain;f=install%2Findex.php;h=13fd7be1657d0444cb2171691e3f2dd85eebd918;hp=17fb9a388714f276b19b8a810e3d5a9425248f79;hb=refs%2Fheads%2Fmaster;hpb=fe4e862f6b23596d657c5228588785dfe537fb8f
diff --git a/install/index.php b/install/index.php
index 17fb9a3..13fd7be 100644
--- a/install/index.php
+++ b/install/index.php
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
Nucleus requires at least PHP version ' . $minimum_php_version . '');
+}
+
+// make sure there's no unnecessary escaping: # set_magic_quotes_runtime(0);
+if ( version_compare(PHP_VERSION, '5.3.0', '<') )
+{
+ ini_set('magic_quotes_runtime', '0');
+}
+
+/* default installed plugins and skins */
+$aConfPlugsToInstall = array('NP_SecurityEnforcer', 'NP_SkinFiles', 'NP_Medium');
+$aConfSkinsToImport = array('atom', 'rss2.0', 'rsd', 'default', 'admin/default', 'admin/bookmarklet');
+
+// Check if some important files
+do_check_files();
+
+/* i18n class is needed for internationalization */
+include_once('../nucleus/libs/i18n.php');
+if ( !i18n::init('UTF-8', '../nucleus/locales') )
+{
+ exit('
Failed to initialize iconv or mbstring extension. Would you please contact the administrator of your PHP server?
');
+}
+
+// include core classes that are needed for login & plugin handling
+
+// added for 3.5 sql_* wrapper
+global $MYSQL_HANDLER;
+
+if ( !isset($MYSQL_HANDLER) )
+{
+ $MYSQL_HANDLER = array('mysql', '');
+
+ // check if mysql support is installed; this check may not make sense, as is, in a version past 3.5x
+ if ( !function_exists('mysql_query') && !function_exists('mysqli_query') )
+ {
+ exit(' Your PHP version does not have support for MySQL :(
');
+}
+}
+include_once('../nucleus/libs/sql/sql.php');
+
+session_start();
+if ( count($_GET) == 0 && count($_POST) == 0 )
+{
+ unset($_SESSION['param_manager']);
+}
+
+// restore the $param from the session
+if ( array_key_exists('param_manager', $_SESSION) )
+{
+ $param = $_SESSION['param_manager'];
+}
+else
+{
+ $param = new ParamManager();
+}
+
+// include translation file
+$param->set_locale();
+
+do_action();
+
+// $param is saved to the session
+if ( isset($param) )
+{
+ $_SESSION['param_manager'] = $param;
+}
+else
+{
+ unset($_SESSION['param_manager']);
+}
+exit;
+
+/**
+ * installer action
+ */
+function do_action()
+{
+ global $param;
+
+ if ( array_key_exists('action', $_POST) )
+ {
+ $isPostback = true;
+ }
+ else
+ {
+ $isPostback = false;
+ }
+
+ // mode change
+ if ( array_key_exists('mode', $_REQUEST) )
+ {
+ if ( $_REQUEST['mode'] == 'detail' )
+ {
+ $param->set_state('detail');
+ }
+ elseif ( $_REQUEST['mode'] == 'simple' )
+ {
+ $param->set_state('mysql');
+ }
+ }
+
+ // input parameter check
+ if ( $isPostback )
+ {
+ switch ( $param->state )
+ {
+ case 'locale':
+ $param->set_state('mysql');
+ $isPostback = false;
+ break;
+ case 'mysql':
+ if ( count($param->check_mysql_parameters()) == 0 )
+ {
+ $param->set_state('weblog');
+ $isPostback = false;
+ }
+ break;
+ case 'weblog':
+ if ( count($param->check_user_parameters()) == 0
+ && count($param->check_weblog_parameters()) == 0 )
+ {
+ $param->set_state('install');
+ $isPostback = false;
+ }
+ break;
+ case 'detail':
+ if ( $param->check_all_parameters() )
+ {
+ $param->set_state('install');
+ $isPostback = false;
+ }
+ break;
+ }
+ }
+
+ // page render
+ show_header();
+ switch ( $param->state )
+ {
+ case 'locale':
+ show_select_locale_form();
+ break;
+ case 'mysql':
+ show_database_setting_form($isPostback);
+ break;
+ case 'weblog':
+ show_blog_setting_form($isPostback);
+ break;
+ case 'detail':
+ show_detail_setting_form($isPostback);
+ break;
+ case 'install':
+ show_install_complete_form();
+ break;
+ }
+ show_footer();
+}
+
+/**
+ * header tag of the installation screens
+ **/
+function show_header()
+{
+ global $param;
+
+ /* HTTP 1.1 application for no caching */
+ header("Cache-Control: no-cache, must-revalidate");
+ header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
+ header('Content-Type: text/html; charset=' . i18n::get_current_charset());
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+', $config_writable, '';
+ }
+ if ( $mysql_version == '0.0.0' )
+ {
+ echo '', _DBVERSION_UNKOWN, ' ';
+ }
+ elseif ( version_compare($mysql_version, $minimum_mysql_version, '<') )
+ {
+ echo '', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), ' ';
+ }
+?>
+
+
+
+
+
+
+
+
+
+check_all_parameters() )
+ {
+ echo '', _VALID_ERROR, " \n";
+ }
+?>
+
+
+ PHP:
+ MySQL:
+', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), '';
+ }
+?>
+
+
+
+
+
+
+ 0 )
+ {
+ echo _INST_ERROR;
+ foreach ( $errors as $error )
+ {
+ echo '', $error, " \n";
+ }
+ }
+ else
+ {
+ echo _INST_TEXT;
+ if ( array_key_exists('config_data', $_SESSION) )
+ {
+ echo '', _INST_TEXT4, ' ';
+?>
+
+', _INST_TEXT5, '';
+ }
+?>
+
+
+
+
+mysql_host;
+ $MYSQL_USER = $param->mysql_user;
+ $MYSQL_PASSWORD = $param->mysql_password;
+ $MYSQL_DATABASE = $param->mysql_database;
+ $MYSQL_PREFIX = $param->mysql_tablePrefix;
+
+ $DIR_NUCLEUS = $param->AdminPath;
+ $DIR_MEDIA = $param->MediaPath;
+ $DIR_SKINS = $param->SkinsPath;
+ $DIR_PLUGINS = $DIR_NUCLEUS . 'plugins/';
+ $DIR_LOCALES = $DIR_NUCLEUS . 'locales/';
+ $DIR_LIBS = $DIR_NUCLEUS . 'libs/';
+
+ /*
+ * 2.open mySQL connection
+ */
+ $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD);
+ if ( $MYSQL_CONN == FALSE )
+ {
+ $errors[] = _DBCONNECT_ERROR;
+ return $errors;
+ }
+
+ /*
+ * 3. try to create database if needed
+ */
+ if ( DB::execute("CREATE DATABASE IF NOT EXISTS {$MYSQL_DATABASE}") === FALSE )
+ {
+ $errinfo = DB::getError();
+ $errors[] = _INST_ERROR1 . ': ' . $errinfo[2];
+ }
+
+ /*
+ * 4. try to select database
+ */
+ $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE);
+ if ( !$MYSQL_CONN )
+ {
+ $errors[] = _INST_ERROR2;
+ }
+
+ if ( count($errors) > 0 )
+ {
+ return $errors;
+ }
+
+ /*
+ * 5. execute queries
+ */
+ $table_names = array(
+ 'nucleus_actionlog',
+ 'nucleus_ban',
+ 'nucleus_blog',
+ 'nucleus_category',
+ 'nucleus_comment',
+ 'nucleus_config',
+ 'nucleus_item',
+ 'nucleus_karma',
+ 'nucleus_member',
+ 'nucleus_plugin',
+ 'nucleus_skin',
+ 'nucleus_template',
+ 'nucleus_team',
+ 'nucleus_activation',
+ 'nucleus_tickets'
+ );
+
+ $prefixed_table_names = array();
+ foreach ( $table_names as $table_name )
+ {
+ $prefixed_table_names[] = $MYSQL_PREFIX . $table_name;
+ }
+
+ // table exists check
+ $result = DB::getResult('SHOW TABLES');
+ foreach ( $result as $row )
+ {
+ if ( in_array($row[0], $prefixed_table_names) )
+ {
+ $errors[] = _INST_ERROR3;
+ break;
+ }
+ }
+ if ( count($errors) > 0 )
+ {
+ return $errors;
+ }
+
+ $filename = 'install.sql';
+ $fd = fopen($filename, 'r');
+ $queries = fread($fd, filesize($filename));
+ fclose($fd);
+
+ $queries = preg_split('#(;\n|;\r)#', $queries);
+
+ foreach ( $queries as $query )
+ {
+ if ( preg_match('/\w+/', $query) )
+ {
+ if ( $MYSQL_PREFIX )
+ {
+ $query = str_replace($table_names, $prefixed_table_names, $query);
+ }
+
+ if ( DB::execute($query) === FALSE )
+ {
+ $errinfo = DB::getError();
+ $errors[] = _INST_ERROR4 . ' (' . $query . ' ): ' . $errinfo[2];
+ }
+ }
+ }
+
+ /*
+ * 6. put needed records
+ */
+ /* push first post */
+ $query = "INSERT INTO %s VALUES (1, %s, %s, %s, 1, 1, %s, 0, 0, 0, 1, 0, 1)";
+ $query = sprintf($query,
+ tableName('nucleus_item'),
+ DB::quoteValue(_1ST_POST_TITLE),
+ DB::quoteValue(_1ST_POST),
+ DB::quoteValue(_1ST_POST2),
+ DB::formatDateTime()
+ );
+ if ( DB::execute($query) === FALSE )
+ {
+ $errinfo = DB::getError();
+ $errors[] = _INST_ERROR4 . ' (' . $query . ' ): ' . $errinfo[2];
+ }
+
+ /* push configurations */
+ array_merge($errors, updateConfig('IndexURL', $param->IndexURL));
+ array_merge($errors, updateConfig('AdminURL', $param->AdminURL));
+ array_merge($errors, updateConfig('MediaURL', $param->MediaURL));
+ array_merge($errors, updateConfig('SkinsURL', $param->SkinsURL));
+ array_merge($errors, updateConfig('PluginURL', $param->PluginURL));
+ array_merge($errors, updateConfig('ActionURL', $param->ActionURL));
+ array_merge($errors, updateConfig('AdminEmail', $param->user_email));
+ array_merge($errors, updateConfig('SiteName', $param->blog_name));
+ array_merge($errors, updateConfig('Locale', i18n::get_current_locale()));
+
+ /* push super admin */
+ $query = "UPDATE %s SET mname = %s, mrealname = %s, mpassword = %s, memail = %s, murl = %s, madmin = 1, mcanlogin = 1 WHERE mnumber = 1";
+ $query = sprintf($query,
+ tableName('nucleus_member'),
+ DB::quoteValue($param->user_name),
+ DB::quoteValue($param->user_realname),
+ DB::quoteValue(md5($param->user_password)),
+ DB::quoteValue($param->user_email),
+ DB::quoteValue($param->IndexURL)
+ );
+ if ( DB::execute($query) === FALSE )
+ {
+ $errinfo = DB::getError();
+ $errors[] = _INST_ERROR5 . ': ' . $errinfo[2];
+ }
+
+ /* push new weblog */
+ $query = "UPDATE %s SET bname = %s, bshortname = %s, burl = %s WHERE bnumber = 1";
+ $query = sprintf($query,
+ tableName('nucleus_blog'),
+ DB::quoteValue($param->blog_name),
+ DB::quoteValue($param->blog_shortname),
+ DB::quoteValue($param->IndexURL)
+ );
+ if ( DB::execute($query) === FALSE )
+ {
+ $errinfo = DB::getError();
+ $errors[] = _INST_ERROR6 . ': ' . $errinfo[2];
+ }
+
+ /* push default category */
+ $query = "UPDATE %s SET cname = %s, cdesc = %s WHERE catid = 1";
+ $query = sprintf($query,
+ tableName('nucleus_category'),
+ DB::quoteValue(_GENERALCAT_NAME),
+ DB::quoteValue(_GENERALCAT_DESC)
+ );
+ if ( DB::execute($query) === FALSE )
+ {
+ $errinfo = DB::getError();
+ $errors[] = _INST_ERROR6 . ': ' . $errinfo[2];
+ }
+
+ /*
+ * 7. install default plugins and skins
+ */
+ global $aConfPlugsToInstall, $aConfSkinsToImport;
+ $aSkinErrors = array();
+ $aPlugErrors = array();
+
+ if ( (count($aConfPlugsToInstall) > 0) || (count($aConfSkinsToImport) > 0) )
+ {
+ include_once($DIR_LIBS . 'globalfunctions.php');
+ global $manager;
+ if ( !isset($manager) )
+ {
+ $manager = new Manager();
+ }
+
+ include_once($DIR_LIBS . 'skinie.php');
+
+ $aSkinErrors = installCustomSkins();
+ if ( count($aSkinErrors) > 0 )
+ {
+ array_merge($errors, $aSkinErrors);
+ }
+
+ $query = "SELECT sdnumber FROM %s WHERE sdname='admin/default'";
+ $query = sprintf($query, tableName('nucleus_skin_desc'));
+ $res = intval(DB::getValue($query));
+ array_merge($errors, updateConfig('AdminSkin', $res));
+
+ $query = "SELECT sdnumber FROM %s WHERE sdname='admin/bookmarklet'";
+ $query = sprintf($query, tableName('nucleus_skin_desc'));
+ $res = intval(DB::getValue($query));
+ array_merge($errors, updateConfig('BookmarkletSkin', $res));
+
+ $query = "SELECT sdnumber FROM %s WHERE sdname='default'";
+ $query = sprintf($query, tableName('nucleus_skin_desc'));
+ $defSkinID = intval(DB::getValue($query));
+
+ $query = "UPDATE %s SET bdefskin=%d WHERE bnumber=1";
+ $query = sprintf($query, tableName('nucleus_blog'), $defSkinID);
+ DB::execute($query);
+ $query = "UPDATE %s SET value=%d WHERE name='BaseSkin'";
+ $query = sprintf($query, tableName('nucleus_config'), $defSkinID);
+ DB::execute($query);
+
+ $aPlugErrors = installCustomPlugs();
+ if ( count($aPlugErrors) > 0 )
+ {
+ array_merge($errors, $aPlugErrors);
+ }
+ }
+
+ /*
+ * 8. Write config file ourselves (if possible)
+ */
+ $config_data = '<' . '?php' . "\n";
+ $config_data .= "// mySQL connection information\n";
+ $config_data .= "\$MYSQL_HOST = '" . $MYSQL_HOST . "';\n";
+ $config_data .= "\$MYSQL_USER = '" . $MYSQL_USER . "';\n";
+ $config_data .= "\$MYSQL_PASSWORD = '" . $MYSQL_PASSWORD . "';\n";
+ $config_data .= "\$MYSQL_DATABASE = '" . $MYSQL_DATABASE . "';\n";
+ $config_data .= "\$MYSQL_PREFIX = '" . $MYSQL_PREFIX . "';\n";
+ $config_data .= "// new in 3.50. first element is db handler, the second is the db driver used by the handler\n";
+ $config_data .= "// default is \$MYSQL_HANDLER = array('mysql','mysql');\n";
+ $config_data .= "//\$MYSQL_HANDLER = array('mysql','mysql');\n";
+ $config_data .= "//\$MYSQL_HANDLER = array('pdo','mysql');\n";
+ $config_data .= "\$MYSQL_HANDLER = array('" . $MYSQL_HANDLER[0] . "','" . $MYSQL_HANDLER[1] . "');\n";
+ $config_data .= "\n";
+ $config_data .= "// main nucleus directory\n";
+ $config_data .= "\$DIR_NUCLEUS = '" . $DIR_NUCLEUS . "';\n";
+ $config_data .= "\n";
+ $config_data .= "// path to media dir\n";
+ $config_data .= "\$DIR_MEDIA = '" . $DIR_MEDIA . "';\n";
+ $config_data .= "\n";
+ $config_data .= "// extra skin files for imported skins\n";
+ $config_data .= "\$DIR_SKINS = '" . $DIR_SKINS . "';\n";
+ $config_data .= "\n";
+ $config_data .= "// these dirs are normally sub dirs of the nucleus dir, but \n";
+ $config_data .= "// you can redefine them if you wish\n";
+ $config_data .= "\$DIR_PLUGINS = \$DIR_NUCLEUS . 'plugins/';\n";
+ $config_data .= "\$DIR_LOCALES = \$DIR_NUCLEUS . 'locales/';\n";
+ $config_data .= "\$DIR_LIBS = \$DIR_NUCLEUS . 'libs/';\n";
+ $config_data .= "\n";
+ $config_data .= "// include libs\n";
+ $config_data .= "include(\$DIR_LIBS.'globalfunctions.php');\n";
+ $config_data .= "?" . ">";
+
+ $result = false;
+ if ( @!file_exists('../config.php') || is_writable('../config.php') )
+ {
+ if ( $fp = @fopen('../config.php', 'w') )
+ {
+ $result = @fwrite($fp, $config_data, i18n::strlen($config_data));
+ fclose($fp);
+ }
+ }
+
+ if ( $result )
+ {
+ // try to change the read-only permission.
+ if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )
+ {
+ @chmod('../config.php', 0444);
+ }
+ }
+ else
+ {
+ $_SESSION['config_data'] = $config_data;
+ }
+
+ return $errors;
+}
+
+/**
+ * Confirm that you can write to the configuration file
+ * @return string error message
+ */
+function canConfigFileWritable()
+{
+ if ( @file_exists('../config.php') && @!is_writable('../config.php') )
+ {
+ // try to change the read-write permission.
+ if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )
+ {
+ @chmod('../config.php', 0666);
+ }
+
+ if ( @!is_writable('../config.php') )
+ {
+ return _INST_ERROR8;
+ }
+ }
+ return '';
+}
+
+/**
+ * To obtain the version of MySQL
+ * @return string
+ */
+function getMySqlVersion()
+{
+ global $MYSQL_HANDLER, $minimum_mysql_version, $errors;
+ // Turn on output buffer
+ // Needed to repress the output of the sql function that are
+ // not part of php (in this case the @ operator doesn't work)
+ ob_start();
+
+ // note: this piece of code is taken from phpMyAdmin
+ $conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], 'localhost', '', '');
+
+ if ( $conn )
+ {
+ $row = DB::getAttribute(PDO::ATTR_SERVER_VERSION);
+ $match = preg_split('#\.#', $row);
+ }
+ else
+ {
+ $row = @DB::getRow('SHOW VARIABLES LIKE \'version\'');
+
+ if ( $row )
+ {
+ $match = preg_split('#\.#', $row[1]);
+ }
+ else
+ {
+ $output = (function_exists('shell_exec')) ? @shell_exec('mysql -V') : '0.0.0';
+ preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version);
+ $match = preg_split('#\.#', $version[0]);
+
+ if ( $match[0] == '' )
+ {
+ $match = array('0', '0', '0');
+ }
+ }
+ }
+
+ @DB::disConnect();
+
+ //End and clean output buffer
+ ob_end_clean();
+
+ return implode($match, '.');
+}
+
+/**
+ * Add a table prefix if it is used
+ *
+ * @param string $input table name with prefix
+ * @return string
+ */
+function tableName($input)
+{
+ global $MYSQL_PREFIX;
+ if ( $MYSQL_PREFIX )
+ {
+ return $MYSQL_PREFIX . $input;
+ }
+ else
+ {
+ return $input;
+ }
+}
+
+/**
+ * Install custom plugins
+ */
+function installCustomPlugs()
+{
+ global $aConfPlugsToInstall, $DIR_LIBS, $manager;
+
+ $aErrors = array();
+ if ( count($aConfPlugsToInstall) == 0 )
+ {
+ return $aErrors;
+ }
+
+ $query = sprintf('SELECT * FROM %s', tableName('nucleus_plugin'));
+ $res = DB::getResult($query);
+ $numCurrent = $res->rowCount();
+
+ foreach ( $aConfPlugsToInstall as $plugName )
+ {
+ $query = sprintf('INSERT INTO %s (porder, pfile) VALUES (%d, %s)',
+ tableName('nucleus_plugin'),
+ (++$numCurrent),
+ DB::quoteValue($plugName));
+ DB::execute($query);
+
+ $manager->clearCachedInfo('installedPlugins');
+ $plugin =& $manager->getPlugin($plugName);
+ $plugin->setID($numCurrent);
+
+ if ( !$plugin )
+ {
+ $query = sprintf('DELETE FROM %s WHERE pfile = %s',
+ tableName('nucleus_plugin'),
+ DB::quoteValue($plugName));
+ DB::execute($query);
+ $numCurrent--;
+ array_push($aErrors, sprintf(_INST_ERROR9, $plugName));
+ continue;
+ }
+ $plugin->install();
+ }
+
+ $query = sprintf('DELETE FROM %s', tableName('nucleus_plugin_event'));
+ DB::execute($query);
+ $query = sprintf('SELECT pid, pfile FROM %s', tableName('nucleus_plugin'));
+ $res = DB::getResult($query);
+
+ foreach ( $res as $row )
+ {
+ $plug =& $manager->getPlugin($row['pfile']);
+
+ if ( $plug )
+ {
+ $eventList = $plug->getEventList();
+ foreach ( $eventList as $eventName )
+ {
+ $query = sprintf('INSERT INTO %s (pid, event) VALUES (%d, %s)',
+ tableName('nucleus_plugin_event'),
+ intval($row['pid']),
+ DB::quoteValue($eventName));
+ DB::execute($query);
+ }
+ }
+ }
+ return $aErrors;
+}
+
+/**
+ * Install custom skins
+ * Prepares the installation of custom skins
+ */
+function installCustomSkins()
+{
+ global $aConfSkinsToImport, $DIR_LIBS, $DIR_SKINS;
+
+ $aErrors = array();
+ if ( count($aConfSkinsToImport) == 0 )
+ {
+ return $aErrors;
+ }
+
+ $importer = new SkinImport();
+
+ foreach ( $aConfSkinsToImport as $skinName )
+ {
+ $importer->reset();
+ $skinFile = $DIR_SKINS . $skinName . '/skinbackup.xml';
+
+ if ( !@file_exists($skinFile) )
+ {
+ array_push($aErrors, sprintf(_INST_ERROR10, $skinFile));
+ continue;
+ }
+
+ $error = $importer->readFile($skinFile);
+
+ if ( $error )
+ {
+ array_push($aErrors, sprintf(_INST_ERROR11, $skinName) . ' : ' . $error);
+ continue;
+ }
+
+ $error = $importer->writeToDatabase(1);
+
+ if ( $error )
+ {
+ array_push($aErrors, sprintf(_INST_ERROR12, $skinName) . ' : ' . $error);
+ continue;
+ }
+ }
+ return $aErrors;
+}
+
+/**
+ * Check if some important files of the Nucleus CMS installation are available
+ * Give an error if one or more files are not accessible
+ */
+function do_check_files()
+{
+ $missingfiles = array();
+ $files = array(
+ './install.sql',
+ '../index.php',
+ '../action.php',
+ '../nucleus/index.php',
+ '../nucleus/libs/ACTION.php',
+ '../nucleus/libs/ACTIONLOG.php',
+ '../nucleus/libs/ACTIONS.php',
+ '../nucleus/libs/ADMIN.php',
+ '../nucleus/libs/BaseActions.php',
+ '../nucleus/libs/BLOG.php',
+ '../nucleus/libs/BODYACTIONS.php',
+ '../nucleus/libs/COMMENT.php',
+ '../nucleus/libs/COMMENTACTIONS.php',
+ '../nucleus/libs/COMMENTS.php',
+ '../nucleus/libs/ENTITY.php',
+ '../nucleus/libs/globalfunctions.php',
+ '../nucleus/libs/i18n.php',
+ '../nucleus/libs/ITEM.php',
+ '../nucleus/libs/ITEMACTIONS.php',
+ '../nucleus/libs/LINK.php',
+ '../nucleus/libs/MANAGER.php',
+ '../nucleus/libs/MEDIA.php',
+ '../nucleus/libs/MEMBER.php',
+ '../nucleus/libs/NOTIFICATION.php',
+ '../nucleus/libs/PARSER.php',
+ '../nucleus/libs/PLUGIN.php',
+ '../nucleus/libs/PLUGINADMIN.php',
+ '../nucleus/libs/SEARCH.php',
+ '../nucleus/libs/showlist.php',
+ '../nucleus/libs/SKIN.php',
+ '../nucleus/libs/TEMPLATE.php',
+ '../nucleus/libs/vars4.1.0.php',
+ '../nucleus/libs/xmlrpc.inc.php',
+ '../nucleus/libs/xmlrpcs.inc.php',
+ '../nucleus/libs/sql/DB.php',
+ '../nucleus/libs/sql/MYSQLPDO.php'
+ );
+
+ $count = count($files);
+ for ( $i = 0; $i < $count; $i++ )
+ {
+ if ( !is_readable($files[$i]) )
+ {
+ array_push($missingfiles, 'File ' . $files[$i] . ' is missing or not readable. ');
+ }
+ }
+
+ if ( count($missingfiles) > 0 )
+ {
+ exit(implode("\n", $missingfiles));
+ }
+}
+
+/**
+ * Updates the configuration in the database
+ *
+ * @param string $name name of the config var
+ * @param string $value new value of the config var
+ * @return array
+ */
+function updateConfig($name, $value)
+{
+ $errors = array();
+
+ $query = "UPDATE %s SET value = %s WHERE name = %s";
+ $query = sprintf($query, tableName('nucleus_config'), DB::quoteValue(trim($value)), DB::quoteValue($name));
+
+ if ( DB::execute($query) === FALSE )
+ {
+ $errinfo = DB::getError();
+ $errors[] = _INST_ERROR4 . ': ' . $errinfo[2];
+ }
+ return $errors;
+}
+
+class ParamManager
+{
+ /* process parameter */
+ public $state;
+ public $locale;
+
+ /* mysql connection parameters */
+ public $mysql_host;
+ public $mysql_user;
+ public $mysql_password;
+ public $mysql_database;
+ public $mysql_tablePrefix;
+
+ /* weblog configuration parameters */
+ public $blog_name;
+ public $blog_shortname;
+
+ /* member configuration parameters */
+ public $user_name;
+ public $user_realname;
+ public $user_password;
+ private $user_password2;
+ public $user_email;
+
+ /* URI parameters */
+ private $root_url;
+ public $IndexURL;
+ public $AdminURL;
+ public $MediaURL;
+ public $SkinsURL;
+ public $PluginURL;
+ public $ActionURL;
+
+ /* path parameters */
+ private $root_path;
+ public $AdminPath;
+ public $MediaPath;
+ public $SkinsPath;
+
+ /**
+ * constructor
+ */
+ public function __construct()
+ {
+ $this->init();
+ }
+
+ public function init()
+ {
+ // set default values
+ $this->state = 'locale';
+ $this->install_mode = 'simple';
+ $this->locale = '';
+ $this->mysql_host = @ini_get('mysql.default_host');
+ $this->blog_name = 'My Nucleus CMS';
+ $this->blog_shortname = 'mynucleuscms';
+
+ /* root path */
+ $directory_separator = preg_quote(DIRECTORY_SEPARATOR, '|');
+ $this->root_path = implode('/', preg_split("|$directory_separator|", realpath(dirname(__FILE__) . '/..')));
+ if ( substr($this->root_path, -1, 1) !== '/' )
+ {
+ $this->root_path .= '/';
+ }
+ $base_path_pcre = preg_quote($this->root_path, '|');
+
+ /* current directry name */
+ $directory_name = preg_replace("#{$base_path_pcre}#", '', implode('/', preg_split("#{$directory_separator}#", realpath(dirname(__FILE__)))));
+ $directory_name_pcre = preg_quote($directory_name, '|');
+
+ /* root uri */
+ $root_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
+ $this->root_url = preg_replace("|$directory_name_pcre(.*)$|", '', $root_url);
+
+ $this->AdminPath = $this->root_path . 'nucleus/';
+ $this->MediaPath = $this->root_path . 'media/';
+ $this->SkinsPath = $this->root_path . 'skins/';
+
+ $this->IndexURL = $this->root_url;
+ $this->AdminURL = $this->root_url . 'nucleus/';
+ $this->MediaURL = $this->root_url . 'media/';
+ $this->SkinsURL = $this->root_url . 'skins/';
+ $this->PluginURL = $this->root_url . 'nucleus/plugins/';
+ $this->ActionURL = $this->root_url . 'action.php';
+ }
+
+ private function read_parameter($parameter)
+ {
+ foreach ( $parameter as $element )
+ {
+ if ( array_key_exists($element, $_POST) )
+ {
+ $this->$element = $_POST[$element];
+ }
+ }
+ }
+
+ public function set_state($state)
+ {
+ $states = array('locale', 'mysql', 'weblog', 'detail', 'install');
+ if ( in_array($state, $states) )
+ {
+ $this->state = $state;
+ }
+ }
+
+ public function set_locale()
+ {
+ $this->read_parameter(array('locale'));
+
+ if ( !$this->locale )
+ {
+ /**
+ * default locale select simple implementation
+ *
+ * NOTE:
+ * RFC2616: Hypertext Transfer Protocol -- HTTP/1.1
+ * http://www.ietf.org/rfc/rfc2616.txt
+ *
+ * 14.4 Accept-Language
+ *
+ * The Accept-Language request-header field is similar to Accept, but
+ * restricts the set of natural languages that are preferred as a
+ * response to the request. Language tags are defined in section 3.10.
+ *
+ * Accept-Language = "Accept-Language" ":"
+ * 1#( language-range [ ";" "q" "=" qvalue ] )
+ * language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
+ *
+ * Each language-range MAY be given an associated quality value which
+ * represents an estimate of the user's preference for the languages
+ * specified by that range. The quality value defaults to "q=1". For
+ * example,
+ *
+ * Accept-Language: da, en-gb;q=0.8, en;q=0.7
+ *
+ * would mean: "I prefer Danish, but will accept British English and
+ * other types of English." A language-range matches a language-tag if
+ * it exactly equals the tag, or if it exactly equals a prefix of the
+ * tag such that the first tag character following the prefix is "-".
+ * The special range "*", if present in the Accept-Language field,
+ * matches every tag not matched by any other range present in the
+ * Accept-Language field.
+ *
+ * TODO: this is appropriate implement or not
+ */
+ $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+
+ /* retrieve language token of language tag from first token */
+ $language = '';
+ if ( is_array($languages) && count($languages) > 0 )
+ {
+ $language = preg_replace('#^([\w]+).*$#', '$1', $languages[0]);
+ }
+
+ $locales = i18n::get_available_locale_list();
+ foreach ( $locales as $locale )
+ {
+ if ( i18n::strpos($locale, $language) === 0 )
+ {
+ $this->locale = $locale;
+ break;
+ }
+ }
+ }
+
+ /* include installer translation messages */
+ $translation_file = "./locales/{$this->locale}." . i18n::get_current_charset() . '.php';
+ if ( !file_exists($translation_file) )
+ {
+ $translation_file = './locales/en_Latn_US.UTF-8.php';
+ }
+ include($translation_file);
+
+ /* include global translation messages */
+ $translation_file = "../nucleus/locales/{$this->locale}." . i18n::get_current_charset() . '.php';
+ if ( !file_exists($translation_file) )
+ {
+ $translation_file = './locales/en_Latn_US.UTF-8.php';
+ }
+ include($translation_file);
+
+ i18n::set_current_locale($this->locale);
+
+ return;
+ }
+
+ public function check_mysql_parameters()
+ {
+ global $MYSQL_HANDLER;
+
+ $parameters = array('mysql_host', 'mysql_user', 'mysql_password', 'mysql_database', 'mysql_tablePrefix');
+ $this->read_parameter($parameters);
+
+ $errors = array();
+ if ( $this->mysql_host == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD1);
+ }
+
+ if ( $this->mysql_user == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD2);
+ }
+
+ if ( $this->mysql_user != ''
+ && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_user) )
+ {
+ $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD2);
+ }
+
+ if ( $this->mysql_database == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD4);
+ }
+
+ if ( $this->mysql_database != ''
+ && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_database) )
+ {
+ $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD4);
+ }
+
+ if ( $this->mysql_tablePrefix != ''
+ && !preg_match('/^[a-z0-9_]+$/i', $this->mysql_tablePrefix) )
+ {
+ $errors[] = sprintf(_VALID_ERROR3, _DB_FIELD5);
+ }
+
+ if ( count($errors) == 0 )
+ {
+ $mysql_conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], $this->mysql_host, $this->mysql_user, $this->mysql_password);
+ if ( $mysql_conn == false )
+ {
+ $errors[] = _DBCONNECT_ERROR;
+ }
+ else
+ {
+ @DB::disConnect();
+ }
+ }
+
+ return $errors;
+ }
+
+ public function check_user_parameters()
+ {
+ $parameters = array('user_name', 'user_realname', 'user_password', 'user_password2', 'user_email');
+ $this->read_parameter($parameters);
+
+ $errors = array();
+ if ( $this->user_realname == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD1);
+ }
+
+ if ( $this->user_name == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD2);
+ }
+ elseif ( !preg_match("/^[a-z0-9]+([ a-z0-9]*[a-z0-9]+)?$/i", $this->user_name) )
+ {
+ $errors[] = _VALID_ERROR5;
+ }
+
+ if ( $this->user_password == '' || $this->user_password2 == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD3);
+ $this->user_password = '';
+ }
+ elseif ( $this->user_password != $this->user_password2 )
+ {
+ $errors[] = _VALID_ERROR6;
+ $this->user_password = '';
+ }
+
+ if ( !preg_match("/^[a-z0-9\._+\-]+@[a-z0-9\._\-]+\.[a-z]{2,6}$/i", $this->user_email) )
+ {
+ $errors[] = _VALID_ERROR7;
+ }
+
+ return $errors;
+ }
+
+ public function check_weblog_parameters()
+ {
+ $parameters = array('blog_name', 'blog_shortname');
+ $this->read_parameter($parameters);
+
+ $errors = array();
+ if ( $this->blog_name == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD1);
+ }
+
+ if ( $this->blog_shortname == '' )
+ {
+ $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD2);
+ }
+
+ if ( !preg_match("/^[a-z0-9]+$/i", $this->blog_shortname) )
+ {
+ $errors[] = _VALID_ERROR4;
+ }
+
+ return $errors;
+ }
+
+ public function check_uri_parameters()
+ {
+ $parameters = array('IndexURL', 'AdminURL', 'MediaURL', 'SkinsURL', 'PluginURL', 'ActionURL');
+ $this->read_parameter($parameters);
+
+ $errors = array();
+ if ( substr($this->IndexURL, -1, 1) !== '/' )
+ {
+ $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD1);
+ }
+
+ if ( substr($this->AdminURL, -1, 1) !== '/' )
+ {
+ $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD2);
+ }
+
+ if ( substr($this->MediaURL, -1, 1) !== '/' )
+ {
+ $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD4);
+ }
+
+ if ( substr($this->SkinsURL, -1, 1) !== '/' )
+ {
+ $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD6);
+ }
+
+ if ( substr($this->PluginURL, -1, 1) !== '/' )
+ {
+ $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD8);
+ }
+
+ if ( strrchr($this->ActionURL, '/') != '/action.php' )
+ {
+ $errors[] = sprintf(_VALID_ERROR9, _PATH_FIELD9);
+ }
+
+ return $errors;
+ }
+
+ public function check_path_parameters()
+ {
+ $parameters = array('AdminPath', 'MediaPath', 'SkinsPath');
+ $this->read_parameter($parameters);
+
+ $separators = array('/', DIRECTORY_SEPARATOR);
+ $errors = array();
+ if ( !in_array(substr($this->AdminPath, -1, 1), $separators) )
+ {
+ $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD3);
+ }
+ elseif ( !file_exists($this->AdminPath) )
+ {
+ $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD3);
+ }
+
+ if ( !in_array(substr($this->MediaPath, -1, 1), $separators) )
+ {
+ $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD5);
+ }
+ elseif ( !file_exists($this->MediaPath) )
+ {
+ $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD5);
+ }
+
+ if ( !in_array(substr($this->SkinsPath, -1, 1), $separators) )
+ {
+ $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD7);
+ }
+ elseif ( !file_exists($this->SkinsPath) )
+ {
+ $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD7);
+ }
+
+ return $errors;
+ }
+
+ /**
+ * check all parameters
+ * @return bool
+ */
+ public function check_all_parameters()
+ {
+ $this->set_locale();
+
+ $isValid = true;
+ $isValid &= (count($this->check_mysql_parameters()) == 0);
+ $isValid &= (count($this->check_user_parameters()) == 0);
+ $isValid &= (count($this->check_weblog_parameters()) == 0);
+ $isValid &= (count($this->check_uri_parameters()) == 0);
+ $isValid &= (count($this->check_path_parameters()) == 0);
+
+ return $isValid;
+ }
+}
+>>>>>>> skinnable-master