Commit 845dccc2 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Implement coturn's use-auth-secret.

parent dbec9df2
...@@ -26,9 +26,9 @@ case of Academic and Enterprise networks), then you will need a TURN ...@@ -26,9 +26,9 @@ case of Academic and Enterprise networks), then you will need a TURN
server running on an innocent-looking TCP port. This is the recommended server running on an innocent-looking TCP port. This is the recommended
setup. setup.
You should probably be running your own TURN server — I use *coturn*. The You should probably be running your own TURN server. The address of the
address of the TURN server is configured in the file `data/ice-servers.json`. TURN server is configured in the file `data/ice-servers.json`. It should
It should look like this: look like this:
[ [
{ {
...@@ -36,13 +36,13 @@ It should look like this: ...@@ -36,13 +36,13 @@ It should look like this:
"turn:turn.example.com:443", "turn:turn.example.com:443",
"turn:turn.example.com:443?transport=tcp" "turn:turn.example.com:443?transport=tcp"
], ],
"username": "username", "username": "galene",
"credential": "password" "credential": "secret"
} }
] ]
The port number, username and password should be the same as the ones in If you use coturn's `use-auth-secret` option, set `credentialType` to
your TURN server's configuration. `hmac-sha1`.
## Set up a group ## Set up a group
......
package group package group
import ( import (
"bytes"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"log" "log"
"os" "os"
"sync/atomic" "sync/atomic"
...@@ -29,6 +34,28 @@ func getICEServer(server ICEServer) (webrtc.ICEServer, error) { ...@@ -29,6 +34,28 @@ func getICEServer(server ICEServer) (webrtc.ICEServer, error) {
s.CredentialType = webrtc.ICECredentialTypePassword s.CredentialType = webrtc.ICECredentialTypePassword
case "oauth": case "oauth":
s.CredentialType = webrtc.ICECredentialTypeOauth s.CredentialType = webrtc.ICECredentialTypeOauth
case "hmac-sha1":
cred, ok := server.Credential.(string)
if !ok {
return webrtc.ICEServer{},
errors.New("credential is not a string")
}
ts := time.Now().Unix() + 86400
var username string
if server.Username == "" {
username = fmt.Sprintf("%d", ts)
} else {
username = fmt.Sprintf("%d:%s", ts, server.Username)
}
mac := hmac.New(sha1.New, []byte(cred))
mac.Write([]byte(username))
buf := bytes.Buffer{}
e := base64.NewEncoder(base64.StdEncoding, &buf)
e.Write(mac.Sum(nil))
e.Close()
s.Username = username
s.Credential = string(buf.Bytes())
s.CredentialType = webrtc.ICECredentialTypePassword
default: default:
return webrtc.ICEServer{}, errors.New("unsupported credential type") return webrtc.ICEServer{}, errors.New("unsupported credential type")
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment