Skip to content

Commit

Permalink
feat(jans-auth-server): added status list update on revoke
Browse files Browse the repository at this point in the history
#8562
Signed-off-by: YuriyZ <yzabrovarniy@gmail.com>
  • Loading branch information
yuriyz committed Jun 10, 2024
1 parent 47b5f9b commit 3501d12
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,6 @@
import io.jans.as.server.util.ServerUtil;
import io.jans.model.token.TokenEntity;
import io.jans.model.token.TokenType;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;

import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand All @@ -41,6 +35,10 @@
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;

import java.util.Arrays;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,33 @@

package io.jans.as.server.service;

import static org.apache.commons.lang.BooleanUtils.isTrue;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;

import com.google.common.collect.Lists;

import io.jans.as.model.config.StaticConfiguration;
import io.jans.as.model.configuration.AppConfiguration;
import io.jans.as.model.configuration.LockMessageConfig;
import io.jans.as.server.model.common.AuthorizationGrant;
import io.jans.as.server.model.common.CacheGrant;
import io.jans.as.server.service.token.StatusListIndexService;
import io.jans.as.server.util.TokenHashUtil;
import io.jans.model.token.TokenEntity;
import io.jans.model.token.TokenType;
import io.jans.model.tokenstatus.TokenStatus;
import io.jans.orm.PersistenceEntryManager;
import io.jans.orm.search.filter.Filter;
import io.jans.service.CacheService;
import io.jans.service.MessageService;
import io.jans.service.cache.CacheConfiguration;
import io.jans.util.StringHelper;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import static org.apache.commons.lang.BooleanUtils.isTrue;

/**
* @author Yuriy Zabrovarnyy
Expand Down Expand Up @@ -65,7 +64,7 @@ public class GrantService {
private AppConfiguration appConfiguration;

@Inject
private CacheConfiguration cacheConfiguration;
private StatusListIndexService statusListIndexService;

public static String generateGrantId() {
return UUID.randomUUID().toString();
Expand Down Expand Up @@ -153,6 +152,8 @@ public void removeSilently(TokenEntity token) {
if (shouldSaveInCache()) {
cacheService.remove(token.getTokenCode());
}

statusListIndexService.updateStatusAtIndex(token.getAttributes().getStatusListIndex(), TokenStatus.REVOKED);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@
import io.jans.as.server.model.config.ConfigurationFactory;
import io.jans.as.server.service.cluster.TokenPoolService;
import io.jans.model.token.TokenPool;
import io.jans.model.tokenstatus.StatusList;
import io.jans.model.tokenstatus.TokenStatus;
import io.jans.util.Pair;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;

import java.util.concurrent.locks.ReentrantLock;

Expand All @@ -18,6 +22,9 @@
@ApplicationScoped
public class StatusListIndexService {

@Inject
private Logger log;

@Inject
private TokenPoolService tokenPoolService;

Expand All @@ -28,6 +35,32 @@ public class StatusListIndexService {

private TokenPool tokenPool = null;

public void updateStatusAtIndex(int index, TokenStatus status) {
try {
if (index < 0) {
return; // invalid
}

log.trace("Updating status list at index {} with status {} ...", index, status);

final int bitSize = configurationFactory.getAppConfiguration().getStatusListBitSize();
final TokenPool indexHolder = tokenPoolService.getTokenPoolByIndex(index);
final String data = indexHolder.getData();

final StatusList statusList = StringUtils.isNotBlank(data) ? StatusList.fromEncoded(data, bitSize) : new StatusList(bitSize);
statusList.set(index, status.getValue());

indexHolder.setData(statusList.getLst());

tokenPoolService.update(indexHolder);

log.trace("Updated status list at index {} with status {} successfully.", index, status);

} catch (Exception e) {
log.error("Failed to update token list status at index " + index + " with status " + status, e);
}
}

public Integer next() {
return nextIndex().getFirst();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import io.jans.as.model.config.StaticConfiguration;
import io.jans.as.model.configuration.AppConfiguration;
import io.jans.as.server.service.token.StatusListIndexService;
import io.jans.model.token.TokenEntity;
import io.jans.model.token.TokenType;
import io.jans.orm.PersistenceEntryManager;
import io.jans.service.CacheService;
import io.jans.service.cache.CacheConfiguration;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
Expand Down Expand Up @@ -48,7 +48,7 @@ public class GrantServiceTest {
private AppConfiguration appConfiguration;

@Mock
private CacheConfiguration cacheConfiguration;
private StatusListIndexService statusListIndexService;

@Test
public void shouldPersist_byDefault_shouldReturnTrue() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.jans.model.tokenstatus;

import java.util.HashMap;
import java.util.Map;

/**
* @author Yuriy Z
*/
public enum TokenStatus {
CREATED(0),
REVOKED(1);

private final int value;

private static Map<Integer, TokenStatus> mapByValues = new HashMap<>();

static {
for (TokenStatus enumType : values()) {
mapByValues.put(enumType.getValue(), enumType);
}
}

TokenStatus(int value) {
this.value = value;
}

public int getValue() {
return value;
}

public static TokenStatus fromValue(int value) {
return mapByValues.get(value);
}
}

0 comments on commit 3501d12

Please sign in to comment.