Skip to content

Releases: ceros/ceros-aem-connector

release-1.0.4

Choose a tag to compare

@alirezasabouri alirezasabouri released this 28 Aug 22:12

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.site by default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the new x-flex-manifest header 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.resolveTrustedManifestUrl performs the whitelist + x-flex-manifest resolution. 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 stored manifestUrl for the live inline/fetch modes so render trusts the stored URL and makes no extra network call. fetchPublicManifestFromUrl enforces 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-url servlet, 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) and allowUntrustedManifestHost (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.

Removed

  • Dropped the unused mediaCdnBaseUrl OSGi property from CerosAssetStorageService. 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. uploadAssetsFromArchive previously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos under assets/ were silently skipped; it now bulk-imports every remaining file under assets/, 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 manifestUrl to that DAM path (like store mode), but clicking Done submitted the empty hidden manifestUrl field and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, and isConfigured() 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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService ga...
Read more

release-1.0.3

Choose a tag to compare

@alirezasabouri alirezasabouri released this 20 Aug 13:21

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.site by default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the new x-flex-manifest header 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.resolveTrustedManifestUrl performs the whitelist + x-flex-manifest resolution. 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 stored manifestUrl for the live inline/fetch modes so render trusts the stored URL and makes no extra network call. fetchPublicManifestFromUrl enforces 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-url servlet, 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) and allowUntrustedManifestHost (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.

Removed

  • Dropped the unused mediaCdnBaseUrl OSGi property from CerosAssetStorageService. 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. uploadAssetsFromArchive previously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos under assets/ were silently skipped; it now bulk-imports every remaining file under assets/, 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 manifestUrl to that DAM path (like store mode), but clicking Done submitted the empty hidden manifestUrl field and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, and isConfigured() 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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService gains fetchManifestBundle / storeManifestBundle.
  • README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault subPackage embedding and manual CRX install).

Changed

  • Delivery layer refactor: per-mode dispatch extracted into com.ceros.delivery (DeliveryResult, ManifestRenderer, DeepLinkResolver) and com.ceros.delivery.modes (Fetch / Store / Embed handlers, DeliveryHandler.forMode factory).
  • CerosFlexModel split into a data POJO and a CerosFlexView Sling Model; delivery orchestration moved to the new CerosFlexDeliveryService. HTL binds CerosFlexView.
  • ServletUtils moved to com.ceros.util; added ManifestUtils.primarySlugOf.

Removed

  • Inline shared-services stub and the legacy sing...
Read more

release-1.0.2

Choose a tag to compare

@alirezasabouri alirezasabouri released this 07 Aug 17:20

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.site by default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the new x-flex-manifest header 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.resolveTrustedManifestUrl performs the whitelist + x-flex-manifest resolution. 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 stored manifestUrl for the live inline/fetch modes so render trusts the stored URL and makes no extra network call. fetchPublicManifestFromUrl enforces 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-url servlet, 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) and allowUntrustedManifestHost (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.

Removed

  • Dropped the unused mediaCdnBaseUrl OSGi property from CerosAssetStorageService. 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. uploadAssetsFromArchive previously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos under assets/ were silently skipped; it now bulk-imports every remaining file under assets/, 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 manifestUrl to that DAM path (like store mode), but clicking Done submitted the empty hidden manifestUrl field and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, and isConfigured() 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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService gains fetchManifestBundle / storeManifestBundle.
  • README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault subPackage embedding and manual CRX install).

Changed

  • Delivery layer refactor: per-mode dispatch extracted into com.ceros.delivery (DeliveryResult, ManifestRenderer, DeepLinkResolver) and com.ceros.delivery.modes (Fetch / Store / Embed handlers, DeliveryHandler.forMode factory).
  • CerosFlexModel split into a data POJO and a CerosFlexView Sling Model; delivery orchestration moved to the new CerosFlexDeliveryService. HTL binds CerosFlexView.
  • ServletUtils moved to com.ceros.util; added ManifestUtils.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 marks core / ui.apps / ui.config sub-module dependencies as <optional>true</optional>. Consumers can now depend on ceros-aem-connector-all without 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

  • cerosflex AEM 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)...
Read more

release-1.0.1

Choose a tag to compare

@rdavidson-ceros rdavidson-ceros released this 01 Jul 14:11

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

Choose a tag to compare

@rdavidson-ceros rdavidson-ceros released this 30 Jun 09:37

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.site by default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the new x-flex-manifest header 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.resolveTrustedManifestUrl performs the whitelist + x-flex-manifest resolution. 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 stored manifestUrl for the live inline/fetch modes so render trusts the stored URL and makes no extra network call. fetchPublicManifestFromUrl enforces 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-url servlet, 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) and allowUntrustedManifestHost (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.

Removed

  • Dropped the unused mediaCdnBaseUrl OSGi property from CerosAssetStorageService. 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. uploadAssetsFromArchive previously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos under assets/ were silently skipped; it now bulk-imports every remaining file under assets/, 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 manifestUrl to that DAM path (like store mode), but clicking Done submitted the empty hidden manifestUrl field and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, and isConfigured() 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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService gains fetchManifestBundle / storeManifestBundle.
  • README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault subPackage embedding and manual CRX install).

Changed

  • Delivery layer refactor: per-mode dispatch extracted into com.ceros.delivery (DeliveryResult, ManifestRenderer, DeepLinkResolver) and com.ceros.delivery.modes (Fetch / Store / Embed handlers, DeliveryHandler.forMode factory).
  • CerosFlexModel split into a data POJO and a CerosFlexView Sling Model; delivery orchestration moved to the new CerosFlexDeliveryService. HTL binds CerosFlexView.
  • ServletUtils moved to com.ceros.util; added ManifestUtils.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 marks core / ui.apps / ui.config sub-module dependencies as <optional>true</optional>. Consumers can now depend on ceros-aem-connector-all without 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

  • cerosflex AEM 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.
  • CerosManifestService and CerosManifestStoreServlet for fetching, parsing, and persisting Ceros experience manifests.
  • DAM upload of manifest-referenced assets using the manifest's declared mimeType rather 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...
Read more

release-0.0.8

Choose a tag to compare

@rdavidson-ceros rdavidson-ceros released this 26 Jun 11:57

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.site by default; configurable). Authors may still paste any URL: a customer vanity domain is resolved by reading the new x-flex-manifest header 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.resolveTrustedManifestUrl performs the whitelist + x-flex-manifest resolution. 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 stored manifestUrl for the live inline/fetch modes so render trusts the stored URL and makes no extra network call. fetchPublicManifestFromUrl enforces 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-url servlet, 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) and allowUntrustedManifestHost (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.

Removed

  • Dropped the unused mediaCdnBaseUrl OSGi property from CerosAssetStorageService. 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. uploadAssetsFromArchive previously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos under assets/ were silently skipped; it now bulk-imports every remaining file under assets/, 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 manifestUrl to that DAM path (like store mode), but clicking Done submitted the empty hidden manifestUrl field and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, and isConfigured() 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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService gains fetchManifestBundle / storeManifestBundle.
  • README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault subPackage embedding and manual CRX install).

Changed

  • Delivery layer refactor: per-mode dispatch extracted into com.ceros.delivery (DeliveryResult, ManifestRenderer, DeepLinkResolver) and com.ceros.delivery.modes (Fetch / Store / Embed handlers, DeliveryHandler.forMode factory).
  • CerosFlexModel split into a data POJO and a CerosFlexView Sling Model; delivery orchestration moved to the new CerosFlexDeliveryService. HTL binds CerosFlexView.
  • ServletUtils moved to com.ceros.util; added ManifestUtils.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 marks core / ui.apps / ui.config sub-module dependencies as <optional>true</optional>. Consumers can now depend on ceros-aem-connector-all without 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

  • cerosflex AEM 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.
  • CerosManifestService and CerosManifestStoreServlet for fetching, parsing, and persisting Ceros experience manifests.
  • DAM upload of manifest-referenced assets using the manifest's declared mimeType rather 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 strip crossorigin and type=module to avoid AEM dispatcher conflicts.
  • OSGi configuration support (timeouts, HTTP scheme allowlist, local-address allowlist) via CerosManifestServiceImpl.cfg.json.
  • Authenticated browsing of Ceros ...
Read more

release-0.0.7

Choose a tag to compare

@rdavidson-ceros rdavidson-ceros released this 18 Jun 10:09

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. uploadAssetsFromArchive previously stored only manifest-referenced assets, so fonts, icons, backgrounds, and videos under assets/ were silently skipped; it now bulk-imports every remaining file under assets/, 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 manifestUrl to that DAM path (like store mode), but clicking Done submitted the empty hidden manifestUrl field and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, and isConfigured() 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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService gains fetchManifestBundle / storeManifestBundle.
  • README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault subPackage embedding and manual CRX install).

