aboutsummaryrefslogtreecommitdiff
path: root/internal/encoding/ssh/filexfer/fx.go
blob: 48f869861a45a9b3bfeb65a017bfd5f60038f06c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package filexfer

import (
	"fmt"
)

// Status defines the SFTP error codes used in SSH_FXP_STATUS response packets.
type Status uint32

// Defines the various SSH_FX_* values.
const (
	// see draft-ietf-secsh-filexfer-02
	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-7
	StatusOK = Status(iota)
	StatusEOF
	StatusNoSuchFile
	StatusPermissionDenied
	StatusFailure
	StatusBadMessage
	StatusNoConnection
	StatusConnectionLost
	StatusOPUnsupported

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-03#section-7
	StatusV4InvalidHandle
	StatusV4NoSuchPath
	StatusV4FileAlreadyExists
	StatusV4WriteProtect

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-7
	StatusV4NoMedia

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-7
	StatusV5NoSpaceOnFilesystem
	StatusV5QuotaExceeded
	StatusV5UnknownPrincipal
	StatusV5LockConflict

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-06#section-8
	StatusV6DirNotEmpty
	StatusV6NotADirectory
	StatusV6InvalidFilename
	StatusV6LinkLoop

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-07#section-8
	StatusV6CannotDelete
	StatusV6InvalidParameter
	StatusV6FileIsADirectory
	StatusV6ByteRangeLockConflict
	StatusV6ByteRangeLockRefused
	StatusV6DeletePending

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-08#section-8.1
	StatusV6FileCorrupt

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-10#section-9.1
	StatusV6OwnerInvalid
	StatusV6GroupInvalid

	// https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1
	StatusV6NoMatchingByteRangeLock
)

func (s Status) Error() string {
	return s.String()
}

// Is returns true if the target is the same Status code,
// or target is a StatusPacket with the same Status code.
func (s Status) Is(target error) bool {
	if target, ok := target.(*StatusPacket); ok {
		return target.StatusCode == s
	}

	return s == target
}

func (s Status) String() string {
	switch s {
	case StatusOK:
		return "SSH_FX_OK"
	case StatusEOF:
		return "SSH_FX_EOF"
	case StatusNoSuchFile:
		return "SSH_FX_NO_SUCH_FILE"
	case StatusPermissionDenied:
		return "SSH_FX_PERMISSION_DENIED"
	case StatusFailure:
		return "SSH_FX_FAILURE"
	case StatusBadMessage:
		return "SSH_FX_BAD_MESSAGE"
	case StatusNoConnection:
		return "SSH_FX_NO_CONNECTION"
	case StatusConnectionLost:
		return "SSH_FX_CONNECTION_LOST"
	case StatusOPUnsupported:
		return "SSH_FX_OP_UNSUPPORTED"
	case StatusV4InvalidHandle:
		return "SSH_FX_INVALID_HANDLE"
	case StatusV4NoSuchPath:
		return "SSH_FX_NO_SUCH_PATH"
	case StatusV4FileAlreadyExists:
		return "SSH_FX_FILE_ALREADY_EXISTS"
	case StatusV4WriteProtect:
		return "SSH_FX_WRITE_PROTECT"
	case StatusV4NoMedia:
		return "SSH_FX_NO_MEDIA"
	case StatusV5NoSpaceOnFilesystem:
		return "SSH_FX_NO_SPACE_ON_FILESYSTEM"
	case StatusV5QuotaExceeded:
		return "SSH_FX_QUOTA_EXCEEDED"
	case StatusV5UnknownPrincipal:
		return "SSH_FX_UNKNOWN_PRINCIPAL"
	case StatusV5LockConflict:
		return "SSH_FX_LOCK_CONFLICT"
	case StatusV6DirNotEmpty:
		return "SSH_FX_DIR_NOT_EMPTY"
	case StatusV6NotADirectory:
		return "SSH_FX_NOT_A_DIRECTORY"
	case StatusV6InvalidFilename:
		return "SSH_FX_INVALID_FILENAME"
	case StatusV6LinkLoop:
		return "SSH_FX_LINK_LOOP"
	case StatusV6CannotDelete:
		return "SSH_FX_CANNOT_DELETE"
	case StatusV6InvalidParameter:
		return "SSH_FX_INVALID_PARAMETER"
	case StatusV6FileIsADirectory:
		return "SSH_FX_FILE_IS_A_DIRECTORY"
	case StatusV6ByteRangeLockConflict:
		return "SSH_FX_BYTE_RANGE_LOCK_CONFLICT"
	case StatusV6ByteRangeLockRefused:
		return "SSH_FX_BYTE_RANGE_LOCK_REFUSED"
	case StatusV6DeletePending:
		return "SSH_FX_DELETE_PENDING"
	case StatusV6FileCorrupt:
		return "SSH_FX_FILE_CORRUPT"
	case StatusV6OwnerInvalid:
		return "SSH_FX_OWNER_INVALID"
	case StatusV6GroupInvalid:
		return "SSH_FX_GROUP_INVALID"
	case StatusV6NoMatchingByteRangeLock:
		return "SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK"
	default:
		return fmt.Sprintf("SSH_FX_UNKNOWN(%d)", s)
	}
}