diff --git a/src/main/java/im/rosetta/calls/CallSession.java b/src/main/java/im/rosetta/calls/CallSession.java index 3701510..994d54f 100644 --- a/src/main/java/im/rosetta/calls/CallSession.java +++ b/src/main/java/im/rosetta/calls/CallSession.java @@ -18,7 +18,9 @@ public class CallSession { * Клиенты в этом списке не могут принимать другие звонки, так как они уже заняты дозвоном, * но они еще не в звонке, так как не приняли звонок * - * Клиенты удаляются из этого списка, когда они принимают звонок или отклоняют его, тогда они либо переходят в звонок, либо становятся свободными для других звонков + * Клиенты удаляются из этого списка, когда они принимают звонок или отклоняют его, + * тогда они либо переходят в звонок, либо становятся свободными для других звонков + * pk -> время начала дозвона (timestamp в миллисекундах) */ public HashMap ringing; /** @@ -48,6 +50,16 @@ public class CallSession { this.clients.put(publicKey, client); } + /** + * Проверяет, может ли этот публичный ключ выполнять какие-либо действия в рамках этой сессии звонка, + * чтобы не допустить выполнение действий от посторонних публичных ключей, которые не участвуют в звонке + * @param publicKey Публичный ключ для проверки + * @return true, если этот публичный ключ может выполнять действия в рамках этой сессии звонка, false иначе + */ + public boolean isValidSource(String publicKey) { + return this.ringing.containsKey(publicKey) || this.clients.containsKey(publicKey); + } + /** * Получаем публичный ключ клиента по его сокету, чтобы понимать, кто отправляет сигналы в рамках звонка * @param client Сокет клиента, для которого нужно получить публичный ключ diff --git a/src/main/java/im/rosetta/executors/Executor26SignalPeer.java b/src/main/java/im/rosetta/executors/Executor26SignalPeer.java index 15452e6..a287c51 100644 --- a/src/main/java/im/rosetta/executors/Executor26SignalPeer.java +++ b/src/main/java/im/rosetta/executors/Executor26SignalPeer.java @@ -127,6 +127,13 @@ public class Executor26SignalPeer extends PacketExecutor { client.disconnect(Failures.NO_CALL_SESSION); return; } + if(!session.isValidSource(src)) { + /** + * Клиент не состоит в сессии звонка, отключаем его от сервера, так как он отправляет некорректные данные + */ + client.disconnect(Failures.DATA_MISSMATCH); + return; + } Room room = this.fus.createRoom(); session.setRoom(room); session.joinCall(src, client);