r2628 - interpretPredicate(): make use of pre-built predicate table
[racktables] / render_image.php
index 80491655991b6bfe82753c8322c7887ff9e6dd81..38ac387eac691a8dbd2177bf36a6bf7762100478 100644 (file)
@@ -1,24 +1,35 @@
 <?php
 
-// This page outputs PNG rack thumbnail.
-
 require 'inc/init.php';
 
-assertStringArg ('img');
+assertStringArg ('img', __FILE__);
 switch ($_REQUEST['img'])
 {
-       case 'minirack':
-               // Thumbnails are rendered in security context of rackspace.
-               $pageno = 'rackspace';
+       case 'minirack': // rack security context
+               assertUIntArg ('rack_id', __FILE__);
+               $pageno = 'rack';
                $tabno = 'default';
-               authorize();
-               assertUIntArg ('rack_id');
-               renderRackThumb ($_REQUEST['rack_id']);
+               fixContext();
+               if (!permitted())
+                       renderAccessDeniedImage();
+               else
+                       renderRackThumb ($_REQUEST['rack_id']);
                break;
-       case 'progressbar':
-               assertUIntArg ('done', TRUE);
+       case 'progressbar': // no security context
+               assertUIntArg ('done', __FILE__, TRUE);
                renderProgressBarImage ($_REQUEST['done']);
                break;
+       case 'view': // file security context
+       case 'preview':
+               assertUIntArg ('file_id', __FILE__);
+               $pageno = 'file';
+               $tabno = 'default';
+               fixContext();
+               if (!permitted())
+                       renderAccessDeniedImage();
+               else
+                       renderFilePreview ($_REQUEST['file_id']);
+               break;
        default:
                renderError();
 }
@@ -65,8 +76,8 @@ function renderRackThumb ($rack_id = 0)
        }
 }
 
-// Return a binary string containing the PNG minirack.
-function generateMiniRack ($rack_id)
+// Output a binary string containing the PNG minirack.
+function generateMiniRack ($rack_id = 0)
 {
        if (($rackData = getRackData ($rack_id, TRUE)) == NULL)
        {
@@ -74,13 +85,8 @@ function generateMiniRack ($rack_id)
                return;
        }
        markupObjectProblems ($rackData);
-       // Cache in a local array, because we are going to use those values often.
-       $rtwidth = array
-       (
-               0 => getConfigVar ('rtwidth_0'),
-               1 => getConfigVar ('rtwidth_1'),
-               2 => getConfigVar ('rtwidth_2')
-       );
+       global $rtwidth;
+       $rtdepth = 9;
        $offset[0] = 3;
        $offset[1] = 3 + $rtwidth[0];
        $offset[2] = 3 + $rtwidth[0] + $rtwidth[1];
@@ -92,10 +98,12 @@ function generateMiniRack ($rack_id)
        $color = array();
        foreach (array ('F', 'A', 'U', 'T', 'Th', 'Tw', 'Thw') as $statecode)
                $color[$statecode] = colorFromHex ($img, getConfigVar ('color_' . $statecode));
-       imagerectangle ($img, 0, 0, $totalwidth - 1, $totalheight - 1, colorFromHex ($img, '000000'));
-       imagerectangle ($img, 1, 1, $totalwidth - 2, $totalheight - 2, colorFromHex ($img, 'c0c0c0'));
-       imagerectangle ($img, 2, 2, $totalwidth - 3, $totalheight - 3, colorFromHex ($img, '000000'));
-       for ($unit_no = $rackData['height']; $unit_no > 0; $unit_no--)
+       $color['black'] = colorFromHex ($img, '000000');
+       $color['gray'] = colorFromHex ($img, 'c0c0c0');
+       imagerectangle ($img, 0, 0, $totalwidth - 1, $totalheight - 1, $color['black']);
+       imagerectangle ($img, 1, 1, $totalwidth - 2, $totalheight - 2, $color['gray']);
+       imagerectangle ($img, 2, 2, $totalwidth - 3, $totalheight - 3, $color['black']);
+       for ($unit_no = 1; $unit_no <= $rackData['height']; $unit_no++)
        {
                for ($locidx = 0; $locidx < 3; $locidx++)
                {
@@ -120,8 +128,17 @@ function generateMiniRack ($rack_id)
 function renderProgressBarImage ($done)
 {
        $img = @imagecreatetruecolor (100, 10);
-       $color['T'] = colorFromHex ($img, getConfigVar ('color_T'));
-       $color['F'] = colorFromHex ($img, getConfigVar ('color_F'));
+       switch (isset ($_REQUEST['theme']) ? $_REQUEST['theme'] : 'rackspace')
+       {
+               case 'sparenetwork':
+                       $color['T'] = colorFromHex ($img, '808080');
+                       $color['F'] = colorFromHex ($img, 'c0c0c0');
+                       break;
+               case 'rackspace': // teal
+               default:
+                       $color['T'] = colorFromHex ($img, getConfigVar ('color_T'));
+                       $color['F'] = colorFromHex ($img, getConfigVar ('color_F'));
+       }
        imagefilledrectangle ($img, 0, 0, $done, 10, $color['T']);
        imagefilledrectangle ($img, $done, 0, 100, 10, $color['F']);
        header("Content-type: image/png");
@@ -129,4 +146,36 @@ function renderProgressBarImage ($done)
        imagedestroy ($img);
 }
 
+function renderAccessDeniedImage ()
+{
+       $img = @imagecreatetruecolor (1, 1);
+       imagefilledrectangle ($img, 0, 0, 1, 1, colorFromHex ($img, '000000'));
+       header("Content-type: image/png");
+       imagepng ($img);
+       imagedestroy ($img);
+}
+
+function renderFilePreview ($file_id = 0)
+{
+       $file = getFile ($file_id);
+       $image = imagecreatefromstring ($file['contents']);
+       $width = imagesx ($image);
+       $height = imagesy ($image);
+       if ($_REQUEST['img'] == 'preview' and ($width > getConfigVar ('PREVIEW_IMAGE_MAXPXS') or $height > getConfigVar ('PREVIEW_IMAGE_MAXPXS')))
+       {
+               // TODO: cache thumbs for faster page generation
+               $ratio = getConfigVar ('PREVIEW_IMAGE_MAXPXS') / max ($width, $height);
+               $newwidth = $width * $ratio;
+               $newheight = $height * $ratio;
+               $resampled = imagecreatetruecolor ($newwidth, $newheight);
+               imagecopyresampled ($resampled, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
+               imagedestroy ($image);
+               $image = $resampled;
+               unset ($resampled);
+       }
+       header("Content-type: image/png"); // don't announce content-length, it may have changed after resampling
+       imagepng ($image);
+       imagedestroy ($image);
+}
+
 ?>