Adding Send SMS permission + test + upgrade message
authorMichael McAndrew <michaelmcandrew@thirdsectordesign.org>
Tue, 13 Mar 2018 09:18:36 +0000 (09:18 +0000)
committerMichael McAndrew <michaelmcandrew@thirdsectordesign.org>
Tue, 13 Mar 2018 09:18:36 +0000 (09:18 +0000)
CRM/Activity/BAO/Activity.php
CRM/Activity/Form/ActivityLinks.php
CRM/Contact/Task.php
CRM/Core/Permission.php
CRM/Core/xml/Menu/Admin.xml
CRM/Core/xml/Menu/Contact.xml
CRM/Mailing/Page/Browse.php
CRM/Mailing/xml/Menu/Mailing.xml
CRM/Upgrade/Incremental/php/FourSeven.php
tests/phpunit/CRM/Activity/BAO/ActivityTest.php
xml/templates/civicrm_navigation.tpl

index ee2c1a02cb41e4c412abbe9fe677bac4461d2cab..e3ff859b889d346287a5103f0a34adbb13c67e88 100644 (file)
@@ -1659,7 +1659,9 @@ LEFT JOIN civicrm_activity_contact src ON (src.activity_id = ac.activity_id AND
     if ($userID == NULL) {
       $userID = CRM_Core_Session::getLoggedInContactID();
     }
-
+    if (!CRM_Core_Permission::check('send SMS')) {
+      throw new CRM_Core_Exception("You do not have the 'send SMS' permission");
+    }
     $text = &$activityParams['sms_text_message'];
 
     // CRM-4575
index ee26e848c513e25e5300cdc4b47e3095179e0f3d..6f3a9a818e8664e72ea94177c7b8962cbfff5929 100644 (file)
@@ -73,7 +73,7 @@ class CRM_Activity_Form_ActivityLinks extends CRM_Core_Form {
         }
       }
       elseif ($act['name'] == 'SMS') {
-        if (!$contactId || !CRM_SMS_BAO_Provider::activeProviderCount()) {
+        if (!$contactId || !CRM_SMS_BAO_Provider::activeProviderCount() || !CRM_Core_Permission::check('send SMS')) {
           continue;
         }
         // Check for existence of a mobile phone and ! do not SMS privacy setting
index ffd09533fe16b7b25ea22a324dc4e1055a241343..d7b32b78a6ae935806837f4a206268d374c7fa68 100644 (file)
@@ -162,7 +162,7 @@ class CRM_Contact_Task extends CRM_Core_Task {
 
       //CRM-16329, if SMS provider is configured show sms action.
       $providersCount = CRM_SMS_BAO_Provider::activeProviderCount();
-      if ($providersCount) {
+      if ($providersCount && CRM_Core_Permission::check('send SMS')) {
         self::$_tasks[self::TASK_SMS] = array(
           'title' => ts('SMS - schedule/send'),
           'class' => 'CRM_Contact_Form_Task_SMS',
@@ -308,6 +308,7 @@ class CRM_Contact_Task extends CRM_Core_Task {
       ) {
         $tasks[self::CREATE_MAILING] = self::$_tasks[self::CREATE_MAILING]['title'];
       }
+
     }
 
     $tasks = parent::corePermissionedTaskTitles($tasks, $permission, $params);
index 36165e1da43a87b99a551b454cd49f2e489492dc..b9f344975fc4d8455499001883a2af992762c074 100644 (file)
@@ -889,6 +889,10 @@ class CRM_Core_Permission {
         $prefix . ts('edit own api keys'),
         ts('Edit user\'s own API keys'),
       ),
+      'send SMS' => array(
+        $prefix . ts('send SMS'),
+        ts('Send an SMS'),
+      ),
     );
 
     return $permissions;
index f6dcf0c614c2c5bb7dc67bd21f51a9e47b0b962e..23f09219a19654f889373ea8205c2a6229cb3c83 100644 (file)
      <path>civicrm/sms/send</path>
      <title>New Mass SMS</title>
      <page_callback>CRM_SMS_Controller_Send</page_callback>
-     <access_arguments>administer CiviCRM</access_arguments>
+     <access_arguments>send SMS</access_arguments>
      <page_type>1</page_type>
      <weight>610</weight>
   </item>
index 092a67924b4469337f454e4193f27070c6241caf..26bf51d30c0fa5c619ef270daa1c44e91a70a689 100644 (file)
   <path_arguments>action=add</path_arguments>
   <title>Activities</title>
   <page_callback>CRM_Contact_Form_Task_SMS</page_callback>
+  <access_arguments>send SMS</access_arguments>
 </item>
   <item>
     <path>civicrm/ajax/contactrelationships</path>
index d5376a200fa20ba84630abe5e3efd72fc1ea3559..f2afb009d5e377944444311f21821caac46fa379 100644 (file)
@@ -83,6 +83,22 @@ class CRM_Mailing_Page_Browse extends CRM_Core_Page {
     $this->_unscheduled = $this->_archived = $archiveLinks = FALSE;
     $this->_mailingId = CRM_Utils_Request::retrieve('mid', 'Positive', $this);
     $this->_sms = CRM_Utils_Request::retrieve('sms', 'Positive', $this);
+
+    if ($this->_sms) {
+      // if this is an SMS page, check that the user has permission to browse SMS
+      if (!CRM_Core_Permission::check('send SMS')) {
+        CRM_Core_Error::fatal(ts('You do not have permission to send SMS'));
+      }
+    }
+    else {
+      // If this is not an SMS page, check that the user has an appropriate
+      // permission (specific permissions have been copied from
+      // CRM/Mailing/xml/Menu/Mailing.xml)
+      if (!CRM_Core_Permission::check(array(array('access CiviMail', 'approve mailings', 'create mailings', 'schedule mailings')))) {
+        CRM_Core_Error::fatal(ts('You do not have permission to view this page.'));
+      }
+    }
+
     $this->assign('sms', $this->_sms);
     // check that the user has permission to access mailing id
     CRM_Mailing_BAO_Mailing::checkPermission($this->_mailingId);
index 33b9e501ea8c45e9156fcc453d50d6ca308e81c5..639406b8af87326734ec140498bdc722289d2082 100644 (file)
@@ -5,7 +5,7 @@
     <path>civicrm/mailing</path>
     <title>CiviMail</title>
     <page_callback>CRM_Mailing_Page_Browse</page_callback>
-    <access_arguments>access CiviMail;create mailings</access_arguments>
+    <access_arguments>access CiviMail;create mailings;send SMS</access_arguments>
     <page_type>1</page_type>
     <weight>600</weight>
     <component>CiviMail</component>
@@ -71,7 +71,7 @@
     <title>Find Mailings</title>
     <path_arguments>scheduled=true</path_arguments>
     <page_callback>CRM_Mailing_Page_Browse</page_callback>
-    <access_arguments>access CiviMail;approve mailings;create mailings;schedule mailings</access_arguments>
+    <access_arguments>access CiviMail;approve mailings;create mailings;schedule mailings;send SMS</access_arguments>
     <page_type>1</page_type>
     <weight>620</weight>
   </item>
index b0eefdd4cb3332c4adaea7a1a59eb96368f62234..609a2e4465dc79ec464b2b687a84d4004e1b7e59 100644 (file)
@@ -82,6 +82,9 @@ class CRM_Upgrade_Incremental_php_FourSeven extends CRM_Upgrade_Incremental_Base
       );
       $preUpgradeMessage .= '<p>' . ts('A new set of batch permissions has been added called "%1", "%2", "%3" and "%4". These permissions are now used to control access to the Accounting Batches tasks. If your users need to be able to Reopen or Close batches you may need to give them additional permissions. <a href=%5>Read more</a>', $params) . '</p>';
     }
+    if ($rev == '4.7.32') {
+      $preUpgradeMessage .= '<p>' . ts('A new %1 permission has been added. It is not granted by default. If you use SMS, you may wish to review your permissions.', array(1 => 'send SMS')) . '</p>';
+    }
   }
 
   /**
index 7379e9dc1d3bd6a213089b32442458b3909ed213..98a5433bec06c03551319ba6487a9573b64a5e9f 100644 (file)
@@ -1135,4 +1135,23 @@ $text
     $this->assertEquals($activity['campaign_id'], $campaign_id, 'Activity campaign_id does not match.');
   }
 
+  /**
+   * @expectedException CRM_Core_Exception
+   * @expectedExceptionMessage You do not have the 'send SMS' permission
+   */
+  public function testSendSMSWithoutPermission() {
+    $dummy = NULL;
+    $session = CRM_Core_Session::singleton();
+    $config = &CRM_Core_Config::singleton();
+    $config->userPermissionClass->permissions = array('access CiviCRM');
+
+    CRM_Activity_BAO_Activity::sendSMS(
+      $dummy,
+      $dummy,
+      $dummy,
+      $dummy,
+      $session->get('userID')
+    );
+  }
+
 }
index 3d41ee51fc4af810441c133c2f8c1380e90e6810..d8992089116f2c09f54919e1db4d654b013ce6b1 100644 (file)
@@ -187,7 +187,7 @@ VALUES
 INSERT INTO civicrm_navigation
     ( domain_id, url, label, name, permission, permission_operator, parent_id, is_active, has_separator, weight )
 VALUES
-    ( @domainID, NULL, '{ts escape="sql" skip="true"}Mailings{/ts}', 'Mailings', 'access CiviMail,create mailings,approve mailings,schedule mailings', 'OR', NULL, '1', NULL, 50 );
+    ( @domainID, NULL, '{ts escape="sql" skip="true"}Mailings{/ts}', 'Mailings', 'access CiviMail,create mailings,approve mailings,schedule mailings,send SMS', 'OR', NULL, '1', NULL, 50 );
 
 SET @mailinglastID:=LAST_INSERT_ID();
 INSERT INTO civicrm_navigation
@@ -201,8 +201,8 @@ VALUES
     ( @domainID, 'civicrm/admin/component?reset=1',                         '{ts escape="sql" skip="true"}Headers, Footers, and Automated Messages{/ts}', 'Headers, Footers, and Automated Messages', 'access CiviMail,administer CiviCRM', 'AND', @mailinglastID, '1', NULL, 6 ),
     ( @domainID, 'civicrm/admin/messageTemplates?reset=1',                  '{ts escape="sql" skip="true"}Message Templates{/ts}', 'Message Templates',                 'edit message templates', '', @mailinglastID, '1', NULL, 7 ),
     ( @domainID, 'civicrm/admin/options/from_email_address?reset=1', '{ts escape="sql" skip="true"}From Email Addresses{/ts}', 'From Email Addresses', 'administer CiviCRM', '', @mailinglastID, '1', 1, 8 ),
-    ( @domainID, 'civicrm/sms/send?reset=1',  '{ts escape="sql" skip="true"}New SMS{/ts}', 'New SMS', 'administer CiviCRM', NULL, @mailinglastID, '1', NULL, 9 ),
-    ( @domainID, 'civicrm/mailing/browse?reset=1&sms=1', '{ts escape="sql" skip="true"}Find Mass SMS{/ts}', 'Find Mass SMS', 'administer CiviCRM', NULL, @mailinglastID, '1', 1, 10 ),
+    ( @domainID, 'civicrm/sms/send?reset=1',  '{ts escape="sql" skip="true"}New SMS{/ts}', 'New SMS', 'send SMS', NULL, @mailinglastID, '1', NULL, 9 ),
+    ( @domainID, 'civicrm/mailing/browse?reset=1&sms=1', '{ts escape="sql" skip="true"}Find Mass SMS{/ts}', 'Find Mass SMS', 'send SMS', NULL, @mailinglastID, '1', 1, 10 ),
     ( @domainID, 'civicrm/a/#/abtest/new',                                  '{ts escape="sql" skip="true"}New A/B Test{/ts}', 'New A/B Test',                                        'access CiviMail', '', @mailinglastID, '1', NULL, 15 ),
     ( @domainID, 'civicrm/a/#/abtest',                                      '{ts escape="sql" skip="true"}Manage A/B Tests{/ts}', 'Manage A/B Tests',                                'access CiviMail', '', @mailinglastID, '1', 1, 16 );