diff --git a/openvidu-browser/src/main/resources/ts/OpenVidu.ts b/openvidu-browser/src/main/resources/ts/OpenVidu.ts index ae29c04a..13d9de4b 100644 --- a/openvidu-browser/src/main/resources/ts/OpenVidu.ts +++ b/openvidu-browser/src/main/resources/ts/OpenVidu.ts @@ -47,22 +47,28 @@ export class OpenVidu { return this.session; } - initPublisherTagged(parentId: string, cameraOptions: any) { + initPublisherTagged(parentId: string, cameraOptions: any, callback) { console.log("Publisher tagged initialized!"); - let camera = this.getCamera(cameraOptions); - camera.requestCameraAccess((error, camera) => { - if (error) return console.log(error); - camera!.playOnlyVideo(parentId, null); + this.getCamera(cameraOptions); + this.camera.requestCameraAccess((error, camera) => { + if (error){ + callback(error); + } + else { + this.camera.playOnlyVideo(parentId, null); + callback(undefined); + } }); } - initPublisher(cameraOptions: any) { + initPublisher(cameraOptions: any, callback) { console.log("Publisher initialized!"); - let camera = this.getCamera(cameraOptions); - camera.requestCameraAccess((error, camera) => { - if (error) return console.log(error); + this.getCamera(cameraOptions); + this.camera.requestCameraAccess((error, camera) => { + if (error) callback(error); + else callback(undefined); }); } @@ -132,7 +138,7 @@ export class OpenVidu { if ( error ) { this.callback( error ); } else { - this.callback( null, this ); + this.callback( null ); } } @@ -276,7 +282,7 @@ export class OpenVidu { this.session.configure(options); - this.session.connect(); + this.session.connect2(); this.session.addEventListener('room-connected', roomEvent => callback(undefined,this.session)); diff --git a/openvidu-client/src/main/java/org/openvidu/client/OpenViduException.java b/openvidu-client/src/main/java/org/openvidu/client/OpenViduException.java index d11e1a0c..a8c320bb 100644 --- a/openvidu-client/src/main/java/org/openvidu/client/OpenViduException.java +++ b/openvidu-client/src/main/java/org/openvidu/client/OpenViduException.java @@ -36,9 +36,7 @@ public class OpenViduException extends RuntimeException { USER_NOT_STREAMING_ERROR_CODE(105), EXISTING_USER_IN_ROOM_ERROR_CODE( 104), USER_CLOSED_ERROR_CODE( - 103), USER_NOT_FOUND_ERROR_CODE(102), USER_GENERIC_ERROR_CODE(101), - - USER_UNAUTHORIZED(401); + 103), USER_NOT_FOUND_ERROR_CODE(102), USER_GENERIC_ERROR_CODE(101); private int value; diff --git a/openvidu-server/src/main/java/org/openvidu/server/core/NotificationRoomManager.java b/openvidu-server/src/main/java/org/openvidu/server/core/NotificationRoomManager.java index 589534c5..de52a5c1 100644 --- a/openvidu-server/src/main/java/org/openvidu/server/core/NotificationRoomManager.java +++ b/openvidu-server/src/main/java/org/openvidu/server/core/NotificationRoomManager.java @@ -17,6 +17,9 @@ package org.openvidu.server.core; import javax.annotation.PreDestroy; + +import java.math.BigInteger; +import java.security.SecureRandom; import java.util.Set; import org.kurento.client.MediaElement; @@ -33,6 +36,7 @@ import org.openvidu.server.core.api.pojo.ParticipantRequest; import org.openvidu.server.core.api.pojo.UserParticipant; import org.openvidu.server.core.internal.DefaultKurentoClientSessionInfo; import org.openvidu.server.core.internal.DefaultNotificationRoomHandler; +import org.openvidu.server.security.ParticipantRoles; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -443,4 +447,14 @@ public class NotificationRoomManager { public void updateFilter(String roomId, String filterId) { internalManager.updateFilter(roomId, filterId); } + + + + public String newSessionId(){ + return this.internalManager.newSessionId(); + } + + public String newToken(String sessionId, ParticipantRoles role){ + return this.internalManager.newToken(sessionId, role); + } } diff --git a/openvidu-server/src/main/java/org/openvidu/server/core/RoomManager.java b/openvidu-server/src/main/java/org/openvidu/server/core/RoomManager.java index 45a612fc..4f6d92d3 100644 --- a/openvidu-server/src/main/java/org/openvidu/server/core/RoomManager.java +++ b/openvidu-server/src/main/java/org/openvidu/server/core/RoomManager.java @@ -17,12 +17,16 @@ package org.openvidu.server.core; import javax.annotation.PreDestroy; + +import java.math.BigInteger; +import java.security.SecureRandom; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentSkipListSet; import org.kurento.client.IceCandidate; import org.kurento.client.KurentoClient; @@ -41,6 +45,7 @@ import org.openvidu.server.core.api.pojo.UserParticipant; import org.openvidu.server.core.endpoint.SdpType; import org.openvidu.server.core.internal.Participant; import org.openvidu.server.core.internal.Room; +import org.openvidu.server.security.ParticipantRoles; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,6 +66,9 @@ public class RoomManager { private KurentoClientProvider kcProvider; private final ConcurrentMap rooms = new ConcurrentHashMap(); + + private final ConcurrentMap> sessionIdTokenRole = new ConcurrentHashMap<>(); + private volatile boolean closed = false; @@ -153,6 +161,9 @@ public class RoomManager { + "' but it is closing"); } room.leave(participantId); + + this.sessionIdTokenRole.get(roomName).remove(participantId); + Set remainingParticipants = null; try { remainingParticipants = getParticipants(roomName); @@ -164,6 +175,9 @@ public class RoomManager { log.debug("No more participants in room '{}', removing it and closing it", roomName); room.close(); rooms.remove(roomName); + + sessionIdTokenRole.remove(roomName); + log.warn("Room '{}' removed and closed", roomName); } return remainingParticipants; @@ -830,6 +844,9 @@ public class RoomManager { } room.close(); rooms.remove(roomName); + + sessionIdTokenRole.remove(roomName); + log.warn("Room '{}' removed and closed", roomName); return participants; } @@ -906,4 +923,47 @@ public class RoomManager { room.updateFilter(filterId); } + + + + + + + public String getRoomNameFromParticipantId(String pid){ + return getParticipant(pid).getRoom().getName(); + } + + public boolean isParticipantInRoom(String participantName, String roomName) { + return this.sessionIdTokenRole.get(roomName).containsKey(participantName); + } + + public boolean isPublisherInRoom(String participantName, String roomName) { + return this.sessionIdTokenRole.get(roomName).get(participantName).equals(ParticipantRoles.PUBLISHER); + } + + public String newSessionId(){ + String sessionId = new BigInteger(130, new SecureRandom()).toString(32); + + this.sessionIdTokenRole.put(sessionId, new ConcurrentHashMap<>()); + + System.out.println(this.sessionIdTokenRole.toString()); + + return sessionId; + } + + public String newToken(String sessionId, ParticipantRoles role){ + if (this.sessionIdTokenRole.get(sessionId) != null) { + String token = new BigInteger(130, new SecureRandom()).toString(32); + + this.sessionIdTokenRole.get(sessionId).put(token, role); + + System.out.println(this.sessionIdTokenRole.toString()); + + return token; + } else { + System.out.println("Error: the sessionId [" + sessionId + "] is not valid"); + throw new OpenViduException(Code.ROOM_NOT_FOUND_ERROR_CODE, + "[" + sessionId +"] is not a valid sessionId"); + } + } } diff --git a/openvidu-server/src/main/java/org/openvidu/server/rest/RoomController.java b/openvidu-server/src/main/java/org/openvidu/server/rest/RoomController.java index 289c342f..064bfa17 100644 --- a/openvidu-server/src/main/java/org/openvidu/server/rest/RoomController.java +++ b/openvidu-server/src/main/java/org/openvidu/server/rest/RoomController.java @@ -18,12 +18,15 @@ package org.openvidu.server.rest; import static org.kurento.commons.PropertiesManager.getProperty; +import java.util.Map; import java.util.Set; import org.openvidu.server.core.NotificationRoomManager; +import org.openvidu.server.security.ParticipantRoles; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -57,11 +60,14 @@ public class RoomController { @RequestMapping("/getSessionId") public ResponseEntity getSessionId() { - return new ResponseEntity("SUPER_SESSIONID", HttpStatus.OK); + String sessionId = roomManager.newSessionId(); + return new ResponseEntity(sessionId, HttpStatus.OK); } @RequestMapping("/getToken") - public ResponseEntity getToken() { - return new ResponseEntity("SUPER_TOKEN", HttpStatus.OK); + public ResponseEntity getToken(@RequestBody Map sessionIdAndRole) { + System.out.println("SESSIONID: " + sessionIdAndRole.get("0") + " - ROLE: " + sessionIdAndRole.get("1")); + String token = roomManager.newToken((String) sessionIdAndRole.get("0"), ParticipantRoles.valueOf((String) sessionIdAndRole.get("1"))); + return new ResponseEntity(token, HttpStatus.OK); } } diff --git a/openvidu-server/src/main/java/org/openvidu/server/rpc/JsonRpcUserControl.java b/openvidu-server/src/main/java/org/openvidu/server/rpc/JsonRpcUserControl.java index fb68832d..c6ddd359 100644 --- a/openvidu-server/src/main/java/org/openvidu/server/rpc/JsonRpcUserControl.java +++ b/openvidu-server/src/main/java/org/openvidu/server/rpc/JsonRpcUserControl.java @@ -23,6 +23,7 @@ import org.kurento.jsonrpc.Session; import org.kurento.jsonrpc.Transaction; import org.kurento.jsonrpc.message.Request; import org.openvidu.client.OpenViduException; +import org.openvidu.client.OpenViduException.Code; import org.openvidu.client.internal.ProtocolElements; import org.openvidu.server.core.NotificationRoomManager; import org.openvidu.server.core.api.pojo.ParticipantRequest; @@ -54,27 +55,49 @@ public class JsonRpcUserControl { ExecutionException { String roomName = getStringParam(request, ProtocolElements.JOINROOM_ROOM_PARAM); String userName = getStringParam(request, ProtocolElements.JOINROOM_USER_PARAM); + + if(roomManager.getRoomManager().isParticipantInRoom(userName, roomName)){ - boolean dataChannels = false; - if (request.getParams().has(ProtocolElements.JOINROOM_DATACHANNELS_PARAM)) { - dataChannels = request.getParams().get(ProtocolElements.JOINROOM_DATACHANNELS_PARAM) - .getAsBoolean(); + boolean dataChannels = false; + if (request.getParams().has(ProtocolElements.JOINROOM_DATACHANNELS_PARAM)) { + dataChannels = request.getParams().get(ProtocolElements.JOINROOM_DATACHANNELS_PARAM) + .getAsBoolean(); + } + + ParticipantSession participantSession = getParticipantSession(transaction); + participantSession.setParticipantName(userName); + participantSession.setRoomName(roomName); + participantSession.setDataChannels(dataChannels); + + roomManager.joinRoom(userName, roomName, dataChannels, true, participantRequest); + + } + else { + System.out.println("Error: sessionId or token not valid"); + throw new OpenViduException(Code.GENERIC_ERROR_CODE, + "Unable to join room. The user does not have a valid token"); } - - ParticipantSession participantSession = getParticipantSession(transaction); - participantSession.setParticipantName(userName); - participantSession.setRoomName(roomName); - participantSession.setDataChannels(dataChannels); - - roomManager.joinRoom(userName, roomName, dataChannels, true, participantRequest); } public void publishVideo(Transaction transaction, Request request, ParticipantRequest participantRequest) { - String sdpOffer = getStringParam(request, ProtocolElements.PUBLISHVIDEO_SDPOFFER_PARAM); - boolean doLoopback = getBooleanParam(request, ProtocolElements.PUBLISHVIDEO_DOLOOPBACK_PARAM); - - roomManager.publishMedia(participantRequest, sdpOffer, doLoopback); + + String pid = participantRequest.getParticipantId(); + String participantName = roomManager.getRoomManager().getParticipantName(pid); + String roomName = roomManager.getRoomManager().getRoomNameFromParticipantId(pid); + + if (roomManager.getRoomManager().isPublisherInRoom(participantName, roomName)) { + + String sdpOffer = getStringParam(request, ProtocolElements.PUBLISHVIDEO_SDPOFFER_PARAM); + boolean doLoopback = getBooleanParam(request, ProtocolElements.PUBLISHVIDEO_DOLOOPBACK_PARAM); + + roomManager.publishMedia(participantRequest, sdpOffer, doLoopback); + } + else { + System.out.println("Error: user is not a publisher"); + throw new OpenViduException(Code.GENERIC_ERROR_CODE, + "Unable to join room. The user does not have a valid token"); + } } public void unpublishVideo(Transaction transaction, Request request, @@ -186,6 +209,7 @@ public class JsonRpcUserControl { if (request.getParams() == null || request.getParams().get(key) == null) { throw new RuntimeException("Request element '" + key + "' is missing"); } + System.out.println(request.getParams().get(key)); return request.getParams().get(key).getAsString(); } diff --git a/openvidu-server/src/main/java/org/openvidu/server/security/ParticipantSecurity.java b/openvidu-server/src/main/java/org/openvidu/server/security/ParticipantSecurity.java index d5e1db93..c4be89e3 100644 --- a/openvidu-server/src/main/java/org/openvidu/server/security/ParticipantSecurity.java +++ b/openvidu-server/src/main/java/org/openvidu/server/security/ParticipantSecurity.java @@ -38,7 +38,7 @@ public class ParticipantSecurity extends Participant{ if (this.isPublisher()){ super.createPublishingEndpoint(); } else { - throw new OpenViduException(Code.USER_UNAUTHORIZED, + throw new OpenViduException(Code.GENERIC_ERROR_CODE, "Unable to create publisher endpoint"); } }