* Conform more of the codebase to `strictNullChecks` * Iterate * Iterate * Iterate * Iterate * Conform more of the codebase to `strictNullChecks` * Iterate * Update record key
85 lines
3.3 KiB
TypeScript
85 lines
3.3 KiB
TypeScript
/*
|
|
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { Widget, WidgetKind } from "matrix-widget-api";
|
|
|
|
import SettingsStore from "../../settings/SettingsStore";
|
|
import { SettingLevel } from "../../settings/SettingLevel";
|
|
import { SdkContextClass } from "../../contexts/SDKContext";
|
|
|
|
export enum OIDCState {
|
|
Allowed, // user has set the remembered value as allowed
|
|
Denied, // user has set the remembered value as disallowed
|
|
Unknown, // user has not set a remembered value
|
|
}
|
|
|
|
export class WidgetPermissionStore {
|
|
public constructor(private readonly context: SdkContextClass) {}
|
|
|
|
// TODO (all functions here): Merge widgetKind with the widget definition
|
|
|
|
private packSettingKey(widget: Widget, kind: WidgetKind, roomId?: string): string {
|
|
let location: string | null | undefined = roomId;
|
|
if (kind !== WidgetKind.Room) {
|
|
location = this.context.client?.getUserId();
|
|
}
|
|
if (kind === WidgetKind.Modal) {
|
|
location = "*MODAL*-" + location; // to guarantee differentiation from whatever spawned it
|
|
}
|
|
if (!location) {
|
|
throw new Error("Failed to determine a location to check the widget's OIDC state with");
|
|
}
|
|
|
|
return encodeURIComponent(`${location}::${widget.templateUrl}`);
|
|
}
|
|
|
|
public getOIDCState(widget: Widget, kind: WidgetKind, roomId?: string): OIDCState {
|
|
const settingsKey = this.packSettingKey(widget, kind, roomId);
|
|
const settings = SettingsStore.getValue("widgetOpenIDPermissions");
|
|
if (settings?.deny?.includes(settingsKey)) {
|
|
return OIDCState.Denied;
|
|
}
|
|
if (settings?.allow?.includes(settingsKey)) {
|
|
return OIDCState.Allowed;
|
|
}
|
|
return OIDCState.Unknown;
|
|
}
|
|
|
|
public setOIDCState(widget: Widget, kind: WidgetKind, roomId: string | undefined, newState: OIDCState): void {
|
|
const settingsKey = this.packSettingKey(widget, kind, roomId);
|
|
|
|
let currentValues = SettingsStore.getValue<{
|
|
allow?: string[];
|
|
deny?: string[];
|
|
}>("widgetOpenIDPermissions");
|
|
if (!currentValues) {
|
|
currentValues = {};
|
|
}
|
|
if (!currentValues.allow) currentValues.allow = [];
|
|
if (!currentValues.deny) currentValues.deny = [];
|
|
|
|
if (newState === OIDCState.Allowed) {
|
|
currentValues.allow.push(settingsKey);
|
|
} else if (newState === OIDCState.Denied) {
|
|
currentValues.deny.push(settingsKey);
|
|
} else {
|
|
currentValues.allow = currentValues.allow.filter((c) => c !== settingsKey);
|
|
currentValues.deny = currentValues.deny.filter((c) => c !== settingsKey);
|
|
}
|
|
|
|
SettingsStore.setValue("widgetOpenIDPermissions", null, SettingLevel.DEVICE, currentValues);
|
|
}
|
|
}
|