Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,18 +134,18 @@ jobs:
run: |
short_sha="${GITHUB_SHA:0:12}"
mkdir -p release
bash scripts/package-release.sh v5.8.1 "$GITHUB_SHA" "release/Licora-5.8.1-ci-${short_sha}.zip"
cp "release/Licora-5.8.1-ci-${short_sha}.zip" "release/Licora-5.8.1.zip"
python3 scripts/build-update-manifest.py --version 5.8.1 --ref "$GITHUB_SHA" --package "release/Licora-5.8.1.zip" --output release/licora-update-manifest.json
rm "release/Licora-5.8.1.zip"
bash scripts/package-release.sh v5.8.2 "$GITHUB_SHA" "release/Licora-5.8.2-ci-${short_sha}.zip"
cp "release/Licora-5.8.2-ci-${short_sha}.zip" "release/Licora-5.8.2.zip"
python3 scripts/build-update-manifest.py --version 5.8.2 --ref "$GITHUB_SHA" --package "release/Licora-5.8.2.zip" --output release/licora-update-manifest.json
rm "release/Licora-5.8.2.zip"

- name: Upload CI release-candidate artifact
uses: actions/upload-artifact@v6
with:
name: Licora-5.8.1-${{ github.sha }}
name: Licora-5.8.2-${{ github.sha }}
path: |
release/Licora-5.8.1-ci-*.zip
release/Licora-5.8.1-ci-*.zip.sha256
release/Licora-5.8.2-ci-*.zip
release/Licora-5.8.2-ci-*.zip.sha256
release/licora-update-manifest.json
if-no-files-found: error
retention-days: 14
24 changes: 24 additions & 0 deletions BASELINE_v5.8.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Licora v5.8.2 Source Baseline Freeze

## Parent authority

- Published parent release: `v5.8.1`
- Parent commit: `f7b7fc2275a33a2aa29db5f464c2ffd0a6172045`
- Parent release ZIP: `Licora-5.8.1.zip`
- Parent release ZIP SHA-256: `710f2431f27bbb76c3b522ae9ca3d215bd647e4793623958573c77637db28c60`
- Target source version: `5.8.2`
- Release channel: stable candidate
- Database migrations: none
- Delete files: none
- Accepted updater source: `5.8.1`

## Hotfix scope

1. Replace all seven remaining Admin runtime `bi-devices` usages with Bootstrap Icons 1.8.1-compatible `bi-laptop`.
2. Cover the shared sidebar, Settings shortcut, Device Management header/empty state, License View Devices action, Backup Devices CSV action, and About Device Control card.
3. Add a recursive Admin runtime UI regression gate that rejects future `bi-devices` usage.
4. Align runtime/installer/CI/updater release identity and release documentation to v5.8.2.

No database, API, license/device enforcement, authentication, Dashboard data/AJAX, Developer Guide behavior, Cron or updater runtime/protocol change is authorized or included.

The final v5.8.2 baseline ZIP SHA-256 is recorded by the delivery package generated after verification.
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,18 @@ All notable public-release changes are recorded here. Historical project notes r

### Planned

- No additional feature scope is approved beyond the verified v5.8.1 Developer Integration Guide correction.
- No additional feature scope is approved beyond the v5.8.2 global device-icon compatibility hotfix.

## [5.8.2] - 2026-08-20

### Fixed
- Replaced all seven remaining Admin runtime `bi-devices` usages with the Bootstrap Icons 1.8.1-compatible `bi-laptop` glyph.
- Restored visible device icons in the shared sidebar, Settings shortcut, Device Management header/empty state, License View Devices action, Backup Devices CSV action and About Device Control card.
- Added a recursive Admin runtime UI regression check preventing `bi-devices` from returning in PHP, JavaScript or HTML UI sources.

### Compatibility
- Signed update compatibility accepts the published `v5.8.1` baseline.
- No database migration, file deletion, API v1/v2 change, license/device behavior change, Dashboard data/AJAX change, Developer Guide behavior change, authentication/role change, Cron change or updater runtime/protocol change.

