From 9d54a75104528736142950fb447ce99716005c19 Mon Sep 17 00:00:00 2001 From: RoyceDa Date: Thu, 19 Feb 2026 23:54:43 +0200 Subject: [PATCH 1/5] test --- .gitea/workflows/build.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index b30eede..9d656e0 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -7,7 +7,10 @@ on: jobs: build: - runs-on: [linux, ubuntu, macos] + runs-on: + - linux + - ubuntu + - macos steps: - name: Checkout code uses: actions/checkout@v6 From 3c9be407de63e02ae0290b82b85dc739e9d55687 Mon Sep 17 00:00:00 2001 From: Royce59 Date: Fri, 20 Feb 2026 23:40:11 +0200 Subject: [PATCH 2/5] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=81=20=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D1=8B=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=BE=D0=BC=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/im/rosetta/database/entity/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/im/rosetta/database/entity/User.java b/src/main/java/im/rosetta/database/entity/User.java index 3e77f3c..aea18a2 100644 --- a/src/main/java/im/rosetta/database/entity/User.java +++ b/src/main/java/im/rosetta/database/entity/User.java @@ -41,7 +41,7 @@ public class User extends CreateUpdateEntity { private String publicKey; @Convert(converter = StringListConverter.class) - @Column(name = "notificationsTokens", nullable = false) + @Column(name = "notificationsTokens", nullable = false, columnDefinition = "TEXT") private List notificationsTokens = new ArrayList<>(); From 38c8e07ef7d0e018d54aab61fcd4ffb9194a1d1e Mon Sep 17 00:00:00 2001 From: Royce59 Date: Sat, 21 Feb 2026 00:02:51 +0200 Subject: [PATCH 3/5] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20IP=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=B0=20?= =?UTF-8?q?=D0=B7=D0=B0=20nginx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/orprotocol/Server.java | 12 ++++++++++- .../java/io/orprotocol/client/Client.java | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/orprotocol/Server.java b/src/main/java/io/orprotocol/Server.java index 658e523..3ac0588 100644 --- a/src/main/java/io/orprotocol/Server.java +++ b/src/main/java/io/orprotocol/Server.java @@ -155,13 +155,23 @@ public class Server extends WebSocketServer { } @Override - public void onOpen(WebSocket socket, ClientHandshake arg1) { + public void onOpen(WebSocket socket, ClientHandshake handshake) { /** * Создаем нового клиента при открытии соединения. * Передаем интервал heartbeat из настроек сервера. * Если клиент не отправляет heartbeat в указанный интервал, его можно отключить. */ Client client = new Client(socket, this.settings.heartbeatInterval, this); + String ipAddress = handshake.getFieldValue("X-Forwarded-For"); + if (ipAddress == null || ipAddress.isEmpty()) { + ipAddress = socket.getRemoteSocketAddress().getAddress().getHostAddress(); + } else { + /** + * Берем первый IP адрес из списка разделенного запятой + */ + ipAddress = ipAddress.split(",")[0].trim(); + } + client.setIpAddress(ipAddress); socket.setAttachment(client); if(this.listener == null){ return; diff --git a/src/main/java/io/orprotocol/client/Client.java b/src/main/java/io/orprotocol/client/Client.java index e42cb45..2879b38 100644 --- a/src/main/java/io/orprotocol/client/Client.java +++ b/src/main/java/io/orprotocol/client/Client.java @@ -29,6 +29,10 @@ public class Client { * Интервал отправки heartbeat пакетов в миллисекундах. */ public long heartbeatInterval = 0; + /** + * IP-адрес клиента + */ + private String ipAddress; /** * Время последнего полученного heartbeat в миллисекундах. */ @@ -71,6 +75,22 @@ public class Client { this.lastHeartbeatTime = System.currentTimeMillis(); } + /** + * Получает IP адрес клиента + * @return адрес + */ + public String getIpAddress() { + return this.ipAddress; + } + + /** + * Устанавливает IP адрес клиента + * @param ipAddress адрес + */ + public void setIpAddress(String ipAddress){ + this.ipAddress = ipAddress; + } + /** * Получает уникальный идентификатор клиента. * @return Идентификатор клиента. From ae435c848610da13f7bc664fe67c83f8ab842335 Mon Sep 17 00:00:00 2001 From: Royce59 Date: Sat, 21 Feb 2026 15:19:50 +0200 Subject: [PATCH 4/5] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B4=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=D0=BD=D1=8B=D1=85=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/im/rosetta/Boot.java | 2 +- .../executors/Executor24DeviceResolve.java | 33 ++++++++++++++----- .../service/services/BufferService.java | 11 +++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/main/java/im/rosetta/Boot.java b/src/main/java/im/rosetta/Boot.java index 06ecd29..4cbdfcc 100644 --- a/src/main/java/im/rosetta/Boot.java +++ b/src/main/java/im/rosetta/Boot.java @@ -203,7 +203,7 @@ public class Boot { this.packetManager.registerExecutor(20, new Executor20GroupJoin()); this.packetManager.registerExecutor(21, new Executor21GroupLeave()); this.packetManager.registerExecutor(22, new Executor22GroupBan()); - this.packetManager.registerExecutor(24, new Executor24DeviceResolve(this.clientManager, this.eventManager)); + this.packetManager.registerExecutor(24, new Executor24DeviceResolve(this.clientManager, this.eventManager, this.packetManager)); this.packetManager.registerExecutor(25, new Executor25Sync(this.packetManager)); } diff --git a/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java b/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java index 3554ba4..4dfa263 100644 --- a/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java +++ b/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java @@ -6,7 +6,9 @@ import im.rosetta.Failures; import im.rosetta.client.ClientManager; import im.rosetta.client.tags.ECIAuthentificate; import im.rosetta.client.tags.ECIDevice; +import im.rosetta.database.entity.Buffer; import im.rosetta.database.entity.Device; +import im.rosetta.database.repository.BufferRepository; import im.rosetta.database.repository.DeviceRepository; import im.rosetta.event.EventManager; import im.rosetta.event.events.handshake.HandshakeCompletedEvent; @@ -15,10 +17,11 @@ import im.rosetta.packet.Packet24DeviceResolve; import im.rosetta.packet.runtime.DeviceSolution; import im.rosetta.packet.runtime.HandshakeStage; import im.rosetta.service.dispatch.DeviceDispatcher; - +import im.rosetta.service.services.BufferService; import io.orprotocol.ProtocolException; import io.orprotocol.client.Client; import io.orprotocol.packet.PacketExecutor; +import io.orprotocol.packet.PacketManager; public class Executor24DeviceResolve extends PacketExecutor { @@ -26,11 +29,14 @@ public class Executor24DeviceResolve extends PacketExecutor { */ public void deletePacketsFromBuffer(String to, Packet packet, long fromTimestampMs) { int packetId = this.packetManager.getPacketIdByClass(packet.getClass()); + this.deletePacketsFromBuffer(to, packetId, fromTimestampMs); + } + + /** + * Удаляет из буфера все пакеты для определенного клиента с публичным ключом to, которые были добавлены + * в буфер после fromTimestampMs и имееют такой же ID пакета как и переданный + * @param to публичный ключ получателя пакета + * @param packetId ID пакета, который нужно удалить + * @param fromTimestampMs метка времени в миллисекундах, после которой были добавлены пакеты, которые нужно удалить + */ + public void deletePacketsFromBuffer(String to, int packetId, long fromTimestampMs){ String hql = "DELETE FROM Buffer WHERE to = :to AND packetId = :packetId AND timestamp > :timestamp"; HashMap parameters = new HashMap<>(); parameters.put("to", to); From 0184375814139c8fb9cb62e36c5f8a431607635b Mon Sep 17 00:00:00 2001 From: RoyceDa Date: Sat, 21 Feb 2026 20:11:05 +0200 Subject: [PATCH 5/5] =?UTF-8?q?=D0=9D=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/im/rosetta/executors/Executor24DeviceResolve.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java b/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java index 4dfa263..92ca734 100644 --- a/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java +++ b/src/main/java/im/rosetta/executors/Executor24DeviceResolve.java @@ -6,7 +6,6 @@ import im.rosetta.Failures; import im.rosetta.client.ClientManager; import im.rosetta.client.tags.ECIAuthentificate; import im.rosetta.client.tags.ECIDevice; -import im.rosetta.database.entity.Buffer; import im.rosetta.database.entity.Device; import im.rosetta.database.repository.BufferRepository; import im.rosetta.database.repository.DeviceRepository;