diff --git a/.gitignore b/.gitignore index 4b76e810e9..5d9332a537 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ httpRequests # Daniel doesn't like any of the new format files and my ide keeps creating them .idea +.ideaDataSources ### JetBrains template # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm diff --git a/LICENSE b/LICENSE index 8dada3edaf..d2e332e3e8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,13 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright (c) 2018-2023, FusionAuth - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - 1. Definitions. + http://www.apache.org/licenses/LICENSE-2.0 - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/astro/astro.config.mjs b/astro/astro.config.mjs index 9744b22491..48a02d4203 100644 --- a/astro/astro.config.mjs +++ b/astro/astro.config.mjs @@ -1,5 +1,7 @@ import {defineConfig} from 'astro/config'; -import compress from "astro-compress"; +// fixme re-enable this when astro gets their repo fixed +//import compress from "astro-compress"; +import compress from "@otterlord/astro-compress"; import mdx from "@astrojs/mdx"; import sitemap from "@astrojs/sitemap"; import tailwind from "@astrojs/tailwind"; diff --git a/astro/package-lock.json b/astro/package-lock.json index b3ac242685..d4aaf8f95b 100644 --- a/astro/package-lock.json +++ b/astro/package-lock.json @@ -13,9 +13,9 @@ "@astrojs/tailwind": "^3.0.1", "@docsearch/js": "^3.3.3", "@docsearch/react": "^3.3.3", + "@otterlord/astro-compress": "^1.1.48", "@tailwindcss/typography": "^0.5.9", "astro": "^2.0.15", - "astro-compress": "^1.1.35", "astro-index-pages": "src/integrations/astro-index-pages", "mermaid": "^9.1.6", "pagefind": "^0.12.0", @@ -1127,9 +1127,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -1245,6 +1245,146 @@ "node": ">= 8" } }, + "node_modules/@otterlord/astro-compress": { + "version": "1.1.48", + "resolved": "https://registry.npmjs.org/@otterlord/astro-compress/-/astro-compress-1.1.48.tgz", + "integrity": "sha512-1AUSUMk0WMSMOg/qSmJ7K/0xUsl4hYrAlmcpxzunVFen2r6QmvQDE+51nrPJljzYcXPil+aFrzGe+jfWVChz6A==", + "dependencies": { + "@types/csso": "5.0.0", + "@types/html-minifier-terser": "7.0.0", + "csso": "5.0.5", + "deepmerge-ts": "5.1.0", + "fast-glob": "3.2.12", + "html-minifier-terser": "7.2.0", + "sharp": "0.32.4", + "svgo": "3.0.2", + "terser": "5.19.2" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/deepmerge-ts": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", + "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/@otterlord/astro-compress/node_modules/sharp": { + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.4.tgz", + "integrity": "sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@otterlord/astro-compress/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -1505,14 +1645,6 @@ "optional": true, "peer": true }, - "node_modules/@types/sharp": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.1.tgz", - "integrity": "sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", @@ -1818,22 +1950,6 @@ } } }, - "node_modules/astro-compress": { - "version": "1.1.35", - "resolved": "https://registry.npmjs.org/astro-compress/-/astro-compress-1.1.35.tgz", - "integrity": "sha512-K6BK+iMbejXeUS1eAjoQhRh4geEutFrGkgCkeTAthf1XeRzPrWvtNPA7RjJBXWR8aNJtjryxyW02z3pE+4RNow==", - "dependencies": { - "@types/csso": "5.0.0", - "@types/html-minifier-terser": "7.0.0", - "@types/sharp": "0.31.1", - "csso": "5.0.5", - "files-pipe": "0.0.1", - "html-minifier-terser": "7.1.0", - "sharp": "0.31.3", - "svgo": "3.0.2", - "terser": "5.16.5" - } - }, "node_modules/astro-index-pages": { "resolved": "src/integrations/astro-index-pages", "link": true @@ -1870,6 +1986,11 @@ "postcss": "^8.1.0" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -2259,25 +2380,6 @@ "node": ">=8" } }, - "node_modules/clean-css": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", - "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -2381,14 +2483,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/common-ancestor-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", @@ -3059,9 +3153,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "engines": { "node": ">=8" } @@ -3457,6 +3551,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fast-fifo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz", + "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==" + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -3500,15 +3599,6 @@ "pend": "~1.2.0" } }, - "node_modules/files-pipe": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/files-pipe/-/files-pipe-0.0.1.tgz", - "integrity": "sha512-+U75QMGwmNi6S3cLJPCXtCWCUP3QTKCf6zwtW+7A+OS06PDbiX6MOPI3KE6XZZKLl0UYdiB3rimyFeqZDUdh1g==", - "dependencies": { - "deepmerge-ts": "4.3.0", - "fast-glob": "3.2.12" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3870,26 +3960,6 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" }, - "node_modules/html-minifier-terser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.1.0.tgz", - "integrity": "sha512-BvPO2S7Ip0Q5qt+Y8j/27Vclj6uHC6av0TMoDn7/bJPhMWHI2UtR2e/zEgJn3/qYAmxumrGp9q4UHurL6mtW9Q==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "5.2.0", - "commander": "^9.4.1", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, "node_modules/html-void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", @@ -5623,7 +5693,9 @@ "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "optional": true, + "peer": true }, "node_modules/node-fetch": { "version": "2.6.7", @@ -6356,6 +6428,11 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -6896,6 +6973,8 @@ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz", "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==", "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.1", @@ -7097,6 +7176,15 @@ "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7435,6 +7523,8 @@ "version": "5.16.5", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -7451,7 +7541,9 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true, + "peer": true }, "node_modules/through": { "version": "2.3.8", diff --git a/astro/package.json b/astro/package.json index 4f92a65da2..d7dbace51b 100644 --- a/astro/package.json +++ b/astro/package.json @@ -16,9 +16,9 @@ "@astrojs/tailwind": "^3.0.1", "@docsearch/js": "^3.3.3", "@docsearch/react": "^3.3.3", + "@otterlord/astro-compress": "^1.1.48", "@tailwindcss/typography": "^0.5.9", "astro": "^2.0.15", - "astro-compress": "^1.1.35", "astro-index-pages": "src/integrations/astro-index-pages", "mermaid": "^9.1.6", "puppeteer": "^18.0.2", diff --git a/astro/public/js/Base64EncoderDecoder-0.1.0.js b/astro/public/js/Base64EncoderDecoder-0.1.0.js index 2d1310082d..de853fb72b 100644 --- a/astro/public/js/Base64EncoderDecoder-0.1.0.js +++ b/astro/public/js/Base64EncoderDecoder-0.1.0.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; class Base64EncoderDecoder { diff --git a/astro/public/js/CopyToClipboard-0.2.2.js b/astro/public/js/CopyToClipboard-0.2.2.js index 46117b77e7..fe2f2e5388 100644 --- a/astro/public/js/CopyToClipboard-0.2.2.js +++ b/astro/public/js/CopyToClipboard-0.2.2.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; var codeBlock = 1; @@ -63,4 +60,4 @@ class CopyToClipboard { } } -document.addEventListener('DOMContentLoaded', () => new CopyToClipboard()); \ No newline at end of file +document.addEventListener('DOMContentLoaded', () => new CopyToClipboard()); diff --git a/astro/public/js/DateTime-0.1.0.js b/astro/public/js/DateTime-0.1.0.js index a8e2f08e94..226f8c9fd5 100644 --- a/astro/public/js/DateTime-0.1.0.js +++ b/astro/public/js/DateTime-0.1.0.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; class DateTimeTools { diff --git a/astro/public/js/JWTDebugger-0.1.0.js b/astro/public/js/JWTDebugger-0.1.0.js index 0407d6009b..b769a9cdb5 100644 --- a/astro/public/js/JWTDebugger-0.1.0.js +++ b/astro/public/js/JWTDebugger-0.1.0.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; CodeMirror.defineMode('encoded-jwt', function() { diff --git a/astro/public/js/ScrollSpy.0.1.0.js b/astro/public/js/ScrollSpy.0.1.0.js index dac47794d5..9fea5acaad 100644 --- a/astro/public/js/ScrollSpy.0.1.0.js +++ b/astro/public/js/ScrollSpy.0.1.0.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; class ScrollSpy { @@ -41,4 +38,4 @@ class ScrollSpy { } } -document.addEventListener('DOMContentLoaded', () => new ScrollSpy()); \ No newline at end of file +document.addEventListener('DOMContentLoaded', () => new ScrollSpy()); diff --git a/astro/public/js/Search.0.1.1.js b/astro/public/js/Search.0.1.1.js index 0854a4562b..28b43bcf95 100644 --- a/astro/public/js/Search.0.1.1.js +++ b/astro/public/js/Search.0.1.1.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; class Search { @@ -164,4 +161,4 @@ class Search { } } -document.addEventListener('DOMContentLoaded', () => new Search()); \ No newline at end of file +document.addEventListener('DOMContentLoaded', () => new Search()); diff --git a/astro/public/js/ThemeSelector.0.1.0.js b/astro/public/js/ThemeSelector.0.1.0.js index c095839654..0b9afdfaec 100644 --- a/astro/public/js/ThemeSelector.0.1.0.js +++ b/astro/public/js/ThemeSelector.0.1.0.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; class ThemeSelector { @@ -121,4 +118,4 @@ const theme = localStorage.getItem('theme') || 'system'; if (theme === 'dark' || (theme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches)) { document.documentElement.classList.add('dark'); } -document.addEventListener('DOMContentLoaded', () => new ThemeSelector()); \ No newline at end of file +document.addEventListener('DOMContentLoaded', () => new ThemeSelector()); diff --git a/astro/public/js/URLEncoderDecoder-0.1.0.js b/astro/public/js/URLEncoderDecoder-0.1.0.js index a15ca8edf8..d4da9f9b55 100644 --- a/astro/public/js/URLEncoderDecoder-0.1.0.js +++ b/astro/public/js/URLEncoderDecoder-0.1.0.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; class EncoderDecoder { diff --git a/astro/public/js/Visibility.0.1.0.js b/astro/public/js/Visibility.0.1.0.js index 35328cb03d..2e77fd870a 100644 --- a/astro/public/js/Visibility.0.1.0.js +++ b/astro/public/js/Visibility.0.1.0.js @@ -1,6 +1,3 @@ -/* - * Copyright (c) 2018-2022, Inversoft Inc., All Rights Reserved - */ 'use strict'; class Visibility { @@ -19,4 +16,4 @@ class Visibility { } } -document.addEventListener('DOMContentLoaded', () => new Visibility()); \ No newline at end of file +document.addEventListener('DOMContentLoaded', () => new Visibility()); diff --git a/astro/src/components/GitHubEdit.astro b/astro/src/components/GitHubEdit.astro index 5dd85d95c1..e2d1a09fcd 100644 --- a/astro/src/components/GitHubEdit.astro +++ b/astro/src/components/GitHubEdit.astro @@ -3,6 +3,18 @@ import type { AstroGlobal } from "astro"; /** Gets the URL to edit the page on GitHub */ +export function appendFileSuffix(path) { + if (path.endsWith("/")) { + path = path.replace(/.$/, `.mdx`); + } else if (path.endsWith("\.html")) { + path = path.replace(/html$/, `mdx`); + } else { + path = path + ".mdx"; + } + + return path; +} + export function getGithubEditUrl(Astro: Readonly) { const slug = Astro.params?.slug; const path = Astro.url.pathname; @@ -17,12 +29,12 @@ export function getGithubEditUrl(Astro: Readonly) { : path + `index.mdx` : path; } else if (path.includes("/dev-tools/")) { - appendFile = splitSlug?.length - ? path.replace(/.$/, `.mdx`) + appendFile = splitSlug?.length + ? appendFileSuffix(path) : path + `index.mdx`; } else if (path.includes("/quickstarts/")) { appendFile = splitSlug?.length - ? path.replace("/docs", "").replace(/.$/, `.mdx`) + ? appendFileSuffix(path.replace("/docs", "")) : path.replace("/docs", ""); } return `https://github.com/FusionAuth/fusionauth-site/blob/master/astro/src/content${appendFile}`; diff --git a/astro/src/components/Head.astro b/astro/src/components/Head.astro index 30d715d47f..f1702cdb05 100644 --- a/astro/src/components/Head.astro +++ b/astro/src/components/Head.astro @@ -55,5 +55,12 @@ const isProd = import.meta.env.PROD as boolean; } + diff --git a/astro/src/content/quickstarts/quickstart-python-flask-web.mdx b/astro/src/content/quickstarts/quickstart-python-flask-web.mdx index d3d5233d9c..c0493b7c29 100644 --- a/astro/src/content/quickstarts/quickstart-python-flask-web.mdx +++ b/astro/src/content/quickstarts/quickstart-python-flask-web.mdx @@ -226,7 +226,7 @@ Click the `Logout` button and watch the browser first go to FusionAuth to log ou ## Next Steps This quickstart is a great way to get a proof of concept up and running quickly, but to run -you application in production, there are some things you're going to want to do. +your application in production, there are some things you're going to want to do. ### FusionAuth Customization FusionAuth gives you the ability to customize just about everything with the user's experience and your application's integration. This includes diff --git a/site/_includes/_head.liquid b/site/_includes/_head.liquid index 1d7ab06681..3e07f59ff2 100644 --- a/site/_includes/_head.liquid +++ b/site/_includes/_head.liquid @@ -102,6 +102,15 @@ FusionAuth.accountURL = '{% if jekyll.environment == 'development' %}https://account-local.fusionauth.io{% else %}https://account.fusionauth.io{% endif %}'; + + + diff --git a/site/_posts/2023-01-09-saml-and-oidc-difference.md b/site/_posts/2023-01-09-saml-and-oidc-difference.md index 4e6edcd33b..00467f808c 100755 --- a/site/_posts/2023-01-09-saml-and-oidc-difference.md +++ b/site/_posts/2023-01-09-saml-and-oidc-difference.md @@ -19,7 +19,7 @@ This article will examine two authentication protocols: OpenID Connect (OIDC) an ## What Is OIDC? -[OIDC](https://openid.net/connect/) is an open authentication protocol built on top of the OAuth 2.0 authorization framework. It delegates authentication to identity providers such as Google and FushionAuth to verify identities, while defining how an identity provider communicates with a relying party (or the platform providing services) to authenticate an entity (or end user). +[OIDC](https://openid.net/connect/) is an open authentication protocol built on top of the OAuth 2.0 authorization framework. It delegates authentication to identity providers such as Google and FusionAuth to verify identities, while defining how an identity provider communicates with a relying party (or the platform providing services) to authenticate an entity (or end user). OIDC uses tokens known as [JSON Web Tokens](https://jwt.io/) (JWTs), with which applications can authenticate identities and access data from another application or service. It supports the [single sign-on](https://fusionauth.io/learn/expert-advice/authentication/developer-benefits-single-sign-on) (SSO) mechanism, which is used by most engineers to authenticate a user across several platforms. This can be handled by services like [FusionAuth](https://fusionauth.io/), which provides out-of-the-box features such as SSO for quicker authentication. OIDC works with web-based, mobile, and JavaScript clients. diff --git a/site/_posts/2023-08-09-llm-for-fusionauth-documentation.md b/site/_posts/2023-08-09-llm-for-fusionauth-documentation.md new file mode 100644 index 0000000000..b90ec00398 --- /dev/null +++ b/site/_posts/2023-08-09-llm-for-fusionauth-documentation.md @@ -0,0 +1,50 @@ +--- +layout: blog-post +title: Searching FusionAuth docs using an LLM +description: FusionAuth has made a large language model trained against FusionAuth docs available to the FusionAuth community. +author: Dan Moore +image: blogs/llm-assistant/llm-fusionauth-header.png +category: announcement +tags: llm documentation tooling docs +excerpt_separator: "" +--- + +I don't know about you, but when I first encountered ChatGPT, I was blown away. I used it a few times, including to [write a poem about SAML and OIDC](https://twitter.com/mooreds/status/1599787770419220482). + +Even though it got some of the details wrong, I was impressed. + + + +But what I immediately thought of was what this could mean for technical documentation. Such documentation is critical for developer happiness. Have you ever fished through GitHub repositories, source code, discord or slack, and forums to find a solution to an obscure technical problem? I have, and it's no fun. + +Seeing the ability of ChatGPT and the underlying large language model (LLM) to answer questions across a range of disciplines, I wanted to see what such a model could do with the FusionAuth corpus of over 300 docs, thousands of GitHub issues, and 2000+ forum posts. While I still believe most developers use Google as their primary documentation interface (ht [Taylor Barnett](https://taylorbar.net/)), I wondered "could an LLM surface documentation better"? + +## The Startups Cometh + +I initially looked at [LangChain](https://python.langchain.com/docs/get_started/introduction.html) to build an interface to our documentation. But real life quickly intervened. Spending a bunch of time getting up to speed on building an LLM, as fun as it would be, was not a good use of my time. + +There were a number of startups that thought the same, and built products and companies with the goal of applying LLMs to technical documentation. I looked around at one or two of them earlier this year, but there were issues. One choked on the number and size of documents we had, for example. I recall some of our docs were in asciidoc, not markdown, being an issue as well. And so I set it aside. + +Then, I ran across [Kapa, another startup](https://kapa.ai/) which promised they could train a model on publicly available data as well as making it easy to access. They had integrations with both websites and Slack. Since almost all our documentation is available on the internet, I was interested. + +We spun up a proof of concept and the FusionAuth team asked the LLM questions. It was pretty good. + +I especially liked how their solution provided links to existing documentation. This, to me, is critical, because it alleviates hallucination worries. If you are using a LLM as a novel and helpful search interface for documentation, slightly wrong answers are less of an issue than if you are treating it as an oracle. + +## Rolling it out + +We're rolling this AI assistant out to the wider FusionAuth community today. It's trained on the website, articles, technical documentation, forum posts, and blog posts right now. If the community finds this useful, we'll be adding it in other places, but for now you'll see it in the lower right hand side of the technical documentation sections. + +
+{% include _image.liquid src="/assets/img/blogs/llm-assistant/initial-screen.png" alt="The LLM assistant awaits." class="img-fluid" figure=false %} + +Click or tap on it and type in your question. Using natural language is fine; this is one of the benefits of an LLM. + +{% include _image.liquid src="/assets/img/blogs/llm-assistant/ask-question.png" alt="Type your question." class="img-fluid" figure=false %} + +You'll see answers and the aforementioned links to supporting documentation. + +{% include _image.liquid src="/assets/img/blogs/llm-assistant/answer-question.png" alt="The LLM assistant answers." class="img-fluid" figure=false %} + +Go ahead. Ask your questions! We hope this will be of use as you learn more about authentication and FusionAuth. + diff --git a/site/assets/img/blogs/llm-assistant/answer-question.png b/site/assets/img/blogs/llm-assistant/answer-question.png new file mode 100644 index 0000000000..f3f8d34456 Binary files /dev/null and b/site/assets/img/blogs/llm-assistant/answer-question.png differ diff --git a/site/assets/img/blogs/llm-assistant/ask-question.png b/site/assets/img/blogs/llm-assistant/ask-question.png new file mode 100644 index 0000000000..7dca7f437e Binary files /dev/null and b/site/assets/img/blogs/llm-assistant/ask-question.png differ diff --git a/site/assets/img/blogs/llm-assistant/initial-screen.png b/site/assets/img/blogs/llm-assistant/initial-screen.png new file mode 100644 index 0000000000..08c537bab1 Binary files /dev/null and b/site/assets/img/blogs/llm-assistant/initial-screen.png differ diff --git a/site/assets/img/blogs/llm-assistant/llm-fusionauth-header.png b/site/assets/img/blogs/llm-assistant/llm-fusionauth-header.png new file mode 100644 index 0000000000..9a1b624c85 Binary files /dev/null and b/site/assets/img/blogs/llm-assistant/llm-fusionauth-header.png differ diff --git a/site/assets/img/docs/admin-guide/account-portal/support-tab.png b/site/assets/img/docs/admin-guide/account-portal/support-tab.png index 330d90e02e..b425bf03bc 100644 Binary files a/site/assets/img/docs/admin-guide/account-portal/support-tab.png and b/site/assets/img/docs/admin-guide/account-portal/support-tab.png differ diff --git a/site/assets/img/docs/admin-guide/support/file-support-ticket.png b/site/assets/img/docs/admin-guide/support/file-support-ticket.png deleted file mode 100644 index 8e8a4b4f95..0000000000 Binary files a/site/assets/img/docs/admin-guide/support/file-support-ticket.png and /dev/null differ diff --git a/site/assets/img/docs/admin-guide/support/support-button.png b/site/assets/img/docs/admin-guide/support/support-button.png new file mode 100644 index 0000000000..5f27d4f9ae Binary files /dev/null and b/site/assets/img/docs/admin-guide/support/support-button.png differ diff --git a/site/assets/img/docs/admin-guide/support/support-ticket-form.png b/site/assets/img/docs/admin-guide/support/support-ticket-form.png new file mode 100644 index 0000000000..852304a38a Binary files /dev/null and b/site/assets/img/docs/admin-guide/support/support-ticket-form.png differ diff --git a/site/assets/img/docs/admin-guide/support/support-ticket-widget.png b/site/assets/img/docs/admin-guide/support/support-ticket-widget.png deleted file mode 100644 index ec1a2b5e13..0000000000 Binary files a/site/assets/img/docs/admin-guide/support/support-ticket-widget.png and /dev/null differ diff --git a/site/docs/v1/tech/admin-guide/account-portal.adoc b/site/docs/v1/tech/admin-guide/account-portal.adoc index 5591a925bc..fd31039ce2 100644 --- a/site/docs/v1/tech/admin-guide/account-portal.adoc +++ b/site/docs/v1/tech/admin-guide/account-portal.adoc @@ -154,7 +154,7 @@ image::admin-guide/account-portal/company-danger-zone.png[The company danger zon === Support -To review your support options, navigate to the [breadcrumb]#Support# tab or click on the Support widget at the bottom of the page. +To review your support options, navigate to the [breadcrumb]#Support# tab or click on the Support button at the bottom of the page. The message displayed in the support tab will vary based on your purchased plan and deployments. image::admin-guide/account-portal/support-tab.png[The support tab,width=1200,role=bottom-cropped] diff --git a/site/docs/v1/tech/admin-guide/cli.md b/site/docs/v1/tech/admin-guide/cli.md index e5bb99ea81..e5cabc042a 100644 --- a/site/docs/v1/tech/admin-guide/cli.md +++ b/site/docs/v1/tech/admin-guide/cli.md @@ -48,9 +48,9 @@ This tool allows you to easily retrieve and publish FusionAuth configurations fr This includes: -* themes +* emails * lambdas -* emails (coming soon) +* themes The CLI is designed to work with complex version controlled configuration and includes support for localized content. diff --git a/site/docs/v1/tech/admin-guide/technical-support.adoc b/site/docs/v1/tech/admin-guide/technical-support.adoc index 84de6c951f..2df1966af3 100644 --- a/site/docs/v1/tech/admin-guide/technical-support.adoc +++ b/site/docs/v1/tech/admin-guide/technical-support.adoc @@ -40,18 +40,22 @@ link:/license/#exhibit-a[Exhibit A of the FusionAuth license agreement] defines If you have a paid edition which includes technical support, please https://account.fusionauth.io/account/support/[open a ticket via your account portal]. This ensures that we will see it; slack messages or emails can unfortunately get lost. -When you are logged in to your account, you will see the support widget in the lower right hand corner. +When you are logged in to your account, you will see the support button in the lower right hand corner. -image::admin-guide/support/support-ticket-widget.png[The support ticket widget.,width=1200,role=top-cropped] +image::admin-guide/support/support-button.png[The support ticket button.,width=1200,role=top-cropped] -When you click the widget, a window will pop up with fields for the support ticket. -Fill these out as appropriate. +When you click the button, you will be directed to the support tab. + +image::admin-guide/account-portal/support-tab.png[The support tab,width=1200,role=bottom-cropped] + +Click the [field]#Open a support ticket# button to create a new ticket or use the [field]#View support tickets# button to see existing support tickets. +Fill out the form fields as appropriate to submit a new support ticket. We do not typically make music recommendations, however. -image::admin-guide/support/file-support-ticket.png[Adding a support ticket.,width=1200] +image::admin-guide/support/support-ticket-form.png[Adding a support ticket.,width=1200,role=bottom-cropped] **Paid support plans provide access to the engineering team.** -If you do not have a paid support plan, you generally will not see the support widget. +If you do not have a paid support plan, you generally will not see the support button. When you open a ticket, you will get a response within link:/pricing/[the documented time window for your edition], and typically sooner. diff --git a/site/docs/v1/tech/core-concepts/users.adoc b/site/docs/v1/tech/core-concepts/users.adoc index c7e786e7f8..981db2ea5d 100644 --- a/site/docs/v1/tech/core-concepts/users.adoc +++ b/site/docs/v1/tech/core-concepts/users.adoc @@ -15,9 +15,19 @@ The User itself is easy enough to understand, it represents your end user, your * <> * <> +** <> * <> * <> +** <> +** <> +** <> * <> +** <> +** <> +** <> +** <> +** <> + Here's a brief video covering some aspects of users: @@ -152,14 +162,15 @@ include::docs/v1/tech/shared/_data-field-data-type-changes.adoc[] == Segmenting Users Often you want to segment or separate your users. -You have four options to do so in FusionAuth. +You have options to do so in FusionAuth. They each have different tradeoffs. The options are: -* Tenants -* Applications and Registrations -* Groups -* Entities and Grants +* <> +* <> +* <> +* <> +* <> //TODO table? @@ -269,3 +280,19 @@ The scheduling software could know that Richard would have access to the schedul If you were to model this using only applications, you'd have to have twenty applications in FusionAuth (two for each store) and keeping those configurations synchronized might be difficult. And if you added more applications or stores, you'd face a combinatorial explosion of applications. + +=== The user.data Field + +You can add add arbitrary JSON to the `user.data` field, such as `org_type` and `org_id` fields. You can do this using the link:/docs/v1/tech/apis/users[User API] on user creation. + +The `user.data` fields can then be read in a link:/docs/v1/tech/lambdas/jwt-populate[JWT Populate Lambda] and pushed into the tokens generated during authentication. + +The downstream application can examine the tokens and determine which organizations a user has access to. + +A variant of this is using link:/docs/v1/tech/lambdas/#using-lambda-http-connect[Lambda HTTP Connect] which can pass a user Id to an external service during authentication and retrieve user attributes such as an `org_id`. This has the advantage of avoiding synchronization at the cost of requiring a paid plan and increased latency during the authentication event. The exact amount of latency depends on the responsiveness of the called API. + +This approach works well when you want FusionAuth to handle authentication but keep all user segmentation logic in your application. + +==== The user.data Schema + +include::docs/v1/tech/shared/_data-field-data-type-changes.adoc[] diff --git a/site/docs/v1/tech/installation-guide/cloud.adoc b/site/docs/v1/tech/installation-guide/cloud.adoc index 0b328115b2..ff839f655b 100644 --- a/site/docs/v1/tech/installation-guide/cloud.adoc +++ b/site/docs/v1/tech/installation-guide/cloud.adoc @@ -497,7 +497,7 @@ No data loss should occur and your configuration will be preserved. [NOTE.note] ==== -If you have a High Availability cloud deployment and require more than your current allotment of custom domains, you are eligible for a free upgrade to <>. +If you are an Enterprise customer with a High Availability cloud deployment and require more than your current allotment of custom domains, you are eligible for an upgrade to <>. ==== If you are on a supported deployment and want a custom domain name such as `auth.piediper.com`, it is entirely self service. @@ -570,7 +570,11 @@ You may notice FusionAuth Cloud now supports a `[uuid].durable.fusionauth.io` CN === Unlimited Custom Domains -FusionAuth Cloud supports unlimited custom domains for High Availability deployments. Aside from allowing unlimited custom domains, the feature also has the following benefits: +:enterprise_feature: Unlimited Custom Domains +include::docs/v1/tech/shared/_enterprise-edition-blurb.adoc[] +:enterprise_feature!: + +FusionAuth Cloud supports unlimited custom domains for Enterprise customers with High Availability deployments. Aside from allowing unlimited custom domains, the feature also has the following benefits: * A streamlined user interface for managing custom domains * The ability to add and remove individual custom domains