github.com/pkg/sftp@v1.13.6/internal/encoding/ssh/filexfer/fxp.go (about)

     1  package sshfx
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // PacketType defines the various SFTP packet types.
     8  type PacketType uint8
     9  
    10  // Request packet types.
    11  const (
    12  	// https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-3
    13  	PacketTypeInit = PacketType(iota + 1)
    14  	PacketTypeVersion
    15  	PacketTypeOpen
    16  	PacketTypeClose
    17  	PacketTypeRead
    18  	PacketTypeWrite
    19  	PacketTypeLStat
    20  	PacketTypeFStat
    21  	PacketTypeSetstat
    22  	PacketTypeFSetstat
    23  	PacketTypeOpenDir
    24  	PacketTypeReadDir
    25  	PacketTypeRemove
    26  	PacketTypeMkdir
    27  	PacketTypeRmdir
    28  	PacketTypeRealPath
    29  	PacketTypeStat
    30  	PacketTypeRename
    31  	PacketTypeReadLink
    32  	PacketTypeSymlink
    33  
    34  	// https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-07.txt#section-3.3
    35  	PacketTypeV6Link
    36  
    37  	// https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-08.txt#section-3.3
    38  	PacketTypeV6Block
    39  	PacketTypeV6Unblock
    40  )
    41  
    42  // Response packet types.
    43  const (
    44  	// https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-3
    45  	PacketTypeStatus = PacketType(iota + 101)
    46  	PacketTypeHandle
    47  	PacketTypeData
    48  	PacketTypeName
    49  	PacketTypeAttrs
    50  )
    51  
    52  // Extended packet types.
    53  const (
    54  	// https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-3
    55  	PacketTypeExtended = PacketType(iota + 200)
    56  	PacketTypeExtendedReply
    57  )
    58  
    59  func (f PacketType) String() string {
    60  	switch f {
    61  	case PacketTypeInit:
    62  		return "SSH_FXP_INIT"
    63  	case PacketTypeVersion:
    64  		return "SSH_FXP_VERSION"
    65  	case PacketTypeOpen:
    66  		return "SSH_FXP_OPEN"
    67  	case PacketTypeClose:
    68  		return "SSH_FXP_CLOSE"
    69  	case PacketTypeRead:
    70  		return "SSH_FXP_READ"
    71  	case PacketTypeWrite:
    72  		return "SSH_FXP_WRITE"
    73  	case PacketTypeLStat:
    74  		return "SSH_FXP_LSTAT"
    75  	case PacketTypeFStat:
    76  		return "SSH_FXP_FSTAT"
    77  	case PacketTypeSetstat:
    78  		return "SSH_FXP_SETSTAT"
    79  	case PacketTypeFSetstat:
    80  		return "SSH_FXP_FSETSTAT"
    81  	case PacketTypeOpenDir:
    82  		return "SSH_FXP_OPENDIR"
    83  	case PacketTypeReadDir:
    84  		return "SSH_FXP_READDIR"
    85  	case PacketTypeRemove:
    86  		return "SSH_FXP_REMOVE"
    87  	case PacketTypeMkdir:
    88  		return "SSH_FXP_MKDIR"
    89  	case PacketTypeRmdir:
    90  		return "SSH_FXP_RMDIR"
    91  	case PacketTypeRealPath:
    92  		return "SSH_FXP_REALPATH"
    93  	case PacketTypeStat:
    94  		return "SSH_FXP_STAT"
    95  	case PacketTypeRename:
    96  		return "SSH_FXP_RENAME"
    97  	case PacketTypeReadLink:
    98  		return "SSH_FXP_READLINK"
    99  	case PacketTypeSymlink:
   100  		return "SSH_FXP_SYMLINK"
   101  	case PacketTypeV6Link:
   102  		return "SSH_FXP_LINK"
   103  	case PacketTypeV6Block:
   104  		return "SSH_FXP_BLOCK"
   105  	case PacketTypeV6Unblock:
   106  		return "SSH_FXP_UNBLOCK"
   107  	case PacketTypeStatus:
   108  		return "SSH_FXP_STATUS"
   109  	case PacketTypeHandle:
   110  		return "SSH_FXP_HANDLE"
   111  	case PacketTypeData:
   112  		return "SSH_FXP_DATA"
   113  	case PacketTypeName:
   114  		return "SSH_FXP_NAME"
   115  	case PacketTypeAttrs:
   116  		return "SSH_FXP_ATTRS"
   117  	case PacketTypeExtended:
   118  		return "SSH_FXP_EXTENDED"
   119  	case PacketTypeExtendedReply:
   120  		return "SSH_FXP_EXTENDED_REPLY"
   121  	default:
   122  		return fmt.Sprintf("SSH_FXP_UNKNOWN(%d)", f)
   123  	}
   124  }
   125  
   126  func newPacketFromType(typ PacketType) (Packet, error) {
   127  	switch typ {
   128  	case PacketTypeOpen:
   129  		return new(OpenPacket), nil
   130  	case PacketTypeClose:
   131  		return new(ClosePacket), nil
   132  	case PacketTypeRead:
   133  		return new(ReadPacket), nil
   134  	case PacketTypeWrite:
   135  		return new(WritePacket), nil
   136  	case PacketTypeLStat:
   137  		return new(LStatPacket), nil
   138  	case PacketTypeFStat:
   139  		return new(FStatPacket), nil
   140  	case PacketTypeSetstat:
   141  		return new(SetstatPacket), nil
   142  	case PacketTypeFSetstat:
   143  		return new(FSetstatPacket), nil
   144  	case PacketTypeOpenDir:
   145  		return new(OpenDirPacket), nil
   146  	case PacketTypeReadDir:
   147  		return new(ReadDirPacket), nil
   148  	case PacketTypeRemove:
   149  		return new(RemovePacket), nil
   150  	case PacketTypeMkdir:
   151  		return new(MkdirPacket), nil
   152  	case PacketTypeRmdir:
   153  		return new(RmdirPacket), nil
   154  	case PacketTypeRealPath:
   155  		return new(RealPathPacket), nil
   156  	case PacketTypeStat:
   157  		return new(StatPacket), nil
   158  	case PacketTypeRename:
   159  		return new(RenamePacket), nil
   160  	case PacketTypeReadLink:
   161  		return new(ReadLinkPacket), nil
   162  	case PacketTypeSymlink:
   163  		return new(SymlinkPacket), nil
   164  	case PacketTypeExtended:
   165  		return new(ExtendedPacket), nil
   166  	default:
   167  		return nil, fmt.Errorf("unexpected request packet type: %v", typ)
   168  	}
   169  }