1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
28: class Horde_Core_Factory_Prefs extends Horde_Core_Factory_Base
29: {
30: 31: 32: 33: 34:
35: private $_instances = array();
36:
37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
52: public function create($scope = 'horde', array $opts = array())
53: {
54: if (array_key_exists('driver', $opts)) {
55: $driver = $opts['driver'];
56: $params = array();
57: } elseif (empty($GLOBALS['conf']['prefs']['driver'])) {
58: $driver = null;
59: $params = array();
60: } else {
61: $driver = 'Horde_Prefs_Storage_' . ucfirst($GLOBALS['conf']['prefs']['driver']);
62: $params = Horde::getDriverConfig('prefs', $driver);
63: }
64:
65: if (array_key_exists('driver_params', $opts)) {
66: $params = $opts['driver_params'];
67: }
68:
69: $opts = array_merge(array(
70: 'cache' => true,
71: 'logger' => $this->_injector->getInstance('Horde_Log_Logger'),
72: 'password' => '',
73: 'sizecallback' => ((isset($GLOBALS['conf']['prefs']['maxsize'])) ? array($this, 'sizeCallback') : null),
74: 'user' => ''
75: ), $opts);
76:
77: 78:
79: if (!empty($params['user_hook']) &&
80: function_exists($params['user_hook'])) {
81: $opts['user'] = call_user_func($params['user_hook'], $opts['user']);
82: }
83:
84: 85:
86: $sig_opts = array_merge($opts, array(
87: 'logger' => get_class($opts['logger']),
88: 'sizecallback' => !is_null($opts['sizecallback'])
89: ));
90: ksort($sig_opts);
91: $sig = hash('md5', serialize($sig_opts));
92:
93: if (isset($this->_instances[$sig])) {
94: $this->_instances[$sig]->retrieve($scope);
95: return $this->_instances[$sig];
96: }
97:
98: try {
99: switch ($driver) {
100: case 'Horde_Prefs_Storage_Ldap':
101: $params['ldap'] = $this->_injector
102: ->getInstance('Horde_Core_Factory_Ldap')
103: ->create('horde', 'ldap');
104: break;
105:
106: case 'Horde_Prefs_Storage_Session':
107: $driver = 'Horde_Prefs_Storage_Null';
108: break;
109:
110: case 'Horde_Prefs_Storage_Sql':
111: $params['db'] = $this->_injector
112: ->getInstance('Horde_Db_Adapter');
113: break;
114: case 'Horde_Prefs_Storage_KolabImap':
115: if ($GLOBALS['registry']->isAdmin()) {
116: throw new Horde_Exception('The IMAP based Kolab preferences backend is unavailable for system administrators.');
117: }
118: $params['kolab'] = $this->_injector
119: ->getInstance('Horde_Kolab_Storage');
120: $params['logger'] = $opts['logger'];
121: break;
122: case 'Horde_Prefs_Storage_Imsp':
123: $imspParams = $GLOBALS['conf']['imsp'];
124: $imspParams['username'] = $GLOBALS['registry']->getAuth('bare');
125: $imspParams['password'] = $GLOBALS['registry']->getAuthCredential('password');
126: $params['imsp'] = $this->_injector
127: ->getInstance('Horde_Core_Factory_Imsp')->create('Options', $imspParams);
128: }
129: $driverOb = new $driver($opts['user'], $params);
130: } catch (Horde_Exception $e) {
131: $this->_notifyError($e);
132: $driver = 'Horde_Prefs_Storage_Null';
133: $driverOb = new $driver($opts['user'], $params);
134: $opts['cache'] = false;
135: }
136:
137: $config_driver = new Horde_Core_Prefs_Storage_Configuration($opts['user']);
138: $hooks_driver = new Horde_Core_Prefs_Storage_Hooks($opts['user'], array('conf_ob' => $config_driver));
139:
140: $drivers = $driver
141: ? array($config_driver, $driverOb, $hooks_driver)
142: : array($config_driver, $hooks_driver);
143:
144: if ($driver && $opts['cache']) {
145: $opts['cache'] = new Horde_Core_Prefs_Cache_Session($opts['user']);
146: } else {
147: unset($opts['cache']);
148: }
149:
150: try {
151: $this->_instances[$sig] = new Horde_Prefs($scope, $drivers, $opts);
152: } catch (Horde_Prefs_Exception $e) {
153: $this->_notifyError($e);
154:
155:
156: $opts['cache'] = new Horde_Core_Prefs_Cache_Session($opts['user']);
157: $this->_instances[$sig] = new Horde_Prefs($scope, array($config_driver, $hooks_driver), $opts);
158: }
159:
160: return $this->_instances[$sig];
161: }
162:
163: 164: 165: 166: 167: 168:
169: protected function _notifyError($e)
170: {
171: if (!$GLOBALS['session']->get('horde', 'no_prefs')) {
172: $GLOBALS['session']->set('horde', 'no_prefs', true);
173: if (isset($GLOBALS['notification'])) {
174: $GLOBALS['notification']->push(Horde_Core_Translation::t("The preferences backend is currently unavailable and your preferences have not been loaded. You may continue to use the system with default preferences."));
175: Horde::logMessage($e);
176: }
177: }
178: }
179:
180: 181: 182:
183: public function clearCache()
184: {
185: $this->_instances = array();
186: }
187:
188: 189: 190: 191: 192: 193: 194: 195:
196: public function sizeCallback($pref, $size)
197: {
198: if ($size <= $GLOBALS['conf']['prefs']['maxsize']) {
199: return false;
200: }
201:
202: $GLOBALS['notification']->push(sprintf(Horde_Core_Translation::t("The preference \"%s\" could not be saved because its data exceeds the maximum allowable size"), $pref), 'horde.error');
203: return true;
204: }
205:
206: }
207: