ActiveSync - add Json FE remoteResetDevices
authorPaul Mehrer <p.mehrer@metaways.de>
Mon, 7 Aug 2017 10:29:18 +0000 (12:29 +0200)
committerPaul Mehrer <p.mehrer@metaways.de>
Mon, 7 Aug 2017 11:20:36 +0000 (13:20 +0200)
Change-Id: I8575f3c70f3c861201e1f43108832354fe6523f0
Reviewed-on: http://gerrit.tine20.com/customers/5408
Reviewed-by: Paul Mehrer <p.mehrer@metaways.de>
Tested-by: Paul Mehrer <p.mehrer@metaways.de>
tests/tine20/ActiveSync/Frontend/JsonTests.php
tine20/ActiveSync/Acl/Rights.php
tine20/ActiveSync/Controller/SyncDevices.php
tine20/ActiveSync/Frontend/Json.php
tine20/ActiveSync/Model/Device.php

index 8c0b2c6..105ee9e 100644 (file)
@@ -4,7 +4,7 @@
  * 
  * @package     ActiveSync
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
- * @copyright   Copyright (c) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2015-2017 Metaways Infosystems GmbH (http://www.metaways.de)
  * @author      Philipp Schüle <p.schuele@metaways.de>
  */
 
@@ -19,12 +19,12 @@ class ActiveSync_Frontend_JsonTests extends ActiveSync_TestCase
      * lazy init of uit
      *
      * @return ActiveSync_Frontend_Json
-     *
-     * @todo fix ide object class detection for completions
      */
     protected function _getUit()
     {
-        return parent::_getUit();
+        /** @var ActiveSync_Frontend_Json $uit */
+        $uit = parent::_getUit();
+        return $uit;
     }
     
     /**
@@ -32,7 +32,7 @@ class ActiveSync_Frontend_JsonTests extends ActiveSync_TestCase
      */
     public function testSearchSyncDevices()
     {
-        $device = $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE);
+        $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE);
         
         $result = $this->_getUit()->searchSyncDevices(array(), array());
         
@@ -73,12 +73,32 @@ class ActiveSync_Frontend_JsonTests extends ActiveSync_TestCase
      */
     public function testSaveSyncDevice()
     {
+        $uit = $this->_getUit();
         $device = $this->testGetSyncDevice();
         
         $device['friendlyname'] = 'Very friendly name';
         $device['owner_id'] = $device['owner_id']['accountId'];
-        $updatedDevice = $this->_getUit()->saveSyncDevice($device);
-        
-        $this->assertEquals($device['friendlyname'], $updatedDevice['friendlyname']);
+        $device['remotewipe'] = 1;
+        $updatedDevice = $uit->saveSyncDevice($device);
+
+        static::assertEquals($device['friendlyname'], $updatedDevice['friendlyname']);
+        static::assertEquals(0, $updatedDevice['remotewipe']);
+
+
+        $result = $uit->remoteResetDevices(array($updatedDevice['id']));
+        static::assertTrue(is_array($result) && isset($result['success']) && true === $result['success'] &&
+            count($result) === 1, 'result of remoteResetDevices should be array(\'success\' => true)');
+
+        $fetchedDevice = $uit->getSyncDevice($updatedDevice['id']);
+        static::assertEquals(1, $fetchedDevice['remotewipe'], 'remote wipe not set successfully!');
+
+        $catched = false;
+        try {
+            unset($updatedDevice['id']);
+            $uit->saveSyncDevice($updatedDevice);
+        } catch (Tinebase_Exception_AccessDenied $tead) {
+            $catched = true;
+        }
+        static::assertTrue($catched, 'misuse of saveSyncDevice to create a new device must not be possible');
     }
 }
index adb367b..8a3580f 100644 (file)
@@ -32,6 +32,11 @@ class ActiveSync_Acl_Rights extends Tinebase_Acl_Rights_Abstract
      * @staticvar string
      */
     const MANAGE_DEVICES = 'manage_devices';
+
+    /**
+     * the right to reset a device to factory state, wiping all data
+     */
+    const RESET_DEVICES = 'reset_devices';
     
     /**
      * holds the instance of the singleton
@@ -84,6 +89,7 @@ class ActiveSync_Acl_Rights extends Tinebase_Acl_Rights_Abstract
         
         $addRights = array(
             self::MANAGE_DEVICES,
+            self::RESET_DEVICES,
         );
         $allRights = array_merge($allRights, $addRights);
         
@@ -104,6 +110,10 @@ class ActiveSync_Acl_Rights extends Tinebase_Acl_Rights_Abstract
                 'text'          => $translate->_('Manage ActiveSync devices'),
                 'description'   => $translate->_('See, edit and delete ActiveSync devices'),
             ),
+            self::RESET_DEVICES => array(
+                'text'          => $translate->_('Reset ActiveSync devices'),
+                'description'   => $translate->_('Remotely reset ActiveSync devices to factory state, deleting all data'),
+            )
         );
         
         $rightDescriptions = array_merge($rightDescriptions, parent::getTranslatedRightDescriptions());
index f9066c3..1935ef5 100644 (file)
@@ -6,7 +6,7 @@
  * @subpackage  Controller
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
  * @author      Lars Kneschke <l.kneschke@metaways.de>
- * @copyright   Copyright (c) 2014-2016 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2014-2017 Metaways Infosystems GmbH (http://www.metaways.de)
  */
 
 /**
@@ -39,6 +39,8 @@ class ActiveSync_Controller_SyncDevices extends Tinebase_Controller_Record_Abstr
      * @todo rename to containerACLChecks
      */
     protected $_doContainerACLChecks = false;
