368 lines
9.9 KiB
Go
368 lines
9.9 KiB
Go
package filexfer
|
|
|
|
// LStatPacket defines the SSH_FXP_LSTAT packet.
|
|
type LStatPacket struct {
|
|
Path string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *LStatPacket) Type() PacketType {
|
|
return PacketTypeLStat
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *LStatPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) // string(path)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeLStat, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *LStatPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// SetstatPacket defines the SSH_FXP_SETSTAT packet.
|
|
type SetstatPacket struct {
|
|
Path string
|
|
Attrs Attributes
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *SetstatPacket) Type() PacketType {
|
|
return PacketTypeSetstat
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *SetstatPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) + p.Attrs.Len() // string(path) + ATTRS(attrs)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeSetstat, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
p.Attrs.MarshalInto(buf)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *SetstatPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return p.Attrs.UnmarshalFrom(buf)
|
|
}
|
|
|
|
// RemovePacket defines the SSH_FXP_REMOVE packet.
|
|
type RemovePacket struct {
|
|
Path string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *RemovePacket) Type() PacketType {
|
|
return PacketTypeRemove
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *RemovePacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) // string(path)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeRemove, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *RemovePacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MkdirPacket defines the SSH_FXP_MKDIR packet.
|
|
type MkdirPacket struct {
|
|
Path string
|
|
Attrs Attributes
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *MkdirPacket) Type() PacketType {
|
|
return PacketTypeMkdir
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *MkdirPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) + p.Attrs.Len() // string(path) + ATTRS(attrs)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeMkdir, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
p.Attrs.MarshalInto(buf)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *MkdirPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return p.Attrs.UnmarshalFrom(buf)
|
|
}
|
|
|
|
// RmdirPacket defines the SSH_FXP_RMDIR packet.
|
|
type RmdirPacket struct {
|
|
Path string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *RmdirPacket) Type() PacketType {
|
|
return PacketTypeRmdir
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *RmdirPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) // string(path)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeRmdir, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *RmdirPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// RealPathPacket defines the SSH_FXP_REALPATH packet.
|
|
type RealPathPacket struct {
|
|
Path string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *RealPathPacket) Type() PacketType {
|
|
return PacketTypeRealPath
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *RealPathPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) // string(path)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeRealPath, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *RealPathPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// StatPacket defines the SSH_FXP_STAT packet.
|
|
type StatPacket struct {
|
|
Path string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *StatPacket) Type() PacketType {
|
|
return PacketTypeStat
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *StatPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) // string(path)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeStat, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *StatPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// RenamePacket defines the SSH_FXP_RENAME packet.
|
|
type RenamePacket struct {
|
|
OldPath string
|
|
NewPath string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *RenamePacket) Type() PacketType {
|
|
return PacketTypeRename
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *RenamePacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
// string(oldpath) + string(newpath)
|
|
size := 4 + len(p.OldPath) + 4 + len(p.NewPath)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeRename, reqid)
|
|
buf.AppendString(p.OldPath)
|
|
buf.AppendString(p.NewPath)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *RenamePacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.OldPath, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if p.NewPath, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ReadLinkPacket defines the SSH_FXP_READLINK packet.
|
|
type ReadLinkPacket struct {
|
|
Path string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *ReadLinkPacket) Type() PacketType {
|
|
return PacketTypeReadLink
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *ReadLinkPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
size := 4 + len(p.Path) // string(path)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeReadLink, reqid)
|
|
buf.AppendString(p.Path)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *ReadLinkPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
if p.Path, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// SymlinkPacket defines the SSH_FXP_SYMLINK packet.
|
|
//
|
|
// The order of the arguments to the SSH_FXP_SYMLINK method was inadvertently reversed.
|
|
// Unfortunately, the reversal was not noticed until the server was widely deployed.
|
|
// Covered in Section 3.1 of https://github.com/openssh/openssh-portable/blob/master/PROTOCOL
|
|
type SymlinkPacket struct {
|
|
LinkPath string
|
|
TargetPath string
|
|
}
|
|
|
|
// Type returns the SSH_FXP_xy value associated with this packet type.
|
|
func (p *SymlinkPacket) Type() PacketType {
|
|
return PacketTypeSymlink
|
|
}
|
|
|
|
// MarshalPacket returns p as a two-part binary encoding of p.
|
|
func (p *SymlinkPacket) MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error) {
|
|
buf := NewBuffer(b)
|
|
if buf.Cap() < 9 {
|
|
// string(targetpath) + string(linkpath)
|
|
size := 4 + len(p.TargetPath) + 4 + len(p.LinkPath)
|
|
buf = NewMarshalBuffer(size)
|
|
}
|
|
|
|
buf.StartPacket(PacketTypeSymlink, reqid)
|
|
|
|
// Arguments were inadvertently reversed.
|
|
buf.AppendString(p.TargetPath)
|
|
buf.AppendString(p.LinkPath)
|
|
|
|
return buf.Packet(payload)
|
|
}
|
|
|
|
// UnmarshalPacketBody unmarshals the packet body from the given Buffer.
|
|
// It is assumed that the uint32(request-id) has already been consumed.
|
|
func (p *SymlinkPacket) UnmarshalPacketBody(buf *Buffer) (err error) {
|
|
// Arguments were inadvertently reversed.
|
|
if p.TargetPath, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if p.LinkPath, err = buf.ConsumeString(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|