r4813 bugfix: when long action takes place, RackTables allows user to work simultaneo...
authorAlexey Andriyanov <alan@al-an.info>
Tue, 4 Oct 2011 15:06:24 +0000 (15:06 +0000)
committerAlexey Andriyanov <alan@al-an.info>
Tue, 4 Oct 2011 15:06:24 +0000 (15:06 +0000)
init.php: unconditional session_start was removed
buildRedirectURL: the function was moved to functions.php and merged with redirectUser.
updVSTRule: added session_start in order to use PHP sessions engine
renderVSTRulesEditor: idem
getCellFilter: idem
showMessageOrError: display merged list of messaged (from session and from log_messages array)
redirectIfNecessary: remember last tab code moved here from index.php
redirectUser: func prototype changed, also backs up global $log_messages into _SESSION.
showOneLiner: use global $log_messages instead of _SESSION.
getMessagesCount: idem

ChangeLog
wwwroot/inc/functions.php
wwwroot/inc/init.php
wwwroot/inc/interface.php
wwwroot/inc/ophandlers.php
wwwroot/index.php

index ecf21044dbf8384d947a3fbd7b0ceead04a25bc6..6fbf64259c13fa990ad76a14dc4ce28340decc79 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,5 @@
 0.20.0
+       bugfix: when long action takes place, RackTables allows user to work simultaneously in different tabs
        update: handle wide-band WDM transceivers
        update: 802.1q: config deploy to Cisco IOS switches is no more requiring 'switchport trunk encapsulation dot1q' pre-set
        update: convert racks and rows into objects (by Aaron Dummer)
index 9cc24bfe1d340162e459aebd7ec2105e26b094ad..cf80d0518aba1643451542d3ed7f93d9f24b85ca 100644 (file)
@@ -254,6 +254,8 @@ $wdm_packs = array
        ),
 );
 
+$log_messages = array(); // messages waiting for displaying
+
 // This function assures that specified argument was passed
 // and is a number greater than zero.
 function assertUIntArg ($argname, $allow_zero = FALSE)
@@ -1245,7 +1247,7 @@ function redirectIfNecessary ()
                $trigger,
                $pageno,
                $tabno;
-
+       @session_start();
        if
        (
                ! isset ($_REQUEST['tab']) and
@@ -1254,7 +1256,7 @@ function redirectIfNecessary ()
                permitted ($pageno, $_SESSION['RTLT'][$pageno]['tabname']) and
                time() - $_SESSION['RTLT'][$pageno]['time'] <= TAB_REMEMBER_TIMEOUT
        )
-               redirectUser ($pageno, $_SESSION['RTLT'][$pageno]['tabname']);
+               redirectUser (buildRedirectURL ($pageno, $_SESSION['RTLT'][$pageno]['tabname']));
 
        // check if we accidentaly got on a dynamic tab that shouldn't be shown for this object
        if
@@ -1264,8 +1266,14 @@ function redirectIfNecessary ()
        )
        {
                $_SESSION['RTLT'][$pageno]['dont_remember'] = 1;
-               redirectUser ($pageno, 'default');
+               redirectUser (buildRedirectURL ($pageno, 'default'));
        }
+       if (isset ($_SESSION['RTLT'][$pageno]['dont_remember']))
+               unset ($_SESSION['RTLT'][$pageno]['dont_remember']);
+       // store the last visited tab name
+       if (isset ($_REQUEST['tab']))
+               $_SESSION['RTLT'][$pageno] = array ('tabname' => $tabno, 'time' => time());
+       session_commit(); // if we are continuing to run, unlock session data
 }
 
 function prepareNavigation()
@@ -1502,6 +1510,7 @@ function getCellFilter ()
        global $sic;
        global $pageno;
        $andor_used = FALSE;
+       @session_start();
        // if the page is submitted we get an andor value so we know they are trying to start a new filter or clearing the existing one.
        if(isset($_REQUEST['andor']))
        {
@@ -1625,17 +1634,40 @@ function getCellFilter ()
        return $ret;
 }
 
