* web: Add InvalidationFlow to Radius Provider dialogues
## What
- Bugfix: adds the InvalidationFlow to the Radius Provider dialogues
- Repairs: `{"invalidation_flow":["This field is required."]}` message, which was *not* propagated
to the Notification.
- Nitpick: Pretties `?foo=${true}` expressions: `s/\?([^=]+)=\$\{true\}/\1/`
## Note
Yes, I know I'm going to have to do more magic when we harmonize the forms, and no, I didn't add the
Property Mappings to the wizard, and yes, I know I'm going to have pain with the *new* version of
the wizard. But this is a serious bug; you can't make Radius servers with *either* of the current
dialogues at the moment.
* This (temporary) change is needed to prevent the unit tests from failing.
\# What
\# Why
\# How
\# Designs
\# Test Steps
\# Other Notes
* Revert "This (temporary) change is needed to prevent the unit tests from failing."
This reverts commit dddde09be5.
* web/maintenance: correct the usage of boolean (false) attributes
## What
Just cleaning up a bad habit; we have a lot of `?attribute=${true|false}` (or, more alarmingly,
`.attribute=${true|false}`. These should just be `attribute` or be missing; anything else is
unnecessary.
Where the attribute is `true` by default, no changes have been made; there are only a few of them,
and they require re-working of the logic to assist with the changes. Booleans should never be `true` by
default, and if you absolutely cannot find an alternative phrasing that makes having them be `false`
by default a valid choice, they should be `reflect: true` to make their presence visible to screen
readers and debuggers.
## Why
Removing non-standard HTML uses from web components matches our programming standards and is an
important step toward the Authentik Elements NPM package, as well as the Schema-Driven Forms update.
## Boring excessive detail.
Because there are literally hundreds of changes, I've documented the boring ones here.
Changes that do *not* meet the basic criteria of "made the component comply with the standards" are
commented in the PR.
Here are all the Boolean property declarations in the system, delta the ones that declare `= true`;
those are documented at the bottom of this commit, and are not addressed in this PR. This
information is included to guide your decision making. The second block, below, documents the
actual changes made to component declarations throughout our code. The third block, at the bottom,
documents changes not made due to logic and effort constraints.
```
components/ak-switch-input.ts:
@property({ type: Boolean })
checked: boolean = false;
--
components/ak-switch-input.ts:
@property({ type: Boolean })
required = false;
--
components/ak-file-input.ts:
@property({ type: Boolean })
required = false;
--
components/HorizontalLightComponent.ts:
@property({ type: Boolean })
required = false;
--
components/ak-multi-select.ts:
@property({ type: Boolean })
required = false;
--
elements/TreeView.ts:
@property({ type: Boolean })
open = false;
--
components/ak-status-label.ts:
@property({ type: Boolean })
good = false;
--
components/ak-status-label.ts:
@property({ type: Boolean })
compact = false;
--
elements/CodeMirror.ts:
@property({ type: Boolean })
readOnly = false;
--
elements/buttons/ModalButton.ts:
@property({ type: Boolean })
open = false;
--
elements/EmptyState.ts:
@property({ type: Boolean })
fullHeight = false;
--
elements/Tabs.ts:
@property({ type: Boolean })
vertical = false;
--
elements/ak-checkbox-group/ak-checkbox-group.ts:
@property({ type: Boolean })
required = false;
--
elements/Label.ts:
@property({ type: Boolean })
compact = false;
--
elements/forms/FormGroup.ts:
@property({ type: Boolean, reflect: true })
expanded = false;
--
elements/Expand.ts:
@property({ type: Boolean })
expanded = false;
--
elements/forms/HorizontalFormElement.ts:
@property({ type: Boolean })
required = false;
--
elements/forms/HorizontalFormElement.ts:
@property({ type: Boolean })
slugMode = false;
--
elements/forms/SearchSelect/ak-portal.ts:
@property({ type: Boolean, reflect: true })
open = false;
--
elements/Alert.ts:
@property({ type: Boolean })
inline = false;
--
elements/forms/SearchSelect/ak-search-select-view.ts:
@property({ type: Boolean, reflect: true })
open = false;
--
elements/forms/SearchSelect/ak-search-select-view.ts:
@property({ type: Boolean })
blankable = false;
--
elements/sidebar/SidebarItem.ts:
@property({ type: Boolean })
expanded = false;
--
admin/stages/StageWizard.ts:
@property({ type: Boolean })
showBindingPage = false;
--
elements/forms/FormElement.ts:
@property({ type: Boolean })
required = false;
--
admin/common/ak-flow-search/FlowSearch.ts:
@property({ type: Boolean })
required?: boolean = false;
--
admin/applications/ProviderSelectModal.ts:
@property({ type: Boolean })
backchannel = false;
--
elements/forms/SearchSelect/SearchSelect.ts:
@property({ type: Boolean })
blankable = false;
--
admin/applications/components/ak-provider-search-input.ts:
@property({ type: Boolean })
required = false;
--
admin/applications/components/ak-provider-search-input.ts:
@property({ type: Boolean })
blankable = false;
--
admin/applications/components/ak-backchannel-input.ts:
@property({ type: Boolean })
required = false;
--
admin/policies/PolicyWizard.ts:
@property({ type: Boolean })
showBindingPage = false;
```
The attribute 'required' is an HTML native, and is false by default.
Here are all the change pairs around HTML attrbutes:
```
$ git diff | rg -A 1 '\?(backchannel|blankable|checked|compact|expanded|fullHeight|good|inline|open|readOnly|required|showBindingPage|slugMode|vertical)\b'
- ?required=${true}
+ required
- <ak-provider-select-table ?backchannel=${true} .confirm=${this.confirm}>
+ <ak-provider-select-table backchannel .confirm=${this.confirm}>
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${false}
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} name="name" ?required=${true}>
+ return html` <ak-form-element-horizontal label=${msg("Name")} name="name" required>
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Severity")} ?required=${true} name="severity">
+ <ak-form-element-horizontal label=${msg("Severity")} required name="severity">
- ?showBindingPage=${true}
+ showBindingPage
- ?showBindingPage=${true}
+ showBindingPage
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Title")} ?required=${true} name="title">
+ <ak-form-element-horizontal label=${msg("Title")} required name="title">
- <ak-form-element-horizontal label=${msg("Slug")} ?required=${true} name="slug">
+ <ak-form-element-horizontal label=${msg("Slug")} required name="slug">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Stage")} ?required=${true} name="stage">
+ <ak-form-element-horizontal label=${msg("Stage")} required name="stage">
- <ak-form-element-horizontal label=${msg("Order")} ?required=${true} name="order">
+ <ak-form-element-horizontal label=${msg("Order")} required name="order">
- ?required=${true}
+ required
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Type")} ?required=${true} name="type">
+ <ak-form-element-horizontal label=${msg("Type")} required name="type">
- ?blankable=${true}
+ blankable
- <ak-label color=${PFColor.Green} ?compact=${true}>
+ <ak-label color=${PFColor.Green} compact>
- ? html`<ak-label color=${PFColor.Red} ?compact=${true}
+ ? html`<ak-label color=${PFColor.Red} compact
- : html`<ak-label color=${PFColor.Green} ?compact=${true}
+ : html`<ak-label color=${PFColor.Green} compact
- ? html`<ak-label color=${PFColor.Orange} ?compact=${true}>
+ ? html`<ak-label color=${PFColor.Orange} compact>
- : html`<ak-label color=${PFColor.Green} ?compact=${true}>
+ : html`<ak-label color=${PFColor.Green} compact>
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Docker URL")} ?required=${true} name="url">
+ <ak-form-element-horizontal label=${msg("Docker URL")} required name="url">
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?showBindingPage=${true}
+ showBindingPage
- ?showBindingPage=${true}
+ showBindingPage
- ?blankable=${true}
+ blankable
- ?blankable=${true}
+ blankable
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Order")} ?required=${true} name="order">
+ <ak-form-element-horizontal label=${msg("Order")} required name="order">
- <ak-form-element-horizontal label=${msg("Timeout")} ?required=${true} name="timeout">
+ <ak-form-element-horizontal label=${msg("Timeout")} required name="timeout">
- ? html`<ak-label color=${PFColor.Green} ?compact=${true}>
+ ? html`<ak-label color=${PFColor.Green} compact>
- : html`<ak-label color=${PFColor.Orange} ?compact=${true}>
+ : html`<ak-label color=${PFColor.Orange} compact>
- return html`<ak-form-element-horizontal label=${msg("User")} ?required=${true} name="user">
+ return html`<ak-form-element-horizontal label=${msg("User")} required name="user">
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?blankable=${true}
+ blankable
- ?blankable=${true}
+ blankable
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?readOnly=${true}
+ readOnly
- return html`<ak-empty-state loading ?fullHeight=${true}></ak-empty-state>`;
+ return html`<ak-empty-state loading fullHeight></ak-empty-state>`;
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- ?blankable=${true}
+ blankable
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- ?blankable=${true}
+ blankable
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Name")} name="name" ?required=${true}>
+ <ak-form-element-horizontal label=${msg("Name")} name="name" required>
- <ak-form-element-horizontal label=${msg("Protocol")} ?required=${true} name="protocol">
+ <ak-form-element-horizontal label=${msg("Protocol")} required name="protocol">
- <ak-form-element-horizontal label=${msg("Host")} name="host" ?required=${true}>
+ <ak-form-element-horizontal label=${msg("Host")} name="host" required>
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${false}
- ?blankable=${true}
+ blankable
- ?blankable=${true}
+ blankable
- return html`<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html`<ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?readOnly=${true}
+ readOnly
- ?blankable=${true}
+ blankable
- return html`<ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html`<ak-form-element-horizontal label=${msg("Name")} required name="name">
- : html`<ak-label color=${PFColor.Orange} ?compact=${true}>
+ : html`<ak-label color=${PFColor.Orange} compact>
- <ak-label color=${PFColor.Grey} ?compact=${true}> ${msg("Built-in")}</ak-label>
+ <ak-label color=${PFColor.Grey} compact> ${msg("Built-in")}</ak-label>
- return html`<ak-empty-state loading ?fullHeight=${true}></ak-empty-state>`;
+ return html`<ak-empty-state loading fullHeight></ak-empty-state>`;
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-group ?expanded=${false}>
+ <ak-form-group>
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Slug")} ?required=${true} name="slug">
+ <ak-form-element-horizontal label=${msg("Slug")} required name="slug">
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Slug")} ?required=${true} name="slug">
+ <ak-form-element-horizontal label=${msg("Slug")} required name="slug">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Slug")} ?required=${true} name="slug">
+ <ak-form-element-horizontal label=${msg("Slug")} required name="slug">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Slug")} ?required=${true} name="slug">
+ <ak-form-element-horizontal label=${msg("Slug")} required name="slug">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- ?required=${true}
+ required
- ?readOnly=${true}
+ readOnly
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Slug")} ?required=${true} name="slug">
+ <ak-form-element-horizontal label=${msg("Slug")} required name="slug">
- <ak-form-group ?expanded=${true}>
+ <ak-form-group expanded>
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("SMTP Host")} ?required=${true} name="host">
+ <ak-form-element-horizontal label=${msg("SMTP Host")} required name="host">
- <ak-form-element-horizontal label=${msg("SMTP Port")} ?required=${true} name="port">
+ <ak-form-element-horizontal label=${msg("SMTP Port")} required name="port">
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-alert ?inline=${true}>
+ <ak-alert inline>
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Mode")} ?required=${true} name="mode">
+ <ak-form-element-horizontal label=${msg("Mode")} required name="mode">
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("SMTP Host")} ?required=${true} name="host">
+ <ak-form-element-horizontal label=${msg("SMTP Host")} required name="host">
- <ak-form-element-horizontal label=${msg("SMTP Port")} ?required=${true} name="port">
+ <ak-form-element-horizontal label=${msg("SMTP Port")} required name="port">
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?slugMode=${true}
+ slugMode
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Expires")} ?required=${true} name="expires">
+ <ak-form-element-horizontal label=${msg("Expires")} required name="expires">
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Field Key")} ?required=${true} name="fieldKey">
+ <ak-form-element-horizontal label=${msg("Field Key")} required name="fieldKey">
- <ak-form-element-horizontal label=${msg("Label")} ?required=${true} name="label">
+ <ak-form-element-horizontal label=${msg("Label")} required name="label">
- <ak-form-element-horizontal label=${msg("Type")} ?required=${true} name="type">
+ <ak-form-element-horizontal label=${msg("Type")} required name="type">
- <ak-form-element-horizontal label=${msg("Order")} ?required=${true} name="order">
+ <ak-form-element-horizontal label=${msg("Order")} required name="order">
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Source")} ?required=${true} name="source">
+ <ak-form-element-horizontal label=${msg("Source")} required name="source">
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
- <ak-alert ?inline=${true}>
+ <ak-alert inline>
- ?required=${true}
+ required
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?blankable=${true}
+ blankable
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("User")} ?required=${true} name="user">
+ <ak-form-element-horizontal label=${msg("User")} required name="user">
- <ak-form-element-horizontal label=${msg("Intent")} ?required=${true} name="intent">
+ <ak-form-element-horizontal label=${msg("Intent")} required name="intent">
- ?required=${true}
+ required
- <input class="pf-c-switch__input" type="checkbox" ?checked=${true} />
+ <input class="pf-c-switch__input" type="checkbox" checked />
- <input class="pf-c-switch__input" type="checkbox" ?checked=${true} />
+ <input class="pf-c-switch__input" type="checkbox" checked />
- ?required=${true}
+ required
- <ak-form-element-horizontal label=${msg("User type")} ?required=${true} name="type">
+ <ak-form-element-horizontal label=${msg("User type")} required name="type">
- <ak-form-element-horizontal label=${msg("Path")} ?required=${true} name="path">
+ <ak-form-element-horizontal label=${msg("Path")} required name="path">
- ?required=${true}
+ required
- ?required=${true}
+ required
- <ak-tabs pageIdentifier="userCredentialsTokens" ?vertical=${true}>
+ <ak-tabs pageIdentifier="userCredentialsTokens" vertical>
- <ak-status-label ?good=${true}></ak-status-label>
+ <ak-status-label good></ak-status-label>
- ?open=${true}
+ open
- ?blankable=${true}
+ blankable
- <ak-tabs ?vertical="${true}">
+ <ak-tabs vertical>
- return html` <ak-form-element-horizontal label=${msg("Name")} ?required=${true} name="name">
+ return html` <ak-form-element-horizontal label=${msg("Name")} required name="name">
- ?required=${true}
+ required
```
The following issues are the `true` by default Booleans. As mentioned, these are **not addressed** by this PR.
```
elements/table/Table.ts::
@property({ type: Boolean })
paginated = true;
elements/forms/ModalForm.ts::
@property({ type: Boolean })
closeAfterSuccessfulSubmit = true;
elements/forms/ModalForm.ts::
@property({ type: Boolean })
showSubmitButton = true;
elements/CodeMirror.ts::
@property({ type: Boolean })
parseValue = true;
elements/LoadingOverlay.ts::
@property({ type: Boolean })
loading = true;
admin/stages/authenticator_validate/AuthenticatorValidateStageForm.ts::
@property({ type: Boolean })
showConfigurationStages = true;
elements/user/sources/SourceSettings.ts::
@property({ type: Boolean })
canConnect = true;
admin/outposts/OutpostHealthSimple.ts::
@property({ attribute: false })
showVersion = true;
elements/wizard/Wizard.ts::
@property({ type: Boolean })
canCancel = true;
elements/wizard/Wizard.ts::
@property({ type: Boolean })
canBack = true;
```
* Prettier had opinions.
* Caught during code review.
* Merged incorrectly; not sure what went wrong, but this re-applies the removal of the syntax from the current LDAPSourceForm.ts from to this branch.
340 lines
15 KiB
TypeScript
340 lines
15 KiB
TypeScript
import "@goauthentik/admin/common/ak-crypto-certificate-search";
|
|
import "@goauthentik/admin/common/ak-flow-search/ak-flow-search";
|
|
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
|
|
import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-provider.js";
|
|
import "@goauthentik/elements/forms/FormGroup";
|
|
import "@goauthentik/elements/forms/HorizontalFormElement";
|
|
import "@goauthentik/elements/forms/Radio";
|
|
import "@goauthentik/elements/forms/SearchSelect";
|
|
import "@goauthentik/elements/utils/TimeDeltaHelp";
|
|
|
|
import { msg } from "@lit/localize";
|
|
import { html, nothing } from "lit";
|
|
import { ifDefined } from "lit/directives/if-defined.js";
|
|
|
|
import {
|
|
FlowsInstancesListDesignationEnum,
|
|
PropertymappingsApi,
|
|
PropertymappingsProviderSamlListRequest,
|
|
SAMLPropertyMapping,
|
|
SAMLProvider,
|
|
SpBindingEnum,
|
|
ValidationError,
|
|
} from "@goauthentik/api";
|
|
|
|
import { propertyMappingsProvider, propertyMappingsSelector } from "./SAMLProviderFormHelpers.js";
|
|
import { digestAlgorithmOptions, signatureAlgorithmOptions } from "./SAMLProviderOptions";
|
|
|
|
const serviceProviderBindingOptions = [
|
|
{
|
|
label: msg("Redirect"),
|
|
value: SpBindingEnum.Redirect,
|
|
default: true,
|
|
},
|
|
{
|
|
label: msg("Post"),
|
|
value: SpBindingEnum.Post,
|
|
},
|
|
];
|
|
|
|
function renderHasSigningKp(provider?: Partial<SAMLProvider>) {
|
|
return html` <ak-switch-input
|
|
name="signAssertion"
|
|
label=${msg("Sign assertions")}
|
|
?checked=${provider?.signAssertion ?? true}
|
|
help=${msg("When enabled, the assertion element of the SAML response will be signed.")}
|
|
>
|
|
</ak-switch-input>
|
|
|
|
<ak-switch-input
|
|
name="signResponse"
|
|
label=${msg("Sign responses")}
|
|
?checked=${provider?.signResponse ?? false}
|
|
help=${msg("When enabled, the SAML response will be signed.")}
|
|
>
|
|
</ak-switch-input>`;
|
|
}
|
|
|
|
export function renderForm(
|
|
provider: Partial<SAMLProvider> = {},
|
|
errors: ValidationError,
|
|
setHasSigningKp: (ev: InputEvent) => void,
|
|
hasSigningKp: boolean,
|
|
) {
|
|
return html` <ak-text-input
|
|
name="name"
|
|
value=${ifDefined(provider?.name)}
|
|
label=${msg("Name")}
|
|
required
|
|
.errorMessages=${errors?.name ?? []}
|
|
></ak-text-input>
|
|
<ak-form-element-horizontal
|
|
name="authorizationFlow"
|
|
label=${msg("Authorization flow")}
|
|
required
|
|
>
|
|
<ak-flow-search
|
|
flowType=${FlowsInstancesListDesignationEnum.Authorization}
|
|
.currentFlow=${provider?.authorizationFlow}
|
|
required
|
|
.errorMessages=${errors?.authorizationFlow ?? []}
|
|
></ak-flow-search>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg("Flow used when authorizing this provider.")}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
|
|
<ak-form-group expanded>
|
|
<span slot="header"> ${msg("Protocol settings")} </span>
|
|
<div slot="body" class="pf-c-form">
|
|
<ak-text-input
|
|
name="acsUrl"
|
|
label=${msg("ACS URL")}
|
|
value="${ifDefined(provider?.acsUrl)}"
|
|
required
|
|
.errorMessages=${errors?.acsUrl ?? []}
|
|
></ak-text-input>
|
|
<ak-text-input
|
|
label=${msg("Issuer")}
|
|
name="issuer"
|
|
value="${provider?.issuer || "authentik"}"
|
|
required
|
|
.errorMessages=${errors?.issuer ?? []}
|
|
help=${msg("Also known as EntityID.")}
|
|
></ak-text-input>
|
|
<ak-radio-input
|
|
label=${msg("Service Provider Binding")}
|
|
name="spBinding"
|
|
required
|
|
.options=${serviceProviderBindingOptions}
|
|
.value=${provider?.spBinding}
|
|
help=${msg(
|
|
"Determines how authentik sends the response back to the Service Provider.",
|
|
)}
|
|
>
|
|
</ak-radio-input>
|
|
<ak-text-input
|
|
name="audience"
|
|
label=${msg("Audience")}
|
|
value="${ifDefined(provider?.audience)}"
|
|
.errorMessages=${errors?.audience ?? []}
|
|
></ak-text-input>
|
|
</div>
|
|
</ak-form-group>
|
|
|
|
<ak-form-group>
|
|
<span slot="header"> ${msg("Advanced flow settings")} </span>
|
|
<div slot="body" class="pf-c-form">
|
|
<ak-form-element-horizontal
|
|
label=${msg("Authentication flow")}
|
|
name="authenticationFlow"
|
|
>
|
|
<ak-flow-search
|
|
flowType=${FlowsInstancesListDesignationEnum.Authentication}
|
|
.currentFlow=${provider?.authenticationFlow}
|
|
></ak-flow-search>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg(
|
|
"Flow used when a user access this provider and is not authenticated.",
|
|
)}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
<ak-form-element-horizontal
|
|
label=${msg("Invalidation flow")}
|
|
name="invalidationFlow"
|
|
required
|
|
>
|
|
<ak-flow-search
|
|
flowType=${FlowsInstancesListDesignationEnum.Invalidation}
|
|
.currentFlow=${provider?.invalidationFlow}
|
|
defaultFlowSlug="default-provider-invalidation-flow"
|
|
required
|
|
></ak-flow-search>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg("Flow used when logging out of this provider.")}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
</div>
|
|
</ak-form-group>
|
|
|
|
<ak-form-group>
|
|
<span slot="header"> ${msg("Advanced protocol settings")} </span>
|
|
<div slot="body" class="pf-c-form">
|
|
<ak-form-element-horizontal label=${msg("Signing Certificate")} name="signingKp">
|
|
<ak-crypto-certificate-search
|
|
.certificate=${provider?.signingKp}
|
|
@input=${setHasSigningKp}
|
|
></ak-crypto-certificate-search>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg(
|
|
"Certificate used to sign outgoing Responses going to the Service Provider.",
|
|
)}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
${hasSigningKp ? renderHasSigningKp(provider) : nothing}
|
|
|
|
<ak-form-element-horizontal
|
|
label=${msg("Verification Certificate")}
|
|
name="verificationKp"
|
|
>
|
|
<ak-crypto-certificate-search
|
|
.certificate=${provider?.verificationKp}
|
|
nokey
|
|
></ak-crypto-certificate-search>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg(
|
|
"When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default.",
|
|
)}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
<ak-form-element-horizontal
|
|
label=${msg("Encryption Certificate")}
|
|
name="encryptionKp"
|
|
>
|
|
<ak-crypto-certificate-search
|
|
.certificate=${provider?.encryptionKp}
|
|
></ak-crypto-certificate-search>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg("When selected, assertions will be encrypted using this keypair.")}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
<ak-form-element-horizontal
|
|
label=${msg("Property mappings")}
|
|
name="propertyMappings"
|
|
>
|
|
<ak-dual-select-dynamic-selected
|
|
.provider=${propertyMappingsProvider}
|
|
.selector=${propertyMappingsSelector(provider?.propertyMappings)}
|
|
available-label=${msg("Available User Property Mappings")}
|
|
selected-label=${msg("Selected User Property Mappings")}
|
|
></ak-dual-select-dynamic-selected>
|
|
</ak-form-element-horizontal>
|
|
<ak-form-element-horizontal
|
|
label=${msg("NameID Property Mapping")}
|
|
name="nameIdMapping"
|
|
>
|
|
<ak-search-select
|
|
.fetchObjects=${async (query?: string): Promise<SAMLPropertyMapping[]> => {
|
|
const args: PropertymappingsProviderSamlListRequest = {
|
|
ordering: "saml_name",
|
|
};
|
|
if (query !== undefined) {
|
|
args.search = query;
|
|
}
|
|
const items = await new PropertymappingsApi(
|
|
DEFAULT_CONFIG,
|
|
).propertymappingsProviderSamlList(args);
|
|
return items.results;
|
|
}}
|
|
.renderElement=${(item: SAMLPropertyMapping): string => {
|
|
return item.name;
|
|
}}
|
|
.value=${(item: SAMLPropertyMapping | undefined): string | undefined => {
|
|
return item?.pk;
|
|
}}
|
|
.selected=${(item: SAMLPropertyMapping): boolean => {
|
|
return provider?.nameIdMapping === item.pk;
|
|
}}
|
|
blankable
|
|
>
|
|
</ak-search-select>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg(
|
|
"Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected.",
|
|
)}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
<ak-form-element-horizontal
|
|
label=${msg("AuthnContextClassRef Property Mapping")}
|
|
name="authnContextClassRefMapping"
|
|
>
|
|
<ak-search-select
|
|
.fetchObjects=${async (query?: string): Promise<SAMLPropertyMapping[]> => {
|
|
const args: PropertymappingsProviderSamlListRequest = {
|
|
ordering: "saml_name",
|
|
};
|
|
if (query !== undefined) {
|
|
args.search = query;
|
|
}
|
|
const items = await new PropertymappingsApi(
|
|
DEFAULT_CONFIG,
|
|
).propertymappingsProviderSamlList(args);
|
|
return items.results;
|
|
}}
|
|
.renderElement=${(item: SAMLPropertyMapping): string => {
|
|
return item.name;
|
|
}}
|
|
.value=${(item: SAMLPropertyMapping | undefined): string | undefined => {
|
|
return item?.pk;
|
|
}}
|
|
.selected=${(item: SAMLPropertyMapping): boolean => {
|
|
return provider?.authnContextClassRefMapping === item.pk;
|
|
}}
|
|
blankable
|
|
>
|
|
</ak-search-select>
|
|
<p class="pf-c-form__helper-text">
|
|
${msg(
|
|
"Configure how the AuthnContextClassRef value will be created. When left empty, the AuthnContextClassRef will be set based on which authentication methods the user used to authenticate.",
|
|
)}
|
|
</p>
|
|
</ak-form-element-horizontal>
|
|
|
|
<ak-text-input
|
|
name="assertionValidNotBefore"
|
|
label=${msg("Assertion valid not before")}
|
|
value="${provider?.assertionValidNotBefore || "minutes=-5"}"
|
|
required
|
|
.errorMessages=${errors?.assertionValidNotBefore ?? []}
|
|
help=${msg("Configure the maximum allowed time drift for an assertion.")}
|
|
></ak-text-input>
|
|
|
|
<ak-text-input
|
|
name="assertionValidNotOnOrAfter"
|
|
label=${msg("Assertion valid not on or after")}
|
|
value="${provider?.assertionValidNotOnOrAfter || "minutes=5"}"
|
|
required
|
|
.errorMessages=${errors?.assertionValidNotBefore ?? []}
|
|
help=${msg("Assertion not valid on or after current time + this value.")}
|
|
></ak-text-input>
|
|
|
|
<ak-text-input
|
|
name="sessionValidNotOnOrAfter"
|
|
label=${msg("Session valid not on or after")}
|
|
value="${provider?.sessionValidNotOnOrAfter || "minutes=86400"}"
|
|
required
|
|
.errorMessages=${errors?.sessionValidNotOnOrAfter ?? []}
|
|
help=${msg("Session not valid on or after current time + this value.")}
|
|
></ak-text-input>
|
|
|
|
<ak-text-input
|
|
name="defaultRelayState"
|
|
label=${msg("Default relay state")}
|
|
value="${provider?.defaultRelayState || ""}"
|
|
.errorMessages=${errors?.sessionValidNotOnOrAfter ?? []}
|
|
help=${msg(
|
|
"When using IDP-initiated logins, the relay state will be set to this value.",
|
|
)}
|
|
></ak-text-input>
|
|
|
|
<ak-radio-input
|
|
name="digestAlgorithm"
|
|
label=${msg("Digest algorithm")}
|
|
.options=${digestAlgorithmOptions}
|
|
.value=${provider?.digestAlgorithm}
|
|
required
|
|
>
|
|
</ak-radio-input>
|
|
|
|
<ak-radio-input
|
|
name="signatureAlgorithm"
|
|
label=${msg("Signature algorithm")}
|
|
.options=${signatureAlgorithmOptions}
|
|
.value=${provider?.signatureAlgorithm}
|
|
required
|
|
>
|
|
</ak-radio-input>
|
|
</div>
|
|
</ak-form-group>`;
|
|
}
|