/**
  * syncronize user from syncbackend to local sql backend
  * 
  * @param  mixed  $username  the login id of the user to synchronize
  * @param  array $options
  * @return Tinebase_Model_FullUser
  * @throws Tinebase_Exception
  * 
  * @todo make use of dbmail plugin configurable (should be false by default)
  * @todo switch to new primary group if it could not be found
  * @todo write a test and refactor this ... :(
  */
 public static function syncUser($username, $options = array())
 {
     if ($username instanceof Tinebase_Model_FullUser) {
         $username = $username->accountLoginName;
     }
     if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
         Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . "  sync user data for: " . $username);
     }
     $userBackend = Tinebase_User::getInstance();
     if (isset($options['ldapplugins']) && is_array($options['ldapplugins'])) {
         foreach ($options['ldapplugins'] as $plugin) {
             $userBackend->registerLdapPlugin($plugin);
         }
     }
     $user = $userBackend->getUserByPropertyFromSyncBackend('accountLoginName', $username, 'Tinebase_Model_FullUser');
     $user->accountPrimaryGroup = Tinebase_Group::getInstance()->resolveGIdNumberToUUId($user->accountPrimaryGroup);
     $userProperties = method_exists($userBackend, 'getLastUserProperties') ? $userBackend->getLastUserProperties() : array();
     $hookResult = self::_syncUserHook($user, $userProperties);
     if (!$hookResult) {
         return null;
     }
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($user->toArray(), TRUE));
     }
     self::getPrimaryGroupForUser($user);
     try {
         $currentUser = $userBackend->getUserByProperty('accountId', $user, 'Tinebase_Model_FullUser');
         $currentUser->accountLoginName = $user->accountLoginName;
         $currentUser->accountLastPasswordChange = $user->accountLastPasswordChange;
         $currentUser->accountExpires = $user->accountExpires;
         $currentUser->accountPrimaryGroup = $user->accountPrimaryGroup;
         $currentUser->accountDisplayName = $user->accountDisplayName;
         $currentUser->accountLastName = $user->accountLastName;
         $currentUser->accountFirstName = $user->accountFirstName;
         $currentUser->accountFullName = $user->accountFullName;
         $currentUser->accountEmailAddress = $user->accountEmailAddress;
         $currentUser->accountHomeDirectory = $user->accountHomeDirectory;
         $currentUser->accountLoginShell = $user->accountLoginShell;
         if (!empty($user->visibility) && $currentUser->visibility !== $user->visibility) {
             $currentUser->visibility = $user->visibility;
             if (empty($currentUser->contact_id) && $currentUser->visibility == Tinebase_Model_FullUser::VISIBILITY_DISPLAYED) {
                 self::createContactForSyncedUser($currentUser);
             }
         }
         Tinebase_Timemachine_ModificationLog::setRecordMetaData($currentUser, 'update');
         $syncedUser = $userBackend->updateUserInSqlBackend($currentUser);
         if (!empty($user->container_id)) {
             $syncedUser->container_id = $user->container_id;
         }
         $userBackend->updatePluginUser($syncedUser, $user);
     } catch (Tinebase_Exception_NotFound $ten) {
         try {
             $invalidUser = $userBackend->getUserByPropertyFromSqlBackend('accountLoginName', $username, 'Tinebase_Model_FullUser');
             if (Tinebase_Core::isLogLevel(Zend_Log::CRIT)) {
                 Tinebase_Core::getLogger()->crit(__METHOD__ . '::' . __LINE__ . " Remove invalid user: " . $username);
             }
             $userBackend->deleteUserInSqlBackend($invalidUser);
         } catch (Tinebase_Exception_NotFound $ten) {
             // do nothing
         }
         if ($user->visibility !== Tinebase_Model_FullUser::VISIBILITY_HIDDEN) {
             self::createContactForSyncedUser($user);
         }
         Tinebase_Timemachine_ModificationLog::setRecordMetaData($user, 'create');
         $syncedUser = $userBackend->addUserInSqlBackend($user);
         $userBackend->addPluginUser($syncedUser, $user);
     }
     self::syncContactData($syncedUser, $options);
     // sync group memberships
     Tinebase_Group::syncMemberships($syncedUser);
     return $syncedUser;
 }
