{"id":388411,"date":"2026-10-25T10:30:52","date_gmt":"2026-10-25T10:30:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/hdwebmobile-license-key-delivery\/"},"modified":"2026-10-25T10:30:19","modified_gmt":"2026-10-25T10:30:19","slug":"hdwebmobile-license-key-delivery","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/hdwebmobile-license-key-delivery\/","author":9757813,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.9","requires_php":"7.4","requires_plugins":null,"header_name":"HDWebmobile License Key Delivery","header_author":"htrxuan - Han Tran","header_description":"Sell software license keys through WooCommerce -- keys are pasted or generated in wp-admin, never imported from an uploaded file, and one is atomically assigned to each order the moment it completes.","assets_banners_color":"366753","last_updated":"2026-10-25 10:30:19","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/htrxuan\/20","header_plugin_uri":"https:\/\/hdwebmobile.com\/plugins\/hdwebmobile-license-key-delivery\/","header_author_uri":"https:\/\/hdwebmobile.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":79,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"htrxuan","date":"2026-10-25 10:30:19","revision":3764319}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3764318,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3764318,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3764318,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3764318,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The \"License Keys\" tab on a product, with paste and generate options.","2":"A delivered key shown on the order confirmation page.","3":"The License Keys list under WooCommerce &gt; HDWebmobile."}},"plugin_section":[],"plugin_tags":[262053,58361,58362,26437,286],"plugin_category":[45],"plugin_contributors":[254181],"plugin_business_model":[],"class_list":["post-388411","plugin","type-plugin","status-publish","hentry","plugin_tags-digital-delivery","plugin_tags-license-key","plugin_tags-serial-key","plugin_tags-software-license","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-htrxuan","plugin_committers-htrxuan"],"banners":{"banner":"https:\/\/ps.w.org\/hdwebmobile-license-key-delivery\/assets\/banner-772x250.png?rev=3764318","banner_2x":"https:\/\/ps.w.org\/hdwebmobile-license-key-delivery\/assets\/banner-1544x500.png?rev=3764318","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/hdwebmobile-license-key-delivery\/assets\/icon-128x128.png?rev=3764318","icon_2x":"https:\/\/ps.w.org\/hdwebmobile-license-key-delivery\/assets\/icon-256x256.png?rev=3764318","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>HDWebmobile License Key Delivery turns any simple WooCommerce product into a license-key product. Add a pool of keys under the product's own \"License Keys\" tab -- paste them in or generate them randomly -- and one is automatically assigned to each customer the moment their order is completed.<\/p>\n\n<h4>Security by design<\/h4>\n\n<p>A serious class of bug in license-key tools is a bulk key import that accepts a file upload with insufficient extension\/MIME\/content validation (CWE-434, Unrestricted File Upload). Even when limited to Shop Manager accounts -- a role routinely handed to shop staff and third-party agencies, and deliberately less trusted than Administrator -- a disguised <code>.php<\/code> file can achieve remote code execution. This plugin closes that vulnerability class by construction, not mitigation:<\/p>\n\n<ul>\n<li>There is no file upload anywhere in this plugin. Bulk-adding keys is paste-a-textarea or generate-server-side only -- that risky code path simply does not exist here.<\/li>\n<li>Keys you paste in are stored exactly as given (with a database-level uniqueness constraint so the same key can never be issued twice); keys the plugin generates for you use PHP's own cryptographically secure <code>random_bytes()<\/code>, never anything predictable.<\/li>\n<li>The key handed to each customer is claimed with a single atomic database update, so two orders completing at the same instant can never be issued the same key.<\/li>\n<li>A customer's \"License Keys\" page under My Account is scoped to their own account at the database query itself -- one customer can never see another's keys.<\/li>\n<\/ul>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li>Turn any simple product into a license-key product from its own Product Data tab<\/li>\n<li>Paste existing keys (one per line) or generate random ones on the spot<\/li>\n<li>One key delivered automatically per unit purchased when the order is marked Completed<\/li>\n<li>Delivered keys show on the order confirmation page, in order emails, and on the admin order screen<\/li>\n<li>A \"License Keys\" tab under My Account lists everything a customer has purchased<\/li>\n<li>If stock runs out, the order still completes normally and the admin is emailed to restock -- no fake or duplicate key is ever issued<\/li>\n<\/ul>\n\n<h4>Limitations (please read before installing)<\/h4>\n\n<ul>\n<li>No file-upload bulk import -- paste or generate only, by design (see \"Why this plugin exists\")<\/li>\n<li>Simple products only in this version -- no variable-product support<\/li>\n<li>No per-key activation limits or remote deactivation; a key is either unassigned or assigned<\/li>\n<\/ul>\n\n<h4>Enjoying this plugin?<\/h4>\n\n<p>If it helps your site, please consider <a href=\"https:\/\/wordpress.org\/support\/plugin\/hdwebmobile-license-key-delivery\/reviews\/#new-post\">leaving an honest review on WordPress.org<\/a> -- it helps other WordPress users find it. Found a problem or have an idea? Please <a href=\"https:\/\/wordpress.org\/support\/plugin\/hdwebmobile-license-key-delivery\/\">open a support topic<\/a> first so it can be fixed.<\/p>\n\n<h3>How to Use<\/h3>\n\n<h4>1. Add keys to a product<\/h4>\n\n<p>On a simple product's \"License Keys\" tab, check \"Sell as license key product\", then either paste your own keys (one per line) or use \"Generate Keys\" to create random ones.<\/p>\n\n<h4>2. Customer buys the product<\/h4>\n\n<p>Nothing changes at checkout -- it's a normal WooCommerce purchase.<\/p>\n\n<h4>3. Key delivered automatically<\/h4>\n\n<p>Once the order is marked Completed, one key per unit purchased is claimed and shown on the order confirmation page, in the order email, and under My Account &gt; License Keys.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/hdwebmobile-license-key-delivery<\/code> directory, or install the plugin through the WordPress plugins screen directly.<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress. WooCommerce must already be installed and active.<\/li>\n<li>Edit a simple product, open its new \"License Keys\" tab under Product Data, check \"Sell as license key product\", and add some keys.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: per-product key pools (paste or generate, never file-upload), atomic key assignment on order completion, \"License Keys\" My Account tab, backorder handling with admin notification.<\/li>\n<\/ul>","raw_excerpt":"Sell software license keys through WooCommerce -- keys are pasted or generated in wp-admin, never imported from an uploaded file.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/388411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=388411"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/htrxuan"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=388411"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=388411"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=388411"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=388411"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=388411"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=388411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}