forked from openprivacy/connectivity
yank out some Tor stuff that sam3 can handle itself
This commit is contained in:
parent
683120487d
commit
0cc0fb9a99
|
@ -6,6 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/eyedeekay/go-i2pcontrol"
|
"github.com/eyedeekay/go-i2pcontrol"
|
||||||
"github.com/eyedeekay/sam3"
|
"github.com/eyedeekay/sam3"
|
||||||
|
"github.com/eyedeekay/sam3/i2pkeys"
|
||||||
//"github.com/eyedeekay/sam3/helper"
|
//"github.com/eyedeekay/sam3/helper"
|
||||||
"git.openprivacy.ca/openprivacy/connectivity"
|
"git.openprivacy.ca/openprivacy/connectivity"
|
||||||
"git.openprivacy.ca/openprivacy/log"
|
"git.openprivacy.ca/openprivacy/log"
|
||||||
|
@ -58,7 +59,7 @@ func (l *logWriter) Write(p []byte) (int, error) {
|
||||||
return len(p), nil
|
return len(p), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type onionListenService struct {
|
type garlicListenService struct {
|
||||||
os *sam3.StreamListener
|
os *sam3.StreamListener
|
||||||
tp *i2pProvider
|
tp *i2pProvider
|
||||||
}
|
}
|
||||||
|
@ -71,25 +72,25 @@ type i2pProvider struct {
|
||||||
bundeledTorPath string
|
bundeledTorPath string
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
breakChan chan bool
|
breakChan chan bool
|
||||||
childListeners map[string]*onionListenService
|
childListeners map[string]*garlicListenService
|
||||||
statusCallback func(int, string)
|
statusCallback func(int, string)
|
||||||
lastRestartTime time.Time
|
lastRestartTime time.Time
|
||||||
//authenticator tor.Authenticator
|
//authenticator tor.Authenticator
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ols *onionListenService) AddressFull() string {
|
func (ols *garlicListenService) AddressFull() string {
|
||||||
return ols.os.Addr().String()
|
return ols.os.Addr().String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ols *onionListenService) AddressIdentity() string {
|
func (ols *garlicListenService) AddressIdentity() string {
|
||||||
return ols.os.Addr().String()[:56]
|
return ols.os.Addr().String()[:56]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ols *onionListenService) Accept() (net.Conn, error) {
|
func (ols *garlicListenService) Accept() (net.Conn, error) {
|
||||||
return ols.os.Accept()
|
return ols.os.Accept()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ols *onionListenService) Close() {
|
func (ols *garlicListenService) Close() {
|
||||||
ols.tp.unregisterListener(ols.AddressIdentity())
|
ols.tp.unregisterListener(ols.AddressIdentity())
|
||||||
ols.os.Close()
|
ols.os.Close()
|
||||||
}
|
}
|
||||||
|
@ -143,7 +144,7 @@ func (tp *i2pProvider) WaitTillBootstrapped() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tp *i2pProvider) Listen(identity connectivity.PrivateKey, port int) (connectivity.ListenService, error) {
|
func (tp *i2pProvider) Listen(identity connectivity.PrivateKey, port int) (connectivity.ListenService, error) {
|
||||||
var onion = ""
|
var garlic = ""
|
||||||
var privkey ed25519.PrivateKey
|
var privkey ed25519.PrivateKey
|
||||||
|
|
||||||
tp.lock.Lock()
|
tp.lock.Lock()
|
||||||
|
@ -158,14 +159,14 @@ func (tp *i2pProvider) Listen(identity connectivity.PrivateKey, port int) (conne
|
||||||
privkey = pk
|
privkey = pk
|
||||||
gpubk := pk.Public()
|
gpubk := pk.Public()
|
||||||
switch pubk := gpubk.(type) {
|
switch pubk := gpubk.(type) {
|
||||||
case ed25519.PublicKey:
|
case i2pkeys.I2PKeys:
|
||||||
onion = GetTorV3Hostname(pubk)
|
garlic = pubk.Addr().String()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hack around tor detached onions not having a more obvious resume mechanism
|
// Hack around tor detached garlics not having a more obvious resume mechanism
|
||||||
// So we use deterministic ports
|
// So we use deterministic ports
|
||||||
seedbytes := sha3.New224().Sum([]byte(onion))
|
seedbytes := sha3.New224().Sum([]byte(garlic))
|
||||||
localport := int(seedbytes[0]) + (int(seedbytes[1]) << 8)
|
localport := int(seedbytes[0]) + (int(seedbytes[1]) << 8)
|
||||||
if localport < 1024 { // this is not uniformly random, but we don't need it to be
|
if localport < 1024 { // this is not uniformly random, but we don't need it to be
|
||||||
localport += 1024
|
localport += 1024
|
||||||
|
@ -173,20 +174,20 @@ func (tp *i2pProvider) Listen(identity connectivity.PrivateKey, port int) (conne
|
||||||
|
|
||||||
localListener, err := net.Listen("tcp", "127.0.0.1:"+strconv.Itoa(localport))
|
localListener, err := net.Listen("tcp", "127.0.0.1:"+strconv.Itoa(localport))
|
||||||
|
|
||||||
conf := &tor.ListenConf{NoWait: true, Version3: true, Key: identity, RemotePorts: []int{port}, Detach: true, DiscardKey: true, LocalListener: localListener}
|
// conf := &tor.ListenConf{NoWait: true, Version3: true, Key: identity, RemotePorts: []int{port}, Detach: true, DiscardKey: true, LocalListener: localListener}
|
||||||
os, err := tp.t.Listen(nil, conf)
|
// os, err := tp.t.Listen(nil, conf)
|
||||||
if err != nil && strings.Contains(err.Error(), "550 Unspecified Tor error: Onion address collision") {
|
// if err != nil && strings.Contains(err.Error(), "550 Unspecified Tor error: garlic address collision") {
|
||||||
os = &tor.OnionService{Tor: tp.t, LocalListener: localListener, ID: onion, Version3: true, Key: bineed255192.FromCryptoPrivateKey(privkey), ClientAuths: make(map[string]string, 0), RemotePorts: []int{port}}
|
// os = &tor.garlicService{Tor: tp.t, LocalListener: localListener, ID: garlic, Version3: true, Key: bineed255192.FromCryptoPrivateKey(privkey), ClientAuths: make(map[string]string, 0), RemotePorts: []int{port}}
|
||||||
err = nil
|
// err = nil
|
||||||
}
|
// }
|
||||||
// Not set in t.Listen if supplied, we want it to handle this however
|
// Not set in t.Listen if supplied, we want it to handle this however
|
||||||
os.CloseLocalListenerOnClose = true
|
//os.CloseLocalListenerOnClose = true
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ols := &onionListenService{os: os, tp: tp}
|
ols := &garlicListenService{os: garlic, tp: tp}
|
||||||
tp.childListeners[ols.AddressIdentity()] = ols
|
tp.childListeners[ols.AddressIdentity()] = ols
|
||||||
return ols, nil
|
return ols, nil
|
||||||
}
|
}
|
||||||
|
@ -211,7 +212,7 @@ func (tp *i2pProvider) Open(hostname string) (net.Conn, string, error) {
|
||||||
resolvedHostname = addrParts[1]
|
resolvedHostname = addrParts[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, err := tp.dialer.Dial("tcp", resolvedHostname+".onion:9878")
|
conn, err := tp.dialer.Dial("tcp", resolvedHostname+".garlic:9878")
|
||||||
return conn, resolvedHostname, err
|
return conn, resolvedHostname, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,7 +293,7 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe
|
||||||
return nil, fmt.Errorf("Unable to create temp data dir: %v", err)
|
return nil, fmt.Errorf("Unable to create temp data dir: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tp := &i2pProvider{authenticator: authenticator, controlPort: controlPort, appDirectory: appDirectory, bundeledTorPath: bundledTorPath, childListeners: make(map[string]*onionListenService), breakChan: make(chan bool), statusCallback: nil, lastRestartTime: time.Now().Add(-restartCooldown)}
|
tp := &i2pProvider{authenticator: authenticator, controlPort: controlPort, appDirectory: appDirectory, bundeledTorPath: bundledTorPath, childListeners: make(map[string]*garlicListenService), breakChan: make(chan bool), statusCallback: nil, lastRestartTime: time.Now().Add(-restartCooldown)}
|
||||||
|
|
||||||
log.Debugf("launching system tor")
|
log.Debugf("launching system tor")
|
||||||
if err := tp.checkVersion(); err == nil {
|
if err := tp.checkVersion(); err == nil {
|
||||||
|
|
Loading…
Reference in New Issue