Merge branch '2014.11' into 2015.11
[tine20] / tine20 / Tinebase / User / Typo3.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  User
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>
10  */
11
12 /**
13  * Simple Read-Only Typo3 User Backend
14  * 
15  * Setup: 
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;
21  *      
22  * NOTE: At the moment we assume typo3 and tine20 share a common database
23  * 
24  * NOTE: As we import the password, normal SQL auth adapter could be taken
25  * 
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.
29  *       
30  * This class does nothing more than importing Typo3 backendusers
31  * into the Tine 2.0 user tables.
32  * 
33  * @package     Tinebase
34  * @subpackage  User
35  */
36 class Tinebase_User_Typo3 extends Tinebase_User_Sql
37 {
38     /**
39      * @var Zend_Db_Adapter_Abstract
40      */
41     protected $_t3db;
42     
43     /**
44      * construct a typo3 user backend
45      */
46     public function __construct()
47     {
48         parent::__construct();
49         
50         $this->_t3db = Tinebase_Core::getDb();
51         $this->_sqlUserBackend = new Tinebase_User_Sql();
52     }
53     
54     /**
55      * direct mapping
56      *
57      * @var array
58      */
59     protected $_rowNameMapping = array(
60         'accountId'                 => 'uid',
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',
71     );
72     
73     /**
74      * setPassword() - sets / updates the password in the account backend
75      *
76      * @param string $_loginName
77      * @param string $_password
78      * @param bool   $_encrypt encrypt password
79      * @return void
80      */
81     public function setPassword($_loginName, $_password, $_encrypt = TRUE)
82     {
83         throw new Tinebase_Exception_AccessDenied();
84     }
85     
86     /**
87      * update user status
88      *
89      * @param   int         $_accountId
90      * @param   string      $_status
91      */
92     public function setStatus($_accountId, $_status)
93     {
94         throw new Tinebase_Exception_AccessDenied();
95     }
96
97     /**
98      * sets/unsets expiry date (calls backend class with the same name)
99      *
100      * @param   int         $_accountId
101      * @param   Tinebase_DateTime   $_expiryDate
102     */
103     public function setExpiryDate($_accountId, $_expiryDate)
104     {
105         throw new Tinebase_Exception_AccessDenied();
106     }
107
108     /**
109      * updates an existing user
110      *
111      * @param Tinebase_Model_FullUser $_account
112      * @return Tinebase_Model_FullUser
113      */
114     public function updateUser(Tinebase_Model_FullUser $_account)
115     {
116         throw new Tinebase_Exception_AccessDenied();
117     }
118
119     /**
120      * adds a new user
121      *
122      * @param Tinebase_Model_FullUser $_account
123      * @return Tinebase_Model_FullUser
124      */
125     public function addUser(Tinebase_Model_FullUser $_account)
126     {
127         throw new Tinebase_Exception_AccessDenied();
128     }
129     
130     /**
131      * add or update an user
132      *
133      * @param Tinebase_Model_FullUser $_account
134      * @return Tinebase_Model_FullUser
135      */
136     public function addOrUpdateUser(Tinebase_Model_FullUser $_account)
137     {
138         throw new Tinebase_Exception_AccessDenied();
139     }
140     
141     /**
142      * delete an user
143      *
144      * @param int $_accountId
145      */
146     public function deleteUser($_accountId)
147     {
148         throw new Tinebase_Exception_AccessDenied();
149     }
150
151     /**
152      * delete multiple users
153      *
154      * @param array $_accountIds
155      */
156     public function deleteUsers(array $_accountIds)
157     {
158         throw new Tinebase_Exception_AccessDenied();
159     }
160     
161     /**
162      * import users from typo3
163      * 
164      * @param array | optional $_options [options hash passed through the whole setup initialization process]
165      *
166      */
167     public function importUsers($_options = null)
168     {
169         $sqlGroupBackend = new Tinebase_Group_Sql();
170         
171         $t3users = $this->_getUsersFromBackend(NULL, 'Tinebase_Model_FullUser');
172         
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));
180                 continue;
181             }
182             $sqlGroupBackend->addGroupMember($user->accountPrimaryGroup, $user);
183             
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'];
188             
189             // import contactdata(phone, address, fax, birthday. photo)
190             //$contact = $this->_getContactFromBackend($user);
191             //Addressbook_Backend_Factory::factory(Addressbook_Backend_Factory::SQL)->update($contact);
192         }
193     }
194     
195     
196     protected function _getUsersFromBackend($_filter, $_accountClass = 'Tinebase_Model_User')
197     {
198         $users = new Tinebase_Record_RecordSet($_accountClass);
199         
200         $select = $this->_t3db->select()
201             ->from('be_users');
202             
203         $usersData = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
204         
205         foreach ((array) $usersData as $userData) {
206             $userObject = $this->_t32user($userData);
207             $users->addRecord($userObject);
208         }
209         
210         return $users;
211     }
212     
213     protected function _t32user($t3userData)
214     {
215         $userData = array();
216         foreach($this->_rowNameMapping as $tineField => $t3field) {
217             $userData[$tineField] = $t3userData[$t3field];
218         }
219         
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'];
224         
225         // NOTE: typo3 users might have no group at all
226         if ($userData['admin'] === 1) {
227             $userData['accountPrimaryGroup'] = Tinebase_Group::getInstance()->getDefaultAdminGroup()->getId();
228         } else {
229             $userData['accountPrimaryGroup'] = Tinebase_Group::getInstance()->getDefaultGroup()->getId();
230         } 
231         
232         // convert state
233         $userData['accountStatus'] = $userData['accountStatus'] ? 'disabled' : 'enabled';
234         
235         // convert datetimes
236         foreach (array('accountLastLogin', 'accountExpires') as $dateTimeField) {
237             if (empty($userData[$dateTimeField])) {
238                 unset($userData[$dateTimeField]);
239             } else {
240                 $userData[$dateTimeField] = new Tinebase_DateTime($userData[$dateTimeField]);
241             }
242         }
243         
244         $user = new Tinebase_Model_FullUser($userData);
245         return $user;
246     }
247
248     
249 }