bug5899: require LEADERBOARD:PREMIUM_LEADERBOARD_INFORMATION for expensive REST API properties

This commit is contained in:
Axel Uhl
2023-08-28 18:14:46 +02:00
parent 95b94b6570
commit 4d94520f2c
4 changed files with 28 additions and 13 deletions
@@ -18,7 +18,8 @@ Require-Bundle: com.sap.sailing.domain.common,
com.sap.sse.replication,
com.sap.sailing.shared.server,
com.sap.sse.shared.android,
com.sap.sailing.server.gateway.interfaces
com.sap.sailing.server.gateway.interfaces,
org.apache.shiro.core;bundle-version="1.7.1"
Export-Package: com.sap.sailing.server.gateway.deserialization.impl,
com.sap.sailing.server.gateway.dto,
com.sap.sailing.server.gateway.serialization,
@@ -10,6 +10,7 @@ import java.util.NavigableSet;
import java.util.Set;
import java.util.function.Function;
import org.apache.shiro.SecurityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@@ -19,6 +20,8 @@ import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.domain.common.security.SecuredDomainType.LeaderboardActions;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuseCache;
import com.sap.sailing.domain.tracking.MarkPassing;
@@ -106,6 +109,8 @@ public class MarkPassingsJsonSerializer extends AbstractTrackedRaceDataJsonSeria
final NavigableSet<MarkPassing> markPassingsForCompetitor = trackedRace.getMarkPassings(competitor);
JSONArray markPassingsForCompetitorJson = new JSONArray();
forCompetitorJson.put(MARKPASSINGS, markPassingsForCompetitorJson);
final boolean leaderboardValidAndSubjectMaySeePremiumInformation = leaderboard != null &&
SecurityUtils.getSubject().isPermitted(SecuredDomainType.LEADERBOARD.getStringPermissionForObject(LeaderboardActions.PREMIUM_LEADERBOARD_INFORMATION, leaderboard));
trackedRace.lockForRead(markPassingsForCompetitor);
try {
for (MarkPassing markPassing : markPassingsForCompetitor) {
@@ -124,7 +129,8 @@ public class MarkPassingsJsonSerializer extends AbstractTrackedRaceDataJsonSeria
}
markPassingJson.put(TRACKED_RANK_AT_MARK_PASSING, rank);
markPassingJson.put(ONE_BASED_PASSING_ORDER, passingOrder);
if (leaderboard != null) {
// the following expensive-to-compute metrics will be delivered only to our valued "premium" customers:
if (leaderboardValidAndSubjectMaySeePremiumInformation) {
final Pair<RaceColumn, Fleet> raceColumnAndFleet = leaderboard.getRaceColumnAndFleet(trackedRace);
if (raceColumnAndFleet != null) {
final Double totalPoints = leaderboard.getScoreCorrection().getCorrectedScore(() -> passingOrder,