-function redirectUser ($p, $t)
+function buildRedirectURL ($nextpage = NULL, $nexttab = NULL, $moreArgs = array())
 {
-       global $page;
-       $l = "index.php?page=${p}&tab=${t}";
-       if (isset ($page[$p]['bypass']) and isset ($_REQUEST[$page[$p]['bypass']]))
-               $l .= '&' . $page[$p]['bypass'] . '=' . $_REQUEST[$page[$p]['bypass']];
-       if (isset ($page[$p]['bypass_tabs']))
-               foreach ($page[$p]['bypass_tabs'] as $param_name)
+       global $page, $pageno, $tabno;
+       if ($nextpage === NULL)
+               $nextpage = $pageno;
+       if ($nexttab === NULL)
+               $nexttab = $tabno;
+       $url = "index.php?page=${nextpage}&tab=${nexttab}";
+       if (isset ($page[$nextpage]['bypass']))
+               $url .= '&' . $page[$nextpage]['bypass'] . '=' . $_REQUEST[$page[$nextpage]['bypass']];
+       if (isset ($page[$nextpage]['bypass_tabs']))
+               foreach ($page[$nextpage]['bypass_tabs'] as $param_name)
                        if (isset ($_REQUEST[$param_name]))
-                               $l .= '&' . urlencode ($param_name) . '=' . urlencode ($_REQUEST[$param_name]);
-       header ("Location: " . $l);
+                               $url .= '&' . urlencode ($param_name) . '=' . urlencode ($_REQUEST[$param_name]);
+
+       if (count ($moreArgs) > 0)
+               foreach ($moreArgs as $arg => $value)
+                       if (is_array ($value))
+                               foreach ($value as $v)
+                                       $url .= '&' . urlencode ($arg . '[]') . '=' . urlencode ($v);
+                       elseif ($arg != 'module')
+                               $url .= '&' . urlencode ($arg) . '=' . urlencode ($value);
+       return $url;
+}
+
+function redirectUser ($url)
+{
+       global $log_messages;
+       if (! empty ($log_messages))
+       {
+               @session_start();
+               $_SESSION['log'] = $log_messages;
+       }
+       header ("Location: " . $url);
        die;
 }
 
@@ -4456,12 +4488,11 @@ function setMessage ($type, $message, $direct_rendering)
 
 function showOneLiner ($code, $args = array())
 {
+       global $log_messages;
        $line = array ('c' => $code);
        if (! empty ($args))
                $line['a'] = $args;
-       if (! isset ($_SESSION['log']))
-               $_SESSION['log'] = array();
-       $_SESSION['log'][] = $line;
+       $log_messages[] = $line;
 }
 
 function showFuncMessage ($callfunc, $status, $log_args = array())
@@ -4477,29 +4508,29 @@ function showFuncMessage ($callfunc, $status, $log_args = array())
 // message_type can be 'all', 'success', 'error', 'warning', 'neutral'.
 function getMessagesCount ($message_type = 'all')
 {
+       global $log_messages;
        $result = 0;
-       if (isset ($_SESSION['log']))
-               foreach ($_SESSION['log'] as $msg)
-                       if ($msg['c'] < 100)
-                       {
-                               if ($message_type == 'success' || $message_type == 'all')
-                                       ++$result;
-                       }
-                       elseif ($msg['c'] < 200)
-                       {
-                               if ($message_type == 'error' || $message_type == 'all')
-                                       ++$result;
-                       }
-                       elseif ($msg['c'] < 300)
-                       {
-                               if ($message_type == 'warning' || $message_type == 'all')
-                                       ++$result;
-                       }
-                       else
-                       {
-                               if ($message_type == 'neutral' || $message_type == 'all')
-                                       ++$result;
-                       }
+       foreach ($log_messages as $msg)
+               if ($msg['c'] < 100)
+               {
+                       if ($message_type == 'success' || $message_type == 'all')
+                               ++$result;
+               }
+               elseif ($msg['c'] < 200)
+               {
+                       if ($message_type == 'error' || $message_type == 'all')
+                               ++$result;
+               }
+               elseif ($msg['c'] < 300)
+               {
+                       if ($message_type == 'warning' || $message_type == 'all')
+                               ++$result;
+               }
+               else
+               {
+                       if ($message_type == 'neutral' || $message_type == 'all')
+                               ++$result;
+               }
        return $result;
 }
 
index 63bfc44ee2a168d94cc057618b3dcf7654825365..ab50712d7ac44df6d1f769c07d9ba0b1d5fffd90 100644 (file)
@@ -106,7 +106,6 @@ if (!isset ($script_mode) or $script_mode !== TRUE)
        // Authentication passed.
        // Note that we don't perform autorization here, so each 1st level page
        // has to do it in its way, e.g. by calling authorize() after fixContext().
