48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
package goricochet
|
|
|
|
import (
|
|
"errors"
|
|
"h12.me/socks"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
// NetworkResolver allows a client to resolve various hostnames to connections
|
|
// The supported types are onions address are:
|
|
// * ricochet:jlq67qzo6s4yp3sp
|
|
// * jlq67qzo6s4yp3sp
|
|
// * 127.0.0.1:55555|jlq67qzo6s4yp3sp - Localhost Connection
|
|
type NetworkResolver struct {
|
|
}
|
|
|
|
// Resolve takes a hostname and returns a net.Conn to the derived endpoint
|
|
func (nr *NetworkResolver) Resolve(hostname string) (net.Conn, string, error) {
|
|
if strings.HasPrefix(hostname, "127.0.0.1") {
|
|
addrParts := strings.Split(hostname, "|")
|
|
tcpAddr, err := net.ResolveTCPAddr("tcp", addrParts[0])
|
|
if err != nil {
|
|
return nil, "", errors.New("Cannot Resolve Local TCP Address")
|
|
}
|
|
conn, err := net.DialTCP("tcp", nil, tcpAddr)
|
|
if err != nil {
|
|
return nil, "", errors.New("Cannot Dial Local TCP Address")
|
|
}
|
|
|
|
// return just the onion address, not the local override for the hostname
|
|
return conn, addrParts[1], nil
|
|
}
|
|
|
|
resolvedHostname := hostname
|
|
if strings.HasPrefix(hostname, "ricochet:") {
|
|
addrParts := strings.Split(hostname, ":")
|
|
resolvedHostname = addrParts[1]
|
|
}
|
|
|
|
dialSocksProxy := socks.DialSocksProxy(socks.SOCKS5, "127.0.0.1:9050")
|
|
conn, err := dialSocksProxy("", resolvedHostname+".onion:9878")
|
|
if err != nil {
|
|
return nil, "", errors.New("Cannot Dial Remote Ricochet Address")
|
|
}
|
|
return conn, resolvedHostname, nil
|
|
}
|