Compare commits
	
		
			1 Commits
		
	
	
		
			dependabot
			...
			linter-fix
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f9e129bed2 | 
| @ -13,6 +13,7 @@ const MAX_PARAMS = 5; | ||||
| // const MAX_COGNITIVE_COMPLEXITY = 9; | ||||
|  | ||||
| const rules = { | ||||
|     "no-param-reassign": "error", | ||||
|     "accessor-pairs": "error", | ||||
|     "array-callback-return": "error", | ||||
|     "block-scoped-var": "error", | ||||
| @ -84,7 +85,6 @@ const rules = { | ||||
|     "no-obj-calls": "error", | ||||
|     "no-octal": "error", | ||||
|     "no-octal-escape": "error", | ||||
|     "no-param-reassign": "error", | ||||
|     "no-proto": "error", | ||||
|     "no-redeclare": "error", | ||||
|     "no-regex-spaces": "error", | ||||
| @ -134,6 +134,7 @@ const rules = { | ||||
|     //    "sonarjs/cognitive-complexity": ["off", MAX_COGNITIVE_COMPLEXITY], | ||||
|     //    "sonarjs/no-duplicate-string": "off", | ||||
|     //    "sonarjs/no-nested-template-literals": "off", | ||||
|     " @typescript-eslint/no-namespace": "off", | ||||
|     "@typescript-eslint/ban-ts-comment": "off", | ||||
|     "@typescript-eslint/no-unused-vars": [ | ||||
|         "error", | ||||
|  | ||||
| @ -48,6 +48,7 @@ export default [ | ||||
|             //    "sonarjs/no-duplicate-string": "off", | ||||
|             //    "sonarjs/no-nested-template-literals": "off", | ||||
|             "@typescript-eslint/ban-ts-comment": "off", | ||||
|  | ||||
|             "@typescript-eslint/no-unused-vars": [ | ||||
|                 "error", | ||||
|                 { | ||||
|  | ||||
| @ -19,7 +19,7 @@ import { AdminApi, CapabilitiesEnum, LicenseSummaryStatusEnum } from "@goauthent | ||||
| @customElement("ak-about-modal") | ||||
| export class AboutModal extends WithLicenseSummary(WithBrandConfig(ModalButton)) { | ||||
|     static get styles() { | ||||
|         return super.styles.concat( | ||||
|         return ModalButton.styles.concat( | ||||
|             PFAbout, | ||||
|             css` | ||||
|                 .pf-c-about-modal-box__hero { | ||||
| @ -59,7 +59,7 @@ export class AboutModal extends WithLicenseSummary(WithBrandConfig(ModalButton)) | ||||
|  | ||||
|     renderModal() { | ||||
|         let product = globalAK().brand.brandingTitle || DefaultBrand.brandingTitle; | ||||
|         if (this.licenseSummary.status != LicenseSummaryStatusEnum.Unlicensed) { | ||||
|         if (this.licenseSummary.status !== LicenseSummaryStatusEnum.Unlicensed) { | ||||
|             product += ` ${msg("Enterprise")}`; | ||||
|         } | ||||
|         return html`<div | ||||
|  | ||||
| @ -46,7 +46,7 @@ export class SystemStatusCard extends AdminStatusCard<SystemInfo> { | ||||
|             return; | ||||
|         } | ||||
|         const outpost = outposts.results[0]; | ||||
|         outpost.config["authentik_host"] = window.location.origin; | ||||
|         outpost.config.authentik_host = window.location.origin; | ||||
|         await new OutpostsApi(DEFAULT_CONFIG).outpostsInstancesUpdate({ | ||||
|             uuid: outpost.pk, | ||||
|             outpostRequest: outpost, | ||||
|  | ||||
| @ -28,16 +28,18 @@ export class WorkersStatusCard extends AdminStatusCard<Worker[]> { | ||||
|                 icon: "fa fa-times-circle pf-m-danger", | ||||
|                 message: html`${msg("No workers connected. Background tasks will not run.")}`, | ||||
|             }); | ||||
|         } else if (value.filter((w) => !w.versionMatching).length > 0) { | ||||
|         } | ||||
|  | ||||
|         if (value.filter((w) => !w.versionMatching).length > 0) { | ||||
|             return Promise.resolve<AdminStatus>({ | ||||
|                 icon: "fa fa-times-circle pf-m-danger", | ||||
|                 message: html`${msg("Worker with incorrect version connected.")}`, | ||||
|             }); | ||||
|         } else { | ||||
|             return Promise.resolve<AdminStatus>({ | ||||
|                 icon: "fa fa-check-circle pf-m-success", | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         return Promise.resolve<AdminStatus>({ | ||||
|             icon: "fa fa-check-circle pf-m-success", | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderValue() { | ||||
|  | ||||
| @ -127,7 +127,7 @@ export class SyncStatusChart extends AKChart<SummarizedSyncStatus[]> { | ||||
|                 msg("LDAP Source"), | ||||
|             ), | ||||
|         ]; | ||||
|         this.centerText = statuses.reduce((total, el) => (total += el.total), 0).toString(); | ||||
|         this.centerText = statuses.reduce((total, el) => total + el.total, 0).toString(); | ||||
|         return statuses; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -6,26 +6,26 @@ import { html } from "lit"; | ||||
| import "../AdminSettingsFooterLinks.js"; | ||||
|  | ||||
| describe("ak-admin-settings-footer-link", () => { | ||||
|     afterEach(async () => { | ||||
|         await browser.execute(async () => { | ||||
|             await document.body.querySelector("ak-admin-settings-footer-link")?.remove(); | ||||
|             if (document.body["_$litPart$"]) { | ||||
|                 // @ts-expect-error expression of type '"_$litPart$"' is added by Lit | ||||
|                 await delete document.body["_$litPart$"]; | ||||
|     afterEach(() => { | ||||
|         return browser.execute(() => { | ||||
|             document.body.querySelector("ak-admin-settings-footer-link")?.remove(); | ||||
|  | ||||
|             if ("_$litPart$" in document.body) { | ||||
|                 delete document.body._$litPart$; | ||||
|             } | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
|     it("should render an empty control", async () => { | ||||
|         render(html`<ak-admin-settings-footer-link name="link"></ak-admin-settings-footer-link>`); | ||||
|         const link = await $("ak-admin-settings-footer-link"); | ||||
|         const link = $("ak-admin-settings-footer-link"); | ||||
|         await expect(await link.getProperty("isValid")).toStrictEqual(false); | ||||
|         await expect(await link.getProperty("toJson")).toEqual({ name: "", href: "" }); | ||||
|     }); | ||||
|  | ||||
|     it("should not be valid if just a name is filled in", async () => { | ||||
|         render(html`<ak-admin-settings-footer-link name="link"></ak-admin-settings-footer-link>`); | ||||
|         const link = await $("ak-admin-settings-footer-link"); | ||||
|         const link = $("ak-admin-settings-footer-link"); | ||||
|         await link.$('input[name="name"]').setValue("foo"); | ||||
|         await expect(await link.getProperty("isValid")).toStrictEqual(false); | ||||
|         await expect(await link.getProperty("toJson")).toEqual({ name: "foo", href: "" }); | ||||
| @ -33,7 +33,7 @@ describe("ak-admin-settings-footer-link", () => { | ||||
|  | ||||
|     it("should be valid if just a URL is filled in", async () => { | ||||
|         render(html`<ak-admin-settings-footer-link name="link"></ak-admin-settings-footer-link>`); | ||||
|         const link = await $("ak-admin-settings-footer-link"); | ||||
|         const link = $("ak-admin-settings-footer-link"); | ||||
|         await link.$('input[name="href"]').setValue("https://foo.com"); | ||||
|         await expect(await link.getProperty("isValid")).toStrictEqual(true); | ||||
|         await expect(await link.getProperty("toJson")).toEqual({ | ||||
| @ -44,7 +44,7 @@ describe("ak-admin-settings-footer-link", () => { | ||||
|  | ||||
|     it("should be valid if both are filled in", async () => { | ||||
|         render(html`<ak-admin-settings-footer-link name="link"></ak-admin-settings-footer-link>`); | ||||
|         const link = await $("ak-admin-settings-footer-link"); | ||||
|         const link = $("ak-admin-settings-footer-link"); | ||||
|         await link.$('input[name="name"]').setValue("foo"); | ||||
|         await link.$('input[name="href"]').setValue("https://foo.com"); | ||||
|         await expect(await link.getProperty("isValid")).toStrictEqual(true); | ||||
| @ -56,7 +56,7 @@ describe("ak-admin-settings-footer-link", () => { | ||||
|  | ||||
|     it("should not be valid if the URL is not valid", async () => { | ||||
|         render(html`<ak-admin-settings-footer-link name="link"></ak-admin-settings-footer-link>`); | ||||
|         const link = await $("ak-admin-settings-footer-link"); | ||||
|         const link = $("ak-admin-settings-footer-link"); | ||||
|         await link.$('input[name="name"]').setValue("foo"); | ||||
|         await link.$('input[name="href"]').setValue("never://foo.com"); | ||||
|         await expect(await link.getProperty("toJson")).toEqual({ | ||||
|  | ||||
| @ -79,7 +79,7 @@ export class ApplicationForm extends WithCapabilitiesConfig(ModelForm<Applicatio | ||||
|             }); | ||||
|         } | ||||
|         if (this.can(CapabilitiesEnum.CanSaveMedia)) { | ||||
|             const icon = this.getFormFiles()["metaIcon"]; | ||||
|             const icon = this.getFormFiles().metaIcon; | ||||
|             if (icon || this.clearIcon) { | ||||
|                 await new CoreApi(DEFAULT_CONFIG).coreApplicationsSetIconCreate({ | ||||
|                     slug: app.slug, | ||||
| @ -117,7 +117,7 @@ export class ApplicationForm extends WithCapabilitiesConfig(ModelForm<Applicatio | ||||
|         if (!(ev instanceof InputEvent) || !ev.target) { | ||||
|             return; | ||||
|         } | ||||
|         this.clearIcon = !!(ev.target as HTMLInputElement).checked; | ||||
|         this.clearIcon = Boolean((ev.target as HTMLInputElement).checked); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -71,7 +71,7 @@ export class ApplicationListPage extends WithBrandConfig(TablePage<Application>) | ||||
|     } | ||||
|  | ||||
|     static get styles(): CSSResult[] { | ||||
|         return super.styles.concat(PFCard, applicationListStyle); | ||||
|         return TablePage.styles.concat(PFCard, applicationListStyle); | ||||
|     } | ||||
|  | ||||
|     columns(): TableColumn[] { | ||||
|  | ||||
| @ -6,7 +6,7 @@ import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import "@goauthentik/elements/forms/Radio"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { CSSResult } from "lit"; | ||||
| @ -31,9 +31,8 @@ export class ApplicationEntitlementForm extends ModelForm<ApplicationEntitlement | ||||
|     getSuccessMessage(): string { | ||||
|         if (this.instance?.pbmUuid) { | ||||
|             return msg("Successfully updated entitlement."); | ||||
|         } else { | ||||
|             return msg("Successfully created entitlement."); | ||||
|         } | ||||
|         return msg("Successfully created entitlement."); | ||||
|     } | ||||
|  | ||||
|     static get styles(): CSSResult[] { | ||||
| @ -49,11 +48,10 @@ export class ApplicationEntitlementForm extends ModelForm<ApplicationEntitlement | ||||
|                 pbmUuid: this.instance.pbmUuid || "", | ||||
|                 applicationEntitlementRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new CoreApi(DEFAULT_CONFIG).coreApplicationEntitlementsCreate({ | ||||
|                 applicationEntitlementRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new CoreApi(DEFAULT_CONFIG).coreApplicationEntitlementsCreate({ | ||||
|             applicationEntitlementRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -15,7 +15,6 @@ import { | ||||
|     ProviderModelEnum, | ||||
|     ProxyMode, | ||||
|     ProxyProvider, | ||||
|     RACProvider, | ||||
|     RadiusProvider, | ||||
|     RedirectURI, | ||||
|     SAMLProvider, | ||||
| @ -51,9 +50,8 @@ function renderRadiusOverview(rawProvider: OneOfProvider) { | ||||
|     ]); | ||||
| } | ||||
|  | ||||
| function renderRACOverview(rawProvider: OneOfProvider) { | ||||
|     // @ts-expect-error TS6133 | ||||
|     const _provider = rawProvider as RACProvider; | ||||
| function renderRACOverview(_rawProvider: OneOfProvider) { | ||||
|     // const _provider = rawProvider as RACProvider; | ||||
| } | ||||
|  | ||||
| function formatRedirectUris(uris: RedirectURI[] = []) { | ||||
|  | ||||
| @ -1,14 +1,13 @@ | ||||
| import { policyOptions } from "@goauthentik/admin/applications/PolicyOptions.js"; | ||||
| import { ApplicationWizardStep } from "@goauthentik/admin/applications/wizard/ApplicationWizardStep.js"; | ||||
| import "@goauthentik/admin/applications/wizard/ak-wizard-title.js"; | ||||
| import { isSlug } from "@goauthentik/common/utils.js"; | ||||
| import { isSlug, isURLInput } from "@goauthentik/common/utils.js"; | ||||
| import { camelToSnake } from "@goauthentik/common/utils.js"; | ||||
| import "@goauthentik/components/ak-radio-input"; | ||||
| import "@goauthentik/components/ak-slug-input"; | ||||
| import "@goauthentik/components/ak-switch-input"; | ||||
| import "@goauthentik/components/ak-text-input"; | ||||
| import { type NavigableButton, type WizardButton } from "@goauthentik/components/ak-wizard/types"; | ||||
| import { type KeyUnknown } from "@goauthentik/elements/forms/Form"; | ||||
| import "@goauthentik/elements/forms/FormGroup"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
|  | ||||
| @ -21,13 +20,25 @@ import { type ApplicationRequest } from "@goauthentik/api"; | ||||
|  | ||||
| import { ApplicationWizardStateUpdate, ValidationRecord } from "../types"; | ||||
|  | ||||
| const autoTrim = (v: unknown) => (typeof v === "string" ? v.trim() : v); | ||||
| /** | ||||
|  * Plucks the specified keys from an object, trimming their values if they are strings. | ||||
|  * | ||||
|  * @template T - The type of the input object. | ||||
|  * @template K - The keys to be plucked from the input object. | ||||
|  * | ||||
|  * @param {T} input - The input object. | ||||
|  * @param {Array<K>} keys - The keys to be plucked from the input object. | ||||
|  */ | ||||
| function trimMany<T extends object, K extends keyof T>(input: T, keys: Array<K>): Pick<T, K> { | ||||
|     const result: Partial<T> = {}; | ||||
|  | ||||
| const trimMany = (o: KeyUnknown, vs: string[]) => | ||||
|     Object.fromEntries(vs.map((v) => [v, autoTrim(o[v])])); | ||||
|     for (const key of keys) { | ||||
|         const value = input[key]; | ||||
|         result[key] = (typeof value === "string" ? value.trim() : value) as T[K]; | ||||
|     } | ||||
|  | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||||
| const isStr = (v: any): v is string => typeof v === "string"; | ||||
|     return result as Pick<T, K>; | ||||
| } | ||||
|  | ||||
| @customElement("ak-application-wizard-application-step") | ||||
| export class ApplicationWizardApplicationStep extends ApplicationWizardStep { | ||||
| @ -37,7 +48,7 @@ export class ApplicationWizardApplicationStep extends ApplicationWizardStep { | ||||
|     errors = new Map<string, string>(); | ||||
|  | ||||
|     @query("form#applicationform") | ||||
|     form!: HTMLFormElement; | ||||
|     declare form: HTMLFormElement; | ||||
|  | ||||
|     constructor() { | ||||
|         super(); | ||||
| @ -54,27 +65,34 @@ export class ApplicationWizardApplicationStep extends ApplicationWizardStep { | ||||
|     } | ||||
|  | ||||
|     get buttons(): WizardButton[] { | ||||
|         return [{ kind: "next", destination: "provider-choice" }, { kind: "cancel" }]; | ||||
|         return [ | ||||
|             // --- | ||||
|             { kind: "next", destination: "provider-choice" }, | ||||
|             { kind: "cancel" }, | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     get valid() { | ||||
|         this.errors = new Map(); | ||||
|         const values = trimMany(this.formValues ?? {}, ["metaLaunchUrl", "name", "slug"]); | ||||
|  | ||||
|         if (values["name"] === "") { | ||||
|         const trimmed = trimMany((this.formValues || {}) as Partial<ApplicationRequest>, [ | ||||
|             "name", | ||||
|             "slug", | ||||
|             "metaLaunchUrl", | ||||
|         ]); | ||||
|  | ||||
|         if (!trimmed.name) { | ||||
|             this.errors.set("name", msg("An application name is required")); | ||||
|         } | ||||
|         if ( | ||||
|             !( | ||||
|                 isStr(values["metaLaunchUrl"]) && | ||||
|                 (values["metaLaunchUrl"] === "" || URL.canParse(values["metaLaunchUrl"])) | ||||
|             ) | ||||
|         ) { | ||||
|  | ||||
|         if (!isURLInput(trimmed.metaLaunchUrl)) { | ||||
|             this.errors.set("metaLaunchUrl", msg("Not a valid URL")); | ||||
|         } | ||||
|         if (!(isStr(values["slug"]) && values["slug"] !== "" && isSlug(values["slug"]))) { | ||||
|  | ||||
|         if (!isSlug(trimmed.slug)) { | ||||
|             this.errors.set("slug", msg("Not a valid slug")); | ||||
|         } | ||||
|  | ||||
|         return this.errors.size === 0; | ||||
|     } | ||||
|  | ||||
| @ -82,27 +100,39 @@ export class ApplicationWizardApplicationStep extends ApplicationWizardStep { | ||||
|         if (button.kind === "next") { | ||||
|             if (!this.valid) { | ||||
|                 this.handleEnabling({ | ||||
|                     disabled: ["provider-choice", "provider", "bindings", "submit"], | ||||
|                     disabled: [ | ||||
|                         // --- | ||||
|                         "provider-choice", | ||||
|                         "provider", | ||||
|                         "bindings", | ||||
|                         "submit", | ||||
|                     ], | ||||
|                 }); | ||||
|  | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             const app: Partial<ApplicationRequest> = this.formValues as Partial<ApplicationRequest>; | ||||
|  | ||||
|             let payload: ApplicationWizardStateUpdate = { | ||||
|                 app: this.formValues, | ||||
|                 errors: this.removeErrors("app"), | ||||
|             }; | ||||
|  | ||||
|             if (app.name && (this.wizard.provider?.name ?? "").trim() === "") { | ||||
|                 payload = { | ||||
|                     ...payload, | ||||
|                     provider: { name: `Provider for ${app.name}` }, | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             this.handleUpdate(payload, button.destination, { | ||||
|                 enable: "provider-choice", | ||||
|             }); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         super.handleButton(button); | ||||
|     } | ||||
|  | ||||
| @ -181,6 +211,7 @@ export class ApplicationWizardApplicationStep extends ApplicationWizardStep { | ||||
|         if (!(this.wizard.app && this.wizard.errors)) { | ||||
|             throw new Error("Application Step received uninitialized wizard context."); | ||||
|         } | ||||
|  | ||||
|         return this.renderForm( | ||||
|             this.wizard.app as ApplicationRequest, | ||||
|             this.wizard.errors?.app ?? {}, | ||||
|  | ||||
| @ -45,7 +45,7 @@ export class ApplicationWizardEditBindingStep extends ApplicationWizardStep { | ||||
|     hide = true; | ||||
|  | ||||
|     @query("form#bindingform") | ||||
|     form!: HTMLFormElement; | ||||
|     declare form: HTMLFormElement; | ||||
|  | ||||
|     @query(".policy-search-select") | ||||
|     searchSelect!: SearchSelectBase<Policy> | SearchSelectBase<Group> | SearchSelectBase<User>; | ||||
|  | ||||
| @ -22,7 +22,7 @@ export class ApplicationWizardProviderSamlForm extends ApplicationWizardProvider | ||||
|         const setHasSigningKp = (ev: InputEvent) => { | ||||
|             const target = ev.target as AkCryptoCertificateSearch; | ||||
|             if (!target) return; | ||||
|             this.hasSigningKp = !!target.selectedKeypair; | ||||
|             this.hasSigningKp = Boolean(target.selectedKeypair); | ||||
|         }; | ||||
|  | ||||
|         return html` <ak-wizard-title>${this.label}</ak-wizard-title> | ||||
|  | ||||
| @ -8,7 +8,7 @@ import "@goauthentik/elements/forms/FormGroup"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { CSSResult, TemplateResult, html } from "lit"; | ||||
| @ -59,11 +59,10 @@ export class BlueprintForm extends ModelForm<BlueprintInstance, string> { | ||||
|                 instanceUuid: this.instance.pk, | ||||
|                 blueprintInstanceRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ManagedApi(DEFAULT_CONFIG).managedBlueprintsCreate({ | ||||
|                 blueprintInstanceRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ManagedApi(DEFAULT_CONFIG).managedBlueprintsCreate({ | ||||
|             blueprintInstanceRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -9,7 +9,7 @@ import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import { DefaultBrand } from "@goauthentik/elements/sidebar/SidebarBrand"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { TemplateResult, html } from "lit"; | ||||
| @ -43,11 +43,10 @@ export class BrandForm extends ModelForm<Brand, string> { | ||||
|                 brandUuid: this.instance.brandUuid, | ||||
|                 brandRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new CoreApi(DEFAULT_CONFIG).coreBrandsCreate({ | ||||
|                 brandRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new CoreApi(DEFAULT_CONFIG).coreBrandsCreate({ | ||||
|             brandRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -107,7 +107,7 @@ export class AkCryptoCertificateSearch extends CustomListenerElement(AKElement) | ||||
|     selected(item: CertificateKeyPair, items: CertificateKeyPair[]) { | ||||
|         return ( | ||||
|             (this.singleton && !this.certificate && items.length === 1) || | ||||
|             (!!this.certificate && this.certificate === item.pk) | ||||
|             (Boolean(this.certificate) && this.certificate === item.pk) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -29,7 +29,7 @@ const metadata: Meta<AkCryptoCertificateSearch> = { | ||||
|     argTypes: { | ||||
|         // Typescript is unaware that arguments for components are treated as properties, and | ||||
|         // properties are typically renamed to lower case, even if the variable is not. | ||||
|         // @ts-expect-error | ||||
|         // @ts-expect-error TODO: Explain. | ||||
|         nokey: { | ||||
|             control: "boolean", | ||||
|             description: | ||||
| @ -75,7 +75,7 @@ export const CryptoCertificateSearch = () => { | ||||
|     // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||||
|     const showMessage = (ev: CustomEvent<any>) => { | ||||
|         const detail = ev.detail; | ||||
|         delete detail["target"]; | ||||
|         delete detail.target; | ||||
|         document.getElementById("message-pad")!.innerText = `Event: ${JSON.stringify( | ||||
|             detail, | ||||
|             null, | ||||
|  | ||||
| @ -30,11 +30,10 @@ export class CertificateKeyPairForm extends ModelForm<CertificateKeyPair, string | ||||
|                 kpUuid: this.instance.pk || "", | ||||
|                 patchedCertificateKeyPairRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new CryptoApi(DEFAULT_CONFIG).cryptoCertificatekeypairsCreate({ | ||||
|                 certificateKeyPairRequest: data as unknown as CertificateKeyPairRequest, | ||||
|             }); | ||||
|         } | ||||
|         return new CryptoApi(DEFAULT_CONFIG).cryptoCertificatekeypairsCreate({ | ||||
|             certificateKeyPairRequest: data as unknown as CertificateKeyPairRequest, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -51,11 +51,10 @@ export class RuleForm extends ModelForm<NotificationRule, string> { | ||||
|                 pbmUuid: this.instance.pk || "", | ||||
|                 notificationRuleRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new EventsApi(DEFAULT_CONFIG).eventsRulesCreate({ | ||||
|                 notificationRuleRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new EventsApi(DEFAULT_CONFIG).eventsRulesCreate({ | ||||
|             notificationRuleRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -47,11 +47,10 @@ export class TransportForm extends ModelForm<NotificationTransport, string> { | ||||
|                 uuid: this.instance.pk || "", | ||||
|                 notificationTransportRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new EventsApi(DEFAULT_CONFIG).eventsTransportsCreate({ | ||||
|                 notificationTransportRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new EventsApi(DEFAULT_CONFIG).eventsTransportsCreate({ | ||||
|             notificationTransportRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     onModeChange(mode: string | undefined): void { | ||||
|  | ||||
| @ -58,7 +58,7 @@ export class FlowForm extends WithCapabilitiesConfig(ModelForm<Flow, string>) { | ||||
|         } | ||||
|  | ||||
|         if (this.can(CapabilitiesEnum.CanSaveMedia)) { | ||||
|             const icon = this.getFormFiles()["background"]; | ||||
|             const icon = this.getFormFiles().background; | ||||
|             if (icon || this.clearBackground) { | ||||
|                 await new FlowsApi(DEFAULT_CONFIG).flowsInstancesSetBackgroundCreate({ | ||||
|                     slug: flow.slug, | ||||
|  | ||||
| @ -27,7 +27,7 @@ export class FlowImportForm extends Form<Flow> { | ||||
|     } | ||||
|  | ||||
|     async send(): Promise<FlowImportResult> { | ||||
|         const file = this.getFormFiles()["flow"]; | ||||
|         const file = this.getFormFiles().flow; | ||||
|         if (!file) { | ||||
|             throw new SentryIgnoredError("No form data"); | ||||
|         } | ||||
|  | ||||
| @ -39,9 +39,8 @@ export class StageBindingForm extends ModelForm<FlowStageBinding, string> { | ||||
|     getSuccessMessage(): string { | ||||
|         if (this.instance?.pk) { | ||||
|             return msg("Successfully updated binding."); | ||||
|         } else { | ||||
|             return msg("Successfully created binding."); | ||||
|         } | ||||
|         return msg("Successfully created binding."); | ||||
|     } | ||||
|  | ||||
|     send(data: FlowStageBinding): Promise<unknown> { | ||||
| @ -50,14 +49,13 @@ export class StageBindingForm extends ModelForm<FlowStageBinding, string> { | ||||
|                 fsbUuid: this.instance.pk, | ||||
|                 patchedFlowStageBindingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             if (this.targetPk) { | ||||
|                 data.target = this.targetPk; | ||||
|             } | ||||
|             return new FlowsApi(DEFAULT_CONFIG).flowsBindingsCreate({ | ||||
|                 flowStageBindingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         if (this.targetPk) { | ||||
|             data.target = this.targetPk; | ||||
|         } | ||||
|         return new FlowsApi(DEFAULT_CONFIG).flowsBindingsCreate({ | ||||
|             flowStageBindingRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     async getOrder(): Promise<number> { | ||||
|  | ||||
| @ -10,7 +10,7 @@ import "@goauthentik/elements/chips/ChipGroup"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { CSSResult, TemplateResult, css, html } from "lit"; | ||||
| @ -55,12 +55,11 @@ export class GroupForm extends ModelForm<Group, string> { | ||||
|                 groupUuid: this.instance.pk, | ||||
|                 patchedGroupRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             data.users = []; | ||||
|             return new CoreApi(DEFAULT_CONFIG).coreGroupsCreate({ | ||||
|                 groupRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         data.users = []; | ||||
|         return new CoreApi(DEFAULT_CONFIG).coreGroupsCreate({ | ||||
|             groupRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -125,7 +125,8 @@ export class RelatedGroupList extends Table<Group> { | ||||
|             buttonLabel=${msg("Remove")} | ||||
|             .objects=${this.selectedElements} | ||||
|             .delete=${(item: Group) => { | ||||
|                 if (!this.targetUser) return; | ||||
|                 if (!this.targetUser) return null; | ||||
|  | ||||
|                 return new CoreApi(DEFAULT_CONFIG).coreGroupsRemoveUserCreate({ | ||||
|                     groupUuid: item.pk, | ||||
|                     userAccountRequest: { | ||||
|  | ||||
| @ -46,8 +46,12 @@ import { | ||||
|     User, | ||||
| } from "@goauthentik/api"; | ||||
|  | ||||
| interface AddUsersToGroupFormData { | ||||
|     users: number[]; | ||||
| } | ||||
|  | ||||
| @customElement("ak-user-related-add") | ||||
| export class RelatedUserAdd extends Form<{ users: number[] }> { | ||||
| export class RelatedUserAdd extends Form<AddUsersToGroupFormData> { | ||||
|     @property({ attribute: false }) | ||||
|     group?: Group; | ||||
|  | ||||
| @ -58,7 +62,7 @@ export class RelatedUserAdd extends Form<{ users: number[] }> { | ||||
|         return msg("Successfully added user(s)."); | ||||
|     } | ||||
|  | ||||
|     async send(data: { users: number[] }): Promise<{ users: number[] }> { | ||||
|     async send(data: AddUsersToGroupFormData): Promise<AddUsersToGroupFormData> { | ||||
|         await Promise.all( | ||||
|             data.users.map((user) => { | ||||
|                 return new CoreApi(DEFAULT_CONFIG).coreGroupsAddUserCreate({ | ||||
| @ -69,6 +73,7 @@ export class RelatedUserAdd extends Form<{ users: number[] }> { | ||||
|                 }); | ||||
|             }), | ||||
|         ); | ||||
|  | ||||
|         return data; | ||||
|     } | ||||
|  | ||||
| @ -133,7 +138,7 @@ export class RelatedUserList extends WithBrandConfig(WithCapabilitiesConfig(Tabl | ||||
|     me?: SessionUser; | ||||
|  | ||||
|     static get styles(): CSSResult[] { | ||||
|         return super.styles.concat(PFDescriptionList, PFAlert, PFBanner); | ||||
|         return Table.styles.concat(PFDescriptionList, PFAlert, PFBanner); | ||||
|     } | ||||
|  | ||||
|     async apiEndpoint(): Promise<PaginatedResponse<User>> { | ||||
|  | ||||
| @ -65,7 +65,7 @@ export class OutpostDeploymentModal extends ModalButton { | ||||
|                         </label> | ||||
|                         <input class="pf-c-form-control" readonly type="text" value="true" /> | ||||
|                     </div> | ||||
|                     ${this.outpost?.type == OutpostTypeEnum.Proxy | ||||
|                     ${this.outpost?.type === OutpostTypeEnum.Proxy | ||||
|                         ? html` | ||||
|                               <h3> | ||||
|                                   ${msg( | ||||
|  | ||||
| @ -10,7 +10,7 @@ import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import { PaginatedResponse } from "@goauthentik/elements/table/Table"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { TemplateResult, html } from "lit"; | ||||
| @ -129,11 +129,10 @@ export class OutpostForm extends ModelForm<Outpost, string> { | ||||
|                 uuid: this.instance.pk || "", | ||||
|                 outpostRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new OutpostsApi(DEFAULT_CONFIG).outpostsInstancesCreate({ | ||||
|                 outpostRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new OutpostsApi(DEFAULT_CONFIG).outpostsInstancesCreate({ | ||||
|             outpostRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -32,11 +32,10 @@ export class ServiceConnectionDockerForm extends ModelForm<DockerServiceConnecti | ||||
|                 uuid: this.instance.pk || "", | ||||
|                 dockerServiceConnectionRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new OutpostsApi(DEFAULT_CONFIG).outpostsServiceConnectionsDockerCreate({ | ||||
|                 dockerServiceConnectionRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new OutpostsApi(DEFAULT_CONFIG).outpostsServiceConnectionsDockerCreate({ | ||||
|             dockerServiceConnectionRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -4,7 +4,7 @@ import "@goauthentik/elements/CodeMirror"; | ||||
| import { CodeMirrorMode } from "@goauthentik/elements/CodeMirror"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { TemplateResult, html } from "lit"; | ||||
| @ -36,11 +36,10 @@ export class ServiceConnectionKubernetesForm extends ModelForm< | ||||
|                 uuid: this.instance.pk || "", | ||||
|                 kubernetesServiceConnectionRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new OutpostsApi(DEFAULT_CONFIG).outpostsServiceConnectionsKubernetesCreate({ | ||||
|                 kubernetesServiceConnectionRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new OutpostsApi(DEFAULT_CONFIG).outpostsServiceConnectionsKubernetesCreate({ | ||||
|             kubernetesServiceConnectionRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -72,9 +72,8 @@ export class BoundPoliciesList extends Table<PolicyBinding> { | ||||
|             return msg(str`Group ${item.groupObj?.name}`); | ||||
|         } else if (item.user) { | ||||
|             return msg(str`User ${item.userObj?.name}`); | ||||
|         } else { | ||||
|             return msg("-"); | ||||
|         } | ||||
|         return msg("-"); | ||||
|     } | ||||
|  | ||||
|     getPolicyUserGroupRow(item: PolicyBinding): TemplateResult { | ||||
| @ -123,9 +122,8 @@ export class BoundPoliciesList extends Table<PolicyBinding> { | ||||
|                     ${msg("Edit User")} | ||||
|                 </button> | ||||
|             </ak-forms-modal>`; | ||||
|         } else { | ||||
|             return html``; | ||||
|         } | ||||
|         return html``; | ||||
|     } | ||||
|  | ||||
|     renderToolbarSelected(): TemplateResult { | ||||
|  | ||||
| @ -72,9 +72,8 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> { | ||||
|     getSuccessMessage(): string { | ||||
|         if (this.instance?.pk) { | ||||
|             return msg("Successfully updated binding."); | ||||
|         } else { | ||||
|             return msg("Successfully created binding."); | ||||
|         } | ||||
|         return msg("Successfully created binding."); | ||||
|     } | ||||
|  | ||||
|     static get styles(): CSSResult[] { | ||||
| @ -111,11 +110,10 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> { | ||||
|                 policyBindingUuid: this.instance.pk, | ||||
|                 policyBindingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsCreate({ | ||||
|                 policyBindingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsCreate({ | ||||
|             policyBindingRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     async getOrder(): Promise<number> { | ||||
|  | ||||
| @ -7,7 +7,7 @@ import "@goauthentik/elements/events/LogViewer"; | ||||
| import { Form } from "@goauthentik/elements/forms/Form"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { CSSResult, TemplateResult, html } from "lit"; | ||||
|  | ||||
| @ -25,11 +25,11 @@ export class DummyPolicyForm extends BasePolicyForm<DummyPolicy> { | ||||
|                 policyUuid: this.instance.pk || "", | ||||
|                 dummyPolicyRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesDummyCreate({ | ||||
|                 dummyPolicyRequest: data, | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesDummyCreate({ | ||||
|             dummyPolicyRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -37,11 +37,10 @@ export class EventMatcherPolicyForm extends BasePolicyForm<EventMatcherPolicy> { | ||||
|                 policyUuid: this.instance.pk || "", | ||||
|                 eventMatcherPolicyRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesEventMatcherCreate({ | ||||
|                 eventMatcherPolicyRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesEventMatcherCreate({ | ||||
|             eventMatcherPolicyRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class PasswordExpiryPolicyForm extends BasePolicyForm<PasswordExpiryPolic | ||||
|                 policyUuid: this.instance.pk || "", | ||||
|                 passwordExpiryPolicyRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesPasswordExpiryCreate({ | ||||
|                 passwordExpiryPolicyRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesPasswordExpiryCreate({ | ||||
|             passwordExpiryPolicyRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -28,11 +28,10 @@ export class ExpressionPolicyForm extends BasePolicyForm<ExpressionPolicy> { | ||||
|                 policyUuid: this.instance.pk || "", | ||||
|                 expressionPolicyRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesExpressionCreate({ | ||||
|                 expressionPolicyRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesExpressionCreate({ | ||||
|             expressionPolicyRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -39,11 +39,10 @@ export class GeoIPPolicyForm extends BasePolicyForm<GeoIPPolicy> { | ||||
|                 policyUuid: this.instance.pk || "", | ||||
|                 geoIPPolicyRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesGeoipCreate({ | ||||
|                 geoIPPolicyRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesGeoipCreate({ | ||||
|             geoIPPolicyRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -38,11 +38,10 @@ export class PasswordPolicyForm extends BasePolicyForm<PasswordPolicy> { | ||||
|                 policyUuid: this.instance.pk || "", | ||||
|                 passwordPolicyRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesPasswordCreate({ | ||||
|                 passwordPolicyRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesPasswordCreate({ | ||||
|             passwordPolicyRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderStaticRules(): TemplateResult { | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class ReputationPolicyForm extends BasePolicyForm<ReputationPolicy> { | ||||
|                 policyUuid: this.instance.pk || "", | ||||
|                 reputationPolicyRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PoliciesApi(DEFAULT_CONFIG).policiesReputationCreate({ | ||||
|                 reputationPolicyRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PoliciesApi(DEFAULT_CONFIG).policiesReputationCreate({ | ||||
|             reputationPolicyRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -21,11 +21,10 @@ export class PropertyMappingNotification extends BasePropertyMappingForm<Notific | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 notificationWebhookMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsNotificationCreate({ | ||||
|                 notificationWebhookMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsNotificationCreate({ | ||||
|             notificationWebhookMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,13 +25,12 @@ export class PropertyMappingProviderGoogleWorkspaceForm extends BasePropertyMapp | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 googleWorkspaceProviderMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi( | ||||
|                 DEFAULT_CONFIG, | ||||
|             ).propertymappingsProviderGoogleWorkspaceCreate({ | ||||
|                 googleWorkspaceProviderMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi( | ||||
|             DEFAULT_CONFIG, | ||||
|         ).propertymappingsProviderGoogleWorkspaceCreate({ | ||||
|             googleWorkspaceProviderMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,13 +25,12 @@ export class PropertyMappingProviderMicrosoftEntraForm extends BasePropertyMappi | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 microsoftEntraProviderMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi( | ||||
|                 DEFAULT_CONFIG, | ||||
|             ).propertymappingsProviderMicrosoftEntraCreate({ | ||||
|                 microsoftEntraProviderMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderMicrosoftEntraCreate( | ||||
|             { | ||||
|                 microsoftEntraProviderMappingRequest: data, | ||||
|             }, | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -46,11 +46,10 @@ export class PropertyMappingProviderRACForm extends BasePropertyMappingForm<RACP | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 rACPropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderRacCreate({ | ||||
|                 rACPropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderRacCreate({ | ||||
|             rACPropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -21,11 +21,10 @@ export class PropertyMappingProviderRadiusForm extends BasePropertyMappingForm<R | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 radiusProviderPropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderRadiusCreate({ | ||||
|                 radiusProviderPropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderRadiusCreate({ | ||||
|             radiusProviderPropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -24,11 +24,10 @@ export class PropertyMappingProviderSAMLForm extends BasePropertyMappingForm<SAM | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 sAMLPropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderSamlCreate({ | ||||
|                 sAMLPropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderSamlCreate({ | ||||
|             sAMLPropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderExtraFields(): TemplateResult { | ||||
|  | ||||
| @ -21,11 +21,10 @@ export class PropertyMappingProviderSCIMForm extends BasePropertyMappingForm<SCI | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 sCIMMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderScimCreate({ | ||||
|                 sCIMMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderScimCreate({ | ||||
|             sCIMMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -24,11 +24,10 @@ export class PropertyMappingProviderScopeForm extends BasePropertyMappingForm<Sc | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 scopeMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderScopeCreate({ | ||||
|                 scopeMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsProviderScopeCreate({ | ||||
|             scopeMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderExtraFields(): TemplateResult { | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class PropertyMappingSourceKerberosForm extends BasePropertyMappingForm<K | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 kerberosSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceKerberosCreate({ | ||||
|                 kerberosSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceKerberosCreate({ | ||||
|             kerberosSourcePropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class PropertyMappingSourceLDAPForm extends BasePropertyMappingForm<LDAPS | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 lDAPSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceLdapCreate({ | ||||
|                 lDAPSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceLdapCreate({ | ||||
|             lDAPSourcePropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class PropertyMappingSourceOAuthForm extends BasePropertyMappingForm<OAut | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 oAuthSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceOauthCreate({ | ||||
|                 oAuthSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceOauthCreate({ | ||||
|             oAuthSourcePropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class PropertyMappingSourcePlexForm extends BasePropertyMappingForm<PlexS | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 plexSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourcePlexCreate({ | ||||
|                 plexSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourcePlexCreate({ | ||||
|             plexSourcePropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class PropertyMappingSourceSAMLForm extends BasePropertyMappingForm<SAMLS | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 sAMLSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceSamlCreate({ | ||||
|                 sAMLSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceSamlCreate({ | ||||
|             sAMLSourcePropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,11 +25,10 @@ export class PropertyMappingSourceSCIMForm extends BasePropertyMappingForm<SCIMS | ||||
|                 pmUuid: this.instance.pk, | ||||
|                 sCIMSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceScimCreate({ | ||||
|                 sCIMSourcePropertyMappingRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsSourceScimCreate({ | ||||
|             sCIMSourcePropertyMappingRequest: data, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -5,7 +5,7 @@ import { CodeMirrorMode } from "@goauthentik/elements/CodeMirror"; | ||||
| import { Form } from "@goauthentik/elements/forms/Form"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { TemplateResult, html, nothing } from "lit"; | ||||
|  | ||||
| @ -42,11 +42,10 @@ export class GoogleWorkspaceProviderFormPage extends BaseProviderForm<GoogleWork | ||||
|                 id: this.instance.pk, | ||||
|                 googleWorkspaceProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersGoogleWorkspaceCreate({ | ||||
|                 googleWorkspaceProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersGoogleWorkspaceCreate({ | ||||
|             googleWorkspaceProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -24,11 +24,10 @@ export class LDAPProviderFormPage extends WithBrandConfig(BaseProviderForm<LDAPP | ||||
|                 id: this.instance.pk, | ||||
|                 lDAPProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersLdapCreate({ | ||||
|                 lDAPProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersLdapCreate({ | ||||
|             lDAPProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm() { | ||||
|  | ||||
| @ -40,11 +40,10 @@ export class MicrosoftEntraProviderFormPage extends BaseProviderForm<MicrosoftEn | ||||
|                 id: this.instance.pk, | ||||
|                 microsoftEntraProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersMicrosoftEntraCreate({ | ||||
|                 microsoftEntraProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersMicrosoftEntraCreate({ | ||||
|             microsoftEntraProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -82,11 +82,10 @@ export class OAuth2ProviderFormPage extends BaseProviderForm<OAuth2Provider> { | ||||
|                 id: this.instance.pk, | ||||
|                 oAuth2ProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersOauth2Create({ | ||||
|                 oAuth2ProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersOauth2Create({ | ||||
|             oAuth2ProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm() { | ||||
|  | ||||
| @ -45,11 +45,10 @@ export class ProxyProviderFormPage extends BaseProviderForm<ProxyProvider> { | ||||
|                 id: this.instance.pk, | ||||
|                 proxyProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersProxyCreate({ | ||||
|                 proxyProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersProxyCreate({ | ||||
|             proxyProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm() { | ||||
|  | ||||
| @ -60,6 +60,9 @@ export function ModeToLabel(action?: ProxyMode): string { | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Predicate to determine if a given proxy mode should forward. | ||||
|  */ | ||||
| export function isForward(mode: ProxyMode): boolean { | ||||
|     switch (mode) { | ||||
|         case ProxyMode.Proxy: | ||||
| @ -156,13 +159,12 @@ export class ProxyProviderViewPage extends AKElement { | ||||
|             (input: string): string => { | ||||
|                 // The generated config is pretty unreliable currently so | ||||
|                 // put it behind a flag | ||||
|                 if (!getURLParam("generatedConfig", false)) { | ||||
|                     return input; | ||||
|                 } | ||||
|                 if (!this.provider) { | ||||
|                     return input; | ||||
|                 } | ||||
|                 if (!getURLParam("generatedConfig", false)) return input; | ||||
|  | ||||
|                 if (!this.provider) return input; | ||||
|  | ||||
|                 const extHost = new URL(this.provider.externalHost); | ||||
|  | ||||
|                 // See website/docs/add-secure-apps/providers/proxy/forward_auth.mdx | ||||
|                 if (this.provider?.mode === ProxyMode.ForwardSingle) { | ||||
|                     return input | ||||
| @ -170,13 +172,16 @@ export class ProxyProviderViewPage extends AKElement { | ||||
|                         .replaceAll("outpost.company:9000", window.location.hostname) | ||||
|                         .replaceAll("https://app.company", extHost.toString()) | ||||
|                         .replaceAll("app.company", extHost.hostname); | ||||
|                 } else if (this.provider?.mode == ProxyMode.ForwardDomain) { | ||||
|                 } | ||||
|  | ||||
|                 if (this.provider?.mode === ProxyMode.ForwardDomain) { | ||||
|                     return input | ||||
|                         .replaceAll("authentik.company", window.location.hostname) | ||||
|                         .replaceAll("outpost.company:9000", extHost.toString()) | ||||
|                         .replaceAll("https://app.company", extHost.toString()) | ||||
|                         .replaceAll("app.company", extHost.hostname); | ||||
|                 } | ||||
|  | ||||
|                 return input; | ||||
|             }, | ||||
|         ]; | ||||
|  | ||||
| @ -6,7 +6,7 @@ import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-pro | ||||
| import "@goauthentik/elements/forms/FormGroup"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { TemplateResult, html } from "lit"; | ||||
| @ -46,11 +46,10 @@ export class EndpointForm extends ModelForm<Endpoint, string> { | ||||
|                 pbmUuid: this.instance.pk || "", | ||||
|                 patchedEndpointRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new RacApi(DEFAULT_CONFIG).racEndpointsCreate({ | ||||
|                 endpointRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new RacApi(DEFAULT_CONFIG).racEndpointsCreate({ | ||||
|             endpointRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -10,7 +10,7 @@ import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import "@goauthentik/elements/forms/Radio"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import "@goauthentik/elements/utils/TimeDeltaHelp"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { TemplateResult, html } from "lit"; | ||||
| @ -32,9 +32,8 @@ export class RACProviderFormPage extends ModelForm<RACProvider, number> { | ||||
|     getSuccessMessage(): string { | ||||
|         if (this.instance) { | ||||
|             return msg("Successfully updated provider."); | ||||
|         } else { | ||||
|             return msg("Successfully created provider."); | ||||
|         } | ||||
|         return msg("Successfully created provider."); | ||||
|     } | ||||
|  | ||||
|     async send(data: RACProvider): Promise<RACProvider> { | ||||
| @ -43,11 +42,10 @@ export class RACProviderFormPage extends ModelForm<RACProvider, number> { | ||||
|                 id: this.instance.pk, | ||||
|                 rACProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersRacCreate({ | ||||
|                 rACProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersRacCreate({ | ||||
|             rACProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -22,11 +22,10 @@ export class RadiusProviderFormPage extends WithBrandConfig(BaseProviderForm<Rad | ||||
|                 id: this.instance.pk, | ||||
|                 radiusProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersRadiusCreate({ | ||||
|                 radiusProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersRadiusCreate({ | ||||
|             radiusProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm() { | ||||
|  | ||||
| @ -17,7 +17,7 @@ export class SAMLProviderFormPage extends BaseProviderForm<SAMLProvider> { | ||||
|         const provider = await new ProvidersApi(DEFAULT_CONFIG).providersSamlRetrieve({ | ||||
|             id: pk, | ||||
|         }); | ||||
|         this.hasSigningKp = !!provider.signingKp; | ||||
|         this.hasSigningKp = Boolean(provider.signingKp); | ||||
|         return provider; | ||||
|     } | ||||
|  | ||||
| @ -27,18 +27,17 @@ export class SAMLProviderFormPage extends BaseProviderForm<SAMLProvider> { | ||||
|                 id: this.instance.pk, | ||||
|                 sAMLProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersSamlCreate({ | ||||
|                 sAMLProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersSamlCreate({ | ||||
|             sAMLProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm() { | ||||
|         const setHasSigningKp = (ev: InputEvent) => { | ||||
|             const target = ev.target as AkCryptoCertificateSearch; | ||||
|             if (!target) return; | ||||
|             this.hasSigningKp = !!target.selectedKeypair; | ||||
|             this.hasSigningKp = Boolean(target.selectedKeypair); | ||||
|         }; | ||||
|  | ||||
|         return renderForm(this.instance ?? {}, [], setHasSigningKp, this.hasSigningKp); | ||||
|  | ||||
| @ -18,7 +18,7 @@ export class SAMLProviderImportForm extends Form<SAMLProvider> { | ||||
|     } | ||||
|  | ||||
|     async send(data: SAMLProvider): Promise<void> { | ||||
|         const file = this.getFormFiles()["metadata"]; | ||||
|         const file = this.getFormFiles().metadata; | ||||
|         if (!file) { | ||||
|             throw new SentryIgnoredError("No form data"); | ||||
|         } | ||||
|  | ||||
| @ -21,11 +21,10 @@ export class SCIMProviderFormPage extends BaseProviderForm<SCIMProvider> { | ||||
|                 id: this.instance.pk, | ||||
|                 sCIMProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersScimCreate({ | ||||
|                 sCIMProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersScimCreate({ | ||||
|             sCIMProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm() { | ||||
|  | ||||
| @ -43,11 +43,10 @@ export class SSFProviderFormPage extends BaseProviderForm<SSFProvider> { | ||||
|                 id: this.instance.pk, | ||||
|                 sSFProviderRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new ProvidersApi(DEFAULT_CONFIG).providersSsfCreate({ | ||||
|                 sSFProviderRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new ProvidersApi(DEFAULT_CONFIG).providersSsfCreate({ | ||||
|             sSFProviderRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -32,11 +32,10 @@ export class RoleForm extends ModelForm<Role, string> { | ||||
|                 uuid: this.instance.pk, | ||||
|                 patchedRoleRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new RbacApi(DEFAULT_CONFIG).rbacRolesCreate({ | ||||
|                 roleRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new RbacApi(DEFAULT_CONFIG).rbacRolesCreate({ | ||||
|             roleRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -3,7 +3,10 @@ import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import { msg } from "@lit/localize"; | ||||
|  | ||||
| export abstract class BaseSourceForm<T> extends ModelForm<T, string> { | ||||
|     getSuccessMessage(): string { | ||||
|     /** | ||||
|      * Success message to display after a successful form submission. | ||||
|      */ | ||||
|     public getSuccessMessage(): string { | ||||
|         return this.instance | ||||
|             ? msg("Successfully updated source.") | ||||
|             : msg("Successfully created source."); | ||||
|  | ||||
| @ -42,6 +42,7 @@ export class KerberosSourceForm extends WithCapabilitiesConfig(BaseSourceForm<Ke | ||||
|         const source = await new SourcesApi(DEFAULT_CONFIG).sourcesKerberosRetrieve({ | ||||
|             slug: pk, | ||||
|         }); | ||||
|  | ||||
|         this.clearIcon = false; | ||||
|         return source; | ||||
|     } | ||||
| @ -63,7 +64,7 @@ export class KerberosSourceForm extends WithCapabilitiesConfig(BaseSourceForm<Ke | ||||
|         } | ||||
|         const c = await config(); | ||||
|         if (c.capabilities.includes(CapabilitiesEnum.CanSaveMedia)) { | ||||
|             const icon = this.getFormFiles()["icon"]; | ||||
|             const icon = this.getFormFiles().icon; | ||||
|             if (icon || this.clearIcon) { | ||||
|                 await new SourcesApi(DEFAULT_CONFIG).sourcesAllSetIconCreate({ | ||||
|                     slug: source.slug, | ||||
|  | ||||
| @ -25,7 +25,7 @@ export function propertyMappingsSelector(object: string, instanceMappings?: stri | ||||
|         return async (mappings: DualSelectPair<KerberosSourcePropertyMapping>[]) => | ||||
|             mappings.filter( | ||||
|                 ([_0, _1, _2, mapping]: DualSelectPair<KerberosSourcePropertyMapping>) => | ||||
|                     object == "user" && | ||||
|                     object === "user" && | ||||
|                     mapping?.managed?.startsWith("goauthentik.io/sources/kerberos/user/default/"), | ||||
|             ); | ||||
|     } | ||||
|  | ||||
| @ -73,7 +73,7 @@ export class OAuthSourceForm extends WithCapabilitiesConfig(BaseSourceForm<OAuth | ||||
|         } | ||||
|         const c = await config(); | ||||
|         if (c.capabilities.includes(CapabilitiesEnum.CanSaveMedia)) { | ||||
|             const icon = this.getFormFiles()["icon"]; | ||||
|             const icon = this.getFormFiles().icon; | ||||
|             if (icon || this.clearIcon) { | ||||
|                 await new SourcesApi(DEFAULT_CONFIG).sourcesAllSetIconCreate({ | ||||
|                     slug: source.slug, | ||||
|  | ||||
| @ -75,7 +75,7 @@ export class PlexSourceForm extends WithCapabilitiesConfig(BaseSourceForm<PlexSo | ||||
|             }); | ||||
|         } | ||||
|         if (this.can(CapabilitiesEnum.CanSaveMedia)) { | ||||
|             const icon = this.getFormFiles()["icon"]; | ||||
|             const icon = this.getFormFiles().icon; | ||||
|             if (icon || this.clearIcon) { | ||||
|                 await new SourcesApi(DEFAULT_CONFIG).sourcesAllSetIconCreate({ | ||||
|                     slug: source.slug, | ||||
| @ -160,7 +160,7 @@ export class PlexSourceForm extends WithCapabilitiesConfig(BaseSourceForm<PlexSo | ||||
|                     ${this.plexResources?.map((r) => { | ||||
|                         const selected = Array.from(this.instance?.allowedServers || []).some( | ||||
|                             (server) => { | ||||
|                                 return server == r.clientIdentifier; | ||||
|                                 return server === r.clientIdentifier; | ||||
|                             }, | ||||
|                         ); | ||||
|                         return html`<option value=${r.clientIdentifier} ?selected=${selected}> | ||||
|  | ||||
| @ -64,7 +64,7 @@ export class SAMLSourceForm extends WithCapabilitiesConfig(BaseSourceForm<SAMLSo | ||||
|         } | ||||
|         const c = await config(); | ||||
|         if (c.capabilities.includes(CapabilitiesEnum.CanSaveMedia)) { | ||||
|             const icon = this.getFormFiles()["icon"]; | ||||
|             const icon = this.getFormFiles().icon; | ||||
|             if (icon || this.clearIcon) { | ||||
|                 await new SourcesApi(DEFAULT_CONFIG).sourcesAllSetIconCreate({ | ||||
|                     slug: source.slug, | ||||
|  | ||||
| @ -33,11 +33,10 @@ export class SCIMSourceForm extends BaseSourceForm<SCIMSource> { | ||||
|                 slug: this.instance.slug, | ||||
|                 patchedSCIMSourceRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new SourcesApi(DEFAULT_CONFIG).sourcesScimCreate({ | ||||
|                 sCIMSourceRequest: data as unknown as SCIMSourceRequest, | ||||
|             }); | ||||
|         } | ||||
|         return new SourcesApi(DEFAULT_CONFIG).sourcesScimCreate({ | ||||
|             sCIMSourceRequest: data as unknown as SCIMSourceRequest, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -34,11 +34,10 @@ export class AuthenticatorDuoStageForm extends BaseStageForm<AuthenticatorDuoSta | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 patchedAuthenticatorDuoStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorDuoCreate({ | ||||
|                 authenticatorDuoStageRequest: data as unknown as AuthenticatorDuoStageRequest, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorDuoCreate({ | ||||
|             authenticatorDuoStageRequest: data as unknown as AuthenticatorDuoStageRequest, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -40,11 +40,10 @@ export class AuthenticatorEmailStageForm extends BaseStageForm<AuthenticatorEmai | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 authenticatorEmailStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorEmailCreate({ | ||||
|                 authenticatorEmailStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorEmailCreate({ | ||||
|             authenticatorEmailStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderConnectionSettings(): TemplateResult { | ||||
|  | ||||
| @ -28,11 +28,10 @@ export class AuthenticatorEndpointGDTCStageForm extends BaseStageForm<Authentica | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 patchedAuthenticatorEndpointGDTCStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorEndpointGdtcCreate({ | ||||
|                 authenticatorEndpointGDTCStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorEndpointGdtcCreate({ | ||||
|             authenticatorEndpointGDTCStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     static get styles() { | ||||
|  | ||||
| @ -51,11 +51,10 @@ export class AuthenticatorSMSStageForm extends BaseStageForm<AuthenticatorSMSSta | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 authenticatorSMSStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorSmsCreate({ | ||||
|                 authenticatorSMSStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorSmsCreate({ | ||||
|             authenticatorSMSStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderProviderTwillio(): TemplateResult { | ||||
|  | ||||
| @ -32,11 +32,10 @@ export class AuthenticatorStaticStageForm extends BaseStageForm<AuthenticatorSta | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 authenticatorStaticStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorStaticCreate({ | ||||
|                 authenticatorStaticStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorStaticCreate({ | ||||
|             authenticatorStaticStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -34,11 +34,10 @@ export class AuthenticatorTOTPStageForm extends BaseStageForm<AuthenticatorTOTPS | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 authenticatorTOTPStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorTotpCreate({ | ||||
|                 authenticatorTOTPStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorTotpCreate({ | ||||
|             authenticatorTOTPStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -57,11 +57,10 @@ export class AuthenticatorValidateStageForm extends BaseStageForm<AuthenticatorV | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 authenticatorValidateStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorValidateCreate({ | ||||
|                 authenticatorValidateStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorValidateCreate({ | ||||
|             authenticatorValidateStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     isDeviceClassSelected(field: DeviceClassesEnum): boolean { | ||||
|  | ||||
| @ -42,11 +42,10 @@ export class AuthenticatorWebAuthnStageForm extends BaseStageForm<AuthenticatorW | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 authenticatorWebAuthnStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorWebauthnCreate({ | ||||
|                 authenticatorWebAuthnStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorWebauthnCreate({ | ||||
|             authenticatorWebAuthnStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -27,11 +27,10 @@ export class CaptchaStageForm extends BaseStageForm<CaptchaStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 patchedCaptchaStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesCaptchaCreate({ | ||||
|                 captchaStageRequest: data as unknown as CaptchaStageRequest, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesCaptchaCreate({ | ||||
|             captchaStageRequest: data as unknown as CaptchaStageRequest, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -33,11 +33,10 @@ export class ConsentStageForm extends BaseStageForm<ConsentStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 consentStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesConsentCreate({ | ||||
|                 consentStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesConsentCreate({ | ||||
|             consentStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -23,11 +23,10 @@ export class DenyStageForm extends BaseStageForm<DenyStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 denyStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesDenyCreate({ | ||||
|                 denyStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesDenyCreate({ | ||||
|             denyStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -24,11 +24,10 @@ export class DummyStageForm extends BaseStageForm<DummyStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 dummyStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesDummyCreate({ | ||||
|                 dummyStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesDummyCreate({ | ||||
|             dummyStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -37,11 +37,10 @@ export class EmailStageForm extends BaseStageForm<EmailStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 patchedEmailStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesEmailCreate({ | ||||
|                 emailStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesEmailCreate({ | ||||
|             emailStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderConnectionSettings(): TemplateResult { | ||||
|  | ||||
| @ -6,7 +6,7 @@ import { CodeMirrorMode } from "@goauthentik/elements/CodeMirror"; | ||||
| import "@goauthentik/elements/forms/HorizontalFormElement"; | ||||
| import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; | ||||
| import "@goauthentik/elements/forms/SearchSelect"; | ||||
| import YAML from "yaml"; | ||||
| import * as YAML from "yaml"; | ||||
|  | ||||
| import { msg } from "@lit/localize"; | ||||
| import { TemplateResult, html } from "lit"; | ||||
| @ -34,11 +34,10 @@ export class InvitationForm extends ModelForm<Invitation, string> { | ||||
|                 inviteUuid: this.instance.pk || "", | ||||
|                 invitationRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesInvitationInvitationsCreate({ | ||||
|                 invitationRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesInvitationInvitationsCreate({ | ||||
|             invitationRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -24,11 +24,10 @@ export class InvitationStageForm extends BaseStageForm<InvitationStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 invitationStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesInvitationStagesCreate({ | ||||
|                 invitationStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesInvitationStagesCreate({ | ||||
|             invitationStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -34,11 +34,10 @@ export class PasswordStageForm extends BaseStageForm<PasswordStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 passwordStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesPasswordCreate({ | ||||
|                 passwordStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesPasswordCreate({ | ||||
|             passwordStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     isBackendSelected(field: BackendsEnum): boolean { | ||||
|  | ||||
| @ -56,11 +56,10 @@ export class PromptForm extends ModelForm<Prompt, string> { | ||||
|                 promptUuid: this.instance.pk || "", | ||||
|                 promptRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesPromptPromptsCreate({ | ||||
|                 promptRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesPromptPromptsCreate({ | ||||
|             promptRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     async loadInstance(pk: string): Promise<Prompt> { | ||||
| @ -73,10 +72,11 @@ export class PromptForm extends ModelForm<Prompt, string> { | ||||
|  | ||||
|     async refreshPreview(prompt?: Prompt): Promise<void> { | ||||
|         if (!prompt) { | ||||
|             // TODO: Clarify this behavior. | ||||
|  | ||||
|             prompt = this.serializeForm(); | ||||
|             if (!prompt) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if (!prompt) return; | ||||
|         } | ||||
|         try { | ||||
|             this.preview = await new StagesApi(DEFAULT_CONFIG).stagesPromptPromptsPreviewCreate({ | ||||
|  | ||||
| @ -35,11 +35,10 @@ export class PromptStageForm extends BaseStageForm<PromptStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 promptStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesPromptStagesCreate({ | ||||
|                 promptStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesPromptStagesCreate({ | ||||
|             promptStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -38,11 +38,10 @@ export class RedirectStageForm extends BaseStageForm<RedirectStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 redirectStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesRedirectCreate({ | ||||
|                 redirectStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesRedirectCreate({ | ||||
|             redirectStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -31,11 +31,10 @@ export class SourceStageForm extends BaseStageForm<SourceStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 sourceStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesSourceCreate({ | ||||
|                 sourceStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesSourceCreate({ | ||||
|             sourceStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -23,11 +23,10 @@ export class UserDeleteStageForm extends BaseStageForm<UserDeleteStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 userDeleteStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesUserDeleteCreate({ | ||||
|                 userDeleteStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesUserDeleteCreate({ | ||||
|             userDeleteStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -26,11 +26,10 @@ export class UserLoginStageForm extends BaseStageForm<UserLoginStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 userLoginStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesUserLoginCreate({ | ||||
|                 userLoginStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesUserLoginCreate({ | ||||
|             userLoginStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
| @ -23,11 +23,10 @@ export class UserLogoutStageForm extends BaseStageForm<UserLogoutStage> { | ||||
|                 stageUuid: this.instance.pk || "", | ||||
|                 userLogoutStageRequest: data, | ||||
|             }); | ||||
|         } else { | ||||
|             return new StagesApi(DEFAULT_CONFIG).stagesUserLogoutCreate({ | ||||
|                 userLogoutStageRequest: data, | ||||
|             }); | ||||
|         } | ||||
|         return new StagesApi(DEFAULT_CONFIG).stagesUserLogoutCreate({ | ||||
|             userLogoutStageRequest: data, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     renderForm(): TemplateResult { | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	