Items: fixed item tax type selector to exclude inactive item tax types.
[fa-stable.git] / includes / session.inc
index b5cb1e2ea3637ed5efe47a321cf8f6e8c2dc1549..3ec67df1be0134276def5c0b1ad0f0539f5478a0 100644 (file)
@@ -148,12 +148,12 @@ function password_reset_fail()
 {
        global $path_to_root;
        
-  echo "<center><br><br><font size='5' color='red'><b>" . _("Incorrect Email") . "<b></font><br><br>";
-  echo "<b>" . _("The email address does not exist in the system.") . "<b><br><br>";
+       echo "<center><br><br><font size='5' color='red'><b>" . _("Incorrect Email") . "<b></font><br><br>";
+       echo "<b>" . _("The email address does not exist in the system, or is used by more than one user.") . "<b><br><br>";
 
-  echo _("If you are not an authorized user, please contact your system administrator to obtain an account to enable you to use the system.");
-  echo "<br><a href='$path_to_root/index.php?reset=1'>" . _("Try again") . "</a>";
-  echo "</center>";
+       echo _("Plase try again or contact your system administrator to obtain new password.");
+       echo "<br><a href='$path_to_root/index.php?reset=1'>" . _("Try again") . "</a>";
+       echo "</center>";
 
        kill_login();
        die();
@@ -163,11 +163,11 @@ function password_reset_success()
 {
        global $path_to_root;
 
-  echo "<center><br><br><font size='5' color='green'><b>" . _("New password sent") . "<b></font><br><br>";
-  echo "<b>" . _("A new password has been sent to your mailbox.") . "<b><br><br>";
+       echo "<center><br><br><font size='5' color='green'><b>" . _("New password sent") . "<b></font><br><br>";
+       echo "<b>" . _("A new password has been sent to your mailbox.") . "<b><br><br>";
 
-  echo "<br><a href='$path_to_root/index.php'>" . _("Login here") . "</a>";
-  echo "</center>";
+       echo "<br><a href='$path_to_root/index.php'>" . _("Login here") . "</a>";
+       echo "</center>";
        
        kill_login();
        die();
@@ -184,6 +184,16 @@ function check_faillog()
 
        return false;
 }
+
+/*
+       Ensure file is re-read on next request if php caching is active
+*/
+function cache_invalidate($filename)
+{
+       if (function_exists('opcache_invalidate'))      // OpCode extension
+               opcache_invalidate($filename);
+}
+
 /*
        Simple brute force attack detection is performed before connection to company database is open. Therefore access counters have to be stored in file.
        Login attempts counter is created for every new user IP, which partialy prevent DOS attacks.
@@ -222,6 +232,7 @@ function write_login_filelog($login, $result)
        if ((!file_exists($filename) && is_writable($path_to_root.'/tmp')) || is_writable($filename))
        {
                file_put_contents($filename, $msg);
+               cache_invalidate($filename);
        }
 }
 
@@ -240,7 +251,8 @@ function check_page_security($page_security)
                         _("Security settings have not been defined for your user account.")
                                . "<br>" . _("Please contact your system administrator.")       
                        : _("Please remove \$security_groups and \$security_headings arrays from config.php file!");
-       } elseif (!$_SESSION['SysPrefs']->db_ok && !$_SESSION["wa_current_user"]->can_access('SA_SOFTWAREUPGRADE')) {
+       } elseif (!$SysPrefs->db_ok && !$_SESSION["wa_current_user"]->can_access('SA_SOFTWAREUPGRADE')) 
+       {
                $msg = _('Access to application has been blocked until database upgrade is completed by system administrator.');
        }
        
@@ -261,7 +273,7 @@ function check_page_security($page_security)
                end_page(@$_REQUEST['popup']);
                exit;
        }
-       if (!$_SESSION['SysPrefs']->db_ok 
+       if (!$SysPrefs->db_ok 
                && !in_array($page_security, array('SA_SOFTWAREUPGRADE', 'SA_OPEN', 'SA_BACKUP')))
        {
                display_error(_('System is blocked after source upgrade until database is updated on System/Software Upgrade page'));
@@ -309,14 +321,25 @@ function strip_quotes($data)
        return $data;
 }
 
+/*
+       htmlspecialchars does not support certain encodings.
+       ISO-8859-2 fortunately has the same special characters positions as 
+       ISO-8859-1, so fix is easy. If any other unsupported encoding is used,
+       add workaround here.
+*/
+function html_specials_encode($str)
+{
+       return htmlspecialchars($str, ENT_QUOTES, $_SESSION['language']->encoding=='iso-8859-2' ?
+                'ISO-8859-1' : $_SESSION['language']->encoding);
+}
+
 function html_cleanup(&$parms)
 {
        foreach($parms as $name => $value) {
-//             $value = @html_entity_decode($value, ENT_QUOTES, $_SESSION['language']->encoding);
                if (is_array($value))
                        html_cleanup($parms[$name]);
                else
-                       $parms[$name] = @htmlspecialchars($value, ENT_QUOTES, $_SESSION['language']->encoding=='iso-8859-2' ? 'ISO-8859-1' : $_SESSION['language']->encoding);
+                       $parms[$name] = html_specials_encode($value);
        }
        reset($parms); // needed for direct key() usage later throughout the sources
 }
@@ -342,16 +365,6 @@ if (!isset($path_to_root))
        $path_to_root = ".";
 }
 
