private void checkTokenOnOtherServer(ChannelHandlerContext ctx, String token, int msgId) { //check cache first LRUCache.CacheEntry cacheEntry = LRUCache.LOGIN_TOKENS_CACHE.get(token); if (cacheEntry == null) { try { blockingIOProcessor.executeDBGetServer(() -> { String server; log.debug("Checking invalid token in DB."); server = dbManager.getServerByToken(token); LRUCache.LOGIN_TOKENS_CACHE.put(token, new LRUCache.CacheEntry(server)); // no server found, that's means token is wrong. sendRedirectResponse(ctx, token, server, msgId); }); } catch (RejectedExecutionException ree) { log.warn("Error in getServerByToken handler. Limit of tasks reached."); ctx.writeAndFlush(serverError(msgId), ctx.voidPromise()); } } else { log.debug("Taking token from cache."); sendRedirectResponse(ctx, token, cacheEntry.value, msgId); } }
private void createSessionAndReregister(ChannelHandlerContext ctx, User user, DashBoard dash, Device device, int msgId) { HardwareStateHolder hardwareStateHolder = new HardwareStateHolder(user, dash, device); ChannelPipeline pipeline = ctx.pipeline(); pipeline.replace(this, "HHArdwareHandler", new HardwareHandler(holder, hardwareStateHolder)); Session session = holder.sessionDao.getOrCreateSessionByUser( hardwareStateHolder.userKey, ctx.channel().eventLoop()); if (session.isSameEventLoop(ctx)) { completeLogin(ctx.channel(), session, user, dash, device, msgId); } else { log.debug("Re registering hard channel. {}", ctx.channel()); ReregisterChannelUtil.reRegisterChannel(ctx, session, channelFuture -> completeLogin(channelFuture.channel(), session, user, dash, device, msgId)); } }
@Override protected void channelRead0(ChannelHandlerContext ctx, LoginMessage message) { String token = message.body.trim(); TokenValue tokenValue = holder.tokenManager.getTokenValueByToken(token); if (tokenValue == null) { //token should always be 32 chars and shouldn't contain invalid nil char if (token.length() != 32 || token.contains(StringUtils.BODY_SEPARATOR_STRING)) { log.debug("HardwareLogic token is invalid. Token '{}', '{}'", token, ctx.channel().remoteAddress()); ctx.writeAndFlush(invalidToken(message.id), ctx.voidPromise()); } else { //no user on current server, trying to find server that user belongs to. checkTokenOnOtherServer(ctx, token, message.id); } return; } User user = tokenValue.user; Device device = tokenValue.device; DashBoard dash = tokenValue.dash; if (tokenValue.isTemporary()) { holder.tokenManager.updateRegularCache(token, tokenValue); user.profile.addDevice(dash, device); user.lastModifiedTs = System.currentTimeMillis(); } createSessionAndReregister(ctx, user, dash, device, message.id); }
HardwareLoginHandler hardwareLoginHandler = new HardwareLoginHandler(holder, port); HardwareChannelStateHandler hardwareChannelStateHandler = new HardwareChannelStateHandler(holder); AlreadyLoggedHandler alreadyLoggedHandler = new AlreadyLoggedHandler();
var hardwareLoginHandler = new HardwareLoginHandler(holder, port);