Index: user_relationships_api/user_relationships_api.api.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_api/Attic/user_relationships_api.api.inc,v
retrieving revision 1.1.2.15
diff -u -p -r1.1.2.15 user_relationships_api.api.inc
--- user_relationships_api/user_relationships_api.api.inc	6 Jul 2009 15:55:04 -0000	1.1.2.15
+++ user_relationships_api/user_relationships_api.api.inc	28 Sep 2009 12:18:20 -0000
@@ -84,6 +84,13 @@ function user_relationships_types_load($
       // //roles is an associative array {role id} => {role id}
       $rtype->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} ORDER BY rtid, rid');
+    while ($mapping = db_fetch_object($results)) {
+      $rtype = $relationship_types_list[$mapping->rtid];
+      // //roles is an associative array {role id} => {role id}
+      $rtype->roles_receive[$mapping->rid] = $mapping->rid;//] = $mapping->name;
+    }
   }
 
   _user_relationships_invoke('load', $relationship_types_list, TRUE);
@@ -169,7 +176,13 @@ function user_relationships_request_rela
     //it would be good to return a reason why save is denied, but it's the API portion, it does not expose anything user-visible
     return FALSE;
   }
-  
+  //check requestee is allowed to receive this rtype
+  if (!user_relationships_api_can_receive($requestee, $type)) {
+    watchdog('user_relationships_api', 'User %user has no suitable roles to receive a %rtype relationship', array('%user' => $requestee->name, '%rtype' => $type->name), WATCHDOG_WARNING);
+    //it would be good to return a reason why save is denied, but it's the API portion, it does not expose anything user-visible
+    return FALSE;
+  }
+
   if (!user_relationships_load(array('between' => array($requester->uid, $requestee->uid), 'rtid' => $type->rtid), array('count' => TRUE))) {
     $relationship = (object)array(
       'requester_id'  => $requester->uid,
@@ -201,11 +214,11 @@ function user_relationships_save_relatio
   !isset($relationship->flags) ? $relationship->flags = UR_OK : NULL;
   !isset($relationship->created_at) ? $relationship->created_at = time() : NULL;
   $relationship->updated_at = time();
-  
+
   if ($op == 'approve') {
     $relationship->approved = 1;
   }
-  
+
   _user_relationships_invoke('presave', $relationship);
 
   if (isset($relationship->rid)) {
@@ -277,7 +290,7 @@ function user_relationships_delete_relat
   *       $start_time = mktime(0,0,0,0,0,2007);
   *       $end_time = mktime(0,0,0,0,0,2008);
   *       user_relationships_load(array('created_at' => ">= {$start_time}", 'created_at' => '< {$end_time'}));
-  * 
+  *
   *   each parameter may be an array, if you wish to pass several values
   *     example: user_relationships_load(array('rtid' => array(2, 3), 'between' => array($uid1, $uid2)))
   *       will load all relationships of types 2 or 3 between uid1 and uid2 (query will have an IN clause)
@@ -300,7 +313,7 @@ function user_relationships_delete_relat
   *   include_user_info
   *     a boolean that will load basic user info without having to call user_load
   *     columns: uid, name, mail, data, picture
-  *     
+  *
   *   include_twoway_reverse (not used unless there is a specific need)
   *     a boolean that, if present, and if sort is set to other than 'rid', will include records for both directions for
   *     two-way relationships. Normally for a two-way relationship only one entry is returned, although in the database there
@@ -422,7 +435,26 @@ function user_relationships_api_can_requ
   }
   return FALSE;
 }
