add web stage for session end
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
parent
f28b18805f
commit
09c08a6090
|
@ -121,15 +121,19 @@ class FlowErrorChallenge(Challenge):
|
||||||
class AccessDeniedChallenge(WithUserInfoChallenge):
|
class AccessDeniedChallenge(WithUserInfoChallenge):
|
||||||
"""Challenge when a flow's active stage calls `stage_invalid()`."""
|
"""Challenge when a flow's active stage calls `stage_invalid()`."""
|
||||||
|
|
||||||
error_message = CharField(required=False)
|
|
||||||
component = CharField(default="ak-stage-access-denied")
|
component = CharField(default="ak-stage-access-denied")
|
||||||
|
|
||||||
|
error_message = CharField(required=False)
|
||||||
|
|
||||||
|
|
||||||
class SessionEndChallenge(WithUserInfoChallenge):
|
class SessionEndChallenge(WithUserInfoChallenge):
|
||||||
"""Challenge for ending a session"""
|
"""Challenge for ending a session"""
|
||||||
|
|
||||||
component = CharField(default="ak-stage-session-end")
|
component = CharField(default="ak-stage-session-end")
|
||||||
|
|
||||||
|
application_name = CharField(required=True)
|
||||||
|
application_launch_url = CharField(required=False)
|
||||||
|
|
||||||
|
|
||||||
class PermissionDict(TypedDict):
|
class PermissionDict(TypedDict):
|
||||||
"""Consent Permission"""
|
"""Consent Permission"""
|
||||||
|
|
|
@ -40927,7 +40927,12 @@ components:
|
||||||
type: string
|
type: string
|
||||||
pending_user_avatar:
|
pending_user_avatar:
|
||||||
type: string
|
type: string
|
||||||
|
application_name:
|
||||||
|
type: string
|
||||||
|
application_launch_url:
|
||||||
|
type: string
|
||||||
required:
|
required:
|
||||||
|
- application_name
|
||||||
- pending_user
|
- pending_user
|
||||||
- pending_user_avatar
|
- pending_user_avatar
|
||||||
- type
|
- type
|
||||||
|
|
|
@ -392,6 +392,12 @@ export class FlowExecutor extends Interface implements StageHost {
|
||||||
.host=${this as StageHost}
|
.host=${this as StageHost}
|
||||||
.challenge=${this.challenge}
|
.challenge=${this.challenge}
|
||||||
></ak-flow-provider-oauth2-code-finish>`;
|
></ak-flow-provider-oauth2-code-finish>`;
|
||||||
|
case "ak-stage-session-end":
|
||||||
|
await import("@goauthentik/flow/providers/SessionEnd");
|
||||||
|
return html`<ak-stage-session-end
|
||||||
|
.host=${this as StageHost}
|
||||||
|
.challenge=${this.challenge}
|
||||||
|
></ak-stage-session-end>`;
|
||||||
// Internal stages
|
// Internal stages
|
||||||
case "ak-stage-flow-error":
|
case "ak-stage-flow-error":
|
||||||
return html`<ak-stage-flow-error
|
return html`<ak-stage-flow-error
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
import { rootInterface } from "@goauthentik/elements/Base";
|
||||||
|
import { BaseStage } from "@goauthentik/flow/stages/base";
|
||||||
|
|
||||||
|
import { t } from "@lingui/macro";
|
||||||
|
|
||||||
|
import { CSSResult, TemplateResult, html } from "lit";
|
||||||
|
import { customElement } from "lit/decorators";
|
||||||
|
|
||||||
|
import PFButton from "@patternfly/patternfly/components/Button/button.css";
|
||||||
|
import PFForm from "@patternfly/patternfly/components/Form/form.css";
|
||||||
|
import PFFormControl from "@patternfly/patternfly/components/FormControl/form-control.css";
|
||||||
|
import PFLogin from "@patternfly/patternfly/components/Login/login.css";
|
||||||
|
import PFTitle from "@patternfly/patternfly/components/Title/title.css";
|
||||||
|
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||||
|
|
||||||
|
import { SessionEndChallenge } from "@goauthentik/api";
|
||||||
|
|
||||||
|
@customElement("ak-stage-session-end")
|
||||||
|
export class SessionEnd extends BaseStage<SessionEndChallenge, unknown> {
|
||||||
|
static get styles(): CSSResult[] {
|
||||||
|
return [PFBase, PFLogin, PFForm, PFFormControl, PFTitle, PFButton];
|
||||||
|
}
|
||||||
|
|
||||||
|
render(): TemplateResult {
|
||||||
|
if (!this.challenge) {
|
||||||
|
return html`<ak-empty-state ?loading="${true}" header=${t`Loading`}> </ak-empty-state>`;
|
||||||
|
}
|
||||||
|
const tenant = rootInterface()?.tenant;
|
||||||
|
return html`<header class="pf-c-login__main-header">
|
||||||
|
<h1 class="pf-c-title pf-m-3xl">${this.challenge.flowInfo?.title}</h1>
|
||||||
|
</header>
|
||||||
|
<div class="pf-c-login__main-body">
|
||||||
|
<form class="pf-c-form">
|
||||||
|
<p>
|
||||||
|
${t`You've logged out of ${this.challenge.applicationName}. You can go back to the overview to launch another application, or log out of your authentik account.`}
|
||||||
|
</p>
|
||||||
|
<a href="/" class="pf-c-button pf-m-primary"> ${t`Go back to overview`} </a>
|
||||||
|
${tenant && tenant.flowInvalidation
|
||||||
|
? html`
|
||||||
|
<!-- TODO: don't construct URL here -->
|
||||||
|
<a
|
||||||
|
href="/if/flow/${tenant.flowInvalidation}/"
|
||||||
|
class="pf-c-button pf-m-secondary"
|
||||||
|
>
|
||||||
|
${t`Log out of ${tenant.brandingTitle}`}
|
||||||
|
</a>
|
||||||
|
`
|
||||||
|
: html``}
|
||||||
|
${this.challenge.applicationLaunchUrl
|
||||||
|
? html`
|
||||||
|
<a
|
||||||
|
href="${this.challenge.applicationLaunchUrl}"
|
||||||
|
class="pf-c-button pf-m-secondary"
|
||||||
|
>
|
||||||
|
${t`Log back into ${this.challenge.applicationName}`}
|
||||||
|
</a>
|
||||||
|
`
|
||||||
|
: html``}
|
||||||
|
</form>
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue