- config is now cached on instance level

- arrays in $GLOBALS[egw_info][server] are now automatically serialized and unserialized
- new static method to check if user is export-limit excepted
--> saves to query it on each request (for non-phpgwapi, which was already cached in the session)
This commit is contained in:
Ralf Becker 2011-08-26 13:50:20 +00:00
parent 7d33eb610a
commit 389486793d
8 changed files with 87 additions and 65 deletions

View File

@ -291,7 +291,8 @@ class addressbook_bo extends addressbook_so
} }
if ($GLOBALS['egw_info']['server']['org_fileds_to_update']) if ($GLOBALS['egw_info']['server']['org_fileds_to_update'])
{ {
$this->org_fields = unserialize($GLOBALS['egw_info']['server']['org_fileds_to_update']); $this->org_fields = $GLOBALS['egw_info']['server']['org_fileds_to_update'];
if (!is_array($this->org_fields)) $this->org_fields = unserialize($this->org_fields);
// Set country code if country name is selected // Set country code if country name is selected
$supported_fields = $this->get_fields('supported',null,0); $supported_fields = $this->get_fields('supported',null,0);
@ -308,8 +309,7 @@ class addressbook_bo extends addressbook_so
$this->tracking = new addressbook_tracking($this); $this->tracking = new addressbook_tracking($this);
$config = config::read('phpgwapi'); $this->delete_history = $GLOBALS['egw_info']['server']['history'];
$this->delete_history = $config['history'];
} }
/** /**

View File

@ -93,7 +93,8 @@ class addressbook_ui extends addressbook_bo
{ {
$this->config['contact_export_limit'] = $this->config['export_limit']; $this->config['contact_export_limit'] = $this->config['export_limit'];
} }
if ($this->config['copy_fields'] && ($fields = unserialize($this->config['copy_fields']))) if ($this->config['copy_fields'] && ($fields = is_array($this->config['copy_fields']) ?
$this->config['copy_fields'] : unserialize($this->config['copy_fields'])))
{ {
// Set country code if country name is selected // Set country code if country name is selected
$supported_fields = $this->get_fields('supported',null,0); $supported_fields = $this->get_fields('supported',null,0);

View File

@ -83,7 +83,6 @@ abstract class bo_merge
*/ */
public static function hook_export_limit_excepted($config) public static function hook_export_limit_excepted($config)
{ {
error_log(__METHOD__.'('.array2string($config).')');
$accountsel = new uiaccountsel(); $accountsel = new uiaccountsel();
return $accountsel->selection('newsettings[export_limit_excepted]','export_limit_excepted',$config['export_limit_excepted'],'both',4); return $accountsel->selection('newsettings[export_limit_excepted]','export_limit_excepted',$config['export_limit_excepted'],'both',4);
@ -295,6 +294,33 @@ abstract class bo_merge
return egw_time::to($time,$format); return egw_time::to($time,$format);
} }
/**
* Checks if current user is excepted from the export-limit:
* a) access to admin application
* b) he or one of his memberships is named in export_limit_excepted config var
*
* @return boolean
*/
public static function is_export_limit_excepted()
{
static $is_excepted;
if (is_null($is_excepted))
{
$is_excepted = isset($GLOBALS['egw_info']['user']['apps']['admin']);
// check export-limit and fail if user tries to export more entries then allowed
if (!$is_excepted && (is_array($export_limit_excepted = $GLOBALS['egw_info']['server']['export_limit_excepted']) ||
is_array($export_limit_excepted = unserialize($export_limit_excepted))))
{
$id_and_memberships = $GLOBALS['egw']->accounts->memberships($GLOBALS['egw_info']['user']['account_id'],true);
$id_and_memberships[] = $GLOBALS['egw_info']['user']['account_id'];
$is_excepted = (bool) array_intersect($id_and_memberships, $export_limit_excepted);
}
}
return $is_excepted;
}
/** /**
* Merges a given document with contact data * Merges a given document with contact data
* *
@ -313,10 +339,7 @@ abstract class bo_merge
return false; return false;
} }
// check export-limit and fail if user tries to export more entries then allowed if ($this->export_limit && !self::is_export_limit_excepted() && count($ids) > (int)$this->export_limit)
$limit_exception = count(@array_intersect(array($GLOBALS['egw_info']['user']['account_id']) + $GLOBALS['egw']->accounts->memberships($GLOBALS['egw_info']['user']['account_id'],true), unserialize($GLOBALS['egw_info']['server']['export_limit_excepted']))) > 0;
if ($this->export_limit && !($GLOBALS['egw_info']['user']['apps']['admin'] || $limit_exception) &&
count($ids) > (int)$this->export_limit)
{ {
$err = lang('No rights to export more then %1 entries!',(int)$this->export_limit); $err = lang('No rights to export more then %1 entries!',(int)$this->export_limit);
return false; return false;
@ -1182,14 +1205,12 @@ abstract class bo_merge
} }
} }
} }
$limit_exception = count(@array_intersect(array($GLOBALS['egw_info']['user']['account_id']) + $GLOBALS['egw']->accounts->memberships($GLOBALS['egw_info']['user']['account_id'],true), unserialize($GLOBALS['egw_info']['server']['export_limit_excepted']))) > 0;
return array( return array(
'icon' => 'etemplate/merge', 'icon' => 'etemplate/merge',
'caption' => $caption, 'caption' => $caption,
'children' => $documents, 'children' => $documents,
// disable action if no document or export completly forbidden for non-admins // disable action if no document or export completly forbidden for non-admins
'enabled' => (boolean)$documents && (empty($export_limit) || 'enabled' => (boolean)$documents && (empty($export_limit) || (int)$export_limit > 0 || self::is_export_limit_excepted()),
(int)$export_limit > 0 || $GLOBALS['egw_info']['user']['apps']['admin'] || $limit_exception),
'hideOnDisabled' => true, // do not show 'Insert in document', if no documents defined or no export allowed 'hideOnDisabled' => true, // do not show 'Insert in document', if no documents defined or no export allowed
'group' => $group, 'group' => $group,
); );

View File

@ -276,10 +276,9 @@ class nextmatch_widget
unset($value['rows']); unset($value['rows']);
$extension_data += $value; $extension_data += $value;
$limit_exception = count(@array_intersect(array($GLOBALS['egw_info']['user']['account_id']) + $GLOBALS['egw']->accounts->memberships($GLOBALS['egw_info']['user']['account_id'],true), unserialize($GLOBALS['egw_info']['server']['export_limit_excepted']))) > 0;
$value['no_csv_export'] = $value['csv_fields'] === false || $value['no_csv_export'] = $value['csv_fields'] === false ||
$GLOBALS['egw_info']['server']['export_limit'] && !is_numeric($GLOBALS['egw_info']['server']['export_limit']) && $GLOBALS['egw_info']['server']['export_limit'] && !is_numeric($GLOBALS['egw_info']['server']['export_limit']) &&
!(isset($GLOBALS['egw_info']['user']['apps']['admin']) || $limit_exception); !bo_merge::is_export_limit_excepted();
if (!$value['filter_onchange']) $value['filter_onchange'] = 'this.form.submit();'; if (!$value['filter_onchange']) $value['filter_onchange'] = 'this.form.submit();';
if (!$value['filter2_onchange']) $value['filter2_onchange'] = 'this.form.submit();'; if (!$value['filter2_onchange']) $value['filter2_onchange'] = 'this.form.submit();';
@ -1448,8 +1447,7 @@ class nextmatch_widget
*/ */
static public function csv_export(&$value,$separator=';') static public function csv_export(&$value,$separator=';')
{ {
$limit_exception = count(array_intersect(array($GLOBALS['egw_info']['user']['account_id']) + $GLOBALS['egw']->accounts->memberships($GLOBALS['egw_info']['user']['account_id'],true), unserialize($GLOBALS['egw_info']['server']['export_limit_excepted']))) > 0; if (!bo_merge::is_export_limit_excepted())
if (!(isset($GLOBALS['egw_info']['user']['apps']['admin']) || $limit_exception))
{ {
$export_limit = $GLOBALS['egw_info']['server']['export_limit']; $export_limit = $GLOBALS['egw_info']['server']['export_limit'];
//if (isset($value['export_limit'])) $export_limit = $value['export_limit']; //if (isset($value['export_limit'])) $export_limit = $value['export_limit'];

View File

@ -31,7 +31,7 @@ class config
* *
* @var array * @var array
*/ */
static private $configs = array(); static private $configs;
/** /**
* app the particular config class is instanciated for * app the particular config class is instanciated for
@ -82,16 +82,12 @@ class config
*/ */
function save_repository() function save_repository()
{ {
if (!is_object(self::$db))
{
self::init_db();
}
if (is_array($this->config_data)) if (is_array($this->config_data))
{ {
self::$db->lock(array(config::TABLE)); self::$db->lock(array(config::TABLE));
foreach($this->config_data as $name => $value) foreach($this->config_data as $name => $value)
{ {
$this->save_value($name,$value); $this->save_value($name,$value,null,false);
} }
foreach(self::$configs[$this->appname] as $name => $value) foreach(self::$configs[$this->appname] as $name => $value)
{ {
@ -107,6 +103,8 @@ class config
$GLOBALS['egw']->invalidate_session_cache(); // in case egw_info is cached in the session (phpgwapi is in egw_info[server]) $GLOBALS['egw']->invalidate_session_cache(); // in case egw_info is cached in the session (phpgwapi is in egw_info[server])
} }
self::$configs[$this->appname] = $this->config_data; self::$configs[$this->appname] = $this->config_data;
egw_cache::setInstance(__CLASS__, 'configs', self::$configs);
} }
} }
@ -119,7 +117,7 @@ class config
* @param mixed $value content, empty or null values are not saved, but deleted * @param mixed $value content, empty or null values are not saved, but deleted
* @param string $app=null app-name, defaults to $this->appname set via the constructor * @param string $app=null app-name, defaults to $this->appname set via the constructor
*/ */
/* static */ function save_value($name,$value,$app=null) /* static */ function save_value($name,$value,$app=null,$update_cache=true)
{ {
if (!$app && (!isset($this) || !is_a($this,__CLASS__))) if (!$app && (!isset($this) || !is_a($this,__CLASS__)))
{ {
@ -131,6 +129,10 @@ class config
$app = $this->appname; $app = $this->appname;
$this->config_data[$name] = $value; $this->config_data[$name] = $value;
} }
if (!isset(self::$configs))
{
self::init_static();
}
//echo "<p>config::save_value('$name','".print_r($value,True)."','$app')</p>\n"; //echo "<p>config::save_value('$name','".print_r($value,True)."','$app')</p>\n";
if (isset(self::$configs[$app][$name]) && self::$configs[$app][$name] === $value) if (isset(self::$configs[$app][$name]) && self::$configs[$app][$name] === $value)
{ {
@ -145,16 +147,18 @@ class config
{ {
$value = serialize($value); $value = serialize($value);
} }
if (!is_object(self::$db))
{
self::init_db();
}
if (!isset($value) || $value === '') if (!isset($value) || $value === '')
{ {
if (isset(self::$configs[$app])) unset(self::$configs[$app][$name]); if (isset(self::$configs[$app])) unset(self::$configs[$app][$name]);
return self::$db->delete(config::TABLE,array('config_app'=>$app,'config_name'=>$name),__LINE__,__FILE__); $ok = self::$db->delete(config::TABLE,array('config_app'=>$app,'config_name'=>$name),__LINE__,__FILE__);
} }
return self::$db->insert(config::TABLE,array('config_value'=>$value),array('config_app'=>$app,'config_name'=>$name),__LINE__,__FILE__); else
{
$ok = self::$db->insert(config::TABLE,array('config_value'=>$value),array('config_app'=>$app,'config_name'=>$name),__LINE__,__FILE__);
}
if ($update_cache) egw_cache::setInstance(__CLASS__, 'configs', self::$configs);
return $ok;
} }
/** /**
@ -163,13 +167,14 @@ class config
*/ */
function delete_repository() function delete_repository()
{ {
if (!is_object(self::$db)) if (!isset(self::$configs))
{ {
self::init_db(); self::init_static();
} }
self::$db->delete(config::TABLE,array('config_app' => $this->appname),__LINE__,__FILE__); self::$db->delete(config::TABLE,array('config_app' => $this->appname),__LINE__,__FILE__);
unset(self::$configs[$this->appname]); unset(self::$configs[$this->appname]);
egw_cache::setInstance(__CLASS__, 'configs', self::$configs);
} }
/** /**
@ -203,31 +208,11 @@ class config
*/ */
static function read($app) static function read($app)
{ {
$config =& self::$configs[$app]; if (!isset(self::$configs))
if (!isset($config))
{ {
if (!is_object(self::$db)) self::init_static();
{
self::init_db();
} }
$config = array(); return self::$configs[$app];
foreach(self::$db->select(config::TABLE,'*',array('config_app' => $app),__LINE__,__FILE__) as $row)
{
$name = $row['config_name'];
$value = $row['config_value'];
$test = @unserialize($value);
if($test === false)
{
// manually retrieve the string lengths of the serialized array if unserialize failed
$test = @unserialize(preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.mb_strlen('$2','8bit').':\"$2\";'", $value));
}
$config[$name] = is_array($test) ? $test : $value;
}
}
return $config;
} }
/** /**
@ -300,7 +285,7 @@ class config
* We use a reference here (no clone), as we no longer use egw_db::row() or egw_db::next_record()! * We use a reference here (no clone), as we no longer use egw_db::row() or egw_db::next_record()!
* *
*/ */
private static function init_db() private static function init_static()
{ {
if (is_object($GLOBALS['egw']->db)) if (is_object($GLOBALS['egw']->db))
{ {
@ -310,5 +295,24 @@ class config
{ {
config::$db = $GLOBALS['egw_setup']->db; config::$db = $GLOBALS['egw_setup']->db;
} }
if (!(self::$configs = egw_cache::getInstance(__CLASS__, 'configs')))
{
self::$configs = array();
foreach(self::$db->select(config::TABLE,'*',false,__LINE__,__FILE__) as $row)
{
$app = $row['config_app'];
$name = $row['config_name'];
$value = $row['config_value'];
$test = @unserialize($value);
if($test === false)
{
// manually retrieve the string lengths of the serialized array if unserialize failed
$test = @unserialize(preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.mb_strlen('$2','8bit').':\"$2\";'", $value));
}
self::$configs[$app][$name] = is_array($test) ? $test : $value;
}
egw_cache::setInstance(__CLASS__, 'configs', self::$configs);
}
} }
} }

View File

@ -118,7 +118,7 @@ class egw extends egw_minimal
exit; exit;
} }
// Set the DB's client charset if a system-charset is set // Set the DB's client charset if a system-charset is set
$system_charset = $this->db->select(config::TABLE,'config_value',array( $system_charset = $GLOBALS['egw_info']['server']['system_charset'] = $this->db->select(config::TABLE,'config_value',array(
'config_app' => 'phpgwapi', 'config_app' => 'phpgwapi',
'config_name' => 'system_charset', 'config_name' => 'system_charset',
),__LINE__,__FILE__)->fetchColumn(); ),__LINE__,__FILE__)->fetchColumn();
@ -127,11 +127,7 @@ class egw extends egw_minimal
$this->db->Link_ID->SetCharSet($system_charset); $this->db->Link_ID->SetCharSet($system_charset);
} }
// load up the $GLOBALS['egw_info']['server'] array // load up the $GLOBALS['egw_info']['server'] array
foreach($this->db->select(config::TABLE,'*',array('config_app' => 'phpgwapi'),__LINE__,__FILE__) as $row) $GLOBALS['egw_info']['server'] += config::read('phpgwapi');
{
$GLOBALS['egw_info']['server'][$row['config_name']] = $row['config_value'];
}
//$GLOBALS['egw_info']['server'] = config::read('phpgwapi'); would unserialize arrays
// if no server timezone set, use date_default_timezone_get() to determine it once // if no server timezone set, use date_default_timezone_get() to determine it once
// it fills to log with deprecated warnings under 5.3 otherwise // it fills to log with deprecated warnings under 5.3 otherwise

View File

@ -456,9 +456,11 @@ class egw_cache
{ {
if(!isset($GLOBALS['egw_info']['server'][$name])) if(!isset($GLOBALS['egw_info']['server'][$name]))
{ {
if (isset($GLOBALS['egw_setup']) && isset($GLOBALS['egw_setup']->db)) if (isset($GLOBALS['egw_setup']) && isset($GLOBALS['egw_setup']->db) || $GLOBALS['egw']->db)
{ {
$GLOBALS['egw_info']['server'][$name] = $GLOBALS['egw_setup']->db->select(config::TABLE,'config_value',array( $db = $GLOBALS['egw']->db ? $GLOBALS['egw']->db : $GLOBALS['egw_setup']->db;
$GLOBALS['egw_info']['server'][$name] = $db->select(config::TABLE,'config_value',array(
'config_app' => 'phpgwapi', 'config_app' => 'phpgwapi',
'config_name' => $name, 'config_name' => $name,
),__LINE__,__FILE__)->fetchColumn(); ),__LINE__,__FILE__)->fetchColumn();

View File

@ -1212,8 +1212,8 @@ class vfs_stream_wrapper implements iface_stream_wrapper
{ {
stream_register_wrapper(self::SCHEME,__CLASS__); stream_register_wrapper(self::SCHEME,__CLASS__);
if ($GLOBALS['egw_info']['server']['vfs_fstab'] && if (($fstab = $GLOBALS['egw_info']['server']['vfs_fstab']) &&
is_array($fstab = unserialize($GLOBALS['egw_info']['server']['vfs_fstab'])) && count($fstab)) (is_array($fstab) || is_array($fstab = unserialize($fstab))) && count($fstab))
{ {
self::$fstab = $fstab; self::$fstab = $fstab;
} }