-
+/**
+ * Check whether a user is allowed to receive a certain relationship type
+ *
+ * @param $requestee requesting user object or uid
+ * @param $relationship_type loaded relationship type object or rtid
+ * @return TRUE iff receiver is allowed to request this type of relationship
+ */
+function user_relationships_api_can_receive($requestee, $relationship_type) {
+  //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 ($requestee->roles[$role_id]) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
 /**
  * Implements the hook_cck_field_privacy_access to allow users to display privacy fields
  * based on a relationship with other users
@@ -430,4 +462,4 @@ function user_relationships_api_can_requ
 function user_relationships_api_cck_field_privacy_access($requestee, $requester) {
   $relationship = user_relationships_load(array('between' => array($requestee->uid, $requester->uid), 'approved' => TRUE), array('count' => TRUE), FALSE);
   return $relationship;
-}
\ No newline at end of file
+}
Index: user_relationships_api/user_relationships_api.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_api/Attic/user_relationships_api.install,v
retrieving revision 1.1.2.8
diff -u -p -r1.1.2.8 user_relationships_api.install
--- user_relationships_api/user_relationships_api.install	17 Mar 2009 10:57:14 -0000	1.1.2.8
+++ user_relationships_api/user_relationships_api.install	28 Sep 2009 12:18:20 -0000
@@ -56,6 +56,17 @@ function user_relationships_api_schema()
     )
   );
 
+  $schema['user_relationship_type_roles_receive'] = array(
+    'fields' => array(
+      'rtid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'rid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+    ),
+    'primary key' => array('rtid', 'rid'),
+    'indexes' => array(
+      'rtid' => array('rtid'),
+    )
+  );
+
   return $schema;
 }
 
@@ -80,7 +91,7 @@ function user_relationships_api_uninstal
 function user_relationships_api_update_6100() {
   $ret = array();
   db_drop_index($ret, 'user_relationships', 'rid');
-  db_change_field($ret, 'user_relationships', 'rid', 'rid', array('type' => 'serial', 'not null' => TRUE), array('indexes' => array('rid' => array('rid')))); 
+  db_change_field($ret, 'user_relationships', 'rid', 'rid', array('type' => 'serial', 'not null' => TRUE), array('indexes' => array('rid' => array('rid'))));
   return $ret;
 }
 
@@ -95,3 +106,15 @@ function user_relationships_api_update_6
   db_create_table($ret, 'user_relationship_type_roles', $schema['user_relationship_type_roles']);
   return $ret;
 }
+
+/**
+ * Implementation of hook_update_N().
+ * Update 6102 adds the {user_relationship_type_roles_receive} table
+ */
+function user_relationships_api_update_6102() {
+  $ret = array();
+  $schema = drupal_get_schema_unprocessed('user_relationships_api');
+  _drupal_initialize_schema('user_relationships_api', $schema);
+  db_create_table($ret, 'user_relationship_type_roles_receive', $schema['user_relationship_type_roles_receive']);
+  return $ret;
+}
Index: user_relationships_ui/user_relationships_ui.actions.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_ui/Attic/user_relationships_ui.actions.inc,v
retrieving revision 1.1.2.12
diff -u -p -r1.1.2.12 user_relationships_ui.actions.inc
--- user_relationships_ui/user_relationships_ui.actions.inc	7 May 2009 21:59:36 -0000	1.1.2.12
+++ user_relationships_ui/user_relationships_ui.actions.inc	28 Sep 2009 12:18:20 -0000
@@ -14,7 +14,7 @@ function user_relationships_ui_request_v
   $requester = user_load($form_state['values']['requester']);
   $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))) {
@@ -51,8 +51,21 @@ function user_relationships_ui_request_v
       }
     }
 
+    //check user is allowed to receive this type
+    if (!user_relationships_api_can_receive($requestee, $rtype)) {
+      $rtype->requester = $requester;
+      $rtype->requestee = $requestee;
+      form_set_error('rtid', user_relationships_ui_get_message('relationship_type_not_allowed', $rtype));
+      if (isset($_GET['ajax'])) {
+        drupal_goto();
+      }
+      else {
+        return;
+      }
+    }
+
     if (!db_result(db_query(
-      'SELECT COUNT(*) FROM {user_relationship_types}' . 
+      'SELECT COUNT(*) FROM {user_relationship_types}' .
       ($current_relationships ? ' WHERE rtid NOT IN ('. db_placeholders($current_relationships) .')' : ''),
       array_keys($current_relationships)
     ))) {
@@ -159,7 +172,7 @@ function user_relationships_ui_remove_su
     drupal_access_denied();
     exit();
   }
-  
+
   user_relationships_delete_relationship($relationship, $user);
   drupal_set_message(user_relationships_ui_get_message('removed', $relationship));
 
Index: user_relationships_ui/user_relationships_ui.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_ui/Attic/user_relationships_ui.admin.inc,v
retrieving revision 1.1.2.18
diff -u -p -r1.1.2.18 user_relationships_ui.admin.inc
--- user_relationships_ui/user_relationships_ui.admin.inc	23 Sep 2009 15:22:48 -0000	1.1.2.18
+++ user_relationships_ui/user_relationships_ui.admin.inc	28 Sep 2009 12:18:21 -0000
@@ -110,7 +110,7 @@ function user_relationships_ui_settings(
     '#size' => 4,
     '#description' => t("Sets the css <em>top</em> property of AJAX confirmation popups. Try the value of 0 for 'Mouse cursor', or 0.4 for 'Fixed'. You may enter a distance in pixels, or as a % using a value 1 or less. Relative positioning requires a fixed position."),
   );
