homepage-plus/src/utils/identity/identity-helpers.js
2025-01-03 01:20:24 +01:00

70 lines
2.4 KiB
JavaScript

import ProxyIdentityProvider from "./proxy";
import NullIdentityProvider from "./null";
const IdentityProviders = {
null: NullIdentityProvider,
proxy: ProxyIdentityProvider,
};
function getProviderByKey(key) {
return IdentityProviders[key] || NullIdentityProvider;
}
function identityAllow({ user, groups }, item) {
const groupAllow =
"allowGroups" in item && item.allowGroups && groups.some((group) => item.allowGroups.includes(group));
const userAllow = "allowUsers" in item && item.allowUsers && item.allowUsers.includes(user);
const allowAll = !("allowGroups" in item && item.allowGroups) && !("allowUsers" in item && item.allowUsers);
return userAllow || groupAllow || allowAll;
}
export function checkAllowedGroup(perms, idGroups, groupName) {
const testGroup = idGroups.find((group) => group.name === groupName);
return testGroup ? identityAllow(perms, testGroup) : true;
}
function filterAllowedItems(perms, idGroups, groups, groupKey) {
return groups
.filter((group) => checkAllowedGroup(perms, idGroups, group.name))
.map((group) => ({
name: group.name,
[groupKey]: group[groupKey].filter((item) => identityAllow(perms, item)),
}))
.filter((group) => group[groupKey].length);
}
export function readIdentitySettings({ provider, groups } = {}) {
let groupArray = [];
if (groups) {
if (Array.isArray(groups)) {
groupArray = groups.map((group) => ({
name: Object.keys(group)[0],
allowUsers: group.allowUsers,
allowGroups: group.allowGroups,
}));
} else {
groupArray = Object.keys(groups).map((group) => ({
name: group,
allowUsers: groups[group].allowUsers,
allowGroups: groups[group].allowGroups,
}));
}
}
return {
provider: provider ? getProviderByKey(provider.type).create(provider) : NullIdentityProvider.create(),
groups: groupArray,
};
}
export async function fetchWithIdentity(key, context) {
return getProviderByKey(context.provider).fetch([key, context]);
}
export const filterAllowedServices = (perms, idGroups, services) =>
filterAllowedItems(perms, idGroups, services, "services");
export const filterAllowedBookmarks = (perms, idGroups, bookmarks) =>
filterAllowedItems(perms, idGroups, bookmarks, "bookmarks");
export const filterAllowedWidgets = (perms, widgets) =>
widgets.filter((widget) => identityAllow(perms, widget.options));