Skip to content

Commit

Permalink
Refactor EntityPermissions and AuthorizationService
Browse files Browse the repository at this point in the history
  • Loading branch information
assadriaz committed Mar 3, 2025
1 parent 10eefd0 commit 5c80226
Show file tree
Hide file tree
Showing 12 changed files with 214 additions and 149 deletions.
19 changes: 10 additions & 9 deletions src/main/java/org/rutebanken/tiamat/auth/AuthorizationService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package org.rutebanken.tiamat.auth;

import org.locationtech.jts.geom.Point;
import org.rutebanken.tiamat.diff.generic.StopPlaceTypeSubmodeEnumuration;
import org.rutebanken.tiamat.diff.generic.SubmodeEnumuration;
import org.rutebanken.tiamat.model.EntityStructure;
import org.rutebanken.tiamat.model.StopTypeEnumeration;
import org.springframework.security.access.AccessDeniedException;

import java.util.Collection;
Expand Down Expand Up @@ -48,21 +49,21 @@ public interface AuthorizationService {

boolean canEditEntity(Point point);

Set<StopPlaceTypeSubmodeEnumuration> getAllowedStopPlaceTypes(EntityStructure entity);
Set<StopTypeEnumeration> getAllowedStopPlaceTypes(EntityStructure entity);

Set<StopPlaceTypeSubmodeEnumuration> getLocationAllowedStopPlaceTypes(boolean canEdit, Point point);
Set<StopTypeEnumeration> getLocationAllowedStopPlaceTypes(boolean canEdit, Point point);

Set<StopPlaceTypeSubmodeEnumuration> getBannedStopPlaceTypes(EntityStructure entity);
Set<StopTypeEnumeration> getBannedStopPlaceTypes(EntityStructure entity);

Set<StopPlaceTypeSubmodeEnumuration> getLocationBannedStopPlaceTypes(boolean canEdit, Point point);
Set<StopTypeEnumeration> getLocationBannedStopPlaceTypes(boolean canEdit, Point point);

Set<StopPlaceTypeSubmodeEnumuration> getAllowedSubmodes(EntityStructure entity);
Set<SubmodeEnumuration> getAllowedSubmodes(EntityStructure entity);

Set<StopPlaceTypeSubmodeEnumuration> getLocationAllowedSubmodes(boolean canEdit, Point point);
Set<SubmodeEnumuration> getLocationAllowedSubmodes(boolean canEdit, Point point);

Set<StopPlaceTypeSubmodeEnumuration> getBannedSubmodes(EntityStructure entity);
Set<SubmodeEnumuration> getBannedSubmodes(EntityStructure entity);

Set<StopPlaceTypeSubmodeEnumuration> getLocationBannedSubmodes(boolean canEdit, Point point);
Set<SubmodeEnumuration> getLocationBannedSubmodes(boolean canEdit, Point point);


boolean isGuest();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@
import org.rutebanken.helper.organisation.RoleAssignment;
import org.rutebanken.helper.organisation.RoleAssignmentExtractor;
import org.rutebanken.tiamat.auth.check.TopographicPlaceChecker;
import org.rutebanken.tiamat.diff.generic.StopPlaceTypeSubmodeEnumuration;
import org.rutebanken.tiamat.diff.generic.SubmodeEnumuration;
import org.rutebanken.tiamat.model.EntityStructure;
import org.rutebanken.tiamat.model.GroupOfStopPlaces;
import org.rutebanken.tiamat.model.StopPlace;
import org.rutebanken.tiamat.model.StopTypeEnumeration;
import org.rutebanken.tiamat.service.groupofstopplaces.GroupOfStopPlacesMembersResolver;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;
Expand Down Expand Up @@ -103,51 +105,81 @@ public boolean canEditEntity(Point point) {
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getAllowedStopPlaceTypes(EntityStructure entity){
return getStopTypesOrSubmode(STOP_PLACE_TYPE, true, entity);
public Set<StopTypeEnumeration> getAllowedStopPlaceTypes(EntityStructure entity){
final Set<String> allowedStopTypes = getStopTypesOrSubmode(STOP_PLACE_TYPE, true, entity);

return convertToStopTypeEnumeration(allowedStopTypes);

}

private Set<StopTypeEnumeration> convertToStopTypeEnumeration(Set<String> stopTypes) {

if(stopTypes.contains("*")){
return Set.of();
}
return stopTypes.stream()
.map(StopTypeEnumeration::fromValue)
.collect(Collectors.toSet());
}

private Set<SubmodeEnumuration> convertToSubmodeEnumeration(Set<String> submodes) {

if(submodes.contains("*")) {
return Set.of();
}
return submodes.stream()
.map(SubmodeEnumuration::fromValue)
.collect(Collectors.toSet());
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getLocationAllowedStopPlaceTypes(boolean canEdit, Point point) {
return getLocationStopTypesOrSubmode(canEdit,STOP_PLACE_TYPE, true, point);
public Set<StopTypeEnumeration> getLocationAllowedStopPlaceTypes(boolean canEdit, Point point) {
final Set<String> stopTypes = getLocationStopTypesOrSubmode(canEdit, STOP_PLACE_TYPE, true, point);
return convertToStopTypeEnumeration(stopTypes);
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getBannedStopPlaceTypes(EntityStructure entity) {
public Set<StopTypeEnumeration> getBannedStopPlaceTypes(EntityStructure entity) {


if(hasNoAuthentications() || !dataScopedAuthorizationService.isAuthorized(ROLE_EDIT_STOPS, List.of(entity))) {
return Set.of(StopPlaceTypeSubmodeEnumuration.ALL);
return convertToStopTypeEnumeration(Set.of("*"));
}
return getStopTypesOrSubmode(STOP_PLACE_TYPE, false, entity);
final Set<String> stopType = getStopTypesOrSubmode(STOP_PLACE_TYPE, false, entity);
return convertToStopTypeEnumeration(stopType);
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getLocationBannedStopPlaceTypes(boolean canEdit, Point point) {
return getLocationStopTypesOrSubmode(canEdit,STOP_PLACE_TYPE, false, point);
public Set<StopTypeEnumeration> getLocationBannedStopPlaceTypes(boolean canEdit, Point point) {
final Set<String> bannedStopTypes = getLocationStopTypesOrSubmode(canEdit, STOP_PLACE_TYPE, false, point);
return convertToStopTypeEnumeration(bannedStopTypes);
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getAllowedSubmodes(EntityStructure entity) {
return getStopTypesOrSubmode(SUBMODE, true, entity);
public Set<SubmodeEnumuration> getAllowedSubmodes(EntityStructure entity) {
final Set<String> submodes = getStopTypesOrSubmode(SUBMODE, true, entity);
return convertToSubmodeEnumeration(submodes);
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getLocationAllowedSubmodes(boolean canEdit, Point point) {
return getLocationStopTypesOrSubmode(canEdit,SUBMODE, true, point);
public Set<SubmodeEnumuration> getLocationAllowedSubmodes(boolean canEdit, Point point) {
final Set<String> submodes = getLocationStopTypesOrSubmode(canEdit, SUBMODE, true, point);
return convertToSubmodeEnumeration(submodes);
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getBannedSubmodes(EntityStructure entity) {
public Set<SubmodeEnumuration> getBannedSubmodes(EntityStructure entity) {
if(hasNoAuthentications() || !dataScopedAuthorizationService.isAuthorized(ROLE_EDIT_STOPS, List.of(entity))) {
return Set.of(StopPlaceTypeSubmodeEnumuration.ALL);
return convertToSubmodeEnumeration(Set.of("*"));
}
return getStopTypesOrSubmode(SUBMODE, false, entity);
final Set<String> submode = getStopTypesOrSubmode(SUBMODE, false, entity);
return convertToSubmodeEnumeration(submode);
}

@Override
public Set<StopPlaceTypeSubmodeEnumuration> getLocationBannedSubmodes(boolean canEdit, Point point) {
return getLocationStopTypesOrSubmode(canEdit,SUBMODE, false, point);
public Set<SubmodeEnumuration> getLocationBannedSubmodes(boolean canEdit, Point point) {
final Set<String> submode = getLocationStopTypesOrSubmode(canEdit, SUBMODE, false, point);
return convertToSubmodeEnumeration(submode);
}

@Override
Expand All @@ -158,7 +190,7 @@ public boolean isGuest() {
return roleAssignmentExtractor.getRoleAssignmentsForUser().isEmpty();
}

private Set<StopPlaceTypeSubmodeEnumuration> getStopTypesOrSubmode(String type, boolean isAllowed, EntityStructure entity) {
private Set<String> getStopTypesOrSubmode(String type, boolean isAllowed, EntityStructure entity) {
if (hasNoAuthentications()) {
return Set.of();
}
Expand All @@ -171,16 +203,15 @@ private Set<StopPlaceTypeSubmodeEnumuration> getStopTypesOrSubmode(String type,
.flatMap(List::stream)
.filter(types -> isAllowed != types.startsWith("!"))
.map(types -> isAllowed ? types : types.substring(1))
.map(StopPlaceTypeSubmodeEnumuration::fromValue)
.collect(Collectors.toSet());
}

private Set<StopPlaceTypeSubmodeEnumuration> getLocationStopTypesOrSubmode(boolean canEdit, String type, boolean isAllowed, Point point) {
private Set<String> getLocationStopTypesOrSubmode(boolean canEdit, String type, boolean isAllowed, Point point) {
if (hasNoAuthentications()) {
return Set.of();
}
if (!canEdit && !isAllowed) {
return Set.of(StopPlaceTypeSubmodeEnumuration.ALL);
return Set.of("*");
}
Set<String> stopTypesSubmodes = roleAssignmentExtractor.getRoleAssignmentsForUser().stream()
.filter(roleAssignment -> roleAssignment.getEntityClassifications() != null)
Expand All @@ -194,7 +225,7 @@ private Set<StopPlaceTypeSubmodeEnumuration> getLocationStopTypesOrSubmode(boole
if (canEdit && stopTypesSubmodes.isEmpty() && isAllowed) {
stopTypesSubmodes.add(ENTITY_CLASSIFIER_ALL_ATTRIBUTES);
}
return stopTypesSubmodes.stream().map(StopPlaceTypeSubmodeEnumuration::fromValue).collect(Collectors.toSet());
return stopTypesSubmodes;
}

private boolean hasNoAuthentications() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,35 +20,16 @@
*/


public enum StopPlaceTypeSubmodeEnumuration {
ONSTREET_BUS("onstreetBus"),
ONSTREET_TRAM("onstreetTram"),
AIRPORT("airport"),
RAIL_STATION("railStation"),
METRO_STATION("metroStation"),
BUS_STATION("busStation"),
COACH_STATION("coachStation"),
TRAM_STATION("tramStation"),
HARBOUR_PORT("harbourPort"),
FERRY_PORT("ferryPort"),
FERRY_STOP("ferryStop"),
LIFT_STATION("liftStation"),
VEHICLE_RAIL_INTERCHANGE("vehicleRailInterchange"),
OTHER("other"),
RAIL_REPLACEMENT_BUS("railReplacementBus"),
ALL("all");

public enum SubmodeEnumuration {
RAIL_REPLACEMENT_BUS("railReplacementBus");
private final String value;

StopPlaceTypeSubmodeEnumuration(String v) {
SubmodeEnumuration(String v) {
value = v;
}

public static StopPlaceTypeSubmodeEnumuration fromValue(String value) {
if(value.equals("*")) {
return ALL;
}
for (StopPlaceTypeSubmodeEnumuration stopPlaceType : StopPlaceTypeSubmodeEnumuration.values()) {
public static SubmodeEnumuration fromValue(String value) {
for (SubmodeEnumuration stopPlaceType : SubmodeEnumuration.values()) {
if (stopPlaceType.value.equals(value)) {
return stopPlaceType;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,93 @@
package org.rutebanken.tiamat.model.authorization;

import org.rutebanken.tiamat.diff.generic.StopPlaceTypeSubmodeEnumuration;
import org.rutebanken.tiamat.diff.generic.SubmodeEnumuration;
import org.rutebanken.tiamat.model.StopTypeEnumeration;

import java.util.Collections;
import java.util.Set;

public class EntityPermissions {
private final Set<StopPlaceTypeSubmodeEnumuration> allowedStopPlaceTypes;
private final Set<StopPlaceTypeSubmodeEnumuration> bannedStopPlaceTypes;
private final Set<StopPlaceTypeSubmodeEnumuration> allowedSubmodes;
private final Set<StopPlaceTypeSubmodeEnumuration> bannedSubmodes;
private final Set<StopTypeEnumeration> allowedStopPlaceTypes;
private final Set<StopTypeEnumeration> bannedStopPlaceTypes;
private final Set<SubmodeEnumuration> allowedSubmodes;
private final Set<SubmodeEnumuration> bannedSubmodes;
private boolean canEdit;
private boolean canDelete;

public EntityPermissions(boolean canEdit, boolean canDelete, Set<StopPlaceTypeSubmodeEnumuration> allowedStopPlaceTypes, Set<StopPlaceTypeSubmodeEnumuration> bannedStopPlaceTypes, Set<StopPlaceTypeSubmodeEnumuration> allowedSubmodes, Set<StopPlaceTypeSubmodeEnumuration> bannedSubmodes) {
this.canEdit = canEdit;
this.canDelete = canDelete;
this.allowedStopPlaceTypes = allowedStopPlaceTypes == null ? Collections.emptySet() : allowedStopPlaceTypes;
this.bannedStopPlaceTypes = bannedStopPlaceTypes == null ? Collections.emptySet() : bannedStopPlaceTypes;
this.allowedSubmodes = allowedSubmodes == null ? Collections.emptySet() : allowedSubmodes;
this.bannedSubmodes = bannedSubmodes == null ? Collections.emptySet() : bannedSubmodes;
private EntityPermissions(Builder builder) {
this.canEdit = builder.canEdit;
this.canDelete = builder.canDelete;
this.allowedStopPlaceTypes = builder.allowedStopPlaceTypes == null ? Collections.emptySet() : builder.allowedStopPlaceTypes;
this.bannedStopPlaceTypes = builder.bannedStopPlaceTypes == null ? Collections.emptySet() : builder.bannedStopPlaceTypes;
this.allowedSubmodes = builder.allowedSubmodes == null ? Collections.emptySet() : builder.allowedSubmodes;
this.bannedSubmodes = builder.bannedSubmodes == null ? Collections.emptySet() : builder.bannedSubmodes;
}

public static class Builder {
private Set<StopTypeEnumeration> allowedStopPlaceTypes;
private Set<StopTypeEnumeration> bannedStopPlaceTypes;
private Set<SubmodeEnumuration> allowedSubmodes;
private Set<SubmodeEnumuration> bannedSubmodes;
private boolean canEdit;
private boolean canDelete;

public Builder canEdit(boolean canEdit) {
this.canEdit = canEdit;
return this;
}

public Builder canDelete(boolean canDelete) {
this.canDelete = canDelete;
return this;
}

public Builder allowedStopPlaceTypes(Set<StopTypeEnumeration> allowedStopPlaceTypes) {
this.allowedStopPlaceTypes = allowedStopPlaceTypes;
return this;
}

public Builder bannedStopPlaceTypes(Set<StopTypeEnumeration> bannedStopPlaceTypes) {
this.bannedStopPlaceTypes = bannedStopPlaceTypes;
return this;
}

public Builder allowedSubmodes(Set<SubmodeEnumuration> allowedSubmodes) {
this.allowedSubmodes = allowedSubmodes;
return this;
}

public Builder bannedSubmodes(Set<SubmodeEnumuration> bannedSubmodes) {
this.bannedSubmodes = bannedSubmodes;
return this;
}

public EntityPermissions build() {
return new EntityPermissions(this);
}
}

public Set<StopTypeEnumeration> getAllowedStopPlaceTypes() {
return allowedStopPlaceTypes;
}

public Set<StopTypeEnumeration> getBannedStopPlaceTypes() {
return bannedStopPlaceTypes;
}

public Set<SubmodeEnumuration> getAllowedSubmodes() {
return allowedSubmodes;
}

public Set<SubmodeEnumuration> getBannedSubmodes() {
return bannedSubmodes;
}

public boolean isCanEdit() {
return canEdit;
}

public boolean isCanDelete() {
return canDelete;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ public class GraphQLNames {
public static final String LIMITATION_STATUS_ENUM = "LimitationStatusType";

public static final String STOP_PLACE_TYPE_ENUM = "StopPlaceType";
public static final String STOP_PLACE_TYPE_SUBMODE_ENUM = "StopPlaceTypeSubmode";
public static final String SUBMODE_ENUM = "Submode";
public static final String INTERCHANGE_WEIGHTING_TYPE_ENUM = "InterchangeWeightingType";

public static final String PARKING_TYPE_ENUM = "ParkingType";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.privateCodeInputType;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.scopingMethodEnumType;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.stopPlaceTypeEnum;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.stopPlaceTypeSubmodeEnum;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.submodeEnum;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.topographicPlaceInputObjectType;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.topographicPlaceTypeEnum;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.transportModeSubmodeObjectType;
Expand Down Expand Up @@ -414,19 +414,19 @@ public void init() {

.field(newFieldDefinition()
.name("allowedStopPlaceTypes")
.type(new GraphQLList(stopPlaceTypeSubmodeEnum))
.type(new GraphQLList(stopPlaceTypeEnum))
.build())
.field(newFieldDefinition()
.name("bannedStopPlaceTypes")
.type(new GraphQLList(stopPlaceTypeSubmodeEnum))
.type(new GraphQLList(stopPlaceTypeEnum))
.build())
.field(newFieldDefinition()
.name("allowedSubmodes")
.type(new GraphQLList(stopPlaceTypeSubmodeEnum))
.type(new GraphQLList(submodeEnum))
.build())
.field(newFieldDefinition()
.name("bannedSubmodes")
.type(new GraphQLList(stopPlaceTypeSubmodeEnum))
.type(new GraphQLList(submodeEnum))
.build())
.build();

Expand Down
Loading

0 comments on commit 5c80226

Please sign in to comment.