ActiveSync - add Json FE remoteResetDevices
[tine20] / tine20 / ActiveSync / Controller / SyncDevices.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     ActiveSync
6  * @subpackage  Controller
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @author      Lars Kneschke <l.kneschke@metaways.de>
9  * @copyright   Copyright (c) 2014-2017 Metaways Infosystems GmbH (http://www.metaways.de)
10  */
11
12 /**
13  * Sync devices controller for ActiveSync application
14  *
15  * @package     ActiveSync
16  * @subpackage  Controller
17  */
18 class ActiveSync_Controller_SyncDevices extends Tinebase_Controller_Record_Abstract
19 {
20     /**
21      * application name (is needed in checkRight())
22      *
23      * @var string
24      */
25     protected $_applicationName = 'ActiveSync';
26     
27     /**
28      * Model name
29      *
30      * @var string
31      */
32     protected $_modelName = 'ActiveSync_Model_Device';
33     
34     /**
35      * check for container ACLs
36      *
37      * @var boolean
38      *
39      * @todo rename to containerACLChecks
40      */
41     protected $_doContainerACLChecks = false;
42
43     protected $_allowRemoteWipeFlag = false;
44     
45     /**
46      * holds the instance of the singleton
47      *
48      * @var ActiveSync_Controller_SyncDevices
49      */
50     private static $_instance = null;
51     
52     /**
53      * the constructor
54      *
55      * don't use the constructor. use the singleton 
56      */
57     private function __construct() 
58     {
59         $this->_backend = new ActiveSync_Backend_Device();
60     }
61
62     /**
63      * don't clone. Use the singleton.
64      *
65      */
66     private function __clone() 
67     {
68     }
69     
70     /**
71      * the singleton pattern
72      *
73      * @return ActiveSync_Controller_SyncDevices
74      */
75     public static function getInstance() 
76     {
77         if (self::$_instance === NULL) {
78             self::$_instance = new ActiveSync_Controller_SyncDevices;
79         }
80         
81         return self::$_instance;
82     }
83     
84     /**
85      * get list of access log entries
86      *
87      * @param Tinebase_Model_Filter_FilterGroup $_filter
88      * @param Tinebase_Model_Pagination $_pagination
89      * @param boolean $_getRelations
90      * @param boolean $_onlyIds
91      * @param string $_action for right/acl check
92      * @return Tinebase_Record_RecordSet|array
93      */
94     public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Model_Pagination $_pagination = NULL, $_getRelations = FALSE, $_onlyIds = FALSE, $_action = 'get')
95     {
96         $this->checkRight('MANAGE_DEVICES');
97         
98         return parent::search($_filter, $_pagination, $_getRelations, $_onlyIds, $_action);
99     }
100     
101     /**
102      * returns the total number of access logs
103      * 
104      * @param Tinebase_Model_Filter_FilterGroup $_filter
105      * @param string $_action for right/acl check
106      * @return int
107      */
108     public function searchCount(Tinebase_Model_Filter_FilterGroup $_filter, $_action = 'get')
109     {
110         $this->checkRight('MANAGE_DEVICES');
111         
112         return parent::searchCount($_filter, $_action);
113     }
114     
115     /**
116      * delete access log entries
117      *
118      * @param   array $_ids list of logIds to delete
119      * @return Tinebase_Record_RecordSet
120      */
121     public function delete($_ids)
122     {
123         $this->checkRight('MANAGE_DEVICES');
124         
125         return parent::delete($_ids);
126     }
127
128     /**
129      * set remoteWipe flag for devices
130      *
131      * @param   array $_ids list of devices to flag for remote wipe
132      */
133     public function remoteResetDevices($_ids)
134     {
135         $this->checkRight('RESET_DEVICES');
136         $this->_allowRemoteWipeFlag = true;
137
138         try {
139             /** @var ActiveSync_Model_Device $record */
140             foreach ($this->getMultiple($_ids) as $record) {
141                 $record->remotewipe = true;
142                 $this->update($record);
143             }
144         } finally {
145             $this->_allowRemoteWipeFlag = false;
146         }
147     }
148
149     /**
150      * inspect update of one record (before update)
151      *
152      * @param   Tinebase_Record_Interface $_record      the update record
153      * @param   Tinebase_Record_Interface $_oldRecord   the current persistent record
154      * @return  void
155      */
156     protected function _inspectBeforeUpdate($_record, $_oldRecord)
157     {
158         // spoofing protection
159         $fieldsToUnset = array('id', 'deviceid', 'devicetype', 'policy_id', 'acsversion', 'useragent',
160             'model', 'os', 'oslanguage', 'pinglifetime', 'pingfolder', 'calendarfilter_id',
161             'contactsfilter_id', 'emailfilter_id', 'tasksfilter_id', 'lastping');
162         if (false === $this->_allowRemoteWipeFlag) {
163             $fieldsToUnset[] = 'remotewipe';
164         }
165         
166         foreach ($fieldsToUnset as $field) {
167             $_record->{$field} = $_oldRecord{$field};
168         }
169     }
170
171     /**
172      * inspect creation of one record (before create)
173      *
174      * @param   Tinebase_Record_Interface $_record
175      * @return  void
176      * @throws Tinebase_Exception_AccessDenied
177      */
178     protected function _inspectBeforeCreate(Tinebase_Record_Interface $_record)
179     {
180         throw new Tinebase_Exception_AccessDenied('this is not allowed!');
181     }
182 }