aad940280566d565ea73d1b1c1760f13f23d4aef
[tine20] / tine20 / Tinebase / User / Plugin / Abstract.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) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Lars Kneschke <l.kneschke@metaways.de>
10  */
11
12 /**
13  * abstract class for user plugins
14  * 
15  * @package Tinebase
16  * @subpackage User
17  */
18 abstract class Tinebase_User_Plugin_Abstract implements Tinebase_User_Plugin_SqlInterface
19 {
20     /**
21     * @var Zend_Db_Adapter
22     */
23     protected $_db = NULL;
24     
25     /**
26      * @var Tinebase_Backend_Sql_Command_Interface
27      */
28     protected $_dbCommand;
29     
30     /**
31      * inspect data used to create user
32      * 
33      * @param Tinebase_Model_FullUser  $_addedUser
34      * @param Tinebase_Model_FullUser  $_newUserProperties
35      */
36     public function inspectAddUser(Tinebase_Model_FullUser $_addedUser, Tinebase_Model_FullUser $_newUserProperties)
37     {
38         $this->inspectUpdateUser($_addedUser, $_newUserProperties);
39     }
40     
41     /**
42      * inspect data used to update user
43      * 
44      * @param Tinebase_Model_FullUser  $_updatedUser
45      * @param Tinebase_Model_FullUser  $_newUserProperties
46      */
47     public function inspectUpdateUser(Tinebase_Model_FullUser $_updatedUser, Tinebase_Model_FullUser $_newUserProperties)
48     {
49         if (! isset($_newUserProperties->imapUser) && ! isset($_newUserProperties->smtpUser)) {
50             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' No email properties found!');
51             return;
52         }
53         
54         if ($this->_userExists($_updatedUser) === true) {
55             $this->_updateUser($_updatedUser, $_newUserProperties);
56         } else {
57             $this->_addUser($_updatedUser, $_newUserProperties);
58         }
59     }
60     
61     /**
62      * adds email properties for a new user
63      * 
64      * @param  Tinebase_Model_FullUser  $_addedUser
65      * @param  Tinebase_Model_FullUser  $_newUserProperties
66      */
67     abstract protected function _addUser(Tinebase_Model_FullUser $_addedUser, Tinebase_Model_FullUser $_newUserProperties);
68     
69     /**
70      * Check if we should append domain name or not
71      *
72      * @param  string $_userName
73      * @return string
74      */
75     protected function _appendDomain($_userName)
76     {
77         if ((isset($this->_config['domain']) || array_key_exists('domain', $this->_config)) && ! empty($this->_config['domain'])) {
78             $domain = '@' . $this->_config['domain'];
79             if (strpos($_userName, $domain) === FALSE) {
80                 $_userName .= $domain;
81             }
82         }
83         
84         return $_userName;
85     }
86     
87     /**
88      * set database
89      * 
90      * @param array $_config
91      * 
92      * @todo allow other db backends than mysql
93      */
94     protected function _getDb($_config)
95     {
96         $tine20DbConfig = Tinebase_Core::getDb()->getConfig();
97         
98         if ($this->_config['host'] == $tine20DbConfig['host'] && 
99             $this->_config['dbname'] == $tine20DbConfig['dbname'] &&
100             $this->_config['username'] == $tine20DbConfig['username'] &&
101             Tinebase_Core::getDb() instanceof Zend_Db_Adapter_Pdo_Mysql
102         ) {
103             $this->_db = Tinebase_Core::getDb();
104         } else {
105             $dbConfig = array_intersect_key($_config, array_flip(array('host', 'dbname', 'username', 'password', 'prefix', 'port')));
106             $this->_db = Tinebase_Core::createAndConfigureDbAdapter($dbConfig, 'Pdo_Mysql');
107         }
108     }
109     
110     /**
111      * get database object
112      * 
113      * @return Zend_Db_Adapter
114      */
115     public function getDb()
116     {
117         return $this->_db;
118     }
119     
120     /**
121      * generate salt for password scheme
122      * 
123      * @param $_scheme
124      * @return string
125      */
126     protected function _salt($_scheme)
127     {
128         // create a salt that ensures crypt creates an sha2 hash
129         $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
130             .'abcdefghijklmnopqrstuvwxyz0123456789+/';
131         
132         for($i=0; $i<16; $i++){
133             $salt .= $base64_alphabet[rand(0,63)];
134         }
135         
136         switch ($_scheme) {
137             case 'SSHA256':
138                 $salt = '$5$' . $salt . '$';
139                 break;
140                 
141             case 'SSHA512':
142                 $salt = '$6$' . $salt . '$';
143                 break;
144                 
145             case 'MD5-CRYPT':
146             default:
147                 $salt = crypt($_scheme);
148                 break;
149         }
150
151         return $salt;
152     }
153     
154     /**
155      * updates email properties for an existing user
156      * 
157      * @param  Tinebase_Model_FullUser  $_updatedUser
158      * @param  Tinebase_Model_FullUser  $_newUserProperties
159      */
160     abstract protected function _updateUser(Tinebase_Model_FullUser $_updatedUser, Tinebase_Model_FullUser $_newUserProperties);
161     
162     /**
163      * check if user exists already in plugin user table
164      * 
165      * @param Tinebase_Model_FullUser $_user
166      */
167     abstract protected function _userExists(Tinebase_Model_FullUser $_user);
168 }