From c86deed6d1cd9056aeddeb84778d545ba27d5be0 Mon Sep 17 00:00:00 2001
From: Kevin Kaland <kevin@wizonesolutions.com>
Date: Tue, 25 Apr 2017 00:41:05 -0400
Subject: [PATCH] Fix file access handling.

This includes tests.
---
 fillpdf.module                    |  38 +++++++++++++++++
 tests/fillpdf.test                |  65 +++++++++++++++++++++++++++++-
 tests/fillpdf_test_v4.pdf         | Bin 0 -> 32182 bytes
 tests/modules/fillpdf_test.info   |   8 ++++
 tests/modules/fillpdf_test.module |  20 +++++++++
 5 files changed, 129 insertions(+), 2 deletions(-)
 create mode 100644 tests/fillpdf_test_v4.pdf
 create mode 100644 tests/modules/fillpdf_test.info
 create mode 100644 tests/modules/fillpdf_test.module

diff --git a/fillpdf.module b/fillpdf.module
index 6b6c52c..fdab05c 100644
--- a/fillpdf.module
+++ b/fillpdf.module
@@ -225,6 +225,21 @@ function fillpdf_file_download($uri) {
   return NULL;
 }
 
+/**
+ * Implements hook_file_download_access_alter().
+ */
+function fillpdf_file_download_access_alter(&$grants, $file_item, $entity_type, $entity) {
+  // If the user has the Publish All PDFs permission but does not have access,
+  // to the entity used to generate the file, another module might have denied
+  // them access in hook_file_download(). However, if they have Publish All
+  // PDFs, then we would have allowed them to generate the file anwyay. We
+  // therefore do a second check here and grant access definitively.
+  if (user_access('publish all pdfs') && !!fillpdf_file_download($file_item['uri'])) {
+    $grants['fillpdf'] = TRUE;
+    return;
+  }
+}
+
 /**
  * Gets a link to the printable PDF, merged with the passed-in data.
  *
@@ -1140,6 +1155,9 @@ function fillpdf_execute_merge($method, $fields, $fillpdf, $mode = 'url', $flatt
       }
       file_unmanaged_delete($xfdffile);
       break;
+
+    case 'test':
+      $data = file_get_contents(drupal_get_path('module', 'fillpdf') . '/tests/fillpdf_test_v4.pdf');
   }
   if ($data) {
     return $data;
@@ -1300,6 +1318,26 @@ function fillpdf_execute_parse($method, $fillpdf, $mode = 'url') {
         }
       }
       break;
+
+    case 'test':
+      $fields = array(
+        0 => array(
+          'name' => 'ImageField',
+          'value' => '',
+          'type' => 'Pushbutton',
+        ),
+        1 => array(
+          'name' => 'Button',
+          'value' => '',
+          'type' => 'Pushbutton',
+        ),
+        2 => array(
+          'name' => 'TextField',
+          'value' => '',
+          'type' => 'Text',
+        ),
+      );
+      break;
   }
   if ($mode == 'stream') {
     file_unmanaged_delete($filename);
diff --git a/tests/fillpdf.test b/tests/fillpdf.test
index 3af7f6c..60f4242 100644
--- a/tests/fillpdf.test
+++ b/tests/fillpdf.test
@@ -10,8 +10,9 @@
  *
  * @todo Add a test based on an Acrobat-created PDF.
  */
