7 * @license http://www.gnu.org/licenses/agpl.html AGPL Version 3
8 * @copyright Copyright (c) 2007-2013 Metaways Infosystems GmbH (http://www.metaways.de)
9 * @author Cornelius Weiß <c.weiss@metaways.de>
13 * Simple Read-Only Typo3 User Backend
16 * - Do a normal Tine 2.0 install with SQL Users Backend
17 * - run the following SQL:
18 * UPDATE `tine20_config` SET `value` = 'Typo3' WHERE `name` LIKE 'Tinebase_User_BackendType';
19 * DELETE FROM `tine20_group_members` WHERE 1;
20 * DELETE FROM `tine20_accounts` WHERE 1;
22 * NOTE: At the moment we assume typo3 and tine20 share a common database
24 * NOTE: As we import the password, normal SQL auth adapter could be taken
26 * NOTE: We assume the Tine 2.0 Installation to have the default user and admin groups
27 * which are not part of the typo3 group system. Typo3 admins will be imported
28 * into the default admin group, others into the default user group.
30 * This class does nothing more than importing Typo3 backendusers
31 * into the Tine 2.0 user tables.
36 class Tinebase_User_Typo3 extends Tinebase_User_Sql
39 * @var Zend_Db_Adapter_Abstract
44 * construct a typo3 user backend
46 public function __construct()
48 parent::__construct();
50 $this->_t3db = Tinebase_Core::getDb();
51 $this->_sqlUserBackend = new Tinebase_User_Sql();
59 protected $_rowNameMapping = array(
61 'accountDisplayName' => 'realName',
62 //'accountFullName' => 'cn',
63 //'accountFirstName' => 'givenname',
64 //'accountLastName' => 'sn',
65 'accountLoginName' => 'username',
66 'accountLastLogin' => 'lastlogin',
67 'accountExpires' => 'endtime',
68 'accountStatus' => 'disable',
69 'accountPrimaryGroup' => 'usergroup',
70 'accountEmailAddress' => 'email',
74 * setPassword() - sets / updates the password in the account backend
76 * @param string $_loginName
77 * @param string $_password
78 * @param bool $_encrypt encrypt password
81 public function setPassword($_loginName, $_password, $_encrypt = TRUE)
83 throw new Tinebase_Exception_AccessDenied();
89 * @param int $_accountId
90 * @param string $_status
92 public function setStatus($_accountId, $_status)
94 throw new Tinebase_Exception_AccessDenied();
98 * sets/unsets expiry date (calls backend class with the same name)
100 * @param int $_accountId
101 * @param Tinebase_DateTime $_expiryDate
103 public function setExpiryDate($_accountId, $_expiryDate)
105 throw new Tinebase_Exception_AccessDenied();
109 * updates an existing user
111 * @param Tinebase_Model_FullUser $_account
112 * @return Tinebase_Model_FullUser
114 public function updateUser(Tinebase_Model_FullUser $_account)
116 throw new Tinebase_Exception_AccessDenied();
122 * @param Tinebase_Model_FullUser $_account
123 * @return Tinebase_Model_FullUser
125 public function addUser(Tinebase_Model_FullUser $_account)
127 throw new Tinebase_Exception_AccessDenied();
131 * add or update an user
133 * @param Tinebase_Model_FullUser $_account
134 * @return Tinebase_Model_FullUser
136 public function addOrUpdateUser(Tinebase_Model_FullUser $_account)
138 throw new Tinebase_Exception_AccessDenied();
144 * @param int $_accountId
146 public function deleteUser($_accountId)
148 throw new Tinebase_Exception_AccessDenied();
152 * delete multiple users
154 * @param array $_accountIds
156 public function deleteUsers(array $_accountIds)
158 throw new Tinebase_Exception_AccessDenied();
162 * import users from typo3
164 * @param array | optional $_options [options hash passed through the whole setup initialization process]
167 public function importUsers($_options = null)
169 $sqlGroupBackend = new Tinebase_Group_Sql();
171 $t3users = $this->_getUsersFromBackend(NULL, 'Tinebase_Model_FullUser');
173 foreach($t3users as $user) {
174 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .' user: ' . print_r($user->toArray(), true));
175 $user->sanitizeAccountPrimaryGroup();
176 $user = $this->_sqlUserBackend->addOrUpdateUser($user);
177 if (!$user instanceof Tinebase_Model_FullUser) {
178 Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Could not add user "' . $user->accountLoginName . '" => Skipping');
179 Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' classname ' . get_class($user). ' attributes: ' . print_r($user,1));
182 $sqlGroupBackend->addGroupMember($user->accountPrimaryGroup, $user);
184 // we directly can import password as its also md5
185 $select = $this->_t3db->select()->from('be_users')->where("`uid` LIKE '{$user->getId()}'");
186 $t3user = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
187 $md5passwd = $t3user[0]['password'];
189 // import contactdata(phone, address, fax, birthday. photo)
190 //$contact = $this->_getContactFromBackend($user);
191 //Addressbook_Backend_Factory::factory(Addressbook_Backend_Factory::SQL)->update($contact);
196 protected function _getUsersFromBackend($_filter, $_accountClass = 'Tinebase_Model_User')
198 $users = new Tinebase_Record_RecordSet($_accountClass);
200 $select = $this->_t3db->select()
203 $usersData = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
205 foreach ((array) $usersData as $userData) {
206 $userObject = $this->_t32user($userData);
207 $users->addRecord($userObject);
213 protected function _t32user($t3userData)
216 foreach($this->_rowNameMapping as $tineField => $t3field) {
217 $userData[$tineField] = $t3userData[$t3field];
220 // additional names required by tine 2.0
221 $userData['accountFullName'] = empty($userData['accountFullName']) ? $userData['accountLoginName'] : $userData['accountFullName'];
222 $userData['accountLastName'] = strrpos($userData['accountFullName'], ' ') !== FALSE ? substr($userData['accountFullName'], strrpos($userData['accountFullName'], ' ')) : $userData['accountFullName'];
223 $userData['accountDisplayName'] = $userData['accountFullName'];
225 // NOTE: typo3 users might have no group at all
226 if ($userData['admin'] === 1) {
227 $userData['accountPrimaryGroup'] = Tinebase_Group::getInstance()->getDefaultAdminGroup()->getId();
229 $userData['accountPrimaryGroup'] = Tinebase_Group::getInstance()->getDefaultGroup()->getId();
233 $userData['accountStatus'] = $userData['accountStatus'] ? 'disabled' : 'enabled';
236 foreach (array('accountLastLogin', 'accountExpires') as $dateTimeField) {
237 if (empty($userData[$dateTimeField])) {
238 unset($userData[$dateTimeField]);
240 $userData[$dateTimeField] = new Tinebase_DateTime($userData[$dateTimeField]);
244 $user = new Tinebase_Model_FullUser($userData);