From 74ffb6f98f7ee8b4e61743919ab20460c57ad4da Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Sun, 16 Apr 2017 21:14:31 -0400 Subject: Implement GET /webrtc/token endpoint for APIv4 (#6046) --- app/webrtc.go | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 app/webrtc.go (limited to 'app/webrtc.go') diff --git a/app/webrtc.go b/app/webrtc.go new file mode 100644 index 000000000..6692fff60 --- /dev/null +++ b/app/webrtc.go @@ -0,0 +1,87 @@ +// Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package app + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/tls" + "encoding/base64" + "net/http" + "strconv" + "strings" + "time" + + "github.com/mattermost/platform/model" + "github.com/mattermost/platform/utils" +) + +func GetWebrtcInfoForSession(sessionId string) (*model.WebrtcInfoResponse, *model.AppError) { + token, err := GetWebrtcToken(sessionId) + if err != nil { + return nil, err + } + + result := &model.WebrtcInfoResponse{ + Token: token, + GatewayUrl: *utils.Cfg.WebrtcSettings.GatewayWebsocketUrl, + } + + if len(*utils.Cfg.WebrtcSettings.StunURI) > 0 { + result.StunUri = *utils.Cfg.WebrtcSettings.StunURI + } + + if len(*utils.Cfg.WebrtcSettings.TurnURI) > 0 { + timestamp := strconv.FormatInt(utils.EndOfDay(time.Now().AddDate(0, 0, 1)).Unix(), 10) + username := timestamp + ":" + *utils.Cfg.WebrtcSettings.TurnUsername + + result.TurnUri = *utils.Cfg.WebrtcSettings.TurnURI + result.TurnPassword = GenerateTurnPassword(username, *utils.Cfg.WebrtcSettings.TurnSharedKey) + result.TurnUsername = username + } + + return result, nil +} + +func GetWebrtcToken(sessionId string) (string, *model.AppError) { + if !*utils.Cfg.WebrtcSettings.Enable { + return "", model.NewAppError("WebRTC.getWebrtcToken", "api.webrtc.disabled.app_error", nil, "", http.StatusNotImplemented) + } + + token := base64.StdEncoding.EncodeToString([]byte(sessionId)) + + data := make(map[string]string) + data["janus"] = "add_token" + data["token"] = token + data["transaction"] = model.NewId() + data["admin_secret"] = *utils.Cfg.WebrtcSettings.GatewayAdminSecret + + rq, _ := http.NewRequest("POST", *utils.Cfg.WebrtcSettings.GatewayAdminUrl, strings.NewReader(model.MapToJson(data))) + rq.Header.Set("Content-Type", "application/json") + + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: *utils.Cfg.ServiceSettings.EnableInsecureOutgoingConnections}, + } + httpClient := &http.Client{Transport: tr} + if rp, err := httpClient.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 CloseBody(rp) + return "", model.AppErrorFromJson(rp.Body) + } else { + janusResponse := model.GatewayResponseFromJson(rp.Body) + if janusResponse.Status != "success" { + return "", model.NewAppError("getWebrtcToken", "api.webrtc.register_token.app_error", nil, "", http.StatusInternalServerError) + } + } + + return token, nil +} + +func GenerateTurnPassword(username string, secret string) string { + key := []byte(secret) + h := hmac.New(sha1.New, key) + h.Write([]byte(username)) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} -- cgit v1.2.3-1-g7c22