Beispiel #1
0
 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']);
         }
     }
 }