WP Manifestindependent plugin directory
manifest / events / tribe-ext-pdf-tickets

Event Tickets Extension: PDF Tickets WP Registry grade D+. High-severity findings · 2 findingsWP RegistryHigh-severity findings · 2 findingsOpen the reportD+

Event Tickets' RSVP, Tribe Commerce PayPal, WooCommerce, and/or Easy Digital Downloads ticket emails will become PDF files saved to your Uploads directory and then get attached to the ticket emails.

★ 2stars
3.8krelease downloads
1.2.4latest · 3 years ago

Install

Download tribe-ext-pdf-tickets-1.2.4.zip From the 1.2.4 release on GitHub, Jul 18, 2023

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/mt-support/tribe-ext-pdf-tickets/releases/download/1.2.4/tribe-ext-pdf-tickets-1.2.4.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

The mPDF library we rely upon for this extension uses Composer and autoloading (as of their version 7 from October 2017):

Composer is now the only officially supported installation method. There are no pre-packaged library archives.

View mPDF's changelogs at https://github.com/mpdf/mpdf/releases

Instructions for this extension's build and package process for a new version of the plugin:

  1. Clone this GitHub repository and create a new branch for your changes.
  2. Install Composer into your branch's directory.
    1. Since you may use Composer in other projects, you may want to install Composer at /Users/YOUR-NAME/composer.phar and then make a symlink pointing to it at /Users/YOUR-NAME/git/tribe-ext-pdf-tickets/composer.phar so that you can have Composer installed just once on your machine but run it in each project you use Composer for.
    2. Note that the above tip is for Mac (*nix) based and file paths and symlink-type functionality on Windows would have different instructions but likely the same concept.
  3. Using Terminal, cd to your project directory. Example: cd /Users/YOUR-NAME/git/tribe-ext-pdf-tickets
  4. Delete composer.lock and the vendor subdirectory (they will get regenerated automatically)
    1. This is not really the normal way to use Composer, but neither is committing the vendor subdirectory to your own repository. We need to do it this way to ensure everything gets rebuilt afresh when preparing a plugin version update.
  5. Run php composer.phar install
    1. This will rebuild the vendor subdirectory with the latest versions matching the rules in composer.json. It will generate the required autoload.php file, the mPDF library, and the libraries required by the autoloader and mPDF. #Composer just did its magic!
  6. Make your code changes and test them on your localhost. Commit your changes to GitHub (and you would typically add the Code Review tag and go through that process).
  7. Once ready to build the finalized .zip to distribute to QA or to customers, run php composer.phar archive --file tribe-ext-pdf-tickets
    1. Because we did not set a --dir argument for the archive command, Composer will create the .zip right in the project's directory. #Convenient!
  8. Unzip this newly-created tribe-ext-pdf-tickets.zip file to make sure it got built correctly (excluding files like .gitignore, composer.json, etc).
  9. Upload this .zip to TheEventsCalendar.com's Media Library (or wherever you want to distribute it, such as uploading to Central for QA to test).
  10. Delete this .zip file from your hard drive.

Customer Plugin Updates

Like some of the other files you see in this GitHub repository, this README.md file does not get included in the final .zip that makes it to the customer. It and other files are excluded via Composer's build process, documented above.

However, if someone updates the plugin via GitHub Updater, they will receive the complete repository, not the Composer-zipped version. This is why the vendor subdirectory gets committed to our repository. The instructions above are for publishing the plugin to TheEventsCalendar.com's Extension library.

Releases

7 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
1.2.4 latest
Jul 18, 2023 3 years ago
tribe-ext-pdf-tickets-1.2.4.zip
846
Apr 27, 2023 3 years ago
tribe-ext-pdf-tickets-1.2.3.zip
253
Jun 10, 2020 6 years ago
tribe-ext-pdf-tickets-v1.2.2.zip
2,683
Sep 5, 2019 7 years ago
tag only
—
Mar 30, 2019 7 years ago
tag only
—
May 16, 2018 8 years ago
tag only
—
May 4, 2018 8 years ago
tag only
—
D+ grade

Security

Event Tickets Extension: PDF Tickets 1.2.4 · audited by WP Registry

High-severity findings.

1 high 1 low
Audited release
1.2.4
Findings
2
Worst severity
high
Content hash
689d784c50d5889635996a0a…

Findings

  • high Unauthenticated access to ticket PDFs with attendee PII and check-in codes

    missing_auth

    load_pdf() on template_redirect treats the attendee unique_id as the sole authorization token: there is no is_user_logged_in(), current_user_can(), or nonce check, and attendee_allowed_to_and_expected_to_attend() is not applied. A valid unique_id streams the PDF with readfile(); if the file is missing the handler generates it via do_upload_pdf() and 307-redirects. Unique IDs are created with uniqid('', true) (microtime + LCG, not a CSPRNG) and stored in post meta _tribe_ext_pdf_tickets_unique_id. The same files are written to the public uploads directory as tribe_tickets_{unique_id}.pdf (filterable prefix, no .htaccess/index protection). Direct GETs to that URL bypass PHP, X-Robots-Tag, and the rewrite wrapper. Ticket PDFs include holder name/email, Event Tickets security/QR codes used at check-in, and any Event Tickets Plus attendee fields copied from the email template. An unauthenticated visitor who obtains a unique_id (email attachment filename, “View your tickets” link, access logs, referrer, backups, or uploads directory listing) can download or regenerate any attendee’s ticket.

    tribe-ext-pdf-tickets.php:1666-1744

    Recommendation

    Store PDFs outside the web root or in a directory denied by web server config (WooCommerce-style uploads/.htaccess). Replace uniqid() with wp_generate_password() / wp_generate_uuid4(). Authorize downloads with a login+ownership check or an HMAC-signed, expiring URL; do not expose get_direct_pdf_url() paths. Apply attendee_allowed_to_and_expected_to_attend() (and trash/refund checks) inside load_pdf before generating or streaming.

  • low Web-accessible mPDF out.php streams/deletes tmp PDFs and reflects unsanitized headers

    unnecessary_attack_surface

    The shipped vendor tree includes mPDF’s example helper vendor/mpdf/mpdf/data/out.php, which is executable via a direct plugin URL. It concatenates $_REQUEST['filename'] with .pdf under ../tmp/, serves the file, unlinks it, and inserts $_REQUEST['opname'] into Content-Disposition without sanitization (CRLF/header injection). Slash checks block path traversal but not access to any PDF already in that tmp directory. This plugin sets mPDF tempDir to get_temp_dir(), so live ticket PDFs are not stored there by default; the script is leftover attack surface in a production zip.

    vendor/mpdf/mpdf/data/out.php:1-68

    Recommendation

    Exclude mPDF example/helper scripts (data/out.php, functions-dev.php) from the distributed plugin via composer archive exclude or delete them. Never expose raw $_REQUEST values in HTTP headers.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.