Index: webform.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/webform/webform.module,v
retrieving revision 1.146
diff -u -r1.146 webform.module
--- webform.module	10 Jan 2010 03:04:15 -0000	1.146
+++ webform.module	10 Jan 2010 03:11:13 -0000
@@ -187,7 +187,7 @@
     'page callback' => 'webform_results_submissions',
     'page arguments' => array(1, FALSE, '50'),
     'access callback' => 'webform_results_access',
-    'access arguments' => array(1, 'access webform results'),
+    'access arguments' => array(1),
     'file' => 'includes/webform.report.inc',
     'weight' => 2,
     'type' => MENU_LOCAL_TASK,
@@ -197,7 +197,7 @@
     'page callback' => 'webform_results_submissions',
     'page arguments' => array(1, FALSE, '50'),
     'access callback' => 'webform_results_access',
-    'access arguments' => array(1, 'access webform results'),
+    'access arguments' => array(1),
     'file' => 'includes/webform.report.inc',
     'weight' => 4,
     'type' => MENU_DEFAULT_LOCAL_TASK,
@@ -207,7 +207,7 @@
     'page callback' => 'webform_results_analysis',
     'page arguments' => array(1),
     'access callback' => 'webform_results_access',
-    'access arguments' => array(1, 'access webform results'),
+    'access arguments' => array(1),
     'file' => 'includes/webform.report.inc',
     'weight' => 5,
     'type' => MENU_LOCAL_TASK,
@@ -217,7 +217,7 @@
     'page callback' => 'webform_results_table',
     'page arguments' => array(1, '50'),
     'access callback' => 'webform_results_access',
-    'access arguments' => array(1, 'access webform results'),
+    'access arguments' => array(1),
     'file' => 'includes/webform.report.inc',
     'weight' => 6,
     'type' => MENU_LOCAL_TASK,
@@ -227,7 +227,7 @@
     'page callback' => 'drupal_get_form',
     'page arguments' => array('webform_results_download_form', 1),
     'access callback' => 'webform_results_access',
-    'access arguments' => array(1, 'access webform results'),
+    'access arguments' => array(1),
     'file' => 'includes/webform.report.inc',
     'weight' => 7,
     'type' => MENU_LOCAL_TASK,
@@ -236,8 +236,8 @@
     'title' => 'Clear',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('webform_results_clear_form', 1),
-    'access callback' => 'webform_results_access',
-    'access arguments' => array(1, 'clear webform results'),
+    'access callback' => 'webform_results_clear_access',
+    'access arguments' => array(1),
     'file' => 'includes/webform.report.inc',
     'weight' => 8,
     'type' => MENU_LOCAL_TASK,
@@ -374,21 +374,31 @@
 
   switch ($op) {
     case 'view':
-      return user_access('access webform results') || (user_access('access own webform submissions') && ($account->uid == $submission->uid));
+      return user_access('access webform results', $account) || (user_access('access own webform submissions', $account) && ($account->uid == $submission->uid)) || (user_access('access own webform results', $account) && $account->uid == $node->uid);
     case 'edit':
-      return user_access('edit webform submissions') || (user_access('edit own webform submissions') && ($account->uid == $submission->uid));
+      return user_access('edit webform submissions', $account) || (user_access('edit own webform submissions', $account) && ($account->uid == $submission->uid));
     case 'delete':
-      return user_access('edit webform submissions') || (user_access('edit own webform submissions') && ($account->uid == $submission->uid)) || user_access('clear webform results');
+      return user_access('edit webform submissions', $account) || (user_access('edit own webform submissions', $account) && ($account->uid == $submission->uid)) || user_access('clear webform results', $account);
     case 'list':
-      return user_access('access webform results') || user_access('access webform submissions') || (user_access('access own webform submissions')  && $user->uid);
+      return user_access('access webform results', $account) || user_access('access webform submissions', $account) || (user_access('access own webform submissions', $account) && $account->uid) || (user_access('access own webform results', $account) && $account->uid == $node->uid);
   }
 }
 
 /**
  * Menu access callback. Ensure a user both access and node 'view' permission.
  */
-function webform_results_access($node, $perm) {
-  return node_access('view', $node) && user_access($perm);
+function webform_results_access($node, $account = NULL) {
+  global $user;
+  $account = isset($account) ? $account : $user;
+
+  return (node_access('view', $node, $account) && (user_access('access webform results', $account) || (user_access('access own webform results', $account) && $account->uid == $node->uid)));
+}
+
+function webform_results_clear_access($node, $account = NULL) {
+  global $user;
+  $account = isset($account) ? $account : $user;
+
+  return node_access('view', $node) && user_access('clear webform results', $account);
 }
 
 /**
@@ -404,7 +414,7 @@
  * Implementation of hook_perm().
  */
 function webform_perm() {
-  return array('create webforms', 'edit own webforms', 'edit webforms', 'access webform results', 'clear webform results', 'access own webform submissions', 'edit own webform submissions', 'edit webform submissions', 'use PHP for additional processing');
+  return array('create webforms', 'edit own webforms', 'edit webforms', 'access webform results', 'access own webform results', 'clear webform results', 'access own webform submissions', 'edit own webform submissions', 'edit webform submissions', 'use PHP for additional processing');
 }
 
 /**
@@ -548,8 +558,10 @@
  * Only allow users with view webform submissions to download files.
  */
 function webform_file_download($file) {
+  global $user;
+
   $file = file_check_location(file_directory_path() .'/'. $file, file_directory_path() .'/webform/');
-  if ($file && user_access('access webform results')) {
+  if ($file && (user_access('access webform results') || (user_access('access own webform results')))) {
     $info = image_get_info(file_create_path($file));
     if (isset($info['mime_type'])) {
       $headers = array('Content-type: '. $info['mime_type']);
@@ -852,7 +864,7 @@
   }
 
   // Get a count of previous submissions by this user.
-  if ($user->uid && (user_access('access own webform submissions') || user_access('access webform results') || user_access('access webform submissions'))) {
+  if ($user->uid && (user_access('access own webform submissions') || user_access('access webform results') || user_access('access webform submissions') || (user_access('access own webform results') && $user->uid == $node->uid))) {
     $submission_count = db_result(db_query('SELECT count(*) FROM {webform_submissions} WHERE nid = %d AND uid = %d', $node->nid, $user->uid));
   }
 
@@ -1171,6 +1183,8 @@
  *   Form Builder.
  */
 function webform_client_form(&$form_state, $node, $submission, $enabled = FALSE, $filter = TRUE) {
+  global $user;
+
   module_load_include('inc', 'webform', 'includes/webform.components');
   webform_load_components();
 
@@ -1179,7 +1193,7 @@
   }
 
   // Set a header for navigating results.
-  if ($submission && user_access('access webform results')) {
+  if ($submission && (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid))) {
     // Add CSS to display submission info. Don't preprocess because this CSS file is used rarely.
     drupal_add_css(drupal_get_path('module', 'webform') .'/webform.css', 'module', 'all', FALSE);
 
