public function init_presets() { $dbh = rcmail::get_instance()->db; $prefs = carddav_common::get_adminsettings(); // migrate old settings carddav_backend::migrateconfig(); // read existing presets from DB $sql_result = $dbh->query('SELECT * FROM ' . get_table_name('carddav_addressbooks') . ' WHERE user_id=? AND presetname is not null', $_SESSION['user_id']); $existing_presets = array(); while ($abookrow = $dbh->fetch_assoc($sql_result)) { $pn = $abookrow['presetname']; if (!array_key_exists($pn, $existing_presets)) { $existing_presets[$pn] = array(); } $existing_presets[$pn][] = $abookrow; } // add not existing preset addressbooks foreach ($prefs as $presetname => $preset) { if ($presetname === '_GLOBAL') { continue; } // addressbooks exist for this preset => update settings if (array_key_exists($presetname, $existing_presets)) { if (is_array($preset['fixed'])) { // update all existing addressbooks for this preset foreach ($existing_presets[$presetname] as $abookrow) { // decrypt password so that the comparison works $abookrow['password'] = self::$helper->decrypt_password($abookrow['password']); // update: only admin fix keys, only if it's fixed // otherwise there may be user changes that should not be destroyed $pa = array(); foreach ($preset['fixed'] as $k) { if (array_key_exists($k, $abookrow) && array_key_exists($k, $preset)) { // only update the name if it is used if ($k === 'name') { if (!$preset['carddav_name_only']) { $fullname = $abookrow['name']; $cnpos = strpos($fullname, ' ('); if ($cnpos === FALSE && strcmp($preset['name'], $fullname) !== 0) { $pa['name'] = $preset['name']; } else { if ($cnpos !== FALSE && strcmp($preset['name'], substr($fullname, 0, $cnpos)) !== 0) { $pa['name'] = $preset['name'] . substr($fullname, $cnpos); } } } } else { if ($abookrow[$k] != $preset[$k]) { $pa[$k] = $preset[$k]; } } } } // only update if something changed if (count($pa) === 0) { continue; } self::update_abook($abookrow['id'], $pa); } } unset($existing_presets[$presetname]); } else { // create new $preset['presetname'] = $presetname; $preset['password'] = self::$helper->encrypt_password($preset['password']); $abname = $preset['name']; $discovery = new carddav_discovery(); $srvs = $discovery->find_addressbooks($preset['url'], $preset['username'], $preset['password']); if (is_array($srvs)) { foreach ($srvs as $srv) { if ($srv[name]) { if ($preset[carddav_name_only]) { $preset['name'] = $srv[name]; } else { $preset['name'] = "{$abname} (" . $srv[name] . ')'; } } else { $preset['name'] = $abname; } $preset['url'] = $srv['href']; self::insert_abook($preset); } } } } // delete existing preset addressbooks that where removed by admin foreach ($existing_presets as $ep) { foreach ($ep as $abookrow) { self::delete_abook($abookrow['id']); } } }