Skip to content

Commit a16a4c1

Browse files
author
lastpeony
committed
jwt blacklist for inmemory db
1 parent 9002d6c commit a16a4c1

File tree

4 files changed

+82
-13
lines changed

4 files changed

+82
-13
lines changed

src/main/java/io/antmedia/datastore/db/InMemoryDataStore.java

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import java.time.Instant;
55
import java.util.*;
66
import java.util.Map.Entry;
7+
import java.util.concurrent.atomic.AtomicInteger;
78
import java.util.regex.Pattern;
89

10+
import com.google.gson.Gson;
11+
import com.google.gson.GsonBuilder;
912
import io.antmedia.rest.model.Result;
1013
import io.antmedia.security.ITokenService;
1114
import org.apache.commons.io.FilenameUtils;
@@ -38,8 +41,11 @@ public class InMemoryDataStore extends DataStore {
3841
private Map<String, ConferenceRoom> roomMap = new LinkedHashMap<>();
3942
private Map<String, WebRTCViewerInfo> webRTCViewerMap = new LinkedHashMap<>();
4043

44+
private Gson gson;
4145

4246
public InMemoryDataStore(String dbName) {
47+
GsonBuilder builder = new GsonBuilder();
48+
gson = builder.create();
4349
available = true;
4450
}
4551

@@ -899,22 +905,65 @@ public boolean deleteToken(String tokenId) {
899905

900906
@Override
901907
public boolean whiteListToken(String tokenId) {
908+
Token token = getToken(tokenId);
909+
if(token != null && token.isBlackListed()){
910+
token.setBlackListed(false);
911+
return saveToken(token);
912+
}
913+
914+
902915
return false;
903916
}
904917

905918
@Override
906919
public List<String> getBlackListedTokens() {
907-
return Collections.emptyList();
920+
921+
ArrayList<String> tokenBlacklist = new ArrayList<>();
922+
tokenMap.forEach((tokenId, token) -> {
923+
if(token.isBlackListed()){
924+
tokenBlacklist.add(tokenId);
925+
}
926+
});
927+
return tokenBlacklist;
928+
908929
}
909930

910931
@Override
911932
public Result deleteAllBlacklistedExpiredTokens(ITokenService tokenService) {
912-
return null;
933+
logger.info("Deleting all expired JWTs from token storage.");
934+
AtomicInteger deletedTokenCount = new AtomicInteger();
935+
936+
tokenMap.forEach((tokenId, token) -> {
937+
if(token.isBlackListed() && !tokenService.verifyJwt(tokenId,token.getStreamId(),token.getType())){
938+
if(deleteToken(tokenId)){
939+
deletedTokenCount.getAndIncrement();
940+
}else{
941+
logger.warn("Couldn't delete JWT:{}", tokenId);
942+
}
943+
}
944+
});
945+
946+
947+
if(deletedTokenCount.get() > 0){
948+
final String successMsg = deletedTokenCount+" JWT deleted successfully from storage.";
949+
logger.info(successMsg);
950+
return new Result(true, successMsg);
951+
}else{
952+
final String failMsg = "No JWT deleted from storage.";
953+
logger.warn(failMsg);
954+
return new Result(false, failMsg);
955+
}
913956
}
914957

915958
@Override
916959
public boolean whiteListAllTokens() {
917-
throw new UnsupportedOperationException("");
960+
tokenMap.forEach((tokenId, token) -> {
961+
if(token.isBlackListed()){
962+
whiteListToken(tokenId);
963+
}
964+
});
965+
966+
return true;
918967
}
919968

920969
@Override
@@ -1060,11 +1109,22 @@ public boolean updateStreamMetaData(String streamId, String metaData) {
10601109

10611110
@Override
10621111
public boolean blackListToken(Token token) {
1063-
return false;
1112+
boolean result = false;
1113+
1114+
if (token.getStreamId() != null && token.getTokenId() != null) {
1115+
token.setBlackListed(true);
1116+
return saveToken(token);
1117+
}
1118+
1119+
return result;
10641120
}
10651121

10661122
@Override
10671123
public Token getBlackListedToken(String tokenId) {
1124+
Token token = getToken(tokenId);
1125+
if(token != null && token.isBlackListed()){
1126+
return token;
1127+
}
10681128
return null;
10691129
}
10701130
}

src/main/java/io/antmedia/rest/BroadcastRestService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ public Result validateTokenV2(@ApiParam(value = "Token to be validated", require
613613
@Consumes(MediaType.APPLICATION_JSON)
614614
@Path("/jwt-black-list")
615615
@Produces(MediaType.APPLICATION_JSON)
616-
public Result blackListJwt(@ApiParam(value = "jwt to be added to blacklist.", required = true) @RequestBody Jwt jwt)
616+
public Result blackListJwt(@ApiParam(value = "jwt to be added to blacklist.", required = true) Jwt jwt)
617617
{
618618
if(getAppSettings().isJwtBlacklistEnabled()){
619619

@@ -662,14 +662,14 @@ public Result blackListJwt(@ApiParam(value = "jwt to be added to blacklist.", re
662662
@Consumes(MediaType.APPLICATION_JSON)
663663
@Path("/jwt-black-list")
664664
@Produces(MediaType.APPLICATION_JSON)
665-
public Result whiteListJwt(@ApiParam(value = "Jwt to be removed from blacklist.", required = true) @QueryParam("jwt") String jwt)
665+
public Result whiteListJwt(@ApiParam(value = "Jwt to be removed from blacklist.", required = true) Jwt jwt)
666666
{
667667
if(getAppSettings().isJwtBlacklistEnabled()){
668668

669-
if(getDataStore().getBlackListedToken(jwt) == null){
669+
if(getDataStore().getBlackListedToken(jwt.getJwt()) == null){
670670
return new Result(false, "JWT does not exist in blacklist.");
671671

672-
}else if(getDataStore().whiteListToken(jwt)){
672+
}else if(getDataStore().whiteListToken(jwt.getJwt())){
673673
return new Result(true, "JWT successfully removed from blacklist.");
674674

675675
}else{
@@ -719,7 +719,7 @@ public Result clearJwtBlacklist()
719719
if(getAppSettings().isJwtBlacklistEnabled()) {
720720
getDataStore().whiteListAllTokens();
721721
if(getDataStore().getBlackListedTokens().isEmpty()){
722-
return new Result(true, "All blacklisted tokens are whitelisted successfully.");
722+
return new Result(true, "All blacklisted tokens are removed successfully.");
723723
}else{
724724
return new Result(false, "JWT blacklist clear failed.");
725725
}

src/main/java/io/antmedia/rest/model/Jwt.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package io.antmedia.rest.model;
22

3+
import dev.morphia.annotations.Entity;
4+
import io.swagger.annotations.ApiModel;
5+
import io.swagger.annotations.ApiModelProperty;
6+
7+
@ApiModel(value="jwt", description="The basic jwt class for jwt blacklist")
8+
@Entity(value = "jwt")
39
public class Jwt {
10+
@ApiModelProperty(value = "the jwt")
411
private String jwt;
512

613
// Default constructor

src/test/java/io/antmedia/test/rest/BroadcastRestServiceV2UnitTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3192,27 +3192,29 @@ public void testWhitelistJwt() {
31923192

31933193
restServiceSpy.setAppSettings(appSettings);
31943194
String jwtStr = "test-jwt";
3195+
Jwt jwt = new Jwt();
3196+
jwt.setJwt(jwtStr);
31953197

31963198
DataStore store = mock(MapDBStore.class);
31973199

31983200
restServiceSpy.setDataStore(store);
31993201

3200-
Result result1 = restServiceSpy.whiteListJwt(jwtStr);
3202+
Result result1 = restServiceSpy.whiteListJwt(jwt);
32013203
assertFalse(result1.isSuccess());
32023204

32033205
when(appSettings.isJwtBlacklistEnabled()).thenReturn(true);
32043206

32053207
when(store.getBlackListedToken(jwtStr)).thenReturn(null);
3206-
Result result2 = restServiceSpy.whiteListJwt(jwtStr);
3208+
Result result2 = restServiceSpy.whiteListJwt(jwt);
32073209
assertFalse(result2.isSuccess());
32083210

32093211
Token token = mock(Token.class);
32103212
when(store.getBlackListedToken(jwtStr)).thenReturn(token);
3211-
Result result3 = restServiceSpy.whiteListJwt(jwtStr);
3213+
Result result3 = restServiceSpy.whiteListJwt(jwt);
32123214
assertFalse(result3.isSuccess());
32133215

32143216
when(store.whiteListToken(jwtStr)).thenReturn(true);
3215-
Result result4 = restServiceSpy.whiteListJwt(jwtStr);
3217+
Result result4 = restServiceSpy.whiteListJwt(jwt);
32163218
assertTrue(result4.isSuccess());
32173219

32183220
}

0 commit comments

Comments
 (0)