Multi-repo license keys — single DLID covers multiple repos per product tier #615
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
License keys (DLIDs) need to support multi-repo entitlement — a single license key authorizes access to multiple repos simultaneously, scoped by product tier and domain.
Problem
Currently a DLID is tied to a single repo's update server. MokoSuite products are packaged as layered repos with git submodules:
A customer purchasing "MokoSuite POS" needs ONE license key that grants update access to all 4 repos, but NOT to MokoSuiteShop, MokoSuiteHRM, etc.
Proposed Data Model
License Key → Repo Entitlements
Product Tier Definitions
basecrmerpchildcreatenpoposshophrmmrprestaurantenterpriseAPI Changes
DLID Validation Endpoint
Current:
GET /api/v1/repos/{owner}/{repo}/releases/check-dlid?dlid=xxxProposed: Same endpoint, but validation checks:
*)New Endpoints
Update Server Integration
Each repo's
updates.xmlincludes the DLID in the download URL:The server validates the DLID against the repo being requested. A POS license key works for
MokoSuitePOS,MokoSuiteCRM,MokoSuiteERP, andMokoSuitedownloads — but returns 403 forMokoSuiteShop.Upgrade Path
When a customer upgrades from CRM to POS:
product_tierchanges fromcrmtoposlicense_repo_entitlementsis recalculated from the tier definitionIntegration with MokoSuite Shop
When a license-type product is purchased via MokoSuiteShop:
LicenseHelper::generateLicense()creates the DLIDproduct_tierfield determines which repos to entitlelicense_repo_entitlementsBranch created:
feature/615-multi-repo-license-keys-single-dlid-coveCompetitive Research Results
Joomla Extension Licensing (Industry Standard)
Industry consensus: DLID in
extra_queryfield of#__update_sitestable. Single shared system plugin writes DLID to all MokoSuite update sites at once.Recommended Architecture (Keygen + Akeeba Hybrid)
Data model (inside Gitea Go codebase):
API endpoints (new Gitea routes):
GET /api/v1/licensing/updates/{product}.xml?dlid=XXX- Joomla update XMLGET /api/v1/licensing/download/{product}/{version}.zip- signed package downloadPOST /api/v1/licensing/activate- domain activationGET /api/v1/licensing/validate?dlid=XXX&product=YYY- license checkWhat NOT to Build
Implementation Priority
Joomla Client-Side Flow
extra_query = "dlid=XXXXX"to ALL MokoSuite update_sites entries