diff --git a/src/main/java/im/rosetta/executors/Executor27WebRTC.java b/src/main/java/im/rosetta/executors/Executor27WebRTC.java index 4d9aa19..c3572df 100644 --- a/src/main/java/im/rosetta/executors/Executor27WebRTC.java +++ b/src/main/java/im/rosetta/executors/Executor27WebRTC.java @@ -1,9 +1,12 @@ package im.rosetta.executors; +import java.util.HashSet; + import im.rosetta.Failures; -import im.rosetta.client.tags.ECIAuthentificate; +import im.rosetta.database.repository.DeviceRepository; import im.rosetta.packet.Packet27WebRTC; import im.rosetta.packet.runtime.NetworkWebRTCType; +import im.rosetta.service.services.DeviceService; import im.rosetta.service.services.ForwardUnitService; import io.g365sfu.Room; import io.orprotocol.ProtocolException; @@ -13,6 +16,8 @@ import io.orprotocol.packet.PacketExecutor; public class Executor27WebRTC extends PacketExecutor { private ForwardUnitService fus; + private final DeviceRepository deviceRepository = new DeviceRepository(); + private final DeviceService deviceService = new DeviceService(deviceRepository); public Executor27WebRTC(ForwardUnitService fus) { this.fus = fus; @@ -20,23 +25,24 @@ public class Executor27WebRTC extends PacketExecutor { @Override public void onPacketReceived(Packet27WebRTC packet, Client client) throws Exception, ProtocolException { - ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class); - if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()) { + String publicKey = packet.getPublicKey(); + String deviceId = packet.getDeviceId(); + + HashSet publicKeys = this.deviceService.getPublicKeysByDeviceId(deviceId); + if(!publicKeys.contains(publicKey)) { /** - * Если клиент не авторизован, то мы не будем обрабатывать его сигналы на инициализацию звонка - * и просто отключим его от сервера. + * Если публичный ключ, который отправил пакет, не связан с deviceId, с которого был отправлен пакет, то отключаем клиента от сервера, так как это может быть попыткой подделки пакета */ - client.disconnect(Failures.HANDSHAKE_NOT_COMPLETED); + client.disconnect(Failures.DATA_MISSMATCH); return; } - String publicKey = eciAuthentificate.getPublicKey(); - /** * Так как в комнатах Participants это публичные ключи пользователей, то мы можем * найти комнату, в которой находится пользователь, по его публичному ключу */ Room room = this.fus.getRoomByParticipantId(publicKey); + if(room == null) { /** * Если комната не найдена, то мы не будем обрабатывать сигналы для звонка diff --git a/src/main/java/im/rosetta/executors/Executor28IceServers.java b/src/main/java/im/rosetta/executors/Executor28IceServers.java index e9007b7..d0af5e0 100644 --- a/src/main/java/im/rosetta/executors/Executor28IceServers.java +++ b/src/main/java/im/rosetta/executors/Executor28IceServers.java @@ -2,8 +2,6 @@ package im.rosetta.executors; import java.util.ArrayList; -import im.rosetta.Failures; -import im.rosetta.client.tags.ECIAuthentificate; import im.rosetta.packet.Packet28IceServers; import im.rosetta.service.services.ForwardUnitService; import io.orprotocol.ProtocolException; @@ -20,15 +18,6 @@ public class Executor28IceServers extends PacketExecutor { @Override public void onPacketReceived(Packet28IceServers packet, Client client) throws Exception, ProtocolException { - ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class); - if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()) { - /** - * Если клиент не авторизован, то мы не будем обрабатывать его запрос на получение ICE серверов - * и просто отключим его от сервера. - */ - client.disconnect(Failures.HANDSHAKE_NOT_COMPLETED); - return; - } /** * Берем TURN сервера и отправляем их клиенту */ diff --git a/src/main/java/im/rosetta/packet/Packet27WebRTC.java b/src/main/java/im/rosetta/packet/Packet27WebRTC.java index 611c9a2..95dcad1 100644 --- a/src/main/java/im/rosetta/packet/Packet27WebRTC.java +++ b/src/main/java/im/rosetta/packet/Packet27WebRTC.java @@ -13,11 +13,21 @@ public class Packet27WebRTC extends Packet { * Тип сообщения WebRTC */ private NetworkWebRTCType type; + /** + * Публичный ключ участника комнаты, который отправил этот пакет + */ + private String publicKey; + /** + * Device ID участника комнаты, который отправил этот пакет + */ + private String deviceId; @Override public void read(Stream stream) { this.type = NetworkWebRTCType.fromCode(stream.readInt8()); this.sdpOrCandidate = stream.readString(); + this.publicKey = stream.readString(); + this.deviceId = stream.readString(); } @Override @@ -26,6 +36,8 @@ public class Packet27WebRTC extends Packet { steram.writeInt16(this.packetId); steram.writeInt8(this.type.getCode()); steram.writeString(this.sdpOrCandidate); + steram.writeString(this.publicKey); + steram.writeString(this.deviceId); return steram; } @@ -61,5 +73,35 @@ public class Packet27WebRTC extends Packet { this.type = type; } + /** + * Получить публичный ключ участника комнаты, который отправил этот пакет + * @return публичный ключ участника комнаты, который отправил этот пакет + */ + public String getPublicKey() { + return publicKey; + } + /** + * Установить публичный ключ участника комнаты, который отправил этот пакет + * @param publicKey публичный ключ участника комнаты, который отправил этот пакет + */ + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + /** + * Получить device ID участника комнаты, который отправил этот пакет + * @return device ID участника комнаты, который отправил этот пакет + */ + public String getDeviceId() { + return deviceId; + } + + /** + * Установить device ID участника комнаты, который отправил этот пакет + * @param deviceId device ID участника комнаты, который отправил этот пакет + */ + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } } diff --git a/src/main/java/im/rosetta/service/dispatch/push/dispatchers/FCM.java b/src/main/java/im/rosetta/service/dispatch/push/dispatchers/FCM.java index a181e88..e7ab534 100644 --- a/src/main/java/im/rosetta/service/dispatch/push/dispatchers/FCM.java +++ b/src/main/java/im/rosetta/service/dispatch/push/dispatchers/FCM.java @@ -97,7 +97,7 @@ public class FCM extends Pusher { Message message = this.buildMessage(token, data); FirebaseMessaging.getInstance().send(message); }catch(Exception e){ - e.printStackTrace(); + } } diff --git a/src/main/java/im/rosetta/service/services/DeviceService.java b/src/main/java/im/rosetta/service/services/DeviceService.java index b8a0b22..05c3659 100644 --- a/src/main/java/im/rosetta/service/services/DeviceService.java +++ b/src/main/java/im/rosetta/service/services/DeviceService.java @@ -1,5 +1,6 @@ package im.rosetta.service.services; +import java.util.HashSet; import java.util.List; import im.rosetta.client.tags.ECIAuthentificate; @@ -82,4 +83,18 @@ public class DeviceService extends Service { return device.getSyncTime(); } + /** + * Получить публичные ключи пользователей, которые связаны с данным deviceId + * @param deviceId ID устройства + * @return набор публичных ключей пользователей, которые связаны с данным deviceId + */ + public HashSet getPublicKeysByDeviceId(String deviceId) { + List devices = this.getRepository().findAllByField("deviceId", deviceId); + HashSet publicKeys = new HashSet<>(); + for(Device device : devices) { + publicKeys.add(device.getPublicKey()); + } + return publicKeys; + } + } diff --git a/src/main/java/im/rosetta/service/services/ForwardUnitService.java b/src/main/java/im/rosetta/service/services/ForwardUnitService.java index b07a9ab..8854203 100644 --- a/src/main/java/im/rosetta/service/services/ForwardUnitService.java +++ b/src/main/java/im/rosetta/service/services/ForwardUnitService.java @@ -255,5 +255,19 @@ public class ForwardUnitService { return iceServers; } + /** + * Получить комнату по ее ID, который используется на сервере SFU для идентификации комнаты. + * @param roomId ID комнаты на сервере SFU + * @return комната Room если найдена, иначе null + */ + public Room getRoomById(String roomId) { + for(SFU sfu : this.sfuConnections) { + Room room = sfu.getRoom(roomId); + if(room != null) { + return room; + } + } + return null; + } }