r2758 - fixContext(): use spotEntity() instead of generateEntityAutoTags()
authorDenis Ovsienko <infrastation@yandex.ru>
Sat, 16 May 2009 14:29:28 +0000 (14:29 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Sat, 16 May 2009 14:29:28 +0000 (14:29 +0000)
 - generateEntityAutoTags(): expect a cell instead of key in 'ipv4net', ignore 'ipaddress'
 - listCells(): pass the whole 'ipv4net' cell to autotags generator, so it doesn't have to re-get extra data
 - spotEntity(): idem
 - etype_by_pageno: don't list 'ipaddress', it breaks things
 - getIPv4NetworkInfo(): sayonara

inc/database.php
inc/functions.php

index bc49c70f605ae1d3aa93cdb535fd0e539dce0343..14c3829882cd33ccbb295304bb601e7e28958482 100644 (file)
@@ -309,7 +309,14 @@ function listCells ($realm, $parent_id = 0)
        {
                $ret[$entity_id]['etags'] = getExplicitTagsOnly ($ret[$entity_id]['etags']);
                $ret[$entity_id]['itags'] = getImplicitTags ($ret[$entity_id]['etags']);
-               $ret[$entity_id]['atags'] = generateEntityAutoTags ($realm, $entity_id);
+               switch ($realm)
+               {
+               case 'ipv4net':
+                       $ret[$entity_id]['atags'] = generateEntityAutoTags ($realm, $ret[$entity_id]);
+                       break;
+               default:
+                       $ret[$entity_id]['atags'] = generateEntityAutoTags ($realm, $entity_id);
+               }
                switch ($realm)
                {
                case 'object':
@@ -377,7 +384,14 @@ function spotEntity ($realm, $id)
                return NULL;
        $ret['etags'] = getExplicitTagsOnly ($ret['etags']);
        $ret['itags'] = getImplicitTags ($ret['etags']);
-       $ret['atags'] = generateEntityAutoTags ($realm, $id);
+       switch ($realm)
+       {
+       case 'ipv4net':
+               $ret['atags'] = generateEntityAutoTags ($realm, $ret);
+               break;
+       default:
+               $ret['atags'] = generateEntityAutoTags ($realm, $id);
+       }
        switch ($realm)
        {
        case 'object':
@@ -1337,30 +1351,6 @@ function scanIPv4Space ($pairlist)
        return $ret;
 }
 
-// Return summary data about an IPv4 prefix, if it exists, or NULL otherwise.
-function getIPv4NetworkInfo ($id = 0)
-{
-       if ($id <= 0)
-       {
-               showError ('Invalid arg', __FUNCTION__);
-               return NULL;
-       }
-       $query = "select INET_NTOA(ip) as ip, mask, name ".
-               "from IPv4Network where id = $id";
-       $result = useSelectBlade ($query, __FUNCTION__);
-       $ret = $result->fetch (PDO::FETCH_ASSOC);
-       if ($ret == NULL)
-               return NULL;
-       unset ($result);
-       $ret['id'] = $id;
-       $ret['ip_bin'] = ip2long ($ret['ip']);
-       $ret['mask_bin'] = binMaskFromDec ($ret['mask']);
-       $ret['mask_bin_inv'] = binInvMaskFromDec ($ret['mask']);
-       $ret['db_first'] = sprintf ('%u', 0x00000000 + $ret['ip_bin'] & $ret['mask_bin']);
-       $ret['db_last'] = sprintf ('%u', 0x00000000 + $ret['ip_bin'] | ($ret['mask_bin_inv']));
-       return $ret;
-}
-
 function getIPv4Address ($dottedquad = '')
 {
        if ($dottedquad == '')
index ffe29682d513525cf5dcd8d34bccc09e17a2ffe9..d7da3d1ec52d6395823f20b7411135c5368b040b 100644 (file)
@@ -34,7 +34,6 @@ $etype_by_pageno = array
        'rack' => 'rack',
        'user' => 'user',
        'file' => 'file',
-       'ipaddress' => 'ipaddress',
 );
 
 // Objects of some types should be explicitly shown as
@@ -960,7 +959,6 @@ function complementByKids ($idlist, $tree = NULL, $getall = FALSE)
 }
 
 // Universal autotags generator, a complementing function for loadEntityTags().
-// An important extension is that 'ipaddress' quasi-realm is also handled.
 // Bypass key isn't strictly typed, but interpreted depending on the realm.
 function generateEntityAutoTags ($entity_realm = '', $bypass_value = '')
 {
@@ -981,16 +979,9 @@ function generateEntityAutoTags ($entity_realm = '', $bypass_value = '')
                        if (!count (getResidentRacksData ($bypass_value, FALSE)))
                                $ret[] = array ('tag' => '$unmounted');
                        break;
-               case 'ipv4net':
-                       $netinfo = getIPv4NetworkInfo ($bypass_value);
-                       $ret[] = array ('tag' => '$ip4netid_' . $bypass_value);
-                       $ret[] = array ('tag' => '$ip4net-' . str_replace ('.', '-', $netinfo['ip']) . '-' . $netinfo['mask']);
-                       $ret[] = array ('tag' => '$any_ip4net');
-                       $ret[] = array ('tag' => '$any_net');
-                       break;
-               case 'ipaddress':
-                       $netinfo = getIPv4NetworkInfo (getIPv4AddressNetworkId ($bypass_value));
-                       $ret[] = array ('tag' => '$ip4net-' . str_replace ('.', '-', $bypass_value) . '-32');
+               case 'ipv4net': // during transition bypass is already the whole structure
+                       $netinfo = $bypass_value;
+                       $ret[] = array ('tag' => '$ip4netid_' . $netinfo['id']);
                        $ret[] = array ('tag' => '$ip4net-' . str_replace ('.', '-', $netinfo['ip']) . '-' . $netinfo['mask']);
                        $ret[] = array ('tag' => '$any_ip4net');
                        $ret[] = array ('tag' => '$any_net');
@@ -1105,26 +1096,18 @@ function fixContext ()
        if (isset ($tmap[$pageno][$tabno]))
                redirectUser ($pageno, $tmap[$pageno][$tabno]);
 
-       // Don't reset autochain, because auth procedures could push stuff there in.
-       // Another important point is to ignore 'user' realm, so we don't infuse effective
-       // context with autotags of the displayed account and don't try using uint
-       // bypass, where string is expected.
-       if
-       (
-               $pageno != 'user' and
-               isset ($etype_by_pageno[$pageno]) and
-               isset ($page[$pageno]['bypass']) and
-               isset ($_REQUEST[$page[$pageno]['bypass']])
-       )
-               $auto_tags = array_merge ($auto_tags, generateEntityAutoTags ($etype_by_pageno[$pageno], $_REQUEST[$page[$pageno]['bypass']]));
-       if
-       (
-               isset ($page[$pageno]['bypass']) and
-               isset ($page[$pageno]['bypass_type']) and
-               $page[$pageno]['bypass_type'] == 'uint' and
-               isset ($_REQUEST[$page[$pageno]['bypass']])
-       )
-               $target_given_tags = loadEntityTags ($pageno, $_REQUEST[$page[$pageno]['bypass']]);
+       if (isset ($etype_by_pageno[$pageno]))
+       {
+               // Each page listed in the map above requires one uint argument.
+               assertUIntArg ($page[$pageno]['bypass'], __FUNCTION__);
+               $target = spotEntity ($etype_by_pageno[$pageno], $_REQUEST[$page[$pageno]['bypass']]);
+               $target_given_tags = $target['etags'];
+               // Don't reset autochain, because auth procedures could push stuff there in.
+               // Another important point is to ignore 'user' realm, so we don't infuse effective
+               // context with autotags of the displayed account.
+               if ($pageno != 'user')
+                       $auto_tags = array_merge ($auto_tags, $target['atags']);
+       }
        // Explicit and implicit chains should be normally empty at this point, so
        // overwrite the contents anyway.
        $expl_tags = mergeTagChains ($user_given_tags, $target_given_tags);