From beff754812ae68706d512c059959da67d6a0bc45 Mon Sep 17 00:00:00 2001
From: Sascha Grossenbacher <saschagros@gmail.com>
Date: Sat, 2 Apr 2011 09:40:04 +0200
Subject: [PATCH] Issue #1099406 by Berdir: Replace role settings with permissions.

---
 .../user_relationship_blocks.module                |    4 -
 ...andler_field_user_relationships_status_link.inc |    2 +-
 user_relationships.admin.inc                       |   30 ----
 user_relationships.module                          |   65 +++------
 .../user_relationships_ui.actions.inc              |  152 +++++++++-----------
 .../user_relationships_ui.forms.inc                |    8 -
 user_relationships_ui/user_relationships_ui.module |    6 +-
 7 files changed, 87 insertions(+), 180 deletions(-)

diff --git a/user_relationship_blocks/user_relationship_blocks.module b/user_relationship_blocks/user_relationship_blocks.module
index 599da4b..90e4166 100644
--- a/user_relationship_blocks/user_relationship_blocks.module
+++ b/user_relationship_blocks/user_relationship_blocks.module
@@ -194,10 +194,6 @@ function user_relationship_blocks_block_configure($delta) {
 function user_relationship_blocks_block_view($delta) {
   global $user;
 
-  if (!user_access('can have relationships')) {
-    return FALSE;
-  }
-
   //pad array with nulls before calling list() to avoid php notices
   $exploded = explode(UR_BLOCK_SEPARATOR, $delta);
   while (count($exploded) < 3) {
diff --git a/user_relationship_views/views_handler_field_user_relationships_status_link.inc b/user_relationship_views/views_handler_field_user_relationships_status_link.inc
index be39cfe..7e3c79c 100644
--- a/user_relationship_views/views_handler_field_user_relationships_status_link.inc
+++ b/user_relationship_views/views_handler_field_user_relationships_status_link.inc
@@ -24,7 +24,7 @@ class views_handler_field_user_relationships_status_link extends views_handler_f
     global $user;
 
     //Do not show to guests or users witout permission to have relationships.
-    if (!$user->uid && user_access('can have relationships')) {
+    if (!$user->uid) {
       return;
     }
 
diff --git a/user_relationships.admin.inc b/user_relationships.admin.inc
index eea3682..581a393 100644
--- a/user_relationships.admin.inc
+++ b/user_relationships.admin.inc
@@ -225,36 +225,6 @@ function user_relationships_admin_type_edit($form, &$form_state, $relationship_t
     '#weight'         => -5,
   );
 
-  $form['roles'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Allowed Roles'),
-    '#group' => 'tabs',
-    '#weight' => 10,
-  );
-
-  $form['roles']['roles'] = array(
-    '#type' => 'checkboxes',
-    '#options' => user_roles(TRUE),
-    '#default_value' => isset($relationship_type->roles) ? $relationship_type->roles : array(),
-    '#title' => t('Role request access'),
-    '#description' => t('You may choose which roles are allowed to request this relationship. If none are selected, all roles are allowed.'),
-  );
-  $form['roles']['roles_receive'] = array(
-    '#type' => 'checkboxes',
-    '#options' => user_roles(TRUE),
-    '#default_value' => isset($relationship_type->roles_receive)  && is_array($relationship_type->roles_receive) ? $relationship_type->roles_receive : array(),
-    '#title' => t('Role receive access'),
-    '#description' => t('You may choose which roles are allowed to receive this relationship. If none are selected, all roles are allowed to receive the relationship.'),
-  );
-  $form['rtid'] = array(
-    '#type'   => 'value',
-    '#value'  => isset($relationship_type->rtid) ? (int)$relationship_type->rtid : NULL,
-  );
-  $form['action'] = array(
-    '#type'   => 'value',
-    '#value'  => (isset($relationship_type->rtid) ? 'edit' : 'add'),
-  );
-
   $form['submit'] = array(
     '#type'   => 'submit',
     '#value'  => t('Submit'),
diff --git a/user_relationships.module b/user_relationships.module
index 3996731..50f008a 100644
--- a/user_relationships.module
+++ b/user_relationships.module
@@ -190,15 +190,22 @@ function _user_relationships_generate_query($param = array(), $options = array()
   return $query;
 }
 
-
 /**
- * hook_perm()
+ * Implements hook_permission().
  */
 function user_relationships_permission() {
-  return array('can have relationships' => array(
-    'title' => t('Can have relationships'),
-    'description' => t('The user is allowed to have and accept relationships.'),
-  ));
+  $permissions = array();
+  foreach (user_relationships_types_load() as $type) {
+    $permissions['can have ' . $type->name . ' relationships'] = array(
+      'title' => t('Can have @name relationships', array('@name' => $type->name)),
+      'description' => t('The user is allowed to have and accept relationships of that type.'),
+    );
+    $permissions['can request ' . $type->name . ' relationships'] = array(
+      'title' => t('Can request @name relationships', array('@name' => $type->name)),
+      'description' => t('The user is allowed to request relationships of that type.'),
+    );
+  }
+  return $permissions;
 }
 
 
@@ -346,23 +353,6 @@ function user_relationships_types_load($reset = FALSE) {
   if ($reset || !isset($relationship_types_list)) {
     // Clear the cached list, since some relationships may have disappeared.
     $relationship_types_list = db_query("SELECT * FROM {user_relationship_types}")->fetchAllAssoc('rtid');
-    if (empty($relationship_types_list)) {
-      // No relationships, avoid querying role permissions.
-      return $relationship_types_list;
-    }
-    // Load role permissions for all types.
-    $result = db_query('SELECT rtid, rid FROM {user_relationship_type_roles} WHERE rtid IN (:rtids) ORDER BY rtid, rid', array(':rtids' => array_keys($relationship_types_list)));
-    foreach ($result as $mapping) {
-      // roles is an associative array {role id} => {role id}.
-      $relationship_types_list[$mapping->rtid]->roles[$mapping->rid] = $mapping->rid;//] = $mapping->name;
-    }
-
-    // Load role receive permissions for all types.
-    $results = db_query('SELECT rtid, rid FROM {user_relationship_type_roles_receive} WHERE rtid IN (:rtids) ORDER BY rtid, rid', array(':rtids' => array_keys($relationship_types_list)));
-    foreach ($results as $mapping) {
-      // roles_receive is an associative array {role id} => {role id}.
-      $relationship_types_list[$mapping->rtid]->roles_receive[$mapping->rid] = $mapping->rid;
-    }
   }
 
   module_invoke_all('user_relationships_type_load', $relationship_types_list);
@@ -748,20 +738,8 @@ function user_relationships_can_request($requester, $relationship_type) {
   if (!is_object($requester) || !is_object($relationship_type)) {
     return FALSE;
   }
-  if ($requester->uid == 1) {
-    return TRUE;
-  }
-  //if no roles have been set, any user can request
-  if (!isset($relationship_type->roles) || !count($relationship_type->roles)) {
-    return TRUE;
-  }
-  //check user has at least one required role
-  foreach ($relationship_type->roles as $role_id) {
-    if (isset($requester->roles[$role_id])) {
-      return TRUE;
-    }
-  }
-  return FALSE;
+  // Check if the user has the necessary permission.
+  return user_access('can request ' . $relationship_type->name . ' relationship', $requester);
 }
 
 /**
@@ -782,17 +760,8 @@ function user_relationships_can_receive($requestee, $relationship_type) {
   if (!is_object($requestee) || !is_object($relationship_type)) {
     return FALSE;
   }
-  //if no roles have been set to receive the relationship, any user can receive it
-  if (!isset($relationship_type->roles_receive) || !count($relationship_type->roles_receive)) {
-    return TRUE;
-  }
-  //check user has at least one required role
-  foreach ($relationship_type->roles_receive as $role_id) {
-    if (isset($requestee->roles[$role_id])) {
-      return TRUE;
-    }
-  }
-  return FALSE;
+  // Check if the user has the necessary permission.
+  return user_access('can have ' . $relationship_type->name . ' relationship');
 }
 
 /**
diff --git a/user_relationships_ui/user_relationships_ui.actions.inc b/user_relationships_ui/user_relationships_ui.actions.inc
index 5e26966..9426a00 100644
--- a/user_relationships_ui/user_relationships_ui.actions.inc
+++ b/user_relationships_ui/user_relationships_ui.actions.inc
@@ -14,101 +14,85 @@ function user_relationships_ui_request_validate($form, &$form_state) {
   $requestee = user_load($form_state['values']['requestee']);
   $rtid = $form_state['values']['rtid'];
 
-  if (user_access('can have relationships', $requestee)) {
-    //check that a type has been chosen
-    if (!$rtid || !($rtype = user_relationships_type_load($rtid))) {
-      form_set_error('rtid', user_relationships_get_message('relationship_type_not_set'));
-      //need to handle requests from ajax forms separately
-      if (isset($_GET['ajax'])) {
-        drupal_goto();
-      }
-      else {
-        return;
-      }
+  //check that a type has been chosen
+  $current_relationships = user_relationships_load(array('between' => array($requester->uid, $requestee->uid)), array('sort' => 'rtid'));
+  //check for multiple relationships
+  if (!variable_get('user_relationships_allow_multiple', TRUE) && count($current_relationships)) {
+  form_set_error('rtid', user_relationships_get_message('too_many_relationships'));
+    if (isset($_GET['ajax'])) {
+      drupal_goto();
     }
-    $current_relationships = user_relationships_load(array('between' => array($requester->uid, $requestee->uid)), array('sort' => 'rtid'));
-    //check for multiple relationships
-    if (!variable_get('user_relationships_allow_multiple', TRUE) && count($current_relationships)) {
-    form_set_error('rtid', user_relationships_get_message('too_many_relationships'));
-      if (isset($_GET['ajax'])) {
-        drupal_goto();
-      }
-      else {
-        return;
-      }
+    else {
+      return;
     }
-    //check user is allowed to request this type
-    if (!user_relationships_can_request($requester, $rtype)) {
-      $rtype->requester = $requester;
-      $rtype->requestee = $requestee;
-      form_set_error('rtid', user_relationships_get_message('relationship_type_not_allowed', $rtype));
-      if (isset($_GET['ajax'])) {
-        drupal_goto();
-      }
-      else {
-        return;
-      }
+  }
+  //check user is allowed to request this type
+  if (!user_relationships_can_request($requester, $rtype)) {
+    $rtype->requester = $requester;
+    $rtype->requestee = $requestee;
+    form_set_error('rtid', user_relationships_get_message('relationship_type_not_allowed', $rtype));
+    if (isset($_GET['ajax'])) {
+      drupal_goto();
     }
-
-    //check user is allowed to receive this type
-    if (!user_relationships_can_receive($requestee, $rtype)) {
-      $rtype->requester = $requester;
-      $rtype->requestee = $requestee;
-      form_set_error('rtid', user_relationships_get_message('relationship_type_not_allowed', $rtype));
-      if (isset($_GET['ajax'])) {
-        drupal_goto();
-      }
-      else {
-        return;
-      }
+    else {
+      return;
     }
+  }
 
-    //check if this request contradicts existing relationships or requests of this type
-    //gather rtid's of relationships that have already been requested from requester to requestee
-    $test_relationships = array();
-    foreach ($current_relationships as $key => $value) {
-      foreach ($value as $val_rel) {
-        //existing two way relationships count no matter the direction
-        if (!$val_rel->is_oneway) {
-          $test_relationships[$key]=$key;
-          continue;
-        }
-        //if it's one way, but not reciprocal, then it counts no matter the direction
-        if (!$val_rel->is_reciprocal) {
-          $test_relationships[$key]=$key;
-          continue;
-        }
-        //remaining case is a reciprocal relationship - it counts unless the request is in the opposite direction
-        if ($requester->uid == $val_rel->requester_id) {
-          $test_relationships[$key]=$key;
-        }
-      }
-    }
-    //check if there aren't any available (not yet used) types that can be established
-    $select = db_select('user_relationship_types');
-    $select->addExpression('COUNT(*)', 'count');
-    if ($test_relationships) {
-      $select->condition('rtid', $test_relationships, 'NOT IN');
-    }
-    if (!$select->execute()->fetchField()) {
-      drupal_set_message(user_relationships_get_message('too_many_relationships'), 'error');
+  //check user is allowed to receive this type
+  if (!user_relationships_can_receive($requestee, $rtype)) {
+    $rtype->requester = $requester;
+    $rtype->requestee = $requestee;
+    form_set_error('rtid', user_relationships_get_message('relationship_type_not_allowed', $rtype));
+    if (isset($_GET['ajax'])) {
       drupal_goto();
     }
-    //check if desided relationship type is among the unused ones
-    elseif (isset($test_relationships[$rtid])) {
-      $message_name = $test_relationships[$rtid]->approved ? 'existing_relationship' : 'existing_request';
-      form_set_error('rtid', user_relationships_get_message($message_name, NULL, array(
-        '!requester'                => theme('username', array('account' => $requester)),
-        '!requestee'                => theme('username', array('account' => $requestee)),
-        '%relationship_name'        => $current_relationships[$rtid][0]->name,
-        '%relationship_plural_name' => $current_relationships[$rtid][0]->plural_name
-      )));
+    else {
+      return;
+    }
+  }
+
+  //check if this request contradicts existing relationships or requests of this type
+  //gather rtid's of relationships that have already been requested from requester to requestee
+  $test_relationships = array();
+  foreach ($current_relationships as $key => $value) {
+    foreach ($value as $val_rel) {
+      //existing two way relationships count no matter the direction
+      if (!$val_rel->is_oneway) {
+        $test_relationships[$key]=$key;
+        continue;
+      }
+      //if it's one way, but not reciprocal, then it counts no matter the direction
+      if (!$val_rel->is_reciprocal) {
+        $test_relationships[$key]=$key;
+        continue;
+      }
+      //remaining case is a reciprocal relationship - it counts unless the request is in the opposite direction
+      if ($requester->uid == $val_rel->requester_id) {
+        $test_relationships[$key]=$key;
+      }
     }
   }
-  else {
-    drupal_set_message(user_relationships_get_message('not_accepting_requests'));
+  //check if there aren't any available (not yet used) types that can be established
+  $select = db_select('user_relationship_types');
+  $select->addExpression('COUNT(*)', 'count');
+  if ($test_relationships) {
+    $select->condition('rtid', $test_relationships, 'NOT IN');
+  }
+  if (!$select->execute()->fetchField()) {
+    drupal_set_message(user_relationships_get_message('too_many_relationships'), 'error');
     drupal_goto();
   }
+  //check if desided relationship type is among the unused ones
+  elseif (isset($test_relationships[$rtid])) {
+    $message_name = $test_relationships[$rtid]->approved ? 'existing_relationship' : 'existing_request';
+    form_set_error('rtid', user_relationships_get_message($message_name, NULL, array(
+      '!requester'                => theme('username', array('account' => $requester)),
+      '!requestee'                => theme('username', array('account' => $requestee)),
+      '%relationship_name'        => $current_relationships[$rtid][0]->name,
+      '%relationship_plural_name' => $current_relationships[$rtid][0]->plural_name
+    )));
+  }
 }
 
 /**
diff --git a/user_relationships_ui/user_relationships_ui.forms.inc b/user_relationships_ui/user_relationships_ui.forms.inc
index ad5882a..ee91115 100644
--- a/user_relationships_ui/user_relationships_ui.forms.inc
+++ b/user_relationships_ui/user_relationships_ui.forms.inc
@@ -91,14 +91,6 @@ function user_relationships_ui_request($form, &$form_state, $requestee) {
     );
     return $form;
   }
-  elseif (!user_access('can have relationships', $requestee)) {
-    $form['error'] = array(
-      '#prefix' => '<div>',
-      '#suffix' => '</div>',
-      '#markup' => user_relationships_get_message('not_accepting_requests') . $script
-    );
-    return $form;
-  }
   elseif ($user->uid == $requestee->uid) {
     $form['error'] = array(
       '#prefix' => '<div>',
diff --git a/user_relationships_ui/user_relationships_ui.module b/user_relationships_ui/user_relationships_ui.module
index a4392e9..a69dbe4 100644
--- a/user_relationships_ui/user_relationships_ui.module
+++ b/user_relationships_ui/user_relationships_ui.module
@@ -60,7 +60,7 @@ function _user_relationships_ui_autocomplete_types($string = '') {
  *                       add, remove, requested, received
  */
 function _user_relationships_ui_actions_between(&$viewer, &$viewed, $action_types = array('add' => 1, 'remove' => 1, 'requested' => 1, 'received' => 1)) {
-  if (!user_access('can have relationships') || $viewer->uid == $viewed->uid) {
+  if ($viewer->uid == $viewed->uid) {
     return;
   }
 
@@ -192,10 +192,6 @@ function user_relationships_ui_check_access($types, $account = NULL) {
     $types = array($types);
   }
 
-  if (!user_access('can have relationships')) {
-    return FALSE;
-  }
-
   foreach ($types as $type) {
     switch ($type) {
       case 'view':
-- 
1.7.4.1

