WP Manifestindependent plugin directory
manifest / updates / wp-loyalty-migration

WPLoyalty - Migration WP Registry grade C-. High-severity findings · 1 findingWP RegistryHigh-severity findings · 1 findingOpen the reportC-

★ 0stars
210release downloads
≈60active sites
stablelatest · 11mo ago

Install

Download wp-loyalty-migration.zip From the stable release on GitHub, Nov 26, 2025

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

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/wployalty/wp-loyalty-migration/releases/download/stable/wp-loyalty-migration.zip
Updates itself. It ships its own updater (Plugin Update Checker), so new versions appear under Dashboard → Updates.

WC requires at least: 10.0 WC tested up to: 10.1 Stable tag: 1.0.1 Requires PHP: 7.4 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html

Seamlessly migrate your existing loyalty points and rewards data to WPLoyalty from popular WooCommerce plugins.

Releases

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

Tag
Published
Assets
Downloads
stable latest
Nov 26, 2025 11mo ago
wp-loyalty-migration.zip
101
Sep 23, 2025 1 year ago
wp-loyalty-migration-v1.0.1.zip
54
Dec 23, 2024 1 year ago
wp-loyalty-migration-v1.0.0.zip
55

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

C- grade

Security

WPLoyalty - Migration 1.0.1 · audited by WP Registry

High-severity findings.

1 high
Audited release
1.0.1
Findings
1
Worst severity
high
Content hash
c9d90b570d143693df7f018c…

Findings

  • high Unauthenticated access to exported customer CSVs in the plugin directory

    information_disclosure

    handleExport() (wp_ajax_wlrmg_handle_export) is capability-and-nonce gated, but it materializes the export as static files under WLRMG_PLUGIN_DIR/App/File/{job_id}/ with chmod 0777, then exportFileList() advertises them as WLRMG_PLUGIN_URL/App/File/{job_id}/{name}.csv. There is no download handler, no auth cookie check, and no .htaccess/nginx deny — Apache/nginx serve the CSV to anyone who requests the URL. Columns are user_email, referral_code, and points for every migrated customer. job_id is an 8-character hex suffix of md5(uniqid()), stored as VARCHAR(8); filenames are a fixed prefix (wc_|wlr_|wpswing_|customer_) plus _customer_migration_export_{n}.csv. App/File/index.html only covers the parent folder; newly mkdir'd job folders have no index, so directory indexes (when enabled) list every part file. exportPopup() also chmod 0777 the File directory if it is not writable. job_id is concatenated into the filesystem path after sanitize_text_field only (no basename/realpath), so the same handler can write CSVs outside App/File/ if a manage_woocommerce user supplies ../. Fix: write to wp-content/uploads with a random name outside the web-reachable tree or stream via admin-post with manage_woocommerce + nonce; add deny rules; never chmod 0777; canonicalize job_id.

    App/Controller/Migration.php:288-324,409-495,585-592

    Recommendation

    Do not store PII CSVs under the plugin directory. Stream the export through an authenticated admin-post/AJAX callback that checks manage_woocommerce and a nonce, or write to a randomized path in wp-content/uploads that is blocked from direct HTTP (or deleted immediately after download). Validate job_id against the scheduled-job uid charset and resolve the realpath inside App/File. Add an Apache/nginx deny-all for App/File. Use 0750/0755, never 0777. Lengthen generateUuid() beyond 8 hex characters if it remains part of any 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.