From f33d4fbc1c45df14fb209773d9f232cb9e973073 Mon Sep 17 00:00:00 2001 From: P0nk Date: Fri, 27 Sep 2024 06:50:07 +0200 Subject: [PATCH] Save pin to PG --- src/main/java/client/Client.java | 8 ----- .../database/account/AccountRepository.java | 13 +++++++ src/main/java/net/PacketProcessor.java | 2 +- .../handlers/login/RegisterPinHandler.java | 34 ++++++++++++------- src/main/java/service/AccountService.java | 28 +++++++++++++++ 5 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/main/java/client/Client.java b/src/main/java/client/Client.java index d557c0a5aa..e587168f9b 100644 --- a/src/main/java/client/Client.java +++ b/src/main/java/client/Client.java @@ -446,14 +446,6 @@ public class Client extends ChannelInboundHandlerAdapter { public void setPin(String pin) { this.pin = pin; - try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("UPDATE accounts SET pin = ? WHERE id = ?")) { - ps.setString(1, pin); - ps.setInt(2, accId); - ps.executeUpdate(); - } catch (SQLException e) { - e.printStackTrace(); - } } public String getPin() { diff --git a/src/main/java/database/account/AccountRepository.java b/src/main/java/database/account/AccountRepository.java index d651bf8321..c5fb91efa5 100644 --- a/src/main/java/database/account/AccountRepository.java +++ b/src/main/java/database/account/AccountRepository.java @@ -55,4 +55,17 @@ public class AccountRepository { .execute(); } } + + public boolean setPin(int accountId, String pin) { + String sql = """ + UPDATE account + SET pin = :pin + WHERE id = :id"""; + try (Handle handle = connection.getHandle()) { + return handle.createUpdate(sql) + .bind("id", accountId) + .bind("pin", pin) + .execute() > 0; + } + } } diff --git a/src/main/java/net/PacketProcessor.java b/src/main/java/net/PacketProcessor.java index fe7120aaf6..91c99397e4 100644 --- a/src/main/java/net/PacketProcessor.java +++ b/src/main/java/net/PacketProcessor.java @@ -291,7 +291,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.DELETE_CHAR, new DeleteCharHandler()); registerHandler(RecvOpcode.VIEW_ALL_CHAR, new ViewAllCharHandler()); registerHandler(RecvOpcode.PICK_ALL_CHAR, new ViewAllCharSelectedHandler()); - registerHandler(RecvOpcode.REGISTER_PIN, new RegisterPinHandler()); + registerHandler(RecvOpcode.REGISTER_PIN, new RegisterPinHandler(channelDeps.accountService())); registerHandler(RecvOpcode.GUEST_LOGIN, new GuestLoginHandler()); registerHandler(RecvOpcode.REGISTER_PIC, new RegisterPicHandler()); registerHandler(RecvOpcode.CHAR_SELECT_WITH_PIC, new CharSelectedWithPicHandler()); diff --git a/src/main/java/net/server/handlers/login/RegisterPinHandler.java b/src/main/java/net/server/handlers/login/RegisterPinHandler.java index e934f98ff0..2d7ad6856b 100644 --- a/src/main/java/net/server/handlers/login/RegisterPinHandler.java +++ b/src/main/java/net/server/handlers/login/RegisterPinHandler.java @@ -25,27 +25,35 @@ import client.Client; import net.AbstractPacketHandler; import net.packet.InPacket; import net.server.coordinator.session.SessionCoordinator; +import service.AccountService; import tools.PacketCreator; -/* +/** * @author Rob + * @author Ponk */ public final class RegisterPinHandler extends AbstractPacketHandler { + private final AccountService accountService; + + public RegisterPinHandler(final AccountService accountService) { + this.accountService = accountService; + } + @Override - public final void handlePacket(InPacket p, Client c) { - byte c2 = p.readByte(); - if (c2 == 0) { + public void handlePacket(InPacket p, Client c) { + boolean cancel = p.readByte() == 0; + if (cancel) { SessionCoordinator.getInstance().closeSession(c, false); c.updateLoginState(Client.LOGIN_NOTLOGGEDIN); - } else { - String pin = p.readString(); - if (pin != null) { - c.setPin(pin); - c.sendPacket(PacketCreator.pinRegistered()); - - SessionCoordinator.getInstance().closeSession(c, false); - c.updateLoginState(Client.LOGIN_NOTLOGGEDIN); - } + return; } + + String pin = p.readString(); + accountService.setPin(c.getAccID(), pin); + c.setPin(pin); + c.sendPacket(PacketCreator.pinRegistered()); + + SessionCoordinator.getInstance().closeSession(c, false); + c.updateLoginState(Client.LOGIN_NOTLOGGEDIN); } } diff --git a/src/main/java/service/AccountService.java b/src/main/java/service/AccountService.java index 0b50f92108..a41c91b8f1 100644 --- a/src/main/java/service/AccountService.java +++ b/src/main/java/service/AccountService.java @@ -97,4 +97,32 @@ public class AccountService { accountRepository.setTos(accountId, true); return true; } + + public void setPin(int accountId, String pin) { + setPinMysql(accountId, pin); + setPinPostgres(accountId, pin); + } + + private void setPinMysql(int accountId, String pin) { + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("UPDATE accounts SET pin = ? WHERE id = ?")) { + ps.setString(1, pin); + ps.setInt(2, accountId); + ps.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void setPinPostgres(int accountId, String pin) { + boolean success = false; + try { + success = accountRepository.setPin(accountId, pin); + } catch (Exception e) { + log.error("Failed to set pin due to error - account:{}, pin:{}", accountId, pin, e); + } + if (!success) { + log.warn("Failed to set pin due to no updated rows - account:{}, pin:{}", accountId, pin); + } + } }