middleware_automation.keycloak Release Notes
+middleware_automation.keycloak Release Notes
This changelog describes changes after version 0.2.6.
v1.2.8-devel
+v1.2.8-devel
Minor Changes
+Minor Changes
Bugfixes
+Bugfixes
v1.2.7
+v1.2.7
Minor Changes
+Minor Changes
v1.2.6
+v1.2.6
Minor Changes
+Minor Changes
Bugfixes
+Bugfixes
Handle WFLYCTL0117 when background validation millis is 0 #90
v1.2.5
+v1.2.5
Minor Changes
+Minor Changes
v1.2.4
+v1.2.4
Minor Changes
+Minor Changes
Bugfixes
+Bugfixes
v1.2.1
+v1.2.1
Minor Changes
+Minor Changes
Allow to setup keycloak HA cluster without remote cache store #68
Bugfixes
+Bugfixes
Pass attributes to realm clients #69
v1.2.0
+v1.2.0
Major Changes
+Major Changes
Provide config for multiple modcluster proxies #60
Minor Changes
+Minor Changes
v1.1.1
+v1.1.1
Bugfixes
+Bugfixes
keycloak-quarkus: fix
cache-config-file
path in keycloak.conf.j2 template #53
v1.1.0
+v1.1.0
Minor Changes
+Minor Changes
Breaking Changes / Porting Guide
+Breaking Changes / Porting Guide
Rename variables from
infinispan_
prefix tokeycloak_infinispan_
#42
Bugfixes
+Bugfixes
keycloak_quarkus: fix /var/log/keycloak symlink to keycloak log directory #44
v1.0.7
+v1.0.7
Breaking Changes / Porting Guide
+Breaking Changes / Porting Guide
keycloak_quarkus: use absolute path for certificate files #39
Bugfixes
+Bugfixes
keycloak_quarkus: use become for tasks that will otherwise fail #38
v1.0.6
+v1.0.6
Bugfixes
+Bugfixes
v1.0.5
+v1.0.5
Minor Changes
+Minor Changes
Update config options: keycloak and quarkus #32
v1.0.4
+v1.0.4
v1.0.3
+v1.0.3
Major Changes
+Major Changes
New role for installing keycloak >= 17.0.0 (quarkus) #29
Minor Changes
+Minor Changes
Add
keycloak_config_override_template
parameter for passing a custom xml config template #30
Bugfixes
+Bugfixes
Make sure systemd unit starts with selected java JVM #31
v1.0.2
+v1.0.2
Minor Changes
+Minor Changes
Bugfixes
+Bugfixes
Set
keycloak_frontend_url
default according to other defaults #25
v1.0.1
+v1.0.1
Release Summary
+Release Summary
Minor enhancements, bug and documentation fixes.
Major Changes
+Major Changes
Apply latest cumulative patch of RH-SSO automatically when new parameter
keycloak_rhsso_apply_patches
istrue
#18
Minor Changes
+Minor Changes
Clustered installs now perform database initialization on first node to avoid locking issues #17
v1.0.0
+v1.0.0
Release Summary
+Release Summary
This is the first stable release of the middleware_automation.keycloak
collection.
Ansible Collection - middleware_automation.keycloak
+Ansible Collection - middleware_automation.keycloak
@@ -129,16 +130,16 @@Collection to install and configure Keycloak or Red Hat Single Sign-On.
- Ansible version compatibility
+Ansible version compatibility
This collection has been tested against following Ansible versions: >=2.9.10.
Plugins and modules within a collection may be tested with only specific Ansible versions. A collection may contain metadata that identifies these versions.
- Installation
+Installation
- Installing the Collection from Ansible Galaxy
+Installing the Collection from Ansible Galaxy
Before using the collection, you need to install it with the Ansible Galaxy CLI:
@@ -160,7 +161,7 @@ansible-galaxy collection install middleware_automation.keycloak- Included roles
+Included roles
keycloak
: role for installing the service.- @@ -169,16 +170,16 @@
keycloak_realm
: role for configuring a realm, user federation(s), clients and users, in an installed service.- Usage
+Usage
- Install Playbook
+Install Playbook
playbooks/keycloak.yml
installs based on the defined variables (using most defaults).Both playbooks include the
keycloak
role, with different settings, as described in the following sections.For full service configuration details, refer to the keycloak role README.
- Install from controller node (offline)
+Install from controller node (offline)
Making the keycloak zip archive available to the playbook working directory, and setting
keycloak_offline_install
toTrue
, allows to skip the download tasks. The local path for the archive does match the downloaded archive path, so that it is also used as a cache when multiple hosts are provisioned in a cluster.keycloak_offline_install: True @@ -188,12 +189,12 @@ the download tasks. The local path for the archive does match the downloaded arc- Install from alternate sources (like corporate Nexus, artifactory, proxy, etc)
+Install from alternate sources (like corporate Nexus, artifactory, proxy, etc)
It is possible to perform downloads from alternate sources, using the
keycloak_download_url
variable; make sure the final downloaded filename matches with the source filename (ie. keycloak-legacy-x.y.zip or rh-sso-x.y.z-server-dist.zip).- Example installation command
+Example installation command
Execute the following command from the source root directory
@@ -211,13 +212,13 @@ the download tasks. The local path for the archive does match the downloaded arcansible-playbook -i <ansible_hosts> -e @rhn-creds.yml playbooks/keycloak.yml -e keycloak_admin_password=<changeme>
- Configuration
+Configuration
- Config Playbook
+Config Playbook
playbooks/keycloak_realm.yml
creates or updates provided realm, user federation(s), client(s), client role(s) and client user(s).- Example configuration command
+Example configuration command
Execute the following command from the source root directory:
@@ -238,7 +239,7 @@ the download tasks. The local path for the archive does match the downloaded arcansible-playbook -i <ansible_hosts> playbooks/keycloak_realm.yml -e keycloak_admin_password=<changeme> -e keycloak_realm=test- diff --git a/main/_static/antsibull-minimal.css b/main/_static/antsibull-minimal.css new file mode 100644 index 0000000..ebc82d8 --- /dev/null +++ b/main/_static/antsibull-minimal.css @@ -0,0 +1,3 @@ +@charset "UTF-8"; +/* Copyright (c) Ansible and contributors */ +/* GNU General Public License v3.0+ (see https://www.gnu.org/licenses/gpl-3.0.txt) */.ansible-links{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ansible-links>a{padding:4px 12px;margin:2px 4px;cursor:pointer;border-radius:3px;background-color:#5bbdbf;color:#fff}.ansible-links>a:active,.ansible-links>a:focus,.ansible-links>a:hover{background-color:#91d9db}.ansible-links>a:focus{outline:3px solid #204748}table.documentation-table{border-bottom:1px solid #000;border-right:1px solid #000}table.documentation-table th{background-color:#6ab0de}table.documentation-table td,table.documentation-table th{padding:4px;border-left:1px solid #000;border-top:1px solid #000}table.documentation-table td.elbow-placeholder{border-top:0;width:30px;min-width:30px}table.documentation-table td{vertical-align:top}table.documentation-table td:first-child{white-space:nowrap}table.documentation-table tr .ansibleOptionLink{display:inline-block}table.documentation-table tr .ansibleOptionLink:after{content:"🔗";opacity:0}table.documentation-table tr:hover .ansibleOptionLink:after{opacity:1}table.documentation-table tr:nth-child(odd){background-color:#fff}table.documentation-table tr:nth-child(2n){background-color:#e7f2fa}table.ansible-option-table{display:table;border-color:#000!important;height:1px}table.ansible-option-table tr{height:100%}table.ansible-option-table td,table.ansible-option-table th{border-color:#000!important;border-bottom:none!important;vertical-align:top!important}table.ansible-option-table th>p{font-size:medium!important}table.ansible-option-table thead tr{background-color:#6ab0de}table.ansible-option-table tbody .row-odd td{background-color:#fff!important}table.ansible-option-table tbody .row-even td{background-color:#e7f2fa!important}table.ansible-option-table ul>li>p{margin:0!important}table.ansible-option-table ul>li>div[class^=highlight]{margin-bottom:4px!important}table.ansible-option-table p.ansible-option-title{display:inline}table.ansible-option-table .ansible-option-type-line{font-size:small;margin-bottom:0}table.ansible-option-table .ansible-option-elements,table.ansible-option-table .ansible-option-type{color:purple}table.ansible-option-table .ansible-option-required{color:red}table.ansible-option-table .ansible-option-versionadded{font-style:italic;font-size:small;color:#006400}table.ansible-option-table .ansible-option-aliases{color:#006400;white-space:normal}table.ansible-option-table .ansible-option-line{margin-top:8px}table.ansible-option-table .ansible-option-choices{font-weight:700}table.ansible-option-table .ansible-option-choices-default-mark,table.ansible-option-table .ansible-option-default{color:#00f}table.ansible-option-table .ansible-option-default-bold{color:#00f;font-weight:700}table.ansible-option-table .ansible-option-returned-bold{font-weight:700}table.ansible-option-table .ansible-option-sample{color:#00f;word-wrap:break-word;word-break:break-all}table.ansible-option-table .ansible-option-sample-bold{color:#000;font-weight:700}table.ansible-option-table .ansible-option-configuration{font-weight:700}table.ansible-option-table .ansibleOptionLink{display:inline-block}table.ansible-option-table .ansibleOptionLink:after{content:"🔗";opacity:0}table.ansible-option-table p{margin:0 0 8px}table.ansible-option-table tr:hover .ansibleOptionLink:after{opacity:1}table.ansible-option-table td{padding:0!important;white-space:normal}table.ansible-option-table td>div.ansible-option-cell{padding:8px 16px;border-top:1px solid #000}table.ansible-option-table td:first-child{height:inherit;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}table.ansible-option-table td:first-child>div.ansible-option-cell{height:inherit;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;white-space:nowrap;max-width:100%}table.ansible-option-table .ansible-option-indent{margin-left:2em;border-right:1px solid #000}table.ansible-option-table .ansible-attribute-support-label{display:none}table.ansible-option-table .ansible-attribute-support-label,table.ansible-option-table .ansible-attribute-support-property{font-weight:700}table.ansible-option-table .ansible-attribute-support-none{font-weight:700;color:red}table.ansible-option-table .ansible-attribute-support-partial{font-weight:700;color:#a5a500}table.ansible-option-table .ansible-attribute-support-full{font-weight:700;color:green}table.ansible-option-table .ansible-attribute-details{font-style:italic}@media (max-width:1200px){table.ansible-option-table{display:block;height:unset;border:none!important}table.ansible-option-table thead{display:none}table.ansible-option-table tbody,table.ansible-option-table td,table.ansible-option-table tr{display:block;border:none!important}table.ansible-option-table tbody .row-even td,table.ansible-option-table tbody .row-odd td{background-color:unset!important}table.ansible-option-table td>div.ansible-option-cell{border-top:none}table.ansible-option-table td:first-child>div.ansible-option-cell{background-color:#e7f2fa!important}table.ansible-option-table td:not(:first-child){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}table.ansible-option-table td:not(:first-child)>div.ansible-option-cell{margin-left:1em}table.ansible-option-table .ansible-option-indent,table.ansible-option-table .ansible-option-indent-desc{margin-left:1em;border:none;border-right:3px solid #e7f2fa}table.ansible-option-table .ansible-attribute-support-label{display:unset}}.ansible-version-added{font-style:italic}.ansible-option-value a.reference.external,.ansible-option-value a.reference.external:hover,.ansible-option-value a.reference.internal,.ansible-option-value a.reference.internal:hover,.ansible-option a.reference.external,.ansible-option a.reference.external:hover,.ansible-option a.reference.internal,.ansible-option a.reference.internal:hover,.ansible-return-value a.reference.external,.ansible-return-value a.reference.external:hover,.ansible-return-value a.reference.internal,.ansible-return-value a.reference.internal:hover{color:unset} \ No newline at end of file diff --git a/main/_static/basic.css b/main/_static/basic.css index 7577acb..30fee9d 100644 --- a/main/_static/basic.css +++ b/main/_static/basic.css @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -670,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -738,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/main/_static/documentation_options.js b/main/_static/documentation_options.js index b57ae3b..7e4c114 100644 --- a/main/_static/documentation_options.js +++ b/main/_static/documentation_options.js @@ -1,5 +1,4 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), +const DOCUMENTATION_OPTIONS = { VERSION: '', LANGUAGE: 'en', COLLAPSE_INDEX: false, diff --git a/main/_static/pygments.css b/main/_static/pygments.css index 0d49244..fddd181 100644 --- a/main/_static/pygments.css +++ b/main/_static/pygments.css @@ -3,73 +3,79 @@ td.linenos .normal { color: inherit; background-color: transparent; padding-left span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -.highlight .hll { background-color: #ffffcc } -.highlight { background: #eeffcc; } -.highlight .c { color: #408090; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .hll { background-color: #ffffcc; border: 1px solid #edff00; padding-top: 2px; border-radius: 3px; display: block } +.highlight { background: #f8f8f8; } +.highlight .c { color: #6a737d; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2; border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .l { color: #032f62 } /* Literal */ +.highlight .n { color: #333333 } /* Name */ +.highlight .o { color: #666666; font-weight: bold } /* Operator */ +.highlight .p { font-weight: bold } /* Punctuation */ +.highlight .ch { color: #6a737d; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #6a737d; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #007020 } /* Comment.Preproc */ -.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .cpf { color: #6a737d; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #6a737d; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .gi { color: #00A000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .gt { color: #0040D0 } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kp { color: #007020; font-weight: bold } /* Keyword.Pseudo */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .kt { color: #902000; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #032f62 } /* Literal.Date */ .highlight .m { color: #208050 } /* Literal.Number */ .highlight .s { color: #4070a0 } /* Literal.String */ -.highlight .na { color: #4070a0 } /* Name.Attribute */ -.highlight .nb { color: #007020 } /* Name.Builtin */ -.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ -.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086b3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #007020 } /* Name.Exception */ -.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .ni { color: #800080; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ -.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .nn { color: #555555; font-weight: bold } /* Name.Namespace */ +.highlight .nx { color: #333333 } /* Name.Other */ +.highlight .py { color: #333333 } /* Name.Property */ +.highlight .nt { color: #22863a; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #9960b5; font-weight: bold } /* Name.Variable */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .pm { font-weight: bold } /* Punctuation.Marker */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mb { color: #208050 } /* Literal.Number.Bin */ -.highlight .mf { color: #208050 } /* Literal.Number.Float */ -.highlight .mh { color: #208050 } /* Literal.Number.Hex */ -.highlight .mi { color: #208050 } /* Literal.Number.Integer */ -.highlight .mo { color: #208050 } /* Literal.Number.Oct */ -.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ -.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ -.highlight .sc { color: #4070a0 } /* Literal.String.Char */ -.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ -.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ -.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ -.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ -.highlight .sx { color: #c65d09 } /* Literal.String.Other */ -.highlight .sr { color: #235388 } /* Literal.String.Regex */ -.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ -.highlight .ss { color: #517918 } /* Literal.String.Symbol */ -.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #06287e } /* Name.Function.Magic */ -.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ -.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ -.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ -.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ -.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file +.highlight .mb { color: #009999 } /* Literal.Number.Bin */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sa { color: #dd1144 } /* Literal.String.Affix */ +.highlight .sb { color: #dd1144 } /* Literal.String.Backtick */ +.highlight .sc { color: #dd1144 } /* Literal.String.Char */ +.highlight .dl { color: #dd1144 } /* Literal.String.Delimiter */ +.highlight .sd { color: #dd1144; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #dd1144 } /* Literal.String.Double */ +.highlight .se { color: #dd1144; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #dd1144 } /* Literal.String.Heredoc */ +.highlight .si { color: #dd1144; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #dd1144 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #dd1144 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e; font-weight: bold } /* Name.Function.Magic */ +.highlight .vc { color: #008080; font-weight: bold } /* Name.Variable.Class */ +.highlight .vg { color: #008080; font-weight: bold } /* Name.Variable.Global */ +.highlight .vi { color: #008080; font-weight: bold } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5; font-weight: bold } /* Name.Variable.Magic */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/main/_static/searchtools.js b/main/_static/searchtools.js index 97d56a7..7918c3f 100644 --- a/main/_static/searchtools.js +++ b/main/_static/searchtools.js @@ -57,12 +57,12 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; const [docName, title, anchor, descr, score, _filename] = item; @@ -75,20 +75,24 @@ const _displayItem = (item, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) + if (descr) { listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) @@ -97,6 +101,9 @@ const _displayItem = (item, searchTerms) => { listItem.appendChild( Search.makeSearchSummary(data, searchTerms) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -115,14 +122,15 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, - searchTerms + searchTerms, + highlightTerms, ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } @@ -360,7 +368,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** diff --git a/main/_static/sphinx_highlight.js b/main/_static/sphinx_highlight.js index aae669d..8a96c69 100644 --- a/main/_static/sphinx_highlight.js +++ b/main/_static/sphinx_highlight.js @@ -29,14 +29,19 @@ const _highlight = (node, addItems, text, className) => { } span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); parent.insertBefore( span, parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), + rest, node.nextSibling ) ); node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); if (isInSVG) { const rect = document.createElementNS( @@ -140,5 +145,10 @@ const SphinxHighlight = { }, }; -_ready(SphinxHighlight.highlightSearchWords); -_ready(SphinxHighlight.initEscapeListener); +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/main/developing.html b/main/developing.html index a74db66..2dcb00c 100644 --- a/main/developing.html +++ b/main/developing.html @@ -7,16 +7,17 @@License
+License
Apache License v2.0 or later
See LICENSE to view the full text.
Contributor’s Guidelines — Keycloak Ansible Collection documentation + - - - - - + + + + + @@ -96,7 +97,7 @@- Contributor’s Guidelines
+Contributor’s Guidelines
All YAML files named with
.yml
extension- diff --git a/main/genindex.html b/main/genindex.html index b6dd7aa..751c9ca 100644 --- a/main/genindex.html +++ b/main/genindex.html @@ -6,16 +6,17 @@
Use spaces around jinja variables.
{{ var }}
over{{var}}
Index — Keycloak Ansible Collection documentation + - - - - - + + + + + diff --git a/main/index.html b/main/index.html index f660bb3..1de1f47 100644 --- a/main/index.html +++ b/main/index.html @@ -7,16 +7,17 @@Welcome to Keycloak Collection documentation — Keycloak Ansible Collection documentation + - - - - - + + + + + @@ -95,7 +96,7 @@- Welcome to Keycloak Collection documentation
+Welcome to Keycloak Collection documentation
User documentation
diff --git a/main/plugins/index.html b/main/plugins/index.html index 2a65aef..55f9935 100644 --- a/main/plugins/index.html +++ b/main/plugins/index.html @@ -7,16 +7,17 @@
Plugin Index — Keycloak Ansible Collection documentation + - - - - - + + + + + @@ -101,7 +102,7 @@- Plugin Index
+Plugin Index
modules plugins
diff --git a/main/plugins/keycloak_client.html b/main/plugins/keycloak_client.html index 6492293..491b617 100644 --- a/main/plugins/keycloak_client.html +++ b/main/plugins/keycloak_client.html @@ -7,16 +7,17 @@
keycloak_client – Allows administration of Keycloak clients via Keycloak API — Keycloak Ansible Collection documentation + - - - - - + + + + + @@ -112,7 +113,7 @@- keycloak_client – Allows administration of Keycloak clients via Keycloak API
+keycloak_client – Allows administration of Keycloak clients via Keycloak API
Note
This module is part of the middleware_automation.keycloak collection.
@@ -121,15 +122,15 @@- Synopsis
+Synopsis
This module allows the administration of Keycloak clients via the Keycloak REST API. It requires access to the REST API via OpenID Connect; the user connecting and the client being used must have the requisite access rights. In a default Keycloak installation, admin-cli and an admin user would work, as would a separate client definition with the scope tailored to your needs and a user having the expected roles.
- @@ -137,7 +138,7 @@
The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at https://www.keycloak.org/docs-api/8.0/rest-api/index.html. Aliases are provided so camelCased versions can be used as well.
- Parameters
+Parameters
@@ -335,7 +336,7 @@ @@ -164,8 +165,8 @@ Parameter
Whether or not to display this client in account console, even if the user does not have an active session.
Choices:
string
OpenID Connect client_id to authenticate to the API with.
-Default: :ansible-option-default:`"admin-cli"`
+Default:
"admin-cli"
@@ -430,8 +431,8 @@ @@ -398,8 +399,8 @@Are authorization services enabled for this client or not (OpenID connect). This is ‘authorizationServicesEnabled’ in the Keycloak REST API.
Choices:
@@ -444,8 +445,8 @@ The access type of this client is bearer-only. This is ‘bearerOnly’ in the Keycloak REST API.
Choices:
@@ -473,7 +474,7 @@ How do clients authenticate with the auth server? Either
client-secret
orclient-jwt
can be chosen. When usingclient-secret
, the module parameter secret can set it, while forclient-jwt
, you can use the keysuse.jwks.url
,jwks.url
, andjwt.credential.certificate
in the attributes module parameter to configure its behavior. This is ‘clientAuthenticatorType’ in the Keycloak REST API.Choices:
-
- -
- +
- +
"client-secret"
"client-jwt"
added in middleware_automation.keycloak 4.5.0
Controls the HTTP connections timeout period (in seconds) to Keycloak API.
-Default: :ansible-option-default:`10`
+Default:
10
@@ -525,8 +526,8 @@ @@ -485,8 +486,8 @@If enabled, users have to consent to client access. This is ‘consentRequired’ in the Keycloak REST API.
Choices:
@@ -537,8 +538,8 @@ Are direct access grants enabled for this client or not (OpenID connect). This is ‘directAccessGrantsEnabled’ in the Keycloak REST API.
Choices:
@@ -551,8 +552,8 @@ Is this client enabled or not?
Choices:
@@ -565,8 +566,8 @@ Is frontchannel logout enabled for this client or not. This is ‘frontchannelLogout’ in the Keycloak REST API.
Choices:
@@ -576,7 +577,7 @@ Is the “Full Scope Allowed” feature set for this client or not. This is ‘fullScopeAllowed’ in the Keycloak REST API.
Choices:
added in middleware_automation.keycloak 5.4.0
Configures the HTTP User-Agent header.
-Default: :ansible-option-default:`"Ansible"`
+Default:
"Ansible"
@@ -642,8 +643,8 @@ @@ -595,8 +596,8 @@Enable implicit flow for this client or not (OpenID connect). This is ‘implicitFlowEnabled’ in the Keycloak REST API.
Choices:
@@ -672,8 +673,8 @@ Type of client (either
openid-connect
orsaml
.Choices:
-
- -
- +
- +
"openid-connect"
"saml"
@@ -709,8 +710,8 @@ Specifies whether a user needs to provide consent to a client for this mapper to be active.
Choices:
@@ -754,8 +755,8 @@ This is either
openid-connect
orsaml
, this specifies for which protocol this protocol mapper. is active.Choices:
-
- -
- +
- +
"openid-connect"
"saml"
@@ -764,7 +765,7 @@ Is the access type for this client public or not. This is ‘publicClient’ in the Keycloak REST API.
Choices:
string
@@ -833,8 +834,8 @@ @@ -819,8 +820,8 @@Are service accounts enabled for this client or not (OpenID connect). This is ‘serviceAccountsEnabled’ in the Keycloak REST API.
Choices:
@@ -847,8 +848,8 @@ Enable standard flow for this client or not (OpenID connect). This is ‘standardFlowEnabled’ in the Keycloak REST API.
Choices:
On
absent
, the client will be removed if it existsChoices:
-
@@ -861,8 +862,8 @@- -
:ansible-option-choices-entry-default:`"present"` ← (default)
- +
- +
"present"
← (default)
"absent"
@@ -883,8 +884,8 @@ Whether or not surrogate auth is required. This is ‘surrogateAuthRequired’ in the Keycloak REST API.
Choices:
@@ -897,8 +898,8 @@ Whether or not to use configuration from the client_template. This is ‘useTemplateConfig’ in the Keycloak REST API.
Choices:
@@ -911,8 +912,8 @@ Whether or not to use mapper configuration from the client_template. This is ‘useTemplateMappers’ in the Keycloak REST API.
Choices:
@@ -923,8 +924,8 @@ Whether or not to use scope configuration from the client_template. This is ‘useTemplateScope’ in the Keycloak REST API.
Choices:
@@ -941,7 +942,7 @@ Verify TLS certificates (do not disable this in production).
Choices:
-
- -
- +
:ansible-option-choices-entry-default:`true` ← (default)
- +
false
true
← (default)- Attributes
+Attributes
@@ -970,7 +971,7 @@ Attribute
- Examples
+Examples
- name: Create or update Keycloak client (minimal example), authentication with credentials middleware_automation.keycloak.keycloak_client: auth_keycloak_url: https://auth.example.com/auth @@ -1098,7 +1099,7 @@- Return Values
+Return Values
Common return values are documented here, the following are the fields unique to this module:
@@ -1113,7 +1114,7 @@
Representation of client after module execution (sample is truncated).
Returned: on success
- +Sample:
{"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}}
@@ -1122,7 +1123,7 @@Representation of existing client (sample is truncated).
Returned: always
- +Sample:
{"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}}
@@ -1131,7 +1132,7 @@Message as to what action was taken.
Returned: always
-Sample: :ansible-rv-sample-value:`"Client testclient has been updated"`
+Sample:
"Client testclient has been updated"
@@ -1140,13 +1141,13 @@Representation of proposed client.
Returned: always
-Sample: :ansible-rv-sample-value:`{"clientId": "test"}`
+Sample:
{"clientId": "test"}