diff options
author | Simon Eisenmann <simon@longsleep.org> | 2017-10-16 17:11:03 +0200 |
---|---|---|
committer | George Goldberg <george@gberg.me> | 2017-10-16 16:11:03 +0100 |
commit | 868bd76f404158763f54d59f2c7284fe1a4029c8 (patch) | |
tree | 648deb910754acabf8bdf22e06ab9fcfed76ef0f /app | |
parent | 34285d8cca93fc0f473636e78680fade03f26bda (diff) | |
download | chat-868bd76f404158763f54d59f2c7284fe1a4029c8.tar.gz chat-868bd76f404158763f54d59f2c7284fe1a4029c8.tar.bz2 chat-868bd76f404158763f54d59f2c7284fe1a4029c8.zip |
PLT-7809: Add support for Kopano Webmeetings WebRTC server (#7590)
* Add support for Kopano Webmeetings WebRTC server
Add an option to select which WebRTC server to use and add support to
use Kopano Webmeetings as backend instead of Janus. If the new
configuration is not set, WebRTC assumes Janus is used as backend.
* Fixup: remove redundant case. default to janus
* Fixup: use GatewayAdminUrl as direct prefix to admin URL entry point
* Fixup: consumeAndClose
Diffstat (limited to 'app')
-rw-r--r-- | app/webrtc.go | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/app/webrtc.go b/app/webrtc.go index 2d0bb0708..d8684f1fd 100644 --- a/app/webrtc.go +++ b/app/webrtc.go @@ -23,8 +23,9 @@ func GetWebrtcInfoForSession(sessionId string) (*model.WebrtcInfoResponse, *mode } result := &model.WebrtcInfoResponse{ - Token: token, - GatewayUrl: *utils.Cfg.WebrtcSettings.GatewayWebsocketUrl, + Token: token, + GatewayUrl: *utils.Cfg.WebrtcSettings.GatewayWebsocketUrl, + GatewayType: *utils.Cfg.WebrtcSettings.GatewayType, } if len(*utils.Cfg.WebrtcSettings.StunURI) > 0 { @@ -48,6 +49,16 @@ func GetWebrtcToken(sessionId string) (string, *model.AppError) { return "", model.NewAppError("WebRTC.getWebrtcToken", "api.webrtc.disabled.app_error", nil, "", http.StatusNotImplemented) } + switch strings.ToLower(*utils.Cfg.WebrtcSettings.GatewayType) { + case "kopano-webmeetings": + return GetKopanoWebmeetingsWebrtcToken(sessionId) + default: + // Default to Janus. + return GetJanusWebrtcToken(sessionId) + } +} + +func GetJanusWebrtcToken(sessionId string) (string, *model.AppError) { token := base64.StdEncoding.EncodeToString([]byte(sessionId)) data := make(map[string]string) @@ -65,7 +76,7 @@ func GetWebrtcToken(sessionId string) (string, *model.AppError) { defer consumeAndClose(rp) return "", model.AppErrorFromJson(rp.Body) } else { - janusResponse := model.GatewayResponseFromJson(rp.Body) + janusResponse := model.JanusGatewayResponseFromJson(rp.Body) if janusResponse.Status != "success" { return "", model.NewAppError("getWebrtcToken", "api.webrtc.register_token.app_error", nil, "", http.StatusInternalServerError) } @@ -74,6 +85,29 @@ func GetWebrtcToken(sessionId string) (string, *model.AppError) { return token, nil } +func GetKopanoWebmeetingsWebrtcToken(sessionId string) (string, *model.AppError) { + data := make(map[string]string) + data["type"] = "Token" + data["id"] = sessionId + + rq, _ := http.NewRequest("POST", *utils.Cfg.WebrtcSettings.GatewayAdminUrl+"/auth/tokens", strings.NewReader(model.MapToJson(data))) + rq.Header.Set("Content-Type", "application/json") + rq.Header.Set("Authorization", "Bearer "+*utils.Cfg.WebrtcSettings.GatewayAdminSecret) + + if rp, err := utils.HttpClient(true).Do(rq); err != nil { + return "", model.NewAppError("WebRTC.Token", "model.client.connecting.app_error", nil, err.Error(), http.StatusInternalServerError) + } else if rp.StatusCode >= 300 { + defer consumeAndClose(rp) + return "", model.AppErrorFromJson(rp.Body) + } else { + kwmResponse := model.KopanoWebmeetingsResponseFromJson(rp.Body) + if kwmResponse.Value == "" { + return "", model.NewAppError("getWebrtcToken", "api.webrtc.register_token.app_error", nil, "", http.StatusInternalServerError) + } + return kwmResponse.Value, nil + } +} + func GenerateTurnPassword(username string, secret string) string { key := []byte(secret) h := hmac.New(sha1.New, key) |