Dedupe permissions - allow safe mode merging based on 'merge duplicate contacts'
authoreileen <emcnaughton@wikimedia.org>
Mon, 2 Sep 2019 06:35:19 +0000 (18:35 +1200)
committereileen <emcnaughton@wikimedia.org>
Mon, 2 Sep 2019 08:59:05 +0000 (20:59 +1200)
Ensure force merge permission for force merging (not at the api layer as api v4 won't use that

CRM/Core/Permission.php
CRM/Dedupe/Merger.php
tests/phpunit/api/v3/JobTest.php

index 0e2a3c16af880a62fa6432171c3e4d93d45fb205..c2730c1befaeadc3dfd2c3378998dbe852dd46c3 100644 (file)
@@ -1183,6 +1183,9 @@ class CRM_Core_Permission {
     $permissions['exception'] = [
       'default' => ['merge duplicate contacts'],
     ];
+    $permissions['job'] = [
+      'process_batch_merge' => ['merge duplicate contacts'],
+    ];
     // Loc block is only used for events
     $permissions['loc_block'] = $permissions['event'];
 
index 9e501f35f60c2a07f11f11f03d049543429ea0f0..003239ff58706b6f71c080a459280c1c41a3422d 100644 (file)
@@ -692,10 +692,15 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
    *  per comments on isSelected above.
    *
    * @return array|bool
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public static function batchMerge($rgid, $gid = NULL, $mode = 'safe', $batchLimit = 1, $isSelected = 2, $criteria = [], $checkPermissions = TRUE, $reloadCacheIfEmpty = NULL) {
     $redirectForPerformance = ($batchLimit > 1) ? TRUE : FALSE;
-
+    if ($mode === 'aggressive' && $checkPermissions && !CRM_Core_Permission::check('force merge duplicate contacts')) {
+      throw new CRM_Core_Exception(ts('Insufficient permissions for aggressive mode batch merge'));
+    }
     if (!isset($reloadCacheIfEmpty)) {
       $reloadCacheIfEmpty = (!$redirectForPerformance && $isSelected == 2);
     }
index bc5adbd8a8890ed2ec14e3cfe523b72000a5d693..c9ebda053c25e95697272f7b0448ddc2569ac2ca 100644 (file)
@@ -1112,7 +1112,7 @@ class api_v3_JobTest extends CiviUnitTestCase {
    * @param $dataSet
    */
   public function testBatchMergeWorksCheckPermissionsTrue($dataSet) {
-    CRM_Core_Config::singleton()->userPermissionClass->permissions = ['access CiviCRM', 'administer CiviCRM'];
+    CRM_Core_Config::singleton()->userPermissionClass->permissions = ['access CiviCRM', 'administer CiviCRM', 'merge duplicate contacts', 'force merge duplicate contacts'];
     foreach ($dataSet['contacts'] as $params) {
       $this->callAPISuccess('Contact', 'create', $params);
     }