Merge branch 'main' into bug6070

This commit is contained in:
Axel Uhl
2024-11-20 09:23:23 +01:00
16 changed files with 102 additions and 22 deletions
@@ -10,6 +10,8 @@ Import-Package: com.sap.sailing.geocoding,
com.sap.sailing.server.preferences,
com.sap.sse.replication,
com.sap.sse.security,
org.apache.shiro;version="[1.7.0,2.0.0]",
org.apache.shiro.subject;version="[1.7.0,2.0.0]",
org.osgi.framework;version="1.7.0"
Export-Package: com.sap.sailing.datamining,
com.sap.sailing.datamining.data,
@@ -4,6 +4,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasLeaderboardContext;
import com.sap.sailing.datamining.data.HasRaceResultOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
@@ -11,6 +14,7 @@ import com.sap.sailing.datamining.impl.data.RaceResultOfCompetitorWithContext;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class CompetitorOfRaceInLeaderboardRetrievalProcessor
extends AbstractRetrievalProcessor<HasTrackedRaceContext, HasRaceResultOfCompetitorContext> {
@@ -30,10 +34,13 @@ public class CompetitorOfRaceInLeaderboardRetrievalProcessor
if (isAborted()) {
break;
}
HasRaceResultOfCompetitorContext raceResultOfCompetitorContext = new RaceResultOfCompetitorWithContext(
leaderboardContext, element.getRaceColumn(), competitor,
leaderboardContext.getLeaderboardGroupContext().getPolarDataService(), element);
raceResultsOfCompetitor.add(raceResultOfCompetitorContext);
final Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(competitor.getIdentifier().getStringPermission(DefaultActions.READ))) {
HasRaceResultOfCompetitorContext raceResultOfCompetitorContext = new RaceResultOfCompetitorWithContext(
leaderboardContext, element.getRaceColumn(), competitor,
leaderboardContext.getLeaderboardGroupContext().getPolarDataService(), element);
raceResultsOfCompetitor.add(raceResultOfCompetitorContext);
}
}
return raceResultsOfCompetitor;
}
@@ -3,12 +3,16 @@ package com.sap.sailing.datamining.impl.components;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasCompetitorContext;
import com.sap.sailing.datamining.data.HasLeaderboardContext;
import com.sap.sailing.datamining.impl.data.CompetitorWithContext;
import com.sap.sse.common.Util;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class CompetitorRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardContext, HasCompetitorContext> {
public CompetitorRetrievalProcessor(ExecutorService executor,
@@ -20,6 +24,10 @@ public class CompetitorRetrievalProcessor extends AbstractRetrievalProcessor<Has
@Override
protected Iterable<HasCompetitorContext> retrieveData(HasLeaderboardContext element) {
return Util.map(element.getLeaderboard().getCompetitors(), c->new CompetitorWithContext(c, element));
final Subject subject = SecurityUtils.getSubject();
return Util.map(
Util.filter(element.getLeaderboard().getCompetitors(),
c->subject.isPermitted(c.getIdentifier().getStringPermission(DefaultActions.READ))),
c->new CompetitorWithContext(c, element));
}
}
@@ -5,6 +5,9 @@ import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasLeaderboardGroupContext;
import com.sap.sailing.datamining.impl.data.LeaderboardGroupWithContext;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
@@ -12,6 +15,7 @@ import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.server.interfaces.RacingEventService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class LeaderboardGroupRetrievalProcessor extends AbstractRetrievalProcessor<RacingEventService, HasLeaderboardGroupContext> {
@@ -26,11 +30,14 @@ public class LeaderboardGroupRetrievalProcessor extends AbstractRetrievalProcess
protected Iterable<HasLeaderboardGroupContext> retrieveData(RacingEventService element) {
Set<HasLeaderboardGroupContext> data = new HashSet<>();
PolarDataService polarDataService = element.getPolarDataService();
for (LeaderboardGroup leaderboardGroup : element.getLeaderboardGroups().values()) {
for (final LeaderboardGroup leaderboardGroup : element.getLeaderboardGroups().values()) {
if (isAborted()) {
break;
}
data.add(new LeaderboardGroupWithContext(leaderboardGroup, polarDataService, element.getBaseDomainFactory(), element.getSecurityService()));
final Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(leaderboardGroup.getIdentifier().getStringPermission(DefaultActions.READ))) {
data.add(new LeaderboardGroupWithContext(leaderboardGroup, polarDataService, element.getBaseDomainFactory(), element.getSecurityService()));
}
}
return data;
}
@@ -4,12 +4,16 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasLeaderboardContext;
import com.sap.sailing.datamining.data.HasLeaderboardGroupContext;
import com.sap.sailing.datamining.impl.data.LeaderboardWithContext;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class LeaderboardRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardGroupContext, HasLeaderboardContext> {
@@ -27,7 +31,10 @@ public class LeaderboardRetrievalProcessor extends AbstractRetrievalProcessor<Ha
if (isAborted()) {
break;
}
leaderboardsWithContext.add(new LeaderboardWithContext(leaderboard, element));
final Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(leaderboard.getIdentifier().getStringPermission(DefaultActions.READ))) {
leaderboardsWithContext.add(new LeaderboardWithContext(leaderboard, element));
}
}
return leaderboardsWithContext;
}
@@ -4,6 +4,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sailing.datamining.impl.data.RaceOfCompetitorWithContext;
@@ -11,6 +14,7 @@ import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class RaceOfCompetitorRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedRaceContext, HasRaceOfCompetitorContext> {
/**
@@ -37,8 +41,11 @@ public class RaceOfCompetitorRetrievalProcessor extends AbstractRetrievalProcess
if (isAborted()) {
break;
}
HasRaceOfCompetitorContext raceOfCompetitorWithContext = new RaceOfCompetitorWithContext(element, competitor, settings);
raceOfCompetitorsWithContext.add(raceOfCompetitorWithContext);
final Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(competitor.getIdentifier().getStringPermission(DefaultActions.READ))) {
HasRaceOfCompetitorContext raceOfCompetitorWithContext = new RaceOfCompetitorWithContext(element, competitor, settings);
raceOfCompetitorsWithContext.add(raceOfCompetitorWithContext);
}
}
}
return raceOfCompetitorsWithContext;
@@ -4,6 +4,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasLeaderboardContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sailing.datamining.impl.data.TrackedRaceWithContext;
@@ -13,6 +16,7 @@ import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class TrackedRaceRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardContext, HasTrackedRaceContext> {
@@ -36,13 +40,17 @@ public class TrackedRaceRetrievalProcessor extends AbstractRetrievalProcessor<Ha
break;
}
TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
if (trackedRace != null) {
final Subject subject = SecurityUtils.getSubject();
if (trackedRace != null
&& subject.isPermitted(trackedRace.getIdentifier().getStringPermission(DefaultActions.READ))) {
Regatta regatta = trackedRace.getTrackedRegatta().getRegatta();
HasTrackedRaceContext trackedRaceWithContext = new TrackedRaceWithContext(element, regatta, raceColumn, fleet, trackedRace);
trackedRacesWithContext.add(trackedRaceWithContext);
if (subject.isPermitted(regatta.getIdentifier().getStringPermission(DefaultActions.READ))) {
HasTrackedRaceContext trackedRaceWithContext = new TrackedRaceWithContext(element, regatta, raceColumn, fleet, trackedRace);
trackedRacesWithContext.add(trackedRaceWithContext);
}
}
else {
//no tracked race found
// no tracked race found
HasTrackedRaceContext trackedRaceWithContext = new TrackedRaceWithContext(element, /* regatta */ null, raceColumn, fleet, /* trackedRace */ null);
trackedRacesWithContext.add(trackedRaceWithContext);
}
@@ -50,5 +58,4 @@ public class TrackedRaceRetrievalProcessor extends AbstractRetrievalProcessor<Ha
}
return trackedRacesWithContext;
}
}
@@ -12,6 +12,7 @@ import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.server.preferences.SailorProfilePreference;
import com.sap.sailing.server.preferences.SailorProfilePreferences;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.shared.impl.User;
public class LeaderboardGroupWithContext implements HasLeaderboardGroupContext {
private final LeaderboardGroup leaderboardGroup;
@@ -54,7 +55,11 @@ public class LeaderboardGroupWithContext implements HasLeaderboardGroupContext {
@Override
public synchronized SailorProfiles getSailorProfiles() {
if (sailorProfiles == null) {
final SailorProfilePreferences sailorProfilePreferences = getSecurityService().getPreferenceObject(getSecurityService().getCurrentUser().getName(), SailorProfilePreferences.PREF_NAME);
final User currentUser = getSecurityService().getCurrentUser();
if (currentUser == null) {
throw new NullPointerException("No user session in DataMining. Thread pool context problems? You may need to attach a user session to the thread.");
}
final SailorProfilePreferences sailorProfilePreferences = getSecurityService().getPreferenceObject(currentUser.getName(), SailorProfilePreferences.PREF_NAME);
if (sailorProfilePreferences != null) {
final List<SailorProfile> theSailorProfiles = new ArrayList<>();
for (final SailorProfilePreference sailorProfilePreference : sailorProfilePreferences.getSailorProfiles()) {
@@ -8,7 +8,7 @@ import com.sap.sailing.datamining.data.SailorProfiles;
import com.sap.sailing.domain.base.Competitor;
public class SailorProfilesImpl implements SailorProfiles {
final Map<Competitor, SailorProfile> profilesForCompetitor;
private final Map<Competitor, SailorProfile> profilesForCompetitor;
/**
* Constructs the mapping from {@link Competitor} to {@link SailorProfile} based on the
@@ -28,6 +28,8 @@
<li>Introduced a new Data Mining dimension "Sailor Profile Name." With this, if a user in their "User Details"
creates one or more "Sailor Profiles" to group multiple occurrences of what is to be considered "the same sailor"
into one profile, these profiles can be used for filtering and grouping in data mining.</li>
<li>Bug fix: data mining now correctly propagates the current user session to all data retrieval processes,
and all security checks for object readability by the current subject are now in place.</li>
</ul>
<h5 class="articleSubheadline">October 2024</h5>
<ul class="bulletList">
@@ -25,3 +25,5 @@ Bundle-ActivationPolicy: lazy
Export-Package: com.sap.sailing.polars.datamining.data,
com.sap.sailing.polars.datamining.data.impl
Automatic-Module-Name: com.sap.sailing.polars.datamining
Import-Package: org.apache.shiro;version="[1.7.0,2.0.0]",
org.apache.shiro.subject;version="[1.7.0,2.0.0]"
@@ -5,12 +5,16 @@ import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasLeaderboardGroupContext;
import com.sap.sailing.datamining.impl.data.LeaderboardGroupWithContext;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.server.interfaces.RacingEventService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class PolarLeaderboardGroupRetrievalProcessor extends AbstractRetrievalProcessor<RacingEventService, HasLeaderboardGroupContext> {
public PolarLeaderboardGroupRetrievalProcessor(ExecutorService executor,
@@ -27,7 +31,10 @@ public class PolarLeaderboardGroupRetrievalProcessor extends AbstractRetrievalPr
if (isAborted()) {
break;
}
data.add(new LeaderboardGroupWithContext(leaderboardGroup, element.getPolarDataService(), element.getBaseDomainFactory(), element.getSecurityService()));
final Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(leaderboardGroup.getIdentifier().getStringPermission(DefaultActions.READ))) {
data.add(new LeaderboardGroupWithContext(leaderboardGroup, element.getPolarDataService(), element.getBaseDomainFactory(), element.getSecurityService()));
}
}
return data;
}
@@ -5,12 +5,16 @@ import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sailing.datamining.data.HasLeaderboardGroupContext;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.polars.datamining.data.HasLeaderboardPolarContext;
import com.sap.sailing.polars.datamining.data.impl.LeaderboardWithPolarContext;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class PolarLeaderboardRetrievalProcessor extends AbstractRetrievalProcessor<HasLeaderboardGroupContext, HasLeaderboardPolarContext> {
@@ -28,7 +32,10 @@ public class PolarLeaderboardRetrievalProcessor extends AbstractRetrievalProcess
if (isAborted()) {
break;
}
leaderboardsWithContext.add(new LeaderboardWithPolarContext(leaderboard, element));
final Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(leaderboard.getIdentifier().getStringPermission(DefaultActions.READ))) {
leaderboardsWithContext.add(new LeaderboardWithPolarContext(leaderboard, element));
}
}
return leaderboardsWithContext;
}
@@ -5,7 +5,9 @@ Bundle-SymbolicName: com.sap.sse.datamining
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Import-Package: org.osgi.framework;version="1.7.0"
Import-Package: org.apache.shiro;version="[1.7.0,2.0.0]",
org.apache.shiro.subject;version="[1.7.0,2.0.0]",
org.osgi.framework;version="1.7.0"
Export-Package: com.sap.sse.datamining,
com.sap.sse.datamining.components,
com.sap.sse.datamining.components.management,
@@ -6,6 +6,8 @@ import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sse.datamining.components.AdditionalResultDataBuilder;
import com.sap.sse.datamining.components.Processor;
@@ -46,7 +48,8 @@ public abstract class AbstractParallelProcessor<InputType, ResultType> extends A
if (isInstructionValid(instruction)) {
unfinishedInstructionsCounter.getAndIncrement();
try {
executor.execute(instruction);
final Subject subject = SecurityUtils.getSubject(); // pass on the current subject to the instruction
executor.execute(subject.associateWith(instruction));
} catch (RejectedExecutionException exc) {
LOGGER.log(Level.FINEST, "A " + RejectedExecutionException.class.getSimpleName()
+ " appeared during the processing.");
@@ -6,12 +6,16 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
import com.sap.sse.security.datamining.data.HasRoleOfUserGroupContext;
import com.sap.sse.security.datamining.data.HasUserGroupContext;
import com.sap.sse.security.datamining.data.impl.RoleOfUserGroupWithContext;
import com.sap.sse.security.shared.RoleDefinition;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
public class SecurityRolesOfUserGroupRetrievalProcessor extends AbstractRetrievalProcessor<HasUserGroupContext, HasRoleOfUserGroupContext> {
public SecurityRolesOfUserGroupRetrievalProcessor(ExecutorService executor,
@@ -28,7 +32,10 @@ public class SecurityRolesOfUserGroupRetrievalProcessor extends AbstractRetrieva
if (isAborted()) {
break;
}
data.add(new RoleOfUserGroupWithContext(element, roleDefinitionAndForAll.getKey(), roleDefinitionAndForAll.getValue()));
final Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted(roleDefinitionAndForAll.getKey().getIdentifier().getStringPermission(DefaultActions.READ))) {
data.add(new RoleOfUserGroupWithContext(element, roleDefinitionAndForAll.getKey(), roleDefinitionAndForAll.getValue()));
}
}
return data;
}