bug6154: record failed access token authentication only if replication isn't currently starting

This commit is contained in:
Axel Uhl
2025-07-30 17:45:58 +02:00
parent c2ec0da1c2
commit c22f5179fa
4 changed files with 29 additions and 10 deletions
@@ -2,6 +2,7 @@ package com.sap.sse.security;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.shiro.authc.AuthenticationException;
@@ -49,7 +50,7 @@ public class BearerTokenRealm extends AbstractCompositeAuthorizingRealm {
logger.warning("Cannot check whether client IP/User-Agent is locked for bearer token-based authentication; security service not found");
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
logger.log(Level.SEVERE, "Error retrieving security service", e);
}
final User user = getUserStore().getUserByAccessToken(accessToken.getCredentials());
if (user == null) {
@@ -20,6 +20,7 @@ import com.sap.sse.classloading.ServiceTrackerCustomizerForClassLoaderSupplierRe
import com.sap.sse.mail.MailService;
import com.sap.sse.replication.Replicable;
import com.sap.sse.replication.ReplicationMasterDescriptor;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.rest.CORSFilterConfiguration;
import com.sap.sse.security.SecurityInitializationCustomizer;
import com.sap.sse.security.SecurityService;
@@ -211,9 +212,10 @@ public class Activator implements BundleActivator {
hasPermissionsProviderTracker.open();
SecurityService initialSecurityService = new SecurityServiceImpl(
ServiceTrackerFactory.createAndOpen(context, MailService.class),
ServiceTrackerFactory.createAndOpen(context, CORSFilterConfiguration.class), userStore,
accessControlStore, new OSGIHasPermissionsProvider(hasPermissionsProviderTracker),
subscriptionPlanProvider, sharedAcrossSubdomainsOf, baseUrlForCrossDomainStorage);
ServiceTrackerFactory.createAndOpen(context, CORSFilterConfiguration.class),
ServiceTrackerFactory.createAndOpen(context, ReplicationService.class),
userStore, accessControlStore,
new OSGIHasPermissionsProvider(hasPermissionsProviderTracker), subscriptionPlanProvider, sharedAcrossSubdomainsOf, baseUrlForCrossDomainStorage);
initialSecurityService.initialize();
securityService.complete(initialSecurityService);
registration = context.registerService(SecurityService.class, initialSecurityService, null);
@@ -103,6 +103,7 @@ import com.sap.sse.concurrent.LockUtil;
import com.sap.sse.concurrent.NamedReentrantReadWriteLock;
import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl;
import com.sap.sse.mail.MailService;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.replication.interfaces.impl.AbstractReplicableWithObjectInputStream;
import com.sap.sse.rest.CORSFilterConfiguration;
import com.sap.sse.security.Action;
@@ -244,6 +245,8 @@ implements ReplicableSecurityService, ClearStateTestSupport {
private final ServiceTracker<MailService, MailService> mailServiceTracker;
private final ServiceTracker<CORSFilterConfiguration, CORSFilterConfiguration> corsFilterConfigurationTracker;
private final ServiceTracker<ReplicationService, ReplicationService> replicationServiceTracker;
private ThreadLocal<UserGroup> temporaryDefaultTenant = new InheritableThreadLocal<>();
@@ -322,8 +325,8 @@ implements ReplicableSecurityService, ClearStateTestSupport {
ServiceTracker<CORSFilterConfiguration, CORSFilterConfiguration> corsFilterConfigurationTracker,
UserStore userStore, AccessControlStore accessControlStore, HasPermissionsProvider hasPermissionsProvider,
SubscriptionPlanProvider subscriptionPlanProvider) {
this(mailServiceTracker, corsFilterConfigurationTracker, userStore, accessControlStore, hasPermissionsProvider,
subscriptionPlanProvider, /* sharedAcrossSubdomainsOf */ null, /* baseUrlForCrossDomainStorage */ null);
this(mailServiceTracker, corsFilterConfigurationTracker, /* replicationServiceTracker */ null, userStore, accessControlStore,
hasPermissionsProvider, subscriptionPlanProvider, /* sharedAcrossSubdomainsOf */ null, /* baseUrlForCrossDomainStorage */ null);
}
/**
@@ -333,8 +336,8 @@ implements ReplicableSecurityService, ClearStateTestSupport {
* be shared as well.
*/
public SecurityServiceImpl(ServiceTracker<MailService, MailService> mailServiceTracker, ServiceTracker<CORSFilterConfiguration, CORSFilterConfiguration> corsFilterConfigurationTracker,
UserStore userStore, AccessControlStore accessControlStore, HasPermissionsProvider hasPermissionsProvider,
SubscriptionPlanProvider subscriptionPlanProvider, String sharedAcrossSubdomainsOf, String baseUrlForCrossDomainStorage) {
ServiceTracker<ReplicationService, ReplicationService> replicationServiceTracker, UserStore userStore, AccessControlStore accessControlStore,
HasPermissionsProvider hasPermissionsProvider, SubscriptionPlanProvider subscriptionPlanProvider, String sharedAcrossSubdomainsOf, String baseUrlForCrossDomainStorage) {
initialLoadClassLoaderRegistry.addClassLoader(getClass().getClassLoader());
if (hasPermissionsProvider == null) {
throw new IllegalArgumentException("No HasPermissionsProvider defined");
@@ -350,6 +353,7 @@ implements ReplicableSecurityService, ClearStateTestSupport {
this.accessControlStore = accessControlStore;
this.mailServiceTracker = mailServiceTracker;
this.corsFilterConfigurationTracker = corsFilterConfigurationTracker;
this.replicationServiceTracker = replicationServiceTracker;
this.hasPermissionsProvider = hasPermissionsProvider;
this.cacheManager = loadReplicationCacheManagerContents();
this.corsFilterConfigurationsByReplicaSetName = loadCORSFilterConfigurations();
@@ -540,6 +544,10 @@ implements ReplicableSecurityService, ClearStateTestSupport {
private CORSFilterConfiguration getCORSFilterConfiguration() {
return corsFilterConfigurationTracker == null ? null : corsFilterConfigurationTracker.getService();
}
private ReplicationService getReplicationService() {
return replicationServiceTracker == null ? null : replicationServiceTracker.getService();
}
@Override
public void sendMail(String username, String subject, String body) throws MailException {
@@ -1328,7 +1336,15 @@ implements ReplicableSecurityService, ClearStateTestSupport {
@Override
public LockingAndBanning failedBearerTokenAuthentication(String clientIP) {
return apply(s->s.internalFailedBearerTokenAuthentication(clientIP));
final LockingAndBanning result;
final ReplicationService replicationService = getReplicationService();
if (replicationService == null || !replicationService.isReplicationStarting()) {
result = apply(s->s.internalFailedBearerTokenAuthentication(clientIP));
} else {
logger.warning("Replication is starting, so not recording failed bearer token authentication for client IP "+clientIP);
result = null;
}
return result;
}
@Override