UNPKG

@inrupt/solid-client

Version:

Make your web apps work with Solid Pods.

257 lines (254 loc) • 12.4 kB
import { acp } from '../constants.mjs'; import { hasServerResourceInfo } from '../interfaces.mjs'; import { getSourceUrl } from '../resource/resource.mjs'; import 'n3'; import { getThing, setThing } from '../thing/thing.mjs'; import { getIriAll, getUrlAll } from '../thing/get.mjs'; import { removeAll, removeIri } from '../thing/remove.mjs'; import { internal_getAcr, internal_setAcr, internal_getControlAll, internal_removePolicyUrlAll, internal_setControl, internal_removeMemberPolicyUrlAll, internal_getPolicyUrlAll, internal_getMemberPolicyUrlAll, internal_removePolicyUrl } from './control.internal.mjs'; // Copyright Inrupt Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the // Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Given a Resource, check whether it is governed by Access Policies. * (Specifically, a Resource that is governed by Access Policies will refer to exactly one Access * Control Resource, and expose that to users who are allowed to see or modify access to the given * Resource.) * * @param resource Resource which may or may not be governed by Access Policies. * @returns True if the Resource refers to an Access Control Resource and is hence governed by Access Policies, or false if it does not. * @since 1.6.0 */ function hasLinkedAcr(resource) { return (hasServerResourceInfo(resource) && Array.isArray(resource.internal_resourceInfo.linkedResources[acp.accessControl]) && resource.internal_resourceInfo.linkedResources[acp.accessControl].length === 1); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Get the URLs of the Access Policies that apply to an Access Control Resource itself, rather than * to the Resource it governs. * * @param resourceWithAcr The Resource with the Access Control Resource of which to get the URLs of the Policies that govern access to it. * @returns URLs of the Policies that govern access to the given Access Control Resource. * @since 1.6.0 */ function getAcrPolicyUrlAll(resourceWithAcr) { const acr = internal_getAcr(resourceWithAcr); const acrUrl = getSourceUrl(acr); const acrThing = getThing(acr, acrUrl); if (acrThing === null) { return []; } return getIriAll(acrThing, acp.access); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Get the URLs of the Access Policies that apply to the Access Control Resources of the Resource's * children. * * @param resourceWithAcr The Resource with the Access Control Resource of which to get the URLs of the Policies that govern access to its children. * @returns URLs of the Policies that govern access to the Access Control Resources of the given Resource's children. * @since 1.6.0 */ function getMemberAcrPolicyUrlAll(resourceWithAcr) { const acr = internal_getAcr(resourceWithAcr); const acrUrl = getSourceUrl(acr); const acrThing = getThing(acr, acrUrl); if (acrThing === null) { return []; } return getIriAll(acrThing, acp.accessMembers); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Stop the URL of a given [[Policy]] from applying to an Access Control Resource itself. * * @param resourceWithAcr The Resource with the Access Control Resource to which the given URL of a Policy should no longer apply. * @param policyUrl The URL of the Policy that should no longer apply. * @returns A Resource with a new Access Control Resource equal to the original ACR, but with the given ACR Policy removed from it. * @since 1.6.0 */ function removeAcrPolicyUrl(resourceWithAcr, policyUrl) { const acr = internal_getAcr(resourceWithAcr); const acrUrl = getSourceUrl(acr); const acrThing = getThing(acr, acrUrl); if (acrThing === null) { return resourceWithAcr; } if (!getIriAll(acrThing, acp.access).includes(policyUrl.toString())) { return resourceWithAcr; } const updatedAcrThing = removeIri(acrThing, acp.access, policyUrl); const updatedAcr = setThing(acr, updatedAcrThing); return internal_setAcr(resourceWithAcr, updatedAcr); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Stop all URL of Access Policies from applying to an Access Control Resource itself. * * @param resourceWithAcr The Resource with the Access Control Resource to which no more Policies should apply. * @returns A Resource with a new Access Control Resource equal to the original ACR, but without any Policy applying to it. * @since 1.6.0 */ function removeAcrPolicyUrlAll(resourceWithAcr) { const acr = internal_getAcr(resourceWithAcr); const acrUrl = getSourceUrl(acr); const acrThing = getThing(acr, acrUrl); if (acrThing === null) { return resourceWithAcr; } const updatedAcrThing = removeAll(acrThing, acp.access); const updatedAcr = setThing(acr, updatedAcrThing); return internal_setAcr(resourceWithAcr, updatedAcr); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Stop all URL of Access Policies from applying to the Access Control Resources of the Resource's * children. * * @param resourceWithAcr The Resource with the Access Control Resource that should no longer apply Policies to its children's ACRs. * @returns A Resource with a new Access Control Resource equal to the original ACR, but without any Policy applying to its children's ACRs. * @since 1.6.0 */ function removeMemberAcrPolicyUrlAll(resourceWithAcr) { const acr = internal_getAcr(resourceWithAcr); const acrUrl = getSourceUrl(acr); const acrThing = getThing(acr, acrUrl); if (acrThing === null) { return resourceWithAcr; } const updatedAcrThing = removeAll(acrThing, acp.accessMembers); const updatedAcr = setThing(acr, updatedAcrThing); return internal_setAcr(resourceWithAcr, updatedAcr); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Get the URLs of the Access Policies that apply to a Resource. * * @param resourceWithAcr The Resource with the Access Control Resource of which to get the URLs of the Policies that govern access to it. * @returns URLs of the Policies that govern access to the given Resource. * @since 1.6.0 */ function getPolicyUrlAll(resourceWithAcr) { const controls = internal_getControlAll(resourceWithAcr); const policyUrlsByControl = controls.map((control) => internal_getPolicyUrlAll(control)); const uniquePolicyUrls = new Set(); policyUrlsByControl.forEach((policyUrls) => { policyUrls.forEach((url) => uniquePolicyUrls.add(url)); }); return Array.from(uniquePolicyUrls); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Get the URLs of the Access Policies that apply to a Resource's children. * * @param resourceWithAcr The Resource with the Access Control Resource of which to get the URLs of the Policies that govern access to its children. * @returns URLs of the Policies that govern access to the given Resource's children. * @since 1.6.0 */ function getMemberPolicyUrlAll(resourceWithAcr) { const controls = internal_getControlAll(resourceWithAcr); const memberPolicyUrlsByControl = controls.map((control) => internal_getMemberPolicyUrlAll(control)); const uniquePolicyUrls = new Set(); memberPolicyUrlsByControl.forEach((policyUrls) => { policyUrls.forEach((url) => uniquePolicyUrls.add(url)); }); return Array.from(uniquePolicyUrls); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Stop the URL of a given [[Policy]] from applying to a Resource. * * @param resourceWithAcr The Resource, with its Access Control Resource, to which the given URL of a Policy should no longer apply. * @param policyUrl The URL of the Policy that should no longer apply. * @returns A Resource with a new Access Control Resource equal to the original ACR, but with the given Policy removed from it. * @since 1.6.0 */ function removePolicyUrl(resourceWithAcr, policyUrl) { const controls = internal_getControlAll(resourceWithAcr); return controls .filter((control) => getUrlAll(control, acp.apply).length > 0) .map((control) => internal_removePolicyUrl(control, policyUrl)) .reduce(internal_setControl, resourceWithAcr); } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Stop all URL of Access Policies from applying to a Resource. * * @param resourceWithAcr The Resource, with its Access Control Resource, to which no more Policies should apply. * @returns A Resource with a new Access Control Resource equal to the original ACR, but without any Policy applying to the Resource. * @since 1.6.0 */ function removePolicyUrlAll(resourceWithAcr) { const controls = internal_getControlAll(resourceWithAcr); const updatedControls = controls.map((control) => internal_removePolicyUrlAll(control)); const updatedResource = updatedControls.reduce(internal_setControl, resourceWithAcr); return updatedResource; } /** * ```{note} The Web Access Control specification is not yet finalised. As such, this * function is still experimental and subject to change, even in a non-major release. * ``` * * Stop all URL of Access Policies from applying to the Resource's children. * * @param resourceWithAcr The Resource with the Access Control Resource that should no longer apply Policies to its children. * @returns A Resource with a new Access Control Resource equal to the original ACR, but without any Policy applying to the Resource's children. * @since 1.6.0 */ function removeMemberPolicyUrlAll(resourceWithAcr) { const controls = internal_getControlAll(resourceWithAcr); const updatedControls = controls.map((control) => internal_removeMemberPolicyUrlAll(control)); const updatedResource = updatedControls.reduce(internal_setControl, resourceWithAcr); return updatedResource; } export { getAcrPolicyUrlAll, getMemberAcrPolicyUrlAll, getMemberPolicyUrlAll, getPolicyUrlAll, hasLinkedAcr, removeAcrPolicyUrl, removeAcrPolicyUrlAll, removeMemberAcrPolicyUrlAll, removeMemberPolicyUrlAll, removePolicyUrl, removePolicyUrlAll };