-class FillPdfWebTestCase extends DrupalWebTestCase {
+class FillPdfWebTestCase extends FileFieldTestCase {
   protected $privileged_user;
+  protected $nonPrivilegedUser;
 
   /**
    *
@@ -31,7 +32,7 @@ class FillPdfWebTestCase extends DrupalWebTestCase {
   public function setUp() {
     // Enable any modules required for the test. This should be an array of
     // module names.
-    parent::setUp(array('fillpdf'));
+    parent::setUp(array('fillpdf_test'));
 
     // Create and log in our privileged user.
     $this->privileged_user = $this->drupalCreateUser(array(
@@ -39,6 +40,11 @@ class FillPdfWebTestCase extends DrupalWebTestCase {
       'administer pdfs',
       'publish all pdfs',
     ));
+
+    $this->nonPrivilegedUser = $this->drupalCreateUser(array(
+      'access content',
+    ));
+
     $this->drupalLogin($this->privileged_user);
   }
 
@@ -109,4 +115,59 @@ class FillPdfWebTestCase extends DrupalWebTestCase {
     $this->assertEqual($expected_link2, $actual_link2, 'fillpdf_context_to_link() generates a link with multiple Webforms correctly.');
   }
 
+  /**
+   * Make sure that file access works properly.
+   */
+  public function testFileAccess() {
+    $this->createFileField('field_pdf', 'page');
+
+    // Make a basic page.
+    $new_node = new stdClass();
+    $new_node->type = 'page';
+    $new_node->title = t('Test node');
+    $new_node->field_body = array(
+      LANGUAGE_NONE => array(
+        0 => array(
+          'value' => 'This is test text.',
+        ),
+      ),
+    );
+    $new_node->uid = 1;
+    node_save($new_node);
+
+    variable_set('fillpdf_service', 'test');
+    variable_set('fillpdf_scheme', 'private');
+
+    // Upload a template.
+    $this->drupalPost('admin/structure/fillpdf', array(
+      'files[upload_pdf]' => drupal_realpath(drupal_get_path('module', 'fillpdf') . '/tests/fillpdf_test_v4.pdf'),
+    ), t('Upload'));
+
+    $this->drupalGet('node/1');
+    $this->assertResponse(403, 'Access properly denied for non-admin.');
+
+    db_update('fillpdf_forms')
+      ->fields(array('destination_path' => 'output'))
+      ->condition('fid', 1)
+      ->execute();
+
+    $fillpdf_object = fillpdf_merge_pdf(1, array(1), NULL, NULL, FALSE, FALSE, TRUE, FALSE);
+    $saved_file = fillpdf_action_save_to_file($fillpdf_object, 'fillpdf_test_v4.pdf', FALSE, FALSE);
+    $saved_file->display = 1;
+
+    $new_node->field_pdf = array(
+      LANGUAGE_NONE => array(
+        0 => (array) $saved_file,
+      ),
+    );
+    node_save($new_node);
+
+    $this->drupalGet('system/files/fillpdf/output/fillpdf_test_v4.pdf');
+    $this->assertResponse(200, 'User can generate and access PDF from any data when they have the Publish All PDFs permission.');
+
+    $this->drupalLogin($this->nonPrivilegedUser);
+    $this->drupalGet('system/files/fillpdf/output/fillpdf_test_v4.pdf');
+    $this->assertResponse(403, 'User without Administer PDFs and without Publish All PDFs cannot access PDF they cannot view the node for.');
+  }
+
 }
diff --git a/tests/fillpdf_test_v4.pdf b/tests/fillpdf_test_v4.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..234d07010d652133406508fe5013e8205f4272e0
GIT binary patch
literal 32182
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
Yj27>ZN`H^hpC@xep};ZiyJvI%A6N)MF#rGn

literal 0
HcmV?d00001

diff --git a/tests/modules/fillpdf_test.info b/tests/modules/fillpdf_test.info
new file mode 100644
index 0000000..03eb789
--- /dev/null
+++ b/tests/modules/fillpdf_test.info
@@ -0,0 +1,8 @@
+name = FillPDF Testing
+description = Supports FillPDF tests. Do not enable manually.
+core = 7.x
+package = Other
+dependencies[] = fillpdf
+
+; This is a test module.
+hidden = TRUE
diff --git a/tests/modules/fillpdf_test.module b/tests/modules/fillpdf_test.module
new file mode 100644
index 0000000..ef590fa
--- /dev/null
+++ b/tests/modules/fillpdf_test.module
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Implements hook_node_access().
+ */
+function fillpdf_test_node_access($node, $op, $account) {
+  if (is_string($node)) {
+    $node = new stdClass();
+    $node->type = $node;
+  }
+
+  if ($node->type !== 'page') {
+    return NODE_ACCESS_IGNORE;
+  }
+
+  if (!empty($account->uid) && (int) $account->uid === 1) {
+    return NODE_ACCESS_ALLOW;
+  }
+
+  return NODE_ACCESS_DENY;
+}
-- 
GitLab