Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Access control] Private individual page #433

Merged
merged 33 commits into from
Feb 13, 2024
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ae26d5b
created Individual access object
litvinovg Dec 14, 2023
9cd75ca
refact: removed not needed type constructor from NamedAccessObject, r…
litvinovg Dec 14, 2023
fe5d501
fix: support values object property in SPARQL query to load acess pol…
litvinovg Dec 18, 2023
1416ac6
check authorization for rdfs:label property on individual page
litvinovg Dec 18, 2023
1bb5e4a
fix: removed duplicate authorization check without statement details …
litvinovg Dec 18, 2023
259d8bc
Added policy to allow access to individual pages
litvinovg Dec 18, 2023
6a9dcc2
Added policy template to hide some properties not related to self edi…
litvinovg Dec 18, 2023
a052dd7
Added named key component class, refactored PolicyLoader and EntityPo…
litvinovg Dec 20, 2023
f802361
Added policy and test to exclude individual page from display by uri
litvinovg Dec 20, 2023
53cbfff
fixes: store model in AccessObject, renamed sparql variable personUri…
litvinovg Dec 20, 2023
8984e8d
added template to exclude individual page from display by type
litvinovg Dec 20, 2023
c7cdf81
fix: use objectUri as part of query map key in QueryResultsMapCache
litvinovg Dec 21, 2023
0f850c8
Added NOT_RELATED key component
litvinovg Dec 21, 2023
f9745b7
fix for proximity query
litvinovg Dec 21, 2023
f4e8014
renamed operator
litvinovg Dec 21, 2023
8c7c107
fix: use named key components in getEntityValueSetUri query
litvinovg Dec 21, 2023
1bdcfe1
implemented getResourceUris in IndividualAccessObject
litvinovg Dec 21, 2023
71357e8
Added policy template to exclude not related individual pages from di…
litvinovg Dec 21, 2023
3990156
Property exclusion named key component
litvinovg Dec 21, 2023
af7958c
fixes and test improvements for policy template hide not related prop…
litvinovg Dec 21, 2023
e7c89e6
Provide model into authorization request.
litvinovg Dec 21, 2023
bdc428f
Web interface for policies to suppress individual by type, by type no…
litvinovg Jan 8, 2024
70a93d4
web interface to suppress display of individual page by uri
litvinovg Jan 9, 2024
af706bc
refact: renamed templates, named key components.
litvinovg Jan 9, 2024
9a2e0fe
removed not used key component for previous commit
litvinovg Jan 9, 2024
bfb5bdd
translations for permission related controls
litvinovg Jan 12, 2024
7a0a064
Fixes for English labels
litvinovg Jan 12, 2024
63e859d
German label improvements
litvinovg Jan 15, 2024
f9d876e
Apply suggestions from code review
litvinovg Jan 18, 2024
ac59f44
refact:renamed test
litvinovg Jan 18, 2024
b1360a2
Converted parameters to constants
litvinovg Jan 18, 2024
5f2c22a
Serbian translation template improvements
litvinovg Jan 22, 2024
e7229ba
refact: renamed class attributes
litvinovg Jan 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

package edu.cornell.mannlib.vedit.controller;

import static edu.cornell.mannlib.vitro.webapp.auth.attributes.NamedKeyComponent.NOT_RELATED;
import static edu.cornell.mannlib.vitro.webapp.auth.attributes.NamedKeyComponent.SUPPRESSION_BY_TYPE;
import static edu.cornell.mannlib.vitro.webapp.auth.attributes.NamedKeyComponent.SUPPRESSION_BY_URI;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_ONLY;

import java.text.Collator;
Expand All @@ -12,13 +15,11 @@
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