-  
+
   $replaceables = array(
     '!requester',
     '!requestee',
@@ -125,7 +125,7 @@ function user_relationships_ui_settings(
     '#weight'       => 0,
     '#description'  => t('Notifications to users. Replaceable tokens are: @replaceables', array('@replaceables' => implode($replaceables, ', '))),
   );
-  
+
   $form['messages']['user_relationships_requests_link'] = array(
     '#type' => 'textfield',
     '#title' => t('Path to relationship requests'),
@@ -194,6 +194,16 @@ function user_relationships_ui_type_edit
       '#default_value' => is_array($relationship_type->roles) ? $relationship_type->roles : array(),
     ),
   );
+  $form['roles_receive'] = array(
+    '#title' => t('Role receive access'),
+    '#type' => 'fieldset',
+    '#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.'),
+    'roles_receive' => array(
+      '#type' => 'checkboxes',
+      '#options' => user_roles(TRUE),
+      '#default_value' => is_array($relationship_type->roles_receive) ? $relationship_type->roles_receive : array(),
+    ),
+  );
   $form['rtid'] = array(
     '#type'   => 'value',
     '#value'  => (int)$relationship_type->rtid,
Index: user_relationships_ui/user_relationships_ui.admin_actions.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_ui/Attic/user_relationships_ui.admin_actions.inc,v
retrieving revision 1.1.2.12
diff -u -p -r1.1.2.12 user_relationships_ui.admin_actions.inc
--- user_relationships_ui/user_relationships_ui.admin_actions.inc	27 Apr 2009 16:02:59 -0000	1.1.2.12
+++ user_relationships_ui/user_relationships_ui.admin_actions.inc	28 Sep 2009 12:18:21 -0000
@@ -85,7 +85,7 @@ function user_relationships_ui_type_edit
       l(t('view'), 'admin/user/relationships/'. $relationship_type->rtid .'/edit')
     );
   }
-  
+
   //save role permissions for this rtype
   db_query('DELETE FROM {user_relationship_type_roles} WHERE rtid = %d', $relationship_type->rtid);
   if ($form_state['values']['roles']) {
@@ -98,6 +98,18 @@ function user_relationships_ui_type_edit
       }
     }
   }
+  //save role receive permissions for this rtype
+  db_query('DELETE FROM {user_relationship_type_roles_receive} WHERE rtid = %d', $relationship_type->rtid);
+  if ($form_state['values']['roles_receive']) {
+    $role_receive_record = new StdClass;
+    $role_receive_record->rtid = $relationship_type->rtid;
+    foreach ($form_state['values']['roles_receive'] as $rid => $selected) {
+      if ($rid == $selected) {
+        $role_receive_record->rid = $selected;
+        drupal_write_record('user_relationship_type_roles_receive', $role_receive_record);
+      }
+    }
+  }
 
   user_relationships_types_load(TRUE);
   menu_rebuild();
