fluentcart-licensing-pro
Implements and audits FluentCart Pro product licensing, license generation, activation limits, site activation/deactivation, customer/admin access, subscription validity, refunds, update checks, package delivery, and legacy EDD-compatible clients. Use when working with the Pro Li
Install
npx skills add https://github.com/Lonsdale201/wp-agent-skills/tree/main/fluentcart/fluentcart-licensing-pro
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install lonsdale201-wp-agent-skills@llmmart
git clone https://github.com/Lonsdale201/wp-agent-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole lonsdale201/wp-agent-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
FluentCart Pro licensing
This skill is Pro-only. Verify FluentCart Pro is active and the license module is enabled before using its models, routes, tables, or hooks.
Read licensing-protocol.md before extending generation, activation, update delivery, or client compatibility.
Configure products through the module
Use the Licensing module's product settings and LicenseManager/LicenseHelper services. Do not create keys or activation rows with ad-hoc SQL. The module relates licenses to customer, order, product, variation, subscription, sites, activations, and meta, and applies lifecycle rules to those relations.
Feature-detect ModuleSettings::isActive('license') and Pro classes after fluent_cart/init. A product being downloadable or subscription-based does not itself mean licensing is enabled for that variation.
Follow the commerce lifecycle
The built-in handler generates licenses after fluent_cart/order_paid for initial payment/subscription orders; extends validity on subscription renewal; reactivates where appropriate; and disables/expires/deletes licenses according to payment failure, full refund, validity expiry, order deletion, and module policy.
Listen to license-specific hooks for addon side effects instead of duplicating generation. Make extensions replay-safe: payment/webhook and repair flows may re-enter lifecycle code. Preserve the distinction among active, disabled, and expired plus the stored reason and previous status.
Do not revoke automatically on every transient renewal failure unless that is the explicit access policy. Subscription grace, next billing date, cancellation at period end, EOT, refund, and manual administration are separate decisions.
Treat credentials and activations as bearer authority
License keys and activation hashes are secrets. Never log them in full, expose them in public REST serializers, place them in analytics/referrers, or accept a license ID alone as authorization. Normalize the site URL through LicenseHelper and validate product/item binding on every check, activation, deactivation, version, and package request.
Activation must be concurrency-safe around the limit. Test simultaneous first activations and activation/deactivation races; a read-count-create-recount sequence alone is not proof of atomic enforcement.
Customer-profile endpoints require WordPress login and must remain scoped to the resolved FluentCart customer. Admin endpoints use LicensePolicy permissions such as licenses/view, licenses/manage, and licenses/delete.
Use the public protocol as installed
License client calls enter FluentCart's public action dispatcher and map to check_license, activate_license, deactivate_license, get_license_version, and download_license_package handlers. Match the installed request/response shape and distinguish transport HTTP success from the returned license status/error.
Do not reuse fct_package as a general-purpose signed URL scheme. In the tested 1.6.0 source it is a base64-encoded credential payload, and the download parser does not consume the appended expiry field as a verified cryptographic claim. Use the built-in path only for required compatibility, keep TTL/authorization under version-specific audit, and implement new protected delivery with a server-held, tamper-evident, expiring token or opaque one-time record.
Protect package and update delivery
- Store packages outside direct public access or behind controlled storage.
- Resolve the current entitled product/variation and valid activation again at download time.
- Validate expiry server-side and prevent path traversal/open redirects.
- Stream or redirect using the storage driver's safe contract.
- Rate-limit checks, activation, version and package endpoints.
- Avoid leaking whether arbitrary keys or customer emails exist.
- Record redacted audit events and provider/client version for reconciliation.
Test matrix
Test disabled module/Pro absence, one-time and subscription products, quantity and variation license settings, duplicate paid event, payment failure, full and partial refund, renewal/grace/expiry/EOT/reactivation, key regeneration, limit change, local/staging classification, normalized URL variants, concurrent limit race, activation replay, wrong item/site/hash, customer cross-account access, admin capability boundaries, expired/tampered package URL, update response, and legacy EDD client compatibility.
Cross-references
- Use fluentcart-subscriptions-renewals for validity timing.
- Use fluentcart-downloads-storage for protected files.
- Use fluentcart-rest-headless for public/customer/admin authorization.
- Use fluentcart-migration for EDD license migration.
References
- Verified Pro source paths:
- fluent-cart-pro/app/Modules/Licensing/Licensing.php
- fluent-cart-pro/app/Modules/Licensing/Models/
- fluent-cart-pro/app/Modules/Licensing/Services/LicenseManager.php
- fluent-cart-pro/app/Modules/Licensing/Services/LicenseHelper.php
- fluent-cart-pro/app/Modules/Licensing/Hooks/Handlers/
- fluent-cart-pro/app/Modules/Licensing/Http/licensing-api.php
- fluent-cart-pro/app/Http/Policies/LicensePolicy.php
Files (wp-agent-skills)
-
agents
-
openai.yaml 325 B
interface: display_name: "FluentCart Pro licensing" short_description: "Extend product licensing and package delivery safely" default_prompt: "Use $fluentcart-licensing-pro to implement or audit this FluentCart Pro licensing flow with lifecycle, ownership, activation-limit, credential, and package-delivery controls."
-
-
references
-
licensing-protocol.md 2.8 KB
# FluentCart Pro 1.6.0 licensing protocol ## Module boundary The Pro module owns these records: - fct_licenses: entitlement/key, owner, product/variation/order/subscription, status, limit and expiration; - fct_license_sites: normalized installation identity and environment data; - fct_license_activations: license-to-site binding and activation hash; - fct_license_meta: extension metadata. Use relationships/services so counts and lifecycle hooks remain consistent. ## Lifecycle map ~~~text paid initial order -> generate configured product/variation licenses subscription renewal/data update -> align license validity subscription validity expiry -> expire reactivation -> reactivate eligible disabled license payment failure/full refund -> disable under current policy order deletion -> delete unless filtered customer merge/change -> move license ownership ~~~ LicenseGenerationHandler is the source of truth for exact event and order-type conditions in the installed release. An addon should react to emitted license events rather than running a second generator. ## Public client operations | Operation | Minimum credential binding | |---|---| | check_license | key or activation hash, item, normalized site | | activate_license | key, item, normalized site | | deactivate_license | key, item, normalized site/activation context | | get_license_version | license/activation context and item | | download_license_package | validated entitlement and protected package | These are intentionally public machine-to-machine endpoints. CSRF nonces do not solve their authorization; the secret and object bindings do. Apply abuse limits and avoid distinguishable enumeration responses where compatibility allows. ## Package token warning The 1.6.0 get-version handler builds fct_package by base64-encoding colon- separated license, activation, site, product and expiry data. The corresponding download parser reads the first four fields but does not visibly verify the fifth expiry field. Base64 also supplies no integrity. Consequences for extension work: - do not describe this token as cryptographically signed; - do not copy it into a new API; - do not rely on the embedded timestamp without a source-confirmed check; - re-audit the installed handler after every update; - use an HMAC with constant-time verification and enforced expiry, or an opaque random server-side token, for new protocols. Continue to validate current license status, product binding and activation at download time even when a token is tamper-evident. ## Client compatibility Version/update clients must tolerate the installed endpoint's status/error conventions. HTTP 200 can carry an invalid license result in selected actions. Parse both transport status and body fields, redact secrets from errors, and back off rather than repeatedly activating after a network ambiguity.
-
-
SKILL.md 5.9 KB
--- name: fluentcart-licensing-pro description: >- Implements and audits FluentCart Pro product licensing, license generation, activation limits, site activation/deactivation, customer/admin access, subscription validity, refunds, update checks, package delivery, and legacy EDD-compatible clients. Use when working with the Pro Licensing module, LicenseManager, LicenseHelper, fct_licenses, fct_license_activations, fluent_cart_action_* license endpoints, license lifecycle hooks, protected plugin downloads, local/staging activations, or license migrations. metadata: wp-skills-author: "Soczó Kristóf" wp-skills-contact: "mailto:lonsdale201@hotmail.com" wp-skills-plugin: "fluent-cart-pro" wp-skills-plugin-version-tested: "1.6.0" wp-skills-wp-version-tested: "7.0.2" wp-skills-php-min: "7.4" wp-skills-last-updated: "2026-08-06" --- # FluentCart Pro licensing This skill is Pro-only. Verify FluentCart Pro is active and the license module is enabled before using its models, routes, tables, or hooks. Read [licensing-protocol.md](references/licensing-protocol.md) before extending generation, activation, update delivery, or client compatibility. ## Configure products through the module Use the Licensing module's product settings and LicenseManager/LicenseHelper services. Do not create keys or activation rows with ad-hoc SQL. The module relates licenses to customer, order, product, variation, subscription, sites, activations, and meta, and applies lifecycle rules to those relations. Feature-detect ModuleSettings::isActive('license') and Pro classes after fluent_cart/init. A product being downloadable or subscription-based does not itself mean licensing is enabled for that variation. ## Follow the commerce lifecycle The built-in handler generates licenses after fluent_cart/order_paid for initial payment/subscription orders; extends validity on subscription renewal; reactivates where appropriate; and disables/expires/deletes licenses according to payment failure, full refund, validity expiry, order deletion, and module policy. Listen to license-specific hooks for addon side effects instead of duplicating generation. Make extensions replay-safe: payment/webhook and repair flows may re-enter lifecycle code. Preserve the distinction among active, disabled, and expired plus the stored reason and previous status. Do not revoke automatically on every transient renewal failure unless that is the explicit access policy. Subscription grace, next billing date, cancellation at period end, EOT, refund, and manual administration are separate decisions. ## Treat credentials and activations as bearer authority License keys and activation hashes are secrets. Never log them in full, expose them in public REST serializers, place them in analytics/referrers, or accept a license ID alone as authorization. Normalize the site URL through LicenseHelper and validate product/item binding on every check, activation, deactivation, version, and package request. Activation must be concurrency-safe around the limit. Test simultaneous first activations and activation/deactivation races; a read-count-create-recount sequence alone is not proof of atomic enforcement. Customer-profile endpoints require WordPress login and must remain scoped to the resolved FluentCart customer. Admin endpoints use LicensePolicy permissions such as licenses/view, licenses/manage, and licenses/delete. ## Use the public protocol as installed License client calls enter FluentCart's public action dispatcher and map to check_license, activate_license, deactivate_license, get_license_version, and download_license_package handlers. Match the installed request/response shape and distinguish transport HTTP success from the returned license status/error. Do not reuse fct_package as a general-purpose signed URL scheme. In the tested 1.6.0 source it is a base64-encoded credential payload, and the download parser does not consume the appended expiry field as a verified cryptographic claim. Use the built-in path only for required compatibility, keep TTL/authorization under version-specific audit, and implement new protected delivery with a server-held, tamper-evident, expiring token or opaque one-time record. ## Protect package and update delivery - Store packages outside direct public access or behind controlled storage. - Resolve the current entitled product/variation and valid activation again at download time. - Validate expiry server-side and prevent path traversal/open redirects. - Stream or redirect using the storage driver's safe contract. - Rate-limit checks, activation, version and package endpoints. - Avoid leaking whether arbitrary keys or customer emails exist. - Record redacted audit events and provider/client version for reconciliation. ## Test matrix Test disabled module/Pro absence, one-time and subscription products, quantity and variation license settings, duplicate paid event, payment failure, full and partial refund, renewal/grace/expiry/EOT/reactivation, key regeneration, limit change, local/staging classification, normalized URL variants, concurrent limit race, activation replay, wrong item/site/hash, customer cross-account access, admin capability boundaries, expired/tampered package URL, update response, and legacy EDD client compatibility. ## Cross-references - Use fluentcart-subscriptions-renewals for validity timing. - Use fluentcart-downloads-storage for protected files. - Use fluentcart-rest-headless for public/customer/admin authorization. - Use fluentcart-migration for EDD license migration. ## References - Verified Pro source paths: - fluent-cart-pro/app/Modules/Licensing/Licensing.php - fluent-cart-pro/app/Modules/Licensing/Models/ - fluent-cart-pro/app/Modules/Licensing/Services/LicenseManager.php - fluent-cart-pro/app/Modules/Licensing/Services/LicenseHelper.php - fluent-cart-pro/app/Modules/Licensing/Hooks/Handlers/ - fluent-cart-pro/app/Modules/Licensing/Http/licensing-api.php - fluent-cart-pro/app/Http/Policies/LicensePolicy.php
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.