From d72063b97df0b256e3e5a859e74ea01f2bfe39fc Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Fri, 21 Jun 2019 13:16:10 +0200 Subject: [PATCH] openvidu-server: webhook properties --- .../io/openvidu/server/cdr/CDREventName.java | 2 +- .../server/config/OpenviduConfig.java | 148 ++++++++++++++++-- ...itional-spring-configuration-metadata.json | 30 +++- .../src/main/resources/application.properties | 22 +-- 4 files changed, 175 insertions(+), 27 deletions(-) diff --git a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventName.java b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventName.java index a8d849f0..4fa8813d 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventName.java +++ b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventName.java @@ -19,6 +19,6 @@ package io.openvidu.server.cdr; public enum CDREventName { - sessionCreated, sessionDestroyed, participantJoined, participantLeft, webrtcConnectionCreated, webrtcConnectionDestroyed, recordingStarted, recordingStopped + sessionCreated, sessionDestroyed, participantJoined, participantLeft, webrtcConnectionCreated, webrtcConnectionDestroyed, recordingStarted, recordingStopped, recordingStatusChanged } diff --git a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java index 4f2ea004..67871e57 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java +++ b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java @@ -17,9 +17,18 @@ package io.openvidu.server.config; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; import java.util.List; +import javax.annotation.PostConstruct; + +import org.apache.http.Header; +import org.apache.http.message.BasicHeader; import org.kurento.jsonrpc.JsonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.info.BuildProperties; @@ -30,18 +39,19 @@ import com.google.gson.JsonElement; import com.google.gson.JsonParser; import io.openvidu.java.client.OpenViduRole; +import io.openvidu.server.cdr.CDREventName; @Component public class OpenviduConfig { + private static final Logger log = LoggerFactory.getLogger(OpenviduConfig.class); + @Autowired BuildProperties buildProperties; @Value("${kms.uris}") private String kmsUris; - private List kmsUrisList; - @Value("${openvidu.publicurl}") private String openviduPublicUrl; // local, docker, [FINAL_URL] @@ -53,7 +63,7 @@ public class OpenviduConfig { @Value("${openvidu.cdr}") private boolean openviduCdr; - + @Value("${openvidu.cdr.path}") private String openviduCdrPath; @@ -81,6 +91,18 @@ public class OpenviduConfig { @Value("${openvidu.recording.composed-url}") private String openviduRecordingComposedUrl; + @Value("${openvidu.webhook}") + private boolean openviduWebhook; + + @Value("${openvidu.webhook.endpoint}") + private String openviduWebhookEndpoint; + + @Value("${openvidu.webhook.headers}") + private String openviduWebhookHeaders; + + @Value("${openvidu.webhook.events}") + private String openviduWebhookEvents; + @Value("${openvidu.streams.video.max-recv-bandwidth}") private int openviduStreamsVideoMaxRecvBandwidth; @@ -109,18 +131,48 @@ public class OpenviduConfig { private String springProfile; private String finalUrl; + private List kmsUrisList; + private List
webhookHeadersList; + private List webhookEventsList; + + @PostConstruct + public void init() { + try { + this.initiateKmsUris(); + } catch (Exception e) { + log.error("Error in 'kms.uris' system property: " + e.getMessage()); + log.error("Shutting down OpenVidu Server"); + System.exit(1); + } + if (this.isWebhookEnabled()) { + log.info("OpenVidu Webhook service enabled"); + try { + new URL(this.openviduWebhookEndpoint); + log.info("OpenVidu Webhook endpoint is {}", this.getOpenViduWebhookEndpoint()); + } catch (MalformedURLException e) { + log.error("Error in 'openvidu.webhook.endpoint' system property. Malformed URL: " + e.getMessage()); + log.error("Shutting down OpenVidu Server"); + System.exit(1); + } + try { + this.initiateOpenViduWebhookHeaders(); + } catch (Exception e) { + log.error("Error in 'openvidu.webhook.headers' system property: " + e.getMessage()); + log.error("Shutting down OpenVidu Server"); + System.exit(1); + } + try { + this.initiateOpenViduWebhookEvents(); + } catch (Exception e) { + log.error("Error in 'openvidu.webhook.events' system property: " + e.getMessage()); + log.error("Shutting down OpenVidu Server"); + System.exit(1); + } + } + } public List getKmsUris() { - if (kmsUrisList == null) { - this.kmsUris = this.kmsUris.replaceAll("\\s", ""); - JsonParser parser = new JsonParser(); - JsonElement elem = parser.parse(this.kmsUris); - JsonArray kmsUris = elem.getAsJsonArray(); - this.kmsUrisList = JsonUtils.toStringList(kmsUris); - return this.kmsUrisList; - } else { - return this.kmsUrisList; - } + return this.kmsUrisList; } public String getOpenViduPublicUrl() { @@ -142,7 +194,7 @@ public class OpenviduConfig { public boolean isCdrEnabled() { return this.openviduCdr; } - + public String getOpenviduCdrPath() { return this.openviduCdrPath; } @@ -232,6 +284,22 @@ public class OpenviduConfig { return this.openviduRecordingComposedUrl; } + public boolean isWebhookEnabled() { + return this.openviduWebhook; + } + + public String getOpenViduWebhookEndpoint() { + return this.openviduWebhookEndpoint; + } + + public List
getOpenViduWebhookHeaders() { + return this.webhookHeadersList; + } + + public List getOpenViduWebhookEvents() { + return this.webhookEventsList; + } + public OpenViduRole[] getRolesFromRecordingNotification() { OpenViduRole[] roles; switch (this.openviduRecordingNotification) { @@ -265,4 +333,56 @@ public class OpenviduConfig { return this.buildProperties.getVersion(); } + private void initiateKmsUris() throws Exception { + if (kmsUrisList == null) { + this.kmsUris = this.kmsUris.replaceAll("\\s", ""); + JsonParser parser = new JsonParser(); + JsonElement elem = parser.parse(this.kmsUris); + JsonArray kmsUris = elem.getAsJsonArray(); + this.kmsUrisList = JsonUtils.toStringList(kmsUris); + } + } + + private void initiateOpenViduWebhookHeaders() throws Exception { + if (webhookHeadersList == null) { + JsonParser parser = new JsonParser(); + JsonElement elem = parser.parse(this.openviduWebhookHeaders); + JsonArray headersJsonArray = elem.getAsJsonArray(); + this.webhookHeadersList = new ArrayList<>(); + + for (JsonElement jsonElement : headersJsonArray) { + String headerString = jsonElement.getAsString(); + String[] headerSplit = headerString.split(": ", 2); + if (headerSplit.length != 2) { + throw new Exception("HTTP header '" + headerString + + "' syntax is not correct. Must be 'HEADER_NAME: HEADER_VALUE'. For example: 'Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l'"); + } + String headerName = headerSplit[0]; + String headerValue = headerSplit[1]; + this.webhookHeadersList.add(new BasicHeader(headerName, headerValue)); + } + log.info("OpenVidu Webhook headers: {}", this.getOpenViduWebhookHeaders().toString()); + } + } + + private void initiateOpenViduWebhookEvents() throws Exception { + if (webhookEventsList == null) { + JsonParser parser = new JsonParser(); + JsonElement elem = parser.parse(this.openviduWebhookEvents); + JsonArray eventsJsonArray = elem.getAsJsonArray(); + this.webhookEventsList = new ArrayList<>(); + + for (JsonElement jsonElement : eventsJsonArray) { + String eventString = jsonElement.getAsString(); + try { + CDREventName.valueOf(eventString); + } catch (IllegalArgumentException e) { + throw new Exception("Event name '" + eventString + "' does not exist"); + } + this.webhookEventsList.add(CDREventName.valueOf(eventString)); + } + log.info("OpenVidu Webhook events: {}", this.getOpenViduWebhookEvents().toString()); + } + } + } diff --git a/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json index fc78df41..1ce92adc 100644 --- a/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -78,10 +78,28 @@ "defaultValue": "" }, { - "name": "coturn.sqlite", + "name": "openvidu.webhook", + "type": "java.lang.Boolean", + "description": "'true' to enable OpenVidu Server Webhook service. 'false' otherwise", + "defaultValue": false + }, + { + "name": "openvidu.webhook.endpoint", "type": "java.lang.String", - "description": "Path to COTURN sqlite database to add and remove TURN user credentials", - "defaultValue": "/opt/openvidu/coturn/turndb" + "description": "HTTP endpoint where OpenVidu Server will send Webhook HTTP POST messages", + "defaultValue": "" + }, + { + "name": "openvidu.webhook.headers", + "type": "java.lang.String", + "description": "List of headers that OpenVidu Server Webhook service will attach to HTTP POST messages", + "defaultValue": "[]" + }, + { + "name": "openvidu.webhook.events", + "type": "java.lang.String", + "description": "List of events that will be sent by OpenVidu Server Webhook service", + "defaultValue": "[\"sessionCreated\",\"sessionDestroyed\",\"participantJoined\",\"participantLeft\",\"webrtcConnectionCreated\",\"webrtcConnectionDestroyed\",\"recordingStatusChanged\"]" }, { "name": "openvidu.streams.video.max-recv-bandwidth", @@ -131,6 +149,12 @@ "description": "Timeout in seconds when OpenVidu Server is connecting to Redis database to store TURN credentials", "defaultValue": 30 }, + { + "name": "coturn.sqlite", + "type": "java.lang.String", + "description": "Path to COTURN sqlite database to add and remove TURN user credentials", + "defaultValue": "/opt/openvidu/coturn/turndb" + }, { "name": "jsonRpcClientWebSocket.reconnectionDelay", "type": "java.lang.Integer", diff --git a/openvidu-server/src/main/resources/application.properties b/openvidu-server/src/main/resources/application.properties index d373f452..037cb831 100644 --- a/openvidu-server/src/main/resources/application.properties +++ b/openvidu-server/src/main/resources/application.properties @@ -1,23 +1,29 @@ server.address: 0.0.0.0 server.ssl.enabled: true -openvidu.recording.version: 2.9.0 -logging.level.root: info -spring.main.allow-bean-definition-overriding: true - - - server.port: 4443 server.ssl.key-store: classpath:openvidu-selfsigned.jks server.ssl.key-store-password: openvidu server.ssl.key-store-type: JKS server.ssl.key-alias: openvidu-selfsigned -openvidu.secret: MY_SECRET +logging.level.root: info +spring.main.allow-bean-definition-overriding: true + +kms.uris: [\"ws://localhost:8888/kurento\"] + openvidu.publicurl: local +openvidu.secret: MY_SECRET + openvidu.cdr: false openvidu.cdr.path: log +openvidu.webhook: true +openvidu.webhook.endpoint: https://localhost/openvidu-endpoint +openvidu.webhook.headers: [\"Authorization:\ Basic\ T1BFTlZJRFVBUFA6TVlfU0VDUkVU\"] +openvidu.webhook.events: [\"sessionCreated\",\"sessionDestroyed\",\"recordingStatusChanged\"] + openvidu.recording: false +openvidu.recording.version: 2.9.0 openvidu.recording.path: /opt/openvidu/recordings openvidu.recording.public-access: false openvidu.recording.notification: publisher_moderator @@ -30,8 +36,6 @@ openvidu.streams.video.min-recv-bandwidth: 300 openvidu.streams.video.max-send-bandwidth: 1000 openvidu.streams.video.min-send-bandwidth: 300 -kms.uris: [\"ws://localhost:8888/kurento\"] - coturn.redis.ip: 127.0.0.1 coturn.redis.dbname: 0 coturn.redis.password: turn