do NOT store user preferences and apps in session, we restore them from instance cache

This commit is contained in:
Ralf Becker 2017-04-04 19:13:06 +02:00
parent 99595ba1cf
commit 2adeddce8d
4 changed files with 60 additions and 33 deletions

View File

@ -12,6 +12,7 @@
*/
namespace EGroupware\Api\Egw;
use EGroupware\Api;
/**
* Application (sub-)object of Egw-object used to load $GLOBALS['egw_info'](['user'])['apps']
@ -19,7 +20,6 @@ namespace EGroupware\Api\Egw;
class Applications
{
var $account_id;
var $data = Array();
/**
* Reference to the global db class
*
@ -62,20 +62,12 @@ class Applications
{
$this->read_installed_apps();
}
$this->data = Array();
if(!$this->account_id)
{
return False;
}
$apps = $GLOBALS['egw']->acl->get_user_applications($this->account_id);
foreach(array_keys($GLOBALS['egw_info']['apps']) as $app)
{
if (isset($apps[$app]) && $apps[$app])
{
$this->data[$app] =& $GLOBALS['egw_info']['apps'][$app];
}
}
return $this->data;
return array_intersect_key($GLOBALS['egw_info']['apps'],
$GLOBALS['egw']->acl->get_user_applications($this->account_id));
}
/**
@ -84,6 +76,9 @@ class Applications
*/
function read_installed_apps()
{
$GLOBALS['egw_info']['apps'] = Api\Cache::getInstance(__CLASS__, 'apps', function()
{
$apps = array();
foreach($this->db->select($this->table_name,'*',false,__LINE__,__FILE__,false,'ORDER BY app_order ASC') as $row)
{
$title = $app_name = $row['app_name'];
@ -92,7 +87,7 @@ class Applications
{
$title = $t;
}
$GLOBALS['egw_info']['apps'][$app_name] = Array(
$apps[$app_name] = Array(
'title' => $title,
'name' => $app_name,
'enabled' => True,
@ -105,5 +100,15 @@ class Applications
'icon_app'=> $row['app_icon_app'],
);
}
return $apps;
});
}
/**
* Invalidate cached apps
*/
public static function invalidate()
{
Api\Cache::unsetInstance(__CLASS__, 'apps');
}
}

View File

@ -959,8 +959,17 @@ class Session
}
else
{
// update prefs, which might be changed by an other session
// set prefs, they are no longer stored in session
$GLOBALS['egw_info']['user']['preferences'] = $GLOBALS['egw']->preferences->read_repository();
// restore apps to $GLOBALS['egw_info']['apps']
$GLOBALS['egw']->applications->read_installed_apps();
// session only stores app-names, restore apps from egw_info[apps]
if (!is_array($GLOBALS['egw_info']['user']['apps']['api']))
{
$GLOBALS['egw_info']['user']['apps'] = array_intersect_key($GLOBALS['egw_info']['apps'], array_flip($GLOBALS['egw_info']['user']['apps']));
}
}
if ($GLOBALS['egw']->accounts->is_expired($GLOBALS['egw_info']['user']))

View File

@ -134,5 +134,14 @@ if ($GLOBALS['egw_info']['flags']['currentapp'] != 'login')
$_SESSION[Session::EGW_INFO_CACHE] = $GLOBALS['egw_info'];
unset($_SESSION[Session::EGW_INFO_CACHE]['flags']); // dont save the flags, they change on each request
// dont save preferences, as Session::verify restores them from instance cache anyway
unset($_SESSION[Session::EGW_INFO_CACHE]['user']['preferences']);
// dont save apps, as Session::verify restores them from instance cache anyway
unset($_SESSION[Session::EGW_INFO_CACHE]['apps']);
// store only which apps user has, Session::verify restores it from egw_info[apps]
$_SESSION[Session::EGW_INFO_CACHE]['user']['apps'] = array_keys($_SESSION[Session::EGW_INFO_CACHE]['user']['apps']);
$_SESSION[Session::EGW_OBJECT_CACHE] = serialize($GLOBALS['egw']);
}

View File

@ -502,7 +502,7 @@ class setup
'app_icon_app' => $setup_info[$appname]['icon_app'],
),False,__LINE__,__FILE__);
$this->clear_session_cache();
Api\Egw\Applications::invalidate();
}
}
@ -582,6 +582,8 @@ class setup
'app_icon' => $setup_info[$appname]['icon'],
'app_icon_app' => $setup_info[$appname]['icon_app'],
),array('app_name'=>$appname),__LINE__,__FILE__);
Api\Egw\Applications::invalidate();
}
}
@ -608,6 +610,8 @@ class setup
$this->db->update($this->applications_table,array(
'app_version' => $setup_info[$appname]['currentver'],
),array('app_name'=>$appname),__LINE__,__FILE__);
Api\Egw\Applications::invalidate();
}
return $setup_info;
}
@ -636,10 +640,10 @@ class setup
//echo 'DELETING application: ' . $appname;
$this->db->delete($this->applications_table,array('app_name'=>$appname),__LINE__,__FILE__);
Api\Egw\Applications::invalidate();
// Remove links to the app
Link::unlink(0, $appname);
$this->clear_session_cache();
}
/**