refactored server <-> server

This commit is contained in:
Zack Scholl 2019-11-12 12:48:52 -08:00
parent 3fe85541e3
commit f6869c4dca
1 changed files with 73 additions and 175 deletions

View File

@ -78,190 +78,17 @@ func New(ops Options) (c *Client, err error) {
log.SetLevel("info")
}
// connect to relay and determine
// whether it is receiver or offerer
// connect to relay and exchange info
err = c.connectToRelay()
if err != nil {
return
}
// // initialize pake
// if c.IsOfferer {
// c.Pake, err = pake.Init([]byte(c.Options.SharedSecret), 0, elliptic.P521(), 1*time.Microsecond)
// } else {
// c.Pake, err = pake.Init([]byte(c.Options.SharedSecret), 1, elliptic.P521(), 1*time.Microsecond)
// }
// if err != nil {
// return
// }
// if c.IsOfferer {
// // offerer sends the first pake
// c.SendWebsocketMessage(WebsocketMessage{
// Message: "pake",
// Payload: base64.StdEncoding.EncodeToString(c.Pake.Bytes()),
// }, false)
// } else {
// // answerer receives the first pake
// err = c.getPAKE(true)
// if err != nil {
// log.Error(err)
// return
// }
// }
// // one more exchange to finish (offerer must send)
// err = c.getPAKE(c.IsOfferer)
// if err != nil {
// log.Error(err)
// return
// }
// log.Debug(c.Pake.SessionKey())
// // generate the session key for encryption
// pakeSessionKey, err := c.Pake.SessionKey()
// if err != nil {
// log.Error(err)
// return
// }
// c.Key, err = crypt.New(pakeSessionKey, []byte(c.Options.SharedSecret))
// if err != nil {
// log.Error(err)
// return
// }
// // create webrtc connection
// finished := make(chan error, 1)
// c.rtc, err = c.CreateOfferer(finished)
// if err != nil {
// log.Error(err)
// }
// offer, err := c.rtc.CreateOffer(nil)
// if err != nil {
// log.Error(err)
// return
// }
// if c.IsOfferer {
// // Now, create an offer
// err = c.rtc.SetLocalDescription(offer)
// if err != nil {
// log.Error(err)
// return
// }
// // bundle it and send it over
// var offerJSON []byte
// offerJSON, err = json.Marshal(offer)
// if err != nil {
// log.Error(err)
// }
// err = c.SendWebsocketMessage(
// WebsocketMessage{
// Message: "offer",
// Payload: base64.StdEncoding.EncodeToString(offerJSON),
// },
// true,
// )
// if err != nil {
// log.Error(err)
// return
// }
// // wait for the answer
// var wsmsg WebsocketMessage
// wsmsg, err = c.ReceiveWebsocketMessage(true)
// var payload []byte
// payload, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
// err = setRemoteDescription(c.rtc, payload)
// if err != nil {
// log.Error(err)
// return
// }
// } else {
// // wait for the offer
// var wsmsg WebsocketMessage
// wsmsg, err = c.ReceiveWebsocketMessage(true)
// var payload []byte
// payload, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
// err = setRemoteDescription(c.rtc, payload)
// if err != nil {
// log.Error(err)
// return
// }
// var answer webrtc.SessionDescription
// answer, err = c.rtc.CreateAnswer(nil)
// if err != nil {
// log.Error(err)
// return
// }
// err = c.rtc.SetLocalDescription(answer)
// if err != nil {
// log.Error(err)
// return
// }
// // bundle it and send it over
// var answerJSON []byte
// answerJSON, err = json.Marshal(answer)
// if err != nil {
// log.Error(err)
// }
// err = c.SendWebsocketMessage(
// WebsocketMessage{
// Message: "answer",
// Payload: base64.StdEncoding.EncodeToString(answerJSON),
// },
// true,
// )
// if err != nil {
// log.Error(err)
// return
// }
// }
// err = <-finished
return
}
// func (c *Client) getPAKE(keepSending bool) (err error) {
// // answerer receives the first pake
// p, err := c.ReceiveWebsocketMessage(false)
// if err != nil {
// log.Error(err)
// return
// }
// payload, err := base64.StdEncoding.DecodeString(p.Payload)
// if err != nil {
// log.Error(err)
// return
// }
// log.Debugf("payload: %s", payload)
// err = c.Pake.Update(payload)
// if err != nil {
// log.Error(err)
// return
// }
// if keepSending {
// // sends back PAKE bytes
// err = c.SendWebsocketMessage(WebsocketMessage{
// Message: "pake",
// Payload: base64.StdEncoding.EncodeToString(c.Pake.Bytes()),
// }, false)
// }
// return
// }
// Send will send the specified file
func (c *Client) Send(options TransferOptions) (err error) {
return
}
// Receiver will receive the file
// Receive will receive the file
func (c *Client) Receive() (err error) {
return
}
@ -276,6 +103,13 @@ func (c *Client) connectToRelay() (err error) {
return
}
// // create webrtc connection
finished := make(chan error, 1)
c.rtc, err = c.CreateOfferer(finished)
if err != nil {
log.Error(err)
}
log.Debugf("connected and sending first message")
bundled, err := box.Bundle(WebsocketMessage{
Message: "[1] you are offerer",
@ -377,6 +211,69 @@ func (c *Client) connectToRelay() (err error) {
return
}
log.Debugf("key: %x", c.Key)
// create offer and send it over
var offer webrtc.SessionDescription
offer, err = c.rtc.CreateOffer(nil)
if err != nil {
log.Error(err)
return
}
err = c.rtc.SetLocalDescription(offer)
if err != nil {
log.Error(err)
return
}
var offerJSON []byte
offerJSON, err = json.Marshal(offer)
if err != nil {
log.Error(err)
return
}
wsreply.Message = "[7] offer"
wsreply.Payload = base64.StdEncoding.EncodeToString(offerJSON)
if err != nil {
log.Error(err)
return
}
} else if wsmsg.Message == "[7] offer" {
// create webrtc answer and send it over
var payload []byte
payload, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
err = setRemoteDescription(c.rtc, payload)
if err != nil {
log.Error(err)
return
}
var answer webrtc.SessionDescription
answer, err = c.rtc.CreateAnswer(nil)
if err != nil {
log.Error(err)
return
}
err = c.rtc.SetLocalDescription(answer)
if err != nil {
log.Error(err)
return
}
// bundle it and send it over
var answerJSON []byte
answerJSON, err = json.Marshal(answer)
if err != nil {
log.Error(err)
}
wsreply.Message = "[8] answer"
wsreply.Payload = base64.StdEncoding.EncodeToString(answerJSON)
} else if wsmsg.Message == "[8] answer" {
var payload []byte
payload, err = base64.StdEncoding.DecodeString(wsmsg.Payload)
err = setRemoteDescription(c.rtc, payload)
if err != nil {
log.Error(err)
return
}
} else {
log.Debug("unknown: %s", wsmsg)
}
@ -391,6 +288,7 @@ func (c *Client) connectToRelay() (err error) {
}
}
}
err = <-finished
return
}