diff --git a/conn/conn.go b/conn/conn.go index e0ec2f8..1fd9d25 100644 --- a/conn/conn.go +++ b/conn/conn.go @@ -19,5 +19,7 @@ func NewConn(conn *sam3.SAMConn, path string) (*Conn, error) { } func GenConn(conn *sam3.SAMConn, path string) *Conn { - return &Conn{SAMConn: conn, path: path} + var c = Conn{SAMConn: conn, path: path} + c.SaveKeys() + return &c } diff --git a/main.go b/main.go index 47866c0..1720172 100644 --- a/main.go +++ b/main.go @@ -2,9 +2,6 @@ package main import ( "flag" - //"log" - "./socks" - //"github.com/eyedeekay/eeproxy/socks" "os" "os/signal" "strings" @@ -12,7 +9,8 @@ import ( import ( "github.com/eyedeekay/sam-forwarder/config" - "github.com/eyedeekay/samcatd-web" + //"github.com/eyedeekay/samcatd-web" + "github.com/eyedeekay/eeproxy/socks" ) type flagOpts []string @@ -95,15 +93,11 @@ var ( ) var ( - webinterface *samcatweb.SAMWebConfig - webinterfaceerr error - err error - accessList flagOpts - config *i2ptunconf.Conf + err error + config *i2ptunconf.Conf ) func main() { - flag.Var(&accessList, "accesslist", "Specify an access list member(can be used multiple times)") flag.Parse() if *readKeys != "" { @@ -144,7 +138,7 @@ func main() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) - if tunsocks, tunerr := tunmanager.NewManager(); tunerr == nil { + if tunsocks, tunerr := tunmanager.NewManager(config.SamHost, config.SamPort, config.Print(), config.SaveDirectory); tunerr == nil { go func() { for sig := range c { if sig == os.Interrupt { diff --git a/resolve/eepresolver.go b/resolve/eepresolver.go index 3f5f658..3e9fa77 100644 --- a/resolve/eepresolver.go +++ b/resolve/eepresolver.go @@ -21,7 +21,7 @@ func (r Resolver) Resolve(ctx context.Context, name string) (context.Context, ne } func (r Resolver) ResolveI2P(ctx context.Context, name string) (context.Context, *sam3.I2PAddr, error) { - if r.ValidateI2PAddr(name) { + if !r.ValidateI2PAddr(name) { return ctx, nil, fmt.Errorf("Error, not an allowed suffix") } raddr, err := r.SAMResolver.Resolve(name) @@ -32,7 +32,7 @@ func (r Resolver) ResolveI2P(ctx context.Context, name string) (context.Context, } func (r Resolver) ValidateI2PAddr(name string) bool { - noi2p := true + noi2p := false for _, suffix := range r.allowedSuffixes { if strings.HasSuffix(name, suffix) { if suffix == ".b32.i2p" { @@ -41,7 +41,7 @@ func (r Resolver) ValidateI2PAddr(name string) bool { break } } - noi2p = false + noi2p = true } } return noi2p diff --git a/socks/manager.go b/socks/manager.go index 7af693b..46fd929 100644 --- a/socks/manager.go +++ b/socks/manager.go @@ -18,8 +18,11 @@ type Manager struct { resolver.Resolver socks5.Config sam3.StreamSession - conns []*conn.Conn - datapath string + conns []*conn.Conn + datadir string + samhost string + samport string + samopts string } func (m Manager) Serve() error { @@ -41,7 +44,7 @@ func (m Manager) DialI2P(ctx context.Context, addr string) (*sam3.SAMConn, error if err != nil { return nil, err } - m.conns = append(m.conns, conn.GenConn(newconn, m.datapath)) + m.conns = append(m.conns, conn.GenConn(newconn, m.datadir)) log.Println("Generated destination for address:", i2paddr.Base32(), "at position", len(m.conns)-1) return m.conns[len(m.conns)-1].SAMConn, nil } @@ -50,11 +53,16 @@ func (m Manager) Dial(ctx context.Context, network, addr string) (net.Conn, erro return m.DialI2P(ctx, addr) } -func NewManager() (*Manager, error) { - return NewManagerFromOptions() +func NewManager(samhost, samport, samopts, datadir string) (*Manager, error) { + return NewManagerFromOptions( + SetHost(samhost), + SetPort(samport), + SetSAMOpts(samopts), + SetDataDir(datadir), + ) } -func NewManagerFromOptions() (*Manager, error) { +func NewManagerFromOptions(opts ...func(*Manager) error) (*Manager, error) { var m Manager if r, err := resolver.NewResolver(); err == nil { m.Config = socks5.Config{ diff --git a/socks/manager_options.go b/socks/manager_options.go index c6fc994..cddecd2 100644 --- a/socks/manager_options.go +++ b/socks/manager_options.go @@ -1 +1,48 @@ package tunmanager + +import ( + "fmt" + "strconv" +) + +//Option is a Manager option +type Option func(*Manager) error + +//SetHost sets the host of the client's SAM bridge +func SetHost(s string) func(*Manager) error { + return func(c *Manager) error { + c.samhost = s + return nil + } +} + +//SetDataDir sets the directory to save per-site keys +func SetDataDir(s string) func(*Manager) error { + return func(c *Manager) error { + c.datadir = s + return nil + } +} + +//SetPort 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.samport = 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 { + c.samopts = s + return nil + } +}