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