diff --git a/pom.xml b/pom.xml
index 22792a4..89ee7d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,13 +68,9 @@
provided
- org.springframework.integration
- spring-integration-ip
-
-
- org.springframework.integration
- spring-integration-core
- 6.0.0
+ org.reflections
+ reflections
+ 0.10.2
diff --git a/src/main/java/com/alterdekim/Server.java b/src/main/java/com/alterdekim/Server.java
deleted file mode 100644
index 11978ba..0000000
--- a/src/main/java/com/alterdekim/Server.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.alterdekim;
-
-
-import com.alterdekim.db.Database;
-import com.alterdekim.hearthhack.util.Util;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.net.ssl.*;
-import java.io.IOException;
-import java.util.LinkedList;
-
-@Slf4j
-public class Server implements Runnable {
-
- private SSLServerSocket serverSocket;
- private int portNumber;
- private Thread acceptThread;
-
- private LinkedList connections;
-
- private Database db;
-
- public Server(int port) {
- portNumber = port;
- connections = new LinkedList<>();
-
- db = new Database("localhost", 5984, "hs_lobby");
- try {
- //SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
-
- serverSocket = (SSLServerSocket) Util.getSocketFactory(
- "test.com.crt",
- "test.com.crt",
- "test.com.key",
- ""
- ).createServerSocket(portNumber,15);
-
-
- db.start();
-
- } catch (Exception e) {
- log.error("Init failed: " + e.getMessage());
- }
- }
-
- public void startListening() {
- acceptThread = new Thread(this);
- acceptThread.start();
- }
- public void stopListening() {
- for(Connection c:connections) {
- c.stopListeningAndDisconnect();
- }
-
- try {
- serverSocket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void run() {
- try {
- while(true) {
- SSLSocket s = (SSLSocket) serverSocket.accept();
- Connection c = new Connection(s, db);
- connections.add(c);
- log.info("New Connection Established From "+s.getInetAddress().toString());
- }
- } catch(java.net.SocketException e) {
- log.error("Listening thread terminated with exception: " + e.getMessage());
- } catch(IOException e) {
- log.error(e.getMessage());
- }
- }
-
- public void removeConnection(Connection c) {
- connections.remove(c);
- }
-
- public void printConnections() {
- log.info("Number of connections "+connections.toString());
-
- for(int i=0; i services;
+ private Map processors;
- @Getter
- private final Database db;
-
- public Connection(SSLSocket socket, Database db) {
+ public TcpConnection(SSLSocket socket) {
this.fromClient = socket;
- this.db = db;
this.init();
this.start();
}
@@ -42,7 +34,6 @@ public class Connection extends Thread {
}
public void send(BattleNetPacket bp) throws Exception {
- // log.info("Sending response: " + bp.getHeader().getServiceId() + " / " + bp.getHeader().getMethodId());
this.outToClient.write(bp.Encode());
this.outToClient.flush();
}
@@ -53,29 +44,31 @@ public class Connection extends Thread {
}
private void init() {
- this.services = new HashMap<>();
- this.services.put(0, new ConnectionService(""));
- this.services.put(1, new AuthService("bnet.protocol.authentication.AuthenticationClient")); // Compute32.Hash("bnet.protocol.authentication.AuthenticationServer")
- this.services.put(17, new AccountService("bnet.protocol.account.AccountNotify")); // Compute32.Hash("bnet.protocol.account.AccountService")
- this.services.put(4, new PresenceService("bnet.protocol.presence.PresenceService")); // Compute32.Hash("bnet.protocol.presence.PresenceService")
- this.services.put(6, new FriendsService("bnet.protocol.friends.FriendsNotify")); // Compute32.Hash("bnet.protocol.friends.FriendsService")
- this.services.put(7, new ChannelService("bnet.protocol.channel.Channel")); // Compute32.Hash("bnet.protocol.channel.Channel")
- this.services.put(16, new ResourcesService("bnet.protocol.resources.Resources"));
- this.services.put(9, new GameUtilitiesService("bnet.protocol.game_utilities.GameUtilities"));
+ this.processors = new HashMap<>();
+ Reflections reflections = new Reflections(this.getClass().getPackageName());
+ Set> classes = reflections.getSubTypesOf(Processor.class);
+ classes.forEach(c -> {
+ try {
+ var ci = c.getDeclaredConstructor().newInstance();
+ this.processors.put(ci.getProcessorId(), ci);
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ });
}
private void processPacket( BattleNetPacket packet ) {
try {
- Service is = this.services.get(Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId())));
+ Processor is = this.processors.get(Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId())));
if( is == null ) {
- log.error("Can't process weird ServiceId: " + Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId())));
+ log.error("Can't process weird ProcessorId: " + Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId())));
return;
}
log.info("Incoming: " + is.getClass().getSimpleName() + " / " + packet.getHeader().getMethodId() + " (Token: " + packet.getHeader().getToken() + ")");
is.process(packet, this);
} catch ( Exception e ) {
- e.printStackTrace();
+ log.error(e.getMessage());
}
}
@@ -102,16 +95,12 @@ public class Connection extends Thread {
}
baos.close();
} catch (Exception e) {
- e.printStackTrace();
+ log.error(e.getMessage());
break;
}
}
} catch ( Exception e ) {
- e.printStackTrace();
+ log.error(e.getMessage());
}
- /*
- br.close();
- fromClient.close();
- */
}
}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/TcpServer.java b/src/main/java/com/alterdekim/hearthhack/component/TcpServer.java
new file mode 100644
index 0000000..cfe7171
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/TcpServer.java
@@ -0,0 +1,62 @@
+package com.alterdekim.hearthhack.component;
+
+
+import com.alterdekim.hearthhack.util.Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLSocket;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
+@Slf4j
+@Component
+public class TcpServer {
+
+ private final int socketPort = 1119;
+
+ private SSLServerSocket serverSocket;
+ private List connections;
+
+ @Scheduled(fixedDelay = 5000)
+ private void start() {
+ try {
+ if( serverSocket != null && !serverSocket.isClosed() ) {
+ serverSocket.close();
+ serverSocket = null;
+ }
+ this.connections = new LinkedList<>();
+ this.serverSocket = (SSLServerSocket) Util.getSocketFactory(
+ "test.com.crt", // "test.com.crt"
+ "test.com.crt", // "test.com.crt"
+ "test.com.key", // "test.com.key"
+ ""
+ ).createServerSocket(this.socketPort, 15);
+
+ while(true) {
+ SSLSocket s = (SSLSocket) serverSocket.accept();
+ TcpConnection c = new TcpConnection(s);
+ connections.add(c);
+ log.info("New Connection Established From {}", s.getInetAddress().toString());
+ }
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ }
+ }
+
+ public void stopListening() {
+ connections.forEach(TcpConnection::stopListeningAndDisconnect);
+ try {
+ serverSocket.close();
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ }
+ }
+
+ public void removeConnection(TcpConnection c) {
+ connections.remove(c);
+ }
+}
diff --git a/src/main/java/com/alterdekim/services/AccountService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/AccountProcessor.java
similarity index 79%
rename from src/main/java/com/alterdekim/services/AccountService.java
rename to src/main/java/com/alterdekim/hearthhack/component/processor/AccountProcessor.java
index 7c16cc6..e0b6f0b 100644
--- a/src/main/java/com/alterdekim/services/AccountService.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/AccountProcessor.java
@@ -1,22 +1,24 @@
-package com.alterdekim.services;
+package com.alterdekim.hearthhack.component.processor;
+
-import com.alterdekim.Connection;
import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.Util;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class AccountService extends Service {
+@Slf4j
+public class AccountProcessor extends Processor {
- private static final Logger log = LoggerFactory.getLogger(AccountService.class);
-
- public AccountService(String export_name) {
- super(export_name);
+ public AccountProcessor() {
+ this.setProcessorId(17);
}
@Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
switch (packet.getHeader().getMethodId()) {
case 30:
// Protocol.GetAccountStateRequest getAccountStateRequest = Protocol.GetAccountStateRequest.parseFrom(packet.getBody());
@@ -57,8 +59,13 @@ public class AccountService extends Service {
conn.send(new BattleNetPacket(header1, Util.hexStringToByteArray("12331880B5B9F50E221F0A0D36322E3139372E3234332E383810CBA6011A0A4272617469736C617661280030003800409AE5A1B905")));
break;
default:
- log.error("Can't process weird AccountService method: " + packet.getHeader().getMethodId());
+ log.error("Can't process weird AccountProcessor method: " + packet.getHeader().getMethodId());
break;
}
}
+
+ @Override
+ public String getExportName() {
+ return "bnet.protocol.account.AccountNotify";
+ }
}
diff --git a/src/main/java/com/alterdekim/services/AuthService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java
similarity index 89%
rename from src/main/java/com/alterdekim/services/AuthService.java
rename to src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java
index 90c184f..05a1217 100644
--- a/src/main/java/com/alterdekim/services/AuthService.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/AuthProcessor.java
@@ -1,24 +1,25 @@
-package com.alterdekim.services;
+package com.alterdekim.hearthhack.component.processor;
+
-import com.alterdekim.Connection;
import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.Util;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
-public class AuthService extends Service {
+@Slf4j
+public class AuthProcessor extends Processor {
- private static final Logger log = LoggerFactory.getLogger(AuthService.class);
-
- public AuthService(String export_name) {
- super(export_name);
+ public AuthProcessor() {
+ this.setProcessorId(1);
}
-
- private void logonRequest( BattleNetPacket packet, Connection conn ) throws Exception {
+ private void logonRequest(BattleNetPacket packet, TcpConnection conn ) throws Exception {
// Protocol.LogonRequest lr = Protocol.LogonRequest.parseFrom(packet.getBody());
Protocol.Header h = Protocol.Header.newBuilder()
@@ -71,7 +72,7 @@ public class AuthService extends Service {
}
@Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
switch (packet.getHeader().getMethodId()) {
case 1:
logonRequest(packet, conn);
@@ -153,8 +154,13 @@ public class AuthService extends Service {
conn.send(new BattleNetPacket(h, logonResult.toByteArray()));
break;
default:
- log.error("Can't process weird AuthService method: " + packet.getHeader().getMethodId());
+ log.error("Can't process weird AuthProcessor method: " + packet.getHeader().getMethodId());
break;
}
}
+
+ @Override
+ public String getExportName() {
+ return "bnet.protocol.authentication.AuthenticationClient";
+ }
}
diff --git a/src/main/java/com/alterdekim/services/ChannelService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/ChannelProcessor.java
similarity index 60%
rename from src/main/java/com/alterdekim/services/ChannelService.java
rename to src/main/java/com/alterdekim/hearthhack/component/processor/ChannelProcessor.java
index d6db00c..cda1d80 100644
--- a/src/main/java/com/alterdekim/services/ChannelService.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/ChannelProcessor.java
@@ -1,21 +1,23 @@
-package com.alterdekim.services;
+package com.alterdekim.hearthhack.component.processor;
+
-import com.alterdekim.Connection;
import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class ChannelService extends Service {
+@Slf4j
+public class ChannelProcessor extends Processor {
- private static final Logger log = LoggerFactory.getLogger(ChannelService.class);
-
- public ChannelService(String export_name) {
- super(export_name);
+ public ChannelProcessor() {
+ this.setProcessorId(7);
}
@Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
switch (packet.getHeader().getMethodId()) {
case 1:
Protocol.CISubscribeRequest ciSubscribeRequest = Protocol.CISubscribeRequest.parseFrom(packet.getBody());
@@ -27,8 +29,13 @@ public class ChannelService extends Service {
conn.send(new BattleNetPacket(header, ciSubscribeResponse.toByteArray()));
break;
default:
- log.error("Can't process weird ChannelService method: " + packet.getHeader().getMethodId());
+ log.error("Can't process weird ChannelProcessor method: " + packet.getHeader().getMethodId());
break;
}
}
+
+ @Override
+ public String getExportName() {
+ return "bnet.protocol.channel.Channel";
+ }
}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/ConnectionProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/ConnectionProcessor.java
new file mode 100644
index 0000000..94d6b93
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/ConnectionProcessor.java
@@ -0,0 +1,72 @@
+package com.alterdekim.hearthhack.component.processor;
+
+
+import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.Util;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import java.util.List;
+import java.util.Set;
+
+@Slf4j
+public class ConnectionProcessor extends Processor {
+
+ public ConnectionProcessor() {
+ this.setProcessorId(0);
+ }
+
+ /*int GameUtilityProcessor = Compute32.Hash("bnet.protocol.game_utilities.GameUtilities");
+ int GameMasterProcessor = Compute32.Hash("bnet.protocol.game_master.GameMaster");
+ int NotificationProcessor = Compute32.Hash("bnet.protocol.notification.NotificationProcessor");
+
+ int ChannelOwnerProcessor = Compute32.Hash("bnet.protocol.channel.ChannelOwner");
+
+ int ChannelInvitationProcessor = Compute32.Hash("bnet.protocol.channel_invitation.ChannelInvitationProcessor");
+
+ int ChallengeProcessor = Compute32.Hash("bnet.protocol.challenge.ChallengeProcessor");
+ int ResourcesProcessor = Compute32.Hash("bnet.protocol.resources.Resources"); */
+
+ private void processConnect( BattleNetPacket packet, TcpConnection conn ) throws Exception {
+ Protocol.ConnectRequest cr = Protocol.ConnectRequest.parseFrom(packet.getBody());
+ Protocol.BindResponse.Builder b = Protocol.BindResponse.newBuilder();
+ List hashes = cr.getBindRequest().getImportedServiceHashList();
+ for( Integer hash : hashes ) {
+ b.addImportedServiceId(hash);
+ }
+ List bs = cr.getBindRequest().getExportedServiceList();
+ for( Protocol.BoundService s : bs ) {
+ Set ks = conn.getProcessors().keySet();
+ for( Integer c : ks ) {
+ Processor ss = conn.getProcessors().get(c);
+ if( ss != null && ss.getProcessorHash() == s.getHash() ) {
+ ss.setProcessorId(s.getId());
+ break;
+ }
+ }
+ }
+
+ conn._send(Util.hexStringToByteArray("000c08fe011800200028950130000a0c08f4c9ccf30d10c687bcb805120a0889ff5c1092e5a1b9051800220e0a0c0109080a04030507060211102a2e0a2c0d55450000157a72746d1a206ff4fdd5fa5f6d62a278a04403e075d69d734cd4880732dce8edc6a3f528089230a08a95f4cebdcc02422e0a2c0d55450000157a72746d1a20b4bd0f0096a7648de1d19042fb7a79b96c0df48eea3488f498b08ad3d38fb2cc"));
+ }
+
+ @Override
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
+ switch (packet.getHeader().getMethodId()) {
+ case 1:
+ processConnect(packet, conn);
+ break;
+ case 5:
+ // FUCK NODATA
+ break;
+ default:
+ log.error("Can't process weird ConnectionProcessor method: " + packet.getHeader().getMethodId());
+ break;
+ }
+ }
+
+ @Override
+ public String getExportName() {
+ return super.getExportName();
+ }
+}
diff --git a/src/main/java/com/alterdekim/services/FriendsService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/FriendsProcessor.java
similarity index 79%
rename from src/main/java/com/alterdekim/services/FriendsService.java
rename to src/main/java/com/alterdekim/hearthhack/component/processor/FriendsProcessor.java
index 5bf69fe..73fae88 100644
--- a/src/main/java/com/alterdekim/services/FriendsService.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/FriendsProcessor.java
@@ -1,21 +1,22 @@
-package com.alterdekim.services;
+package com.alterdekim.hearthhack.component.processor;
-import com.alterdekim.Connection;
import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class FriendsService extends Service {
+@Slf4j
+public class FriendsProcessor extends Processor {
- private static final Logger log = LoggerFactory.getLogger(FriendsService.class);
-
- public FriendsService(String export_name) {
- super(export_name);
+ public FriendsProcessor() {
+ this.setProcessorId(6);
}
@Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
switch (packet.getHeader().getMethodId()) {
case 1:
//Protocol.SubscribeToFriendsRequest subscribeToFriendsRequest = Protocol.SubscribeToFriendsRequest.parseFrom(packet.getBody());
@@ -35,6 +36,7 @@ public class FriendsService extends Service {
.build())
.build();
+
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(254)
.setStatus(0)
@@ -57,8 +59,13 @@ public class FriendsService extends Service {
}
break;
default:
- log.error("Can't process weird FriendsService method: " + packet.getHeader().getMethodId());
+ log.error("Can't process weird FriendsProcessor method: " + packet.getHeader().getMethodId());
break;
}
}
+
+ @Override
+ public String getExportName() {
+ return "bnet.protocol.friends.FriendsNotify";
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/alterdekim/services/GameUtilitiesService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
similarity index 99%
rename from src/main/java/com/alterdekim/services/GameUtilitiesService.java
rename to src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
index 63e172e..f48e6be 100644
--- a/src/main/java/com/alterdekim/services/GameUtilitiesService.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
@@ -1,21 +1,22 @@
-package com.alterdekim.services;
+package com.alterdekim.hearthhack.component.processor;
+
-import com.alterdekim.Connection;
import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.Util;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
-public class GameUtilitiesService extends Service {
- private static final Logger log = LoggerFactory.getLogger(GameUtilitiesService.class);
- public GameUtilitiesService(String export_name) {
- super(export_name);
+@Slf4j
+public class GameUtilitiesProcessor extends Processor {
+
+ public GameUtilitiesProcessor() {
+ this.setProcessorId(9);
}
@Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
switch (packet.getHeader().getMethodId()) {
case 1:
if( packet.getHeader().getToken() == 10 ) {
@@ -857,8 +858,13 @@ public class GameUtilitiesService extends Service {
}
break;
default:
- log.error("Can't process weird GameUtilitiesService method: " + packet.getHeader().getMethodId());
+ log.error("Can't process weird GameUtilitiesProcessor method: " + packet.getHeader().getMethodId());
break;
}
}
+
+ @Override
+ public String getExportName() {
+ return "bnet.protocol.game_utilities.GameUtilities";
+ }
}
diff --git a/src/main/java/com/alterdekim/services/PresenceService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java
similarity index 95%
rename from src/main/java/com/alterdekim/services/PresenceService.java
rename to src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java
index 4dfced7..dcefdc8 100644
--- a/src/main/java/com/alterdekim/services/PresenceService.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java
@@ -1,24 +1,26 @@
-package com.alterdekim.services;
+package com.alterdekim.hearthhack.component.processor;
+
-import com.alterdekim.Connection;
import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.Util;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
-public class PresenceService extends Service {
+@Slf4j
+public class PresenceProcessor extends Processor {
- private static final Logger log = LoggerFactory.getLogger(PresenceService.class);
-
- public PresenceService(String export_name) {
- super(export_name);
+ public PresenceProcessor() {
+ this.setProcessorId(4);
}
@Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
switch (packet.getHeader().getMethodId()) {
case 1:
Protocol.SubscribeRequest subscribeRequest = Protocol.SubscribeRequest.parseFrom(packet.getBody());
@@ -236,8 +238,13 @@ public class PresenceService extends Service {
}
break;
default:
- log.error("Can't process weird PresenceService method: " + packet.getHeader().getMethodId());
+ log.error("Can't process weird PresenceProcessor method: " + packet.getHeader().getMethodId());
break;
}
}
+
+ @Override
+ public String getExportName() {
+ return "bnet.protocol.presence.PresenceProcessor";
+ }
}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/Processor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/Processor.java
new file mode 100644
index 0000000..db1aa41
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/Processor.java
@@ -0,0 +1,52 @@
+package com.alterdekim.hearthhack.component.processor;
+
+import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.Compute32;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@NoArgsConstructor
+public abstract class Processor {
+
+ @Setter
+ private int processorId;
+
+ public int getProcessorHash() { return Compute32.Hash(getExportName()); }
+
+ public String getExportName() {
+ return "";
+ }
+
+ public abstract void process(BattleNetPacket packet, TcpConnection conn) throws Exception;
+
+ public static Protocol.Header generateResponse(int size, int token) {
+ return Protocol.Header.newBuilder()
+ .setServiceId(254)
+ .setSize(size)
+ .setToken(token)
+ .build();
+ }
+
+ public static Protocol.Header generateResponse(int size, int token, int status, int object_id) {
+ return Protocol.Header.newBuilder()
+ .setServiceId(254)
+ .setSize(size)
+ .setStatus(status)
+ .setToken(token)
+ .setObjectId(object_id)
+ .build();
+ }
+
+ public static Protocol.Header generateResponse(int size, int token, int object_id) {
+ return Protocol.Header.newBuilder()
+ .setServiceId(254)
+ .setSize(size)
+ .setToken(token)
+ .setObjectId(object_id)
+ .build();
+ }
+}
diff --git a/src/main/java/com/alterdekim/services/ResourcesService.java b/src/main/java/com/alterdekim/hearthhack/component/processor/ResourcesProcessor.java
similarity index 68%
rename from src/main/java/com/alterdekim/services/ResourcesService.java
rename to src/main/java/com/alterdekim/hearthhack/component/processor/ResourcesProcessor.java
index 9c93ef1..cac0886 100644
--- a/src/main/java/com/alterdekim/services/ResourcesService.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/ResourcesProcessor.java
@@ -1,23 +1,22 @@
-package com.alterdekim.services;
+package com.alterdekim.hearthhack.component.processor;
+
-import com.alterdekim.Connection;
import com.alterdekim.Protocol;
+import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.Util;
import com.google.protobuf.ByteString;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
-public class ResourcesService extends Service {
+@Slf4j
+public class ResourcesProcessor extends Processor {
- private static final Logger log = LoggerFactory.getLogger(ResourcesService.class);
-
- public ResourcesService(String export_name) {
- super(export_name);
+ public ResourcesProcessor() {
+ this.setProcessorId(16);
}
@Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
+ public void process(BattleNetPacket packet, TcpConnection conn) throws Exception {
switch (packet.getHeader().getMethodId()) {
case 1:
// Protocol.ContentHandleRequest contentHandleRequest = Protocol.ContentHandleRequest.parseFrom(packet.getBody());
@@ -37,8 +36,13 @@ public class ResourcesService extends Service {
conn.send(new BattleNetPacket(header, contentHandle.toByteArray()));
break;
default:
- log.error("Can't process weird ResourcesService method: " + packet.getHeader().getMethodId());
+ log.error("Can't process weird ResourcesProcessor method: " + packet.getHeader().getMethodId());
break;
}
}
+
+ @Override
+ public String getExportName() {
+ return "bnet.protocol.resources.Resources";
+ }
}
diff --git a/src/main/java/com/alterdekim/hearthhack/config/TcpServerSocketConfiguration.java b/src/main/java/com/alterdekim/hearthhack/config/TcpServerSocketConfiguration.java
deleted file mode 100644
index 94449ec..0000000
--- a/src/main/java/com/alterdekim/hearthhack/config/TcpServerSocketConfiguration.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.alterdekim.hearthhack.config;
-
-import com.alterdekim.hearthhack.handler.BattleNetSocketHandler;
-import com.alterdekim.hearthhack.parser.BattleNetSerializerDeserializer;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.integration.config.EnableIntegration;
-import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.ip.dsl.Tcp;
-import org.springframework.integration.ip.dsl.TcpInboundGatewaySpec;
-import org.springframework.integration.ip.dsl.TcpServerConnectionFactorySpec;
-
-@Slf4j
-@Configuration
-@EnableIntegration
-public class TcpServerSocketConfiguration {
-
- private final int socketPort = 1119;
-
- @Bean
- public IntegrationFlow server(BattleNetSocketHandler serverSocketHandler) {
- TcpServerConnectionFactorySpec connectionFactory =
- Tcp.netServer(socketPort)
- .deserializer(new BattleNetSerializerDeserializer())
- .serializer(new BattleNetSerializerDeserializer())
- .soTcpNoDelay(true);
-
- TcpInboundGatewaySpec inboundGateway =
- Tcp.inboundGateway(connectionFactory);
-
- return IntegrationFlow
- .from(inboundGateway)
- .handle(serverSocketHandler::handleMessage)
- .get();
- }
-
- @Bean
- public BattleNetSocketHandler serverSocketHandler() {
- return new BattleNetSocketHandler();
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java b/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java
index 4862e2d..436abce 100644
--- a/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java
+++ b/src/main/java/com/alterdekim/hearthhack/handler/BattleNetSocketHandler.java
@@ -1,14 +1,10 @@
package com.alterdekim.hearthhack.handler;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.messaging.Message;
-import org.springframework.messaging.MessageHeaders;
@Slf4j
public class BattleNetSocketHandler {
- public String handleMessage(Message> message, MessageHeaders messageHeaders) {
- log.info(message.getPayload() + "");
- // TODO implement something useful to process the incoming message here...
- return message.getPayload().toString();
+ public String handleMessage() {
+ return "";
}
}
diff --git a/src/main/java/com/alterdekim/services/ConnectionService.java b/src/main/java/com/alterdekim/services/ConnectionService.java
deleted file mode 100644
index d3800c5..0000000
--- a/src/main/java/com/alterdekim/services/ConnectionService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.alterdekim.services;
-
-import com.alterdekim.Connection;
-import com.alterdekim.Protocol;
-import com.alterdekim.hearthhack.util.BattleNetPacket;
-import com.alterdekim.hearthhack.util.Util;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.util.List;
-import java.util.Set;
-
-public class ConnectionService extends Service {
-
- private static final Logger log = LoggerFactory.getLogger(ConnectionService.class);
-
- public ConnectionService(String export_name) {
- super(export_name);
- }
-
- /*int GameUtilityService = Compute32.Hash("bnet.protocol.game_utilities.GameUtilities");
- int GameMasterService = Compute32.Hash("bnet.protocol.game_master.GameMaster");
- int NotificationService = Compute32.Hash("bnet.protocol.notification.NotificationService");
-
- int ChannelOwnerService = Compute32.Hash("bnet.protocol.channel.ChannelOwner");
-
- int ChannelInvitationService = Compute32.Hash("bnet.protocol.channel_invitation.ChannelInvitationService");
-
- int ChallengeService = Compute32.Hash("bnet.protocol.challenge.ChallengeService");
- int ResourcesService = Compute32.Hash("bnet.protocol.resources.Resources"); */
-
- private void processConnect( BattleNetPacket packet, Connection conn ) throws Exception {
- Protocol.ConnectRequest cr = Protocol.ConnectRequest.parseFrom(packet.getBody());
- Protocol.BindResponse.Builder b = Protocol.BindResponse.newBuilder();
- List hashes = cr.getBindRequest().getImportedServiceHashList();
- for( Integer hash : hashes ) {
- b.addImportedServiceId(hash);
- }
- List bs = cr.getBindRequest().getExportedServiceList();
- for( Protocol.BoundService s : bs ) {
- Set ks = conn.getServices().keySet();
- for( Integer c : ks ) {
- Service ss = conn.getServices().get(c);
- if( ss != null && ss.getSERVICE_HASH() == s.getHash() ) {
- ss.setSERVICE_ID(s.getId());
- break;
- }
- }
- }
-
- conn._send(Util.hexStringToByteArray("000c08fe011800200028950130000a0c08f4c9ccf30d10c687bcb805120a0889ff5c1092e5a1b9051800220e0a0c0109080a04030507060211102a2e0a2c0d55450000157a72746d1a206ff4fdd5fa5f6d62a278a04403e075d69d734cd4880732dce8edc6a3f528089230a08a95f4cebdcc02422e0a2c0d55450000157a72746d1a20b4bd0f0096a7648de1d19042fb7a79b96c0df48eea3488f498b08ad3d38fb2cc"));
- }
-
- @Override
- public void process(BattleNetPacket packet, Connection conn) throws Exception {
- switch (packet.getHeader().getMethodId()) {
- case 1:
- processConnect(packet, conn);
- break;
- case 5:
- // FUCK NODATA
- break;
- default:
- log.error("Can't process weird ConnectionService method: " + packet.getHeader().getMethodId());
- break;
- }
- }
-}
diff --git a/src/main/java/com/alterdekim/services/Service.java b/src/main/java/com/alterdekim/services/Service.java
deleted file mode 100644
index 558e555..0000000
--- a/src/main/java/com/alterdekim/services/Service.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.alterdekim.services;
-
-import com.alterdekim.Connection;
-import com.alterdekim.hearthhack.util.BattleNetPacket;
-import com.alterdekim.hearthhack.util.Compute32;
-
-public abstract class Service {
-
- private final int SERVICE_HASH;
- private int SERVICE_ID;
-
- public Service( String export_name ) {
- this.SERVICE_HASH = Compute32.Hash(export_name);
- }
-
- public int getSERVICEID() {
- return this.SERVICE_ID;
- }
-
- public void setSERVICE_ID(int SERVICE_ID) {
- this.SERVICE_ID = SERVICE_ID;
- }
-
- public int getSERVICE_HASH() {
- return SERVICE_HASH;
- }
-
- public abstract void process(BattleNetPacket packet, Connection conn) throws Exception;
-}