bug5541: added failing test case

This commit is contained in:
Axel Uhl
2021-05-15 00:47:27 +02:00
parent b0fa1bf97c
commit cb6ab90e47
7 changed files with 97 additions and 22 deletions
@@ -42,7 +42,6 @@ public abstract class AbstractJsonExportTest {
public void setUp() {
service = MongoDBConfiguration.getDefaultTestConfiguration().getService();
service.getDB().drop();
racingEventService = new RacingEventServiceImpl();
}
@@ -0,0 +1,79 @@
package com.sap.sailing.server.test;
import java.util.Collections;
import java.util.UUID;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.subject.support.SubjectThreadState;
import org.apache.shiro.util.ThreadContext;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl;
import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
import com.sap.sailing.server.hierarchy.SailingHierarchyOwnershipUpdater;
import com.sap.sailing.server.impl.RacingEventServiceImpl;
import com.sap.sailing.server.interfaces.RacingEventService;
import com.sap.sailing.server.testsupport.SecurityBundleTestWrapper;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.mongodb.MongoDBConfiguration;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.shared.UserManagementException;
public class LeagueEventHierarchyOwnershipChangeTest {
private Event event;
private LeaderboardGroup leaderboardGroup;
private Leaderboard overallLeaderboard;
private RacingEventService service;
private Subject subject;
private SubjectThreadState threadState;
private SecurityService securityService;
@Before
public void setUp() throws Exception {
MongoDBConfiguration.getDefaultTestConfiguration().getService().getDB().drop();
service = Mockito.spy(new RacingEventServiceImpl());
securityService = new SecurityBundleTestWrapper().initializeSecurityServiceForTesting();
Mockito.doReturn(securityService).when(service).getSecurityService();
event = service.addEvent("Test", "Test Event", TimePoint.now(), TimePoint.now().plus(Duration.ONE_WEEK), "Here",
/* isPublic */ true, UUID.randomUUID());
leaderboardGroup = new LeaderboardGroupImpl("LG", "LGDesc", "The LC", /* displayGroupsInReverseOrder */ false,
Collections.emptyList());
overallLeaderboard = new LeaderboardGroupMetaLeaderboard(leaderboardGroup, new LowPoint(),
new ThresholdBasedResultDiscardingRuleImpl(new int[0]));
leaderboardGroup.setOverallLeaderboard(overallLeaderboard);
event.addLeaderboardGroup(leaderboardGroup);
ThreadContext.unbindSubject(); // ensure that a new subject is created that knows the current security manager
subject = SecurityUtils.getSubject(); // this also binds the Subject to the ThreadContext
subject.login(new UsernamePasswordToken("admin", "admin"));
threadState = new SubjectThreadState(subject);
}
@Test
public void testLeagueEventHierarchyOwnershipChange() {
SailingHierarchyOwnershipUpdater.createOwnershipUpdater(/* createNewGroup */ true , /* existingGroupIdOrNull */ null,
/* newGroupName */ "The new owning group",
/* migrateCompetitors */ true, /* migrateBoats */ true, /* copyMembersAndRoles */ true,
service)
.updateGroupOwnershipForEventHierarchy(event);
// if this works without an exception, we're happy; see bug 5541
}
@After
public void tearDown() throws UserManagementException {
threadState.restore();
subject.logout();
securityService.deleteUser("admin");
}
}
@@ -16,6 +16,7 @@ import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.interfaces.RacingEventService;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.SecurityService.RoleCopyListener;
import com.sap.sse.security.ShiroWildcardPermissionFromParts;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
import com.sap.sse.security.shared.OwnershipAnnotation;
import com.sap.sse.security.shared.QualifiedObjectIdentifier;
@@ -155,10 +156,8 @@ public class SailingHierarchyOwnershipUpdater {
private void updateGroupOwner(QualifiedObjectIdentifier id) {
final OwnershipAnnotation ownership = securityService.getOwnership(id);
if (updateStrategy.needsUpdate(id, ownership)) {
String permissionToCheck = id.getTypeIdentifier() + WildcardPermission.PART_DIVIDER_TOKEN
+ DefaultActions.CHANGE_OWNERSHIP.name() + WildcardPermission.PART_DIVIDER_TOKEN
+ id.getTypeRelativeObjectIdentifier();
SecurityUtils.getSubject().checkPermission(permissionToCheck);
final WildcardPermission permission = id.getPermission(DefaultActions.CHANGE_OWNERSHIP);
SecurityUtils.getSubject().checkPermission(new ShiroWildcardPermissionFromParts(permission));
objectsToUpdateOwnershipsFor.add(id);
}
}
@@ -59,7 +59,6 @@ public final class SailingHierarchyWalker {
final LeaderboardGroupHierarchyVisitor visitor) {
boolean visitEvents = includeEventsIfLeaderboardGroupHasOverallLeaderboard
&& leaderboardGroup.hasOverallLeaderboard();
if (visitEvents) {
for (Event event : service.getAllEvents()) {
if (Util.contains(event.getLeaderboardGroups(), leaderboardGroup)) {
@@ -67,7 +66,6 @@ public final class SailingHierarchyWalker {
}
}
}
for (Leaderboard lb : leaderboardGroup.getLeaderboards()) {
visitor.visit(lb);
}
@@ -619,7 +619,8 @@ implements RacingEventService, ClearStateTestSupport, RegattaListener, Leaderboa
public RacingEventServiceImpl(boolean clearPersistentCompetitorAndBoatStore, final TypeBasedServiceFinderFactory serviceFinderFactory, boolean restoreTrackedRaces) {
this(clearPersistentCompetitorAndBoatStore, serviceFinderFactory, null, /* sailingNotificationService */ null,
/* trackedRaceStatisticsCache */ null, restoreTrackedRaces, null, /* sharedSailingDataTracker */ null, /* replicationServiceTracker */ null,
/* trackedRaceStatisticsCache */ null, restoreTrackedRaces,
/* securityServiceTracker */ null, /* sharedSailingDataTracker */ null, /* replicationServiceTracker */ null,
/* scoreCorrectionProviderServiceTracker */ null, /* resultUrlRegistryServiceTracker */ null);
}
@@ -0,0 +1,12 @@
package com.sap.sse.security;
import com.sap.sse.security.shared.WildcardPermission;
public class ShiroWildcardPermissionFromParts extends org.apache.shiro.authz.permission.WildcardPermission {
private static final long serialVersionUID = -6361446629960026098L;
public ShiroWildcardPermissionFromParts(WildcardPermission permission) {
super();
setParts(permission.getParts());
}
}
@@ -97,6 +97,7 @@ import com.sap.sse.security.SecurityInitializationCustomizer;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.SessionCacheManager;
import com.sap.sse.security.SessionUtils;
import com.sap.sse.security.ShiroWildcardPermissionFromParts;
import com.sap.sse.security.interfaces.AccessControlStore;
import com.sap.sse.security.interfaces.Credential;
import com.sap.sse.security.interfaces.OAuthToken;
@@ -1916,20 +1917,6 @@ implements ReplicableSecurityService, ClearStateTestSupport {
deleteAccessControlList(identifier);
}
private static class ShiroWildcardPermissionFromParts extends org.apache.shiro.authz.permission.WildcardPermission {
private static final long serialVersionUID = -6361446629960026098L;
private ShiroWildcardPermissionFromParts(Set<String> types, Set<String> actions, Set<String> objectIds) {
super();
setParts(Arrays.asList(types, actions, objectIds));
}
private ShiroWildcardPermissionFromParts(WildcardPermission permission) {
super();
setParts(permission.getParts());
}
}
@Override
public <T extends WithQualifiedObjectIdentifier> void filterObjectsWithPermissionForCurrentUser(
HasPermissions.Action action, Iterable<T> objectsToFilter,