From 10f25161cc9dfd8b376a2a9bb0a328399a581d4a Mon Sep 17 00:00:00 2001 From: Dom Eori <4j6dq2zi8@relay.firefox.com> Date: Tue, 5 Oct 2021 13:51:34 +0900 Subject: [PATCH] [aimedb] add FeliCaLookup2 mode --- .../sega/aimedb/AimeDbRequestHandler.java | 7 +- .../sega/aimedb/AimeDbServerInitializer.java | 7 +- .../handler/impl/FeliCaLookup2Handler.java | 86 +++++++++++++++++++ 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/aimedb/handler/impl/FeliCaLookup2Handler.java diff --git a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbRequestHandler.java b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbRequestHandler.java index 0edef3ba..1f6cae42 100644 --- a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbRequestHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbRequestHandler.java @@ -24,6 +24,7 @@ public class AimeDbRequestHandler extends ChannelInboundHandlerAdapter { private final CampaignHandler campaignHandler; private final FeliCaLookupHandler feliCaLookupHandler; + private final FeliCaLookup2Handler feliCaLookup2Handler; private final GoodbyeHandler goodbyeHandler; private final HelloHandler helloHandler; private final LogHandler logHandler; @@ -32,9 +33,10 @@ public class AimeDbRequestHandler extends ChannelInboundHandlerAdapter { private final RegisterHandler registerHandler; @Autowired - public AimeDbRequestHandler(CampaignHandler campaignHandler, FeliCaLookupHandler feliCaLookupHandler, GoodbyeHandler goodbyeHandler, HelloHandler helloHandler, LogHandler logHandler, LookupHandler lookupHandler, Lookup2Handler lookup2Handler, RegisterHandler registerHandler) { + public AimeDbRequestHandler(CampaignHandler campaignHandler, FeliCaLookupHandler feliCaLookupHandler, FeliCaLookup2Handler feliCaLookup2Handler, GoodbyeHandler goodbyeHandler, HelloHandler helloHandler, LogHandler logHandler, LookupHandler lookupHandler, Lookup2Handler lookup2Handler, RegisterHandler registerHandler) { this.campaignHandler = campaignHandler; this.feliCaLookupHandler = feliCaLookupHandler; + this.feliCaLookup2Handler = feliCaLookup2Handler; this.goodbyeHandler = goodbyeHandler; this.helloHandler = helloHandler; this.logHandler = logHandler; @@ -71,6 +73,9 @@ public class AimeDbRequestHandler extends ChannelInboundHandlerAdapter { case 0x000f: lookup2Handler.handle(ctx, data); break; + case 0x0011: + feliCaLookup2Handler.handle(ctx, data); + break; case 0x0064: helloHandler.handle(ctx, data); break; diff --git a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbServerInitializer.java b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbServerInitializer.java index bc9f98b0..15d83401 100644 --- a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbServerInitializer.java +++ b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbServerInitializer.java @@ -18,6 +18,7 @@ public class AimeDbServerInitializer extends ChannelInitializer { private final CampaignHandler campaignHandler; private final FeliCaLookupHandler feliCaLookupHandler; + private final FeliCaLookup2Handler feliCaLookup2Handler; private final GoodbyeHandler goodbyeHandler; private final HelloHandler helloHandler; private final LogHandler logHandler; @@ -26,9 +27,9 @@ public class AimeDbServerInitializer extends ChannelInitializer { private final RegisterHandler registerHandler; @Autowired - public AimeDbServerInitializer(CampaignHandler campaignHandler, FeliCaLookupHandler feliCaLookupHandler, GoodbyeHandler goodbyeHandler, HelloHandler helloHandler, LogHandler logHandler, LookupHandler lookupHandler, Lookup2Handler lookup2Handler, RegisterHandler registerHandler) { + public AimeDbServerInitializer(CampaignHandler campaignHandler, FeliCaLookupHandler feliCaLookupHandler, FeliCaLookup2Handler feliCaLookup2Handler, GoodbyeHandler goodbyeHandler, HelloHandler helloHandler, LogHandler logHandler, LookupHandler lookupHandler, Lookup2Handler lookup2Handler, RegisterHandler registerHandler) { this.campaignHandler = campaignHandler; - + this.feliCaLookup2Handler = feliCaLookup2Handler; this.feliCaLookupHandler = feliCaLookupHandler; this.goodbyeHandler = goodbyeHandler; this.helloHandler = helloHandler; @@ -44,7 +45,7 @@ public class AimeDbServerInitializer extends ChannelInitializer { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("encoder", new AimeDbEncoder()); pipeline.addLast("decoder", new AimeDbDecoder()); - pipeline.addLast("handler", new AimeDbRequestHandler(campaignHandler, feliCaLookupHandler, goodbyeHandler, helloHandler, logHandler, lookupHandler, lookup2Handler, registerHandler)); + pipeline.addLast("handler", new AimeDbRequestHandler(campaignHandler, feliCaLookupHandler, feliCaLookup2Handler, goodbyeHandler, helloHandler, logHandler, lookupHandler, lookup2Handler, registerHandler)); } } diff --git a/src/main/java/icu/samnyan/aqua/sega/aimedb/handler/impl/FeliCaLookup2Handler.java b/src/main/java/icu/samnyan/aqua/sega/aimedb/handler/impl/FeliCaLookup2Handler.java new file mode 100644 index 00000000..ec350c64 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/aimedb/handler/impl/FeliCaLookup2Handler.java @@ -0,0 +1,86 @@ +/* +This function is based on minime, commit e90068f32510dc4e14eef62d099272ffb6ce8ec3 by xmc +and ported by skogaby. Thanks. +*/ +package icu.samnyan.aqua.sega.aimedb.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.aimedb.handler.BaseHandler; +import icu.samnyan.aqua.sega.aimedb.util.AimeDbUtil; +import icu.samnyan.aqua.sega.aimedb.util.LogMapper; +import icu.samnyan.aqua.sega.general.dao.CardRepository; +import icu.samnyan.aqua.sega.general.model.Card; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component +public class FeliCaLookup2Handler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(FeliCaLookup2Handler.class); + + private final LogMapper logMapper; + + private final CardRepository cardRepository; + + @Autowired + public FeliCaLookup2Handler(LogMapper logMapper, CardRepository cardRepository) { + this.logMapper = logMapper; + this.cardRepository = cardRepository; + } + + @Override + public void handle(ChannelHandlerContext ctx, ByteBuf msg) throws JsonProcessingException { + Map requestMap = AimeDbUtil.getBaseInfo(msg); + requestMap.put("type", "felica_lookup2"); + requestMap.put("idm", msg.slice(0x0030, 0x0038 - 0x0030)); + requestMap.put("pmm", msg.slice(0x0038, 0x0040 - 0x0038)); + + logger.info("Request: " + logMapper.write(requestMap)); + + // Get the decimal represent of the hex value, same from minime + StringBuilder accessCode = new StringBuilder( + String.valueOf(((ByteBuf) requestMap.get("idm")).getLong(0)).replaceAll("-","") // Prevent negative overflow + ); + while (accessCode.length() < 20) { + accessCode.insert(0, "0"); + } + + long aimeId = -1; + Optional card = cardRepository.findByLuid(accessCode.toString()); + if (card.isPresent()) { + aimeId = card.get().getExtId().longValue(); + } + + Map resultMap = new HashMap<>(); + resultMap.put("type", "felica_lookup2"); + resultMap.put("status", 1); + resultMap.put("accessCode", accessCode); + resultMap.put("aimeId", cardRepository.findByLuid(accessCode.toString())); + + logger.info("Response: " + logMapper.write(resultMap)); + + ByteBuf respSrc = Unpooled.copiedBuffer(new byte[0x0140]); + respSrc.setShortLE(0x0004, 0x0012); + respSrc.setShortLE(0x0008, (int) resultMap.get("status")); + respSrc.setLongLE(0x0020, aimeId); + respSrc.setIntLE(0x0024, 0xFFFFFFFF); + respSrc.setIntLE(0x0028, 0xFFFFFFFF); + respSrc.setBytes(0x002c, ByteBufUtil.decodeHexDump(accessCode)); + respSrc.setShortLE(0x0037, 0x0001); + + ctx.writeAndFlush(respSrc); + } +}