-//----------------------------------------------------------------------------------------
-// set to reasonable values if not set in config file (pre-2.3.12 installations)
-
-if ((!isset($SysPrefs->login_delay)) || ($SysPrefs->login_delay < 0))
-    $SysPrefs->login_delay = 10;
-
-if ((!isset($SysPrefs->login_max_attempts)) || ($SysPrefs->login_max_attempts < 0))
-    $SysPrefs->login_max_attempts = 3; 
-
-
 // Prevent register_globals vulnerability
 if (isset($_GET['path_to_root']) || isset($_POST['path_to_root']))
        die("Restricted access");
@@ -378,11 +391,22 @@ foreach ($installed_extensions as $ext)
        if (file_exists($path_to_root.'/'.$ext['path'].'/hooks.php'))
                include_once($path_to_root.'/'.$ext['path'].'/hooks.php');
 }
+$Session_manager = new SessionManager();
+$Session_manager->sessionStart('FA'.md5(dirname(__FILE__)));
 
 $_SESSION['SysPrefs'] = new sys_prefs();
 
 $SysPrefs = &$_SESSION['SysPrefs'];
 
+//----------------------------------------------------------------------------------------
+// set to reasonable values if not set in config file (pre-2.3.12 installations)
+
+if ((!isset($SysPrefs->login_delay)) || ($SysPrefs->login_delay < 0))
+    $SysPrefs->login_delay = 10;
+
+if ((!isset($SysPrefs->login_max_attempts)) || ($SysPrefs->login_max_attempts < 0))
+    $SysPrefs->login_max_attempts = 3; 
+
 if ($SysPrefs->go_debug > 0)
        error_reporting(-1);
 else
@@ -395,7 +419,6 @@ if ($SysPrefs->error_logfile != '') {
        ini_set("log_errors", "On");
 }
 
-
 /*
        Uncomment the setting below when using FA on shared hosting
        to avoid unexpeced session timeouts.
@@ -407,9 +430,6 @@ ini_set('session.gc_maxlifetime', 36000); // 10hrs
 
 hook_session_start(@$_POST["company_login_name"]);
 
-$Session_manager = new SessionManager();
-$Session_manager->sessionStart('FA'.md5(dirname(__FILE__)));
-
 // this is to fix the "back-do-you-want-to-refresh" issue - thanx PHPFreaks
 header("Cache-control: private");
 
@@ -466,7 +486,7 @@ if (!defined('FA_LOGOUT_PHP_FILE')){
        login_timeout();
 
        if (!$_SESSION["wa_current_user"]->old_db)
-               include_once($path_to_root . '/company/'.user_company().'/installed_extensions.php');
+               include($path_to_root . '/company/'.user_company().'/installed_extensions.php');
 
        install_hooks();
 
@@ -504,8 +524,7 @@ if (!defined('FA_LOGOUT_PHP_FILE')){
                {
                        // strip ajax marker from uri, to force synchronous page reload
                        $_SESSION['timeout'] = array( 'uri'=>preg_replace('/JsHttpRequest=(?:(\d+)-)?([^&]+)/s',
-                                       '', @htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES, $_SESSION['language']->encoding=='iso-8859-2'
-                                                ? 'ISO-8859-1' : $_SESSION['language']->encoding)), 
+                                       '', html_specials_encode($_SERVER['REQUEST_URI'])),
                                'post' => $_POST);
 
                        include($path_to_root . "/access/login.php");
@@ -544,18 +563,20 @@ if (!defined('FA_LOGOUT_PHP_FILE')){
                        $lang->set_language($_SESSION['language']->code);
                }
        } else
-       {       set_global_connection();
-                       if (db_fixed())
-                               db_set_encoding($_SESSION['language']->encoding);
-       }
+       {
+               set_global_connection();
+
+               if (db_fixed())
+                       db_set_encoding($_SESSION['language']->encoding);
 
+               $SysPrefs->refresh();
+       }
        if (!isset($_SESSION["App"])) {
                $_SESSION["App"] = new front_accounting();
                $_SESSION["App"]->init();
        }
 }
 
-
 // POST vars cleanup needed for direct reuse.
 // We quote all values later with db_escape() before db update.
 $_POST = strip_quotes($_POST);