|
9 | 9 | import java.util.Map; |
10 | 10 | import java.util.Map.Entry; |
11 | 11 | import java.util.Set; |
| 12 | +import java.util.concurrent.atomic.AtomicInteger; |
12 | 13 | import java.util.regex.Pattern; |
13 | 14 |
|
| 15 | +import io.antmedia.rest.model.Result; |
| 16 | +import io.antmedia.security.ITokenService; |
14 | 17 | import org.apache.commons.io.FilenameUtils; |
15 | 18 | import org.apache.commons.lang3.RandomStringUtils; |
16 | 19 | import org.apache.commons.lang3.exception.ExceptionUtils; |
@@ -41,6 +44,8 @@ public abstract class MapBasedDataStore extends DataStore { |
41 | 44 | protected Map<String, String> vodMap; |
42 | 45 | protected Map<String, String> detectionMap; |
43 | 46 | protected Map<String, String> tokenMap; |
| 47 | + protected Map<String, String> tokenBlacklistMap; |
| 48 | + |
44 | 49 | protected Map<String, String> subscriberMap; |
45 | 50 | protected Map<String, String> conferenceRoomMap; |
46 | 51 | protected Map<String, String> webRTCViewerMap; |
@@ -943,6 +948,65 @@ public boolean deleteToken(String tokenId) { |
943 | 948 | return result; |
944 | 949 | } |
945 | 950 |
|
| 951 | + @Override |
| 952 | + public boolean deleteTokenFromBlacklist(String tokenId) { |
| 953 | + boolean result; |
| 954 | + |
| 955 | + synchronized (this) { |
| 956 | + result = tokenBlacklistMap.remove(tokenId) != null; |
| 957 | + } |
| 958 | + return result; |
| 959 | + } |
| 960 | + |
| 961 | + @Override |
| 962 | + public ArrayList<String> getJwtBlacklist(){ |
| 963 | + |
| 964 | + synchronized (this){ |
| 965 | + return new ArrayList<>(tokenBlacklistMap.keySet()); |
| 966 | + |
| 967 | + } |
| 968 | + |
| 969 | + } |
| 970 | + |
| 971 | + @Override |
| 972 | + public Result deleteAllExpiredJwtFromBlacklist(ITokenService tokenService){ |
| 973 | + logger.info("Deleting all expired JWTs from black list."); |
| 974 | + AtomicInteger deletedTokenCount = new AtomicInteger(); |
| 975 | + |
| 976 | + synchronized (this){ |
| 977 | + tokenBlacklistMap.forEach((key, value) -> { |
| 978 | + Token token = gson.fromJson(value,Token.class); |
| 979 | + String tokenId = token.getTokenId(); |
| 980 | + if(!tokenService.verifyJwt(tokenId,token.getStreamId(),token.getType())){ |
| 981 | + if(deleteTokenFromBlacklist(tokenId)){ |
| 982 | + deletedTokenCount.getAndIncrement(); |
| 983 | + }else{ |
| 984 | + logger.warn("Couldn't delete JWT:" + tokenId); |
| 985 | + } |
| 986 | + } |
| 987 | + }); |
| 988 | + } |
| 989 | + |
| 990 | + if(deletedTokenCount.get() > 0){ |
| 991 | + final String successMsg = deletedTokenCount+" JWT deleted successfully from black list."; |
| 992 | + logger.info(successMsg); |
| 993 | + return new Result(true, successMsg); |
| 994 | + }else{ |
| 995 | + final String failMsg = "No JWT deleted from black list."; |
| 996 | + logger.warn(failMsg); |
| 997 | + return new Result(false, failMsg); |
| 998 | + |
| 999 | + } |
| 1000 | + |
| 1001 | + } |
| 1002 | + |
| 1003 | + @Override |
| 1004 | + public void clearJwtBlacklist(){ |
| 1005 | + synchronized (this) { |
| 1006 | + tokenBlacklistMap.clear(); |
| 1007 | + } |
| 1008 | + } |
| 1009 | + |
946 | 1010 | @Override |
947 | 1011 | public Token getToken(String tokenId) { |
948 | 1012 | return super.getToken(tokenMap, tokenId, gson); |
@@ -1055,4 +1119,30 @@ public Broadcast getBroadcastFromMap(String streamId) |
1055 | 1119 | return null; |
1056 | 1120 | } |
1057 | 1121 |
|
| 1122 | + @Override |
| 1123 | + public boolean addTokenToBlacklist(Token token) { |
| 1124 | + boolean result = false; |
| 1125 | + |
| 1126 | + synchronized (this) { |
| 1127 | + |
| 1128 | + if (token.getStreamId() != null && token.getTokenId() != null) { |
| 1129 | + |
| 1130 | + try { |
| 1131 | + tokenBlacklistMap.put(token.getTokenId(), gson.toJson(token)); |
| 1132 | + result = true; |
| 1133 | + } catch (Exception e) { |
| 1134 | + logger.error(ExceptionUtils.getStackTrace(e)); |
| 1135 | + } |
| 1136 | + } |
| 1137 | + } |
| 1138 | + return result; |
| 1139 | + |
| 1140 | + } |
| 1141 | + |
| 1142 | + @Override |
| 1143 | + public Token getTokenFromBlacklist(String tokenId) { |
| 1144 | + return super.getToken(tokenBlacklistMap, tokenId, gson); |
| 1145 | + |
| 1146 | + } |
| 1147 | + |
1058 | 1148 | } |
0 commit comments