2018-07-23 22:18:15 -04:00
|
|
|
package samlistener
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"log"
|
|
|
|
"net"
|
|
|
|
)
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/kpetku/sam3"
|
|
|
|
)
|
|
|
|
|
|
|
|
var SamHost = "127.0.0.1"
|
|
|
|
var SamPort = "7656"
|
|
|
|
var TunName = "ephtun"
|
|
|
|
|
|
|
|
var samConn *sam3.SAM
|
|
|
|
var samKeys sam3.I2PKeys
|
|
|
|
|
|
|
|
var publishStream *sam3.StreamSession
|
|
|
|
var publishListen *sam3.StreamListener
|
|
|
|
var publishConnection net.Conn
|
|
|
|
|
|
|
|
var Target = "127.0.0.1:8081"
|
|
|
|
|
|
|
|
var err error
|
|
|
|
|
|
|
|
func forward(conn net.Conn) {
|
|
|
|
client, err := net.Dial("tcp", Target)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("Dial failed: %v", err)
|
|
|
|
}
|
|
|
|
log.Printf("Connected to localhost %v\n", conn)
|
|
|
|
go func() {
|
|
|
|
defer client.Close()
|
|
|
|
defer conn.Close()
|
|
|
|
io.Copy(client, conn)
|
|
|
|
}()
|
|
|
|
go func() {
|
|
|
|
defer client.Close()
|
|
|
|
defer conn.Close()
|
|
|
|
io.Copy(conn, client)
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
|
|
|
|
func Serve() error {
|
|
|
|
if samConn, err = sam3.NewSAM(SamHost + ":" + SamPort); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
log.Println("SAM Bridge connection established.")
|
|
|
|
if samKeys, err = samConn.NewKeys(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
log.Println("Destination keys generated, tunnel name:", TunName, ".")
|
|
|
|
if publishStream, err = samConn.NewStreamSession(TunName, samKeys, []string{"inbound.length=3", "outbound.length=3",
|
|
|
|
"inbound.lengthVariance=1", "outbound.lengthVariance=1",
|
|
|
|
"inbound.backupQuantity=3", "outbound.backupQuantity=3",
|
|
|
|
"inbound.quantity=8", "outbound.quantity=8"}); err != nil {
|
|
|
|
log.Println("Stream Creation error:", err.Error())
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
log.Println("SAM stream session established.")
|
|
|
|
if publishListen, err = publishStream.Listen(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
log.Println("Starting Listener.")
|
2018-07-26 17:42:11 -04:00
|
|
|
b := string(samKeys.Addr().Base32()))
|
2018-07-23 22:18:15 -04:00
|
|
|
log.Println("SAM Listener created,", b+".b32.i2p")
|
|
|
|
|
|
|
|
for {
|
|
|
|
conn, err := publishListen.Accept()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("ERROR: failed to accept listener: %v", err)
|
|
|
|
}
|
|
|
|
log.Printf("Accepted connection %v\n", conn)
|
|
|
|
go forward(conn)
|
|
|
|
}
|
|
|
|
}
|