Commit | Line | Data |
---|---|---|
b325120a | 1 | <?php |
90a3d6d8 | 2 | ob_start(); |
91bd1d6e DO |
3 | # Neither "throw/catch" for custom exceptions nor printException() will |
4 | # work without first loading exceptions.php. | |
5 | require_once 'inc/exceptions.php'; | |
90a3d6d8 | 6 | try { |
87c744a9 DO |
7 | // Code block below is a module request dispatcher. Turning it into a |
8 | // function will break things because of the way require() works. | |
c5dfde62 | 9 | switch (TRUE) |
36ef72d9 | 10 | { |
c5dfde62 DO |
11 | case ! array_key_exists ('module', $_REQUEST): |
12 | case 'interface' == $_REQUEST['module']: | |
13 | require_once 'inc/interface.php'; | |
14 | // init.php has to be included after interface.php, otherwise the bits | |
15 | // set by local.php get lost | |
16 | require_once 'inc/init.php'; | |
17 | prepareNavigation(); | |
18 | // Security context is built on the requested page/tab/bypass data, | |
19 | // do not override. | |
20 | fixContext(); | |
21 | redirectIfNecessary(); | |
22 | if (! permitted()) | |
23 | { | |
24 | renderAccessDenied (FALSE); | |
25 | break; | |
26 | } | |
27 | header ('Content-Type: text/html; charset=UTF-8'); | |
28 | // Only store the tab name after clearance is got. Any failure is unhandleable. | |
29 | if (isset ($_REQUEST['tab']) and ! isset ($_SESSION['RTLT'][$pageno]['dont_remember'])) | |
30 | $_SESSION['RTLT'][$pageno] = array ('tabname' => $tabno, 'time' => time()); | |
31 | // call the main handler - page or tab handler. | |
32 | if (isset ($tabhandler[$pageno][$tabno])) | |
33 | call_user_func ($tabhandler[$pageno][$tabno], getBypassValue()); | |
34 | elseif (isset ($page[$pageno]['handler'])) | |
35 | $page[$pageno]['handler'] ($tabno); | |
36 | else | |
37 | throw new RackTablesError ("Failed to find handler for page '${pageno}', tab '${tabno}'", RackTablesError::INTERNAL); | |
38 | // Embed the current text in OB into interface layout (the latter also | |
39 | // empties color message buffer). | |
40 | $contents = ob_get_contents(); | |
41 | ob_clean(); | |
42 | renderInterfaceHTML ($pageno, $tabno, $contents); | |
43 | break; | |
19f22ad8 | 44 | case 'chrome' == $_REQUEST['module']: |
4afb4c10 | 45 | require_once 'inc/init.php'; |
36ef72d9 DO |
46 | genericAssertion ('uri', 'string'); |
47 | proxyStaticURI ($_REQUEST['uri']); | |
48 | break; | |
c5dfde62 | 49 | case 'download' == $_REQUEST['module']: |
4afb4c10 | 50 | require_once 'inc/init.php'; |
0415b520 DO |
51 | $pageno = 'file'; |
52 | $tabno = 'download'; | |
53 | fixContext(); | |
54 | if (!permitted()) | |
55 | { | |
87c744a9 DO |
56 | renderAccessDenied (FALSE); |
57 | break; | |
0415b520 | 58 | } |
0415b520 DO |
59 | $file = getFile (getBypassValue()); |
60 | header("Content-Type: {$file['type']}"); | |
61 | header("Content-Length: {$file['size']}"); | |
39cfa9a7 | 62 | if (! array_key_exists ('asattach', $_REQUEST) or $_REQUEST['asattach'] != 'no') |
0415b520 DO |
63 | header("Content-Disposition: attachment; filename={$file['name']}"); |
64 | echo $file['contents']; | |
65 | break; | |
c5dfde62 | 66 | case 'image' == $_REQUEST['module']: |
b849b7e1 DO |
67 | # The difference between "image" and "download" ways to serve the same |
68 | # picture file is that the former is used in <IMG SRC=...> construct, | |
69 | # and the latter is accessed as a standalone URL and can reply with any | |
70 | # Content-type. Hence "image" module indicates failures with internally | |
71 | # built images, and "download" can return a full-fledged "permission | |
72 | # denied" or "exception" HTML page instead of the file requested. | |
8b912171 | 73 | require_once 'inc/init.php'; // for authentication check |
5beb7c53 AA |
74 | // 'progressbar's never change, attempt an IMS shortcut before loading init.php |
75 | if (@$_REQUEST['img'] == 'progressbar') | |
8b912171 | 76 | if (checkCachedResponse (0, CACHE_DURATION)) |
5beb7c53 | 77 | exit; |
4afb4c10 | 78 | require_once 'inc/render_image.php'; |
4afb4c10 DO |
79 | try |
80 | { | |
81 | dispatchImageRequest(); | |
82 | } | |
83 | catch (Exception $e) | |
84 | { | |
87c744a9 | 85 | ob_clean(); |
11566bd6 | 86 | renderErrorImage(); |
4afb4c10 DO |
87 | } |
88 | break; | |
c5dfde62 | 89 | case 'ajax' == $_REQUEST['module']: |
9f4f431c DO |
90 | require_once 'inc/ajax-interface.php'; |
91 | require_once 'inc/init.php'; | |
92 | try | |
93 | { | |
94 | dispatchAJAXRequest(); | |
95 | } | |
96 | catch (InvalidRequestArgException $e) | |
97 | { | |
98 | ob_clean(); | |
99 | echo "NAK\nMalformed request"; | |
100 | } | |
101 | catch (Exception $e) | |
102 | { | |
103 | ob_clean(); | |
104 | echo "NAK\nRuntime exception: ". $e->getMessage(); | |
105 | } | |
106 | break; | |
c5dfde62 | 107 | case 'redirect' == $_REQUEST['module']: |
87c744a9 DO |
108 | // Include init after ophandlers/snmp, not before, so local.php can redefine things. |
109 | require_once 'inc/ophandlers.php'; | |
110 | // snmp.php is an exception, it is treated by a special hack | |
111 | if (isset ($_REQUEST['op']) and $_REQUEST['op'] == 'querySNMPData') | |
112 | require_once 'inc/snmp.php'; | |
113 | require_once 'inc/init.php'; | |
114 | try | |
115 | { | |
116 | genericAssertion ('op', 'string'); | |
117 | $op = $_REQUEST['op']; | |
118 | prepareNavigation(); | |
119 | $location = buildWideRedirectURL(); | |
120 | // FIXME: find a better way to handle this error | |
121 | if ($op == 'addFile' && !isset($_FILES['file']['error'])) | |
122 | throw new RackTablesError ('File upload error, check upload_max_filesize in php.ini', RackTablesError::MISCONFIGURED); | |
123 | fixContext(); | |
124 | if | |
125 | ( | |
126 | !isset ($ophandler[$pageno][$tabno][$op]) or | |
127 | !function_exists ($ophandler[$pageno][$tabno][$op]) | |
128 | ) | |
129 | throw new RackTablesError ("Invalid navigation data for '${pageno}-${tabno}-${op}'", RackTablesError::INTERNAL); | |
130 | // We have a chance to handle an error before starting HTTP header. | |
131 | if (!isset ($delayauth[$pageno][$tabno][$op]) and !permitted()) | |
132 | showError ('Operation not permitted'); | |
133 | else | |
134 | { | |
135 | // Call below does the job of bypass argument assertion, if such is required, | |
136 | // so the ophandler function doesn't have to re-assert this portion of its | |
137 | // arguments. And it would be even better to pass returned value to ophandler, | |
138 | // so it is not necessary to remember the name of bypass in it. | |
139 | getBypassValue(); | |
140 | if (strlen ($redirect_to = call_user_func ($ophandler[$pageno][$tabno][$op]))) | |
141 | $location = $redirect_to; | |
142 | } | |
143 | header ("Location: " . $location); | |
144 | } | |
145 | // known "soft" failures require a short error message | |
93c946ac | 146 | catch (InvalidRequestArgException $e) |
87c744a9 DO |
147 | { |
148 | ob_clean(); | |
149 | showError ($e->getMessage()); | |
150 | header ('Location: ' . $location); | |
151 | } | |
152 | catch (RTDatabaseError $e) | |
153 | { | |
154 | ob_clean(); | |
155 | showError ('Database error: ' . $e->getMessage()); | |
156 | header ('Location: ' . $location); | |
157 | } | |
158 | // any other error requires no special handling and will be caught outside | |
159 | break; | |
e0ce8064 DO |
160 | case 'popup' == $_REQUEST['module']: |
161 | require_once 'inc/popup.php'; | |
e0ce8064 DO |
162 | require_once 'inc/init.php'; |
163 | renderPopupHTML(); | |
164 | break; | |
964b0388 DO |
165 | case 'upgrade' == $_REQUEST['module']: |
166 | require_once 'inc/config.php'; // for CODE_VERSION | |
167 | require_once 'inc/dictionary.php'; | |
168 | require_once 'inc/upgrade.php'; | |
169 | // Enforce default value for now, releases prior to 0.17.0 didn't support 'httpd' auth source. | |
170 | $user_auth_src = 'database'; | |
171 | if (FALSE === @include_once 'inc/secret.php') | |
e37cfe5f | 172 | die ('<center>There is no working RackTables instance here, <a href="?module=installer">install</a>?</center>'); |
964b0388 DO |
173 | try |
174 | { | |
175 | $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password); | |
176 | } | |
177 | catch (PDOException $e) | |
178 | { | |
179 | die ("Database connection failed:\n\n" . $e->getMessage()); | |
180 | } | |
181 | renderUpgraderHTML(); | |
182 | break; | |
91bd1d6e | 183 | case 'installer' == $_REQUEST['module']: |
e37cfe5f DO |
184 | require_once 'inc/dictionary.php'; |
185 | require_once 'inc/install.php'; | |
186 | renderInstallerHTML(); | |
187 | break; | |
36ef72d9 DO |
188 | default: |
189 | throw new InvalidRequestArgException ('module', $_REQUEST['module']); | |
190 | } | |
0415b520 | 191 | ob_end_flush(); |
36ef72d9 | 192 | } |
c5dfde62 DO |
193 | catch (Exception $e) |
194 | { | |
90a3d6d8 | 195 | ob_end_clean(); |
91bd1d6e DO |
196 | # prevent message appearing in foreign tab |
197 | if (isset ($_SESSION['log'])) | |
198 | unset ($_SESSION['log']); | |
c5dfde62 | 199 | printException ($e); |
90a3d6d8 | 200 | } |
e410ebfc | 201 | ?> |