Index: user_relationships_ui/user_relationships_ui.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_ui/Attic/user_relationships_ui.module,v
retrieving revision 1.1.2.28
diff -u -p -r1.1.2.28 user_relationships_ui.module
--- user_relationships_ui/user_relationships_ui.module	23 Sep 2009 15:22:48 -0000	1.1.2.28
+++ user_relationships_ui/user_relationships_ui.module	28 Sep 2009 12:18:21 -0000
@@ -31,8 +31,8 @@ function user_relationships_ui_get_messa
   $msg = variable_get("user_relationships_ui_msg_{$key}", NULL);
 
   if ($relationship) {
-    if (!$relationship->requester) { 
-      $relationship->requester = user_load($relationship->requester_id); 
+    if (!$relationship->requester) {
+      $relationship->requester = user_load($relationship->requester_id);
     }
     if (!$relationship->requestee) {
       $relationship->requestee = user_load($relationship->requestee_id);
@@ -44,11 +44,11 @@ function user_relationships_ui_get_messa
     $replaceables = array(
       '!requester'                => theme('username', $relationship->requester),
       '!requestee'                => theme('username', $relationship->requestee),
-      '%relationship_name'        => $relationship->name 
-                                     ? tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name) 
+      '%relationship_name'        => $relationship->name
+                                     ? tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name)
                                      : tt("user_relationships:rtid:$relationship->rtid:name", $relationship->type->name),
-      '%relationship_plural_name' => $relationship->plural_name 
-                                     ? tt("user_relationships:rtid:$relationship->rtid:plural_name", $relationship->plural_name) 
+      '%relationship_plural_name' => $relationship->plural_name
+                                     ? tt("user_relationships:rtid:$relationship->rtid:plural_name", $relationship->plural_name)
                                      : tt("user_relationships:rtid:$relationship->rtid:plural_name", $relationship->type->plural_name),
     );
     $replacements = array_merge($replaceables, $replacements);
@@ -73,7 +73,7 @@ function user_relationships_ui_get_messa
  **********************************/
 
 /**
- * Returns a nested array of default messages. 
+ * Returns a nested array of default messages.
  * When adding any keys, add translations below in _user_relationships_ui_default_message_key_translations()
  */
 function _user_relationships_ui_default_messages($replacements) {
@@ -249,7 +249,7 @@ function _user_relationships_ui_actions_
           continue;
         }
         //check this type can be requested
-        if (!user_relationships_api_can_request($viewer, $relationship)) {
+        if (!user_relationships_api_can_request($viewer, $relationship) || !user_relationships_api_can_receive($viewed, $relationship)) {
           continue;
         }
         $list[] = theme('user_relationships_request_relationship_direct_link', $viewed, $relationship);
@@ -308,7 +308,7 @@ function _user_relationships_ui_get_requ
       continue;
     }
     //exclude types that are not allowed
-    if (!user_relationships_api_can_request($requester, $rtype)) {
+    if (!user_relationships_api_can_request($requester, $rtype) || !user_relationships_api_can_receive($requestee, $rtype)) {
       continue;
     }
     $relationships[$rtype->rtid] = tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name);
@@ -382,8 +382,8 @@ function user_relationships_ui_init() {
   $settings['user_relationships_ui']['loadingimage'] = url(USER_RELATIONSHIPS_UI_PATH .'/images/loadingAnimation.gif');
   $settings['user_relationships_ui']['savingimage'] = url(USER_RELATIONSHIPS_UI_PATH .'/images/savingimage.gif');
   $settings['user_relationships_ui']['position'] = array(
-    'position' => variable_get('user_relationships_position', 'absolute'), 
-    'left' => variable_get('user_relationships_left', '0'), 
+    'position' => variable_get('user_relationships_position', 'absolute'),
+    'left' => variable_get('user_relationships_left', '0'),
     'top' => variable_get('user_relationships_top', '0'),
   );
   drupal_add_js($settings, 'setting');
@@ -684,9 +684,9 @@ function user_relationships_ui_user($typ
       }
     }
     //#257748 #458046 for adding the functionality of allowing/disallowing private messages.
-    if ($category == 'account' 
+    if ($category == 'account'
         && variable_get('user_relationships_restrict_privatemsg', 'all') == 'all_overridable'
-        && user_access('maintain own relationships', $account) 
+        && user_access('maintain own relationships', $account)
         && module_exists('privatemsg')
     ) { //check if privatemsg is installed
       $form['user_relationships_ui_privatemsg_settings'] = array(
@@ -814,13 +814,13 @@ function template_preprocess_user_relati
   }
 
   if ($account->uid == $user->uid) {
-    $msg = $relationship_type 
-           ? t("My %relationships", array('%relationships' => $relationship_type->plural_name ? tt("user_relationships:rtid:$relationship_type->rtid:plural_name", $relationship_type->plural_name) : tt("user_relationships:rtid:$relationship_type->rtid:name", $relationship_type->name))) 
+    $msg = $relationship_type
+           ? t("My %relationships", array('%relationships' => $relationship_type->plural_name ? tt("user_relationships:rtid:$relationship_type->rtid:plural_name", $relationship_type->plural_name) : tt("user_relationships:rtid:$relationship_type->rtid:name", $relationship_type->name)))
            : t("All my relationships");
   }
   else {
-    $msg = $relationship_type 
-           ? t("%username's %relationships", array('%username' => $account->name, '%relationships' => $relationship_type->plural_name ? tt("user_relationships:rtid:$relationship_type->rtid:plural_name", $relationship_type->plural_name) : tt("user_relationships:rtid:$relationship_type->rtid:name", $relationship_type->name))) 
+    $msg = $relationship_type
+           ? t("%username's %relationships", array('%username' => $account->name, '%relationships' => $relationship_type->plural_name ? tt("user_relationships:rtid:$relationship_type->rtid:plural_name", $relationship_type->plural_name) : tt("user_relationships:rtid:$relationship_type->rtid:name", $relationship_type->name)))
            : t("All %username's relationships", array('%username' => $account->name));
   }
 
