diff --git a/.idea/libraries/GOPATH__sshtunnel_.xml b/.idea/libraries/GOPATH__sshtunnel_.xml new file mode 100644 index 0000000..5aff23e --- /dev/null +++ b/.idea/libraries/GOPATH__sshtunnel_.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main.go b/app.go similarity index 60% rename from main.go rename to app.go index 2963315..c4f818e 100644 --- a/main.go +++ b/app.go @@ -1,161 +1,157 @@ -package main +package sshtunnel import ( + "flag" "strings" "os" "fmt" "io" "net" - "log" - "encoding/base64" + "encoding/base64" "golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh/agent" + "log" ) + +type Client struct { + +} + type Endpoint struct { Host string Port int } func KeyPrint(dialAddr string, addr net.Addr, key ssh.PublicKey) error { - fmt.Printf("%s %s %s\n", strings.Split(dialAddr, ":")[0], key.Type(), base64.StdEncoding.EncodeToString(key.Marshal())) - return nil + fmt.Printf("%s %s %s\n", strings.Split(dialAddr, ":")[0], key.Type(), base64.StdEncoding.EncodeToString(key.Marshal())) + return nil } func (endpoint *Endpoint) String() string { return fmt.Sprintf("%s:%d", endpoint.Host, endpoint.Port) } type SSHtunnel struct { Local *Endpoint Server *Endpoint Remote *Endpoint Config *ssh.ClientConfig } func (tunnel *SSHtunnel) Start() error { listener, err := net.Listen("tcp", tunnel.Local.String()) if err != nil { return err } defer listener.Close() for { conn, err := listener.Accept() if err != nil { return err } go tunnel.forward(conn) } } func (tunnel *SSHtunnel) forward(localConn net.Conn) { serverConn, err := ssh.Dial("tcp", tunnel.Server.String(), tunnel.Config) if err != nil { fmt.Printf("Server dial error: %s\n", err) return } remoteConn, err := serverConn.Dial("tcp", tunnel.Remote.String()) if err != nil { fmt.Printf("Remote dial error: %s\n", err) return } copyConn:=func(writer, reader net.Conn) { _, err:= io.Copy(writer, reader) if err != nil { fmt.Printf("io.Copy error: %s", err) } } go copyConn(localConn, remoteConn) go copyConn(remoteConn, localConn) } func SSHAgent() ssh.AuthMethod { if sshAgent, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK")); err == nil { return ssh.PublicKeysCallback(agent.NewClient(sshAgent).Signers) } return nil } func check(e error) { - if e != nil { - panic(e) - } + if e != nil { + panic(e) + } } -func main() { - fout, err := os.OpenFile("C:\\Projects\\sshtunnel\\sshtunnel_log.log", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666) - check(err) - log.SetOutput(fout) - localHostName, err := os.Hostname() - check(err) + +func(c *Client) Start(){ + //Get the command line arguments + remoteHostname := flag.String("remote-hostname", "motherbrain.unr.edu", + "Remote hostname.") + remotePort := flag.Int("remote-port", 27013, + "The remote port bound through the server.") + + //The intermediary server for port binding + serverHostname := flag.String("server", "ubuntu.cse.unr.edu", "a string") + localEndpoint := &Endpoint{ - Host: localHostName, + Host: "localhost", Port: 27013, } + log.Println( "Host:", localEndpoint.Host, "Port:" , localEndpoint.Port) serverEndpoint := &Endpoint{ - Host: "ubuntu.cse.unr.edu", + Host: *serverHostname, Port: 22, } log.Println( "Host:", serverEndpoint.Host, "Port:" , serverEndpoint.Port) remoteEndpoint := &Endpoint{ - Host: "motherbrain.unr.edu", - Port: 27013, + Host: *remoteHostname, + Port: *remotePort, } log.Println( "Host:", remoteEndpoint.Host, "Port:" , remoteEndpoint.Port) + //credChan := make(chan Credentials) + + + var passwordForm= NewPasswordForm() + //passwordForm.SetChan(credChan) + passwordForm.Show(); + + credentials := passwordForm.Credentials + + log.Printf("Connecting to %s, User: %s ", *remoteHostname, credentials.Username) + sshConfig := &ssh.ClientConfig{ - User: "", + User: credentials.Username, HostKeyCallback: KeyPrint, Auth: []ssh.AuthMethod{ - ssh.Password(""), + ssh.Password(credentials.Password), }, } tunnel := &SSHtunnel{ Config: sshConfig, Local: localEndpoint, Server: serverEndpoint, Remote: remoteEndpoint, } - var currentNetworkHardwareName string - - interfaces, _ := net.Interfaces() - for _, interf := range interfaces { - if addrs, err := interf.Addrs(); err == nil { - for index, addr := range addrs { - log.Println("[", index, "]", interf.Name, ">", addr) - - log.Println("Use name : ", interf.Name) - currentNetworkHardwareName = interf.Name - } - } - } - - // extract the hardware information base on the interface name - // capture above - netInterface, err := net.InterfaceByName(currentNetworkHardwareName) - check(err) - log.Println(netInterface) - - name := netInterface.Name - macAddress := netInterface.HardwareAddr - - log.Println("Hardware name : ", name) - log.Println("MAC address : ", macAddress) - tunnel.Start() - fout.Close() -} +} \ No newline at end of file diff --git a/hostname.go b/bin/hostname.go similarity index 100% rename from hostname.go rename to bin/hostname.go diff --git a/localMac_addr.go b/bin/localMac_addr.go similarity index 99% rename from localMac_addr.go rename to bin/localMac_addr.go index fec529b..31d779f 100644 --- a/localMac_addr.go +++ b/bin/localMac_addr.go @@ -1,70 +1,71 @@ package main import ( "fmt" "net" "strings" "os" + "log" ) func main() { // localMacAddr, err := net.() // if err != nil{ // panic(err) // } // fmt.Println("Local MAC addr:",localMacAddr) // // var currentIP, currentNetworkHardwareName string currentIP = "134.197.41.183/22" interfaces, _ := net.Interfaces() for _, interf := range interfaces { if addrs, err := interf.Addrs(); err == nil { for index, addr := range addrs { if addr.String() != "127.0.0.1/8" { log.Println("[", index, "]", interf.Name, ">", addr) // only interested in the name with current IP address if strings.Contains(addr.String(), currentIP) { log.Println("Use name : ", interf.Name) currentNetworkHardwareName = interf.Name } } } } } log.Println("-------------------------------------------") // extract the hardware information base on the interface name // capture above netInterface, err := net.InterfaceByName(currentNetworkHardwareName) if err != nil { fmt.Println(err) } name := netInterface.Name macAddress := netInterface.HardwareAddr log.Println("Hardware name : ", name) log.Println("MAC address : ", macAddress) // verify if the MAC address can be parsed properly hwAddr, err := net.ParseMAC(macAddress.String()) if err != nil { log.Println("No able to parse MAC address : ", err) os.Exit(-1) } log.Println("Physical hardware address : %s \n", hwAddr.String()) } // net.Interfaces() // returns an array of interfaces // net.InterfaceByName(oneOfTheReturnedInterfaces) // ^.HardwareAddr diff --git a/test.manifest b/bin/main.exe.manifest similarity index 97% rename from test.manifest rename to bin/main.exe.manifest index 6667f32..c4d6dd4 100644 --- a/test.manifest +++ b/bin/main.exe.manifest @@ -1,9 +1,9 @@ - + \ No newline at end of file diff --git a/bin/main.go b/bin/main.go new file mode 100644 index 0000000..3579cba --- /dev/null +++ b/bin/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "sshtunnel" +) + + +func main() { + var sshClient = &sshtunnel.Client{}; + + sshClient.Start() +} diff --git a/credentials.go b/credentials.go new file mode 100644 index 0000000..e05d9cc --- /dev/null +++ b/credentials.go @@ -0,0 +1,7 @@ +package sshtunnel + + +type Credentials struct { + Username string + Password string +} diff --git a/rsrc.syso b/rsrc.syso deleted file mode 100644 index a90f3de..0000000 Binary files a/rsrc.syso and /dev/null differ diff --git a/sshtunnel_log.log b/sshtunnel_log.log deleted file mode 100644 index c53beb2..0000000 --- a/sshtunnel_log.log +++ /dev/null @@ -1,20 +0,0 @@ -2017/04/18 11:08:01 Localhost -2017/04/18 11:08:01 Host: localhost Port: 27013 -2017/04/18 11:08:01 Host: ubuntu.cse.unr.edu Port: 22 -2017/05/01 15:14:06 Host: ECC-FRONT-01 Port: 27013 -2017/05/01 15:14:06 Host: ubuntu.cse.unr.edu Port: 22 -2017/05/01 15:14:06 Host: motherbrain.unr.edu Port: 27013 -2017/05/01 15:14:06 [ 0 ] Ethernet > fe80::781e:62ac:a47b:1dca/64 -2017/05/01 15:14:06 Use name : Ethernet -2017/05/01 15:14:06 [ 1 ] Ethernet > 134.197.41.183/22 -2017/05/01 15:14:06 Use name : Ethernet -2017/05/01 15:14:06 [ 0 ] Loopback Pseudo-Interface 1 > ::1/128 -2017/05/01 15:14:06 Use name : Loopback Pseudo-Interface 1 -2017/05/01 15:14:06 [ 1 ] Loopback Pseudo-Interface 1 > 127.0.0.1/8 -2017/05/01 15:14:06 Use name : Loopback Pseudo-Interface 1 -2017/05/01 15:14:06 [ 0 ] isatap.rd.unr.edu > fe80::200:5efe:86c5:29b7/128 -2017/05/01 15:14:06 Use name : isatap.rd.unr.edu -2017/05/01 15:14:06 ------------------------------------------- -2017/05/01 15:14:06 &{3 1280 isatap.rd.unr.edu 00:00:00:00:00:00:00:e0 pointtopoint|multicast} -2017/05/01 15:14:06 Hardware name : isatap.rd.unr.edu -2017/05/01 15:14:06 MAC address : 00:00:00:00:00:00:00:e0 diff --git a/test/test.exe b/test/test.exe deleted file mode 100644 index b86ea41..0000000 Binary files a/test/test.exe and /dev/null differ diff --git a/test/test.exe.manifest b/test/test.exe.manifest deleted file mode 100644 index 6667f32..0000000 --- a/test/test.exe.manifest +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/test/test.go b/test/test.go deleted file mode 100644 index 68e4b5e..0000000 --- a/test/test.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "github.com/lxn/walk" - . "github.com/lxn/walk/declarative" - "strings" - "os" -) - - - - - -func main() { - var inTE, outTE *walk.TextEdit - - MainWindow{ - Title: "Login", - MinSize: Size{350, 200}, - Layout: VBox{}, - Children: []Widget{ - HSplitter{ - Children: []Widget{ - Label{ Text: "Username"}, - LineEdit{ }, - //TextEdit{AssignTo: &inTE}, - //TextEdit{AssignTo: &inTE, ReadOnly: false}, - //TextEdit{AssignTo: &inTE}, - - }, - }, - HSplitter{ - Children: []Widget{ - Label{ Text: "Password"}, - //TextEdit{AssignTo: &inTE}, - LineEdit{PasswordMode: true, }, - //TextEdit{AssignTo: &inTE, ReadOnly: false}, - //TextEdit{AssignTo: &inTE}, - - }, - }, - PushButton{ - Text: "Cancel", - OnClicked: func() { - outTE.SetText(strings.ToUpper(inTE.Text())) - os.Exit(0) - }, - }, - PushButton{ - Text: "Login", - OnClicked: func() { - outTE.SetText(strings.ToUpper(inTE.Text())) - os.Exit(0) - }, - }, - }, - }.Run() -} diff --git a/windows_ui.go b/windows_ui.go new file mode 100644 index 0000000..ccff359 --- /dev/null +++ b/windows_ui.go @@ -0,0 +1,61 @@ +// +build windows,!linux + +package sshtunnel + +import ( + . "github.com/lxn/walk/declarative" + "github.com/lxn/walk" +) + +type PasswordForm struct { + Credentials *Credentials + +} + +func NewPasswordForm() *PasswordForm { + + return &PasswordForm{} +} + +func (p *PasswordForm) Show(){ + var mainWindow *walk.MainWindow + var usernameLE, passwordLE *walk.LineEdit + p.Credentials = &Credentials{Username:"Test"} + + MainWindow{ + AssignTo: &mainWindow, + Title: "Login", + MinSize: Size{250, 150}, + Layout: VBox{}, + Children: []Widget{ + HSplitter{ + Children: []Widget{ + Label{ Text: "Username"}, + LineEdit{ AssignTo: &usernameLE }, + + }, + }, + HSplitter{ + Children: []Widget{ + Label{ Text: "Password"}, + LineEdit{PasswordMode: true, AssignTo: &passwordLE}, + }, + }, + PushButton{ + Text: "Login", + OnClicked: func() { + p.Credentials.Username = usernameLE.Text() + p.Credentials.Password = passwordLE.Text() + mainWindow.Close() + }, + }, + PushButton{ + Text: "Cancel", + OnClicked: func() { + mainWindow.Close() + }, + }, + + }, + }.Run() +}