## [5.8.1] - 2026-08-20

Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ The application accepts deployment-specific values through environment variables
| Database password | `LICENSE_DB_PASS` | empty |
| Application name | `APP_NAME` | `Licora` |
| Application URL | `APP_URL` | `http://localhost` |
| Application version | `APP_VERSION` | `5.8.1` |
| Application version | `APP_VERSION` | `5.8.2` |
| Environment | `APP_ENV` | `production` |
| Encryption key | `LICENSE_ENCRYPTION_KEY` | empty fallback |
| API limit | `API_RATE_LIMIT` | `1000` |
Expand Down Expand Up @@ -156,6 +156,7 @@ The validation script checks PHP syntax, security behavior, compatibility invari
- [Secure in-app updater](docs/UPDATER.md)
- [UI design system](docs/UI_DESIGN_SYSTEM.md)
- [Troubleshooting](docs/TROUBLESHOOTING.md)
- [v5.8.2 release notes](RELEASE_NOTES_v5.8.2.md)
- [v5.8.1 release notes](RELEASE_NOTES_v5.8.1.md)
- [v5.8.0 source-candidate notes](RELEASE_NOTES_v5.8.0.md)
- [v5.7.1 release notes](RELEASE_NOTES_v5.7.1.md)
Expand All @@ -179,6 +180,10 @@ The validation script checks PHP syntax, security behavior, compatibility invari



## Device icon compatibility hotfix (v5.8.2)

Licora v5.8.2 replaces every remaining Admin runtime `bi-devices` glyph with the Bootstrap Icons 1.8.1-compatible `bi-laptop` glyph. The fix covers the shared sidebar and all remaining device-related UI surfaces without changing navigation, Dashboard behavior, APIs, licensing/device enforcement or updater runtime. A shared UI regression gate rejects future reintroduction of the unsupported class.

## Developer Integration Guide (v5.8.1; introduced in v5.8.0 source candidate)

The verified v5.8.1 authenticated **API & Clients → Developer Guide** provides a compact Secure API v2 Quick Start, the exact P-256 device-proof canonical contract, detected endpoint URLs, stable error codes and downloadable lifecycle references for Python, PowerShell/CMD, C, C++, C#/.NET, Java, Flutter, React Native, PHP and Node.js. Public-client examples never embed an API v1 shared/master key. Production clients must keep the P-256 private key and rotated refresh credential in platform-secure storage and verify pinned `LICORA-V2`/`RS256` access-token signatures before trusting claims locally.
Expand Down
46 changes: 46 additions & 0 deletions RELEASE_COMMANDS_v5.8.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Licora v5.8.2 Release Commands

Run only after the v5.8.2 hotfix delta is applied and the exact staged scope is reviewed.

## Local branch publication

```cmd
git switch main
git pull --ff-only origin main
git status --short --branch
git switch -c hotfix/v5.8.2-device-icons
```

Apply the replace-ready delta, then:

```cmd
git diff --check
git status --short
```

Stage only the explicit paths supplied with the final delta audit. Do not use `git add .`, `git add -A` or `git add --all`.

After staged-scope review:

```cmd
git diff --cached --check
git diff --cached --name-status
git commit -m "fix: restore device icons across admin UI in v5.8.2"
git push -u origin hotfix/v5.8.2-device-icons
```

Create/review the PR against `main`. Merge/tag/release require separate explicit authorization.

## Tagged release after merge and authorization

```cmd
git switch main
git pull --ff-only origin main
git status --short --branch
git rev-parse HEAD
git tag -a v5.8.2 -m "Licora v5.8.2 - Global Device Icon Compatibility Hotfix"
git show --no-patch --decorate v5.8.2
git push origin v5.8.2
```

The tag-triggered `release.yml` must build, sign and publish the exact tag.
22 changes: 22 additions & 0 deletions RELEASE_NOTES_v5.8.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Licora v5.8.2 — Global Device Icon Compatibility Hotfix

Licora v5.8.2 is a no-migration UI compatibility hotfix over the published v5.8.1 release.

## Fixed

- Replaces every remaining runtime `bi-devices` reference with `bi-laptop`, which is available in the pinned Bootstrap Icons 1.8.1 dependency.
- Restores the device glyph in the shared sidebar, Settings shortcut, Device Management page header and empty state, License **View Devices** action, Backup **Devices CSV** export, and About **Device Control** capability card.
- Adds a shared UI regression gate that rejects `bi-devices` anywhere in Admin runtime PHP/JavaScript/HTML sources so the unsupported glyph cannot silently return.

