Gate the success/license path in both installer scripts so a partial
install can no longer report success.
- Package script (pkg_mokosuitecross): add missingChildExtensions(),
which reads the package manifest via getParent()->getManifest() and
verifies each declared <file> child is registered in #__extensions
(matching element+type, plus folder=group for plugins). If any are
missing, enqueue an error and return before warnMissingLicenseKey().
Housekeeping (download-key restore, core-plugin enable, PerfectPublisher
migration detection) still runs unconditionally.
- Component script (com_mokosuitecross): postflight was empty. Add
missingTables(), which parses the installed sql/install.mysql.sql for
every CREATE TABLE and verifies each exists (prefix-substituted,
case-insensitive). On any missing tables, enqueue an error and return
before the success message; otherwise show install-success/license notice.
Both checks fail open (try/catch returning []/true) so a glitch never turns
a good install into a false failure. Extension names are htmlspecialchars'd.
Claude-Session: https://claude.ai/code/session_01MrxXW9iyuDda5yDZrjZMbF