WP Manifestindependent plugin directory
manifest / integrations / ql-events

QL Events WP Registry grade D+. High-severity findings · 2 findingsWP RegistryHigh-severity findings · 2 findingsOpen the reportD+ #7 in Integrations & APIs

The Events Calendar binding to WPGraphQL

★ 16stars
739release downloads
≈140active sites
0.3.2latest · 5mo ago

Install

Download ql-events.zip From the 0.3.2 release on GitHub, Apr 27, 2026

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

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/the-events-calendar/ql-events/releases/download/0.3.2/ql-events.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Quick Install

  1. Install & activate The Events Calendar/The Events Calendar Pro
  1. Install & activate WPGraphQL
  1. Clone or download the zip of this repository into your WordPress plugin directory & activate the QL Events plugin

What does this plugin do?

It adds The Events Calendar's and some of it's extension's functionality to the WPGraphQL schema.

Unit Tests

Until the documentation is in full effect, it's recommended that a GraphiQL-based tool like WPGraphiQL be used to view the GraphQL schema, an alternative to this is viewing the unit tests located in tests/wpunit directory. Which are constantly updated along with the project. If you're interested in contributing when I begin accepting contribution or simply want to run the tests. Follow the instruction below.

Prerequisties

Setup

  1. Make sure all dependencies are install by running composer install from the CMD/Terminal in the project directory.

  2. Next the copy 5 distributed files with the .dist in there filenames. For instance .env.testing becomes .env and wpunit.suite.dist.yml becomes wpunit.suite.yml. The distributed files and what their copied names should are as follows.

    • codeception.dist.yml => codeception.yml
    • .env.testing => .env
  3. Next open .env and alter to make you usage.

     DB_NAME=wordpress
     DB_HOST=app_db
     DB_USER=wordpress
     DB_PASSWORD=wordpress
     WP_TABLE_PREFIX=wp_
     WP_URL=http://localhost
     WP_DOMAIN=localhost
     ADMIN_EMAIL=admin@example.com
     ADMIN_USERNAME=admin
     ADMIN_PASSWORD=password
     ADMIN_PATH=/wp-admin
    
     TEST_DB_NAME=ql_events_tests
     TEST_DB_HOST=127.0.0.1
     TEST_DB_USER=wordpress
     TEST_DB_PASSWORD=wordpress
     TEST_WP_TABLE_PREFIX=wp_
    
     SKIP_DB_CREATE=false
     TEST_WP_ROOT_FOLDER=/tmp/wordpress
     TEST_ADMIN_EMAIL=admin@wp.test
    
     TESTS_DIR=tests
     TESTS_OUTPUT=tests/_output
     TESTS_DATA=tests/_data
     TESTS_SUPPORT=tests/_support
     TESTS_ENVS=tests/_envs
    • Shared variables are as the comment implies, variables shared in both the install-wp-tests script and the Codeception configuration. The variable names should tell you what they mean.
    • Install script variables are specified to the install-wp-tests script, and most likely won't changed. I've listed their meaning below.
      • WP_VERSION WordPress version used for testing
      • SKIP_DB_CREATE Should database creation be skipped?
    • Codeception variables are specified to the Codeception configuration. View the config files and Codeception's Docs for more info on them.
  4. Once you have finish modifying the .env file. Run composer install-test-env from the project directory.

  5. Upon success you can begin running the tests.

Running tests

To run test use the command vendor/bin/codecept run [suite [test [:test-function]]]. If you use the command with at least a suite specified, Codeception will run all tests, however this is not recommended. Running a suite vendor/bin/codecept run wpunit or a test vendor/bin/codecept run VenueQueriesTest is recommended. Running a single test-function like vendor/bin/codecept run EventQueriesTest:testEventQuery is also possible.

To learn more about the usage of Codeception with WordPress view the Documentation

Running tests

Even though the two suite use a Docker environment to run, the docker environment relies on a few environmental variables defined in .env and a volume source provided by the test install script. 0. Ensure that you can copy .env.testing to .env.

  1. First you must run composer install-test-env to ensure the required dependencies are available.
  2. Next run composer run-codeception to run the tests within a docker container.

Releases

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

Tag
Published
Assets
Downloads
0.3.2 latest
Apr 27, 2026 5mo ago
ql-events.zip +1 asset
39
ql-events.zip8
ql-events-0.3.2.zip31
Sep 21, 2023 3 years ago
ql-events.zip
27
Jul 26, 2023 3 years ago
ql-events.zip +1 asset
253
ql-events.zip11
ql-events-0.3.0.zip242
Dec 6, 2022 3 years ago
ql-events.zip
21
Feb 15, 2021 5 years ago
ql-events-0.0.1.zip
399

Active-site estimate ≈140 comes from the median of recent superseded releases. Method.

D+ grade

Security

QL Events 0.3.2 · audited by WP Registry

High-severity findings.

2 high
Audited release
0.3.2
Findings
2
Worst severity
high
Content hash
3e8744a75c3d4706f1499bdd…

Findings

  • high Unauthenticated GraphQL disclosure of draft, private, and password-protected events, venues, and organizers

    information_disclosure

    Core_Schema_Filters::is_cpt_private is hooked to graphql_data_is_private and, for tribe_events, tribe_venue, and tribe_organizer, always returns false. WPGraphQL's Post model treats non-publish and password-protected posts as private unless this filter says otherwise; returning false forces visibility=public and populates title, content, and all registered meta fields for any requester, including uid 0. The events connection defaults to post_status=publish, which still includes password-protected published events, so a public { events { nodes { title content } } } query returns the full body of members-only events without the password. Direct event(id:, idType: DATABASE_ID) / venue / organizer / contentNode lookups additionally return draft, private, and trash posts by sequential ID. Organizer.email and Event.virtualUrl (when Events Virtual support is on) are included. This is the same class of bug as TEC REST password-protected disclosure (CVE-2024-5333), on the public /graphql endpoint. Published non-password events were already public and are not the issue.

    includes/class-core-schema-filters.php:38-137

    Recommendation

    Honor WPGraphQL's default privacy. Only return false for published, non-password-protected posts the current user can read (empty post_password and public post_status, or current_user_can('read_post', $data->ID)). Do not override drafts, private, trash, or password-protected nodes to public.

  • high Event.virtualUrl leaks ticket-holder-only meeting URLs to unauthenticated GraphQL clients

    information_disclosure

    When QL Events' Events Virtual setting is enabled, Event_Type::register_virtual_fields exposes virtualUrl by returning tribe_get_event($id)->virtual_url with no audience check. Events Virtual stores the raw Zoom/Meet/video URL on that property and separately computes virtual_should_show_embed / applies tribe_events_virtual_show_virtual_content, which hides the URL from anyone who is not in virtual_show_embed_to (all, logged-in, rsvp, or ticket). The GraphQL schema registers virtualShowEmbedTo and virtualShouldShowEmbed as informational fields but still always returns virtualUrl. An unauthenticated client can query a published event's virtualUrl and join a paid/RSVP-gated meeting. Combined with the graphql_data_is_private override, the same field also leaks meeting URLs on password-protected and draft virtual events. The field is only registered when enable_events_virtual_support is on and Events Virtual is active.

    includes/types/object/class-event-type.php:307-318

    Recommendation

    Return virtualUrl only when Events Virtual would show it on the front end (e.g. tribe_events_virtual_show_virtual_content / $event->virtual_should_show_embed is true for the current user). Otherwise return null. Keep virtualShowEmbedTo as a non-sensitive setting field.

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.