## Compatibility

- Upgrade source: `5.8.1`.
- Database migrations: none.
- Deleted files: none.
- API v1/v2 behavior: unchanged.
- License/device enforcement: unchanged.
- Authentication/roles: unchanged.
- Dashboard data, AJAX refresh and charts: unchanged.
- Developer Guide and downloadable API v2 examples: unchanged.
- Cron behavior and updater runtime/protocol: unchanged.
- Sidebar/navigation structure: unchanged; only the Devices glyph class changes.
17 changes: 15 additions & 2 deletions REPOSITORY_METADATA.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,23 @@

Licora v5.1.0 adds a ten-step first-run installer, delimiter-aware schema execution, secure administrator and secret generation, atomic private configuration, installation locking, optional demo data, database-port support, safe installer diagnostics, and expanded regression validation. The release preserves the existing license engine, API contracts, database schema, routes, admin UI, cron entry points, and encrypted-data compatibility.

## v5.8.1 Developer Integration Guide verification candidate
## v5.8.2 global device icon compatibility hotfix candidate

- **Intended tag:** `v5.8.1`
- **Intended tag:** `v5.8.2`
- **Publication status:** source candidate; GitHub publication requires separate authorization
- **Title:** `Licora v5.8.2 — Global Device Icon Compatibility Hotfix`
- **Release notes:** `RELEASE_NOTES_v5.8.2.md`
- **Database migration:** none
- **Delete list:** empty
- **Supported update source:** published `v5.8.1`

Licora v5.8.2 changes only the remaining unsupported Admin device icon class from `bi-devices` to Bootstrap Icons 1.8.1-compatible `bi-laptop`, adds a regression gate for the unsupported class, and aligns release identity. Runtime API, database, licensing/device enforcement, Dashboard, Developer Guide, authentication, Cron and updater semantics remain unchanged.

## v5.8.1 published Developer Integration Guide corrective release

- **Tag:** `v5.8.1`
- **Commit:** `f7b7fc2275a33a2aa29db5f464c2ffd0a6172045`
- **Publication status:** published and release-verified
- **Title:** `Licora v5.8.1 — Developer Integration Guide Verification Fix`
- **Release notes:** `RELEASE_NOTES_v5.8.1.md`
- **Database migration:** none
Expand Down
5 changes: 3 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@ Roadmap items are proposals and must be implemented through reviewed, backward-c
- v5.5.0: VibTools compact light UI refinement, truthful runtime-backed Settings, tracked Licora branding, About page and Windows builder-test portability; no database/API/updater protocol change.
- v5.5.1: Settings layout, collapsible Settings submenu, and professional About Licora UI hotfix; no database/API/updater behavior change.

## Developer onboarding program (v5.8.0 → v5.8.1)
## Developer onboarding program (v5.8.0 → v5.8.2)

