feat: restore licensing system with free tier #59

Merged
jmiller merged 3 commits from dev into main 2026-06-04 14:31:42 +00:00
6 changed files with 99 additions and 21 deletions
+5 -3
View File
@@ -102,13 +102,14 @@ jobs:
run: |
php /tmp/moko-platform-api/cli/release_publish.php \
--path . --stability rc --bump minor --branch rc \
--token "${{ secrets.MOKOGITEA_TOKEN }}"
--token "${{ secrets.MOKOGITEA_TOKEN }}" \
--skip-update-stream
- name: Summary
if: always()
run: |
echo "## Promoted to Release Candidate" >> $GITHUB_STEP_SUMMARY
echo "Branch renamed to rc, minor bump, RC + lesser stream releases built, updates.xml synced" >> $GITHUB_STEP_SUMMARY
echo "Branch renamed to rc, minor bump, RC release built (updates.xml managed by Gitea Pages)" >> $GITHUB_STEP_SUMMARY
# ── Merged PR → Build & Release (or promote RC to stable) ────────────────────
release:
@@ -167,7 +168,8 @@ jobs:
run: |
php /tmp/moko-platform-api/cli/release_publish.php \
--path . --stability stable --bump minor --branch main \
--token "${{ secrets.MOKOGITEA_TOKEN }}"
--token "${{ secrets.MOKOGITEA_TOKEN }}" \
--skip-update-stream
# -- STEP 9: Mirror to GitHub (stable only) --------------------------------
- name: "Step 9: Mirror release to GitHub"
+2 -1
View File
@@ -41,7 +41,8 @@ This is a Joomla **package** extension (`pkg_mokojoomhero`) containing two sub-e
- Works independently — no plugin dependency required
### plg_system_mokojoomhero (System Plugin)
- Placeholder for future system-level features
- License check — free tier (no key required), pro tier warns if download key missing
- Controlled by `LICENSE_TYPE` constant ('free' or 'pro') in the Extension class
- Auto-enabled on package install via `pkg_script.php`
- Namespace: `Joomla\Plugin\System\MokoJoomHero`
@@ -2,4 +2,4 @@
; SPDX-License-Identifier: GPL-3.0-or-later
PLG_SYSTEM_MOKOJOOMHERO="System - MokoJoomHero"
PLG_SYSTEM_MOKOJOOMHERO_DESCRIPTION="System plugin for MokoJoomHero"
PLG_SYSTEM_MOKOJOOMHERO_DESCRIPTION="System plugin for MokoJoomHero — license and update management"
@@ -2,4 +2,4 @@
; SPDX-License-Identifier: GPL-3.0-or-later
PLG_SYSTEM_MOKOJOOMHERO="System - MokoJoomHero"
PLG_SYSTEM_MOKOJOOMHERO_DESCRIPTION="System plugin for MokoJoomHero"
PLG_SYSTEM_MOKOJOOMHERO_DESCRIPTION="System plugin for MokoJoomHero — license and update management"
@@ -13,13 +13,88 @@ namespace Joomla\Plugin\System\MokoJoomHero\Extension;
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
class MokoJoomHero extends CMSPlugin implements SubscriberInterface
{
/**
* License type: 'free' requires no key, 'pro' requires a valid download key.
*/
private const LICENSE_TYPE = 'free';
public static function getSubscribedEvents(): array
{
return [];
return [
'onAfterRoute' => 'onAfterRoute',
];
}
public function onAfterRoute(): void
{
$app = $this->getApplication();
if ($app->isClient('administrator')) {
$this->checkLicense();
}
}
/**
* Check license status once per session. Free tier requires no key.
* Pro tier warns if no valid download key is configured.
*/
private function checkLicense(): void
{
if (self::LICENSE_TYPE === 'free') {
return;
}
$session = Factory::getSession();
if ($session->get('mokojoomhero.license_checked', false)) {
return;
}
$user = Factory::getUser();
if ($user->guest || !$user->authorise('core.manage')) {
return;
}
$session->set('mokojoomhero.license_checked', true);
try {
$db = Factory::getDbo();
$query = $db->getQuery(true)
->select($db->quoteName('extra_query'))
->from($db->quoteName('#__update_sites'))
->where($db->quoteName('name') . ' = ' . $db->quote('MokoJoomHero Updates'))
->setLimit(1);
$db->setQuery($query);
$extraQuery = (string) $db->loadResult();
if (!empty($extraQuery)) {
parse_str($extraQuery, $parsed);
if (!empty($parsed['dlid']) && preg_match('/^MOKO-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$/', $parsed['dlid'])) {
return;
}
}
$this->getApplication()->enqueueMessage(
'<strong>MokoJoomHero — Download Key Required</strong> — '
. 'No download key is configured. Updates may not be available until a valid key is entered. '
. 'Go to <a href="index.php?option=com_installer&view=updatesites">System &rarr; Update Sites</a> '
. 'and enter your download key (<code>MOKO-XXXX-XXXX-XXXX-XXXX</code>) for the MokoJoomHero update site.',
'warning'
);
} catch (\RuntimeException $e) {
$this->getApplication()->getLogger()->warning(
'MokoJoomHero license check failed: ' . $e->getMessage(),
['exception' => $e]
);
}
}
}
+14 -14
View File
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
SPDX-License-Identifier: GPL-3.0-or-later
VERSION: 01.08.00-rc
VERSION: 01.08.00
-->
<updates>
@@ -87,34 +87,34 @@
<client>site</client>
<version>01.08.00-rc</version>
<creationDate>2026-06-04</creationDate>
<infourl title='Package - MokoJoomHero'>https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/tag/release-candidate</infourl>
<infourl title="Package - MokoJoomHero">https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/tag/release-candidate</infourl>
<downloads>
<downloadurl type='full' format='zip'>https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/download/release-candidate/pkg_mokojoomhero-01.08.00-rc.zip</downloadurl>
<downloadurl type="full" format="zip">https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/download/release-candidate/pkg_mokojoomhero-01.08.00-rc.zip</downloadurl>
</downloads>
<sha256>2667e2c0c9b610288232dbb2d9d9ce7aba0c58174b32eb023a4349905cee635a</sha256>
<tags><tag>rc</tag></tags>
<changelogurl>https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/raw/branch/main/CHANGELOG.md</changelogurl>
<maintainer>Moko Consulting</maintainer>
<maintainerurl>https://mokoconsulting.tech</maintainerurl>
<targetplatform name="joomla" version="(5|6)\..*" />
<targetplatform name="joomla" version="(5|6)\..*"/>
</update>
<update>
<name>Module - MokoJoomHero</name>
<description>Module - MokoJoomHero stable build.</description>
<element>mod_mokojoomhero</element>
<type>module</type>
<name>Package - MokoJoomHero</name>
<description>Package - MokoJoomHero stable build.</description>
<element>pkg_mokojoomhero</element>
<type>package</type>
<client>site</client>
<version>01.07.00</version>
<creationDate>2026-05-30</creationDate>
<infourl title="Module - MokoJoomHero">https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/tag/stable</infourl>
<version>01.08.00</version>
<creationDate>2026-06-04</creationDate>
<infourl title='Package - MokoJoomHero'>https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/tag/stable</infourl>
<downloads>
<downloadurl type="full" format="zip">https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/download/stable/mod_mokojoomhero-01.07.00.zip</downloadurl>
<downloadurl type='full' format='zip'>https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/download/stable/pkg_mokojoomhero-01.08.00.zip</downloadurl>
</downloads>
<sha256>56ae99ad18e12ee52c60298adef5983aef788fe867d3e3a36957b314ad7eb386</sha256>
<sha256>111fef438f7c30a74019124134ed461e2b92f9db992c45eef7d5f63091a5e0d7</sha256>
<tags><tag>stable</tag></tags>
<changelogurl>https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/raw/branch/main/CHANGELOG.md</changelogurl>
<maintainer>Moko Consulting</maintainer>
<maintainerurl>https://mokoconsulting.tech</maintainerurl>
<targetplatform name="joomla" version="(5|6)\..*"/>
<targetplatform name="joomla" version="(5|6)\..*" />
</update>
</updates>