mirror of https://github.com/pkg/sftp.git
				
				
				
			compare golang sftp subsystem to openssh
This commit is contained in:
		
							parent
							
								
									f9e831be30
								
							
						
					
					
						commit
						1502f6c9e6
					
				|  | @ -23,6 +23,11 @@ var sshServerDebugStream = os.Stdout  // ioutil.Discard | ||||||
| var sftpServerDebugStream = os.Stdout // ioutil.Discard
 | var sftpServerDebugStream = os.Stdout // ioutil.Discard
 | ||||||
| var sftpClientDebugStream = os.Stdout // ioutil.Discard
 | var sftpClientDebugStream = os.Stdout // ioutil.Discard
 | ||||||
| 
 | 
 | ||||||
|  | const ( | ||||||
|  | 	GOLANG_SFTP  = true | ||||||
|  | 	OPENSSH_SFTP = false | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| /*********************************************************************************************** | /*********************************************************************************************** | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -101,21 +106,22 @@ func basicServerConfig() *ssh.ServerConfig { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type sshServer struct { | type sshServer struct { | ||||||
| 	conn     net.Conn | 	useSubsystem bool | ||||||
| 	config   *ssh.ServerConfig | 	conn         net.Conn | ||||||
| 	sshConn  *ssh.ServerConn | 	config       *ssh.ServerConfig | ||||||
| 	newChans <-chan ssh.NewChannel | 	sshConn      *ssh.ServerConn | ||||||
| 	newReqs  <-chan *ssh.Request | 	newChans     <-chan ssh.NewChannel | ||||||
|  | 	newReqs      <-chan *ssh.Request | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func sshServerFromConn(conn net.Conn, config *ssh.ServerConfig) (*sshServer, error) { | func sshServerFromConn(conn net.Conn, useSubsystem bool, config *ssh.ServerConfig) (*sshServer, error) { | ||||||
| 	// From a standard TCP connection to an encrypted SSH connection
 | 	// From a standard TCP connection to an encrypted SSH connection
 | ||||||
| 	sshConn, newChans, newReqs, err := ssh.NewServerConn(conn, config) | 	sshConn, newChans, newReqs, err := ssh.NewServerConn(conn, config) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	svr := &sshServer{conn, config, sshConn, newChans, newReqs} | 	svr := &sshServer{useSubsystem, conn, config, sshConn, newChans, newReqs} | ||||||
| 	svr.listenChannels() | 	svr.listenChannels() | ||||||
| 	return svr, nil | 	return svr, nil | ||||||
| } | } | ||||||
|  | @ -272,8 +278,9 @@ func (chsvr *sshSessionChannelServer) handleSubsystem(req *ssh.Request) error { | ||||||
| 	if subsystemReq.Name == "sftp" { | 	if subsystemReq.Name == "sftp" { | ||||||
| 		req.Reply(true, nil) | 		req.Reply(true, nil) | ||||||
| 
 | 
 | ||||||
| 		if false { | 		if !chsvr.svr.useSubsystem { | ||||||
| 			// use the sftp server backend; this is to test the ssh code, not the sftp code
 | 			// use the openssh sftp server backend; this is to test the ssh code, not the sftp code,
 | ||||||
|  | 			// or is used for comparison between our sftp subsystem and the openssh sftp subsystem
 | ||||||
| 			cmd := exec.Command(*testSftp, "-e", "-l", "DEBUG") // log to stderr
 | 			cmd := exec.Command(*testSftp, "-e", "-l", "DEBUG") // log to stderr
 | ||||||
| 			cmd.Stdin = chsvr.ch | 			cmd.Stdin = chsvr.ch | ||||||
| 			cmd.Stdout = chsvr.ch | 			cmd.Stdout = chsvr.ch | ||||||
|  | @ -312,7 +319,7 @@ Actual unit tests | ||||||
| ***********************************************************************************************/ | ***********************************************************************************************/ | ||||||
| 
 | 
 | ||||||
| // starts an ssh server to test. returns: host string and port
 | // starts an ssh server to test. returns: host string and port
 | ||||||
| func testServer(t *testing.T, readonly bool) (string, int) { | func testServer(t *testing.T, useSubsystem bool, readonly bool) (net.Listener, string, int) { | ||||||
| 	listener, err := net.Listen("tcp", "127.0.0.1:0") | 	listener, err := net.Listen("tcp", "127.0.0.1:0") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatal(err) | 		t.Fatal(err) | ||||||
|  | @ -337,7 +344,7 @@ func testServer(t *testing.T, readonly bool) (string, int) { | ||||||
| 
 | 
 | ||||||
| 			go func() { | 			go func() { | ||||||
| 				defer conn.Close() | 				defer conn.Close() | ||||||
| 				sshSvr, err := sshServerFromConn(conn, basicServerConfig()) | 				sshSvr, err := sshServerFromConn(conn, useSubsystem, basicServerConfig()) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					t.Fatal(err) | 					t.Fatal(err) | ||||||
| 				} | 				} | ||||||
|  | @ -347,7 +354,7 @@ func testServer(t *testing.T, readonly bool) (string, int) { | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
| 
 | 
 | ||||||
| 	return host, port | 	return listener, host, port | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func runSftpClient(script string, path string, host string, port int) (string, error) { | func runSftpClient(script string, path string, host string, port int) (string, error) { | ||||||
|  | @ -363,14 +370,28 @@ func runSftpClient(script string, path string, host string, port int) (string, e | ||||||
| 	return string(stdout.Bytes()), err | 	return string(stdout.Bytes()), err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestServerLstat(t *testing.T) { | func TestServerCompareSubsystems(t *testing.T) { | ||||||
| 	host, port := testServer(t, READONLY) | 	listenerGo, hostGo, portGo := testServer(t, GOLANG_SFTP, READONLY) | ||||||
|  | 	listenerOp, hostOp, portOp := testServer(t, OPENSSH_SFTP, READONLY) | ||||||
|  | 	defer listenerGo.Close() | ||||||
|  | 	defer listenerOp.Close() | ||||||
| 
 | 
 | ||||||
| 	script := "ls" | 	script := ` | ||||||
| 	output, err := runSftpClient(script, "/tmp/", host, port) | ls / | ||||||
|  | ls /dev/ | ||||||
|  | ` | ||||||
|  | 	outputGo, err := runSftpClient(script, "/", hostGo, portGo) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatal(err) | 		t.Fatal(err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	t.Log(output) | 	outputOp, err := runSftpClient(script, "/", hostOp, portOp) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if outputGo != outputOp { | ||||||
|  | 		t.Errorf("outputs differ, go:\n%v\nopenssh:\n%v\n", outputGo, outputOp) | ||||||
|  | 	} | ||||||
|  | 	t.Logf("go output:\n%v\nopenssh output:\n%v\n", outputGo, outputOp) | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue