mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-19 16:56:39 +00:00
121 lines
2.9 KiB
Go
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 {}
|
|
}
|