diff --git a/java/com.sap.sailing.xmlexport.test/src/com/sap/sailing/xmlexport/test/SecurityServiceMock.java b/java/com.sap.sailing.xmlexport.test/src/com/sap/sailing/xmlexport/test/SecurityServiceMock.java index 29b2c48e099..09f3ee7e1f6 100644 --- a/java/com.sap.sailing.xmlexport.test/src/com/sap/sailing/xmlexport/test/SecurityServiceMock.java +++ b/java/com.sap.sailing.xmlexport.test/src/com/sap/sailing/xmlexport/test/SecurityServiceMock.java @@ -881,4 +881,10 @@ public class SecurityServiceMock implements SecurityService { return false; } + @Override + public T setOwnershipWithoutCheckPermissionForObjectCreationAndRevertOnError(HasPermissions type, + TypeRelativeObjectIdentifier typeIdentifier, String securityDisplayName, Callable actionWithResult) { + return null; + } + } diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java index f005bec2b6b..df955f03319 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java @@ -564,4 +564,7 @@ public interface SecurityService extends ReplicableWithObjectInputStream T setOwnershipWithoutCheckPermissionForObjectCreationAndRevertOnError(HasPermissions type, + TypeRelativeObjectIdentifier typeIdentifier, String securityDisplayName, Callable actionWithResult); } diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index f84d5c6a070..cd6c7b3bcf8 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -1667,6 +1667,33 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat return result; } + @Override + public T setOwnershipWithoutCheckPermissionForObjectCreationAndRevertOnError(HasPermissions type, + TypeRelativeObjectIdentifier typeIdentifier, String securityDisplayName, Callable actionWithResult) { + QualifiedObjectIdentifier identifier = type.getQualifiedObjectIdentifier(typeIdentifier); + T result = null; + boolean didSetOwnership = false; + try { + final OwnershipAnnotation preexistingOwnership = getOwnership(identifier); + if (preexistingOwnership == null) { + didSetOwnership = true; + setDefaultOwnership(identifier, securityDisplayName); + } else { + logger.fine("Preexisting ownership found for " + identifier + ": " + preexistingOwnership); + } + SecurityUtils.getSubject().checkPermission(identifier.getStringPermission(DefaultActions.CREATE)); + result = actionWithResult.call(); + } catch (AuthorizationException e) { + if (didSetOwnership) { + deleteOwnership(identifier); + } + throw e; + } catch (Exception e) { + throw new RuntimeException(e); + } + return result; + } + @Override public void setDefaultOwnership(QualifiedObjectIdentifier identifier, String description) { setOwnership(identifier, getCurrentUser(), getDefaultTenantForCurrentUser(), description);