Compare commits
	
		
			30 Commits
		
	
	
		
			dependabot
			...
			web/config
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 79da411f10 | |||
| ce761c4337 | |||
| 0d3025794c | |||
| 79601f6d66 | |||
| 1ec0623ab6 | |||
| 4bf151cfc2 | |||
| 6752d19375 | |||
| 284c2327c6 | |||
| 600c3caa62 | |||
| 366d48eddb | |||
| e67a290b73 | |||
| 4456f085d3 | |||
| 53e982594e | |||
| def988c3b1 | |||
| e164661321 | |||
| 849fea6e91 | |||
| 24278d0781 | |||
| 8c6f83b88e | |||
| fc80596432 | |||
| 03fde51313 | |||
| f669222529 | |||
| 297c29b231 | |||
| 21b50838db | |||
| d2a9b2a343 | |||
| c52fa631b4 | |||
| 6cf2de8a7c | |||
| d4b80c17e8 | |||
| 828b8a83ea | |||
| 115e2f3dcb | |||
| 6228931305 | 
@ -7,7 +7,7 @@ import "@goauthentik/components/ak-number-input";
 | 
				
			|||||||
import "@goauthentik/components/ak-radio-input";
 | 
					import "@goauthentik/components/ak-radio-input";
 | 
				
			||||||
import "@goauthentik/components/ak-switch-input";
 | 
					import "@goauthentik/components/ak-switch-input";
 | 
				
			||||||
import "@goauthentik/components/ak-text-input";
 | 
					import "@goauthentik/components/ak-text-input";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import "@goauthentik/elements/forms/FormGroup";
 | 
					import "@goauthentik/elements/forms/FormGroup";
 | 
				
			||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
					import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -32,7 +32,7 @@ import {
 | 
				
			|||||||
} from "./LDAPOptionsAndHelp";
 | 
					} from "./LDAPOptionsAndHelp";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-application-wizard-authentication-by-ldap")
 | 
					@customElement("ak-application-wizard-authentication-by-ldap")
 | 
				
			||||||
export class ApplicationWizardApplicationDetails extends WithTenantConfig(BaseProviderPanel) {
 | 
					export class ApplicationWizardApplicationDetails extends WithBrandConfig(BaseProviderPanel) {
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        const provider = this.wizard.provider as LDAPProvider | undefined;
 | 
					        const provider = this.wizard.provider as LDAPProvider | undefined;
 | 
				
			||||||
        const errors = this.wizard.errors.provider;
 | 
					        const errors = this.wizard.errors.provider;
 | 
				
			||||||
@ -57,7 +57,7 @@ export class ApplicationWizardApplicationDetails extends WithTenantConfig(BasePr
 | 
				
			|||||||
                    <ak-tenanted-flow-search
 | 
					                    <ak-tenanted-flow-search
 | 
				
			||||||
                        flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
					                        flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
				
			||||||
                        .currentFlow=${provider?.authorizationFlow}
 | 
					                        .currentFlow=${provider?.authorizationFlow}
 | 
				
			||||||
                        .tenantFlow=${this.tenant.flowAuthentication}
 | 
					                        .tenantFlow=${this.brand.flowAuthentication}
 | 
				
			||||||
                        required
 | 
					                        required
 | 
				
			||||||
                    ></ak-tenanted-flow-search>
 | 
					                    ></ak-tenanted-flow-search>
 | 
				
			||||||
                    <p class="pf-c-form__helper-text">
 | 
					                    <p class="pf-c-form__helper-text">
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ import "@goauthentik/admin/common/ak-crypto-certificate-search";
 | 
				
			|||||||
import "@goauthentik/admin/common/ak-flow-search/ak-tenanted-flow-search";
 | 
					import "@goauthentik/admin/common/ak-flow-search/ak-tenanted-flow-search";
 | 
				
			||||||
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
 | 
					import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
 | 
				
			||||||
import "@goauthentik/components/ak-text-input";
 | 
					import "@goauthentik/components/ak-text-input";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import "@goauthentik/elements/forms/FormGroup";
 | 
					import "@goauthentik/elements/forms/FormGroup";
 | 
				
			||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
					import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -17,7 +17,7 @@ import { FlowsInstancesListDesignationEnum, RadiusProvider } from "@goauthentik/
 | 
				
			|||||||
import BaseProviderPanel from "../BaseProviderPanel";
 | 
					import BaseProviderPanel from "../BaseProviderPanel";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-application-wizard-authentication-by-radius")
 | 
					@customElement("ak-application-wizard-authentication-by-radius")
 | 
				
			||||||
export class ApplicationWizardAuthenticationByRadius extends WithTenantConfig(BaseProviderPanel) {
 | 
					export class ApplicationWizardAuthenticationByRadius extends WithBrandConfig(BaseProviderPanel) {
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        const provider = this.wizard.provider as RadiusProvider | undefined;
 | 
					        const provider = this.wizard.provider as RadiusProvider | undefined;
 | 
				
			||||||
        const errors = this.wizard.errors.provider;
 | 
					        const errors = this.wizard.errors.provider;
 | 
				
			||||||
@ -42,7 +42,7 @@ export class ApplicationWizardAuthenticationByRadius extends WithTenantConfig(Ba
 | 
				
			|||||||
                    <ak-tenanted-flow-search
 | 
					                    <ak-tenanted-flow-search
 | 
				
			||||||
                        flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
					                        flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
				
			||||||
                        .currentFlow=${provider?.authorizationFlow}
 | 
					                        .currentFlow=${provider?.authorizationFlow}
 | 
				
			||||||
                        .tenantFlow=${this.tenant.flowAuthentication}
 | 
					                        .tenantFlow=${this.brand.flowAuthentication}
 | 
				
			||||||
                        required
 | 
					                        required
 | 
				
			||||||
                    ></ak-tenanted-flow-search>
 | 
					                    ></ak-tenanted-flow-search>
 | 
				
			||||||
                    <p class="pf-c-form__helper-text">
 | 
					                    <p class="pf-c-form__helper-text">
 | 
				
			||||||
 | 
				
			|||||||
@ -9,11 +9,11 @@ import { MessageLevel } from "@goauthentik/common/messages";
 | 
				
			|||||||
import { uiConfig } from "@goauthentik/common/ui/config";
 | 
					import { uiConfig } from "@goauthentik/common/ui/config";
 | 
				
			||||||
import { first } from "@goauthentik/common/utils";
 | 
					import { first } from "@goauthentik/common/utils";
 | 
				
			||||||
import "@goauthentik/components/ak-status-label";
 | 
					import "@goauthentik/components/ak-status-label";
 | 
				
			||||||
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    CapabilitiesEnum,
 | 
					    CapabilitiesEnum,
 | 
				
			||||||
    WithCapabilitiesConfig,
 | 
					    WithCapabilitiesConfig,
 | 
				
			||||||
} from "@goauthentik/elements/Interface/capabilitiesProvider";
 | 
					} from "@goauthentik/elements/Interface/capabilitiesProvider";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					 | 
				
			||||||
import "@goauthentik/elements/buttons/ActionButton";
 | 
					import "@goauthentik/elements/buttons/ActionButton";
 | 
				
			||||||
import "@goauthentik/elements/buttons/Dropdown";
 | 
					import "@goauthentik/elements/buttons/Dropdown";
 | 
				
			||||||
import "@goauthentik/elements/forms/DeleteBulkForm";
 | 
					import "@goauthentik/elements/forms/DeleteBulkForm";
 | 
				
			||||||
@ -110,7 +110,7 @@ export class RelatedUserAdd extends Form<{ users: number[] }> {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-user-related-list")
 | 
					@customElement("ak-user-related-list")
 | 
				
			||||||
export class RelatedUserList extends WithTenantConfig(WithCapabilitiesConfig(Table<User>)) {
 | 
					export class RelatedUserList extends WithBrandConfig(WithCapabilitiesConfig(Table<User>)) {
 | 
				
			||||||
    expandable = true;
 | 
					    expandable = true;
 | 
				
			||||||
    checkbox = true;
 | 
					    checkbox = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -295,7 +295,7 @@ export class RelatedUserList extends WithTenantConfig(WithCapabilitiesConfig(Tab
 | 
				
			|||||||
                                            ${msg("Set password")}
 | 
					                                            ${msg("Set password")}
 | 
				
			||||||
                                        </button>
 | 
					                                        </button>
 | 
				
			||||||
                                    </ak-forms-modal>
 | 
					                                    </ak-forms-modal>
 | 
				
			||||||
                                    ${this.tenant?.flowRecovery
 | 
					                                    ${this.brand?.flowRecovery
 | 
				
			||||||
                                        ? html`
 | 
					                                        ? html`
 | 
				
			||||||
                                              <ak-action-button
 | 
					                                              <ak-action-button
 | 
				
			||||||
                                                  class="pf-m-secondary"
 | 
					                                                  class="pf-m-secondary"
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ import "@goauthentik/admin/common/ak-flow-search/ak-tenanted-flow-search";
 | 
				
			|||||||
import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
 | 
					import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
 | 
				
			||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
 | 
					import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
 | 
				
			||||||
import { first } from "@goauthentik/common/utils";
 | 
					import { first } from "@goauthentik/common/utils";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import "@goauthentik/elements/forms/FormGroup";
 | 
					import "@goauthentik/elements/forms/FormGroup";
 | 
				
			||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
					import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
				
			||||||
import "@goauthentik/elements/forms/Radio";
 | 
					import "@goauthentik/elements/forms/Radio";
 | 
				
			||||||
@ -25,7 +25,7 @@ import {
 | 
				
			|||||||
} from "@goauthentik/api";
 | 
					} from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-provider-ldap-form")
 | 
					@customElement("ak-provider-ldap-form")
 | 
				
			||||||
export class LDAPProviderFormPage extends WithTenantConfig(BaseProviderForm<LDAPProvider>) {
 | 
					export class LDAPProviderFormPage extends WithBrandConfig(BaseProviderForm<LDAPProvider>) {
 | 
				
			||||||
    async loadInstance(pk: number): Promise<LDAPProvider> {
 | 
					    async loadInstance(pk: number): Promise<LDAPProvider> {
 | 
				
			||||||
        return new ProvidersApi(DEFAULT_CONFIG).providersLdapRetrieve({
 | 
					        return new ProvidersApi(DEFAULT_CONFIG).providersLdapRetrieve({
 | 
				
			||||||
            id: pk,
 | 
					            id: pk,
 | 
				
			||||||
@ -68,7 +68,7 @@ export class LDAPProviderFormPage extends WithTenantConfig(BaseProviderForm<LDAP
 | 
				
			|||||||
                <ak-tenanted-flow-search
 | 
					                <ak-tenanted-flow-search
 | 
				
			||||||
                    flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
					                    flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
				
			||||||
                    .currentFlow=${this.instance?.authorizationFlow}
 | 
					                    .currentFlow=${this.instance?.authorizationFlow}
 | 
				
			||||||
                    .tenantFlow=${this.tenant?.flowAuthentication}
 | 
					                    .tenantFlow=${this.brand?.flowAuthentication}
 | 
				
			||||||
                    required
 | 
					                    required
 | 
				
			||||||
                ></ak-tenanted-flow-search>
 | 
					                ></ak-tenanted-flow-search>
 | 
				
			||||||
                <p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
 | 
					                <p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
 | 
					import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm";
 | 
				
			||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
 | 
					import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
 | 
				
			||||||
import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
 | 
					import { ascii_letters, digits, first, randomString } from "@goauthentik/common/utils";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import "@goauthentik/elements/forms/FormGroup";
 | 
					import "@goauthentik/elements/forms/FormGroup";
 | 
				
			||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
					import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
				
			||||||
import "@goauthentik/elements/forms/SearchSelect";
 | 
					import "@goauthentik/elements/forms/SearchSelect";
 | 
				
			||||||
@ -14,7 +14,7 @@ import { customElement } from "lit/decorators.js";
 | 
				
			|||||||
import { FlowsInstancesListDesignationEnum, ProvidersApi, RadiusProvider } from "@goauthentik/api";
 | 
					import { FlowsInstancesListDesignationEnum, ProvidersApi, RadiusProvider } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-provider-radius-form")
 | 
					@customElement("ak-provider-radius-form")
 | 
				
			||||||
export class RadiusProviderFormPage extends WithTenantConfig(BaseProviderForm<RadiusProvider>) {
 | 
					export class RadiusProviderFormPage extends WithBrandConfig(BaseProviderForm<RadiusProvider>) {
 | 
				
			||||||
    loadInstance(pk: number): Promise<RadiusProvider> {
 | 
					    loadInstance(pk: number): Promise<RadiusProvider> {
 | 
				
			||||||
        return new ProvidersApi(DEFAULT_CONFIG).providersRadiusRetrieve({
 | 
					        return new ProvidersApi(DEFAULT_CONFIG).providersRadiusRetrieve({
 | 
				
			||||||
            id: pk,
 | 
					            id: pk,
 | 
				
			||||||
@ -57,7 +57,7 @@ export class RadiusProviderFormPage extends WithTenantConfig(BaseProviderForm<Ra
 | 
				
			|||||||
                <ak-tenanted-flow-search
 | 
					                <ak-tenanted-flow-search
 | 
				
			||||||
                    flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
					                    flowType=${FlowsInstancesListDesignationEnum.Authentication}
 | 
				
			||||||
                    .currentFlow=${this.instance?.authorizationFlow}
 | 
					                    .currentFlow=${this.instance?.authorizationFlow}
 | 
				
			||||||
                    .tenantFlow=${this.tenant?.flowAuthentication}
 | 
					                    .tenantFlow=${this.brand?.flowAuthentication}
 | 
				
			||||||
                    required
 | 
					                    required
 | 
				
			||||||
                ></ak-tenanted-flow-search>
 | 
					                ></ak-tenanted-flow-search>
 | 
				
			||||||
                <p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
 | 
					                <p class="pf-c-form__helper-text">${msg("Flow used for users to authenticate.")}</p>
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ import "@goauthentik/elements/forms/FormGroup";
 | 
				
			|||||||
import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
					import "@goauthentik/elements/forms/HorizontalFormElement";
 | 
				
			||||||
import { ModelForm } from "@goauthentik/elements/forms/ModelForm";
 | 
					import { ModelForm } from "@goauthentik/elements/forms/ModelForm";
 | 
				
			||||||
import "@goauthentik/elements/forms/SearchSelect";
 | 
					import "@goauthentik/elements/forms/SearchSelect";
 | 
				
			||||||
import { DefaultTenant } from "@goauthentik/elements/sidebar/SidebarBrand";
 | 
					import { DefaultBrand } from "@goauthentik/elements/sidebar/SidebarBrand";
 | 
				
			||||||
import YAML from "yaml";
 | 
					import YAML from "yaml";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { msg } from "@lit/localize";
 | 
					import { msg } from "@lit/localize";
 | 
				
			||||||
@ -93,7 +93,7 @@ export class TenantForm extends ModelForm<Tenant, string> {
 | 
				
			|||||||
                            type="text"
 | 
					                            type="text"
 | 
				
			||||||
                            value="${first(
 | 
					                            value="${first(
 | 
				
			||||||
                                this.instance?.brandingTitle,
 | 
					                                this.instance?.brandingTitle,
 | 
				
			||||||
                                DefaultTenant.brandingTitle,
 | 
					                                DefaultBrand.brandingTitle,
 | 
				
			||||||
                            )}"
 | 
					                            )}"
 | 
				
			||||||
                            class="pf-c-form-control"
 | 
					                            class="pf-c-form-control"
 | 
				
			||||||
                            required
 | 
					                            required
 | 
				
			||||||
@ -109,10 +109,7 @@ export class TenantForm extends ModelForm<Tenant, string> {
 | 
				
			|||||||
                    >
 | 
					                    >
 | 
				
			||||||
                        <input
 | 
					                        <input
 | 
				
			||||||
                            type="text"
 | 
					                            type="text"
 | 
				
			||||||
                            value="${first(
 | 
					                            value="${first(this.instance?.brandingLogo, DefaultBrand.brandingLogo)}"
 | 
				
			||||||
                                this.instance?.brandingLogo,
 | 
					 | 
				
			||||||
                                DefaultTenant.brandingLogo,
 | 
					 | 
				
			||||||
                            )}"
 | 
					 | 
				
			||||||
                            class="pf-c-form-control"
 | 
					                            class="pf-c-form-control"
 | 
				
			||||||
                            required
 | 
					                            required
 | 
				
			||||||
                        />
 | 
					                        />
 | 
				
			||||||
@ -129,7 +126,7 @@ export class TenantForm extends ModelForm<Tenant, string> {
 | 
				
			|||||||
                            type="text"
 | 
					                            type="text"
 | 
				
			||||||
                            value="${first(
 | 
					                            value="${first(
 | 
				
			||||||
                                this.instance?.brandingFavicon,
 | 
					                                this.instance?.brandingFavicon,
 | 
				
			||||||
                                DefaultTenant.brandingFavicon,
 | 
					                                DefaultBrand.brandingFavicon,
 | 
				
			||||||
                            )}"
 | 
					                            )}"
 | 
				
			||||||
                            class="pf-c-form-control"
 | 
					                            class="pf-c-form-control"
 | 
				
			||||||
                            required
 | 
					                            required
 | 
				
			||||||
 | 
				
			|||||||
@ -12,11 +12,11 @@ import { DefaultUIConfig, uiConfig } from "@goauthentik/common/ui/config";
 | 
				
			|||||||
import { first } from "@goauthentik/common/utils";
 | 
					import { first } from "@goauthentik/common/utils";
 | 
				
			||||||
import "@goauthentik/components/ak-status-label";
 | 
					import "@goauthentik/components/ak-status-label";
 | 
				
			||||||
import { rootInterface } from "@goauthentik/elements/Base";
 | 
					import { rootInterface } from "@goauthentik/elements/Base";
 | 
				
			||||||
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    CapabilitiesEnum,
 | 
					    CapabilitiesEnum,
 | 
				
			||||||
    WithCapabilitiesConfig,
 | 
					    WithCapabilitiesConfig,
 | 
				
			||||||
} from "@goauthentik/elements/Interface/capabilitiesProvider";
 | 
					} from "@goauthentik/elements/Interface/capabilitiesProvider";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					 | 
				
			||||||
import { PFSize } from "@goauthentik/elements/Spinner";
 | 
					import { PFSize } from "@goauthentik/elements/Spinner";
 | 
				
			||||||
import "@goauthentik/elements/TreeView";
 | 
					import "@goauthentik/elements/TreeView";
 | 
				
			||||||
import "@goauthentik/elements/buttons/ActionButton";
 | 
					import "@goauthentik/elements/buttons/ActionButton";
 | 
				
			||||||
@ -91,7 +91,7 @@ const recoveryButtonStyles = css`
 | 
				
			|||||||
`;
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-user-list")
 | 
					@customElement("ak-user-list")
 | 
				
			||||||
export class UserListPage extends WithTenantConfig(WithCapabilitiesConfig(TablePage<User>)) {
 | 
					export class UserListPage extends WithBrandConfig(WithCapabilitiesConfig(TablePage<User>)) {
 | 
				
			||||||
    expandable = true;
 | 
					    expandable = true;
 | 
				
			||||||
    checkbox = true;
 | 
					    checkbox = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -352,7 +352,7 @@ export class UserListPage extends WithTenantConfig(WithCapabilitiesConfig(TableP
 | 
				
			|||||||
                                            ${msg("Set password")}
 | 
					                                            ${msg("Set password")}
 | 
				
			||||||
                                        </button>
 | 
					                                        </button>
 | 
				
			||||||
                                    </ak-forms-modal>
 | 
					                                    </ak-forms-modal>
 | 
				
			||||||
                                    ${this.tenant.flowRecovery
 | 
					                                    ${this.brand.flowRecovery
 | 
				
			||||||
                                        ? html`
 | 
					                                        ? html`
 | 
				
			||||||
                                              <ak-action-button
 | 
					                                              <ak-action-button
 | 
				
			||||||
                                                  class="pf-m-secondary"
 | 
					                                                  class="pf-m-secondary"
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,13 @@ import {
 | 
				
			|||||||
import { EVENT_LOCALE_REQUEST, EVENT_REFRESH, VERSION } from "@goauthentik/common/constants";
 | 
					import { EVENT_LOCALE_REQUEST, EVENT_REFRESH, VERSION } from "@goauthentik/common/constants";
 | 
				
			||||||
import { globalAK } from "@goauthentik/common/global";
 | 
					import { globalAK } from "@goauthentik/common/global";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Config, Configuration, CoreApi, CurrentTenant, RootApi } from "@goauthentik/api";
 | 
					import {
 | 
				
			||||||
 | 
					    Config,
 | 
				
			||||||
 | 
					    Configuration,
 | 
				
			||||||
 | 
					    CoreApi,
 | 
				
			||||||
 | 
					    CurrentTenant as CurrentBrand,
 | 
				
			||||||
 | 
					    RootApi,
 | 
				
			||||||
 | 
					} from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let globalConfigPromise: Promise<Config> | undefined = Promise.resolve(globalAK().config);
 | 
					let globalConfigPromise: Promise<Config> | undefined = Promise.resolve(globalAK().config);
 | 
				
			||||||
export function config(): Promise<Config> {
 | 
					export function config(): Promise<Config> {
 | 
				
			||||||
@ -16,7 +22,7 @@ export function config(): Promise<Config> {
 | 
				
			|||||||
    return globalConfigPromise;
 | 
					    return globalConfigPromise;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function tenantSetFavicon(tenant: CurrentTenant) {
 | 
					export function brandSetFavicon(brand: CurrentBrand) {
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     *  <link rel="icon" href="/static/dist/assets/icons/icon.png">
 | 
					     *  <link rel="icon" href="/static/dist/assets/icons/icon.png">
 | 
				
			||||||
     *  <link rel="shortcut icon" href="/static/dist/assets/icons/icon.png">
 | 
					     *  <link rel="shortcut icon" href="/static/dist/assets/icons/icon.png">
 | 
				
			||||||
@ -29,36 +35,36 @@ export function tenantSetFavicon(tenant: CurrentTenant) {
 | 
				
			|||||||
            relIcon.rel = rel;
 | 
					            relIcon.rel = rel;
 | 
				
			||||||
            document.getElementsByTagName("head")[0].appendChild(relIcon);
 | 
					            document.getElementsByTagName("head")[0].appendChild(relIcon);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        relIcon.href = tenant.brandingFavicon;
 | 
					        relIcon.href = brand.brandingFavicon;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function tenantSetLocale(tenant: CurrentTenant) {
 | 
					export function brandSetLocale(brand: CurrentBrand) {
 | 
				
			||||||
    if (tenant.defaultLocale === "") {
 | 
					    if (brand.defaultLocale === "") {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    console.debug("authentik/locale: setting locale from tenant default");
 | 
					    console.debug("authentik/locale: setting locale from brand default");
 | 
				
			||||||
    window.dispatchEvent(
 | 
					    window.dispatchEvent(
 | 
				
			||||||
        new CustomEvent(EVENT_LOCALE_REQUEST, {
 | 
					        new CustomEvent(EVENT_LOCALE_REQUEST, {
 | 
				
			||||||
            composed: true,
 | 
					            composed: true,
 | 
				
			||||||
            bubbles: true,
 | 
					            bubbles: true,
 | 
				
			||||||
            detail: { locale: tenant.defaultLocale },
 | 
					            detail: { locale: brand.defaultLocale },
 | 
				
			||||||
        }),
 | 
					        }),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let globalTenantPromise: Promise<CurrentTenant> | undefined = Promise.resolve(globalAK().tenant);
 | 
					let globalBrandPromise: Promise<CurrentBrand> | undefined = Promise.resolve(globalAK().tenant);
 | 
				
			||||||
export function tenant(): Promise<CurrentTenant> {
 | 
					export function brand(): Promise<CurrentBrand> {
 | 
				
			||||||
    if (!globalTenantPromise) {
 | 
					    if (!globalBrandPromise) {
 | 
				
			||||||
        globalTenantPromise = new CoreApi(DEFAULT_CONFIG)
 | 
					        globalBrandPromise = new CoreApi(DEFAULT_CONFIG)
 | 
				
			||||||
            .coreTenantsCurrentRetrieve()
 | 
					            .coreTenantsCurrentRetrieve()
 | 
				
			||||||
            .then((tenant) => {
 | 
					            .then((brand) => {
 | 
				
			||||||
                tenantSetFavicon(tenant);
 | 
					                brandSetFavicon(brand);
 | 
				
			||||||
                tenantSetLocale(tenant);
 | 
					                brandSetLocale(brand);
 | 
				
			||||||
                return tenant;
 | 
					                return brand;
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return globalTenantPromise;
 | 
					    return globalBrandPromise;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function getMetaContent(key: string): string {
 | 
					export function getMetaContent(key: string): string {
 | 
				
			||||||
@ -90,9 +96,9 @@ window.addEventListener(EVENT_REFRESH, () => {
 | 
				
			|||||||
    // Upon global refresh, disregard whatever was pre-hydrated and
 | 
					    // Upon global refresh, disregard whatever was pre-hydrated and
 | 
				
			||||||
    // actually load info from API
 | 
					    // actually load info from API
 | 
				
			||||||
    globalConfigPromise = undefined;
 | 
					    globalConfigPromise = undefined;
 | 
				
			||||||
    globalTenantPromise = undefined;
 | 
					    globalBrandPromise = undefined;
 | 
				
			||||||
    config();
 | 
					    config();
 | 
				
			||||||
    tenant();
 | 
					    brand();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
console.debug(`authentik(early): version ${VERSION}, apiBase ${DEFAULT_CONFIG.basePath}`);
 | 
					console.debug(`authentik(early): version ${VERSION}, apiBase ${DEFAULT_CONFIG.basePath}`);
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@ import { EVENT_REQUEST_POST } from "@goauthentik/common/constants";
 | 
				
			|||||||
import { getCookie } from "@goauthentik/common/utils";
 | 
					import { getCookie } from "@goauthentik/common/utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    CurrentTenant,
 | 
					    CurrentTenant as CurrentBrand,
 | 
				
			||||||
    FetchParams,
 | 
					    FetchParams,
 | 
				
			||||||
    Middleware,
 | 
					    Middleware,
 | 
				
			||||||
    RequestContext,
 | 
					    RequestContext,
 | 
				
			||||||
@ -18,13 +18,13 @@ export interface RequestInfo {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class LoggingMiddleware implements Middleware {
 | 
					export class LoggingMiddleware implements Middleware {
 | 
				
			||||||
    tenant: CurrentTenant;
 | 
					    brand: CurrentBrand;
 | 
				
			||||||
    constructor(tenant: CurrentTenant) {
 | 
					    constructor(brand: CurrentBrand) {
 | 
				
			||||||
        this.tenant = tenant;
 | 
					        this.brand = brand;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    post(context: ResponseContext): Promise<Response | void> {
 | 
					    post(context: ResponseContext): Promise<Response | void> {
 | 
				
			||||||
        let msg = `authentik/api[${this.tenant.matchedDomain}]: `;
 | 
					        let msg = `authentik/api[${this.brand.matchedDomain}]: `;
 | 
				
			||||||
        // https://developer.mozilla.org/en-US/docs/Web/API/console#styling_console_output
 | 
					        // https://developer.mozilla.org/en-US/docs/Web/API/console#styling_console_output
 | 
				
			||||||
        msg += `%c${context.response.status}%c ${context.init.method} ${context.url}`;
 | 
					        msg += `%c${context.response.status}%c ${context.init.method} ${context.url}`;
 | 
				
			||||||
        let style = "";
 | 
					        let style = "";
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,9 @@
 | 
				
			|||||||
import { createContext } from "@lit-labs/context";
 | 
					import { createContext } from "@lit-labs/context";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import type { Config, CurrentTenant } from "@goauthentik/api";
 | 
					import type { Config, CurrentTenant as CurrentBrand } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const authentikConfigContext = createContext<Config>(Symbol("authentik-config-context"));
 | 
					export const authentikConfigContext = createContext<Config>(Symbol("authentik-config-context"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const authentikTenantContext = createContext<CurrentTenant>(
 | 
					export const authentikBrandContext = createContext<CurrentBrand>(Symbol("authentik-brand-context"));
 | 
				
			||||||
    Symbol("authentik-tenant-context"),
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default authentikConfigContext;
 | 
					export default authentikConfigContext;
 | 
				
			||||||
 | 
				
			|||||||
@ -9,13 +9,13 @@ import { LitElement } from "lit";
 | 
				
			|||||||
import AKGlobal from "@goauthentik/common/styles/authentik.css";
 | 
					import AKGlobal from "@goauthentik/common/styles/authentik.css";
 | 
				
			||||||
import ThemeDark from "@goauthentik/common/styles/theme-dark.css";
 | 
					import ThemeDark from "@goauthentik/common/styles/theme-dark.css";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Config, CurrentTenant, UiThemeEnum } from "@goauthentik/api";
 | 
					import { Config, CurrentTenant as CurrentBrand, UiThemeEnum } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { AdoptedStyleSheetsElement } from "./types";
 | 
					import { AdoptedStyleSheetsElement } from "./types";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type AkInterface = HTMLElement & {
 | 
					type AkInterface = HTMLElement & {
 | 
				
			||||||
    getTheme: () => Promise<UiThemeEnum>;
 | 
					    getTheme: () => Promise<UiThemeEnum>;
 | 
				
			||||||
    tenant?: CurrentTenant;
 | 
					    brand?: CurrentBrand;
 | 
				
			||||||
    uiConfig?: UIConfig;
 | 
					    uiConfig?: UIConfig;
 | 
				
			||||||
    config?: Config;
 | 
					    config?: Config;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { config, tenant } from "@goauthentik/common/api/config";
 | 
					import { brand, config } from "@goauthentik/common/api/config";
 | 
				
			||||||
import { UIConfig, uiConfig } from "@goauthentik/common/ui/config";
 | 
					import { UIConfig, uiConfig } from "@goauthentik/common/ui/config";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
 | 
					    authentikBrandContext,
 | 
				
			||||||
    authentikConfigContext,
 | 
					    authentikConfigContext,
 | 
				
			||||||
    authentikTenantContext,
 | 
					 | 
				
			||||||
} from "@goauthentik/elements/AuthentikContexts";
 | 
					} from "@goauthentik/elements/AuthentikContexts";
 | 
				
			||||||
import type { AdoptedStyleSheetsElement } from "@goauthentik/elements/types";
 | 
					import type { AdoptedStyleSheetsElement } from "@goauthentik/elements/types";
 | 
				
			||||||
import { ensureCSSStyleSheet } from "@goauthentik/elements/utils/ensureCSSStyleSheet";
 | 
					import { ensureCSSStyleSheet } from "@goauthentik/elements/utils/ensureCSSStyleSheet";
 | 
				
			||||||
@ -12,13 +12,13 @@ import { state } from "lit/decorators.js";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
					import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Config, CurrentTenant, UiThemeEnum } from "@goauthentik/api";
 | 
					import { Config, CurrentTenant as CurrentBrand, UiThemeEnum } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { AKElement } from "../Base";
 | 
					import { AKElement } from "../Base";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type AkInterface = HTMLElement & {
 | 
					type AkInterface = HTMLElement & {
 | 
				
			||||||
    getTheme: () => Promise<UiThemeEnum>;
 | 
					    getTheme: () => Promise<UiThemeEnum>;
 | 
				
			||||||
    tenant?: CurrentTenant;
 | 
					    brand?: CurrentBrand;
 | 
				
			||||||
    uiConfig?: UIConfig;
 | 
					    uiConfig?: UIConfig;
 | 
				
			||||||
    config?: Config;
 | 
					    config?: Config;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -45,28 +45,28 @@ export class Interface extends AKElement implements AkInterface {
 | 
				
			|||||||
        return this._config;
 | 
					        return this._config;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _tenantContext = new ContextProvider(this, {
 | 
					    _brandContext = new ContextProvider(this, {
 | 
				
			||||||
        context: authentikTenantContext,
 | 
					        context: authentikBrandContext,
 | 
				
			||||||
        initialValue: undefined,
 | 
					        initialValue: undefined,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _tenant?: CurrentTenant;
 | 
					    _brand?: CurrentBrand;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @state()
 | 
					    @state()
 | 
				
			||||||
    set tenant(c: CurrentTenant) {
 | 
					    set brand(c: CurrentBrand) {
 | 
				
			||||||
        this._tenant = c;
 | 
					        this._brand = c;
 | 
				
			||||||
        this._tenantContext.setValue(c);
 | 
					        this._brandContext.setValue(c);
 | 
				
			||||||
        this.requestUpdate();
 | 
					        this.requestUpdate();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    get tenant(): CurrentTenant | undefined {
 | 
					    get brand(): CurrentBrand | undefined {
 | 
				
			||||||
        return this._tenant;
 | 
					        return this._brand;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor() {
 | 
					    constructor() {
 | 
				
			||||||
        super();
 | 
					        super();
 | 
				
			||||||
        document.adoptedStyleSheets = [...document.adoptedStyleSheets, ensureCSSStyleSheet(PFBase)];
 | 
					        document.adoptedStyleSheets = [...document.adoptedStyleSheets, ensureCSSStyleSheet(PFBase)];
 | 
				
			||||||
        tenant().then((tenant) => (this.tenant = tenant));
 | 
					        brand().then((brand) => (this.brand = brand));
 | 
				
			||||||
        config().then((config) => (this.config = config));
 | 
					        config().then((config) => (this.config = config));
 | 
				
			||||||
        this.dataset.akInterfaceRoot = "true";
 | 
					        this.dataset.akInterfaceRoot = "true";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										20
									
								
								web/src/elements/Interface/brandProvider.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								web/src/elements/Interface/brandProvider.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					import { authentikBrandContext } from "@goauthentik/elements/AuthentikContexts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { consume } from "@lit-labs/context";
 | 
				
			||||||
 | 
					import type { LitElement } from "lit";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import type { CurrentTenant as CurrentBrand } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
				
			||||||
 | 
					type Constructor<T = object> = abstract new (...args: any[]) => T;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function WithBrandConfig<T extends Constructor<LitElement>>(
 | 
				
			||||||
 | 
					    superclass: T,
 | 
				
			||||||
 | 
					    subscribe = true,
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					    abstract class WithBrandProvider extends superclass {
 | 
				
			||||||
 | 
					        @consume({ context: authentikBrandContext, subscribe })
 | 
				
			||||||
 | 
					        public brand!: CurrentBrand;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return WithBrandProvider;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,20 +0,0 @@
 | 
				
			|||||||
import { authentikTenantContext } from "@goauthentik/elements/AuthentikContexts";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import { consume } from "@lit-labs/context";
 | 
					 | 
				
			||||||
import type { LitElement } from "lit";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import type { CurrentTenant } from "@goauthentik/api";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
					 | 
				
			||||||
type Constructor<T = object> = abstract new (...args: any[]) => T;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function WithTenantConfig<T extends Constructor<LitElement>>(
 | 
					 | 
				
			||||||
    superclass: T,
 | 
					 | 
				
			||||||
    subscribe = true,
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
    abstract class WithTenantProvider extends superclass {
 | 
					 | 
				
			||||||
        @consume({ context: authentikTenantContext, subscribe })
 | 
					 | 
				
			||||||
        public tenant!: CurrentTenant;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return WithTenantProvider;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -9,7 +9,7 @@ import {
 | 
				
			|||||||
import { currentInterface } from "@goauthentik/common/sentry";
 | 
					import { currentInterface } from "@goauthentik/common/sentry";
 | 
				
			||||||
import { me } from "@goauthentik/common/users";
 | 
					import { me } from "@goauthentik/common/users";
 | 
				
			||||||
import { AKElement } from "@goauthentik/elements/Base";
 | 
					import { AKElement } from "@goauthentik/elements/Base";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
 | 
					import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { msg } from "@lit/localize";
 | 
					import { msg } from "@lit/localize";
 | 
				
			||||||
@ -24,7 +24,7 @@ import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
				
			|||||||
import { EventsApi } from "@goauthentik/api";
 | 
					import { EventsApi } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-page-header")
 | 
					@customElement("ak-page-header")
 | 
				
			||||||
export class PageHeader extends WithTenantConfig(AKElement) {
 | 
					export class PageHeader extends WithBrandConfig(AKElement) {
 | 
				
			||||||
    @property()
 | 
					    @property()
 | 
				
			||||||
    icon?: string;
 | 
					    icon?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -37,7 +37,7 @@ export class PageHeader extends WithTenantConfig(AKElement) {
 | 
				
			|||||||
    @property()
 | 
					    @property()
 | 
				
			||||||
    set header(value: string) {
 | 
					    set header(value: string) {
 | 
				
			||||||
        const currentIf = currentInterface();
 | 
					        const currentIf = currentInterface();
 | 
				
			||||||
        let title = this.tenant?.brandingTitle || TITLE_DEFAULT;
 | 
					        let title = this.brand?.brandingTitle || TITLE_DEFAULT;
 | 
				
			||||||
        if (currentIf === "admin") {
 | 
					        if (currentIf === "admin") {
 | 
				
			||||||
            title = `${msg("Admin")} - ${title}`;
 | 
					            title = `${msg("Admin")} - ${title}`;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { EVENT_SIDEBAR_TOGGLE } from "@goauthentik/common/constants";
 | 
					import { EVENT_SIDEBAR_TOGGLE } from "@goauthentik/common/constants";
 | 
				
			||||||
import { AKElement } from "@goauthentik/elements/Base";
 | 
					import { AKElement } from "@goauthentik/elements/Base";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { CSSResult, TemplateResult, css, html } from "lit";
 | 
					import { CSSResult, TemplateResult, css, html } from "lit";
 | 
				
			||||||
import { customElement } from "lit/decorators.js";
 | 
					import { customElement } from "lit/decorators.js";
 | 
				
			||||||
@ -10,13 +10,13 @@ import PFPage from "@patternfly/patternfly/components/Page/page.css";
 | 
				
			|||||||
import PFGlobal from "@patternfly/patternfly/patternfly-base.css";
 | 
					import PFGlobal from "@patternfly/patternfly/patternfly-base.css";
 | 
				
			||||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
					import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { CurrentTenant, UiThemeEnum } from "@goauthentik/api";
 | 
					import { CurrentTenant as CurrentBrand, UiThemeEnum } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// If the viewport is wider than MIN_WIDTH, the sidebar
 | 
					// If the viewport is wider than MIN_WIDTH, the sidebar
 | 
				
			||||||
// is shown besides the content, and not overlaid.
 | 
					// is shown besides the content, and not overlaid.
 | 
				
			||||||
export const MIN_WIDTH = 1200;
 | 
					export const MIN_WIDTH = 1200;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const DefaultTenant: CurrentTenant = {
 | 
					export const DefaultBrand: CurrentBrand = {
 | 
				
			||||||
    brandingLogo: "/static/dist/assets/icons/icon_left_brand.svg",
 | 
					    brandingLogo: "/static/dist/assets/icons/icon_left_brand.svg",
 | 
				
			||||||
    brandingFavicon: "/static/dist/assets/icons/icon.png",
 | 
					    brandingFavicon: "/static/dist/assets/icons/icon.png",
 | 
				
			||||||
    brandingTitle: "authentik",
 | 
					    brandingTitle: "authentik",
 | 
				
			||||||
@ -27,7 +27,7 @@ export const DefaultTenant: CurrentTenant = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-sidebar-brand")
 | 
					@customElement("ak-sidebar-brand")
 | 
				
			||||||
export class SidebarBrand extends WithTenantConfig(AKElement) {
 | 
					export class SidebarBrand extends WithBrandConfig(AKElement) {
 | 
				
			||||||
    static get styles(): CSSResult[] {
 | 
					    static get styles(): CSSResult[] {
 | 
				
			||||||
        return [
 | 
					        return [
 | 
				
			||||||
            PFBase,
 | 
					            PFBase,
 | 
				
			||||||
@ -65,6 +65,7 @@ export class SidebarBrand extends WithTenantConfig(AKElement) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render(): TemplateResult {
 | 
					    render(): TemplateResult {
 | 
				
			||||||
 | 
					        console.log(this.brand);
 | 
				
			||||||
        return html` ${window.innerWidth <= MIN_WIDTH
 | 
					        return html` ${window.innerWidth <= MIN_WIDTH
 | 
				
			||||||
                ? html`
 | 
					                ? html`
 | 
				
			||||||
                      <button
 | 
					                      <button
 | 
				
			||||||
@ -85,7 +86,7 @@ export class SidebarBrand extends WithTenantConfig(AKElement) {
 | 
				
			|||||||
            <a href="#/" class="pf-c-page__header-brand-link">
 | 
					            <a href="#/" class="pf-c-page__header-brand-link">
 | 
				
			||||||
                <div class="pf-c-brand ak-brand">
 | 
					                <div class="pf-c-brand ak-brand">
 | 
				
			||||||
                    <img
 | 
					                    <img
 | 
				
			||||||
                        src=${this.tenant?.brandingLogo ?? DefaultTenant.brandingLogo}
 | 
					                        src=${this.brand?.brandingLogo ?? DefaultBrand.brandingLogo}
 | 
				
			||||||
                        alt="authentik Logo"
 | 
					                        alt="authentik Logo"
 | 
				
			||||||
                        loading="lazy"
 | 
					                        loading="lazy"
 | 
				
			||||||
                    />
 | 
					                    />
 | 
				
			||||||
 | 
				
			|||||||
@ -205,7 +205,7 @@ export class RacInterface extends Interface {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    updateTitle(): void {
 | 
					    updateTitle(): void {
 | 
				
			||||||
        let title = this.tenant?.brandingTitle || TITLE_DEFAULT;
 | 
					        let title = this.brand?.brandingTitle || TITLE_DEFAULT;
 | 
				
			||||||
        if (this.endpointName) {
 | 
					        if (this.endpointName) {
 | 
				
			||||||
            title = `${this.endpointName} - ${title}`;
 | 
					            title = `${this.endpointName} - ${title}`;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ import { configureSentry } from "@goauthentik/common/sentry";
 | 
				
			|||||||
import { first } from "@goauthentik/common/utils";
 | 
					import { first } from "@goauthentik/common/utils";
 | 
				
			||||||
import { WebsocketClient } from "@goauthentik/common/ws";
 | 
					import { WebsocketClient } from "@goauthentik/common/ws";
 | 
				
			||||||
import { Interface } from "@goauthentik/elements/Interface";
 | 
					import { Interface } from "@goauthentik/elements/Interface";
 | 
				
			||||||
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import "@goauthentik/elements/LoadingOverlay";
 | 
					import "@goauthentik/elements/LoadingOverlay";
 | 
				
			||||||
import "@goauthentik/elements/ak-locale-context";
 | 
					import "@goauthentik/elements/ak-locale-context";
 | 
				
			||||||
import "@goauthentik/flow/sources/apple/AppleLoginInit";
 | 
					import "@goauthentik/flow/sources/apple/AppleLoginInit";
 | 
				
			||||||
@ -45,7 +46,7 @@ import {
 | 
				
			|||||||
} from "@goauthentik/api";
 | 
					} from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-flow-executor")
 | 
					@customElement("ak-flow-executor")
 | 
				
			||||||
export class FlowExecutor extends Interface implements StageHost {
 | 
					export class FlowExecutor extends WithBrandConfig(Interface) implements StageHost {
 | 
				
			||||||
    @property()
 | 
					    @property()
 | 
				
			||||||
    flowSlug: string = window.location.pathname.split("/")[3];
 | 
					    flowSlug: string = window.location.pathname.split("/")[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -55,9 +56,9 @@ export class FlowExecutor extends Interface implements StageHost {
 | 
				
			|||||||
    set challenge(value: ChallengeTypes | undefined) {
 | 
					    set challenge(value: ChallengeTypes | undefined) {
 | 
				
			||||||
        this._challenge = value;
 | 
					        this._challenge = value;
 | 
				
			||||||
        if (value?.flowInfo?.title) {
 | 
					        if (value?.flowInfo?.title) {
 | 
				
			||||||
            document.title = `${value.flowInfo?.title} - ${this.tenant?.brandingTitle}`;
 | 
					            document.title = `${value.flowInfo?.title} - ${this.brand?.brandingTitle}`;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            document.title = this.tenant?.brandingTitle || TITLE_DEFAULT;
 | 
					            document.title = this.brand?.brandingTitle || TITLE_DEFAULT;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.requestUpdate();
 | 
					        this.requestUpdate();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -213,10 +214,8 @@ export class FlowExecutor extends Interface implements StageHost {
 | 
				
			|||||||
            if (this.challenge.flowInfo) {
 | 
					            if (this.challenge.flowInfo) {
 | 
				
			||||||
                this.flowInfo = this.challenge.flowInfo;
 | 
					                this.flowInfo = this.challenge.flowInfo;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (this.challenge.responseErrors) {
 | 
					
 | 
				
			||||||
                return false;
 | 
					            return this.challenge.responseErrors ? false : true;
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
        } catch (exc: unknown) {
 | 
					        } catch (exc: unknown) {
 | 
				
			||||||
            this.errorMessage(exc as Error | ResponseError);
 | 
					            this.errorMessage(exc as Error | ResponseError);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
@ -430,7 +429,7 @@ export class FlowExecutor extends Interface implements StageHost {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    renderChallengeWrapper(): TemplateResult {
 | 
					    renderChallengeWrapper(): TemplateResult {
 | 
				
			||||||
        const logo = html`<div class="pf-c-login__main-header pf-c-brand ak-brand">
 | 
					        const logo = html`<div class="pf-c-login__main-header pf-c-brand ak-brand">
 | 
				
			||||||
            <img src="${first(this.tenant?.brandingLogo, "")}" alt="authentik Logo" />
 | 
					            <img src="${first(this.brand?.brandingLogo, "")}" alt="authentik Logo" />
 | 
				
			||||||
        </div>`;
 | 
					        </div>`;
 | 
				
			||||||
        if (!this.challenge) {
 | 
					        if (!this.challenge) {
 | 
				
			||||||
            return html`${logo}<ak-empty-state ?loading=${true} header=${msg("Loading")}>
 | 
					            return html`${logo}<ak-empty-state ?loading=${true} header=${msg("Loading")}>
 | 
				
			||||||
@ -483,12 +482,20 @@ export class FlowExecutor extends Interface implements StageHost {
 | 
				
			|||||||
                            <div class="pf-c-drawer__body">
 | 
					                            <div class="pf-c-drawer__body">
 | 
				
			||||||
                                <div class="pf-c-login ${this.getLayout()}">
 | 
					                                <div class="pf-c-login ${this.getLayout()}">
 | 
				
			||||||
                                    <div class="${this.getLayoutClass()}">
 | 
					                                    <div class="${this.getLayoutClass()}">
 | 
				
			||||||
 | 
					                                        <header class="pf-c-login__header">
 | 
				
			||||||
 | 
					                                            <div class="pf-c-brand ak-brand">
 | 
				
			||||||
 | 
					                                                <img
 | 
				
			||||||
 | 
					                                                    src="${first(this.brand?.brandingLogo, "")}"
 | 
				
			||||||
 | 
					                                                    alt="authentik Logo"
 | 
				
			||||||
 | 
					                                                />
 | 
				
			||||||
 | 
					                                            </div>
 | 
				
			||||||
 | 
					                                        </header>
 | 
				
			||||||
                                        <div class="pf-c-login__main">
 | 
					                                        <div class="pf-c-login__main">
 | 
				
			||||||
                                            ${this.renderChallengeWrapper()}
 | 
					                                            ${this.renderChallengeWrapper()}
 | 
				
			||||||
                                        </div>
 | 
					                                        </div>
 | 
				
			||||||
                                        <footer class="pf-c-login__footer">
 | 
					                                        <footer class="pf-c-login__footer">
 | 
				
			||||||
                                            <ul class="pf-c-list pf-m-inline">
 | 
					                                            <ul class="pf-c-list pf-m-inline">
 | 
				
			||||||
                                                ${this.tenant?.uiFooterLinks?.map((link) => {
 | 
					                                                ${this.brand?.uiFooterLinks?.map((link) => {
 | 
				
			||||||
                                                    return html`<li>
 | 
					                                                    return html`<li>
 | 
				
			||||||
                                                        <a href="${link.href || ""}"
 | 
					                                                        <a href="${link.href || ""}"
 | 
				
			||||||
                                                            >${link.name}</a
 | 
					                                                            >${link.name}</a
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ import { globalAK } from "@goauthentik/common/global";
 | 
				
			|||||||
import { first, getCookie } from "@goauthentik/common/utils";
 | 
					import { first, getCookie } from "@goauthentik/common/utils";
 | 
				
			||||||
import { Interface } from "@goauthentik/elements/Interface";
 | 
					import { Interface } from "@goauthentik/elements/Interface";
 | 
				
			||||||
import "@goauthentik/elements/ak-locale-context";
 | 
					import "@goauthentik/elements/ak-locale-context";
 | 
				
			||||||
import { DefaultTenant } from "@goauthentik/elements/sidebar/SidebarBrand";
 | 
					import { DefaultBrand } from "@goauthentik/elements/sidebar/SidebarBrand";
 | 
				
			||||||
import "rapidoc";
 | 
					import "rapidoc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { CSSResult, TemplateResult, css, html } from "lit";
 | 
					import { CSSResult, TemplateResult, css, html } from "lit";
 | 
				
			||||||
@ -103,7 +103,7 @@ export class APIBrowser extends Interface {
 | 
				
			|||||||
                        <img
 | 
					                        <img
 | 
				
			||||||
                            alt="authentik Logo"
 | 
					                            alt="authentik Logo"
 | 
				
			||||||
                            class="logo"
 | 
					                            class="logo"
 | 
				
			||||||
                            src="${first(this.tenant?.brandingLogo, DefaultTenant.brandingLogo)}"
 | 
					                            src="${first(this.brand?.brandingLogo, DefaultBrand.brandingLogo)}"
 | 
				
			||||||
                        />
 | 
					                        />
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </rapi-doc>
 | 
					                </rapi-doc>
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ import "@goauthentik/elements/notifications/NotificationDrawer";
 | 
				
			|||||||
import { getURLParam, updateURLParams } from "@goauthentik/elements/router/RouteMatch";
 | 
					import { getURLParam, updateURLParams } from "@goauthentik/elements/router/RouteMatch";
 | 
				
			||||||
import "@goauthentik/elements/router/RouterOutlet";
 | 
					import "@goauthentik/elements/router/RouterOutlet";
 | 
				
			||||||
import "@goauthentik/elements/sidebar/Sidebar";
 | 
					import "@goauthentik/elements/sidebar/Sidebar";
 | 
				
			||||||
import { DefaultTenant } from "@goauthentik/elements/sidebar/SidebarBrand";
 | 
					import { DefaultBrand } from "@goauthentik/elements/sidebar/SidebarBrand";
 | 
				
			||||||
import "@goauthentik/elements/sidebar/SidebarItem";
 | 
					import "@goauthentik/elements/sidebar/SidebarItem";
 | 
				
			||||||
import { ROUTES } from "@goauthentik/user/Routes";
 | 
					import { ROUTES } from "@goauthentik/user/Routes";
 | 
				
			||||||
import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
 | 
					import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
 | 
				
			||||||
@ -192,11 +192,8 @@ export class UserInterface extends Interface {
 | 
				
			|||||||
                        <a href="#/" class="pf-c-page__header-brand-link">
 | 
					                        <a href="#/" class="pf-c-page__header-brand-link">
 | 
				
			||||||
                            <img
 | 
					                            <img
 | 
				
			||||||
                                class="pf-c-brand"
 | 
					                                class="pf-c-brand"
 | 
				
			||||||
                                src="${first(
 | 
					                                src="${first(this.brand?.brandingLogo, DefaultBrand.brandingLogo)}"
 | 
				
			||||||
                                    this.tenant?.brandingLogo,
 | 
					                                alt="${(this.brand?.brandingTitle, DefaultBrand.brandingTitle)}"
 | 
				
			||||||
                                    DefaultTenant.brandingLogo,
 | 
					 | 
				
			||||||
                                )}"
 | 
					 | 
				
			||||||
                                alt="${(this.tenant?.brandingTitle, DefaultTenant.brandingTitle)}"
 | 
					 | 
				
			||||||
                            />
 | 
					                            />
 | 
				
			||||||
                        </a>
 | 
					                        </a>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ import { EVENT_REFRESH } from "@goauthentik/common/constants";
 | 
				
			|||||||
import { MessageLevel } from "@goauthentik/common/messages";
 | 
					import { MessageLevel } from "@goauthentik/common/messages";
 | 
				
			||||||
import { refreshMe } from "@goauthentik/common/users";
 | 
					import { refreshMe } from "@goauthentik/common/users";
 | 
				
			||||||
import { AKElement } from "@goauthentik/elements/Base";
 | 
					import { AKElement } from "@goauthentik/elements/Base";
 | 
				
			||||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
 | 
					import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
 | 
				
			||||||
import { StageHost } from "@goauthentik/flow/stages/base";
 | 
					import { StageHost } from "@goauthentik/flow/stages/base";
 | 
				
			||||||
import "@goauthentik/user/user-settings/details/stages/prompt/PromptStage";
 | 
					import "@goauthentik/user/user-settings/details/stages/prompt/PromptStage";
 | 
				
			||||||
@ -31,10 +31,7 @@ import {
 | 
				
			|||||||
} from "@goauthentik/api";
 | 
					} from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-user-settings-flow-executor")
 | 
					@customElement("ak-user-settings-flow-executor")
 | 
				
			||||||
export class UserSettingsFlowExecutor
 | 
					export class UserSettingsFlowExecutor extends WithBrandConfig(AKElement) implements StageHost {
 | 
				
			||||||
    extends WithTenantConfig(AKElement, true)
 | 
					 | 
				
			||||||
    implements StageHost
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    @property()
 | 
					    @property()
 | 
				
			||||||
    flowSlug?: string;
 | 
					    flowSlug?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -87,7 +84,7 @@ export class UserSettingsFlowExecutor
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    firstUpdated(): void {
 | 
					    firstUpdated(): void {
 | 
				
			||||||
        this.flowSlug = this.tenant?.flowUserSettings;
 | 
					        this.flowSlug = this.brand?.flowUserSettings;
 | 
				
			||||||
        if (!this.flowSlug) {
 | 
					        if (!this.flowSlug) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user