0011666: Some fixes for Expressodriver
[tine20] / tine20 / Expressodriver / Controller.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * MAIN controller for expressodriver, does event and container handling
6  *
7  * @package     Expressodriver
8  * @subpackage  Controller
9  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
10  * @copyright   Copyright (c) 2007-2014 Metaways Infosystems GmbH (http://www.metaways.de)
11  * @copyright   Copyright (c) 2014 Serpro (http://www.serpro.gov.br)
12  * @author      Marcelo Teixeira <marcelo.teixeira@serpro.gov.br>
13  * @author      Edgar de Lucca <edgar.lucca@serpro.gov.br>
14  *
15  */
16
17 /**
18  * main controller for Expressodriver
19  *
20  * @package     Expressodriver
21  * @subpackage  Controller
22  */
23 class Expressodriver_Controller extends Tinebase_Controller_Event
24 {
25     /**
26      * holds the default Model of this application
27      * @var string
28      */
29     protected static $_defaultModel = 'Expressodriver_Model_Node';
30
31     /**
32      * holds the instance of the singleton
33      *
34      * @var Filemamager_Controller
35      */
36     private static $_instance = NULL;
37
38     /**
39      * constructor (get current user)
40      */
41     private function __construct()
42     {
43     }
44
45     /**
46      * don't clone. Use the singleton.
47      *
48      */
49     private function __clone()
50     {
51     }
52
53     /**
54      * the singleton pattern
55      *
56      * @return Expressodriver_Controller
57      */
58     public static function getInstance()
59     {
60         if (self::$_instance === NULL) {
61             self::$_instance = new Expressodriver_Controller;
62         }
63
64         return self::$_instance;
65     }
66
67     /**
68      * event handler function
69      *
70      * all events get routed through this function
71      *
72      * @param Tinebase_Event_Abstract $_eventObject the eventObject
73      *
74      * @todo    write test
75      */
76     protected function _handleEvent(Tinebase_Event_Abstract $_eventObject)
77     {
78         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . ' (' . __LINE__ . ') handle event of type ' . get_class($_eventObject));
79
80         switch(get_class($_eventObject)) {
81             case 'Admin_Event_AddAccount':
82                 break;
83             case 'Admin_Event_DeleteAccount':
84                 break;
85         }
86     }
87
88     /**
89      * get expressodriver settings
90      *
91      * @param bool $_resolve
92      * @return array
93      */
94     public function getConfigSettings($_resolve = FALSE)
95     {
96         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
97             . ' Fetching Expressodriver Settings ...');
98
99         $defaults = array(
100             'default' => array(
101                 'useCache' => true,
102                 'cacheLifetime' => 86400, // one day
103             ),
104             'adapters' => array(),
105         );
106         $result = Expressodriver_Config::getInstance()->get('expressodriverSettings', new Tinebase_Config_Struct($defaults))->toArray();
107
108         return $result;
109     }
110
111     /**
112      * save expressodriver settings
113      *
114      * @param array $_settings
115      * @return Crm_Model_Config
116      *
117      */
118     public function saveConfigSettings($_settings)
119     {
120         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
121             . ' Updating Crm Settings: ' . print_r($_settings, TRUE));
122
123         $_settings = array(
124             'default' => $_settings['default'],
125             'adapters' => $_settings['adapters'],
126         );
127
128         Expressodriver_Config::getInstance()->set('expressodriverSettings', $_settings);
129
130         return $this->getConfigSettings();
131     }
132
133     /**
134      * set credentials for given adapter
135      *
136      * @param string $adapterName
137      * @param string $password
138      * @return array
139      */
140     public function setCredentials($adapterName, $password)
141     {
142
143         $adapter = null;
144         $config = $this->getConfigSettings();
145         foreach ($config['adapters'] as $adapterConfig) {
146             if ($adapterName === $adapterConfig['name']) {
147                 $adapter = $adapterConfig;
148             }
149         }
150
151         $url = $adapter['url'];
152         if ($adapter['adapter'] == 'owncloud') {
153             $url = rtrim($url, '/');
154             $url .= '/remote.php/webdav/';
155         }
156         $username = $adapter['useEmailAsLoginName']
157                 ? Tinebase_Core::getUser()->accountEmailAddress
158                 : Tinebase_Core::getUser()->accountLoginName;
159
160         $options = array(
161             'host' => $adapter['url'],
162             'user' => $username,
163             'password' => $password,
164             'root' => '/',
165             'name' => $adapter['name'],
166             'useCache' => $config['default']['useCache'],
167             'cacheLifetime' => $config['default']['cacheLifetime'],
168         );
169         $adapterInstance = Expressodriver_Backend_Storage_Abstract::factory($adapter['adapter'], $options);
170
171         // check authentication for owncloud/webdav
172         if ($adapterInstance->checkCredentials($url, $username, $password)) {
173             Expressodriver_Session::getSessionNamespace()->password[$adapterName] = $password;
174             return array(
175                 'success' => true
176             );
177         } else {
178             return array(
179                 'success' => false,
180                 'errorMessage' => 'Invalid Credentials'
181             );
182         }
183     }
184 }