package turn
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"net"
"strconv"
"strings"
"time"
"github.com/pion/logging"
)
func GenerateLongTermCredentials (sharedSecret string , duration time .Duration ) (string , string , error ) {
t := time .Now ().Add (duration ).Unix ()
username := strconv .FormatInt (t , 10 )
password , err := longTermCredentials (username , sharedSecret )
return username , password , err
}
func GenerateLongTermTURNRESTCredentials (sharedSecret string , user string , duration time .Duration ) (
string ,
string ,
error ,
) {
t := time .Now ().Add (duration ).Unix ()
timestamp := strconv .FormatInt (t , 10 )
username := timestamp + ":" + user
password , err := longTermCredentials (username , sharedSecret )
return username , password , err
}
func longTermCredentials(username string , sharedSecret string ) (string , error ) {
mac := hmac .New (sha1 .New , []byte (sharedSecret ))
_ , err := mac .Write ([]byte (username ))
if err != nil {
return "" , err
}
password := mac .Sum (nil )
return base64 .StdEncoding .EncodeToString (password ), nil
}
func NewLongTermAuthHandler (sharedSecret string , logger logging .LeveledLogger ) AuthHandler {
if logger == nil {
logger = logging .NewDefaultLoggerFactory ().NewLogger ("turn" )
}
return func (username , realm string , srcAddr net .Addr ) (key []byte , ok bool ) {
logger .Tracef ("Authentication username=%q realm=%q srcAddr=%v" , username , realm , srcAddr )
t , err := strconv .Atoi (username )
if err != nil {
logger .Errorf ("Invalid time-windowed username %q" , username )
return nil , false
}
if int64 (t ) < time .Now ().Unix () {
logger .Errorf ("Expired time-windowed username %q" , username )
return nil , false
}
password , err := longTermCredentials (username , sharedSecret )
if err != nil {
logger .Error (err .Error())
return nil , false
}
return GenerateAuthKey (username , realm , password ), true
}
}
func LongTermTURNRESTAuthHandler (sharedSecret string , logger logging .LeveledLogger ) AuthHandler {
if logger == nil {
logger = logging .NewDefaultLoggerFactory ().NewLogger ("turn" )
}
return func (username , realm string , srcAddr net .Addr ) (key []byte , ok bool ) {
logger .Tracef ("Authentication username=%q realm=%q srcAddr=%v" , username , realm , srcAddr )
timestamp := strings .Split (username , ":" )[0 ]
t , err := strconv .Atoi (timestamp )
if err != nil {
logger .Errorf ("Invalid time-windowed username %q" , username )
return nil , false
}
if int64 (t ) < time .Now ().Unix () {
logger .Errorf ("Expired time-windowed username %q" , username )
return nil , false
}
password , err := longTermCredentials (username , sharedSecret )
if err != nil {
logger .Error (err .Error())
return nil , false
}
return GenerateAuthKey (username , realm , password ), true
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .