import { BaseProviderForm } from "@goauthentik/admin/providers/BaseProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { first } from "@goauthentik/common/utils"; import "@goauthentik/elements/ak-dual-select/ak-dual-select-dynamic-selected-provider.js"; import { DualSelectPair } from "@goauthentik/elements/ak-dual-select/types.js"; import "@goauthentik/elements/forms/FormGroup"; import "@goauthentik/elements/forms/HorizontalFormElement"; import "@goauthentik/elements/forms/Radio"; import "@goauthentik/elements/forms/SearchSelect"; import { msg } from "@lit/localize"; import { TemplateResult, html } from "lit"; import { customElement } from "lit/decorators.js"; import { ifDefined } from "lit/directives/if-defined.js"; import { CoreApi, CoreGroupsListRequest, Group, PropertymappingsApi, ProvidersApi, SCIMMapping, SCIMProvider, } from "@goauthentik/api"; export async function scimPropertyMappingsProvider(page = 1, search = "") { const propertyMappings = await new PropertymappingsApi( DEFAULT_CONFIG, ).propertymappingsProviderScimList({ ordering: "managed", pageSize: 20, search: search.trim(), page, }); return { pagination: propertyMappings.pagination, options: propertyMappings.results.map((m) => [m.pk, m.name, m.name, m]), }; } export function makeSCIMPropertyMappingsSelector( instanceMappings: string[] | undefined, defaultSelected: string, ) { const localMappings = instanceMappings ? new Set(instanceMappings) : undefined; return localMappings ? ([pk, _]: DualSelectPair) => localMappings.has(pk) : ([_0, _1, _2, mapping]: DualSelectPair) => mapping?.managed === defaultSelected; } @customElement("ak-provider-scim-form") export class SCIMProviderFormPage extends BaseProviderForm { loadInstance(pk: number): Promise { return new ProvidersApi(DEFAULT_CONFIG).providersScimRetrieve({ id: pk, }); } async send(data: SCIMProvider): Promise { if (this.instance) { return new ProvidersApi(DEFAULT_CONFIG).providersScimUpdate({ id: this.instance.pk, sCIMProviderRequest: data, }); } else { return new ProvidersApi(DEFAULT_CONFIG).providersScimCreate({ sCIMProviderRequest: data, }); } } renderForm(): TemplateResult { return html` ${msg("Protocol settings")}

${msg("SCIM base url, usually ends in /v2.")}

${msg( "Token to authenticate with. Currently only bearer authentication is supported.", )}

${msg("User filtering")}
=> { const args: CoreGroupsListRequest = { ordering: "name", includeUsers: false, }; if (query !== undefined) { args.search = query; } const groups = await new CoreApi(DEFAULT_CONFIG).coreGroupsList( args, ); return groups.results; }} .renderElement=${(group: Group): string => { return group.name; }} .value=${(group: Group | undefined): string | undefined => { return group ? group.pk : undefined; }} .selected=${(group: Group): boolean => { return group.pk === this.instance?.filterGroup; }} ?blankable=${true} >

${msg("Only sync users within the selected group.")}

${msg("Attribute mapping")}

${msg("Property mappings used to user mapping.")}

${msg("Property mappings used to group creation.")}

`; } } declare global { interface HTMLElementTagNameMap { "ak-provider-scim-form": SCIMProviderFormPage; } }