r4351 explain the specifics of "image" module
[racktables] / wwwroot / index.php
CommitLineData
b325120a 1<?php
90a3d6d8 2ob_start();
91bd1d6e
DO
3# Neither "throw/catch" for custom exceptions nor printException() will
4# work without first loading exceptions.php.
5require_once 'inc/exceptions.php';
90a3d6d8 6try {
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
193catch (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?>