diff --git a/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java b/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java index 02dee447ad..e27f78428e 100644 --- a/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java +++ b/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java @@ -248,6 +248,11 @@ public class JitsiMeetConferenceImpl @Nullable private String meetingId; + /** + * The time at which the last conference request for this conference was received. + */ + private long lastConferenceRequestReceived = -1; + /** * Creates new instance of {@link JitsiMeetConferenceImpl}. * @@ -961,7 +966,25 @@ else if (participants.size() == 0) } } - maybeStop(); + long timeSinceLastRequest = System.currentTimeMillis() - lastConferenceRequestReceived; + long timeout = ConferenceConfig.config.getConferenceStartTimeout().toMillis(); + if (timeSinceLastRequest > 0 && timeSinceLastRequest < timeout) + { + logger.warn("Delaying stopping my " + timeout + " ms because of a recent conference request."); + TaskPools.getScheduledPool().schedule(this::maybeStop, timeout, TimeUnit.MILLISECONDS); + } + else + { + maybeStop(); + } + } + + /** + * Notify this instance that a conference request for it was received. + */ + public void conferenceRequestReceived() + { + lastConferenceRequestReceived = System.currentTimeMillis(); } /** diff --git a/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/ConferenceIqHandler.kt b/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/ConferenceIqHandler.kt index 1a01bb5c5d..06129a1c71 100644 --- a/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/ConferenceIqHandler.kt +++ b/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/ConferenceIqHandler.kt @@ -85,6 +85,7 @@ class ConferenceIqHandler( logger.info("Conference request for room $room, from ${query.from}") val conference = focusManager.getConference(room) val roomExists = conference != null + conference?.conferenceRequestReceived() // Authentication logic val error: IQ? = processExtensions(query, room, response, roomExists) diff --git a/jicofo/src/test/kotlin/org/jitsi/jicofo/auth/XMPPDomainAuthAuthorityTest.kt b/jicofo/src/test/kotlin/org/jitsi/jicofo/auth/XMPPDomainAuthAuthorityTest.kt index c965501d75..40deba5a12 100644 --- a/jicofo/src/test/kotlin/org/jitsi/jicofo/auth/XMPPDomainAuthAuthorityTest.kt +++ b/jicofo/src/test/kotlin/org/jitsi/jicofo/auth/XMPPDomainAuthAuthorityTest.kt @@ -86,7 +86,7 @@ class XMPPDomainAuthAuthorityTest : ShouldSpec() { } context("CASE 3: guest domain, no session-id, room exists") { - every { focusManager.getConference(any()) } returns mockk() + every { focusManager.getConference(any()) } returns mockk(relaxed = true) val query = ConferenceIq().apply { to = JidCreate.from("jicofo@example.com") from = user2GuestJid @@ -120,7 +120,7 @@ class XMPPDomainAuthAuthorityTest : ShouldSpec() { } context("CASE 5: guest jid, invalid session-id, room exists") { - every { focusManager.getConference(any()) } returns mockk() + every { focusManager.getConference(any()) } returns mockk(relaxed = true) val query = ConferenceIq().apply { room = room2 to = JidCreate.from("jicofo@example.com") @@ -141,7 +141,7 @@ class XMPPDomainAuthAuthorityTest : ShouldSpec() { } context("CASE 6: do not allow to use session-id from different machine") { - every { focusManager.getConference(any()) } returns mockk() + every { focusManager.getConference(any()) } returns mockk(relaxed = true) val query = ConferenceIq().apply { room = room2 to = JidCreate.from("jicofo@example.com") @@ -155,7 +155,7 @@ class XMPPDomainAuthAuthorityTest : ShouldSpec() { } context("CASE 7: auth jid, but stolen session id") { - every { focusManager.getConference(any()) } returns mockk() + every { focusManager.getConference(any()) } returns mockk(relaxed = true) val query = ConferenceIq().apply { room = room2 to = JidCreate.from("jicofo@example.com") @@ -169,7 +169,7 @@ class XMPPDomainAuthAuthorityTest : ShouldSpec() { } context("CASE 8: guest jid, session used without machine UID") { - every { focusManager.getConference(any()) } returns mockk() + every { focusManager.getConference(any()) } returns mockk(relaxed = true) val query = ConferenceIq().apply { room = room2 to = JidCreate.from("jicofo@example.com") @@ -183,7 +183,7 @@ class XMPPDomainAuthAuthorityTest : ShouldSpec() { } context("CASE 9: auth jid, try to create session without machine UID") { - every { focusManager.getConference(any()) } returns mockk() + every { focusManager.getConference(any()) } returns mockk(relaxed = true) val query = ConferenceIq().apply { to = JidCreate.from("jicofo@example.com") type = IQ.Type.set @@ -197,7 +197,7 @@ class XMPPDomainAuthAuthorityTest : ShouldSpec() { } context("CASE 10: same user, different machine UID - assign separate session") { - every { focusManager.getConference(any()) } returns mockk() + every { focusManager.getConference(any()) } returns mockk(relaxed = true) val user3MachineUID = "user3machineUID" val query = ConferenceIq().apply { room = room3