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; namespace EGroupware\Api\Egw;
use EGroupware\Api;
/** /**
* Application (sub-)object of Egw-object used to load $GLOBALS['egw_info'](['user'])['apps'] * Application (sub-)object of Egw-object used to load $GLOBALS['egw_info'](['user'])['apps']
@ -19,7 +20,6 @@ namespace EGroupware\Api\Egw;
class Applications class Applications
{ {
var $account_id; var $account_id;
var $data = Array();
/** /**
* Reference to the global db class * Reference to the global db class
* *
@ -62,20 +62,12 @@ class Applications
{ {
$this->read_installed_apps(); $this->read_installed_apps();
} }
$this->data = Array();
if(!$this->account_id) if(!$this->account_id)
{ {
return False; return False;
} }
$apps = $GLOBALS['egw']->acl->get_user_applications($this->account_id); return array_intersect_key($GLOBALS['egw_info']['apps'],
foreach(array_keys($GLOBALS['egw_info']['apps']) as $app) $GLOBALS['egw']->acl->get_user_applications($this->account_id));
{
if (isset($apps[$app]) && $apps[$app])
{
$this->data[$app] =& $GLOBALS['egw_info']['apps'][$app];
}
}
return $this->data;
} }
/** /**
@ -84,6 +76,9 @@ class Applications
*/ */
function read_installed_apps() 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) foreach($this->db->select($this->table_name,'*',false,__LINE__,__FILE__,false,'ORDER BY app_order ASC') as $row)
{ {
$title = $app_name = $row['app_name']; $title = $app_name = $row['app_name'];
@ -92,7 +87,7 @@ class Applications
{ {
$title = $t; $title = $t;
} }
$GLOBALS['egw_info']['apps'][$app_name] = Array( $apps[$app_name] = Array(
'title' => $title, 'title' => $title,
'name' => $app_name, 'name' => $app_name,
'enabled' => True, 'enabled' => True,
@ -105,5 +100,15 @@ class Applications
'icon_app'=> $row['app_icon_app'], '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 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(); $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'])) 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']; $_SESSION[Session::EGW_INFO_CACHE] = $GLOBALS['egw_info'];
unset($_SESSION[Session::EGW_INFO_CACHE]['flags']); // dont save the flags, they change on each request 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']); $_SESSION[Session::EGW_OBJECT_CACHE] = serialize($GLOBALS['egw']);
} }

View File

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