From f00062375ab2f4e752ae8ca91c1299b8864b91a5 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 10 Jun 2025 23:31:14 +1000 Subject: [PATCH 01/26] DOC-3226: Update licensing information and examples for TinyMCE 8, including T8LK: prefix requirements for self-hosted deployments across various integrations and documentation. --- modules/ROOT/pages/license-key.adoc | 248 +++++++++++++++++- modules/ROOT/pages/vite-es6-npm.adoc | 12 + .../integrations/angular-tech-ref.adoc | 18 +- .../integrations/blazor-tech-ref.adoc | 23 +- .../partials/integrations/react-tech-ref.adoc | 18 +- .../integrations/svelte-quick-start.adoc | 5 +- .../integrations/svelte-tech-ref.adoc | 18 +- .../partials/integrations/vue-tech-ref.adoc | 18 +- .../webcomponent-quick-start.adoc | 2 +- .../integrations/webcomponent-tech-ref.adoc | 36 +++ .../bundling-vite-es6-npm_editor.adoc | 2 + 11 files changed, 369 insertions(+), 31 deletions(-) diff --git a/modules/ROOT/pages/license-key.adoc b/modules/ROOT/pages/license-key.adoc index 7cd007e07e..21fdbc2075 100644 --- a/modules/ROOT/pages/license-key.adoc +++ b/modules/ROOT/pages/license-key.adoc @@ -3,17 +3,218 @@ :description: Learn how to configure license key and stop {productname} from running in the evaluation mode. :keywords: {productname}, cloud, script, textarea, apiKey, faq, license key, frequently asked questions, +== Overview + +{productname} 8 introduces an enhanced license key system that provides improved subscription access control and streamlined renewal processes. This system includes both date-based and version-locked keys, supporting various deployment scenarios including cloud, self-hosted, and hybrid configurations. + [IMPORTANT] ==== -{productname} 7 is licensed under the GNU General Public License Version 2 or later. A new configuration option called 'license_key' requires developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license. +If you are using {productname} 7, it is licensed under the GNU General Public License Version 2 or later. A configuration option called 'license_key' requires developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license. If you are using {productname} in a self-hosted environment, a console log warning message will display if the license key config option is missing or invalid. This message aims to ensure compliance with licensing requirements and provide transparency during the evaluation period. This message will not be shown when loading {productname} from {cloudname}, as it is already under a commercial license. + +For {productname} 8, license keys use the `+"T8LK:"+` prefix and provide enhanced validation and management features. These keys support both online and offline validation modes. ==== include::partial$misc/setting-the-license.adoc[] +== License Types and Deployment Options + +=== Date-based Keys (Standard) + +The standard license key type in {productname} 8 is date-based, meaning: + +* The key has a soft expiration date that matches your subscription end date. +* After the soft expiration, the editor enters a grace period in `read-only` mode. +* After the grace period expires, the editor becomes completely disabled. +* Premium plugins are disabled at the soft expiration date. +* In-editor messaging will notify users about approaching expiration. + +=== Version-locked Keys (Alternative) + +For customers who cannot use date-based keys, version-locked keys are available: + +* The key is locked to specific {productname} versions. +* No expiration date - the key continues working for allowed versions. +* Cannot be used with versions released after your subscription ends. +* Must contact account manager to get access to newer versions. +* Suitable for air-gapped environments or strict deployment policies. + +=== Deployment Patterns + +==== Cloud-only + +* Use API key. +* Premium features via subscription. +* CDN-hosted resources. +* Automatic updates. + +==== Self-hosted + +* Use license key with `T8LK` prefix. +* Local premium plugins. +* Manual updates. +* Full control over assets. + +==== Hybrid + +* Both API key and license key. +* Mix of cloud and local features. +* Flexible deployment options. +* Fallback capabilities. + +=== Offline Mode + +For air-gapped environments or offline usage: + +* Supports environments without internet connectivity +* Compatible with strict network security policies +* Maintains license compliance through client-side JWT validation +* Enforces version and domain restrictions without server connection +* Works with standard security controls and firewalls +* Requires version-locked keys for maximum compatibility + +[NOTE] +==== +For air-gapped environments: +* Use version-locked keys instead of date-based keys +* Premium plugins must be downloaded and bundled locally +* Updates require manual deployment of new versions +==== + +== Configuration Examples + +=== Cloud Deployment + +[source,javascript] +---- +tinymce.init({ + selector: "textarea", + plugins: [ + // Core plugins + "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + + // Premium plugins (requires valid subscription) + "powerpaste", "tinycomments", "tinydrive" + ], + toolbar: "undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + api_key: "no-api-key" +}); +---- + +=== Self-hosted Commercial + +[source,javascript] +---- +tinymce.init({ + selector: "textarea", + plugins: [ + "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + // Premium plugins need to be separately downloaded and included + "powerpaste", "tinycomments", "tinydrive" + ], + toolbar: "undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + license_key: "T8LK:your-license-key" // Your commercial license key +}); +---- + +=== Hybrid Deployment + +[source,javascript] +---- +tinymce.init({ + selector: "textarea", + plugins: [ + // Core plugins + "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "link", "lists", + + // Premium plugins - available both via cloud and local fallback + "powerpaste", "tinycomments", "tinydrive" + ], + toolbar: "undo redo | styles | bold italic | alignleft aligncenter alignright | bullist numlist | link image", + // Cloud configuration with local fallback + api_key: "your-api-key", // For cloud features + license_key: "T8LK:your-license", // For local fallback + // Optional: Configure failover behavior + serviceLoadFailbackTime: 5000, // Wait 5s before falling back to local + images_upload_handler: function (blobInfo, progress) { + // Custom handler that tries cloud first, falls back to local + return new Promise((resolve, reject) => { + // Implementation of cloud/local failover logic + }); + } +}); +---- + +[NOTE] +==== +For hybrid deployments: +* Both `api_key` and `license_key` are used together +* Configure appropriate timeouts for service failover +* Consider implementing custom handlers for seamless fallback +* Test both online and offline scenarios +==== + +=== Offline/Air-gapped Deployment + +[source,javascript] +---- +tinymce.init({ + selector: "textarea", + plugins: [ + // Core plugins included in your local bundle + "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "link", "lists", + + // Premium plugins downloaded and bundled locally + "powerpaste", "spelling", "a11ychecker" + ], + toolbar: "undo redo | styles | bold italic | alignleft aligncenter alignright | bullist numlist outdent indent | link image", + // Version-locked key for offline environments + license_key: "T8LK:your-version-locked-key", + // Ensure all resources are loaded locally + skin_url: "/path/to/local/skin", + content_css: "/path/to/local/content.css" +}); +---- + +[NOTE] +==== +For offline deployments: +* All assets must be available locally +* Content delivery URLs should point to local resources +* Premium plugins must be downloaded and included in your bundle +==== + +== License States + +=== Active + +* Full editor and premium plugin functionality. +* Regular version upgrades available (date-based keys). +* No restrictions on features. + +=== Grace Period (Date-based keys only) + +// TBA: Validate this date is correct +* Occurs 30 days before subscription end. +* All features remain functional. +* In-editor notifications about approaching expiration. +* Time to contact Tiny for renewal. + +=== Expired + +* Date-based keys: Editor disabled after grace period. +* Version-locked keys: Cannot use new versions. +* Must obtain new license key after renewal. + == FAQ === What does the GPL license mean? @@ -24,21 +225,46 @@ The GPLv2+ license was chosen to provide the best compatibility with existing GP === What is the difference between a license key and the API key? -The **API key** is used when loading {productname} from the {cloudname}. The **license key** is used to declare the license terms when self-hosting {productname}. +The **API key** is used when loading {productname} from the {cloudname} and undergoes server-side validation. The **license key** (starting with T8LK: in version 8) is used to declare the license terms when self-hosting {productname} and uses client-side JWT validation in the browser. === Who needs to get a license key? -Anyone who intends to self-host {productname} will need to provide a valid commercial license key or declare their intention to use {productname} under the GPLv2+ license. +Anyone who intends to self-host {productname} will need to: +* For version 7: Provide a valid commercial license key or declare their intention to use {productname} under the GPLv2+ license +* For version 8: Obtain a T8LK-prefixed commercial license key or use GPL mode === How will I know if this change affects me? -If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning. If you have actively suppressed or hidden this message, please remove those overrides. If no notification appears, you are not affected. +If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning message. These warnings are designed to ensure compliance and provide transparency during evaluation periods. If you have actively suppressed or hidden these messages, please remove those overrides to maintain proper license validation. If no notification appears, you are not affected. === Should I be using both an API key and a license key? -No, an API key and a license key should not be used simultaneously. The API key should only be used if {productname} is loaded from the {cloudname}. If {productname} is being self-hosted, the license key option should be used instead. +For standard deployments, use only one of the following: +* *API key* - For cloud deployments +** Server-side validation +** Automatic updates and CDN delivery +** Premium plugin access via subscription +** No client-side validation required + +* *License key* - For self-hosted deployments +** Client-side JWT validation +** T8LK prefix required for version 8 +** Supports air-gapped environments +** Local premium plugin validation -=== Will {productname} “phone home” to check the license key? +*Hybrid Deployment Cases:* +* Using both keys together requires specific configuration: +** Set up cloud services with API key +** Configure local fallback with license key +** Enable high availability features +** Access both cloud and local premium plugins + +[IMPORTANT] +==== +Only use both keys in properly configured hybrid deployments where you need cloud features with local fallback. Using both keys without proper hybrid deployment configuration **may cause** validation conflicts and unexpected behavior. +==== + +=== Will {productname} "phone home" to check the license key? No. {productname} does not contact any server to validate the license key. @@ -52,4 +278,12 @@ The license key ensures compliance with {productname} licensing terms. It's part === How can I get further assistance? -For any licensing or technical support questions, see our available options on the https://www.tiny.cloud/docs/tinymce/latest/support/[support page.] \ No newline at end of file +For any licensing or technical support questions, see our available options on the https://www.tiny.cloud/docs/tinymce/latest/support/[support page.] + +=== Technical Support + +For licensing or technical support: +* API key issues: Visit link:https://www.tiny.cloud/my-account[Tiny Cloud Account] +* License key issues: Contact your account manager +* Technical support: Visit link:https://support.tiny.cloud[Support Portal] +* Documentation: See link:https://www.tiny.cloud/docs/tinymce/latest/[TinyMCE Docs] \ No newline at end of file diff --git a/modules/ROOT/pages/vite-es6-npm.adoc b/modules/ROOT/pages/vite-es6-npm.adoc index 2d8c93d9e7..eb2cf0f801 100644 --- a/modules/ROOT/pages/vite-es6-npm.adoc +++ b/modules/ROOT/pages/vite-es6-npm.adoc @@ -15,8 +15,18 @@ This guide requires the following: * Node.js and npm. * Basic knowledge of how to use https://vitejs.dev[Vite]. +* For self-hosted deployments: A valid license key starting with `T8LK:` from your link:{accountpageurl}/[{accountpage}] * (Optional: For premium features) The latest premium .zip bundle of TinyMCE that includes premium plugins. +[IMPORTANT] +==== +When self-hosting TinyMCE 8: + +* A license key is required for commercial deployments +* Keys must start with the `T8LK:` prefix +* For hybrid deployments that need both cloud features and local fallback, you can use both `license_key` and `api_key` +==== + == Procedures :is_zip_install: vite @@ -72,4 +82,6 @@ npx vite preview ---- :!is_zip_install: + + include::partial$module-loading/bundling-next-steps.adoc[] diff --git a/modules/ROOT/partials/integrations/angular-tech-ref.adoc b/modules/ROOT/partials/integrations/angular-tech-ref.adoc index 4a7261db9f..e5e321933a 100644 --- a/modules/ROOT/partials/integrations/angular-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/angular-tech-ref.adoc @@ -132,19 +132,27 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this when self-hosting {productname} instead of loading from {cloudname}. For more information, see: xref:license-key.adoc[License Key]. +Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` *Default value:* `+undefined+` -*Possible values:* `undefined`, `'gpl'` or a valid {productname} license key +*Possible values:* +* `undefined` - Use this when loading from {cloudname} with an API key +* `'gpl'` - For open source projects using GPL license +* `'T8LK:your-license-key'` - For commercial {productname} installations -==== Example: using `+licenseKey+` +==== Example: Commercial license +[source,html] +---- + +---- -[source,jsx] +==== Example: using `+licenseKey+` with GPL +[source,html] ---- - + ---- [[cloudchannel]] diff --git a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc index bf708c773c..e7a3dc90e3 100644 --- a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc @@ -188,18 +188,35 @@ In your component: === `LicenseKey` -Specifies the {productname} license key. Required for self-hosted deployments of {productname}. This property is not required for deployments using the {cloudname}. For more information on licensing, see: xref:license-key.adoc[License key]. +Specifies the {productname} license key. Required for self-hosted deployments of {productname}. This property is not required for deployments using the {cloudname}. + +License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` -==== Example using LicenseKey +*Possible values:* +* `null` - Use this when loading from {cloudname} with an API key +* `"gpl"` - For open source projects using GPL license +* `"T8LK:your-license-key"` - For commercial {productname} installations +==== Example: Commercial license (TinyMCE 8+) [source,cs] ---- ---- +Use this example when you have a commercial license for TinyMCE 8 or newer. The T8LK prefix is required. + +==== Example: Open source GPL license +[source,cs] +---- + +---- + +Use this example when you're using TinyMCE under the open source GPL license in a self-hosted environment. === `ScriptSrc` diff --git a/modules/ROOT/partials/integrations/react-tech-ref.adoc b/modules/ROOT/partials/integrations/react-tech-ref.adoc index 41ed4d0a97..b8deffea34 100644 --- a/modules/ROOT/partials/integrations/react-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/react-tech-ref.adoc @@ -189,20 +189,30 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this when self-hosting {productname} instead of loading from {cloudname}. For more information, see: xref:license-key.adoc[License Key]. +Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` *Default value:* `+undefined+` -*Possible values:* `undefined`, `'gpl'` or a valid {productname} license key +*Possible values:* +* `undefined` - Use this when loading from {cloudname} with an API key +* `'gpl'` - For open source projects using GPL license +* `'T8LK:your-license-key'` - For commercial {productname} installations -==== Example: using `+licenseKey+` +==== Example: Commercial license +[source,jsx] +---- + +---- +==== Example: using `+licenseKey+` with GPL [source,jsx] ---- ---- diff --git a/modules/ROOT/partials/integrations/svelte-quick-start.adoc b/modules/ROOT/partials/integrations/svelte-quick-start.adoc index a59e599cf4..6f6353886d 100644 --- a/modules/ROOT/partials/integrations/svelte-quick-start.adoc +++ b/modules/ROOT/partials/integrations/svelte-quick-start.adoc @@ -74,7 +74,6 @@ let conf = {

Hello Tiny

@@ -140,7 +139,7 @@ let conf = {

Hello Tiny

Hello Tiny

+---- +==== Example: using `+licenseKey+` with GPL [source,jsx] ---- ---- diff --git a/modules/ROOT/partials/integrations/vue-tech-ref.adoc b/modules/ROOT/partials/integrations/vue-tech-ref.adoc index cb24552b92..2c79a389ae 100644 --- a/modules/ROOT/partials/integrations/vue-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/vue-tech-ref.adoc @@ -139,20 +139,30 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this when self-hosting {productname} instead of loading from {cloudname}. For more information, see: xref:license-key.adoc[License Key]. +Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` *Default value:* `+undefined+` -*Possible values:* `undefined`, `'gpl'` or a valid {productname} license key +*Possible values:* +* `undefined` - Use this when loading from {cloudname} with an API key +* `'gpl'` - For open source projects using GPL license +* `'T8LK:your-license-key'` - For commercial {productname} installations -==== Example: using `+licenseKey+` +==== Example: Commercial license +[source,html] +---- + +---- +==== Example: using `+licenseKey+` with GPL [source,html] ---- ---- diff --git a/modules/ROOT/partials/integrations/webcomponent-quick-start.adoc b/modules/ROOT/partials/integrations/webcomponent-quick-start.adoc index b018d2b860..837e8e0985 100644 --- a/modules/ROOT/partials/integrations/webcomponent-quick-start.adoc +++ b/modules/ROOT/partials/integrations/webcomponent-quick-start.adoc @@ -88,7 +88,7 @@ ifeval::["{productSource}" != "cloud"] + [source,html,subs="attributes+"] ---- - + ---- The default {productname} editor will load at this location if the page is opened in a web browser. diff --git a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc index 1640dc3354..44bfe5e369 100644 --- a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc @@ -3,6 +3,7 @@ * xref:use-a-cloud-version-of-the-tinymce-web-component-integration[Use a cloud version of the {productname} Web Component integration] * xref:installing-the-tinymce-web-component-integration[Installing the {productname} Web Component integration] * xref:loading-tinymce[Loading {productname}] +* xref:licensekey[Setting the license key] * xref:configuring-the-editor[Configuring the editor] ** xref:setting-the-initial-content[Setting the initial content] ** xref:loading-plugins[Loading plugins] @@ -75,6 +76,41 @@ To use {productname} Web Component with a self-hosted copy of {productname}, ens To use {productname} from the {cloudname}, add the `+api-key+` attribute to the `+tinymce-editor+` element with an API from link:{accountpageurl}/[{accountpage}]. +[[licensekey]] +== Setting the license key + +When self-hosting {productname}, specify a license key using the `+license-key+` attribute on the `+tinymce-editor+` element. License keys must start with the "T8LK:" prefix and use client-side JWT validation. Do not use both an API key and a license key - use API key for cloud deployments, and license key for self-hosted deployments. For more information, see: xref:license-key.adoc[License Key]. + +*Type:* `+String+` + +*Default value:* `+undefined+` + +*Possible values:* +* `undefined` - Use this when loading from {cloudname} with an API key +* `"gpl"` - For open source projects using GPL license +* `"T8LK:your-license-key"` - For commercial {productname} installations + +=== Example: Commercial license +[source,html] +---- + +---- + +=== Example: Open source GPL license +[source,html] +---- + +---- + +[IMPORTANT] +==== +* The `+license-key+` attribute is only required when self-hosting {productname} +* License keys starting with "T8LK:" use client-side JWT validation +* Do not use both an API key and a license key - use API key for cloud deployments, and license key for self-hosted deployments +==== + +For more information on licensing, see: xref:license-key.adoc[License Key]. + [[configuring-the-editor]] == Configuring the editor diff --git a/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc b/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc index a26d8d2c51..352504d7fc 100644 --- a/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc @@ -48,6 +48,8 @@ export function render () { toolbar: 'bold italic | bullist numlist | link emoticons', skin_url: 'default', content_css: 'default', + // Add your commercial license key for self-hosted deployments + license_key: 'T8LK:your-license-key' // Your license key from the Tiny Cloud Account }); }; ---- \ No newline at end of file From 5f7c71cf3bab6119120b94f1d687f4f8e6016e6f Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Jun 2025 12:00:51 +1000 Subject: [PATCH 02/26] Enhance license key documentation for TinyMCE 8, clarifying T8LK prefix usage and client-side JWT validation across various integration references and examples. --- modules/ROOT/pages/license-key.adoc | 253 +++++++++++------- .../integrations/angular-tech-ref.adoc | 2 +- .../integrations/blazor-tech-ref.adoc | 3 +- .../partials/integrations/react-tech-ref.adoc | 2 +- .../integrations/svelte-tech-ref.adoc | 2 +- .../partials/integrations/vue-tech-ref.adoc | 2 +- .../integrations/webcomponent-tech-ref.adoc | 4 +- .../partials/misc/setting-the-license.adoc | 25 +- 8 files changed, 189 insertions(+), 104 deletions(-) diff --git a/modules/ROOT/pages/license-key.adoc b/modules/ROOT/pages/license-key.adoc index 21fdbc2075..a4332d6b9f 100644 --- a/modules/ROOT/pages/license-key.adoc +++ b/modules/ROOT/pages/license-key.adoc @@ -4,85 +4,115 @@ :keywords: {productname}, cloud, script, textarea, apiKey, faq, license key, frequently asked questions, == Overview - -{productname} 8 introduces an enhanced license key system that provides improved subscription access control and streamlined renewal processes. This system includes both date-based and version-locked keys, supporting various deployment scenarios including cloud, self-hosted, and hybrid configurations. +{productname} 8 uses an enhanced license key system that provides improved subscription access control and streamlined renewal processes. This system includes both **date-based** and **version-locked** keys, supporting various deployment scenarios including cloud, self-hosted, hybrid and offline (air-gapped) environment configurations. [IMPORTANT] ==== -If you are using {productname} 7, it is licensed under the GNU General Public License Version 2 or later. A configuration option called 'license_key' requires developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license. +{productname} is licensed under the GNU General Public License Version 2 or later. A configuration option called 'license_key' introduced in v7 required developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license. + +For {productname} 8, self-hosted, hybrid, and offline deployments require a valid license key with the `+"T8LK:"+` prefix such as `+license_key: "T8LK:your-license-key"+`. This prefix indicates that the key is for version 8 and provides enhanced validation and management features. If you are using {productname} in a self-hosted environment, a console log warning message will display if the license key config option is missing or invalid. This message aims to ensure compliance with licensing requirements and provide transparency during the evaluation period. This message will not be shown when loading {productname} from {cloudname}, as it is already under a commercial license. - -For {productname} 8, license keys use the `+"T8LK:"+` prefix and provide enhanced validation and management features. These keys support both online and offline validation modes. ==== include::partial$misc/setting-the-license.adoc[] == License Types and Deployment Options -=== Date-based Keys (Standard) - -The standard license key type in {productname} 8 is date-based, meaning: - -* The key has a soft expiration date that matches your subscription end date. -* After the soft expiration, the editor enters a grace period in `read-only` mode. -* After the grace period expires, the editor becomes completely disabled. -* Premium plugins are disabled at the soft expiration date. -* In-editor messaging will notify users about approaching expiration. - -=== Version-locked Keys (Alternative) - -For customers who cannot use date-based keys, version-locked keys are available: - -* The key is locked to specific {productname} versions. -* No expiration date - the key continues working for allowed versions. -* Cannot be used with versions released after your subscription ends. -* Must contact account manager to get access to newer versions. -* Suitable for air-gapped environments or strict deployment policies. - -=== Deployment Patterns - -==== Cloud-only - -* Use API key. -* Premium features via subscription. -* CDN-hosted resources. -* Automatic updates. - -==== Self-hosted - -* Use license key with `T8LK` prefix. -* Local premium plugins. -* Manual updates. -* Full control over assets. - -==== Hybrid - -* Both API key and license key. -* Mix of cloud and local features. -* Flexible deployment options. -* Fallback capabilities. - -=== Offline Mode - -For air-gapped environments or offline usage: - -* Supports environments without internet connectivity -* Compatible with strict network security policies -* Maintains license compliance through client-side JWT validation -* Enforces version and domain restrictions without server connection -* Works with standard security controls and firewalls -* Requires version-locked keys for maximum compatibility - -[NOTE] -==== -For air-gapped environments: -* Use version-locked keys instead of date-based keys -* Premium plugins must be downloaded and bundled locally -* Updates require manual deployment of new versions -==== +=== License Key Types + +[cols="1,2,2", options="header"] +|=== +| **Type** | **Key Features** | **Best For** + +| Date-based Keys (Standard) +a| +* Time-based subscription: + ** Automatic version updates + ** 30-day grace period + ** Premium plugin access +* Flexible usage: + ** Works with cloud features + ** Compatible with hybrid setups +a| +* Common scenarios: + ** Most deployments + ** Development teams + ** Cloud integrations + +| Version-locked Keys +a| +* Fixed version access: + ** Specific version only + ** No expiration date + ** Domain restrictions +* Security focused: + ** Offline validation + ** No cloud dependencies +a| +* Security-focused scenarios: + ** Air-gapped systems + ** Regulated industries + ** Government deployments + ** Security-critical systems +|=== + +=== Deployment Types + +[cols="1,2,2", options="header"] +|=== +| **Type** | **Key Configuration** | **Capabilities** + +| Cloud-only +a| +* API key required for: + ** Cloud services access + ** Premium plugin access + ** Automatic updates +a| +* Fully managed service: + ** No local deployment needed + ** Automatic updates and CDN delivery + ** Cloud storage features + ** Real-time collaboration + +| Self-hosted +a| +* License key required with: + ** `T8LK` prefix + ** Domain validation +a| +* Complete local control: + ** Self-hosted premium plugins + ** Custom deployment options + ** No cloud dependencies + +| Hybrid +a| +* Both keys required: + ** API key for cloud features + ** License key for local fallback +* Optional failover configuration +a| +* Best of both worlds: + ** Cloud features when online + ** Local fallback when needed + ** High availability options + +| Offline/Air-gapped +a| +* Version-locked key required: + ** `T8LK` prefix + ** Domain/environment locks + ** No internet connectivity needed +a| +* Completely offline operation: + ** Local resource bundling + ** Network isolation + ** Air-gap compliance +|=== == Configuration Examples @@ -135,19 +165,29 @@ tinymce.init({ "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", "help", "image", "link", "lists", - // Premium plugins - available both via cloud and local fallback + // Premium plugins - ensure these are available both via cloud and locally + // Local versions should be downloaded and included in your bundle "powerpaste", "tinycomments", "tinydrive" ], toolbar: "undo redo | styles | bold italic | alignleft aligncenter alignright | bullist numlist | link image", + // Cloud configuration with local fallback api_key: "your-api-key", // For cloud features license_key: "T8LK:your-license", // For local fallback - // Optional: Configure failover behavior + + // Failover configuration example serviceLoadFailbackTime: 5000, // Wait 5s before falling back to local + + // Custom handler for image uploads with cloud/local failover images_upload_handler: function (blobInfo, progress) { - // Custom handler that tries cloud first, falls back to local return new Promise((resolve, reject) => { - // Implementation of cloud/local failover logic + // Example implementation: + // 1. Try uploading to cloud service first + // 2. If cloud upload fails or times out, fall back to local storage + // 3. Handle progress updates for both scenarios + // 4. Return the URL of the uploaded image + + // For detailed implementation, see the Image Upload documentation }); } }); @@ -156,6 +196,7 @@ tinymce.init({ [NOTE] ==== For hybrid deployments: + * Both `api_key` and `license_key` are used together * Configure appropriate timeouts for service failover * Consider implementing custom handlers for seamless fallback @@ -188,32 +229,44 @@ tinymce.init({ [NOTE] ==== For offline deployments: + * All assets must be available locally * Content delivery URLs should point to local resources * Premium plugins must be downloaded and included in your bundle +* JWT validation is built into the {productname} core and works completely offline: + ** No internet connectivity required for license validation + ** No server communication or "phone home" checks + ** All validation is performed securely within the browser ==== == License States -=== Active - -* Full editor and premium plugin functionality. -* Regular version upgrades available (date-based keys). -* No restrictions on features. - -=== Grace Period (Date-based keys only) - -// TBA: Validate this date is correct -* Occurs 30 days before subscription end. -* All features remain functional. -* In-editor notifications about approaching expiration. -* Time to contact Tiny for renewal. - -=== Expired - -* Date-based keys: Editor disabled after grace period. -* Version-locked keys: Cannot use new versions. -* Must obtain new license key after renewal. +[cols="1,2,1", options="header"] +|=== +| State | Features & Behavior | Applicable To + +| Active +a| +* Full editor and premium plugin functionality +* Regular version upgrades available +* No restrictions on features +| All license types + +| Grace Period +a| +* All features remain functional +* In-editor notifications about approaching expiration +* Occurs 30 days before subscription end +* Time to contact Tiny for renewal +| Date-based keys only + +| Expired +a| +* Date-based keys: Editor disabled +* Version-locked keys: Cannot use new versions +* Must obtain new license key after renewal +| All license types +|=== == FAQ @@ -225,21 +278,26 @@ The GPLv2+ license was chosen to provide the best compatibility with existing GP === What is the difference between a license key and the API key? -The **API key** is used when loading {productname} from the {cloudname} and undergoes server-side validation. The **license key** (starting with T8LK: in version 8) is used to declare the license terms when self-hosting {productname} and uses client-side JWT validation in the browser. +The **API key** is used when loading {productname} from the {cloudname} and undergoes server-side validation. The **license key** (starting with `T8LK:` in version 8) is used to declare the license terms when self-hosting {productname}. The license key contains a JSON Web Token (JWT) that enables secure client-side validation performed entirely within the browser, requiring no server communication or "phone home" checks. === Who needs to get a license key? Anyone who intends to self-host {productname} will need to: + * For version 7: Provide a valid commercial license key or declare their intention to use {productname} under the GPLv2+ license * For version 8: Obtain a T8LK-prefixed commercial license key or use GPL mode === How will I know if this change affects me? -If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning message. These warnings are designed to ensure compliance and provide transparency during evaluation periods. If you have actively suppressed or hidden these messages, please remove those overrides to maintain proper license validation. If no notification appears, you are not affected. +If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning message. These warnings are designed to ensure compliance and provide transparency during evaluation periods. + +[TIP] +If you have actively suppressed or hidden these messages, please remove those overrides to maintain proper license validation. If no notification appears, you are not affected. === Should I be using both an API key and a license key? For standard deployments, use only one of the following: + * *API key* - For cloud deployments ** Server-side validation ** Automatic updates and CDN delivery @@ -247,17 +305,20 @@ For standard deployments, use only one of the following: ** No client-side validation required * *License key* - For self-hosted deployments -** Client-side JWT validation +** Client-side JWT validation is automatically performed ** T8LK prefix required for version 8 ** Supports air-gapped environments ** Local premium plugin validation *Hybrid Deployment Cases:* + * Using both keys together requires specific configuration: -** Set up cloud services with API key -** Configure local fallback with license key -** Enable high availability features -** Access both cloud and local premium plugins +** Set up cloud services with API key for primary cloud access +** Configure local fallback with license key for offline operation +** Configure service failover timeouts (e.g., `serviceLoadFailbackTime`) +** Ensure premium plugins are available both via cloud and locally +** Implement custom handlers for seamless cloud/local failover +** Test both online and offline scenarios thoroughly [IMPORTANT] ==== diff --git a/modules/ROOT/partials/integrations/angular-tech-ref.adoc b/modules/ROOT/partials/integrations/angular-tech-ref.adoc index e5e321933a..9707bf8296 100644 --- a/modules/ROOT/partials/integrations/angular-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/angular-tech-ref.adoc @@ -132,7 +132,7 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. +Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` diff --git a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc index e7a3dc90e3..b8a5a04c8d 100644 --- a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc @@ -190,7 +190,7 @@ In your component: Specifies the {productname} license key. Required for self-hosted deployments of {productname}. This property is not required for deployments using the {cloudname}. -License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. +License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` @@ -206,6 +206,7 @@ License keys must start with the "T8LK:" prefix and use client-side JWT validati LicenseKey="T8LK:your-license-key" /> ---- + Use this example when you have a commercial license for TinyMCE 8 or newer. The T8LK prefix is required. ==== Example: Open source GPL license diff --git a/modules/ROOT/partials/integrations/react-tech-ref.adoc b/modules/ROOT/partials/integrations/react-tech-ref.adoc index b8deffea34..d289325ea5 100644 --- a/modules/ROOT/partials/integrations/react-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/react-tech-ref.adoc @@ -189,7 +189,7 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. +Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` diff --git a/modules/ROOT/partials/integrations/svelte-tech-ref.adoc b/modules/ROOT/partials/integrations/svelte-tech-ref.adoc index 18cec6026f..939bdd86ac 100644 --- a/modules/ROOT/partials/integrations/svelte-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/svelte-tech-ref.adoc @@ -58,7 +58,7 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this option when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. +Use this option when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` diff --git a/modules/ROOT/partials/integrations/vue-tech-ref.adoc b/modules/ROOT/partials/integrations/vue-tech-ref.adoc index 2c79a389ae..3209b83204 100644 --- a/modules/ROOT/partials/integrations/vue-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/vue-tech-ref.adoc @@ -139,7 +139,7 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation. For more information, see: xref:license-key.adoc[License Key]. +Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` diff --git a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc index 44bfe5e369..a55fffb2f6 100644 --- a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc @@ -79,7 +79,7 @@ To use {productname} from the {cloudname}, add the `+api-key+` attribute to the [[licensekey]] == Setting the license key -When self-hosting {productname}, specify a license key using the `+license-key+` attribute on the `+tinymce-editor+` element. License keys must start with the "T8LK:" prefix and use client-side JWT validation. Do not use both an API key and a license key - use API key for cloud deployments, and license key for self-hosted deployments. For more information, see: xref:license-key.adoc[License Key]. +When self-hosting {productname}, specify a license key using the `+license-key+` attribute on the `+tinymce-editor+` element. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. Do not use both an API key and a license key - use API key for cloud deployments, and license key for self-hosted deployments. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` @@ -105,7 +105,7 @@ When self-hosting {productname}, specify a license key using the `+license-key+` [IMPORTANT] ==== * The `+license-key+` attribute is only required when self-hosting {productname} -* License keys starting with "T8LK:" use client-side JWT validation +* License keys starting with "T8LK:" use client-side JWT validation that runs entirely in the browser * Do not use both an API key and a license key - use API key for cloud deployments, and license key for self-hosted deployments ==== diff --git a/modules/ROOT/partials/misc/setting-the-license.adoc b/modules/ROOT/partials/misc/setting-the-license.adoc index 57f6e78eb5..0e248fb80a 100644 --- a/modules/ROOT/partials/misc/setting-the-license.adoc +++ b/modules/ROOT/partials/misc/setting-the-license.adoc @@ -24,6 +24,29 @@ If the developer intends to self-host {productname} under a commercial license, ---- tinymce.init({ selector: 'textarea', // change this value according to your HTML - license_key: '' + license_key: 'T8LK:your-license-key' }); ---- + +=== Use {productname} under GPL with Premium Features + +For open source projects that need to use {productname} under the GPL license while also accessing premium features, use the combined GPL and commercial license format: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + license_key: 'GPL+T8LK:your-license-key' +}); +---- + +[IMPORTANT] +==== +* The GPL portion acknowledges open source usage requirements +* The T8LK portion enables access to premium plugins and features included in your subscription +* Without the T8LK portion, premium plugins would not be available with just the GPL license +* You can find your commercial license key in the link:https://www.tiny.cloud/auth/login/[account portal] +* This format is specifically for open source projects that need premium features while maintaining GPL compliance +==== + +To purchase a commercial license, see available options on the link:{pricingpage}/[pricing page]. From 2864ff015929db9a69288576a6b882acfc8fc2ea Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Jun 2025 13:10:02 +1000 Subject: [PATCH 03/26] DOC-3226: Update license key format across documentation and examples to include T8LK prefix for TinyMCE 8 compatibility and included release notes entry. --- modules/ROOT/pages/8.0-release-notes.adoc | 32 ++++++++++++++++--- .../install/basic-quickstart-base.adoc | 2 +- .../integrations/jquery-quick-start.adoc | 4 +-- .../partials/integrations/react-bundling.adoc | 2 +- .../integrations/react-quick-start.adoc | 8 ++--- .../integrations/vue-quick-start.adoc | 4 +-- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/modules/ROOT/pages/8.0-release-notes.adoc b/modules/ROOT/pages/8.0-release-notes.adoc index 7c62f25b54..0f1001f12f 100644 --- a/modules/ROOT/pages/8.0-release-notes.adoc +++ b/modules/ROOT/pages/8.0-release-notes.adoc @@ -1,4 +1,3 @@ - = {productname} {release-version} :release-version: 8.0.0 :navtitle: {productname} {release-version} @@ -27,8 +26,10 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[] * xref:deprecated[Deprecated] * xref:known-issues[Known issues] -[NOTE] -For additional details on {productname} {release-version} breaking changes when considering upgrading, see xref:migration-from-7x.adoc[Migrating from {productname} 7 to {productname} {release-version}]. +[IMPORTANT] +==== +This release includes breaking changes to the license key system. All commercial self-hosted deployments must update their license keys to use the new `T8LK:` prefix format. For details on this and other breaking changes when considering upgrading, see xref:migration-from-7x.adoc[Migrating from {productname} 7 to {productname} {release-version}]. +==== [[new-premium-plugin]] New Premium plugin @@ -119,7 +120,30 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[changes]] == Changes -{productname} {release-version} also includes the following change: +{productname} {release-version} includes the following changes: + +=== Enhanced license key system with T8LK prefix + +The license key system in {productname} 8 has been enhanced to provide improved subscription access control and streamlined renewal processes. All commercial license keys for self-hosted deployments now require the `T8LK:` prefix to indicate version 8 compatibility. + +Key changes include: + +* All commercial license keys must start with `"T8LK:"` prefix +* Enhanced JWT-based validation that runs entirely in the browser +* No server communication or "phone home" checks required +* Support for both date-based and version-locked keys +* Streamlined hybrid deployment configuration +* Improved support for air-gapped and offline environments + +[IMPORTANT] +==== +* GPL usage still requires setting `license_key: 'gpl'` (case insensitive) +* For open source projects using premium features, use the combined format: `license_key: 'GPL+T8LK:your-license-key'` +* The license key is not required when using {cloudname} with an API key +==== + +For more information on the new license key system, see: xref:license-key.adoc[License Key]. + // === // #TINY-vwxyz1 diff --git a/modules/ROOT/partials/install/basic-quickstart-base.adoc b/modules/ROOT/partials/install/basic-quickstart-base.adoc index 4138ee9009..58664b9e28 100644 --- a/modules/ROOT/partials/install/basic-quickstart-base.adoc +++ b/modules/ROOT/partials/install/basic-quickstart-base.adoc @@ -182,7 +182,7 @@ ifeval::["{productSource}" != "cloud"] diff --git a/modules/ROOT/partials/integrations/jquery-quick-start.adoc b/modules/ROOT/partials/integrations/jquery-quick-start.adoc index 9880f39997..7db784230a 100644 --- a/modules/ROOT/partials/integrations/jquery-quick-start.adoc +++ b/modules/ROOT/partials/integrations/jquery-quick-start.adoc @@ -119,7 +119,7 @@ ifeval::["{productSource}" == "package-manager"] @@ -149,7 +149,7 @@ ifeval::["{productSource}" == "package-manager"] diff --git a/modules/ROOT/partials/integrations/angular-tech-ref.adoc b/modules/ROOT/partials/integrations/angular-tech-ref.adoc index 9707bf8296..3b7e3f9c1c 100644 --- a/modules/ROOT/partials/integrations/angular-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/angular-tech-ref.adoc @@ -132,21 +132,21 @@ include::partial$misc/get-an-api-key.adoc[] {cloudname} License key. -Use this when self-hosting {productname} instead of loading from {cloudname}. License keys must start with the "T8LK:" prefix and use client-side JWT validation that runs entirely in the browser, requiring no server communication or "phone home" checks. For more information, see: xref:license-key.adoc[License Key]. +Use this when self-hosting {productname} instead of loading from {cloudname}. For more information, see: xref:license-key.adoc[License Key]. *Type:* `+String+` *Default value:* `+undefined+` -*Possible values:* +*Possible values:* * `undefined` - Use this when loading from {cloudname} with an API key * `'gpl'` - For open source projects using GPL license -* `'T8LK:your-license-key'` - For commercial {productname} installations +* `'T8LK:...'` - For commercial {productname} installations ==== Example: Commercial license [source,html] ---- - + ---- ==== Example: using `+licenseKey+` with GPL diff --git a/modules/ROOT/partials/integrations/blazor-postinstall.adoc b/modules/ROOT/partials/integrations/blazor-postinstall.adoc index 48ce55e001..dfc83b2bee 100644 --- a/modules/ROOT/partials/integrations/blazor-postinstall.adoc +++ b/modules/ROOT/partials/integrations/blazor-postinstall.adoc @@ -1,4 +1,4 @@ -. Verify the installation by checking the `+ItemGroup+` references in the project file. For example, if the project is named _BlazorApp_, the relevant file would be `+BlazorApp.csproj+` with the dependency referenced as follows: +. Verify the installation by checking the `+ItemGroup+` references in the project file. For example, if the project is named _BlazorApp_, the relevant file would be `+BlazorApp.csproj+` with the dependency referenced as follows: + [source,xml] ---- @@ -16,9 +16,9 @@ + [NOTE] ==== -The location of the script depends on the type of Blazor app, including Blazor Server and Blazor WebAssembly (WASM) which are not covered in this guide. +The location of the script depends on the type of Blazor app, including Blazor Server and Blazor WebAssembly (WASM) which are not covered in this guide. -* If using Blazor Server, add the script in `+Pages/_Host.cshtml+`, for example: +* If using Blazor Server, add the script in `+Pages/_Host.cshtml+`, for example: + [source,html] ---- @@ -35,8 +35,8 @@ The location of the script depends on the type of Blazor app, including Blazor S ==== + -. Add the `+Editor+` component to a page by either: -* Using the `+using+` directive: +. Add the `+Editor+` component to a page by either: +* Using the `+using+` directive: + [source,cs] ---- @@ -44,7 +44,7 @@ The location of the script depends on the type of Blazor app, including Blazor S ---- + -For example: +For example: + _File:_ `+Pages/Index.razor+` + @@ -58,7 +58,7 @@ _File:_ `+Pages/Index.razor+`

Welcome to your new app.

---- -* Using the component with its namespace: +* Using the component with its namespace: + [source,cs] ---- @@ -78,10 +78,10 @@ _File:_ `+Pages/Index.razor+`

Hello, world!

Welcome to your new app.

----- +---- + [IMPORTANT] -In a Blazor Web App, different render modes determine how components are rendered and how interactivity is handled. To enable JavaScript interactivity, ensure that `+@rendermode InteractiveServer+` is specified in a page component. +In a Blazor Web App, different render modes determine how components are rendered and how interactivity is handled. To enable JavaScript interactivity, ensure that `+@rendermode InteractiveServer+` is specified in a page component. + ifeval::["{productSource}" == "cloud"] @@ -91,7 +91,7 @@ ifeval::["{productSource}" == "cloud"] [source,cs] ---- ----- +---- + endif::[] @@ -101,8 +101,9 @@ ifeval::["{productSource}" != "cloud"] + [source,cs] ---- - ----- +// gpl for open source, T8LK:... for commercial + +---- + . To load {productname} from the self-hosted package instead of the {cloudname}, configure the `+ScriptSrc+` property: diff --git a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc index 9b4f2ff263..477488a070 100644 --- a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc @@ -19,7 +19,7 @@ The `+TinyMCE.Blazor+` `+Editor+` component accepts the following properties: JsConfSrc="path_to_jsObj" Conf="@yourConf" ApiKey="no-api-key" - LicenseKey="T8LK:your-license-key" + LicenseKey="gpl" // gpl for open source, T8LK:... for commercial ScriptSrc="/path/to/tinymce.min.js" ClassName="tinymce-wrapper" /> @@ -194,16 +194,16 @@ License keys must start with the "T8LK:" prefix and use client-side JWT validati *Type:* `+String+` -*Possible values:* +*Possible values:* * `null` - Use this when loading from {cloudname} with an API key * `"gpl"` - For open source projects using GPL license -* `"T8LK:your-license-key"` - For commercial {productname} installations +* `"T8LK:..."` - For commercial {productname} installations ==== Example: Commercial license (TinyMCE 8+) [source,cs] ---- ---- diff --git a/modules/ROOT/partials/integrations/jquery-quick-start.adoc b/modules/ROOT/partials/integrations/jquery-quick-start.adoc index 7db784230a..28466154c9 100644 --- a/modules/ROOT/partials/integrations/jquery-quick-start.adoc +++ b/modules/ROOT/partials/integrations/jquery-quick-start.adoc @@ -119,7 +119,7 @@ ifeval::["{productSource}" == "package-manager"] @@ -149,7 +149,7 @@ ifeval::["{productSource}" == "package-manager"] + ---- The default {productname} editor will load at this location if the page is opened in a web browser. From 041dad5ec739112d035a1ecbb7873dec8c1dfd95 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 16 Jul 2025 07:53:00 +1000 Subject: [PATCH 12/26] Update modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc Co-authored-by: tiny-ben-tran --- modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc index 22e83dc081..ab71cd6d08 100644 --- a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc @@ -95,7 +95,7 @@ include::partial$integrations/common/license-key-property.adoc[] [IMPORTANT] ==== -* The `+license-key+` attribute is only required when self-hosting {productname} +* The license key is only required when self-hosting {productname} * License keys starting with "T8LK:" use client-side validation. * Do not use both an API key and a license key - use API key for cloud deployments, and license key for self-hosted deployments ==== From 29c1a20b4ef45fb84d02ce698795ef2f23184b66 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 16 Jul 2025 07:53:14 +1000 Subject: [PATCH 13/26] Update modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc Co-authored-by: tiny-ben-tran --- .../ROOT/partials/integrations/webcomponent-tech-ref.adoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc index ab71cd6d08..4c31588f23 100644 --- a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc @@ -90,7 +90,12 @@ include::partial$integrations/common/license-key-property.adoc[] === Example: Open source GPL license [source,html] ---- - + + ---- [IMPORTANT] From ad0860dace302d463cdcb261eec6f5415c2a4999 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 16 Jul 2025 07:53:30 +1000 Subject: [PATCH 14/26] Update modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc Co-authored-by: tiny-ben-tran --- .../ROOT/partials/integrations/webcomponent-tech-ref.adoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc index 4c31588f23..6a421869a9 100644 --- a/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/webcomponent-tech-ref.adoc @@ -84,7 +84,12 @@ include::partial$integrations/common/license-key-property.adoc[] === Example: Commercial license [source,html] ---- - + + ---- === Example: Open source GPL license From 44a22915ed6ef8a6e044c88b1466fc4a8711aaa1 Mon Sep 17 00:00:00 2001 From: ltrouton Date: Wed, 16 Jul 2025 17:20:25 +1000 Subject: [PATCH 15/26] DOC-3226: Change readonly to disabled. Add new messages. --- modules/ROOT/pages/license-key.adoc | 47 +++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/modules/ROOT/pages/license-key.adoc b/modules/ROOT/pages/license-key.adoc index 23911e820d..57c95f6292 100644 --- a/modules/ROOT/pages/license-key.adoc +++ b/modules/ROOT/pages/license-key.adoc @@ -10,7 +10,7 @@ ==== {productname} is licensed under the GNU General Public License Version 2 or later. A configuration option called `+'license_key'+` introduced in {productname} 7 requires developers to make a conscious decision to use {productname} with the GPLv2+ license or with a commercial license. -When using {productname} 8 in a self-hosted environment, a license key must be provided and it must be valid. Otherwise, the editor will be set to readonly. A license key is not required when loading {productname} from {cloudname}, as it is already under a commercial license. +When using {productname} 8 in a self-hosted environment, a license key must be provided and it must be valid. Otherwise, the editor will be disabled. A license key is not required when loading {productname} from {cloudname}, as it is already under a commercial license. In addition, when using {productname} 8 in a self-hosted environment for commercial use, a commercial license key manager addon is required in order for the editor to operate. ==== @@ -134,12 +134,12 @@ a| | Expired a| -* Editor is set to readonly +* Editor is disabled * Must obtain a new license key to continue using {productname} | Time-based keys only | Invalid a| -* Editor is set to readonly +* Editor is disabled * Editor notifications notifying that the license key is not valid | All license types |=== @@ -162,7 +162,7 @@ Anyone who intends to self-host {productname} will need to obtain a T8LK-prefixe === How will I know if this change affects me? -If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning message and/or editor notification and set the editor to readonly. These warnings and restrictions are designed to ensure compliance and provide transparency during evaluation periods. +If {productname} detects that the `license_key` configuration is missing or invalid, it will display a console log warning message and/or editor notification and set the editor to disabled. These warnings and restrictions are designed to ensure compliance and provide transparency during evaluation periods. [TIP] If you have actively suppressed or hidden these messages, please remove those overrides to maintain proper license validation. If no notification appears, you are not affected. @@ -184,7 +184,7 @@ If using a cloud or hybrid deployment configuration, the license key may be chec === What happens if I don't provide a valid license key? -In addition to the editor being readonly, a console log warning message and/or editor notification will persist until a valid license key or 'gpl' is provided. +In addition to the editor being disabled, a console log warning message and/or editor notification will persist until a valid license key or 'gpl' is provided. === Why is a license key required? @@ -248,14 +248,27 @@ a| * Verify that the license key is correctly copied from your link:https://www. * Ensure there are no extra spaces or characters in the key * Check if the key matches your deployment type (Cloud vs Self-hosted) -| xref:hard-expired[Hard expired] +| xref:load-error[Load error (Cloud)] +| The editor is disabled because the TinyMCE API key could not be validated. The TinyMCE Commercial License Key Manager plugin is required for the provided API key to be validated but could not be loaded. +| The editor is disabled because the TinyMCE API key could not be validated. +a| * Verify that your API key is valid +* Check if your subscription is active +* Visit the link:https://support.tiny.cloud[Support Portal] if the issue persists + +| xref:load-error[Load error (Self-Hosted)] +| The editor is disabled because the license key provided is invalid. The TinyMCE Commercial License Key Manager plugin is required for the provided license key to be validated but could not be loaded. +| The editor is disabled because the TinyMCE license key could not be validated. +a| * Check if the license key matches your deployment type: GPL or commercial, Cloud or Self-hosted +* Ensure the license key manager is set up correctly: <> + +| xref:expired[Expired] | The editor is disabled because the license key has expired and is no longer valid | The editor is disabled because the license key has expired and is no longer valid. a| * Visit link:https://www.tiny.cloud/my-account[Tiny Cloud Account] to obtain a new license key * Update your configuration with the new key * Visit the link:https://support.tiny.cloud[Support Portal] if you believe your license should still be valid -| xref:soft-expired[Soft expired] +| xref:grace-period[Grace period] | The editor will be disabled in the near future because the license key has expired | The editor will be disabled in the near future because the license key has expired. a| * Visit link:https://www.tiny.cloud/my-account[Tiny Cloud Account] to obtain a new license key @@ -270,7 +283,7 @@ a| * Verify that your {productname} version matches the license key version * For version-locked keys, ensure you're using the correct patch version | xref:no-license-key[No license key] -| The editor is disabled because a {productname} license key has not been provided. Provide a valid license key or add license_key: 'gpl' to the init config to agree to the open source license terms. +| The editor is disabled because a {productname} license key has not been provided. Make sure to provide a valid license key or add license_key: 'gpl' to the init config to agree to the open source license terms. | The editor is disabled because a {productname} license key has not been provided. a| * Add the `license_key` parameter to your {productname} configuration * For GPL usage, set `license_key: 'gpl'` @@ -285,7 +298,7 @@ a| * Verify that your license includes access to the premium plugin | xref:online-api-key-error-fallback[Online API Key Error (5xx - Fallback)] | The API key could not be validated by the API key validation server [type: +${errorType}${statusMsg}+]. Attempting fallback to provided license key. -| The editor is disabled because the API key could not be validated by the API key validation server. +| a| * Check your internet connection * Verify your firewall settings allow access to the validation server * The editor will attempt to use the provided license key as fallback @@ -304,12 +317,20 @@ a| * Verify that your API key is valid ==== Invalid license key (General) The provided license key is not recognized as a valid {productname} license key. This can occur if the key is malformed, expired, or doesn't match your deployment type. For self-hosted installations, ensure you're using a valid T8LK-prefixed license key. Visit the link:https://www.tiny.cloud/my-account[Tiny Cloud Account] to verify your license key. -[[hard-expired]] -==== Hard expired +[[load-error-cloud]] +==== Load error (Cloud) +The TinyMCE Commercial License Key Manager plugin is automatically loaded from the Tiny Cloud CDN for cloud deployments. If it cannot be loaded, the editor will be disabled. Review your subscription details in your link:https://www.tiny.cloud/my-account[Tiny Cloud Account] to check its status. + +[[load-error-selfhosted]] +==== Load error (Self-hosted) +For self-hosted installations, the TinyMCE Commercial License Key Manager plugin is required for commercial license keys otherwise the editor will be disabled. If it cannot be loaded, see the <> section for implementation details + +[[expired]] +==== Expired The license key has reached its expiration date and is no longer valid for use. The editor will be disabled until a new valid license key is provided. For time-based keys, refer to the <> section. To renew your license, visit link:https://www.tiny.cloud/pricing[Tiny Cloud Pricing] or contact your account manager. -[[soft-expired]] -==== Soft expired +[[grace-period]] +==== Grace period The license key has reached its initial expiration date but is still within the grace period. The editor will continue to function but will be disabled when the grace period ends. See the <> section for more information about grace periods. Contact your account manager or visit link:https://www.tiny.cloud/my-account[Tiny Cloud Account] to renew your license before the grace period expires. [[invalid-editor-version]] From 320d8f367f0f4f1d53ef2814b286ca580ab54167 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 17 Jul 2025 15:40:14 +1000 Subject: [PATCH 16/26] Update modules/ROOT/partials/integrations/common/license-key-property.adoc --- .../ROOT/partials/integrations/common/license-key-property.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/partials/integrations/common/license-key-property.adoc b/modules/ROOT/partials/integrations/common/license-key-property.adoc index 53817de0ee..815629ec26 100644 --- a/modules/ROOT/partials/integrations/common/license-key-property.adoc +++ b/modules/ROOT/partials/integrations/common/license-key-property.adoc @@ -8,6 +8,7 @@ Specifies the {productname} license key. Required for self-hosted deployments of * `undefined` - Use this when loading from {cloudname} with an API key * `'gpl'` - For open source projects using GPL license * `'T8LK:...'` - For commercial {productname} installations (must use this prefix for version 8+) +* `'GPL+T8LK:'` - For open source projects that require premium features while maintaining GPL compliance. [NOTE] ==== From de54c18faebfa90a87e73a3c0888647277e5b6da Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 17 Jul 2025 15:40:52 +1000 Subject: [PATCH 17/26] Update modules/ROOT/partials/integrations/vue-quick-start.adoc Co-authored-by: Tim Dettrick --- modules/ROOT/partials/integrations/vue-quick-start.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/partials/integrations/vue-quick-start.adoc b/modules/ROOT/partials/integrations/vue-quick-start.adoc index 0f8982bd66..835a03b602 100644 --- a/modules/ROOT/partials/integrations/vue-quick-start.adoc +++ b/modules/ROOT/partials/integrations/vue-quick-start.adoc @@ -167,7 +167,7 @@ import Editor from '@tinymce/tinymce-vue'