/** * 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; }
/** * 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; }