Exemple #2
0
 /**
  * syncronize user from syncbackend to local sql backend
  * 
  * @param  mixed  $_username  the login id of the user to synchronize
  * return Tinebase_Model_FullUser
  */
 public static function syncUser($_username, $_syncContactData = false)
 {
     if ($_username instanceof Tinebase_Model_FullUser) {
         $username = $_username->accountLoginName;
     } else {
         $username = $_username;
     }
     Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . "  sync user data for: " . $username);
     $userBackend = Tinebase_User::getInstance();
     $groupBackend = Tinebase_Group::getInstance();
     $user = $userBackend->getUserByPropertyFromSyncBackend('accountLoginName', $username, 'Tinebase_Model_FullUser');
     $user->accountPrimaryGroup = $groupBackend->resolveGIdNumberToUUId($user->accountPrimaryGroup);
     // make sure primary group exists
     try {
         $group = $groupBackend->getGroupById($user->accountPrimaryGroup);
     } catch (Tinebase_Exception_Record_NotDefined $tern) {
         $group = $groupBackend->getGroupByIdFromSyncBackend($user->accountPrimaryGroup);
         try {
             $sqlGgroup = $groupBackend->getGroupByName($group->name);
             throw new Tinebase_Exception('Group already exists but it has a different ID: ' . $group->name);
         } catch (Tinebase_Exception_Record_NotDefined $tern) {
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                 Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Adding group " . $group->name);
             }
             $group = $groupBackend->addGroupInSqlBackend($group);
         }
     }
     try {
         $currentUser = $userBackend->getUserByProperty('accountId', $user, 'Tinebase_Model_FullUser');
         $currentUser->accountLoginName = $user->accountLoginName;
         $currentUser->accountLastPasswordChange = $user->accountLastPasswordChange;
         $currentUser->accountExpires = $user->accountExpires;
         $currentUser->accountPrimaryGroup = $user->accountPrimaryGroup;
         $currentUser->accountDisplayName = $user->accountDisplayName;
         $currentUser->accountLastName = $user->accountLastName;
         $currentUser->accountFirstName = $user->accountFirstName;
         $currentUser->accountFullName = $user->accountFullName;
         $currentUser->accountEmailAddress = $user->accountEmailAddress;
         $currentUser->accountHomeDirectory = $user->accountHomeDirectory;
         $currentUser->accountLoginShell = $user->accountLoginShell;
         $user = $userBackend->updateUserInSqlBackend($currentUser);
     } catch (Tinebase_Exception_NotFound $ten) {
         try {
             $invalidUser = $userBackend->getUserByPropertyFromSqlBackend('accountLoginName', $username, 'Tinebase_Model_FullUser');
             if (Tinebase_Core::isLogLevel(Zend_Log::CRIT)) {
                 Tinebase_Core::getLogger()->crit(__METHOD__ . '::' . __LINE__ . " remove invalid user: " . $username);
             }
             $userBackend->deleteUserInSqlBackend($invalidUser);
         } catch (Tinebase_Exception_NotFound $ten) {
             // do nothing
         }
         self::syncContact($user);
         $user = $userBackend->addUserInSqlBackend($user);
     }
     // import contactdata(phone, address, fax, birthday. photo)
     if ($_syncContactData === true && Tinebase_Application::getInstance()->isInstalled('Addressbook') === true) {
         $addressbook = Addressbook_Backend_Factory::factory(Addressbook_Backend_Factory::SQL);
         try {
             $contact = $addressbook->getByUserId($user->getId());
             $userBackend->updateContactFromSyncBackend($user, $contact);
             $addressbook->update($contact);
         } catch (Addressbook_Exception_NotFound $aenf) {
             // do nothing => user has no contact in addressbook
         }
     }
     // sync group memberships
     Tinebase_Group::syncMemberships($user);
     return $user;
 }