diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/Participant.java b/openvidu-server/src/main/java/io/openvidu/server/core/Participant.java index b8906a5c..a71eaedd 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/Participant.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/Participant.java @@ -232,6 +232,7 @@ public class Participant { public JsonObject toJson() { JsonObject json = new JsonObject(); json.addProperty("connectionId", this.participantPublicId); + json.addProperty("session", this.sessionId); json.addProperty("createdAt", this.createdAt); json.addProperty("location", this.location != null ? this.location.toString() : "unknown"); json.addProperty("platform", this.platform); diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/Session.java b/openvidu-server/src/main/java/io/openvidu/server/core/Session.java index 6feb9736..c521686e 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/Session.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/Session.java @@ -175,7 +175,7 @@ public class Session implements SessionInterface { Iterator> iterator = this.tokens.entrySet().iterator(); while (iterator.hasNext() && !deleted) { Entry entry = iterator.next(); - if (connectionId.equals(entry.getValue().getConnetionId())) { + if (connectionId.equals(entry.getValue().getConnectionId())) { iterator.remove(); deleted = true; } @@ -225,6 +225,7 @@ public class Session implements SessionInterface { private JsonObject sharedJson(Function toJsonFunction) { JsonObject json = new JsonObject(); json.addProperty("sessionId", this.sessionId); + json.addProperty("id", this.sessionId); // TODO: deprecated. Better use only "sessionId" json.addProperty("createdAt", this.startTime); json.addProperty("mediaMode", this.sessionProperties.mediaMode().name()); json.addProperty("recordingMode", this.sessionProperties.recordingMode().name()); diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java index 6ce7c2c3..df58dd20 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java @@ -308,7 +308,8 @@ public abstract class SessionManager { } public Token newTokenForInsecureUser(Session session, String token, String serverMetadata) throws Exception { - Token tokenObj = new Token(token, OpenViduRole.PUBLISHER, serverMetadata != null ? serverMetadata : "", true, + Token tokenObj = new Token(token, session.getSessionId(), OpenViduRole.PUBLISHER, + serverMetadata != null ? serverMetadata : "", true, this.openviduConfig.isTurnadminAvailable() ? this.coturnCredentialsService.createUser() : null, null); session.storeToken(tokenObj); session.showTokens("Token created for insecure user"); @@ -357,7 +358,7 @@ public abstract class SessionManager { if (this.sessionidParticipantpublicidParticipant.get(sessionId) != null) { - Participant p = new Participant(finalUserId, participantPrivatetId, token.getConnetionId(), sessionId, + Participant p = new Participant(finalUserId, participantPrivatetId, token.getConnectionId(), sessionId, token, clientMetadata, location, platform, EndpointType.WEBRTC_ENDPOINT, null); this.sessionidParticipantpublicidParticipant.get(sessionId).put(p.getParticipantPublicId(), p); diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/Token.java b/openvidu-server/src/main/java/io/openvidu/server/core/Token.java index d5ed9ca6..5e707316 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/Token.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/Token.java @@ -19,6 +19,8 @@ package io.openvidu.server.core; import org.apache.commons.lang3.RandomStringUtils; +import com.google.gson.JsonObject; + import io.openvidu.java.client.OpenViduRole; import io.openvidu.server.coturn.TurnCredentials; import io.openvidu.server.kurento.core.KurentoTokenOptions; @@ -26,6 +28,7 @@ import io.openvidu.server.kurento.core.KurentoTokenOptions; public class Token { private String token; + private String sessionId; private OpenViduRole role; private String serverMetadata = ""; private boolean record; @@ -35,9 +38,10 @@ public class Token { private final String connectionId = IdentifierPrefixes.PARTICIPANT_PUBLIC_ID + RandomStringUtils.randomAlphabetic(1).toUpperCase() + RandomStringUtils.randomAlphanumeric(9); - public Token(String token, OpenViduRole role, String serverMetadata, boolean record, + public Token(String token, String sessionId, OpenViduRole role, String serverMetadata, boolean record, TurnCredentials turnCredentials, KurentoTokenOptions kurentoTokenOptions) { this.token = token; + this.sessionId = sessionId; this.role = role; this.serverMetadata = serverMetadata; this.record = record; @@ -73,7 +77,7 @@ public class Token { return kurentoTokenOptions; } - public String getConnetionId() { + public String getConnectionId() { return connectionId; } @@ -85,6 +89,21 @@ public class Token { this.record = record; } + public JsonObject toJson() { + JsonObject json = new JsonObject(); + json.addProperty("token", this.getToken()); + json.addProperty("id", this.getToken()); + json.addProperty("connectionId", this.getConnectionId()); + json.addProperty("session", this.sessionId); + json.addProperty("role", this.getRole().toString()); + json.addProperty("data", this.getServerMetadata()); + json.addProperty("record", this.record()); + if (this.getKurentoTokenOptions() != null) { + json.add("kurentoOptions", this.getKurentoTokenOptions().toJson()); + } + return json; + } + @Override public String toString() { if (this.role != null) diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/TokenGenerator.java b/openvidu-server/src/main/java/io/openvidu/server/core/TokenGenerator.java index 540f8e94..0c5f9b84 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/TokenGenerator.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/TokenGenerator.java @@ -56,6 +56,6 @@ public class TokenGenerator { token += "&turnCredential=" + turnCredentials.getCredential(); } } - return new Token(token, role, serverMetadata, record, turnCredentials, kurentoTokenOptions); + return new Token(token, sessionId, role, serverMetadata, record, turnCredentials, kurentoTokenOptions); } } diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoTokenOptions.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoTokenOptions.java index cc785116..a7b21da8 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoTokenOptions.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoTokenOptions.java @@ -79,4 +79,29 @@ public class KurentoTokenOptions { return this.allowedFilters.containsKey(filterType); } + public JsonObject toJson() { + JsonObject json = new JsonObject(); + if (this.getVideoMaxRecvBandwidth() != null) { + json.addProperty("videoMaxRecvBandwidth", this.getVideoMaxRecvBandwidth()); + } + if (this.getVideoMinRecvBandwidth() != null) { + json.addProperty("videoMinRecvBandwidth", this.getVideoMinRecvBandwidth()); + } + if (this.getVideoMaxSendBandwidth() != null) { + json.addProperty("videoMaxSendBandwidth", this.getVideoMaxSendBandwidth()); + } + if (this.getVideoMinSendBandwidth() != null) { + json.addProperty("videoMinSendBandwidth", this.getVideoMinSendBandwidth()); + } + if (this.getAllowedFilters().length > 0) { + JsonArray filtersJson = new JsonArray(); + String[] filters = this.getAllowedFilters(); + for (String filter : filters) { + filtersJson.add(filter); + } + json.add("allowedFilters", filtersJson); + } + return json; + } + } diff --git a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java index 7cc2bac3..75539422 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java +++ b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java @@ -176,11 +176,9 @@ public class SessionRestController { Session sessionNotActive = sessionManager.storeSessionNotActive(sessionId, sessionProperties); log.info("New session {} initialized {}", sessionId, this.sessionManager.getSessionsWithNotActive().stream() .map(Session::getSessionId).collect(Collectors.toList()).toString()); - JsonObject responseJson = new JsonObject(); - responseJson.addProperty("id", sessionNotActive.getSessionId()); - responseJson.addProperty("createdAt", sessionNotActive.getStartTime()); - return new ResponseEntity<>(responseJson.toString(), RestUtils.getResponseHeaders(), HttpStatus.OK); + return new ResponseEntity<>(sessionNotActive.toJson().toString(), RestUtils.getResponseHeaders(), + HttpStatus.OK); } @RequestMapping(value = "/sessions/{sessionId}", method = RequestMethod.GET) @@ -396,44 +394,7 @@ public class SessionRestController { if (session.closingLock.readLock().tryLock()) { try { Token token = sessionManager.newToken(session, role, metadata, record, kurentoTokenOptions); - - JsonObject responseJson = new JsonObject(); - responseJson.addProperty("id", token.getToken()); - responseJson.addProperty("connectionId", token.getConnetionId()); - responseJson.addProperty("session", sessionId); - responseJson.addProperty("role", role.toString()); - responseJson.addProperty("data", metadata); - responseJson.addProperty("record", record); - responseJson.addProperty("token", token.getToken()); - - if (kurentoOptions != null) { - JsonObject kurentoOptsResponse = new JsonObject(); - if (kurentoTokenOptions.getVideoMaxRecvBandwidth() != null) { - kurentoOptsResponse.addProperty("videoMaxRecvBandwidth", - kurentoTokenOptions.getVideoMaxRecvBandwidth()); - } - if (kurentoTokenOptions.getVideoMinRecvBandwidth() != null) { - kurentoOptsResponse.addProperty("videoMinRecvBandwidth", - kurentoTokenOptions.getVideoMinRecvBandwidth()); - } - if (kurentoTokenOptions.getVideoMaxSendBandwidth() != null) { - kurentoOptsResponse.addProperty("videoMaxSendBandwidth", - kurentoTokenOptions.getVideoMaxSendBandwidth()); - } - if (kurentoTokenOptions.getVideoMinSendBandwidth() != null) { - kurentoOptsResponse.addProperty("videoMinSendBandwidth", - kurentoTokenOptions.getVideoMinSendBandwidth()); - } - if (kurentoTokenOptions.getAllowedFilters().length > 0) { - JsonArray filters = new JsonArray(); - for (String filter : kurentoTokenOptions.getAllowedFilters()) { - filters.add(filter); - } - kurentoOptsResponse.add("allowedFilters", filters); - } - responseJson.add("kurentoOptions", kurentoOptsResponse); - } - return new ResponseEntity<>(responseJson.toString(), RestUtils.getResponseHeaders(), HttpStatus.OK); + return new ResponseEntity<>(token.toJson().toString(), RestUtils.getResponseHeaders(), HttpStatus.OK); } catch (Exception e) { return this.generateErrorResponse( "Error generating token for session " + sessionId + ": " + e.getMessage(), "/tokens", diff --git a/openvidu-server/src/test/java/io/openvidu/server/test/integration/SessionGarbageCollectorIntegrationTest.java b/openvidu-server/src/test/java/io/openvidu/server/test/integration/SessionGarbageCollectorIntegrationTest.java index 5e36c975..7e267ee6 100644 --- a/openvidu-server/src/test/java/io/openvidu/server/test/integration/SessionGarbageCollectorIntegrationTest.java +++ b/openvidu-server/src/test/java/io/openvidu/server/test/integration/SessionGarbageCollectorIntegrationTest.java @@ -115,7 +115,7 @@ public class SessionGarbageCollectorIntegrationTest { } private void joinParticipant(String sessionId, String token) { - Token t = new Token(token, OpenViduRole.PUBLISHER, "SERVER_METADATA", true, null, null); + Token t = new Token(token, sessionId, OpenViduRole.PUBLISHER, "SERVER_METADATA", true, null, null); String uuid = UUID.randomUUID().toString(); String participantPrivateId = "PARTICIPANT_PRIVATE_ID_" + uuid; String finalUserId = "FINAL_USER_ID_" + uuid; diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java index 665e1d44..87dd2a61 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java @@ -2520,6 +2520,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { log.info("REST API test"); + final String DEFAULT_JSON_SESSION = "{'sessionId':'STR','id':'STR','createdAt':0,'mediaMode':'STR','recordingMode':'STR','defaultOutputMode':'STR','defaultRecordingLayout':'STR','customSessionId':'STR','connections':{'numberOfElements':0,'content':[]},'recording':false}"; + CustomHttpClient restClient = new CustomHttpClient(OPENVIDU_URL, "OPENVIDUAPP", OPENVIDU_SECRET); // 401 @@ -2550,11 +2552,10 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { // 200 body = "{'mediaMode': 'ROUTED', 'recordingMode': 'MANUAL', 'customSessionId': 'CUSTOM_SESSION_ID', 'defaultOutputMode': 'COMPOSED', 'defaultRecordingLayout': 'BEST_FIT'}"; - restClient.rest(HttpMethod.POST, "/openvidu/api/sessions", body, HttpStatus.SC_OK, true, - "{'id': 'STR', 'createdAt': 0}"); + restClient.rest(HttpMethod.POST, "/openvidu/api/sessions", body, HttpStatus.SC_OK, true, DEFAULT_JSON_SESSION); // Default values JsonObject res = restClient.rest(HttpMethod.POST, "/openvidu/api/sessions", "{}", HttpStatus.SC_OK, true, - "{'id': 'STR', 'createdAt': 0}"); + DEFAULT_JSON_SESSION); restClient.rest(HttpMethod.DELETE, "/openvidu/api/sessions/" + res.get("id").getAsString(), HttpStatus.SC_NO_CONTENT); @@ -2564,7 +2565,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { /** GET /openvidu/api/sessions (after session created) **/ restClient.rest(HttpMethod.GET, "/openvidu/api/sessions/CUSTOM_SESSION_ID", null, HttpStatus.SC_OK, true, - "{'sessionId':'STR','createdAt':0,'mediaMode':'STR','recordingMode':'STR','defaultOutputMode':'STR','defaultRecordingLayout':'STR','customSessionId':'STR','connections':{'numberOfElements':0,'content':[]},'recording':true}"); + DEFAULT_JSON_SESSION); restClient.rest(HttpMethod.GET, "/openvidu/api/sessions", null, HttpStatus.SC_OK, true, ImmutableMap.of("numberOfElements", new Integer(1), "content", new JsonArray())); @@ -2643,7 +2644,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { // 409 (RELAYED media mode) res = restClient.rest(HttpMethod.POST, "/openvidu/api/sessions", "{'mediaMode':'RELAYED'}", HttpStatus.SC_OK, - true, "{'id': 'STR', 'createdAt': 0}"); + true, DEFAULT_JSON_SESSION); body = "{'session':'" + res.get("id").getAsString() + "'}"; restClient.rest(HttpMethod.POST, "/openvidu/api/recordings/start", body, HttpStatus.SC_CONFLICT); restClient.rest(HttpMethod.DELETE, "/openvidu/api/sessions/" + res.get("id").getAsString(), @@ -2737,7 +2738,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { restClient.rest(HttpMethod.DELETE, "/openvidu/api/sessions/CUSTOM_SESSION_ID/stream/NOT_EXISTS", HttpStatus.SC_NOT_FOUND); res = restClient.rest(HttpMethod.GET, "/openvidu/api/sessions/CUSTOM_SESSION_ID", null, HttpStatus.SC_OK, true, - "{'sessionId':'STR','createdAt':0,'mediaMode':'STR','recordingMode':'STR','defaultOutputMode':'STR','defaultRecordingLayout':'STR','customSessionId':'STR','connections':{'numberOfElements':2,'content'" + "{'sessionId':'STR','id':'STR','createdAt':0,'mediaMode':'STR','recordingMode':'STR','defaultOutputMode':'STR','defaultRecordingLayout':'STR','customSessionId':'STR','connections':{'numberOfElements':2,'content'" + ":[{'connectionId':'STR','createdAt':0,'location':'STR','platform':'STR','token':'STR','role':'STR','serverData':'STR','clientData':'STR','publishers':[" + "{'createdAt':0,'streamId':'STR','mediaOptions':{'hasAudio':false,'audioActive':false,'hasVideo':false,'videoActive':false,'typeOfVideo':'STR','frameRate':0," + "'videoDimensions':'STR','filter':{}}}],'subscribers':[{'createdAt':0,'streamId':'STR','publisher':'STR'}]},{'connectionId':'STR','createdAt':0,'location':'STR'," @@ -2800,16 +2801,25 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { final String tokenA = res.get("token").getAsString(); res = restClient.rest(HttpMethod.POST, "/openvidu/api/tokens", body, HttpStatus.SC_OK); final String tokenBConnectionId = res.get("connectionId").getAsString(); + final String tokenB = res.get("token").getAsString(); user.getDriver().findElement(By.id("one2one-btn")).click(); - user.getDriver().findElement(By.id("session-settings-btn-0")).click(); - Thread.sleep(1000); // Set token 1 + user.getDriver().findElement(By.id("session-settings-btn-0")).click(); + Thread.sleep(1000); tokenInput = user.getDriver().findElement(By.cssSelector("#custom-token-div input")); tokenInput.clear(); tokenInput.sendKeys(tokenA); + user.getDriver().findElement(By.id("save-btn")).click(); + Thread.sleep(1000); + // Set token 2 + user.getDriver().findElement(By.id("session-settings-btn-1")).click(); + Thread.sleep(1000); + tokenInput = user.getDriver().findElement(By.cssSelector("#custom-token-div input")); + tokenInput.clear(); + tokenInput.sendKeys(tokenB); user.getDriver().findElement(By.id("save-btn")).click(); Thread.sleep(1000); @@ -2835,9 +2845,6 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 .join-btn")).sendKeys(Keys.ENTER); user.getEventManager().waitUntilEventReaches("connectionCreated", 1); - user.getEventManager().waitUntilEventReaches("accessAllowed", 1); - user.getEventManager().waitUntilEventReaches("streamCreated", 1); - user.getEventManager().waitUntilEventReaches("streamPlaying", 1); // connectionId should be equal to the one brought by the token Assert.assertEquals("Wrong connectionId", tokenBConnectionId,