+
+    protected $_allowRemoteWipeFlag = false;
     
     /**
      * holds the instance of the singleton
@@ -114,6 +116,7 @@ class ActiveSync_Controller_SyncDevices extends Tinebase_Controller_Record_Abstr
      * delete access log entries
      *
      * @param   array $_ids list of logIds to delete
+     * @return Tinebase_Record_RecordSet
      */
     public function delete($_ids)
     {
@@ -123,6 +126,27 @@ class ActiveSync_Controller_SyncDevices extends Tinebase_Controller_Record_Abstr
     }
 
     /**
+     * set remoteWipe flag for devices
+     *
+     * @param   array $_ids list of devices to flag for remote wipe
+     */
+    public function remoteResetDevices($_ids)
+    {
+        $this->checkRight('RESET_DEVICES');
+        $this->_allowRemoteWipeFlag = true;
+
+        try {
+            /** @var ActiveSync_Model_Device $record */
+            foreach ($this->getMultiple($_ids) as $record) {
+                $record->remotewipe = true;
+                $this->update($record);
+            }
+        } finally {
+            $this->_allowRemoteWipeFlag = false;
+        }
+    }
+
+    /**
      * inspect update of one record (before update)
      *
      * @param   Tinebase_Record_Interface $_record      the update record
@@ -133,11 +157,26 @@ class ActiveSync_Controller_SyncDevices extends Tinebase_Controller_Record_Abstr
     {
         // spoofing protection
         $fieldsToUnset = array('id', 'deviceid', 'devicetype', 'policy_id', 'acsversion', 'useragent',
-            'model', 'os', 'oslanguage', 'pinglifetime', 'pingfolder', 'remotewipe', 'calendarfilter_id',
+            'model', 'os', 'oslanguage', 'pinglifetime', 'pingfolder', 'calendarfilter_id',
             'contactsfilter_id', 'emailfilter_id', 'tasksfilter_id', 'lastping');
+        if (false === $this->_allowRemoteWipeFlag) {
+            $fieldsToUnset[] = 'remotewipe';
+        }
         
         foreach ($fieldsToUnset as $field) {
             $_record->{$field} = $_oldRecord{$field};
         }
     }
+
+    /**
+     * inspect creation of one record (before create)
+     *
+     * @param   Tinebase_Record_Interface $_record
+     * @return  void
+     * @throws Tinebase_Exception_AccessDenied
+     */
+    protected function _inspectBeforeCreate(Tinebase_Record_Interface $_record)
+    {
+        throw new Tinebase_Exception_AccessDenied('this is not allowed!');
+    }
 }
index 317741e..b6800b6 100755 (executable)
@@ -6,7 +6,7 @@
  * @subpackage  Frontend
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
  * @author      Lars Kneschke <l.kneschke@metaways.de>
- * @copyright   Copyright (c) 2009-2015 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2009-2017 Metaways Infosystems GmbH (http://www.metaways.de)
  *
  */
 
@@ -94,6 +94,9 @@ class ActiveSync_Frontend_Json extends Tinebase_Frontend_Json_Abstract
      */
     public function saveSyncDevice($recordData)
     {
+        if (empty($recordData['id'])) {
+            throw new Tinebase_Exception_AccessDenied('you are not allowed to create a sync device');
+        }
         return $this->_save($recordData, ActiveSync_Controller_SyncDevices::getInstance(), 'ActiveSync_Model_Device', 'id');
     }
     
@@ -107,4 +110,15 @@ class ActiveSync_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         return $this->_delete($ids, ActiveSync_Controller_SyncDevices::getInstance());
     }
+
+    /**
+     * @param array $ids
+     * @return array
+     */
+    public function remoteResetDevices($ids)
+    {
+        ActiveSync_Controller_SyncDevices::getInstance()->remoteResetDevices($ids);
+
+        return array('success' => true);
+    }
 }
index 92034cb..df2f8cf 100644 (file)
@@ -22,6 +22,7 @@
  * @property  string  $policy_id          the current policy_id
  * @property  string  $policykey          the current policykey
  * @property  string  $tasksfilter_id     the tasks filter id
+ * @property  boolean $remotewipe
  */
 class ActiveSync_Model_Device extends Tinebase_Record_Abstract
 {