r2471 Fixed a hack introduced in changeset#2468
[racktables] / inc / init.php
1 <?php
2 /*
3 *
4 * This file performs RackTables initialisation. After you include it
5 * from 1st-level page, don't forget to call fixContext(). This is done
6 * to enable override of of pageno and tabno variables. pageno and tabno
7 * together participate in forming security context by generating
8 * related autotags.
9 *
10 */
11
12 $root = (empty($_SERVER['HTTPS'])?'http':'https').
13 '://'.
14 (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:($_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?'':$_SERVER['SERVER_PORT']))).
15 dirname($_SERVER['PHP_SELF']);
16 if (substr ($root, -1) != '/')
17 $root .= '/';
18
19 // This is the first thing we need to do.
20 require_once 'inc/config.php';
21
22 // What we need first is database and interface functions.
23 require_once 'inc/interface.php';
24 require_once 'inc/functions.php';
25 require_once 'inc/database.php';
26 if (file_exists ('inc/secret.php'))
27 require_once 'inc/secret.php';
28 else
29 {
30 showError
31 (
32 "Database connection parameters are read from inc/secret.php file, " .
33 "which cannot be found.\nYou probably need to complete the installation " .
34 "procedure by following <a href='${root}install.php'>this link</a>.",
35 __FILE__
36 );
37 exit (1);
38 }
39
40 // Now try to connect...
41 try
42 {
43 $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password);
44 }
45 catch (PDOException $e)
46 {
47 showError ("Database connection failed:\n\n" . $e->getMessage(), __FILE__);
48 exit (1);
49 }
50
51 $dbxlink->exec ("set names 'utf8'");
52
53 if (get_magic_quotes_gpc())
54 foreach ($_REQUEST as $key => $value)
55 if (gettype ($value) == 'string')
56 $_REQUEST[$key] = stripslashes ($value);
57
58 if (!set_magic_quotes_runtime (0))
59 {
60 showError ('Failed to turn magic quotes off', __FILE__);
61 exit (1);
62 }
63
64 // Escape any globals before we ever try to use them.
65 foreach ($_REQUEST as $key => $value)
66 if (gettype ($value) == 'string')
67 $_REQUEST[$key] = escapeString ($value);
68
69 if (isset ($_SERVER['PHP_AUTH_USER']))
70 $_SERVER['PHP_AUTH_USER'] = escapeString ($_SERVER['PHP_AUTH_USER']);
71 if (isset ($_SERVER['REMOTE_USER']))
72 $_SERVER['REMOTE_USER'] = escapeString ($_SERVER['REMOTE_USER']);
73
74 $dbver = getDatabaseVersion();
75 if ($dbver != CODE_VERSION)
76 {
77 echo '<p align=justify>This Racktables installation seems to be ' .
78 'just upgraded to version ' . CODE_VERSION . ', while the '.
79 'database version is ' . $dbver . '. No user will be ' .
80 'either authenticated or shown any page until the upgrade is ' .
81 "finished. Follow <a href='${root}upgrade.php'>this link</a> and " .
82 'authenticate as administrator to finish the upgrade.</p>';
83 exit (1);
84 }
85
86 if (!mb_internal_encoding ('UTF-8') or !mb_regex_encoding ('UTF-8'))
87 {
88 showError ('Failed setting multibyte string encoding to UTF-8', __FILE__);
89 exit (1);
90 }
91 $configCache = loadConfigCache();
92 if (!count ($configCache))
93 {
94 showError ('Failed to load configuration from the database.', __FILE__);
95 exit (1);
96 }
97
98 require_once 'inc/code.php'; // for getRackCode()
99 $rackCodeCache = loadScript ('RackCodeCache');
100 if ($rackCodeCache == NULL or empty ($rackCodeCache))
101 {
102 $rackCode = getRackCode (loadScript ('RackCode'));
103 saveScript ('RackCodeCache', base64_encode (serialize ($rackCode)));
104 }
105 else
106 {
107 $rackCode = unserialize (base64_decode ($rackCodeCache));
108 if ($rackCode === FALSE) // invalid cache
109 {
110 saveScript ('RackCodeCache', '');
111 $rackCode = getRackCode (loadScript ('RackCode'));
112 }
113 }
114
115 // Depending on the 'result' value the 'load' carries either the
116 // parse tree or error message.
117 if ($rackCode['result'] != 'ACK')
118 {
119 // FIXME: display a message with an option to reset RackCode text
120 showError ('Could not load the RackCode due to error: ' . $rackCode['load'], __FILE__);
121 exit (1);
122 }
123 $rackCode = $rackCode['load'];
124
125 require_once 'inc/auth.php';
126 $auto_tags = array();
127 authenticate(); // sometimes this generates autotags, but never --- given tags
128 // Authentication passed.
129 // Note that we don't perform autorization here, so each 1st level page
130 // has to do it in its way, e.g. by calling authorize() after fixContext().
131
132 if (!isset ($script_mode) or $script_mode !== TRUE)
133 session_start();
134
135
136 $pageno = (isset ($_REQUEST['page'])) ? $_REQUEST['page'] : 'index';
137 // Special handling of tab number to substitute the "last" index where applicable.
138 // Always show explicitly requested tab, substitute the last used name in case
139 // it is awailable, fall back to the default one.
140
141 if (isset ($_REQUEST['tab']))
142 $tabno = $_REQUEST['tab'];
143 elseif (basename($_SERVER['PHP_SELF']) == 'index.php' and getConfigVar ('SHOW_LAST_TAB') == 'yes' and isset ($_SESSION['RTLT'][$pageno]))
144 {
145 $tabno = $_SESSION['RTLT'][$pageno];
146 $url = "${root}?page=$pageno&tab=$tabno";
147 foreach ($_GET as $name=>$value)
148 {
149 if ($name == 'page' or $name == 'tab') continue;
150 $url .= '&'.urlencode($name).'='.urlencode($value);
151 }
152 header('Location: '.$url);
153 exit();
154 }
155 else
156 $tabno = 'default';
157
158
159
160 $op = (isset ($_REQUEST['op'])) ? $_REQUEST['op'] : '';
161
162 $taglist = getTagList();
163 $tagtree = treeFromList ($taglist);
164 sortTree ($tagtree, 'taginfoCmp');
165
166 require_once 'inc/navigation.php';
167 require_once 'inc/pagetitles.php';
168 require_once 'inc/ophandlers.php';
169 require_once 'inc/triggers.php';
170 require_once 'inc/gateways.php';
171 require_once 'inc/snmp.php';
172 if (file_exists ('inc/local.php'))
173 require_once 'inc/local.php';
174
175 // These will be filled in by fixContext()
176 $expl_tags = array();
177 $impl_tags = array();
178 // Initial chain for the current target.
179 $target_given_tags = array();
180 // Initial chain for the current user.
181 $user_given_tags = array();
182 if (!isset ($script_mode) or $script_mode !== TRUE)
183 {
184 $auto_tags = array_merge ($auto_tags, getUserAutoTags());
185 if (isset ($accounts[$remote_username]))
186 $user_given_tags = loadUserTags ($accounts[$remote_username]['user_id']);
187 }
188
189 ?>