Changed

  • Delivery layer refactor: per-mode dispatch extracted into com.ceros.delivery (DeliveryResult, ManifestRenderer, DeepLinkResolver) and com.ceros.delivery.modes (Fetch / Store / Embed handlers, DeliveryHandler.forMode factory).
  • CerosFlexModel split into a data POJO and a CerosFlexView Sling Model; delivery orchestration moved to the new CerosFlexDeliveryService. HTL binds CerosFlexView.
  • ServletUtils moved to com.ceros.util; added ManifestUtils.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 marks core / ui.apps / ui.config sub-module dependencies as <optional>true</optional>. Consumers can now depend on ceros-aem-connector-all without 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

  • cerosflex AEM 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.
  • CerosManifestService and CerosManifestStoreServlet for fetching, parsing, and persisting Ceros experience manifests.
  • DAM upload of manifest-referenced assets using the manifest's declared mimeType rather 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 strip crossorigin and type=module to 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

Choose a tag to compare

@rdavidson-ceros rdavidson-ceros released this 17 Jun 12:05

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 manifestUrl to that DAM path (like store mode), but clicking Done submitted the empty hidden manifestUrl field and cleared it. The dialog now mirrors the imported manifest's DAM URL back into the field on success so Done preserves it, and isConfigured() 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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService gains fetchManifestBundle / storeManifestBundle.
  • README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault subPackage embedding and manual CRX install).

Changed

  • Delivery layer refactor: per-mode dispatch extracted into com.ceros.delivery (DeliveryResult, ManifestRenderer, DeepLinkResolver) and com.ceros.delivery.modes (Fetch / Store / Embed handlers, DeliveryHandler.forMode factory).
  • CerosFlexModel split into a data POJO and a CerosFlexView Sling Model; delivery orchestration moved to the new CerosFlexDeliveryService. HTL binds CerosFlexView.
  • ServletUtils moved to com.ceros.util; added ManifestUtils.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 marks core / ui.apps / ui.config sub-module dependencies as <optional>true</optional>. Consumers can now depend on ceros-aem-connector-all without 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

  • cerosflex AEM 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.
  • CerosManifestService and CerosManifestStoreServlet for fetching, parsing, and persisting Ceros experience manifests.
  • DAM upload of manifest-referenced assets using the manifest's declared mimeType rather 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 strip crossorigin and type=module to 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

Choose a tag to compare

@rdavidson-ceros rdavidson-ceros released this 17 Jun 10:24

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.gz export 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>, and CerosImportArchiveJobConsumer (topic com/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 existing StoreDeliveryHandler and .preview.html servlet.
  • ArchiveUtils — dependency-free .tar.gz reader (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.storeManifestBundle is mode-parameterised so import persists cerosMode=import (and manifestUrl pointing at the primary DAM manifest). ServletUtils gains a shared normaliseComponentPath reused 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-status endpoint, 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-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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. CerosManifestService gains fetchManifestBundle / storeManifestBundle.
  • README documents how to consume the published plugin from Maven Central (Cloud Manager / filevault subPackage embedding and manual CRX install).

Changed

  • Delivery layer refactor: per-mode dispatch extracted into com.ceros.delivery (DeliveryResult, ManifestRenderer, DeepLinkResolver) and com.ceros.delivery.modes (Fetch / Store / Embed handlers, DeliveryHandler.forMode factory).
  • CerosFlexModel split into a data POJO and a CerosFlexView Sling Model; delivery orchestration moved to the new CerosFlexDeliveryService. HTL binds CerosFlexView.
  • ServletUtils moved to com.ceros.util; added ManifestUtils.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 marks core / ui.apps / ui.config sub-module dependencies as <optional>true</optional>. Consumers can now depend on ceros-aem-connector-all without 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

  • cerosflex AEM 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.
  • CerosManifestService and CerosManifestStoreServlet for fetching, parsing, and persisting Ceros experience manifests.
  • DAM upload of manifest-referenced assets using the manifest's declared mimeType rather 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 strip crossorigin and type=module to 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

Choose a tag to compare

@rdavidson-ceros rdavidson-ceros released this 12 Jun 17:03

Added

  • Manifest fetch now runs as a Sling Job with a polled cerosflex.fetch-status endpoint and a new JcrFetchProgress writer, 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, with pages[].manifestUrl rewritten to sibling DAM URLs. data-flex-manifest-url points at the DAM copy so the in-browser SPA router navigates entirely inside AEM — no Ceros CDN call at click time.
  • New CerosFlexPreviewServlet serves <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.json to manifest.v1.json. The model classes mirror the v1 layout (CerosManifestV1, new pages[].manifestUrl setter).
  • 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.