-       session_start();
 }
 else
 {
index dc56775701e7b4838927ab9fb9a688fefd14e1ed..22745159fd8a7cf3416a39f6476ca9c797cbed44 100644 (file)
@@ -1442,11 +1442,21 @@ function renderIPv6ForObject ($object_id)
 // This function is deprecated. Do not rely on its internals,
 // it will probably be removed in the next major relese.
 // Use new showError, showWarning, showSuccess functions.
-// Log array is stored in $_SESSION['log']. Its format is simple: plain ordered array 
+// Log array is stored in global $log_messages. Its format is simple: plain ordered array 
 // with values having keys 'c' (both message code and severity) and 'a' (sprintf arguments array)
 function showMessageOrError ()
 {
-       if (empty ($_SESSION['log']))
+       global $log_messages;
+
+       @session_start();
+       if (isset ($_SESSION['log']))
+       {
+               $log_messages = array_merge ($_SESSION['log'], $log_messages);
+               unset ($_SESSION['log']);
+       }
+       session_commit();
+
+       if (empty ($log_messages))
                return;
        $msginfo = array
        (
@@ -1504,7 +1514,7 @@ function showMessageOrError ()
 
        );
        // Handle the arguments. Is there any better way to do it?
-       foreach ($_SESSION['log'] as $record)
+       foreach ($log_messages as $record)
        {
                if (!isset ($record['c']) or !isset ($msginfo[$record['c']]))
                {
@@ -1555,7 +1565,7 @@ function showMessageOrError ()
                        $msgtext = $msginfo[$record['c']]['format'];
                echo '<div class=msg_' . $msginfo[$record['c']]['code'] . ">${msgtext}</div>";
        }
-       unset ($_SESSION['log']);
+       $log_messages = array();
 }
 
 // renders two tables: port link status and learned MAC list
@@ -7895,6 +7905,7 @@ function renderVSTRulesEditor ($vst_id)
        $row_html .= '<td><input type=text name=description value="%s"></td>';
        $row_html .= '<td><a href="#" class="vst-add-rule">' . getImageHREF ('add', 'Duplicate rule') . '</a></td>';
        addJS ("var new_vst_row = '" . addslashes (sprintf ($row_html, '', '', getSelect ($port_role_options, array ('name' => 'port_role'), 'anymode'), '', '')) . "';", TRUE);
+       @session_start();
        foreach (isset ($_SESSION['vst_edited']) ? $_SESSION['vst_edited'] : $vst['rules'] as $item)
                printf ('<tr>' . $row_html . '</tr>', $item['rule_no'], htmlspecialchars ($item['port_pcre'], ENT_QUOTES),  getSelect ($port_role_options, array ('name' => 'port_role'), $item['port_role']), $item['wrt_vlans'], $item['description']);
        echo '</table>';
index 9504b6e36aa3eba79f819a9fed7ec3a37060894a..57091949270fbe46a8fd531100050b531d565d58 100644 (file)
@@ -451,27 +451,6 @@ $opspec_list['vlandomain-vlanlist-upd'] = array
        ),
 );
 
-function buildRedirectURL ($nextpage = NULL, $nexttab = NULL, $moreArgs = array())
-{
-       global $page, $pageno, $tabno;
-       if ($nextpage === NULL)
-               $nextpage = $pageno;
-       if ($nexttab === NULL)
-               $nexttab = $tabno;
-       $url = "index.php?page=${nextpage}&tab=${nexttab}";
-       if (isset ($page[$nextpage]['bypass']))
-               $url .= '&' . $page[$nextpage]['bypass'] . '=' . $_REQUEST[$page[$nextpage]['bypass']];
-
-       if (count ($moreArgs) > 0)
-               foreach ($moreArgs as $arg => $value)
-                       if (is_array ($value))
-                               foreach ($value as $v)
-                                       $url .= '&' . urlencode ($arg . '[]') . '=' . urlencode ($v);
-                       elseif ($arg != 'module')
-                               $url .= '&' . urlencode ($arg) . '=' . urlencode ($value);
-       return $url;
-}
-
 $msgcode['addPortForwarding']['OK'] = 48;
 function addPortForwarding ()
 {
@@ -2605,7 +2584,10 @@ function updVSTRule()
        {
                // Every case, which is soft-processed in process.php, will have the working copy available for a retry.
                if ($e instanceof InvalidRequestArgException or $e instanceof RTDatabaseError)
+               {
+                       @session_start();
                        $_SESSION['vst_edited'] = $data;
+               }
                throw $e;
        }
        return showFuncMessage (__FUNCTION__, 'OK');
index 32a9a5c4f195e7b76ad3f3428a7267c902c6e3f2..244951390788ad97fd8f7f052e403238c235675d 100644 (file)
@@ -19,14 +19,6 @@ try {
                redirectIfNecessary();
                assertPermission();
                header ('Content-Type: text/html; charset=UTF-8');
-               // Only store the tab name after clearance is got. Any failure is unhandleable.
-               if (isset ($_REQUEST['tab']))
-               {
-                       if (isset ($_SESSION['RTLT'][$pageno]['dont_remember']))
-                               unset ($_SESSION['RTLT'][$pageno]['dont_remember']);
-                       else
-                               $_SESSION['RTLT'][$pageno] = array ('tabname' => $tabno, 'time' => time());
-               }
                // call the main handler - page or tab handler.
                if (isset ($tabhandler[$pageno][$tabno]))
                {
@@ -184,7 +176,7 @@ try {
                        ob_clean();
                        showError ('Operation not permitted');
                }
-               header ('Location: ' . $location);
+               redirectUser ($location);
                // any other error requires no special handling and will be caught outside
                break;
        case 'popup' == $_REQUEST['module']:
@@ -211,9 +203,6 @@ try {
 catch (Exception $e)
 {
        ob_end_clean();
-       # prevent message appearing in foreign tab
-       if (isset ($_SESSION['log']))
-               unset ($_SESSION['log']);
        printException ($e);
 }
 ?>