WP Manifestindependent plugin directory
manifest / updates / wp-plugin-deployeur

Deployeur WP Registry grade D+. High-severity findings · 2 findingsWP RegistryHigh-severity findings · 2 findingsOpen the reportD+

This plugin will help you to deploy your WordPress contents to Netlify or Vercel hosting using Webhooks and will empowers WordPress with features that allow users to review and launch a deploy only when they are ready to.

★ 5stars
42release downloads
≈10active sites
1.1.3latest · 2 years ago

Install

Download wp-deployeur-1.1.2.zip From the 1.1.2 release on GitHub, Jan 9, 2024

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

Install straight from GitHub with WP-CLI:

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

Deployeur, a plugin to use WordPress as a headless CMS!

📖 Description

This plugin is not only a simple way to deploy your WordPress website to Netlify or Vercel hosting using Webhooks. It also empowers WordPress with features that allow users to launch a deploy only when they are ready to.

Indeed, static site generation often come with benefits of better security, better speed and lower carbon footprint. So far we had only seen solutions that triggered a deploy each time a post was published or updated by a user. Triggering multiple builds in a row wasn't really consistent with the spirit of designing environmentally friendly websites.

That is why we started the Deployeur's adventure!

🚀 Features

What is this plugin doing ?

For developers

  1. Link your WordPress installation to Vercel or Netlify
  2. Allow your editors to deploy their contents form the WordPress dashboard
  3. Display the average build time to your content editors to keep them nicely waiting
  4. Display the Netlify status Badge into the WordPress dashboard

For content editors

  1. Review the last changes made to your contents before deploying them to your public website
  2. Check the Netlify build status of your last deploy directly from your WordPress dashboard
  3. Consult the history of deployed made with the plugin into the WordPress dashboad

📦 Installation

  1. Upload the plugin files to the /wp-content/plugins/ directory.
  2. Activate the plugin through the 'Plugins' menu in WordPress.
  3. Go to the Deployeur settings page.
  4. In the "Hosting settings" tab: select your hosting provider and set your webhook URL.
  5. If you select Netlify, fill the Netlify badge URL field with your Netlify's badges URL (found it inside Site Settings > Status badges).
  6. In the "Site settings" tab: fill the public URL field with your front-end domain name to add it to the WordPress's API.

📝 Changelog

  • See the changelog here

🛠 Development

Requirements

Last tested WordPress version

We last tested this plugin with WordPress 6.6.2

Installation

  1. Clone the repository
git clone git@github.com:MediakodTeam/wp-plugin-deployeur.git # using SSH - preferred
  1. Install the dependencies
yarn install # or npm install
  1. Start the "watch" task
yarn dev # or npm run dev
  1. Build the plugin
yarn build # or npm run build

🤝 Contribute

This plugin is at an early stage of its life. We have already ideas to improve it. The next one on our list will be to add a custom endpoint to manage WordPress images through ImageKit and tweak the WordPress APi to use it. It could also be considered to set user roles permissions to access the plugins settings, etc. If you find this plugin useful, we welcome all contributions, issues and feature requests! To see how to contributes and the code of conduct, see the contributing file.

Releases

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

Tag
Published
Assets
Downloads
1.1.3 latest
Feb 21, 2024 2 years ago
tag only
—
Jan 9, 2024 2 years ago
wp-deployeur-1.1.2.zip
16
Jan 2, 2024 2 years ago
wp-deployeur-1.1.1.zip
6
Apr 6, 2023 3 years ago
wp-deployeur-1.1.0.zip
12
Jan 26, 2023 3 years ago
wp-deployeur-1.0.0.zip
1
Jan 3, 2023 3 years ago
wp-deployeur-0.2.4.zip
2
Dec 21, 2022 3 years ago
wp-deployeur-0.2.3.zip
3
Dec 12, 2022 3 years ago
wp-deployeur-0.2.2.zip
1
Dec 7, 2022 3 years ago
wp-deployeur-0.2.1.zip
1

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

D+ grade

Security

Deployeur 1.1.2 · audited by WP Registry

High-severity findings.

2 high
Audited release
1.1.2
Findings
2
Worst severity
high
Content hash
10b7ce45a7ec54ffb53c4cd1…

Findings

  • high Unauthenticated AJAX truncates deploy history and pending-change tables

    missing_auth

    Deployeur_Ajax registers mkd_log_history and mkd_clear_history on both wp_ajax_ and wp_ajax_nopriv_. Neither handler checks a nonce, a capability, or is_user_logged_in(). mkd_clear_history always runs TRUNCATE TABLE {$wpdb->prefix}deployeur_history and returns success. mkd_log_history inserts $_POST['status'] and $_POST['webhooks'] into that table (user_id = get_current_user_id(), so 0 for anonymous callers); if status equals the string success it also TRUNCATEs {$wpdb->prefix}deployeur_update, which is the pending-changes queue the Dashboard renders. An unauthenticated POST to /wp-admin/admin-ajax.php therefore wipes the editor review list, wipes or forges the deploy audit log, and needs no CSRF token. The Logs/Dashboard screens (manage_options only) are the consumers: after the call they show an empty pending list and/or attacker-written history rows. This is not a cosmetic counter — it is the plugin's operational deploy queue.

    includes/class-deployeur-ajax.php:5-51

    Recommendation

    Drop the wp_ajax_nopriv_ registrations. In both handlers call check_ajax_referer() and current_user_can('manage_options') (or a dedicated deploy cap) before any write. Sanitize status to an allow-list (success|error) and do not take webhooks from the client — read deployeur_webhook_url from the option. Keep TRUNCATE of the pending-update table on the authenticated success path only.

  • high Deploy webhook secret exposed in admin bar to every logged-in user

    information_disclosure

    add_admin_topbar_item hooks admin_bar_menu at priority 1000 with no capability check. For every user who can see the admin bar (WordPress default: all logged-in roles, including Subscriber and Customer, on front end and in wp-admin) it appends an unescaped meta['html'] span whose data-deploy-webhook attribute is get_option('deployeur_options')['deployeur_webhook_url'] — the Netlify/Vercel build hook, a secret that anyone can invoke to rebuild production. enqueue_scripts runs on admin_enqueue_scripts for every admin page with no hook-suffix or cap gate, so dist/index.js bind-clicks #trigger-deploy on Subscriber profile.php and fetch()es that URL (POST for Netlify, GET for Vercel) then calls mkd_log_history. Observable: view-source of any front-end page while logged in as Subscriber copies the hook; curling it publishes whatever is currently in WordPress (the plugin's whole point is to delay that publish) and consumes hosting build minutes. Settings UI itself is manage_options-only; the leak is the admin-bar HTML, not the settings form.

    admin/class-deployeur-admin.php:92-95,146-192

    Recommendation

    Gate add_admin_topbar_item and enqueue_scripts on current_user_can('manage_options') (or a dedicated deploy cap) and is_admin_bar_showing() for that cap. Do not put the webhook URL in HTML or JS; keep it server-side and trigger the hosting request from an authenticated, nonced admin-ajax/REST handler. Escape any remaining admin-bar attributes with esc_attr/esc_url.

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.