Expand All @@ -27,6 +28,7 @@
import edu.cornell.mannlib.vedit.util.FormUtils;
import edu.cornell.mannlib.vitro.webapp.auth.attributes.AccessObjectType;
import edu.cornell.mannlib.vitro.webapp.auth.attributes.AccessOperation;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSets;
import edu.cornell.mannlib.vitro.webapp.auth.policy.EntityPolicyController;
import edu.cornell.mannlib.vitro.webapp.beans.PermissionSet;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
Expand All @@ -41,6 +43,7 @@
public class BaseEditController extends VitroHttpServlet {

public static final String ENTITY_URI_ATTRIBUTE_NAME = "_permissionsEntityURI";

public static final String ENTITY_TYPE_ATTRIBUTE_NAME = "_permissionsEntityType";

public static final boolean FORCE_NEW = true; // when you know you're starting a new edit process
Expand Down Expand Up @@ -215,15 +218,13 @@ public String getDefaultLandingPage(HttpServletRequest request) {
protected static void addAccessAttributes(HttpServletRequest req, String entityURI, AccessObjectType aot) {
// Add the permissionsEntityURI (if we are creating a new property, this will be empty)
req.setAttribute(ENTITY_URI_ATTRIBUTE_NAME, entityURI);

String[] namedKeys = new String[0];
// Get the available permission sets
List<PermissionSet> permissionSets = buildListOfSelectableRoles(ModelAccess.on(req).getWebappDaoFactory());
List<RoleInfo> roles = new ArrayList<>();
List<String> roleUris = new ArrayList<>();

for (PermissionSet permissionSet : permissionSets) {
roles.add(new RoleInfo(permissionSet));
roleUris.add(permissionSet.getUri());
}
List<AccessOperation> accessOperations = AccessOperation.getOperations(aot);
// Operation, list of roles>
Expand All @@ -242,16 +243,110 @@ protected static void addAccessAttributes(HttpServletRequest req, String entityU
}
}
}
if (!StringUtils.isEmpty(entityURI)) {
for (RoleInfo roleInfo : roleInfos) {
if (roleInfo.isEnabled()) {
roleInfo.setGranted(
EntityPolicyController.isGranted(entityURI, aot, operation, roleInfo.getUri()));
}
getRolePolicyInformation(entityURI, aot, namedKeys, operation, roleInfos);
}
req.setAttribute("operationsToRoles", operationsToRoles);
}

private static void getRolePolicyInformation(String entityURI, AccessObjectType aot, String[] namedKeys,
AccessOperation operation, List<RoleInfo> roleInfos) {
if (!StringUtils.isEmpty(entityURI)) {
for (RoleInfo roleInfo : roleInfos) {
if (roleInfo.isEnabled()) {
roleInfo.setGranted(
EntityPolicyController.isGranted(entityURI, aot, operation, roleInfo.getUri(), namedKeys));
}
}
}
req.setAttribute("operationsToRoles", operationsToRoles);
}

protected static void addUriSuppressions(HttpServletRequest req, String entityURI, AccessObjectType aot) {
AccessOperation operation = AccessOperation.DISPLAY;
String[] namedKeys = new String[1];
namedKeys[0] = SUPPRESSION_BY_URI.toString();
// Get the available permission sets
List<PermissionSet> permissionSets = buildListOfSelectableRoles(ModelAccess.on(req).getWebappDaoFactory());
List<RoleInfo> roles = new ArrayList<>();

for (PermissionSet permissionSet : permissionSets) {
roles.add(new RoleInfo(permissionSet));
}
Map<String, List<RoleInfo>> uriSuppressionsToRoles = new LinkedHashMap<>();
List<RoleInfo> roleInfos = new LinkedList<>();
String operationName = StringUtils.capitalize(operation.toString().toLowerCase());
uriSuppressionsToRoles.put(operationName, roleInfos);
for (RoleInfo role : roles) {
RoleInfo roleCopy = role.clone();
roleInfos.add(roleCopy);
}
getRolePolicyInformation(entityURI, aot, namedKeys, operation, roleInfos);
req.setAttribute("uriSuppressions", uriSuppressionsToRoles);
req.setAttribute(ENTITY_URI_ATTRIBUTE_NAME, entityURI);
}

protected static void addTypeSuppressions(HttpServletRequest req, String entityURI, AccessObjectType aot) {
AccessOperation operation = AccessOperation.DISPLAY;
String[] namedKeys = new String[1];
namedKeys[0] = SUPPRESSION_BY_TYPE.toString();
// Get the available permission sets
List<PermissionSet> permissionSets = buildListOfSelectableRoles(ModelAccess.on(req).getWebappDaoFactory());
List<RoleInfo> roles = new ArrayList<>();

for (PermissionSet permissionSet : permissionSets) {
roles.add(new RoleInfo(permissionSet));
}
Map<String, List<RoleInfo>> typeSuppressionsToRoles = new LinkedHashMap<>();
List<RoleInfo> roleInfos = new LinkedList<>();
String operationName = StringUtils.capitalize(operation.toString().toLowerCase());
typeSuppressionsToRoles.put(operationName, roleInfos);
for (RoleInfo role : roles) {
RoleInfo roleCopy = role.clone();
roleInfos.add(roleCopy);
}
getRolePolicyInformation(entityURI, aot, namedKeys, operation, roleInfos);
req.setAttribute("typeSuppressions", typeSuppressionsToRoles);
}

protected static void addNotRelatedTypeSuppressions(HttpServletRequest req, String entityURI, AccessObjectType aot) {
AccessOperation operation = AccessOperation.DISPLAY;
String[] namedKeys = new String[2];
namedKeys[0] = SUPPRESSION_BY_TYPE.toString();
namedKeys[1] = NOT_RELATED.toString();

RoleInfo role = getSelfEditorRole(req);
Map<String, List<RoleInfo>> typeSuppressionsToRoles = new LinkedHashMap<>();
List<RoleInfo> roleInfos = new LinkedList<>();
String operationName = StringUtils.capitalize(operation.toString().toLowerCase());
typeSuppressionsToRoles.put(operationName, roleInfos);
roleInfos.add(role);

getRolePolicyInformation(entityURI, aot, namedKeys, operation, roleInfos);
req.setAttribute("typeSuppressionsNotRelated", typeSuppressionsToRoles);
}

protected static RoleInfo getSelfEditorRole(HttpServletRequest req) {
PermissionSet permissionSet = ModelAccess.on(req).getWebappDaoFactory().getUserAccountsDao()
.getPermissionSetByUri(PermissionSets.URI_SELF_EDITOR);
RoleInfo role = new RoleInfo(permissionSet);
return role;
}

protected static void addNotRelatedPropertySuppressions(HttpServletRequest req, String entityURI,
AccessObjectType aot) {
AccessOperation operation = AccessOperation.DISPLAY;
String[] namedKeys = new String[2];
namedKeys[0] = SUPPRESSION_BY_URI.toString();
namedKeys[1] = NOT_RELATED.toString();

RoleInfo role = getSelfEditorRole(req);
Map<String, List<RoleInfo>> propertySuppressionsToRoles = new LinkedHashMap<>();
List<RoleInfo> roleInfos = new LinkedList<>();
String operationName = StringUtils.capitalize(operation.toString().toLowerCase());
propertySuppressionsToRoles.put(operationName, roleInfos);
roleInfos.add(role);

getRolePolicyInformation(entityURI, aot, namedKeys, operation, roleInfos);
req.setAttribute("propertySuppressionsNotRelated", propertySuppressionsToRoles);
}

static boolean isPublicForbiddenOperation(AccessOperation operation) {
Expand Down
Loading
Loading