/** * Return an Sam_Driver_Base instance. * * @return Sam_Driver_Base * @throws Sam_Exception */ public function create(Horde_Injector $injector) { $backend = Sam::getPreferredBackend(); $signature = hash('md5', serialize($backend)); if (empty($this->_instances[$signature])) { $user = Sam::mapUser($backend['hordeauth']); switch ($backend['driver']) { case 'Amavisd_Sql': case 'Spamd_Sql': $db_params = array_merge(Horde::getDriverConfig(null, 'sql'), $backend['params']); unset($db_params['table_map']); try { $db = $injector->getInstance('Horde_Core_Factory_Db')->create('sam', $db_params); } catch (Horde_Exception $e) { throw new Sam_Exception($e); } $params = array_merge($backend['params'], array('db' => $db)); break; case 'Spamd_Ldap': $params = array_merge(array('binddn' => sprintf('%s=%s,%s', $backend['params']['uid'], $user, $backend['params']['basedn']), 'bindpw' => $GLOBALS['registry']->getAuthCredential('password')), $backend['params']); try { $ldap = $injector->getInstance('Horde_Core_Factory_Ldap')->create('sam', $params); } catch (Horde_Exception $e) { throw new Sam_Exception($e); } $params = array_merge($backend['params'], array('ldap' => $ldap)); break; case 'Spamd_Ftp': $params = array_merge(array('username' => $user, 'password' => $GLOBALS['registry']->getAuthCredential('password')), $backend['params']); try { $vfs = $injector->getInstance('Horde_Core_Factory_Vfs')->create('sam', array('type' => 'ftp', 'params' => $params)); } catch (Horde_Exception $e) { throw new Sam_Exception($e); } $params = array_merge($backend['params'], array('vfs' => $vfs)); break; default: $params = $backend['params']; break; } $class = 'Sam_Driver_' . $backend['driver']; $this->_instances[$signature] = new $class($user, $params); } return $this->_instances[$signature]; }
public function __construct($vars) { parent::__construct($vars, _("Spam Options")); $this->setButtons(_("Save"), true); try { $sam_driver = $GLOBALS['injector']->getInstance('Sam_Driver'); } catch (Sam_Exception $e) { return; } foreach (Sam::getAttributes() as $key => $attribute) { if (!Sam::infoAttribute($attribute['type']) && !$sam_driver->hasCapability($key)) { continue; } $var = $this->addVariable($attribute['label'], $key, $attribute['type'], !empty($attribute['required']), !empty($attribute['readonly']), isset($attribute['description']) ? $attribute['description'] : null, isset($attribute['params']) ? $attribute['params'] : array()); $var->setHelp($key); if (isset($attribute['default'])) { $var->setDefault($attribute['default']); } if ($vars->exists($key)) { continue; } if (isset($attribute['basepref'])) { /* If basepref is set, key is one of multiple multiple possible * entries for basepref. Get all basepref entries from * backend. */ $value = $sam_driver->getListOption($attribute['basepref']); /* Split entries into individual elements */ $elements = preg_split('/\\n/', $value, -1, PREG_SPLIT_NO_EMPTY); foreach ($elements as $element) { /* Split element into subtype and data e.g. 'Subject' and * '***SPAM***' */ $pref = explode(' ', $element); /* Find right subtype entry for this key */ if (isset($pref[0]) && $pref[0] == $attribute['subtype']) { if (isset($pref[1])) { /* Set value for key to just the data */ $vars->set($key, $pref[1]); } else { $vars->set($key, ''); } break; } } } else { $value = $sam_driver->getOption($key); if (!is_null($value)) { if ($attribute['type'] == 'boolean') { $boolean = $sam_driver->optionToBoolean($value); $vars->set($key, $boolean); } else { $vars->set($key, $value); } } } } if ($sam_driver->hasCapability('global_defaults') && $GLOBALS['registry']->isAdmin()) { $this->addVariable('', '', 'spacer', false); $var = $this->addVariable(_("Make Settings Global"), 'global_defaults', 'boolean', false); $var->setHelp('global_defaults'); } }
if ($form->isSubmitted() && $vars->exists('global_defaults') && $vars->get('global_defaults')) { if (!$registry->isAdmin()) { $notification->push(_("Only an administrator may change the global defaults."), 'horde.error'); $vars->remove('global_defaults'); $form->setSubmitted(false); } elseif (!$sam_driver->hasCapability('global_defaults')) { $notification->push(_("The configured backend does not support global defaults."), 'horde.error'); $vars->remove('global_defaults'); $form->setSubmitted(false); } else { $defaults = true; } } if ($form->validate($vars)) { $stackedOptions = array(); foreach (Sam::getAttributes() as $key => $attribute) { if ($sam_driver->hasCapability($key) && $vars->exists($key)) { $data = $vars->get($key); if (isset($attribute['basepref'])) { /* SA docs claim that a null value for a rewrite string merely * removes any previous changes to the specified header. This * should be harmless, and saves needing to add a DELETE * preference call in the backend when the user doesn't use * header rewrites. */ /* Build string with all basepref entries, separated by * newlines */ if (!isset($stackedOptions[$attribute['basepref']])) { $stackedOptions[$attribute['basepref']] = ''; } else { $stackedOptions[$attribute['basepref']] .= "\n"; }