summaryrefslogtreecommitdiff
path: root/pkg/snowflake/bootstrap.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/snowflake/bootstrap.go')
-rw-r--r--pkg/snowflake/bootstrap.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/pkg/snowflake/bootstrap.go b/pkg/snowflake/bootstrap.go
new file mode 100644
index 0000000..0f370fa
--- /dev/null
+++ b/pkg/snowflake/bootstrap.go
@@ -0,0 +1,101 @@
+package snowflake
+
+import (
+ "context"
+ "crypto/tls"
+ "crypto/x509"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "net/http"
+ "os"
+ "time"
+
+ "0xacab.org/leap/bitmask-vpn/pkg/config"
+ "github.com/cretz/bine/tor"
+)
+
+const torrc = `UseBridges 1
+DataDirectory datadir
+
+ClientTransportPlugin snowflake exec /usr/local/bin/snowflake-client \
+-url https://snowflake-broker.torproject.net.global.prod.fastly.net/ -front cdn.sstatic.net \
+-ice stun:stun.voip.blackberry.com:3478,stun:stun.altar.com.pl:3478,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.com:3478,stun:stun.sonetel.net:3478,stun:stun.stunprotocol.org:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478 \
+-max 3
+
+Bridge snowflake 0.0.3.0:1`
+
+func writeTorrc() string {
+ f, err := ioutil.TempFile("", "torrc-snowflake-")
+ if err != nil {
+ log.Println(err)
+ }
+ f.Write([]byte(torrc))
+ return f.Name()
+}
+
+func BootstrapWithSnowflakeProxies() error {
+ rcfile := writeTorrc()
+ conf := &tor.StartConf{DebugWriter: os.Stdout, TorrcFile: rcfile}
+
+ fmt.Println("Starting Tor and fetching files to bootstrap VPN tunnel...")
+ fmt.Println("")
+
+ t, err := tor.Start(nil, conf)
+ if err != nil {
+ return err
+ }
+ defer t.Close()
+
+ // Wait at most 5 minutes
+ dialCtx, dialCancel := context.WithTimeout(context.Background(), time.Minute*10)
+ defer dialCancel()
+ dialer, err := t.Dialer(dialCtx, nil)
+ if err != nil {
+ return err
+ }
+
+ /*
+ regClient := &http.Client{
+ Transport: &http.Transport{
+ DialContext: dialer.DialContext,
+ },
+ Timeout: time.Minute * 5,
+ }
+ */
+ //fetchFile(regClient, "https://wtfismyip.com/json")
+
+ certs := x509.NewCertPool()
+ certs.AppendCertsFromPEM(config.CaCert)
+
+ apiClient := &http.Client{
+ Transport: &http.Transport{
+ TLSClientConfig: &tls.Config{
+ RootCAs: certs,
+ },
+ DialContext: dialer.DialContext,
+ },
+ Timeout: time.Minute * 5,
+ }
+
+ // XXX parametrize these urls
+ fetchFile(apiClient, "https://api.black.riseup.net/3/config/eip-service.json")
+ fetchFile(apiClient, "https://api.black.riseup.net/3/cert")
+
+ return nil
+}
+
+func fetchFile(client *http.Client, uri string) error {
+ resp, err := client.Get(uri)
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+
+ c, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ log.Println(err)
+ }
+ fmt.Println(string(c))
+ return nil
+}