package cc.blynk.server.application.handlers.main.logic;
import cc.blynk.server.Holder;
import cc.blynk.server.core.BlockingIOProcessor;
import cc.blynk.server.core.dao.TokenManager;
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.core.protocol.model.messages.StringMessage;
import cc.blynk.server.db.DBManager;
import cc.blynk.server.db.model.FlashedToken;
import cc.blynk.utils.ParseUtil;
import io.netty.channel.ChannelHandlerContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static cc.blynk.server.core.protocol.enums.Response.NOT_ALLOWED;
import static cc.blynk.utils.BlynkByteBufUtil.makeResponse;
import static cc.blynk.utils.BlynkByteBufUtil.ok;
import static cc.blynk.utils.StringUtils.split2;
/**
* Assigns static generated token to assigned device.
*
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 2/1/2015.
*
*/
public class AssignTokenLogic {
private static final Logger log = LogManager.getLogger(AssignTokenLogic.class);
private final TokenManager tokenManager;
private final BlockingIOProcessor blockingIOProcessor;
private final DBManager dbManager;
public AssignTokenLogic(Holder holder) {
this.tokenManager = holder.tokenManager;
this.blockingIOProcessor = holder.blockingIOProcessor;
this.dbManager = holder.dbManager;
}
public void messageReceived(ChannelHandlerContext ctx, User user, StringMessage message) {
String[] split = split2(message.body);
int dashId = ParseUtil.parseInt(split[0]);
String token = split[1];
DashBoard dash = user.profile.getDashByIdOrThrow(dashId);
blockingIOProcessor.executeDB(() -> {
FlashedToken dbFlashedToken = dbManager.selectFlashedToken(token);
if (dbFlashedToken == null) {
log.error("{} token not exists for app {}.", token, user.appName);
ctx.writeAndFlush(makeResponse(message.id, NOT_ALLOWED), ctx.voidPromise());
return;
}
if (dbFlashedToken.isActivated) {
log.error("{} token is already activated for app {}.", token, user.appName);
ctx.writeAndFlush(makeResponse(message.id, NOT_ALLOWED), ctx.voidPromise());
return;
}
Device device = dash.getDeviceById(dbFlashedToken.deviceId);
if (device == null) {
log.error("Device with {} id not exists in dashboards.", dbFlashedToken.deviceId);
ctx.writeAndFlush(makeResponse(message.id, NOT_ALLOWED), ctx.voidPromise());
return;
}
if (!dbManager.activateFlashedToken(token)) {
log.error("Error activated flashed token {}", token);
ctx.writeAndFlush(makeResponse(message.id, NOT_ALLOWED), ctx.voidPromise());
return;
}
tokenManager.assignToken(user, dashId, device.id, token);
ctx.writeAndFlush(ok(message.id), ctx.voidPromise());
});
}
}