mirror of https://github.com/pkg/sftp.git
Added initial message tests
This commit is contained in:
commit
fbcab0566f
|
@ -0,0 +1,13 @@
|
|||
package sftp
|
||||
|
||||
func marshalUint32(b []byte, v uint32) []byte {
|
||||
return append(b, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
|
||||
}
|
||||
|
||||
func marshalUint64(b []byte, v uint64) []byte {
|
||||
return marshalUint32(marshalUint32(b, uint32(v>>24)), uint32(v))
|
||||
}
|
||||
|
||||
func marshalString(b []byte, v string) []byte {
|
||||
return append(marshalUint32(b, uint32(len(v))), v...)
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package sftp
|
||||
|
||||
import "testing"
|
||||
import "bytes"
|
||||
|
||||
var marshalUint32Tests = []struct {
|
||||
v uint32
|
||||
want []byte
|
||||
}{
|
||||
{1, []byte{0, 0, 0, 1}},
|
||||
{256, []byte{0, 0, 1, 0}},
|
||||
{^uint32(0), []byte{255, 255, 255, 255}},
|
||||
}
|
||||
|
||||
func TestMarshalUint32(t *testing.T) {
|
||||
for _, tt := range marshalUint32Tests {
|
||||
got := marshalUint32(nil, tt.v)
|
||||
if !bytes.Equal(tt.want, got) {
|
||||
t.Errorf("marshalUint32(%d): want %v, got %v", tt.v, tt.want, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var marshalUint64Tests = []struct {
|
||||
v uint64
|
||||
want []byte
|
||||
}{
|
||||
{1, []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}},
|
||||
{256, []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0}},
|
||||
{^uint64(0), []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
|
||||
{1 << 32, []byte{0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0}},
|
||||
}
|
||||
|
||||
func TestMarshalUint64(t *testing.T) {
|
||||
for _, tt := range marshalUint64Tests {
|
||||
got := marshalUint64(nil, tt.v)
|
||||
if !bytes.Equal(tt.want, got) {
|
||||
t.Errorf("marshalUint64(%d): want %#v, got %#v", tt.v, tt.want, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var marshalStringTests = []struct {
|
||||
v string
|
||||
want []byte
|
||||
}{
|
||||
{"", []byte{0, 0, 0, 0}},
|
||||
{"/foo", []byte{0x0, 0x0, 0x0, 0x4, 0x2f, 0x66, 0x6f, 0x6f}},
|
||||
}
|
||||
|
||||
func TestMarshalString(t *testing.T) {
|
||||
for _, tt := range marshalStringTests {
|
||||
got := marshalString(nil, tt.v)
|
||||
if !bytes.Equal(tt.want, got) {
|
||||
t.Errorf("marshalString(%q): want %#v, got %#v", tt.v, tt.want, got)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
// Package sftp implements the SSH File Transfer Protocol as described in
|
||||
// https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt
|
||||
package sftp
|
||||
|
||||
import (
|
||||
"code.google.com/p/go.crypto/ssh"
|
||||
)
|
||||
|
||||
const (
|
||||
SSH_FXP_INIT = 1
|
||||
SSH_FXP_VERSION = 2
|
||||
SSH_FXP_OPEN = 3
|
||||
SSH_FXP_CLOSE = 4
|
||||
SSH_FXP_READ = 5
|
||||
SSH_FXP_WRITE = 6
|
||||
SSH_FXP_LSTAT = 7
|
||||
SSH_FXP_FSTAT = 8
|
||||
SSH_FXP_SETSTAT = 9
|
||||
SSH_FXP_FSETSTAT = 10
|
||||
SSH_FXP_OPENDIR = 11
|
||||
SSH_FXP_READDIR = 12
|
||||
SSH_FXP_REMOVE = 13
|
||||
SSH_FXP_MKDIR = 14
|
||||
SSH_FXP_RMDIR = 15
|
||||
SSH_FXP_REALPATH = 16
|
||||
SSH_FXP_STAT = 17
|
||||
SSH_FXP_RENAME = 18
|
||||
SSH_FXP_READLINK = 19
|
||||
SSH_FXP_SYMLINK = 20
|
||||
SSH_FXP_STATUS = 101
|
||||
SSH_FXP_HANDLE = 102
|
||||
SSH_FXP_DATA = 103
|
||||
SSH_FXP_NAME = 104
|
||||
SSH_FXP_ATTRS = 105
|
||||
SSH_FXP_EXTENDED = 200
|
||||
SSH_FXP_EXTENDED_REPLY = 201
|
||||
)
|
||||
|
||||
type packet struct {
|
||||
length uint32
|
||||
typ uint8
|
||||
data []byte
|
||||
}
|
||||
|
||||
// New creates a new sftp client on conn.
|
||||
func NewClient(conn *ssh.ClientConn) (*ClientConn, error) {
|
||||
s, err := conn.NewSession()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := s.RequestSubsystem("sftp"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sftp := &ClientConn{s}
|
||||
return sftp, sftp.sendInit()
|
||||
}
|
||||
|
||||
type ClientConn struct {
|
||||
session *ssh.Session
|
||||
}
|
||||
|
||||
func (c *ClientConn) Close() error { return c.session.Close() }
|
||||
|
||||
func (c *ClientConn) sendInit() error {
|
||||
var b = []byte{0, 0, 0, 3, 0, 0, 0, 0}
|
||||
_, err := c.session.Stdout.Write(b)
|
||||
return err
|
||||
}
|
Loading…
Reference in New Issue