package cc.blynk.server.application.handlers.main.logic.sharing; import cc.blynk.server.application.handlers.main.auth.AppStateHolder; import cc.blynk.server.application.handlers.sharing.auth.AppShareStateHolder; import cc.blynk.server.core.dao.SessionDao; import cc.blynk.server.core.dao.TokenManager; import cc.blynk.server.core.model.DashBoard; import cc.blynk.server.core.model.auth.Session; import cc.blynk.server.core.model.auth.User; import cc.blynk.server.core.protocol.exceptions.NotAllowedException; import cc.blynk.server.core.protocol.model.messages.StringMessage; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import static cc.blynk.server.core.protocol.enums.Command.REFRESH_SHARE_TOKEN; import static cc.blynk.server.core.protocol.enums.Response.NOT_ALLOWED; import static cc.blynk.utils.AppStateHolderUtil.getShareState; import static cc.blynk.utils.BlynkByteBufUtil.makeResponse; import static cc.blynk.utils.BlynkByteBufUtil.makeUTF8StringMessage; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 2/1/2015. * */ public class RefreshShareTokenLogic { private final TokenManager tokenManager; private final SessionDao sessionDao; public RefreshShareTokenLogic(TokenManager tokenManager, SessionDao sessionDao) { this.tokenManager = tokenManager; this.sessionDao = sessionDao; } public void messageReceived(ChannelHandlerContext ctx, AppStateHolder state, StringMessage message) { String dashBoardIdString = message.body; int dashId; try { dashId = Integer.parseInt(dashBoardIdString); } catch (NumberFormatException ex) { throw new NotAllowedException("Dash board id not valid. Id : " + dashBoardIdString); } final User user = state.user; DashBoard dash = user.profile.getDashByIdOrThrow(dashId); String token = tokenManager.refreshSharedToken(user, dash); Session session = sessionDao.userSession.get(state.userKey); for (Channel appChannel : session.appChannels) { AppShareStateHolder localState = getShareState(appChannel); if (localState != null && localState.dashId == dashId) { ChannelFuture cf = appChannel.writeAndFlush(makeResponse(message.id, NOT_ALLOWED)); cf.addListener(channelFuture -> appChannel.close()); } } ctx.writeAndFlush(makeUTF8StringMessage(REFRESH_SHARE_TOKEN, message.id, token), ctx.voidPromise()); } }