bug 4813: make sure that typerelativeidentifer is running trough

corresponding convert method on object creation
This commit is contained in:
Thomas Wiese
2018-12-12 13:21:41 +01:00
parent 58528beb1f
commit 69707bb14f
14 changed files with 103 additions and 30 deletions
@@ -28,6 +28,13 @@ public interface DomainIdentifierStrategy extends IdentifierStrategy {
regattaAndRaceIdentifer.getRaceName());
}
}
@Override
public String convertNewIdentifer(Object... object) {
assert object.length == 1;
RegattaAndRaceIdentifier identifer = (RegattaAndRaceIdentifier) object[0];
return WildcardPermissionEncoder.encode(identifer.getRegattaName(), identifer.getRaceName());
}
};
/**
@@ -42,6 +49,13 @@ public interface DomainIdentifierStrategy extends IdentifierStrategy {
return mediaTrack.dbId;
}
@Override
public String convertNewIdentifer(Object... object) {
assert object.length == 1;
String identifer = (String) object[0];
return identifer;
}
};
/**
@@ -57,6 +71,13 @@ public interface DomainIdentifierStrategy extends IdentifierStrategy {
return WildcardPermissionEncoder.encode(scoreCorrectionProvider.getName(), object[1].toString());
}
@Override
public String convertNewIdentifer(Object... object) {
assert object.length == 2;
ScoreCorrectionProvider scoreCorrectionProvider = (ScoreCorrectionProvider) object[0];
return WildcardPermissionEncoder.encode(scoreCorrectionProvider.getName(), object[1].toString());
}
};
}
@@ -36,6 +36,15 @@ public class IgtimiSecuredDomainType extends SecuredDomainType {
return WildcardPermissionEncoder.encode(account.getUser().getEmail());
}
@Override
public String convertNewIdentifer(Object... object) {
// TODO: check again, what type can be used, for now assuming String for the
// account.getUser().getEmail()
assert object.length == 1;
String identifier = (String) object[0];
return WildcardPermissionEncoder.encode(identifier);
}
};
}
}
@@ -40,6 +40,14 @@ public class SwissTimingSecuredDomainTypes extends SecuredDomainType {
return WildcardPermissionEncoder.encode(hasJsonUrl.getJsonURL());
}
@Override
public String convertNewIdentifer(Object... object) {
// TODO: check again, what type can be used, for now assuming String for the hasJsonUrl.getJsonURL()
assert object.length == 1;
String identifier = (String) object[0];
return WildcardPermissionEncoder.encode(identifier);
}
};
}
@@ -19,8 +19,9 @@ public class TracTracSecuredDomainType extends SecuredDomainType {
super(logicalTypeName, identiferStrategy);
}
public static final HasPermissions TRACTRAC_ACCOUNT = new SecuredDomainType("TRACTRAC_ACCOUNT", TracTracIdentifierStrategy.TRACTRAC_ACCOUNT);
public static final HasPermissions TRACTRAC_ACCOUNT = new SecuredDomainType("TRACTRAC_ACCOUNT",
TracTracIdentifierStrategy.TRACTRAC_ACCOUNT);
private interface TracTracIdentifierStrategy {
static IdentifierStrategy TRACTRAC_ACCOUNT = new IdentifierStrategy() {
@@ -31,6 +32,15 @@ public class TracTracSecuredDomainType extends SecuredDomainType {
return WildcardPermissionEncoder.encode(tracTracConfiguration.getJSONURL());
}
@Override
public String convertNewIdentifer(Object... object) {
// TODO: check again, what type can be used, for now assuming String for the
// tracTracConfiguration.getJSONURL()
assert object.length == 1;
String identifier = (String) object[0];
return WildcardPermissionEncoder.encode(identifier);
}
};
}
}
@@ -37,6 +37,15 @@ public class ExpeditionSecuredDomainTypes extends SecuredDomainType {
return WildcardPermissionEncoder.encode(ServerInfo.getName(), expeditionDeviceConfiguration.getName());
}
@Override
public String convertNewIdentifer(Object... object) {
// TODO: check again, what type can be used, for now assuming String for the
// expeditionDeviceConfiguration.getName()
assert object.length == 1;
String identifier = (String) object[0];
return WildcardPermissionEncoder.encode(ServerInfo.getName(), identifier);
}
};
}
}
@@ -86,7 +86,7 @@ public class RegattasResourceTest extends AbstractJaxRsApiTest {
series.add(testSeries);
final UUID closedRegattaUuid = UUID.randomUUID();
getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(SecuredDomainType.REGATTA,
closedRegattaUuid.toString(), closedRegattaName, new ActionWithResult<Regatta>() {
closedRegattaName, closedRegattaName, new ActionWithResult<Regatta>() {
@Override
public Regatta run() throws Exception {
return racingEventService.createRegatta(closedRegattaName, boatClassName,
@@ -98,9 +98,8 @@ public class RegattasResourceTest extends AbstractJaxRsApiTest {
/* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
}
});
final UUID openRegattaUuid = UUID.randomUUID();
getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(SecuredDomainType.REGATTA,
openRegattaUuid.toString(), openRegattaName, new ActionWithResult<Regatta>() {
openRegattaName, openRegattaName, new ActionWithResult<Regatta>() {
@Override
public Regatta run() throws Exception {
return racingEventService.createRegatta(openRegattaName, boatClassName,
@@ -418,7 +418,7 @@ public class EventsResource extends AbstractSailingServerResource {
Iterable<ImageDescriptor> images = Collections.<ImageDescriptor> emptyList();
Iterable<VideoDescriptor> videos = Collections.<VideoDescriptor> emptyList();
Event event = getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.EVENT, eventId.toString(),
SecuredDomainType.EVENT, eventId,
eventName, new ActionWithResult<Event>() {
@Override
@@ -476,7 +476,7 @@ public class EventsResource extends AbstractSailingServerResource {
UUID leaderboardGroupId = UUID.randomUUID();
LeaderboardGroup leaderboardGroup = getSecurityService()
.setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.LEADERBOARD_GROUP, leaderboardGroupName,
SecuredDomainType.LEADERBOARD_GROUP, leaderboardGroupId,
leaderboardGroupName, new ActionWithResult<LeaderboardGroup>() {
@Override
@@ -487,7 +487,7 @@ public class RegattasResource extends AbstractSailingServerResource {
final CompetitorWithBoat competitor;
if (subject.isAuthenticated()) {
competitor = getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.COMPETITOR, competitorUuid.toString(), name,
SecuredDomainType.COMPETITOR, competitorUuid, name,
new ActionWithResult<CompetitorWithBoat>() {
@Override
public CompetitorWithBoat run() throws Exception {
@@ -564,7 +564,7 @@ public class RegattasResource extends AbstractSailingServerResource {
final DynamicBoat boat;
if (SecurityUtils.getSubject().isAuthenticated()) {
boat = getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.BOAT, boatUUID.toString(), name, new ActionWithResult<DynamicBoat>() {
SecuredDomainType.BOAT, boatUUID, name, new ActionWithResult<DynamicBoat>() {
@Override
public DynamicBoat run() throws Exception {
@@ -227,7 +227,7 @@ public class SailingHierarchyOwnershipUpdater {
// and is possible out of date.
final UUID newGroupId = UUID.randomUUID();
return securitySerice.setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredSecurityTypes.USER_GROUP, newGroupId.toString(), name, () -> {
SecuredSecurityTypes.USER_GROUP, newGroupId, name, () -> {
final UserGroup createdUserGroup = securitySerice.createUserGroup(newGroupId, name);
securitySerice.copyUsersAndRoleAssociations(userGroupToCopy, createdUserGroup);
return createdUserGroup;
@@ -26,7 +26,6 @@ import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.WindStore;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.shared.QualifiedObjectIdentifier;
import com.sap.sse.security.shared.impl.Ownership;
import com.sap.sse.util.ThreadLocalTransporter;
@@ -59,9 +58,8 @@ public class PermissionAwareRaceTrackingHandler extends DefaultRaceTrackingHandl
try {
RegattaNameAndRaceName regattaAndRaceIdentifier = new RegattaNameAndRaceName(
trackedRegatta.getRegatta().getName(), raceDefinition.getName());
QualifiedObjectIdentifier qualifiedObjectIdentifier = TrackedRace.getIdentifier(regattaAndRaceIdentifier);
return securityService.setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.TRACKED_RACE, qualifiedObjectIdentifier.getTypeRelativeObjectIdentifier(),
SecuredDomainType.TRACKED_RACE, regattaAndRaceIdentifier,
regattaAndRaceIdentifier.toString(), () -> {
return super.createTrackedRace(trackedRegatta, raceDefinition, sidelines, windStore,
delayToLiveInMillis, millisecondsOverWhichToAverageWind,
@@ -80,9 +78,8 @@ public class PermissionAwareRaceTrackingHandler extends DefaultRaceTrackingHandl
subjectThreadState.bind();
try {
RegattaNameAndRaceName regattaAndRaceIdentifier = new RegattaNameAndRaceName(regatta.getName(), name);
QualifiedObjectIdentifier qualifiedObjectIdentifier = TrackedRace.getIdentifier(regattaAndRaceIdentifier);
return securityService.setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.TRACKED_RACE, qualifiedObjectIdentifier.getTypeRelativeObjectIdentifier(),
SecuredDomainType.TRACKED_RACE, regattaAndRaceIdentifier,
regattaAndRaceIdentifier.toString(), () -> {
return super.createRaceDefinition(regatta, name, course, boatClass, competitorsAndTheirBoats,
id);
@@ -80,7 +80,7 @@ public interface HasPermissions {
* "LEADERBOARD/abc". This assumes that the {@link #name()} method returns only values that do not contain a "/".
*/
QualifiedObjectIdentifier getQualifiedObjectIdentifierByString(String typeRelativeObjectIdentifier);
/**
* Qualifies the {@code objectIdentifier} which only has to be unique within the scope of the type identified by
* this permission with this permission's type name. For example, if this permission is for the "LEADERBOARD" type,
@@ -1,5 +1,7 @@
package com.sap.sse.security.shared;
import java.io.Serializable;
import com.sap.sse.common.Named;
import com.sap.sse.common.WithID;
import com.sap.sse.security.shared.impl.WildcardPermissionEncoder;
@@ -7,6 +9,7 @@ import com.sap.sse.security.shared.impl.WildcardPermissionEncoder;
public interface IdentifierStrategy {
String getIdentifierAsString(Object... object);
String convertNewIdentifer(Object... object);
/**
* Identifier strategy that is used for object types that implement the
@@ -21,14 +24,12 @@ public interface IdentifierStrategy {
return WildcardPermissionEncoder.encode(namedObject.getName());
}
// @Override
// public <T> String buildNewIdentifier(T... params) {
// if (params.length != 1) {
// throw new IllegalArgumentException("IdentifierStrategy NAMED can only have one parameter for the name.");
// } else {
// return WildcardPermissionEncoder.encode((String) params[0]);
// }
// }
@Override
public String convertNewIdentifer(Object... object) {
assert object.length == 1;
String identifer = (String) object[0];
return WildcardPermissionEncoder.encode(identifer);
}
};
@@ -45,6 +46,13 @@ public interface IdentifierStrategy {
return objectWithId.getId().toString();
}
@Override
public String convertNewIdentifer(Object... object) {
assert object.length == 1;
Serializable identifier = (Serializable) object[0];
return identifier.toString();
}
};
/**
@@ -59,6 +67,13 @@ public interface IdentifierStrategy {
return WildcardPermissionEncoder.encode((String) object[0]);
}
@Override
public String convertNewIdentifer(Object... object) {
assert object.length == 1;
String identifier = (String) object[0];
return WildcardPermissionEncoder.encode(identifier);
}
};
/**
@@ -80,6 +95,11 @@ public interface IdentifierStrategy {
throw new UnsupportedOperationException();
}
@Override
public String convertNewIdentifer(Object... object) {
throw new UnsupportedOperationException();
}
};
}
@@ -334,11 +334,11 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
UserGroup getDefaultTenant();
<T> T setOwnershipCheckPermissionForObjectCreationAndRevertOnError(HasPermissions type,
String typeRelativeObjectIdentifier,
Object typeRelativeObjectIdentifier,
String securityDisplayName, ActionWithResult<T> createActionReturningCreatedObject);
void setOwnershipCheckPermissionForObjectCreationAndRevertOnError(HasPermissions type,
String typeRelativeObjectIdentifier, String securityDisplayName, Action actionToCreateObject);
Object typeRelativeObjectIdentifier, String securityDisplayName, Action actionToCreateObject);
User getAllUser();
@@ -1500,7 +1500,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
@Override
public <T> T setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
HasPermissions type, String typeIdentifier, String securityDisplayName,
HasPermissions type, Object typeIdentifier, String securityDisplayName,
ActionWithResult<T> actionWithResult) {
return setOwnershipCheckPermissionForObjectCreationAndRevertOnError(getDefaultTenantForCurrentUser(), type,
typeIdentifier, securityDisplayName, actionWithResult, false);
@@ -1508,7 +1508,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
@Override
public void setOwnershipCheckPermissionForObjectCreationAndRevertOnError(HasPermissions type,
String typeRelativeObjectIdentifier, String securityDisplayName,
Object typeRelativeObjectIdentifier, String securityDisplayName,
Action actionToCreateObject) {
setOwnershipCheckPermissionForObjectCreationAndRevertOnError(type, typeRelativeObjectIdentifier,
securityDisplayName, () -> {
@@ -1549,9 +1549,9 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
}
private <T> T setOwnershipCheckPermissionForObjectCreationAndRevertOnError(UserGroup tenantOwner,
HasPermissions type, String typeRelativeObjectIdentifier, String securityDisplayName,
HasPermissions type, Object typeRelativeObjectIdentifier, String securityDisplayName,
ActionWithResult<T> createActionReturningCreatedObject, boolean checkCreateObjectOnServer) {
QualifiedObjectIdentifier identifier = type.getQualifiedObjectIdentifierByString(typeRelativeObjectIdentifier);
QualifiedObjectIdentifier identifier = type.getQualifiedObjectIdentifierByString(type.identifierStrategy().convertNewIdentifer(typeRelativeObjectIdentifier));
T result = null;
boolean didSetOwnerShip = false;
try {