Repository navigation
Releases: ceros/ceros-aem-connector
Release list
release-1.0.4
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
Added
- Include custom body HTML: the server-side delivery modes (Always Fetch, Store, HTML Import) now include the experience's custom Body HTML, so experiences built with the Ceros Flex Experience SDK — answer tracking, scoring, page navigation — work without switching to the iframe embed. A new Include custom body HTML/scripts checkbox in the component dialog controls it, and is on by default.
- Experiences published before this release need republishing in Ceros before their custom scripts will run.
- Store and HTML Import still serve everything from the DAM, so they make no requests to the Ceros CDN.
Fixed
- Renders with correct fonts when content is imported into AEM using the "Server-side (Store)" delivery mode.
[1.0.3] - 2026-08-20
Fixed
- The Browse Ceros Experiences filter now finds matches inside collapsed folders. Filtering tested whether a row was visible, so experiences nested in a folder that hadn't been expanded were treated as non-matching and their folders were hidden; matches are now flagged independently of visibility, and every folder holding a match at any depth is shown and expanded.
- Typing a folder's name in the filter now lists that folder's experiences, instead of hiding the folder when none of its own experiences match the text.
- Clearing the filter fully collapses the tree again. Folders the filter had expanded were left open — or worse, collapsed but still showing an open arrow — because the content and the toggle glyph were reset separately; both are now reset together.
- Pin Ceros API to version 2026-08-06-09-00
[1.0.2] - 2026-08-07
Added
- Configurable height for embeded Ceros experiences
[1.0.1] - 2026-07-01
Fixed
- Experiences added in the server-side Always Fetch, Store, and HTML Import modes now show the correct brand fonts and colours, both on the published page and in the author preview. The experience's brand kit wasn't being applied, so text fell back to a default font and brand background colours were missing; both now render as designed.
[1.0.0] - 2026-06-30
Fixed
- Deleting a Ceros Flex component in the author no longer fails with "Paragraph delete operation failed". The manifest-URL post-processor now runs only on a dialog save (the default modify operation) and skips delete/move/copy, so it no longer validates the manifest URL against a node being removed.
[0.0.8] - 2026-06-26
Security
- Pasted experience URLs are no longer trusted by default. A manifest is only fetched — and the scripts it references only injected — when it is served from a Ceros-owned domain (
ceros.siteby default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the newx-flex-manifestheader off the published page to discover its canonical, Ceros-hosted manifest URL, and the advertised URL must itself pass the Ceros-owned whitelist (so a spoofed header pointing off-Ceros is rejected). Mirrors the WordPress connector's keyless paste hardening.- New
CerosManifestService.resolveTrustedManifestUrlperforms the whitelist +x-flex-manifestresolution. Pasted URLs are validated on save for every URL-based delivery mode (inline, fetch, embed and store): the dialog post-processor resolves the URL and aborts the save if it isn't a trusted Ceros experience, so an untrusted or unreachable URL can never be persisted. It also canonicalises the storedmanifestUrlfor the live inline/fetch modes so render trusts the stored URL and makes no extra network call.fetchPublicManifestFromUrlenforces the whitelist at render as a defence-in-depth choke point. - Authoring dialog validates the pasted URL on submit for all modes via the new
/bin/ceros/validate-manifest-urlservlet, surfacing the reason in an error notification before the save — matching the feedback Store mode's Fetch button already gave. Client-side validation is UX only; the post-processor gate above is the authoritative, non-bypassable check. - New OSGi config on
CerosManifestServiceImpl:cerosOwnedDomains(trusted apex domains; production domains only by default so customer installs never reference internal environments — non-production Ceros domains are added per environment via OSGi config for local/dev) andallowUntrustedManifestHost(dev/test relaxation so localhost manifests still work; off in production). The connector ships production-safe defaults only — dev relaxations must be configured by the consuming project.
- New
Removed
- Dropped the unused
mediaCdnBaseUrlOSGi property fromCerosAssetStorageService. It was declared but never read — manifest/archive asset URLs are resolved directly — so removing it has no functional effect.
[0.0.7] - 2026-06-18
Fixed
- HTML Import now uploads every file in the export archive.
uploadAssetsFromArchivepreviously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos underassets/were silently skipped; it now bulk-imports every remaining file underassets/, mirroring the archive layout, with an extension-to-MIME map for correct content types.
Changed
- Cerosflex authoring dialog polish:
- Renamed the dialog title from "Properties" to "Ceros Flex".
- Browse Experiences is now a compact folder-search icon button (tooltip "Browse Ceros Experiences") sitting inside the right edge of the Ceros Experience URL field, instead of a separate text button.
- "Last fetched" / "Last imported" now shows as a muted, human-readable timestamp inline with the Fetch button (store) and under the file picker (import); the disabled field and its standalone label were removed. "Last Fetched" is hidden entirely for the fetch/inline/iframe modes.
- Rewrote all field tooltips in plain, non-technical language for designers and marketers; added hover tooltips to the Fetch button and file picker so every control has an info or hover state.
- Hid the dialog Help (?) icon (scoped to this dialog) until a real help link is available.
- Removed the import help text; unified the Fetch/Import loading spinner; evened out control-row spacing so the import rows match the other modes.
[0.0.6] - 2026-06-17
Fixed
- HTML-import components no longer revert to the "not configured" placeholder after the dialog is saved. Import stores the manifest in the DAM and sets
manifestUrlto that DAM path (like store mode), but clicking Done submitted the empty hiddenmanifestUrlfield and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, andisConfigured()additionally treats an imported bundle as configured (guarding the click-Done-immediately race).
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
[0.0.3] - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicega...
release-1.0.3
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
[1.0.3] - 2026-08-20
Fixed
- The Browse Ceros Experiences filter now finds matches inside collapsed folders. Filtering tested whether a row was visible, so experiences nested in a folder that hadn't been expanded were treated as non-matching and their folders were hidden; matches are now flagged independently of visibility, and every folder holding a match at any depth is shown and expanded.
- Typing a folder's name in the filter now lists that folder's experiences, instead of hiding the folder when none of its own experiences match the text.
- Clearing the filter fully collapses the tree again. Folders the filter had expanded were left open — or worse, collapsed but still showing an open arrow — because the content and the toggle glyph were reset separately; both are now reset together.
- Pin Ceros API to version 2026-08-06-09-00
[1.0.2] - 2026-08-07
Added
- Configurable height for embeded Ceros experiences
[1.0.1] - 2026-07-01
Fixed
- Experiences added in the server-side Always Fetch, Store, and HTML Import modes now show the correct brand fonts and colours, both on the published page and in the author preview. The experience's brand kit wasn't being applied, so text fell back to a default font and brand background colours were missing; both now render as designed.
[1.0.0] - 2026-06-30
Fixed
- Deleting a Ceros Flex component in the author no longer fails with "Paragraph delete operation failed". The manifest-URL post-processor now runs only on a dialog save (the default modify operation) and skips delete/move/copy, so it no longer validates the manifest URL against a node being removed.
[0.0.8] - 2026-06-26
Security
- Pasted experience URLs are no longer trusted by default. A manifest is only fetched — and the scripts it references only injected — when it is served from a Ceros-owned domain (
ceros.siteby default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the newx-flex-manifestheader off the published page to discover its canonical, Ceros-hosted manifest URL, and the advertised URL must itself pass the Ceros-owned whitelist (so a spoofed header pointing off-Ceros is rejected). Mirrors the WordPress connector's keyless paste hardening.- New
CerosManifestService.resolveTrustedManifestUrlperforms the whitelist +x-flex-manifestresolution. Pasted URLs are validated on save for every URL-based delivery mode (inline, fetch, embed and store): the dialog post-processor resolves the URL and aborts the save if it isn't a trusted Ceros experience, so an untrusted or unreachable URL can never be persisted. It also canonicalises the storedmanifestUrlfor the live inline/fetch modes so render trusts the stored URL and makes no extra network call.fetchPublicManifestFromUrlenforces the whitelist at render as a defence-in-depth choke point. - Authoring dialog validates the pasted URL on submit for all modes via the new
/bin/ceros/validate-manifest-urlservlet, surfacing the reason in an error notification before the save — matching the feedback Store mode's Fetch button already gave. Client-side validation is UX only; the post-processor gate above is the authoritative, non-bypassable check. - New OSGi config on
CerosManifestServiceImpl:cerosOwnedDomains(trusted apex domains; production domains only by default so customer installs never reference internal environments — non-production Ceros domains are added per environment via OSGi config for local/dev) andallowUntrustedManifestHost(dev/test relaxation so localhost manifests still work; off in production). The connector ships production-safe defaults only — dev relaxations must be configured by the consuming project.
- New
Removed
- Dropped the unused
mediaCdnBaseUrlOSGi property fromCerosAssetStorageService. It was declared but never read — manifest/archive asset URLs are resolved directly — so removing it has no functional effect.
[0.0.7] - 2026-06-18
Fixed
- HTML Import now uploads every file in the export archive.
uploadAssetsFromArchivepreviously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos underassets/were silently skipped; it now bulk-imports every remaining file underassets/, mirroring the archive layout, with an extension-to-MIME map for correct content types.
Changed
- Cerosflex authoring dialog polish:
- Renamed the dialog title from "Properties" to "Ceros Flex".
- Browse Experiences is now a compact folder-search icon button (tooltip "Browse Ceros Experiences") sitting inside the right edge of the Ceros Experience URL field, instead of a separate text button.
- "Last fetched" / "Last imported" now shows as a muted, human-readable timestamp inline with the Fetch button (store) and under the file picker (import); the disabled field and its standalone label were removed. "Last Fetched" is hidden entirely for the fetch/inline/iframe modes.
- Rewrote all field tooltips in plain, non-technical language for designers and marketers; added hover tooltips to the Fetch button and file picker so every control has an info or hover state.
- Hid the dialog Help (?) icon (scoped to this dialog) until a real help link is available.
- Removed the import help text; unified the Fetch/Import loading spinner; evened out control-row spacing so the import rows match the other modes.
[0.0.6] - 2026-06-17
Fixed
- HTML-import components no longer revert to the "not configured" placeholder after the dialog is saved. Import stores the manifest in the DAM and sets
manifestUrlto that DAM path (like store mode), but clicking Done submitted the empty hiddenmanifestUrlfield and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, andisConfigured()additionally treats an imported bundle as configured (guarding the click-Done-immediately race).
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
[0.0.3] - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicegainsfetchManifestBundle/storeManifestBundle. - README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault
subPackageembedding and manual CRX install).
Changed
- Delivery layer refactor: per-mode dispatch extracted into
com.ceros.delivery(DeliveryResult,ManifestRenderer,DeepLinkResolver) andcom.ceros.delivery.modes(Fetch / Store / Embed handlers,DeliveryHandler.forModefactory). CerosFlexModelsplit into a data POJO and aCerosFlexViewSling Model; delivery orchestration moved to the newCerosFlexDeliveryService. HTL bindsCerosFlexView.ServletUtilsmoved tocom.ceros.util; addedManifestUtils.primarySlugOf.
Removed
- Inline shared-services stub and the legacy sing...
release-1.0.2
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
[1.0.2] - 2026-08-07
Added
- Configurable height for embeded Ceros experiences
[1.0.1] - 2026-07-01
Fixed
- Experiences added in the server-side Always Fetch, Store, and HTML Import modes now show the correct brand fonts and colours, both on the published page and in the author preview. The experience's brand kit wasn't being applied, so text fell back to a default font and brand background colours were missing; both now render as designed.
[1.0.0] - 2026-06-30
Fixed
- Deleting a Ceros Flex component in the author no longer fails with "Paragraph delete operation failed". The manifest-URL post-processor now runs only on a dialog save (the default modify operation) and skips delete/move/copy, so it no longer validates the manifest URL against a node being removed.
[0.0.8] - 2026-06-26
Security
- Pasted experience URLs are no longer trusted by default. A manifest is only fetched — and the scripts it references only injected — when it is served from a Ceros-owned domain (
ceros.siteby default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the newx-flex-manifestheader off the published page to discover its canonical, Ceros-hosted manifest URL, and the advertised URL must itself pass the Ceros-owned whitelist (so a spoofed header pointing off-Ceros is rejected). Mirrors the WordPress connector's keyless paste hardening (ceros-plugin-wordpress#3).- New
CerosManifestService.resolveTrustedManifestUrlperforms the whitelist +x-flex-manifestresolution. Pasted URLs are validated on save for every URL-based delivery mode (inline, fetch, embed and store): the dialog post-processor resolves the URL and aborts the save if it isn't a trusted Ceros experience, so an untrusted or unreachable URL can never be persisted. It also canonicalises the storedmanifestUrlfor the live inline/fetch modes so render trusts the stored URL and makes no extra network call.fetchPublicManifestFromUrlenforces the whitelist at render as a defence-in-depth choke point. - Authoring dialog validates the pasted URL on submit for all modes via the new
/bin/ceros/validate-manifest-urlservlet, surfacing the reason in an error notification before the save — matching the feedback Store mode's Fetch button already gave. Client-side validation is UX only; the post-processor gate above is the authoritative, non-bypassable check. - New OSGi config on
CerosManifestServiceImpl:cerosOwnedDomains(trusted apex domains; production domains only by default so customer installs never reference internal environments — non-production Ceros domains are added per environment via OSGi config for local/dev) andallowUntrustedManifestHost(dev/test relaxation so localhost manifests still work; off in production). The connector ships production-safe defaults only — dev relaxations must be configured by the consuming project.
- New
Removed
- Dropped the unused
mediaCdnBaseUrlOSGi property fromCerosAssetStorageService. It was declared but never read — manifest/archive asset URLs are resolved directly — so removing it has no functional effect.
[0.0.7] - 2026-06-18
Fixed
- HTML Import now uploads every file in the export archive.
uploadAssetsFromArchivepreviously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos underassets/were silently skipped; it now bulk-imports every remaining file underassets/, mirroring the archive layout, with an extension-to-MIME map for correct content types.
Changed
- Cerosflex authoring dialog polish:
- Renamed the dialog title from "Properties" to "Ceros Flex".
- Browse Experiences is now a compact folder-search icon button (tooltip "Browse Ceros Experiences") sitting inside the right edge of the Ceros Experience URL field, instead of a separate text button.
- "Last fetched" / "Last imported" now shows as a muted, human-readable timestamp inline with the Fetch button (store) and under the file picker (import); the disabled field and its standalone label were removed. "Last Fetched" is hidden entirely for the fetch/inline/iframe modes.
- Rewrote all field tooltips in plain, non-technical language for designers and marketers; added hover tooltips to the Fetch button and file picker so every control has an info or hover state.
- Hid the dialog Help (?) icon (scoped to this dialog) until a real help link is available.
- Removed the import help text; unified the Fetch/Import loading spinner; evened out control-row spacing so the import rows match the other modes.
[0.0.6] - 2026-06-17
Fixed
- HTML-import components no longer revert to the "not configured" placeholder after the dialog is saved. Import stores the manifest in the DAM and sets
manifestUrlto that DAM path (like store mode), but clicking Done submitted the empty hiddenmanifestUrlfield and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, andisConfigured()additionally treats an imported bundle as configured (guarding the click-Done-immediately race).
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
[0.0.3] - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicegainsfetchManifestBundle/storeManifestBundle. - README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault
subPackageembedding and manual CRX install).
Changed
- Delivery layer refactor: per-mode dispatch extracted into
com.ceros.delivery(DeliveryResult,ManifestRenderer,DeepLinkResolver) andcom.ceros.delivery.modes(Fetch / Store / Embed handlers,DeliveryHandler.forModefactory). CerosFlexModelsplit into a data POJO and aCerosFlexViewSling Model; delivery orchestration moved to the newCerosFlexDeliveryService. HTL bindsCerosFlexView.ServletUtilsmoved tocom.ceros.util; addedManifestUtils.primarySlugOf.
Removed
- Inline shared-services stub and the legacy single-manifest parse fallback in
StoredManifestBundle.
[0.0.2] - 2026-06-02
Changed
ceros-aem-connector-all's published POM markscore/ui.apps/ui.configsub-module dependencies as<optional>true</optional>. Consumers can now depend onceros-aem-connector-allwithout an<exclusions>block — the sub-modules are embedded inside the content-package zip and are not published to Maven Central.
[0.0.1] - 2026-06-02
Initial release.
Added
cerosflexAEM component with three delivery modes:- Server-side (Always Fetch) — loads the Ceros manifest on every page render.
- Server-side (Store) — fetches once and persists the manifest to JCR.
- **Client-side (Iframe embed)...
release-1.0.1
1.0.1
Fixed
- Experiences added in the server-side Always Fetch, Store, and HTML Import modes now show the correct brand fonts and colours, both on the published page and in the author preview. The brand kit wasn't being applied, so text fell back to a default font and brand background colours were missing; both now render as designed.
release-1.0.0
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
[1.0.0] - 2026-06-30
Fixed
- Deleting a Ceros Flex component in the author no longer fails with "Paragraph delete operation failed". The manifest-URL post-processor now runs only on a dialog save (the default modify operation) and skips delete/move/copy, so it no longer validates the manifest URL against a node being removed.
[0.0.8] - 2026-06-26
Security
- Pasted experience URLs are no longer trusted by default. A manifest is only fetched — and the scripts it references only injected — when it is served from a Ceros-owned domain (
ceros.siteby default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the newx-flex-manifestheader off the published page to discover its canonical, Ceros-hosted manifest URL, and the advertised URL must itself pass the Ceros-owned whitelist (so a spoofed header pointing off-Ceros is rejected). Mirrors the WordPress connector's keyless paste hardening (ceros-plugin-wordpress#3).- New
CerosManifestService.resolveTrustedManifestUrlperforms the whitelist +x-flex-manifestresolution. Pasted URLs are validated on save for every URL-based delivery mode (inline, fetch, embed and store): the dialog post-processor resolves the URL and aborts the save if it isn't a trusted Ceros experience, so an untrusted or unreachable URL can never be persisted. It also canonicalises the storedmanifestUrlfor the live inline/fetch modes so render trusts the stored URL and makes no extra network call.fetchPublicManifestFromUrlenforces the whitelist at render as a defence-in-depth choke point. - Authoring dialog validates the pasted URL on submit for all modes via the new
/bin/ceros/validate-manifest-urlservlet, surfacing the reason in an error notification before the save — matching the feedback Store mode's Fetch button already gave. Client-side validation is UX only; the post-processor gate above is the authoritative, non-bypassable check. - New OSGi config on
CerosManifestServiceImpl:cerosOwnedDomains(trusted apex domains; production domains only by default so customer installs never reference internal environments — non-production Ceros domains are added per environment via OSGi config for local/dev) andallowUntrustedManifestHost(dev/test relaxation so localhost manifests still work; off in production). The connector ships production-safe defaults only — dev relaxations must be configured by the consuming project.
- New
Removed
- Dropped the unused
mediaCdnBaseUrlOSGi property fromCerosAssetStorageService. It was declared but never read — manifest/archive asset URLs are resolved directly — so removing it has no functional effect.
[0.0.7] - 2026-06-18
Fixed
- HTML Import now uploads every file in the export archive.
uploadAssetsFromArchivepreviously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos underassets/were silently skipped; it now bulk-imports every remaining file underassets/, mirroring the archive layout, with an extension-to-MIME map for correct content types.
Changed
- Cerosflex authoring dialog polish:
- Renamed the dialog title from "Properties" to "Ceros Flex".
- Browse Experiences is now a compact folder-search icon button (tooltip "Browse Ceros Experiences") sitting inside the right edge of the Ceros Experience URL field, instead of a separate text button.
- "Last fetched" / "Last imported" now shows as a muted, human-readable timestamp inline with the Fetch button (store) and under the file picker (import); the disabled field and its standalone label were removed. "Last Fetched" is hidden entirely for the fetch/inline/iframe modes.
- Rewrote all field tooltips in plain, non-technical language for designers and marketers; added hover tooltips to the Fetch button and file picker so every control has an info or hover state.
- Hid the dialog Help (?) icon (scoped to this dialog) until a real help link is available.
- Removed the import help text; unified the Fetch/Import loading spinner; evened out control-row spacing so the import rows match the other modes.
[0.0.6] - 2026-06-17
Fixed
- HTML-import components no longer revert to the "not configured" placeholder after the dialog is saved. Import stores the manifest in the DAM and sets
manifestUrlto that DAM path (like store mode), but clicking Done submitted the empty hiddenmanifestUrlfield and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, andisConfigured()additionally treats an imported bundle as configured (guarding the click-Done-immediately race).
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
[0.0.3] - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicegainsfetchManifestBundle/storeManifestBundle. - README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault
subPackageembedding and manual CRX install).
Changed
- Delivery layer refactor: per-mode dispatch extracted into
com.ceros.delivery(DeliveryResult,ManifestRenderer,DeepLinkResolver) andcom.ceros.delivery.modes(Fetch / Store / Embed handlers,DeliveryHandler.forModefactory). CerosFlexModelsplit into a data POJO and aCerosFlexViewSling Model; delivery orchestration moved to the newCerosFlexDeliveryService. HTL bindsCerosFlexView.ServletUtilsmoved tocom.ceros.util; addedManifestUtils.primarySlugOf.
Removed
- Inline shared-services stub and the legacy single-manifest parse fallback in
StoredManifestBundle.
[0.0.2] - 2026-06-02
Changed
ceros-aem-connector-all's published POM markscore/ui.apps/ui.configsub-module dependencies as<optional>true</optional>. Consumers can now depend onceros-aem-connector-allwithout an<exclusions>block — the sub-modules are embedded inside the content-package zip and are not published to Maven Central.
[0.0.1] - 2026-06-02
Initial release.
Added
cerosflexAEM component with three delivery modes:- Server-side (Always Fetch) — loads the Ceros manifest on every page render.
- Server-side (Store) — fetches once and persists the manifest to JCR.
- Client-side (Iframe embed) — injects the Ceros embed script for client-side rendering.
CerosManifestServiceandCerosManifestStoreServletfor fetching, parsing, and persisting Ceros experience manifests.- DAM upload of manifest-referenced assets using the manifest's declared
mimeTyperather than file-extension guessing. - Preservation of Ceros anchor links from the AEM link checker; manifest URL is exposed for downstream tooling.
- Editor-view iframe previews suppress Ceros analytics t...
release-0.0.8
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
[0.0.8] - 2026-06-26
Security
- Pasted experience URLs are no longer trusted by default. A manifest is only fetched — and the scripts it references only injected — when it is served from a Ceros-owned domain (
ceros.siteby default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the newx-flex-manifestheader off the published page to discover its canonical, Ceros-hosted manifest URL, and the advertised URL must itself pass the Ceros-owned whitelist (so a spoofed header pointing off-Ceros is rejected). Mirrors the WordPress connector's keyless paste hardening (ceros-plugin-wordpress#3).- New
CerosManifestService.resolveTrustedManifestUrlperforms the whitelist +x-flex-manifestresolution. Pasted URLs are validated on save for every URL-based delivery mode (inline, fetch, embed and store): the dialog post-processor resolves the URL and aborts the save if it isn't a trusted Ceros experience, so an untrusted or unreachable URL can never be persisted. It also canonicalises the storedmanifestUrlfor the live inline/fetch modes so render trusts the stored URL and makes no extra network call.fetchPublicManifestFromUrlenforces the whitelist at render as a defence-in-depth choke point. - Authoring dialog validates the pasted URL on submit for all modes via the new
/bin/ceros/validate-manifest-urlservlet, surfacing the reason in an error notification before the save — matching the feedback Store mode's Fetch button already gave. Client-side validation is UX only; the post-processor gate above is the authoritative, non-bypassable check. - New OSGi config on
CerosManifestServiceImpl:cerosOwnedDomains(trusted apex domains; production domains only by default so customer installs never reference internal environments — non-production Ceros domains are added per environment via OSGi config for local/dev) andallowUntrustedManifestHost(dev/test relaxation so localhost manifests still work; off in production). The connector ships production-safe defaults only — dev relaxations must be configured by the consuming project.
- New
Removed
- Dropped the unused
mediaCdnBaseUrlOSGi property fromCerosAssetStorageService. It was declared but never read — manifest/archive asset URLs are resolved directly — so removing it has no functional effect.
[0.0.7] - 2026-06-18
Fixed
- HTML Import now uploads every file in the export archive.
uploadAssetsFromArchivepreviously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos underassets/were silently skipped; it now bulk-imports every remaining file underassets/, mirroring the archive layout, with an extension-to-MIME map for correct content types.
Changed
- Cerosflex authoring dialog polish:
- Renamed the dialog title from "Properties" to "Ceros Flex".
- Browse Experiences is now a compact folder-search icon button (tooltip "Browse Ceros Experiences") sitting inside the right edge of the Ceros Experience URL field, instead of a separate text button.
- "Last fetched" / "Last imported" now shows as a muted, human-readable timestamp inline with the Fetch button (store) and under the file picker (import); the disabled field and its standalone label were removed. "Last Fetched" is hidden entirely for the fetch/inline/iframe modes.
- Rewrote all field tooltips in plain, non-technical language for designers and marketers; added hover tooltips to the Fetch button and file picker so every control has an info or hover state.
- Hid the dialog Help (?) icon (scoped to this dialog) until a real help link is available.
- Removed the import help text; unified the Fetch/Import loading spinner; evened out control-row spacing so the import rows match the other modes.
[0.0.6] - 2026-06-17
Fixed
- HTML-import components no longer revert to the "not configured" placeholder after the dialog is saved. Import stores the manifest in the DAM and sets
manifestUrlto that DAM path (like store mode), but clicking Done submitted the empty hiddenmanifestUrlfield and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, andisConfigured()additionally treats an imported bundle as configured (guarding the click-Done-immediately race).
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
[0.0.3] - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicegainsfetchManifestBundle/storeManifestBundle. - README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault
subPackageembedding and manual CRX install).
Changed
- Delivery layer refactor: per-mode dispatch extracted into
com.ceros.delivery(DeliveryResult,ManifestRenderer,DeepLinkResolver) andcom.ceros.delivery.modes(Fetch / Store / Embed handlers,DeliveryHandler.forModefactory). CerosFlexModelsplit into a data POJO and aCerosFlexViewSling Model; delivery orchestration moved to the newCerosFlexDeliveryService. HTL bindsCerosFlexView.ServletUtilsmoved tocom.ceros.util; addedManifestUtils.primarySlugOf.
Removed
- Inline shared-services stub and the legacy single-manifest parse fallback in
StoredManifestBundle.
[0.0.2] - 2026-06-02
Changed
ceros-aem-connector-all's published POM markscore/ui.apps/ui.configsub-module dependencies as<optional>true</optional>. Consumers can now depend onceros-aem-connector-allwithout an<exclusions>block — the sub-modules are embedded inside the content-package zip and are not published to Maven Central.
[0.0.1] - 2026-06-02
Initial release.
Added
cerosflexAEM component with three delivery modes:- Server-side (Always Fetch) — loads the Ceros manifest on every page render.
- Server-side (Store) — fetches once and persists the manifest to JCR.
- Client-side (Iframe embed) — injects the Ceros embed script for client-side rendering.
CerosManifestServiceandCerosManifestStoreServletfor fetching, parsing, and persisting Ceros experience manifests.- DAM upload of manifest-referenced assets using the manifest's declared
mimeTyperather than file-extension guessing. - Preservation of Ceros anchor links from the AEM link checker; manifest URL is exposed for downstream tooling.
- Editor-view iframe previews suppress Ceros analytics to keep author traffic out of customer metrics.
- External
<script>elements injected into the body stripcrossoriginandtype=moduleto avoid AEM dispatcher conflicts. - OSGi configuration support (timeouts, HTTP scheme allowlist, local-address allowlist) via
CerosManifestServiceImpl.cfg.json. - Authenticated browsing of Ceros ...
release-0.0.7
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
[0.0.7] - 2026-06-18
Fixed
- HTML Import now uploads every file in the export archive.
uploadAssetsFromArchivepreviously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos underassets/were silently skipped; it now bulk-imports every remaining file underassets/, mirroring the archive layout, with an extension-to-MIME map for correct content types.
Changed
- Cerosflex authoring dialog polish:
- Renamed the dialog title from "Properties" to "Ceros Flex".
- Browse Experiences is now a compact folder-search icon button (tooltip "Browse Ceros Experiences") sitting inside the right edge of the Ceros Experience URL field, instead of a separate text button.
- "Last fetched" / "Last imported" now shows as a muted, human-readable timestamp inline with the Fetch button (store) and under the file picker (import); the disabled field and its standalone label were removed. "Last Fetched" is hidden entirely for the fetch/inline/iframe modes.
- Rewrote all field tooltips in plain, non-technical language for designers and marketers; added hover tooltips to the Fetch button and file picker so every control has an info or hover state.
- Hid the dialog Help (?) icon (scoped to this dialog) until a real help link is available.
- Removed the import help text; unified the Fetch/Import loading spinner; evened out control-row spacing so the import rows match the other modes.
[0.0.6] - 2026-06-17
Fixed
- HTML-import components no longer revert to the "not configured" placeholder after the dialog is saved. Import stores the manifest in the DAM and sets
manifestUrlto that DAM path (like store mode), but clicking Done submitted the empty hiddenmanifestUrlfield and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, andisConfigured()additionally treats an imported bundle as configured (guarding the click-Done-immediately race).
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
0.0.3 - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicegainsfetchManifestBundle/storeManifestBundle. - README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault
subPackageembedding and manual CRX install).
Changed
- Delivery layer refactor: per-mode dispatch extracted into
com.ceros.delivery(DeliveryResult,ManifestRenderer,DeepLinkResolver) andcom.ceros.delivery.modes(Fetch / Store / Embed handlers,DeliveryHandler.forModefactory). CerosFlexModelsplit into a data POJO and aCerosFlexViewSling Model; delivery orchestration moved to the newCerosFlexDeliveryService. HTL bindsCerosFlexView.ServletUtilsmoved tocom.ceros.util; addedManifestUtils.primarySlugOf.
Removed
- Inline shared-services stub and the legacy single-manifest parse fallback in
StoredManifestBundle.
0.0.2 - 2026-06-02
Changed
ceros-aem-connector-all's published POM markscore/ui.apps/ui.configsub-module dependencies as<optional>true</optional>. Consumers can now depend onceros-aem-connector-allwithout an<exclusions>block — the sub-modules are embedded inside the content-package zip and are not published to Maven Central.
0.0.1 - 2026-06-02
Initial release.
Added
cerosflexAEM component with three delivery modes:- Server-side (Always Fetch) — loads the Ceros manifest on every page render.
- Server-side (Store) — fetches once and persists the manifest to JCR.
- Client-side (Iframe embed) — injects the Ceros embed script for client-side rendering.
CerosManifestServiceandCerosManifestStoreServletfor fetching, parsing, and persisting Ceros experience manifests.- DAM upload of manifest-referenced assets using the manifest's declared
mimeTyperather than file-extension guessing. - Preservation of Ceros anchor links from the AEM link checker; manifest URL is exposed for downstream tooling.
- Editor-view iframe previews suppress Ceros analytics to keep author traffic out of customer metrics.
- External
<script>elements injected into the body stripcrossoriginandtype=moduleto avoid AEM dispatcher conflicts. - OSGi configuration support (timeouts, HTTP scheme allowlist, local-address allowlist) via
CerosManifestServiceImpl.cfg.json. - Authenticated browsing of Ceros Flex experiences in the authoring dialog via
CerosAuthenticatedApiService.
release-0.0.6
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
[0.0.6] - 2026-06-17
Fixed
- HTML-import components no longer revert to the "not configured" placeholder after the dialog is saved. Import stores the manifest in the DAM and sets
manifestUrlto that DAM path (like store mode), but clicking Done submitted the empty hiddenmanifestUrlfield and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, andisConfigured()additionally treats an imported bundle as configured (guarding the click-Done-immediately race).
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
0.0.3 - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicegainsfetchManifestBundle/storeManifestBundle. - README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault
subPackageembedding and manual CRX install).
Changed
- Delivery layer refactor: per-mode dispatch extracted into
com.ceros.delivery(DeliveryResult,ManifestRenderer,DeepLinkResolver) andcom.ceros.delivery.modes(Fetch / Store / Embed handlers,DeliveryHandler.forModefactory). CerosFlexModelsplit into a data POJO and aCerosFlexViewSling Model; delivery orchestration moved to the newCerosFlexDeliveryService. HTL bindsCerosFlexView.ServletUtilsmoved tocom.ceros.util; addedManifestUtils.primarySlugOf.
Removed
- Inline shared-services stub and the legacy single-manifest parse fallback in
StoredManifestBundle.
0.0.2 - 2026-06-02
Changed
ceros-aem-connector-all's published POM markscore/ui.apps/ui.configsub-module dependencies as<optional>true</optional>. Consumers can now depend onceros-aem-connector-allwithout an<exclusions>block — the sub-modules are embedded inside the content-package zip and are not published to Maven Central.
0.0.1 - 2026-06-02
Initial release.
Added
cerosflexAEM component with three delivery modes:- Server-side (Always Fetch) — loads the Ceros manifest on every page render.
- Server-side (Store) — fetches once and persists the manifest to JCR.
- Client-side (Iframe embed) — injects the Ceros embed script for client-side rendering.
CerosManifestServiceandCerosManifestStoreServletfor fetching, parsing, and persisting Ceros experience manifests.- DAM upload of manifest-referenced assets using the manifest's declared
mimeTyperather than file-extension guessing. - Preservation of Ceros anchor links from the AEM link checker; manifest URL is exposed for downstream tooling.
- Editor-view iframe previews suppress Ceros analytics to keep author traffic out of customer metrics.
- External
<script>elements injected into the body stripcrossoriginandtype=moduleto avoid AEM dispatcher conflicts. - OSGi configuration support (timeouts, HTTP scheme allowlist, local-address allowlist) via
CerosManifestServiceImpl.cfg.json. - Authenticated browsing of Ceros Flex experiences in the authoring dialog via
CerosAuthenticatedApiService.
release-0.0.5
Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
[0.0.5] - 2026-06-17
Added
- HTML-import delivery mode: authors can upload a Ceros
.tar.gzexport in the cerosflex dialog and have it unpacked into the DAM, then served fully offline with no CDN dependency.CerosImportArchiveServlet(/bin/ceros/import-archive) streams the upload to/var/ceros/imports/<jobId>, andCerosImportArchiveJobConsumer(topiccom/ceros/import-archive) unpacks it, stores assets + manifests to DAM, and deletes the transient archive on success. The stored end state matches store mode, so it renders through the existingStoreDeliveryHandlerand.preview.htmlservlet. ArchiveUtils— dependency-free.tar.gzreader (JDK gunzip + minimal USTAR) that strips the wrapper directory, with zip-slip and uncompressed-size guards.CerosAssetStorageService.uploadAssetsFromArchive— archive-sourced asset upload that mirrors the relative archive layout into<damBasePath>/<expSlug>/<pageSlug>/and rewrites manifest URLs to the DAM copies.
Changed
CerosManifestService.storeManifestBundleis mode-parameterised so import persistscerosMode=import(andmanifestUrlpointing at the primary DAM manifest).ServletUtilsgains a sharednormaliseComponentPathreused by the fetch and import servlets.- Authoring dialog adds the Server-side (HTML Import) option with a file picker that uploads on selection (loading state, no separate button); fetch-only widgets (Browse Experiences, Ceros Experience URL, Last Fetched) are hidden in import mode. Status polling reuses the existing
/bin/ceros/fetch-manifest-statusendpoint, and repoinit adds/var/ceros/imports.
[0.0.4] - 2026-06-12
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.
0.0.3 - 2026-06-12
Added
- Multi-page store mode: store deliveries now persist a
StoredManifestBundle(primary + per-page manifests) so any deep-linked page can be served fully offline.CerosManifestServicegainsfetchManifestBundle/storeManifestBundle. - README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault
subPackageembedding and manual CRX install).
Changed
- Delivery layer refactor: per-mode dispatch extracted into
com.ceros.delivery(DeliveryResult,ManifestRenderer,DeepLinkResolver) andcom.ceros.delivery.modes(Fetch / Store / Embed handlers,DeliveryHandler.forModefactory). CerosFlexModelsplit into a data POJO and aCerosFlexViewSling Model; delivery orchestration moved to the newCerosFlexDeliveryService. HTL bindsCerosFlexView.ServletUtilsmoved tocom.ceros.util; addedManifestUtils.primarySlugOf.
Removed
- Inline shared-services stub and the legacy single-manifest parse fallback in
StoredManifestBundle.
0.0.2 - 2026-06-02
Changed
ceros-aem-connector-all's published POM markscore/ui.apps/ui.configsub-module dependencies as<optional>true</optional>. Consumers can now depend onceros-aem-connector-allwithout an<exclusions>block — the sub-modules are embedded inside the content-package zip and are not published to Maven Central.
0.0.1 - 2026-06-02
Initial release.
Added
cerosflexAEM component with three delivery modes:- Server-side (Always Fetch) — loads the Ceros manifest on every page render.
- Server-side (Store) — fetches once and persists the manifest to JCR.
- Client-side (Iframe embed) — injects the Ceros embed script for client-side rendering.
CerosManifestServiceandCerosManifestStoreServletfor fetching, parsing, and persisting Ceros experience manifests.- DAM upload of manifest-referenced assets using the manifest's declared
mimeTyperather than file-extension guessing. - Preservation of Ceros anchor links from the AEM link checker; manifest URL is exposed for downstream tooling.
- Editor-view iframe previews suppress Ceros analytics to keep author traffic out of customer metrics.
- External
<script>elements injected into the body stripcrossoriginandtype=moduleto avoid AEM dispatcher conflicts. - OSGi configuration support (timeouts, HTTP scheme allowlist, local-address allowlist) via
CerosManifestServiceImpl.cfg.json. - Authenticated browsing of Ceros Flex experiences in the authoring dialog via
CerosAuthenticatedApiService.
release-0.0.4
Added
- Manifest fetch now runs as a Sling Job with a polled
cerosflex.fetch-statusendpoint and a newJcrFetchProgresswriter, so the authoring dialog can show live progress instead of a long-blocking request. - Store mode mirrors each page's manifest into DAM at
<damBasePath>/<expSlug>/<pageSlug>/manifest.json, withpages[].manifestUrlrewritten to sibling DAM URLs.data-flex-manifest-urlpoints at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time. - New
CerosFlexPreviewServletserves<componentPath>.preview.html— a standalone, chrome-free render of the experience used as the iframe source for the author-mode store preview.
Changed
- Switched manifest schema from
manifest.v0.jsontomanifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, newpages[].manifestUrlsetter). - Author-mode preview in store mode no longer points at the external Ceros CDN; it loads the local preview servlet instead, keeping the editor consistent with store mode's offline guarantee.