fixed multiple points interacting with the userstore directly, that

might cause issues with replication
This commit is contained in:
Kai Börnert
2018-11-14 09:34:38 +01:00
parent 3b142863d6
commit 61e0f6aa7c
7 changed files with 26 additions and 30 deletions
@@ -19,7 +19,6 @@ import com.sap.sse.gwt.dispatch.shared.exceptions.DispatchException;
import com.sap.sse.gwt.dispatch.shared.exceptions.ServerDispatchException;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.User;
import com.sap.sse.security.UserStore;
@GwtIncompatible
public class SailingDispatchContextImpl implements SailingDispatchContext {
@@ -30,20 +29,18 @@ public class SailingDispatchContextImpl implements SailingDispatchContext {
private String clientLocaleName;
private final HttpServletRequest request;
private final SecurityService securityService;
private final UserStore userStore;
private final TrackedRaceStatisticsCache trackedRaceStatisticsCache;
private final WindFinderTrackerFactory windFinderTrackerFactory;
public SailingDispatchContextImpl(Date currentClientTime, RacingEventService racingEventService,
WindFinderTrackerFactory windFinderTrackerFactory, EventNewsService eventNewsService,
SecurityService securityService, UserStore userStore, TrackedRaceStatisticsCache trackedRaceStatisticsCache,
SecurityService securityService, TrackedRaceStatisticsCache trackedRaceStatisticsCache,
String clientLocaleName, HttpServletRequest request) {
this.currentClientTime = currentClientTime;
this.racingEventService = racingEventService;
this.windFinderTrackerFactory = windFinderTrackerFactory;
this.eventNewsService = eventNewsService;
this.securityService = securityService;
this.userStore = userStore;
this.trackedRaceStatisticsCache = trackedRaceStatisticsCache;
this.clientLocaleName = clientLocaleName;
this.request = request;
@@ -96,7 +93,7 @@ public class SailingDispatchContextImpl implements SailingDispatchContext {
public <T> T getPreferenceForCurrentUser(String preferenceKey) {
User currentUser = securityService.getCurrentUser();
if (currentUser != null) {
return userStore.getPreferenceObject(currentUser.getName(), preferenceKey);
return securityService.getPreferenceObject(currentUser.getName(), preferenceKey);
}
return null;
}
@@ -24,7 +24,6 @@ import com.sap.sse.gwt.dispatch.servlets.AbstractDispatchServlet;
import com.sap.sse.gwt.dispatch.shared.commands.Action;
import com.sap.sse.gwt.dispatch.shared.commands.Result;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.UserStore;
import com.sap.sse.util.ServiceTrackerFactory;
public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispatchContext> {
@@ -34,7 +33,6 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
private final ServiceTracker<WindFinderTrackerFactory, WindFinderTrackerFactory> windFinderTrackerFactory;
private final ServiceTracker<EventNewsService, EventNewsService> eventNewsServiceTracker;
private final ServiceTracker<SecurityService, SecurityService> securityServiceTracker;
private final ServiceTracker<UserStore, UserStore> userStoreTracker;
private final ServiceTracker<TrackedRaceStatisticsCache, TrackedRaceStatisticsCache> trackedRaceStatisticsCacheTracker;
public SailingDispatchServlet() {
@@ -43,7 +41,6 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
windFinderTrackerFactory = ServiceTrackerFactory.createAndOpen(context, WindFinderTrackerFactory.class);
eventNewsServiceTracker = ServiceTrackerFactory.createAndOpen(context, EventNewsService.class);
securityServiceTracker = ServiceTrackerFactory.createAndOpen(context, SecurityService.class);
userStoreTracker = ServiceTrackerFactory.createAndOpen(context, UserStore.class);
trackedRaceStatisticsCacheTracker = ServiceTrackerFactory.createAndOpen(context, TrackedRaceStatisticsCache.class);
}
@@ -53,7 +50,7 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
return new SailingDispatchContextImpl(request.getCurrentClientTime(), racingEventServiceTracker.getService(),
windFinderTrackerFactory.getService(),
eventNewsServiceTracker.getService(), securityServiceTracker.getService(),
userStoreTracker.getService(), trackedRaceStatisticsCacheTracker.getService(),
trackedRaceStatisticsCacheTracker.getService(),
request.getClientLocaleName(), getThreadLocalRequest());
}
@@ -54,7 +54,6 @@ import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
import com.sap.sse.datamining.ui.client.DataMiningService;
import com.sap.sse.i18n.ResourceBundleStringMessages;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.UserStore;
import com.sap.sse.util.ServiceTrackerFactory;
public class DataMiningServiceImpl extends RemoteServiceServlet implements DataMiningService {
@@ -64,7 +63,6 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
private final ServiceTracker<DataMiningServer, DataMiningServer> dataMiningServerTracker;
private final ServiceTracker<SecurityService, SecurityService> securityServiceTracker;
private final ServiceTracker<UserStore, UserStore> userStoreServiceTracker;
private final StoredDataMiningQueryPersister storedDataMiningQueryPersistor;
@@ -74,10 +72,8 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
context = Activator.getDefault();
dataMiningServerTracker = createAndOpenDataMiningServerTracker(context);
securityServiceTracker = ServiceTrackerFactory.createAndOpen(context, SecurityService.class);
userStoreServiceTracker = ServiceTrackerFactory.createAndOpen(context, UserStore.class);
storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(securityServiceTracker.getService(),
userStoreServiceTracker.getService());
storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(securityServiceTracker.getService());
dtoFactory = new DataMiningDTOFactory();
}
@@ -18,18 +18,14 @@ import com.sap.sse.datamining.shared.impl.dto.StoredDataMiningQueryDTOImpl;
import com.sap.sse.gwt.dispatch.shared.exceptions.ServerDispatchException;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.User;
import com.sap.sse.security.UserStore;
/** Implementation of {@link StoredDataMiningQueryPersister}. */
public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQueryPersister {
private final SecurityService securityService;
private final UserStore userStore;
public StoredDataMiningQueryPersisterImpl(SecurityService securityService, UserStore userStore) {
public StoredDataMiningQueryPersisterImpl(SecurityService securityService) {
this.securityService = securityService;
this.userStore = userStore;
}
/** @return all {@link StoredDataMiningQueryDTO}s the user has stored in his user store. */
@@ -101,7 +97,7 @@ public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQuery
User currentUser = securityService.getCurrentUser();
if (currentUser != null) {
try {
userStore.setPreferenceObject(currentUser.getName(), preferenceKey, preference);
securityService.setPreferenceObject(currentUser.getName(), preferenceKey, preference);
} catch (AuthorizationException e) {
throw new ServerDispatchException(e);
}
@@ -124,9 +120,8 @@ public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQuery
private <T> T getPreferenceForCurrentUser(String preferenceKey) {
User currentUser = securityService.getCurrentUser();
if (currentUser != null) {
return userStore.getPreferenceObject(currentUser.getName(), preferenceKey);
return securityService.getPreferenceObject(currentUser.getName(), preferenceKey);
}
return null;
}
}
@@ -15,7 +15,7 @@ import org.json.simple.parser.ParseException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sse.security.UserStore;
import com.sap.sse.security.SecurityService;
@Path("/v1/preferences")
public class PreferencesResource extends AbstractSailingServerResource {
@@ -27,8 +27,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
Response response = null;
if (SecurityUtils.getSubject().isAuthenticated()) {
String username = SecurityUtils.getSubject().getPrincipal().toString();
UserStore userStore = getService(UserStore.class);
String settings = userStore.getPreference(username, settingsKey);
SecurityService securityService = getService(SecurityService.class);
String settings = securityService.getPreference(username, settingsKey);
if (settings == null) {
response = Response.noContent().build();
} else {
@@ -48,8 +48,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
Response response = null;
if (SecurityUtils.getSubject().isAuthenticated()) {
String username = SecurityUtils.getSubject().getPrincipal().toString();
UserStore userStore = getService(UserStore.class);
userStore.setPreference(username, settingsKey, json);
SecurityService securityService = getService(SecurityService.class);
securityService.setPreference(username, settingsKey, json);
response = Response.ok().build();
} else {
response = Response.status(401).build();
@@ -65,8 +65,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
Response response = null;
if (SecurityUtils.getSubject().isAuthenticated()) {
String username = SecurityUtils.getSubject().getPrincipal().toString();
UserStore userStore = getService(UserStore.class);
userStore.unsetPreference(username, settingsKey);
SecurityService securityService = getService(SecurityService.class);
securityService.unsetPreference(username, settingsKey);
response = Response.ok().build();
} else {
response = Response.status(401).build();
@@ -158,6 +158,12 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
*/
String getPreference(String username, String key);
/**
* Gets a preference object. Always returns null if there is no converter associated with the given key -> see
* {@link #registerPreferenceConverter(String, PreferenceConverter)}.
*/
<T> T getPreferenceObject(String username, String key);
/**
* @return all preferences of the given user
*/
@@ -195,5 +201,4 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
void removeAccessToken(String username);
User loginByAccessToken(String accessToken);
}
@@ -1096,4 +1096,10 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
((ReplicatingCacheManager) cm).clear();
}
}
@Override
public <T> T getPreferenceObject(String username, String key) {
ensureThatUserInQuestionIsLoggedInOrCurrentUserIsAdmin(username);
return store.getPreferenceObject(username, key);
}
}