Index: components/hidden.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/webform/components/hidden.inc,v
retrieving revision 1.15
diff -u -r1.15 hidden.inc
--- components/hidden.inc	20 Jun 2009 23:04:58 -0000	1.15
+++ components/hidden.inc	10 Jan 2010 07:03:11 -0000
@@ -85,7 +85,7 @@
 function _webform_submission_display_hidden($data, $component, $enabled = FALSE) {
   $form_item = _webform_render_hidden($component);
   // Only allow administrators that can view or edit all submissions to view or edit hidden fields.
-  if (user_access('edit webform submissions') || user_access('access webform results')) {
+  if (user_access('edit all webform submissions') || user_access('access all webform results')) {
     unset($form_item['#value']);
     $form_item['#default_value'] = $data['value']['0'];
     $form_item['#type'] = 'textfield';
Index: webform.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/webform/webform.module,v
retrieving revision 1.147
diff -u -r1.147 webform.module
--- webform.module	10 Jan 2010 03:14:17 -0000	1.147
+++ webform.module	10 Jan 2010 07:03:11 -0000
@@ -70,7 +70,7 @@
     'title' => 'Webforms',
     'page callback' => 'webform_admin_content',
     'access callback' => 'user_access',
-    'access arguments' => array('access webform results'),
+    'access arguments' => array('access all webform results'),
     'description' => 'View and edit all the available webforms on your site.',
     'type' => MENU_NORMAL_ITEM,
   );
@@ -372,15 +372,17 @@
   global $user;
   $account = isset($account) ? $account : $user;
 
+  $general_access = user_access('access all webform results', $account) || (isset($submission) && user_access('access own webform submissions', $account) && ($account->uid == $submission->uid)) || (user_access('access own webform results', $account) && $account->uid == $node->uid);
+
   switch ($op) {
     case 'view':
-      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);
+      return $general_access;
     case 'edit':
-      return user_access('edit webform submissions', $account) || (user_access('edit own webform submissions', $account) && ($account->uid == $submission->uid));
+      return $general_access && (user_access('edit all webform submissions', $account) || (user_access('edit own webform submissions', $account) && $account->uid == $submission->uid));
     case 'delete':
-      return user_access('edit webform submissions', $account) || (user_access('edit own webform submissions', $account) && ($account->uid == $submission->uid)) || user_access('clear webform results', $account);
+      return $general_access && (user_access('delete all webform submissions', $account) || (user_access('delete own webform submissions', $account) && $account->uid == $submission->uid));
     case 'list':
-      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);
+      return user_access('access all webform results', $account) || (user_access('access own webform submissions', $account) && $account->uid) || (user_access('access own webform results', $account) && $account->uid == $node->uid);
   }
 }
 
@@ -391,14 +393,14 @@
   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)));
+  return node_access('view', $node, $account) && (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) {
   global $user;
   $account = isset($account) ? $account : $user;
 
-  return node_access('view', $node) && user_access('clear webform results', $account);
+  return webform_results_access($node, $account) && user_access('delete all webform submissions', $account);
 }
 
 /**
@@ -414,7 +416,15 @@
  * Implementation of hook_perm().
  */
 function webform_perm() {
-  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');
+  return array(
+    'access all webform results',
+    'access own webform results',
+    'edit all webform submissions',
+    'delete all webform submissions',
+    'access own webform submissions',
+    'edit own webform submissions',
+    'delete own webform submissions',
+  );
 }
 
 /**
@@ -526,21 +536,6 @@
 }
 
 /**
- * Implementation of hook_access().
- */
-function webform_access($op, $node, $account) {
-  switch ($op) {
-    case 'create':
-      return user_access('create webforms', $account);
-    case 'update':
-    case 'delete':
-      if (user_access('edit webforms', $account) || (user_access('edit own webforms', $account) && ($account->uid == $node->uid))) {
-        return TRUE;
-      }
-  }
-}
-
-/**
  * Implementation of hook_forms().
  * All webform_client_form forms share the same form handler
  */
@@ -561,7 +556,7 @@
   global $user;
 
   $file = file_check_location(file_directory_path() .'/'. $file, file_directory_path() .'/webform/');
-  if ($file && (user_access('access webform results') || (user_access('access own webform results')))) {
+  if ($file && (user_access('access all 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']);
@@ -864,7 +859,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') || (user_access('access own webform results') && $user->uid == $node->uid))) {
+  if ($user->uid && (user_access('access own webform submissions') || user_access('access all webform results') || (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));
   }
 
@@ -1193,7 +1188,7 @@
   }
 
   // Set a header for navigating results.
-  if ($submission && (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid))) {
+  if ($submission && (user_access('access all 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);
 
@@ -2045,7 +2040,7 @@
       l(t('Table'), 'node/'. $node->nid .'/webform-results/table'),
       l(t('Download'), 'node/'. $node->nid .'/webform-results/download'),
       node_access('update', $node) ? l(t('Edit'), 'node/'. $node->nid .'/edit') : '',
-      user_access('clear webform results') ? l(t('Clear'), 'node/'. $node->nid .'/webform-results/clear') : '',
+      user_access('delete all webform submissions') ? l(t('Clear'), 'node/'. $node->nid .'/webform-results/clear') : '',
     );
   }
 
Index: webform.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/webform/webform.install,v
retrieving revision 1.28
diff -u -r1.28 webform.install
--- webform.install	10 Jan 2010 01:59:24 -0000	1.28
+++ webform.install	10 Jan 2010 07:03:10 -0000
@@ -1202,6 +1202,39 @@
 }
 
 /**
+ * Migrate the renamed permissions. Add separate permissions for delete.
+ */
+function webform_update_6305() {
+  $ret = array();
+
+  $updated_permissions = array(
+    'create webforms' => array('add webform content'),
+    'edit own webforms' => array('edit own webform content', 'delete own webform content'),
+    'edit webforms' => array('edit any webform content', 'delete any webform content'),
+    'access webform results' => array('access all webform results'),
+    'edit webform submissions' => array('edit all webform submissions'),
+    'edit own webform submissions' => array('edit own webform submissions', 'delete own webform submissions'),
+    'clear webform results' => array('delete all webform submissions'),
+  );
+
+  $result = db_query("SELECT * FROM {role} r INNER JOIN {permission} p ON p.rid = r.rid");
+  while ($role = db_fetch_object($result)) {
+    $role->perm = drupal_map_assoc(explode(', ', $role->perm));
+    foreach ($updated_permissions as $old => $new) {
+      if (isset($role->perm[$old])) {
+        unset($role->perm[$old]);
+        foreach ($new as $perm) {
+          $role->perm[$perm] = $perm;
+        }
+      }
+    }
+    $ret[] = update_sql("UPDATE {permission} SET perm = '" . implode(',', $role->perm) . "' WHERE rid = " . $role->rid);
+  }
+
+  return $ret;
+}
+
+/**
  * Recursively delete all files and folders in the specified filepath, then
  * delete the containing folder.
  *
Index: views/webform_handler_field_submission_count.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/webform/views/webform_handler_field_submission_count.inc,v
retrieving revision 1.2
diff -u -r1.2 webform_handler_field_submission_count.inc
--- views/webform_handler_field_submission_count.inc	15 Jun 2009 20:31:02 -0000	1.2
+++ views/webform_handler_field_submission_count.inc	10 Jan 2010 07:03:11 -0000
@@ -34,7 +34,7 @@
     if ($this->count_type == 'node') {
       module_load_include('inc', 'webform', 'includes/webform.submissions');
       $node = node_load($values->{$this->aliases['nid']});
-      if (webform_results_access($node, 'access webform results')) {
+      if (webform_results_access($node, 'access all webform results')) {
         $count = webform_get_submission_count($node->nid);
         $output = l($count, "node/$node->nid/webform-results");
       }
Index: tests/webform.test
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/webform/tests/webform.test,v
retrieving revision 1.3
diff -u -r1.3 webform.test
--- tests/webform.test	17 Jun 2009 23:21:10 -0000	1.3
+++ tests/webform.test	10 Jan 2010 07:03:11 -0000
@@ -46,18 +46,18 @@
       'access content',
       'create webforms',
       'edit own webforms',
-      'access webform results',
+      'access all webform results',
     );
 
     // Create a webform admin that will do all node creation.
     $permissions['admin'] = array(
       'access content',
       'administer nodes',
-      'create webforms',
-      'edit webforms',
-      'edit webform submissions',
-      'access webform results',
-      'clear webform results',
+      'create webform content',
+      'edit any webform content',
+      'access all webform results',
+      'edit all webform submissions',
+      'delete all webform submissions',
     );
 
     foreach ($permissions as $user => $role_permissions) {
Index: includes/webform.report.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/webform/includes/webform.report.inc,v
retrieving revision 1.2
diff -u -r1.2 webform.report.inc
--- includes/webform.report.inc	10 Jan 2010 03:24:57 -0000	1.2
+++ includes/webform.report.inc	10 Jan 2010 07:03:11 -0000
@@ -94,7 +94,7 @@
     array('data' => t('#'), 'field' => 'sid', 'sort' => 'asc'),
     array('data' => t('Submitted'), 'field' => 'submitted'),
   );
-  if (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid)) {
+  if (user_access('access all webform results') || (user_access('access own webform results') && $user->uid == $node->uid)) {
     $columns[] = array('data' => t('User'), 'field' => 'name');
     $columns[] = array('data' => t('IP Address'), 'field' => 'remote_addr');
   }
@@ -130,12 +130,12 @@
       $sid,
       format_date($submission->submitted, 'small'),
     );
-    if (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid)) {
+    if (user_access('access all webform results') || (user_access('access own webform results') && $user->uid == $node->uid)) {
       $row[] = theme('username', $submission);
       $row[] = $submission->remote_addr;
     }
     $row[] = l(t('View'), "node/$node->nid/submission/$sid");
-    if ((user_access('edit own webform submissions') && ($user->uid == $submission->uid)) || user_access('edit webform submissions')) {
+    if ((user_access('edit own webform submissions') && $user->uid == $submission->uid) || user_access('edit all webform submissions')) {
       $row[] = l(t('Edit'), "node/$node->nid/submission/$sid/edit");
       $row[] = l(t('Delete'), "node/$node->nid/submission/$sid/delete", array('query' => drupal_get_destination()));
     }
