Files
netbird/browser/wasm/client_js.go
2021-11-15 21:31:28 +01:00

121 lines
2.9 KiB
Go

package main
import (
"context"
"encoding/hex"
"fmt"
"github.com/wiretrustee/wiretrustee/browser/conn"
"github.com/wiretrustee/wiretrustee/signal/client"
"golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/tun/netstack"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
"io"
"log"
"net"
"net/http"
"syscall/js"
"time"
)
func handleError(err error) {
fmt.Printf("Unexpected error. Check console.")
panic(err)
}
func getElementByID(id string) js.Value {
return js.Global().Get("document").Call("getElementById", id)
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
defer cancel()
connectToSignal := func(key wgtypes.Key, remoteKey wgtypes.Key) {
signalClient, err := client.NewWebsocketClient(ctx, "ws://localhost:80/signal", key)
if err != nil {
return
}
time.Sleep(5 * time.Second)
tun, tnet, err := netstack.CreateNetTUN(
[]net.IP{net.ParseIP("10.100.0.2")},
[]net.IP{net.ParseIP("8.8.8.8")},
1420)
b := conn.NewWebRTCBind("chann-1", signalClient, key.PublicKey().String(), remoteKey.String())
dev := device.NewDevice(tun, b, device.NewLogger(device.LogLevelVerbose, ""))
err = dev.IpcSet(fmt.Sprintf("private_key=%s\npublic_key=%s\npersistent_keepalive_interval=10\nendpoint=webrtc://datachannel\nallowed_ip=0.0.0.0/0",
hex.EncodeToString(key[:]),
hex.EncodeToString(remoteKey[:]),
))
log.Println("4")
if err != nil {
log.Panic(err)
}
err = dev.Up()
if err != nil {
log.Panic(err)
}
log.Printf("device started")
client := http.Client{
Transport: &http.Transport{
DialContext: tnet.DialContext,
},
}
resp, err := client.Get("http://localhost:9090/")
if err != nil {
log.Panic(err)
}
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Panic(err)
}
log.Println(string(body))
select {}
}
js.Global().Set("generateWireguardKey", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
key, err := wgtypes.GenerateKey()
if err != nil {
return nil
}
js.Global().Get("document").Call("getElementById", "wgPrivateKey").Set("value", key.String())
log.Printf("Wireguard Public key %s", key.PublicKey().String())
js.Global().Get("document").Call("getElementById", "publicKey").Set("value", key.PublicKey().String())
return nil
}))
js.Global().Set("connect", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
wgPrivateKey := js.Global().Get("document").Call("getElementById", "wgPrivateKey").Get("value").String()
key, err := wgtypes.ParseKey(wgPrivateKey)
if err != nil {
return err
}
remotePublicKey := js.Global().Get("document").Call("getElementById", "peerKey").Get("value").String()
remoteKey, err := wgtypes.ParseKey(remotePublicKey)
if err != nil {
return err
}
log.Printf("Remote Wireguard Public key %s", remoteKey.String())
log.Printf("Our Wireguard Public key %s", key.PublicKey().String())
go connectToSignal(key, remoteKey)
return nil
}))
select {}
}