r2191 - sort the IPv4 tree like it's already done for tags
[racktables] / inc / init.php
index e6afefe3db4101a1a4f6908c34907cbf716925a2..62e449f3f8da726346acdf81d773525067af4fc3 100644 (file)
@@ -1,17 +1,20 @@
-<?
+<?php
 /*
 *
 * This file performs RackTables initialisation. After you include it
-* from 1st-level page, don't forget to call authorize(). This is done
+* from 1st-level page, don't forget to call fixContext(). This is done
 * to allow reloading of pageno and tabno variables. pageno and tabno
-* together form security context.
+* together participate in forming security context by generating
+* related autotags.
 *
 */
 
 $root = (empty($_SERVER['HTTPS'])?'http':'https').
        '://'.
        (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:($_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?'':$_SERVER['SERVER_PORT']))).
-       dirname($_SERVER['PHP_SELF']).'/';
+       dirname($_SERVER['PHP_SELF']);
+if (substr ($root, -1) != '/')
+       $root .= '/';
 
 // This is the first thing we need to do.
 require_once 'inc/config.php';
@@ -27,8 +30,9 @@ else
        showError
        (
                "Database connection parameters are read from inc/secret.php file, " .
-               "which cannot be found.\nCopy provided inc/secret-sample.php to " .
-               "inc/secret.php and modify to your setup.\n\nThen reload the page."
+               "which cannot be found.\nYou probably need to complete the installation " .
+               "procedure by following <a href='${root}install.php'>this link</a>.",
+               __FILE__
        );
        die;
 }
@@ -40,28 +44,99 @@ try
 }
 catch (PDOException $e)
 {
-       showError ("Database connection failed:\n\n" . $e->getMessage());
+       showError ("Database connection failed:\n\n" . $e->getMessage(), __FILE__);
        die();
 }
 
+$dbxlink->exec ("set names 'utf8'");
+
+if (get_magic_quotes_gpc())
+       foreach ($_REQUEST as $key => $value)
+               if (gettype ($value) == 'string')
+                       $_REQUEST[$key] = stripslashes ($value);
+
+if (!set_magic_quotes_runtime (0))
+{
+       showError ('Failed to turn magic quotes off', __FILE__);
+       die;
+}
+
 // Escape any globals before we ever try to use them.
 foreach ($_REQUEST as $key => $value)
        if (gettype ($value) == 'string')
                $_REQUEST[$key] = escapeString ($value);
+
 if (isset ($_SERVER['PHP_AUTH_USER']))
        $_SERVER['PHP_AUTH_USER'] = escapeString ($_SERVER['PHP_AUTH_USER']);
-if (isset ($_SERVER['PHP_AUTH_PW']))
-       $_SERVER['PHP_AUTH_PW'] = escapeString ($_SERVER['PHP_AUTH_PW']);
+
+$dbver = getDatabaseVersion();
+if ($dbver != CODE_VERSION)
+{
+       echo '<p align=justify>This Racktables installation seems to be ' .
+               'just upgraded to version ' . CODE_VERSION . ', while the '.
+               'database version is ' . $dbver . '. No user will be ' .
+               'either authenticated or shown any page until the upgrade is ' .
+               "finished. Follow <a href='${root}upgrade.php'>this link</a> and " .
+               'authenticate as administrator to finish the upgrade.</p>';
+       die;
+}
+
+if (!mb_internal_encoding ('UTF-8') or !mb_regex_encoding ('UTF-8'))
+{
+       showError ('Failed setting multibyte string encoding to UTF-8', __FILE__);
+       die;
+}
+$configCache = loadConfigCache();
+if (!count ($configCache))
+{
+       showError ('Failed to load configuration from the database.', __FILE__);
+       die();
+}
+
+require_once 'inc/code.php';
+$rackCodeCache = loadScript ('RackCodeCache');
+if ($rackCodeCache == NULL or empty ($rackCodeCache))
+{
+//     $t1 = microtime (TRUE);
+       $rackCode = getRackCode (loadScript ('RackCode'));
+//     $t2 = microtime (TRUE);
+//     echo 'DEBUG: parsed RackCode tree from scratch in ' . ($t2 - $t1) . ' second(s)<br>';
+       saveScript ('RackCodeCache', base64_encode (serialize ($rackCode)));
+}
+else
+{
+//     $t1 = microtime (TRUE);
+       $rackCode = unserialize (base64_decode ($rackCodeCache));
+//     $t2 = microtime (TRUE);
+//     echo 'DEBUG: loaded RackCode cache in ' . ($t2 - $t1) . ' second(s)<br>';
+       if ($rackCode === FALSE) // invalid cache
+       {
+               saveScript ('RackCodeCache', '');
+//             $t1 = microtime (TRUE);
+               $rackCode = getRackCode (loadScript ('RackCode'));
+//             $t2 = microtime (TRUE);
+//             echo 'DEBUG: discarded RackCode cache and parsed tree from scratch in ' . ($t2 - $t1) . ' second(s)<br>';
+       }
+}
+
+// Depending on the 'result' value the 'load' carries either the
+// parse tree or error message.
+if ($rackCode['result'] != 'ACK')
+{
+       // FIXME: display a message with an option to reset RackCode text
+       showError ('Could not load the RackCode due to error: ' . $rackCode['load'], __FILE__);
+       die;
+}
+$rackCode = $rackCode['load'];
 
 // Now init authentication.
 
 require_once 'inc/auth.php';
 // Load access database once.
 $accounts = getUserAccounts();
-$perms = getUserPermissions();
-if ($accounts === NULL or $perms === NULL)
+if ($accounts === NULL)
 {
-       showError ('Failed to initialize access database.');
+       showError ('Failed to initialize access database.', __FILE__);
        die();
 }
 
@@ -71,24 +146,39 @@ authenticate();
 // Note that we don't perform autorization here, so each 1st level page
 // has to do it in its way, e.g. to call authorize().
 
-$configCache = loadConfigCache();
-if (!count ($configCache))
-{
-       showError ('Failed to load configuration from the database.');
-       die();
-}
-
-
 $remote_username = $_SERVER['PHP_AUTH_USER'];
 $pageno = (isset ($_REQUEST['page'])) ? $_REQUEST['page'] : 'index';
-$tabno = (isset ($_REQUEST['tab'])) ? $_REQUEST['tab'] : 'default';
+// Special handling of tab number to substitute the "last" index where applicable.
+// Always show explicitly requested tab, substitute the last used name in case
+// it is awailable, fall back to the default one.
+if (isset ($_REQUEST['tab']))
+       $tabno = $_REQUEST['tab'];
+elseif (getConfigVar ('SHOW_LAST_TAB') == 'yes' and isset ($_COOKIE['RTLT-' . $pageno]))
+       $tabno = $_COOKIE['RTLT-' . $pageno];
+else
+       $tabno = 'default';
+$op = (isset ($_REQUEST['op'])) ? $_REQUEST['op'] : '';
+
+// Order matters here.
+$taglist = getTagList();
+$tagtree = getTagTree();
+sortTree ($tagtree, 'taginfoCmp');
 
 require_once 'inc/navigation.php';
 require_once 'inc/pagetitles.php';
-require_once 'inc/pagehandlers.php';
 require_once 'inc/ophandlers.php';
 require_once 'inc/triggers.php';
 require_once 'inc/gateways.php';
-require_once 'inc/help.php';
+require_once 'inc/snmp.php';
+if (file_exists ('inc/local.php'))
+       require_once 'inc/local.php';
+
+// These will be filled in by fixContext()
+$auto_tags = array();
+$expl_tags = array();
+$impl_tags = array();
+// and this will remain constant
+$user_tags = loadUserTags ($accounts[$remote_username]['user_id']);
+$user_tags = array_merge ($user_tags, getImplicitTags ($user_tags), getUserAutoTags());
 
 ?>