--- webform/webform.module	2011-02-25 22:25:45.000000000 +0100
+++ webformNew.module	2011-03-03 10:22:17.571534000 +0100
@@ -1,4 +1,5 @@
 <?php
+// $Id: webform.module,v 1.196.2.84 2011/02/24 07:28:12 quicksketch Exp $
 
 /**
  * This module provides a simple way to create forms and questionnaires.
@@ -451,8 +452,24 @@ function webform_results_access($node, $
   $account = isset($account) ? $account : $user;
 
   $module_access = count(array_filter(module_invoke_all('webform_results_access', $node, $account))) > 0;
+	$allowed_roles = array();
+	foreach ($node->webform['submissions_roles'] as $rid) {
+        $allowed_roles[$rid] = isset($user->roles[$rid]) ? TRUE : FALSE;
+    }
 
-  return node_access('view', $node, $account) && ($module_access || user_access('access all webform results', $account) || (user_access('access own webform results', $account) && $account->uid == $node->uid));
+	if (array_search(TRUE, $allowed_roles) === FALSE && $user->uid != 1) {
+		$submissions_roles = FALSE;
+	}
+	else{
+		$submissions_roles = TRUE;
+	}
+ 
+	// Add submissions_roles to return.
+  return node_access('view', $node, $account) && ($module_access || $submissions_roles || user_access('access all webform results', $account) || (user_access('access own webform results', $account) && $account->uid == $node->uid));
 }
 
 function webform_results_clear_access($node, $account = NULL) {
@@ -949,6 +966,10 @@ function webform_node_insert($node) {
   foreach (array_filter($node->webform['roles']) as $rid) {
     db_query('INSERT INTO {webform_roles} (nid, rid) VALUES (%d, %d)', $node->nid, $rid);
   }
+  // Set the per-role results submission access control
+  foreach (array_filter($node->webform['submissions_roles']) as $rid) {
+    db_query('INSERT INTO {webform_submissions_roles} (nid, rid) VALUES (%d, %d)', $node->nid, $rid);
+  }
 }
 
 /**
@@ -1033,6 +1054,12 @@ function webform_node_update($node) {
       db_query('INSERT INTO {webform_roles} (nid, rid) VALUES (%d, %d)', $node->nid, $rid);
     }
   }
+   if ($original->webform['submissions_roles'] != $node->webform['submissions_roles']) {
+    db_query('DELETE FROM {webform_submissions_roles} WHERE nid = %d', $node->nid);
+    foreach (array_filter($node->webform['submissions_roles']) as $rid) {
+      db_query('INSERT INTO {webform_submissions_roles} (nid, rid) VALUES (%d, %d)', $node->nid, $rid);
+    }
+  }
 }
 
 /**
@@ -1054,6 +1081,7 @@ function webform_node_delete($node) {
   db_query('DELETE FROM {webform_component} WHERE nid = %d', $node->nid);
   db_query('DELETE FROM {webform_emails} WHERE nid = %d', $node->nid);
   db_query('DELETE FROM {webform_roles} WHERE nid = %d', $node->nid);
+  db_query('DELETE FROM {webform_submissions_roles} WHERE nid = %d', $node->nid);
   db_query('DELETE FROM {webform_submissions} WHERE nid = %d', $node->nid);
   db_query('DELETE FROM {webform_submitted_data} WHERE nid = %d', $node->nid);
 }
 
@@ -1128,7 +1157,13 @@ function webform_node_load($node) {
     while ($role = db_fetch_object($result)) {
       $additions['webform']['roles'][] = $role->rid;
     }
-

+	$additions['webform']['submissions_roles'] = array();
+    $result = db_query('SELECT rid FROM {webform_submissions_roles} WHERE nid = %d', $node->nid);
+    while ($role = db_fetch_object($result)) {
+      $additions['webform']['submissions_roles'][] = $role->rid;
+    }
     $additions['webform']['emails'] = array();
     $result = db_query('SELECT * FROM {webform_emails} WHERE nid = %d', $node->nid);
     while ($email = db_fetch_array($result)) {
