package cc.blynk.server.core.dao; import cc.blynk.server.core.BlockingIOProcessor; import cc.blynk.server.core.model.DashBoard; import cc.blynk.server.core.model.auth.User; import cc.blynk.server.core.model.device.Device; import cc.blynk.server.redis.RedisClient; import cc.blynk.utils.TokenGeneratorUtil; import java.util.Collection; import java.util.concurrent.ConcurrentMap; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 14.10.16. */ public class TokenManager { private final RegularTokenManager regularTokenManager; private final SharedTokenManager sharedTokenManager; private final BlockingIOProcessor blockingIOProcessor; private final RedisClient redisClient; private final String currentIp; public TokenManager(ConcurrentMap<UserKey, User> users, BlockingIOProcessor blockingIOProcessor, RedisClient redisClient, String currentIp) { Collection<User> allUsers = users.values(); this.regularTokenManager = new RegularTokenManager(allUsers); this.sharedTokenManager = new SharedTokenManager(allUsers); this.blockingIOProcessor = blockingIOProcessor; this.redisClient = redisClient; this.currentIp = currentIp; } public void deleteDevice(Device device) { String token = regularTokenManager.deleteDeviceToken(device); if (token != null) { blockingIOProcessor.executeDB(() -> { redisClient.removeToken(token); }); } } public void deleteDash(DashBoard dash) { //todo clear shared token from redis? sharedTokenManager.deleteProject(dash); String[] removedTokens = regularTokenManager.deleteProject(dash); if (removedTokens.length > 0) { blockingIOProcessor.executeDB(() -> { redisClient.removeToken(removedTokens); }); } } public TokenValue getUserByToken(String token) { return regularTokenManager.getUserByToken(token); } public SharedTokenValue getUserBySharedToken(String token) { return sharedTokenManager.getUserByToken(token); } public void assignToken(User user, int dashId, int deviceId, String newToken) { String oldToken = regularTokenManager.assignToken(user, dashId, deviceId, newToken); blockingIOProcessor.executeDB(() -> { redisClient.assignServerToToken(newToken, currentIp); if (oldToken != null) { redisClient.removeToken(oldToken); } }); } public String refreshToken(User user, int dashId, int deviceId) { final String newToken = TokenGeneratorUtil.generateNewToken(); assignToken(user, dashId, deviceId, newToken); return newToken; } public String refreshSharedToken(User user, DashBoard dash) { final String newToken = TokenGeneratorUtil.generateNewToken(); sharedTokenManager.assignToken(user, dash, newToken); return newToken; } }