From 26ee6750c0e63a7ac6458c514fe073dbe243cb30 Mon Sep 17 00:00:00 2001
From: Sascha Grossenbacher <saschagros@gmail.com>
Date: Sun, 18 Sep 2011 18:59:13 +0200
Subject: [PATCH] Issue #1115998 by Berdir: Add approve, delete, view own and view all permissions for each relationship type.

---
 .../user_relationship_implications.module          |    3 +-
 .../user_relationship_mailer.module                |    2 +-
 .../user_relationship_privatemsg.module            |    2 +-
 .../user_relationship_privatemsg.test              |    7 +-
 user_relationships.module                          |   23 ++-
 .../user_relationships_ui.actions.inc              |    8 +-
 user_relationships_ui/user_relationships_ui.module |  164 +++++++++++---------
 .../user_relationships_ui.pages.inc                |   58 ++++---
 8 files changed, 155 insertions(+), 112 deletions(-)

diff --git a/user_relationship_implications/user_relationship_implications.module b/user_relationship_implications/user_relationship_implications.module
index b08d25d..3ba48a9 100644
--- a/user_relationship_implications/user_relationship_implications.module
+++ b/user_relationship_implications/user_relationship_implications.module
@@ -294,7 +294,6 @@ function theme_user_relationship_implications_page($variables) {
 
   $query = _user_relationships_generate_query($params, $options);
 
-  $edit_access = ($user->uid == $uid && user_access('maintain own relationships')) || user_access('administer users');
   $online_interval = time() - variable_get('user_block_seconds_online', 180);
 
   $rows = array();
@@ -302,6 +301,8 @@ function theme_user_relationship_implications_page($variables) {
     $this_user = $viewed_user->uid == $relation->requestee_id ? 'requester_id' : 'requestee_id';
     $this_user = user_load($relation->$this_user);
 
+    $edit_access = user_relationships_ui_check_access('delete', NULL, $relation);
+
     $this_users_relationships = user_relationships_load(array('user' => $this_user->uid));
     $rows[] = array(
       theme('username', array('account' => $this_user)),
diff --git a/user_relationship_mailer/user_relationship_mailer.module b/user_relationship_mailer/user_relationship_mailer.module
index 8589c8f..4a706d4 100644
--- a/user_relationship_mailer/user_relationship_mailer.module
+++ b/user_relationship_mailer/user_relationship_mailer.module
@@ -186,7 +186,7 @@ function user_relationship_mailer_form_user_relationships_admin_settings_alter(&
 function user_relationship_mailer_form_alter(&$form, &$form_state, $form_id) {
   if (($form_id == 'user_register_form' || $form_id == 'user_profile_form') && $form['#user_category'] == 'account') {
     $account = $form_state['user'];
-    $access = variable_get('user_relationship_mailer_send_mail', FALSE) && user_access('maintain own relationships', $account);
+    $access = variable_get('user_relationship_mailer_send_mail', FALSE) && user_access('maintain @relationship relationships', $account);
     $form['user_relationships_ui_settings']['user_relationship_mailer_send_mail'] = array(
       '#type'           => 'checkbox',
       '#title'          => t('Receive e-mail notification of relationship activity'),
diff --git a/user_relationship_privatemsg/user_relationship_privatemsg.module b/user_relationship_privatemsg/user_relationship_privatemsg.module
index 74980cf..19fc112 100644
--- a/user_relationship_privatemsg/user_relationship_privatemsg.module
+++ b/user_relationship_privatemsg/user_relationship_privatemsg.module
@@ -311,7 +311,7 @@ function user_relationship_privatemsg_form_alter(&$form, &$form_state, $form_id)
   if (($form_id == 'user_register_form' || $form_id == 'user_profile_form') && $form['#user_category'] == 'account') {
     // #257748 #458046 for adding the functionality of allowing/disallowing
     // private messages.
-    if (variable_get('user_relationships_restrict_privatemsg', 'all') == 'all_overridable' && user_access('maintain own relationships', $form['#user'])) {
+    if (variable_get('user_relationships_restrict_privatemsg', 'all') == 'all_overridable' && user_access('maintain @relationship relationships', $form['#user'])) {
       $form['privatemsg']['user_relationships_allow_private_message'] = array(
         '#type' => 'radios',
         '#title' => t('Allow private messages from...'),
diff --git a/user_relationship_privatemsg/user_relationship_privatemsg.test b/user_relationship_privatemsg/user_relationship_privatemsg.test
index 183b4ce..91cef9c 100644
--- a/user_relationship_privatemsg/user_relationship_privatemsg.test
+++ b/user_relationship_privatemsg/user_relationship_privatemsg.test
@@ -48,8 +48,9 @@ class UserRelationshipsPrivatemsgRecipientTestCase extends DrupalWebTestCase {
 
     $have_permission = 'can have ' . $relationship['name'] . ' relationships';
     $request_permission = 'can request ' . $relationship['name'] . ' relationships';
+    $maintain_permission = 'maintain ' . $relationship['name'] . ' relationships';
 
-    $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', $have_permission, $request_permission, 'view relationship recipients', 'administer user relationships', 'maintain own relationships', 'write privatemsg to relationships', 'access user profiles'));
+    $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', $have_permission, $request_permission, 'view relationship recipients', 'administer user relationships', $maintain_permission, 'write privatemsg to relationships', 'access user profiles'));
     $userA = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', $have_permission, $request_permission, 'view relationship recipients', 'write privatemsg to relationships'));
     $userB = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', $have_permission, $request_permission, 'view relationship recipients'));
 
@@ -153,8 +154,8 @@ class UserRelationshipsPrivatemsgRecipientTestCase extends DrupalWebTestCase {
 
     $have_permission = 'can have ' . $relationship['name'] . ' relationships';
     $request_permission = 'can request ' . $relationship['name'] . ' relationships';
-
-    $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', $have_permission, $request_permission, 'view relationship recipients', 'administer user relationships', 'maintain own relationships', 'write privatemsg to relationships', 'access user profiles'));
+    $maintain_permission = 'maintain ' . $relationship['name'] . ' relationships';
+    $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', $have_permission, $request_permission, 'view relationship recipients', 'administer user relationships', $maintain_permission, 'write privatemsg to relationships', 'access user profiles'));
 
     $this->drupalLogin($admin);
 
diff --git a/user_relationships.module b/user_relationships.module
index ceb9c50..35deffe 100644
--- a/user_relationships.module
+++ b/user_relationships.module
@@ -254,15 +254,28 @@ function _user_relationships_generate_query($param = array(), $options = array()
  * Implements hook_permission().
  */
 function user_relationships_permission() {
-  $permissions = array();
+  $permissions = array(
+    'administer user relationships' => array(
+    'title' => t('Administer User Relationships'),
+    'description' => t('Allows to administer user relationships and view relationships of all users.'),
+  ));
+
   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.'),
+      'title' => t('Have %name relationships', array('%name' => $type->name)),
+      'description' => t('The user may have relationships of this type.'),
+    );
+    $permissions['maintain ' . $type->name . ' relationships'] = array(
+      'title' => t('Maintain %name relationships', array('%name' => $type->name)),
+      'description' => t('The user may approve or decline relationship requests of this 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.'),
+      'title' => t('Request %name relationships', array('%name' => $type->name)),
+      'description' => t('The user may request relationships of this type.'),
+    );
+    $permissions['delete ' . $type->name . ' relationships'] = array(
+      'title' => t('Delete %name relationships', array('%name' => $type->name)),
+      'description' => t('The user may delete current relationships of this type.'),
     );
   }
   return $permissions;
diff --git a/user_relationships_ui/user_relationships_ui.actions.inc b/user_relationships_ui/user_relationships_ui.actions.inc
index d2119e8..221e232 100644
--- a/user_relationships_ui/user_relationships_ui.actions.inc
+++ b/user_relationships_ui/user_relationships_ui.actions.inc
@@ -129,7 +129,7 @@ function user_relationships_ui_pending_requested_submit($form, &$form_state) {
 
   switch ($form_state['values']['action']) {
   case 'approve':
-    if (!user_access('maintain own relationships') || (!user_access('administer user relationships') && $user->uid != $requestee->uid)) {
+    if (!user_relationships_ui_check_access('approve', NULL, $relationship)) {
       drupal_access_denied();
       exit();
     }
@@ -139,7 +139,7 @@ function user_relationships_ui_pending_requested_submit($form, &$form_state) {
     break;
 
   case 'cancel':
-    if (!user_access('maintain own relationships') || (!user_access('administer user relationships') && $user->uid != $requester->uid)) {
+    if (!user_relationships_ui_check_access('request', NULL, $relationship)) {
       drupal_access_denied();
       exit();
     }
@@ -148,7 +148,7 @@ function user_relationships_ui_pending_requested_submit($form, &$form_state) {
     break;
 
   case 'disapprove':
-    if (!user_access('maintain own relationships') || (!user_access('administer user relationships') && $user->uid != $requestee->uid)) {
+    if (!user_relationships_ui_check_access('approve', NULL, $relationship)) {
       drupal_access_denied();
       exit();
     }
@@ -172,7 +172,7 @@ function user_relationships_ui_remove_submit($form, &$form_state) {
 
   $relationship = user_relationships_load($form_state['values']['rid']);
 
-  if (!user_access('maintain own relationships') || (!user_access('administer user relationships') && $user->uid != $relationship->requester_id && $user->uid != $relationship->requestee_id)) {
+  if (!user_relationships_ui_check_access('delete', NULL, $relationship)) {
     drupal_access_denied();
     exit();
   }
diff --git a/user_relationships_ui/user_relationships_ui.module b/user_relationships_ui/user_relationships_ui.module
index 3d9de09..db4d598 100644
--- a/user_relationships_ui/user_relationships_ui.module
+++ b/user_relationships_ui/user_relationships_ui.module
@@ -9,9 +9,6 @@
 
 define('USER_RELATIONSHIPS_UI_PATH', drupal_get_path('module', 'user_relationships_ui'));
 
-
-
-
 /*
  * Notify the user of pending relationship requests
  */
@@ -73,10 +70,12 @@ function user_relationships_ui_actions_between($viewer, $viewed, $action_types =
   if (isset($action_types['received'])) {
     $relationships = user_relationships_load(array('requester_id' => $viewed->uid, 'requestee_id' => $viewer->uid, 'approved' => FALSE));
     foreach ($relationships as $relationship) {
-      $list[] = t('This user has requested to be your %relationship_name. (!pending_requests)', array(
-        '%relationship_name'  => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name),
-        '!pending_requests'   => l(t('pending requests'), "user/{$viewer->uid}/relationships/received"),
-      ));
+      if (user_relationships_user_access('maintain @relationship relationships', $relationship->type)) {
+        $list[] = t('This user has requested to be your %relationship_name. (!pending_requests)', array(
+          '%relationship_name'  => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name),
+          '!pending_requests'   => l(t('pending requests'), "user/{$viewer->uid}/relationships/received"),
+        ));
+      }
     }
   }
 
@@ -100,11 +99,16 @@ function user_relationships_ui_actions_between($viewer, $viewed, $action_types =
   if (isset($action_types['remove'])) {
     $relationships = user_relationships_load(array('between' => array($viewer->uid, $viewed->uid)));
     foreach ($relationships as $relationship) {
-      if ($relationship->approved && !isset($list[$relationship->rid])) {
-        $list[$relationship->rid] = t('%relationship_name (!remove_link)', array(
-          '%relationship_name'  => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name) . ($relationship->is_oneway ? ($relationship->requester_id == $viewer->uid ? t(' (You to Them)') : t(' (Them to You)')) : NULL),
-          '!remove_link'        => theme('user_relationships_remove_link', array('uid' => $viewer->uid, 'rid' => $relationship->rid)),
-        ));
+      if ($relationship->approved && !isset($list[$relationship->rid]) && user_relationships_ui_check_access('view', NULL, $relationship)) {
+        if (user_relationships_ui_check_access('delete', NULL, $relationship)) {
+          $list[$relationship->rid] = t('%relationship_name (!remove_link)', array(
+            '%relationship_name'  => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name) . ($relationship->is_oneway ? ($relationship->requester_id == $viewer->uid ? t(' (You to Them)') : t(' (Them to You)')) : NULL),
+            '!remove_link'        => theme('user_relationships_remove_link', array('uid' => $viewer->uid, 'rid' => $relationship->rid)),
+          ));
+        }
+        else {
+          $list[$relationship->rid] = ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name) . ($relationship->is_oneway ? ($relationship->requester_id == $viewer->uid ? t(' (You to Them)') : t(' (Them to You)')) : NULL);
+        }
       }
     }
   }
@@ -120,9 +124,17 @@ function user_relationships_ui_actions_between($viewer, $viewed, $action_types =
 /**
  * Check access callback
  */
-function user_relationships_ui_check_access($types, $account = NULL) {
+function user_relationships_ui_check_access($type, $account = NULL, $relationship_type = NULL) {
   global $user;
 
+  if (!is_object($account)) {
+    $account = $user;
+  }
+
+  if (!is_object($relationship_type)) {
+    $relationship_type = user_relationships_type_load($relationship_type);
+  }
+
   if (user_access('administer user relationships')) {
     return TRUE;
   }
@@ -132,27 +144,37 @@ function user_relationships_ui_check_access($types, $account = NULL) {
     return FALSE;
   }
 
-  if (!is_array($types)) {
-    $types = array($types);
-  }
+  switch ($type) {
+    case 'view':
+      // First check if it is the current user and if he has view own
+      // permission.
+      if ($account->uid == $user->uid && user_relationships_user_access('view own @relationship relationships', $relationship_type)) {
+        return TRUE;
+      }
 
-  foreach ($types as $type) {
-    switch ($type) {
-      case 'view':
-        if (user_access('maintain own relationships') || user_access('view user relationships')) {
-          return TRUE;
-        }
-        break;
-      case 'edit':
-        if (user_access('maintain own relationships')) {
-          return TRUE;
-        }
-        break;
-      case 'user':
-        if ($account->uid == $user->uid && user_access('view user relationships')) {
-          return TRUE;
-        }
-    }
+      // If this is a different user or he doesn't have that permission,
+      // check the view all permission.
+      if (user_relationships_user_access('view all @relationship relationships', $relationship_type)) {
+        return TRUE;
+      }
+      break;
+    case 'approve':
+      // Only the administer permission allows to approve, request, delete
+      // relationships for other users, which was already checked.
+      if ($account->uid == $user->uid && user_relationships_user_access('maintain @relationship relationships', $relationship_type)) {
+        return TRUE;
+      }
+      break;
+    case 'request':
+      if ($account->uid == $user->uid && user_relationships_can_request($account, $relationship_type)) {
+        return TRUE;
+      }
+      break;
+    case 'delete':
+      if ($account->uid == $user->uid && user_relationships_user_access('delete @relationship relationships', $relationship_type)) {
+        return TRUE;
+      }
+      break;
   }
   return FALSE;
 }
@@ -203,20 +225,18 @@ function user_relationships_ui_init() {
  * Implements hook_perm().
  */
 function user_relationships_ui_permission() {
-  return array(
-    'administer user relationships' => array(
-      'title' => t('Administer User Relationships'),
-      'description' => t('Allows to administer user relationships and view relationships of all users.'),
-    ),
-    'maintain own relationships' => array(
-      'title' => t('Maintain own relationships'),
-      'description' => t('Allows to maintain own relationships including approving, removing and creating.'),
-    ),
-    'view user relationships' => array(
-      'title' => t('View own user relationships'),
-      'description' => t('Allows to view own relationships.'),
-    ),
-  );
+  $permissions = array();
+  foreach (user_relationships_types_load() as $type) {
+    $permissions['view own ' . $type->name . ' relationships'] = array(
+      'title' => t('View own %name relationships', array('%name' => $type->name)),
+      'description' => t('The user is allowed to see his own relationships of this type.'),
+    );
+    $permissions['view all ' . $type->name . ' relationships'] = array(
+      'title' => t('View all %name relationships', array('%name' => $type->name)),
+      'description' => t('The user is allowed to see all relationships of this type.'),
+    );
+  }
+  return $permissions;
 }
 
 /**
@@ -253,7 +273,7 @@ function user_relationships_ui_menu() {
     'title callback' => 'user_relationships_ui_title_callback_pending',
     'title arguments' => array('requestee_id'),
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array('edit'),
+    'access arguments' => array('approve'),
     'type' => MENU_LOCAL_TASK,
     'weight' => -9,
     'page callback' => 'user_relationships_pending_requests_page',
@@ -266,7 +286,7 @@ function user_relationships_ui_menu() {
     'title callback' => 'user_relationships_ui_title_callback_pending',
     'title arguments' => array('requester_id'),
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array('edit'),
+    'access arguments' => array('request'),
     'type' => MENU_LOCAL_TASK,
     'weight' => -8,
     'page callback' => 'user_relationships_pending_requests_page',
@@ -283,7 +303,7 @@ function user_relationships_ui_menu() {
         'title' => $relationship->plural_name ? $relationship->plural_name : $relationship->name,
         'type' => MENU_LOCAL_TASK,
         'access callback' => 'user_relationships_ui_check_access',
-        'access arguments' => array('edit'),
+        'access arguments' => array('view', NULL, 1),
         'page callback' => 'user_relationships_page',
         'page arguments' => array(NULL, 1),
         'file' => 'user_relationships_ui.pages.inc',
@@ -296,18 +316,17 @@ function user_relationships_ui_menu() {
     'title' => 'Remove relationship',
     'type' => MENU_CALLBACK,
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array('edit'),
+    'access arguments' => array('delete'),
     'page callback' => 'drupal_get_form',
     'page arguments' => array('user_relationships_ui_remove', 1),
     'file' => 'user_relationships_ui.forms.inc',
   );
 
-
   $items['relationship/%user/request'] = array(
     'title' => 'Create a relationship',
     'type' => MENU_CALLBACK,
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array('edit'),
+    'access arguments' => array('request'),
     'page callback' => 'user_relationships_ui_request_ajax',
     'page arguments' => array(1),
     'file' => 'user_relationships_ui.forms.inc',
@@ -316,7 +335,7 @@ function user_relationships_ui_menu() {
   $items['user/%user/relationships'] = array(
     'title' => 'Relationships',
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array(array('user'), 1),
+    'access arguments' => array('view', 1),
     'page callback' => 'user_relationships_page',
     'page arguments' => array(1),
     'file' => 'user_relationships_ui.pages.inc',
@@ -327,7 +346,7 @@ function user_relationships_ui_menu() {
     'type' => MENU_DEFAULT_LOCAL_TASK,
     'weight' => -10,
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array(array('user'), 1),
+    'access arguments' => array('view', 1),
   );
 
   $items['user/%user/relationships/received'] = array(
@@ -335,7 +354,7 @@ function user_relationships_ui_menu() {
     'title callback' => 'user_relationships_ui_title_callback_pending',
     'title arguments' => array('requestee_id', 1),
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array(array('user'), 1),
+    'access arguments' => array('approve', 1),
     'type' => MENU_LOCAL_TASK,
     'weight' => -9,
     'page callback' => 'user_relationships_pending_requests_page',
@@ -348,7 +367,7 @@ function user_relationships_ui_menu() {
     'title callback' => 'user_relationships_ui_title_callback_pending',
     'title arguments' => array('requester_id', 1),
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array(array('user'), 1),
+    'access arguments' => array('request', 1),
     'type' => MENU_LOCAL_TASK,
     'weight' => -8,
     'page callback' => 'user_relationships_pending_requests_page',
@@ -360,7 +379,7 @@ function user_relationships_ui_menu() {
       'title' => $relationship->plural_name ? $relationship->plural_name : $relationship->name,
       'type' => MENU_LOCAL_TASK,
       'access callback' => 'user_relationships_ui_check_access',
-      'access arguments' => array(array('user'), 1),
+      'access arguments' => array('view', 1, 3),
       'page callback' => 'user_relationships_page',
       'page arguments' => array(1, 3),
       'file' => 'user_relationships_ui.pages.inc',
@@ -371,7 +390,7 @@ function user_relationships_ui_menu() {
     'title' => 'Approve Relationship',
     'type' => MENU_CALLBACK,
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array(array('user'), 1),
+    'access arguments' => array('request', 1),
     'page callback' => 'user_relationships_ui_pending_requested_ajax',
     'page arguments' => array(5, 1, 4),
     'file' => 'user_relationships_ui.forms.inc',
@@ -381,7 +400,7 @@ function user_relationships_ui_menu() {
     'title' => 'Remove relationship',
     'type' => MENU_CALLBACK,
     'access callback' => 'user_relationships_ui_check_access',
-    'access arguments' => array(array('edit'), 1),
+    'access arguments' => array('delete', 1),
     'page callback' => 'user_relationships_ui_remove_ajax',
     'page arguments' => array(1, 3),
     'file' => 'user_relationships_ui.forms.inc',
@@ -425,20 +444,20 @@ function user_relationships_ui_title_callback_pending($column, $account = NULL)
  * Implements hook_user_login().
  */
 function user_relationships_ui_user_login(&$edit, $account) {
-  if (user_access('maintain own relationships')) {
+   if (user_relationships_ui_check_access('approve', NULL)) {
     _user_relationships_ui_set_notifications($account);
   }
 }
 
 function user_relationships_ui_user_view($account, $view_mode) {
   global $user;
-  if (($account->uid == $user->uid) && user_access('maintain own relationships')) {
+  if (($account->uid == $user->uid) && user_relationships_user_access('maintain @relationship relationships')) {
     _user_relationships_ui_set_notifications($account);
     return;
   }
 
   $output = array();
-  if (user_access('view user relationships') && ($list = user_relationships_ui_actions_between($user, $account, array('remove' => 1)))) {
+  if ($list = user_relationships_ui_actions_between($user, $account, array('remove' => 1))) {
     $output['relations'] = array(
       '#title'      => t('Your relationships to this user'),
       '#type'       => 'user_profile_item',
@@ -489,7 +508,7 @@ function user_relationships_ui_form_alter(&$form, &$form_state, $form_id) {
       '#after_build' => array('user_relationships_ui_account_fieldset_remove_if_empty'),
     );
 
-    if (variable_get('user_relationships_ui_require_approval', TRUE) && user_access('maintain own relationships', $form['#user'])) {
+    if (variable_get('user_relationships_ui_require_approval', TRUE)) {
       if (variable_get('user_relationships_allow_auto_approve', FALSE) && ($relationships = user_relationships_types_load())) {
         if (!isset($form['#user']->data['user_relationships_ui_auto_approve']) || !is_array($form['#user']->data['user_relationships_ui_auto_approve'])) {
           $form['#user']->data['user_relationships_ui_auto_approve'] = array();
@@ -497,21 +516,20 @@ function user_relationships_ui_form_alter(&$form, &$form_state, $form_id) {
 
         $options = array();
         foreach ($relationships as $relationship) {
-          if ($relationship->requires_approval) {
+          if ($relationship->requires_approval && user_relationships_ui_check_access('approve', NULL, $relationship)) {
             $options[$relationship->rtid] = ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name);
           }
         }
 
         //#453090 Do nothing if there are no options.
         if (count($options)) {
-
-        $form['user_relationships_ui_settings']['user_relationships_ui_auto_approve'] = array(
-          '#type'           => 'checkboxes',
-          '#title'          => t('Automatically approve relationship requests from other users'),
-          '#options'        => $options,
-          '#default_value'  => $form['#user']->data['user_relationships_ui_auto_approve'],
-          '#description'    => t("When another user requests a relationship with you, we usually require your approval. If you'd like certain relationship types to be approved automatically, check the box next to that type.")
-        );
+          $form['user_relationships_ui_settings']['user_relationships_ui_auto_approve'] = array(
+            '#type'           => 'checkboxes',
+            '#title'          => t('Automatically approve relationship requests from other users'),
+            '#options'        => $options,
+            '#default_value'  => $form['#user']->data['user_relationships_ui_auto_approve'],
+            '#description'    => t("When another user requests a relationship with you, we usually require your approval. If you'd like certain relationship types to be approved automatically, check the box next to that type.")
+          );
         }
       }
     }
diff --git a/user_relationships_ui/user_relationships_ui.pages.inc b/user_relationships_ui/user_relationships_ui.pages.inc
index 0c57d78..b685fa0 100644
--- a/user_relationships_ui/user_relationships_ui.pages.inc
+++ b/user_relationships_ui/user_relationships_ui.pages.inc
@@ -51,13 +51,16 @@ function user_relationships_page($account = NULL, $rtid = NULL) {
   }
   drupal_set_title($msg, PASS_THROUGH);
 
-  $edit_access = ($user->uid == $account->uid && user_access('maintain own relationships')) || user_access('administer user relationships');
+  $header = user_relationships_ui_get_table_header(user_relationships_ui_check_access('delete', $account, $relationship_type));
+
   $rows = array();
   foreach ($relationships as $relationship) {
-    $rows[$relationship->rid] = user_relationships_ui_get_table_row($relationship, $account, $edit_access);
-  }
-
-  $header = user_relationships_ui_get_table_header($edit_access);
+    $rows[$relationship->rid] = user_relationships_ui_get_table_row($relationship, $account);
+    if (count($rows[$relationship->rid]) < count($header)) {
+      // Add an empty space to the operations table row.
+      $rows[$relationship->rid][] = '&nbsp;';
+    }
+   }
 
   if (!empty($rtid)) {
     $empty = t('You do not have any %plural_name.', array('%plural_name' => ur_tt("user_relationships:rtid:$relationship_type->rtid:plural_name", $relationship_type->plural_name)));
@@ -96,9 +99,8 @@ function user_relationships_pending_requests_page($column, $account = NULL) {
     return MENU_NOT_FOUND;
   }
 
-  $edit_access = ($user->uid == $account->uid && user_access('maintain own relationships')) || user_access('administer user relationships');
-
   if ($column == 'requester_id') {
+    $permission = 'request';
     if ($account->uid == $user->uid) {
       $msg = t('My relationships (sent requests)');
       $empty = t('You have not sent any relationship requests that are currently pending.');
@@ -109,6 +111,7 @@ function user_relationships_pending_requests_page($column, $account = NULL) {
     }
   }
   else {
+    $permission = 'approve';
     if ($account->uid == $user->uid) {
       $msg = t('My relationships (received requests)');
       $empty = t('You have not received any relationship requests that are currently pending.');
@@ -125,17 +128,21 @@ function user_relationships_pending_requests_page($column, $account = NULL) {
     'paging' => variable_get('user_relationships_relationships_per_page', 16),
   );
 
+  $header = user_relationships_ui_get_table_header(user_relationships_ui_check_access($permission, $account));
   $relationships = user_relationships_load(array($column => $account->uid, 'approved' => FALSE), $options);
   $rows = array();
   foreach ($relationships as $relationship) {
-    $rows[] = user_relationships_ui_get_table_row($relationship, $account);
+    $rows[$relationship->rid] = user_relationships_ui_get_table_row($relationship, $account);
+    if (count($rows[$relationship->rid]) < count($header)) {
+      // Add an empty space to the operations table row.
+      $rows[$relationship->rid][] = '&nbsp;';
+    }
   }
 
-
   $output['list'] = array(
     '#theme' => 'table',
     '#rows' => $rows,
-    '#header' => user_relationships_ui_get_table_header($edit_access),
+    '#header' => $header,
     '#empty' => $empty,
     'attributes' => array('class' => array('user-relationships-pending-listing-table')),
   );
@@ -165,30 +172,33 @@ function user_relationships_ui_get_table_row($relationship, $account) {
   $this_user_str  = $account->uid == $relationship->requestee_id ? 'requester' : 'requestee';
   $this_user      = $relationship->{$this_user_str};
 
-  $edit_access = ($user->uid == $account->uid && user_access('maintain own relationships')) || user_access('administer user relationships');
-
   $row = array(
     theme('username', array('account' => $this_user)),
     ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name) . ($relationship->is_oneway ? ($this_user_str == 'requestee' ? t(' (You to Them)') : t(' (Them to You)')) : NULL),
   );
-  if ($edit_access) {
-    $links = array();
-    if ($relationship->approved) {
+
+  $permission = $account->uid == $relationship->requestee_id ? 'request' : 'approve';
+  $links = array();
+  if ($relationship->approved) {
+    if (user_relationships_ui_check_access('delete', $account, $relationship)) {
       $links[] = theme('user_relationships_remove_link', array('uid' => $account->uid, 'rid' => $relationship->rid));
     }
+  }
+  else if (user_relationships_ui_check_access($permission, $account, $relationship)) {
+    if ($this_user_str == 'requestee') {
+      // Sent requests, display cancel link.
+      $links[] = theme('user_relationships_pending_request_cancel_link', array('uid' => $account->uid, 'rid' => $relationship->rid));
+    }
     else {
-      if ($this_user_str == 'requestee') {
-        // Sent requests, display cancel link.
-        $links[] = theme('user_relationships_pending_request_cancel_link', array('uid' => $account->uid, 'rid' => $relationship->rid));
-      }
-      else {
-        // Received requests, display approve and decline links.
-        $links[] = theme('user_relationships_pending_request_approve_link', array('uid' => $account->uid, 'rid' => $relationship->rid));
-        $links[] = theme('user_relationships_pending_request_disapprove_link', array('uid' => $account->uid, 'rid' => $relationship->rid));
-      }
+      // Received requests, display approve and decline links.
+      $links[] = theme('user_relationships_pending_request_approve_link', array('uid' => $account->uid, 'rid' => $relationship->rid));
+      $links[] = theme('user_relationships_pending_request_disapprove_link', array('uid' => $account->uid, 'rid' => $relationship->rid));
     }
+  }
+  if (!empty($links)) {
     $row[] = implode(' ', $links);
   }
+
   if (variable_get('user_relationships_show_user_pictures', 0)) {
     array_unshift($row, theme('user_picture', array('account' => $this_user)));
   }
-- 
1.7.4.1

