allow to define supported SQL adapter in email plugin
[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_Abstract
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     protected function _getDb($_config)
93     {
94         $tine20DbConfig = Tinebase_Core::getDb()->getConfig();
95         $tine20DbConfig['adapter'] = str_replace('Tinebase_Backend_Sql_Adapter_', '', get_class(Tinebase_Core::getDb()));
96         
97         if ($this->_config['adapter']  == $tine20DbConfig['adapter'] &&
98             $this->_config['host']     == $tine20DbConfig['host'] && 
99             $this->_config['dbname']   == $tine20DbConfig['dbname'] &&
100             $this->_config['username'] == $tine20DbConfig['username']
101         ) {
102             $this->_db = Tinebase_Core::getDb();
103         } else {
104             $dbConfig = array_intersect_key($_config, array_flip(array('adapter', 'host', 'dbname', 'username', 'password', 'port')));
105             $this->_db = Tinebase_Core::createAndConfigureDbAdapter($dbConfig);
106         }
107     }
108     
109     /**
110      * get database object
111      * 
112      * @return Zend_Db_Adapter_Abstract
113      */
114     public function getDb()
115     {
116         return $this->_db;
117     }
118     
119     /**
120      * generate salt for password scheme
121      * 
122      * @param $_scheme
123      * @return string
124      */
125     protected function _salt($_scheme)
126     {
127         // create a salt that ensures crypt creates an sha2 hash
128         $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
129             .'abcdefghijklmnopqrstuvwxyz0123456789+/';
130         
131         for($i=0; $i<16; $i++){
132             $salt .= $base64_alphabet[rand(0,63)];
133         }
134         
135         switch ($_scheme) {
136             case 'SSHA256':
137                 $salt = '$5$' . $salt . '$';
138                 break;
139                 
140             case 'SSHA512':
141                 $salt = '$6$' . $salt . '$';
142                 break;
143                 
144             case 'MD5-CRYPT':
145             default:
146                 $salt = crypt($_scheme);
147                 break;
148         }
149
150         return $salt;
151     }
152     
153     /**
154      * updates email properties for an existing user
155      * 
156      * @param  Tinebase_Model_FullUser  $_updatedUser
157      * @param  Tinebase_Model_FullUser  $_newUserProperties
158      */
159     abstract protected function _updateUser(Tinebase_Model_FullUser $_updatedUser, Tinebase_Model_FullUser $_newUserProperties);
160     
161     /**
162      * check if user exists already in plugin user table
163      * 
164      * @param Tinebase_Model_FullUser $_user
165      */
166     abstract protected function _userExists(Tinebase_Model_FullUser $_user);
167 }