diff --git a/conn/conn.go b/conn/conn.go index c5c3919..4c50e85 100644 --- a/conn/conn.go +++ b/conn/conn.go @@ -2,8 +2,12 @@ package conn import ( "bufio" - "github.com/eyedeekay/sam3" "os" + "path/filepath" +) + +import ( + "github.com/eyedeekay/sam3" ) type Conn struct { @@ -12,10 +16,22 @@ type Conn struct { *sam3.StreamSession *sam3.SAMConn path string + name string } func (c Conn) FindKeys() bool { - return false + if _, err := os.Stat(c.Path()); os.IsNotExist(err) { + if _, err := os.Stat(c.path); os.IsNotExist(err) { + os.MkdirAll(c.path, os.ModeDir) + } + return false + } + return true +} + +func (c Conn) Path() string { + p := filepath.Join(c.path, c.name) + return p } func (c Conn) SaveKeys() (sam3.I2PKeys, error) { @@ -24,7 +40,7 @@ func (c Conn) SaveKeys() (sam3.I2PKeys, error) { if err != nil { return sam3.I2PKeys{}, err } - f, err := os.Create(c.path) + f, err := os.Create(c.Path()) if err != nil { return sam3.I2PKeys{}, err } @@ -39,7 +55,17 @@ func (c Conn) SaveKeys() (sam3.I2PKeys, error) { } func (c Conn) LoadKeys() (sam3.I2PKeys, error) { - //sam3.LoadKeysIncompat(filereader) + var err error + f, err := os.Open(c.Path()) + if err != nil { + return sam3.I2PKeys{}, err + } + defer f.Close() + filereader := bufio.NewReader(f) + c.I2PKeys, err = sam3.LoadKeysIncompat(filereader) + if err != nil { + return sam3.I2PKeys{}, err + } return c.I2PKeys, nil } @@ -64,7 +90,8 @@ func NewConn(sam *sam3.SAM, addr, path string, opts []string) (*Conn, error) { var c Conn var err error c.SAM = sam - c.path = path + addr + ".i2pkeys" + c.path = path + c.name = addr + ".i2pkeys" c.I2PKeys, err = c.Keys() if err != nil { return nil, err diff --git a/main.go b/main.go index c13d6fa..1e5df21 100644 --- a/main.go +++ b/main.go @@ -138,7 +138,14 @@ func main() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) - if tunsocks, tunerr := tunmanager.NewManager(config.SamHost, config.SamPort, config.SaveDirectory, config.Print()); tunerr == nil { + if tunsocks, tunerr := tunmanager.NewManager( + config.TargetHost, + config.TargetPort, + config.SamHost, + config.SamPort, + config.SaveDirectory, + config.Print(), + ); tunerr == nil { go func() { for sig := range c { if sig == os.Interrupt { diff --git a/socks/manager.go b/socks/manager.go index 8e9ebf6..d3ff456 100644 --- a/socks/manager.go +++ b/socks/manager.go @@ -71,8 +71,10 @@ func (m Manager) Cleanup() error { return m.SAM.Close() } -func NewManager(samhost, samport, datadir string, samopts []string) (*Manager, error) { +func NewManager(host, port, samhost, samport, datadir string, samopts []string) (*Manager, error) { return NewManagerFromOptions( + SetSocksHost(host), + SetSocksPort(port), SetHost(samhost), SetPort(samport), SetDataDir(datadir), diff --git a/socks/manager_options.go b/socks/manager_options.go index e04c3e6..c944f43 100644 --- a/socks/manager_options.go +++ b/socks/manager_options.go @@ -39,6 +39,29 @@ func SetPort(v string) func(*Manager) error { } } +//SetSocksHost sets the host of the client's SAM bridge +func SetHost(s string) func(*Manager) error { + return func(c *Manager) error { + c.host = s + return nil + } +} + +//SetSocksPort sets the port of the client's SAM bridge +func SetPort(v string) func(*Manager) error { + return func(c *Manager) error { + port, err := strconv.Atoi(v) + if err != nil { + return fmt.Errorf("Invalid port; non-number.") + } + if port < 65536 && port > -1 { + c.port = v + return nil + } + return fmt.Errorf("Invalid port.") + } +} + //SetSAMOpts sets the SAM options func SetSAMOpts(s []string) func(*Manager) error { return func(c *Manager) error {