- **Developer Integration Guide:** IMPLEMENTED in the v5.8.0 source candidate and re-audited/corrected in the v5.8.1 verification candidate.
- **v5.8.1 corrective gate:** CI package/manifest version coherence fixed; Dashboard device glyph compatibility fixed; no API/DB/runtime protocol expansion.
- **v5.8.1 corrective gate:** CI package/manifest version coherence fixed and Dashboard device glyph compatibility fixed.
- **v5.8.2 UI compatibility hotfix:** all remaining Admin `bi-devices` glyphs are replaced with Bootstrap Icons 1.8.1-compatible `bi-laptop`, with a shared regression gate; no API/DB/runtime protocol expansion.
- Scope is limited to the authenticated guide route, API & Clients sidebar link, exact Secure API v2 protocol documentation, downloadable examples for the ten approved language/runtime targets, PowerShell test tool, tests/docs/version/release identity.
- API v1/v2 behavior, database schema, licensing/device enforcement, Dashboard, authentication/roles, Cron and updater runtime/protocol remain frozen.
2 changes: 1 addition & 1 deletion admin/about.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
<div><h4>License Control</h4><p>Create licenses with expiration periods, device limits, notes, application scopes and optional API-key binding.</p></div>
</article>
<article class="ui-feature-card">
<span class="ui-feature-icon"><i class="bi bi-devices"></i></span>
<span class="ui-feature-icon"><i class="bi bi-laptop"></i></span>
<div><h4>Device Control</h4><p>Track registered devices, activity, revocation, blacklist state and license-bound device limits.</p></div>
</article>
<article class="ui-feature-card">
Expand Down
2 changes: 1 addition & 1 deletion admin/backup.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,6 @@
<div class="page-hero d-flex justify-content-between align-items-center gap-2"><h2><i class="bi bi-download"></i> Backup & Export</h2><div class="d-flex gap-2"><a href="settings.php" class="btn btn-outline-secondary"><i class="bi bi-gear"></i> Settings</a><a href="health.php" class="btn btn-outline-secondary"><i class="bi bi-heart-pulse"></i> Health</a></div></div>
<div class="row g-2 mb-2"><div class="col-6 col-lg-3"><div class="card"><div class="card-body ui-stat-compact"><span>Licenses</span><strong><?php echo $counts['licenses']; ?></strong></div></div></div><div class="col-6 col-lg-3"><div class="card"><div class="card-body ui-stat-compact"><span>Devices</span><strong><?php echo $counts['devices']; ?></strong></div></div></div><div class="col-6 col-lg-3"><div class="card"><div class="card-body ui-stat-compact"><span>Logs</span><strong><?php echo $counts['logs']; ?></strong></div></div></div><div class="col-6 col-lg-3"><div class="card"><div class="card-body ui-stat-compact"><span>Tables</span><strong><?php echo $counts['tables']; ?></strong></div></div></div></div>
<div class="ui-settings-grid">
<section class="ui-settings-section"><div class="ui-settings-section-header"><span><i class="bi bi-filetype-csv"></i> CSV Export</span><span class="badge bg-light text-dark">Manager+</span></div><div class="ui-settings-section-body"><div class="ui-export-list"><a href="?export=licenses"><i class="bi bi-key"></i><span>Licenses CSV</span><i class="bi bi-download ms-auto"></i></a><a href="?export=devices"><i class="bi bi-devices"></i><span>Devices CSV</span><i class="bi bi-download ms-auto"></i></a><a href="?export=logs"><i class="bi bi-clock-history"></i><span>Logs CSV</span><i class="bi bi-download ms-auto"></i></a></div></div></section>
<section class="ui-settings-section"><div class="ui-settings-section-header"><span><i class="bi bi-filetype-csv"></i> CSV Export</span><span class="badge bg-light text-dark">Manager+</span></div><div class="ui-settings-section-body"><div class="ui-export-list"><a href="?export=licenses"><i class="bi bi-key"></i><span>Licenses CSV</span><i class="bi bi-download ms-auto"></i></a><a href="?export=devices"><i class="bi bi-laptop"></i><span>Devices CSV</span><i class="bi bi-download ms-auto"></i></a><a href="?export=logs"><i class="bi bi-clock-history"></i><span>Logs CSV</span><i class="bi bi-download ms-auto"></i></a></div></div></section>
<section class="ui-settings-section"><div class="ui-settings-section-header"><span><i class="bi bi-database-down"></i> Database Backup</span><span class="badge bg-light text-dark">Super Admin</span></div><div class="ui-settings-section-body"><div class="alert alert-warning mb-2"><i class="bi bi-exclamation-triangle"></i> SQL backups can contain sensitive data. Store downloaded files securely.</div><a class="btn btn-primary w-100 <?php echo AdminHelpers::canDelete() ? '' : 'disabled'; ?>" href="?export=database"><i class="bi bi-download"></i> Download SQL Backup</a></div></section>
</div></div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script><script src="assets/js/admin-ui.js"></script></body></html>
4 changes: 2 additions & 2 deletions admin/device.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@
<?php include 'includes/navbar.php'; ?>
<div class="container-fluid admin-shell">
<div class="page-hero">
<h2><i class="bi bi-devices"></i> Device Management</h2>
<h2><i class="bi bi-laptop"></i> Device Management</h2>
<div class="d-flex gap-2"><a href="license.php" class="btn btn-outline-secondary"><i class="bi bi-key"></i> Licenses</a><button type="button" class="btn btn-outline-danger" data-bs-toggle="modal" data-bs-target="#clearDevicesModal"><i class="bi bi-trash3"></i> Clear Old Devices</button></div>
</div>
<?php if ($success): ?><div class="alert alert-success alert-dismissible fade show"><?php echo Security::escape($success); ?><button type="button" class="btn-close" data-bs-dismiss="alert"></button></div><?php endif; ?>
Expand All @@ -109,7 +109,7 @@
</div>
</div>
<?php if (empty($devices)): ?>
<div class="empty-state"><div class="empty-icon mx-auto"><i class="bi bi-devices"></i></div><h5 class="mt-2 mb-0">No devices found</h5></div>
<div class="empty-state"><div class="empty-icon mx-auto"><i class="bi bi-laptop"></i></div><h5 class="mt-2 mb-0">No devices found</h5></div>
<?php else: ?>
<div class="table-responsive">
<table class="table table-hover align-middle" id="devices-table" data-ui-paginate="true" data-ui-page-size="10">
Expand Down
2 changes: 1 addition & 1 deletion admin/includes/ui/navigation.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ function licora_ui_navigation_groups(): array
],
'License Management' => [
['file' => 'license.php', 'label' => 'Licenses', 'icon' => 'bi-key'],
['file' => 'device.php', 'label' => 'Devices', 'icon' => 'bi-devices'],
['file' => 'device.php', 'label' => 'Devices', 'icon' => 'bi-laptop'],
],
'API & Clients' => [
['file' => 'api_keys.php', 'label' => 'API Keys', 'icon' => 'bi-key-fill'],
Expand Down
2 changes: 1 addition & 1 deletion admin/license.php
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@
<summary class="ui-icon-button" aria-label="Open license actions"><i class="bi bi-three-dots"></i></summary>
<div class="ui-action-menu-panel">
<?php if ($license['status'] === 'active'): ?><a class="is-warning" href="?action=suspend&id=<?php echo (int)$license['id']; ?>&csrf_token=<?php echo urlencode(Security::generateCSRFToken()); ?>" data-confirm="Suspend this license?"><i class="bi bi-pause-circle"></i> Suspend</a><?php else: ?><a class="is-success" href="?action=activate&id=<?php echo (int)$license['id']; ?>&csrf_token=<?php echo urlencode(Security::generateCSRFToken()); ?>" data-confirm="Activate this license?"><i class="bi bi-play-circle"></i> Activate</a><?php endif; ?>
<a href="device.php?license_id=<?php echo (int)$license['id']; ?>"><i class="bi bi-devices"></i> View Devices</a>
<a href="device.php?license_id=<?php echo (int)$license['id']; ?>"><i class="bi bi-laptop"></i> View Devices</a>
<button type="button" data-bs-toggle="modal" data-bs-target="#extendModal<?php echo (int)$license['id']; ?>"><i class="bi bi-clock"></i> Extend</button>
<a class="is-danger" href="?blacklist=1&id=<?php echo (int)$license['id']; ?>&csrf_token=<?php echo urlencode(Security::generateCSRFToken()); ?>" data-confirm="Blacklist this license?"><i class="bi bi-ban"></i> Blacklist</a>
<?php if (AdminHelpers::canDelete()): ?><a class="is-danger" href="?delete_license=1&id=<?php echo (int)$license['id']; ?>&csrf_token=<?php echo urlencode(Security::generateCSRFToken()); ?>" data-confirm="Delete this license permanently?"><i class="bi bi-trash"></i> Delete</a><?php endif; ?>
Expand Down
2 changes: 1 addition & 1 deletion admin/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ function save_setting($db, $key, $value) {

<nav class="ui-shortcuts ui-shortcut-grid mb-2" aria-label="Management shortcuts">
<a href="license.php" class="btn btn-outline-secondary"><i class="bi bi-key"></i> Licenses</a>
<a href="device.php" class="btn btn-outline-secondary"><i class="bi bi-devices"></i> Devices</a>
<a href="device.php" class="btn btn-outline-secondary"><i class="bi bi-laptop"></i> Devices</a>
<a href="api_keys.php" class="btn btn-outline-secondary"><i class="bi bi-key-fill"></i> API Keys</a>
<a href="logs.php" class="btn btn-outline-secondary"><i class="bi bi-clock-history"></i> Logs</a>
<a href="audit.php" class="btn btn-outline-secondary"><i class="bi bi-journal-text"></i> Audit</a>
Expand Down
Loading