Mercurial > 510Connectbot
comparison src/ch/ethz/ssh2/SFTPv6Client.java @ 308:42b15aaa7ac7 ganymed
merge
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Wed, 30 Jul 2014 14:21:50 -0700 |
parents | 071eccdff8ea |
children |
comparison
equal
deleted
inserted
replaced
306:90e47d99ea54 | 308:42b15aaa7ac7 |
---|---|
23 public SFTPv6Client(Connection conn) throws IOException { | 23 public SFTPv6Client(Connection conn) throws IOException { |
24 this(conn, new PacketListener() { | 24 this(conn, new PacketListener() { |
25 public void read(String packet) { | 25 public void read(String packet) { |
26 log.debug("Read packet " + packet); | 26 log.debug("Read packet " + packet); |
27 } | 27 } |
28 | |
29 public void write(String packet) { | 28 public void write(String packet) { |
30 log.debug("Write packet " + packet); | 29 log.debug("Write packet " + packet); |
31 } | 30 } |
32 }); | 31 }); |
33 } | 32 } |
37 this.listener = listener; | 36 this.listener = listener; |
38 } | 37 } |
39 | 38 |
40 public SFTPv6FileAttributes fstat(SFTPFileHandle handle) throws IOException { | 39 public SFTPv6FileAttributes fstat(SFTPFileHandle handle) throws IOException { |
41 int req_id = generateNextRequestID(); | 40 int req_id = generateNextRequestID(); |
42 | |
43 TypesWriter tw = new TypesWriter(); | 41 TypesWriter tw = new TypesWriter(); |
44 tw.writeString(handle.getHandle(), 0, handle.getHandle().length); | 42 tw.writeString(handle.getHandle(), 0, handle.getHandle().length); |
45 | |
46 sendMessage(Packet.SSH_FXP_FSTAT, req_id, tw.getBytes()); | 43 sendMessage(Packet.SSH_FXP_FSTAT, req_id, tw.getBytes()); |
47 | |
48 byte[] resp = receiveMessage(34000); | 44 byte[] resp = receiveMessage(34000); |
49 | |
50 TypesReader tr = new TypesReader(resp); | 45 TypesReader tr = new TypesReader(resp); |
51 | |
52 int t = tr.readByte(); | 46 int t = tr.readByte(); |
53 listener.read(Packet.forName(t)); | 47 listener.read(Packet.forName(t)); |
54 | |
55 int rep_id = tr.readUINT32(); | 48 int rep_id = tr.readUINT32(); |
56 if(rep_id != req_id) { | 49 |
50 if (rep_id != req_id) { | |
57 throw new RequestMismatchException(); | 51 throw new RequestMismatchException(); |
58 } | 52 } |
59 | 53 |
60 if(t == Packet.SSH_FXP_ATTRS) { | 54 if (t == Packet.SSH_FXP_ATTRS) { |
61 return new SFTPv6FileAttributes(tr); | 55 return new SFTPv6FileAttributes(tr); |
62 } | 56 } |
63 | 57 |
64 if(t != Packet.SSH_FXP_STATUS) { | 58 if (t != Packet.SSH_FXP_STATUS) { |
65 throw new PacketTypeException(t); | 59 throw new PacketTypeException(t); |
66 } | 60 } |
67 | 61 |
68 int errorCode = tr.readUINT32(); | 62 int errorCode = tr.readUINT32(); |
69 String errorMessage = tr.readString(); | 63 String errorMessage = tr.readString(); |
71 throw new SFTPException(errorMessage, errorCode); | 65 throw new SFTPException(errorMessage, errorCode); |
72 } | 66 } |
73 | 67 |
74 private SFTPv6FileAttributes statBoth(String path, int statMethod) throws IOException { | 68 private SFTPv6FileAttributes statBoth(String path, int statMethod) throws IOException { |
75 int req_id = generateNextRequestID(); | 69 int req_id = generateNextRequestID(); |
76 | |
77 TypesWriter tw = new TypesWriter(); | 70 TypesWriter tw = new TypesWriter(); |
78 tw.writeString(path, this.getCharset()); | 71 tw.writeString(path, this.getCharset()); |
79 | |
80 sendMessage(statMethod, req_id, tw.getBytes()); | 72 sendMessage(statMethod, req_id, tw.getBytes()); |
81 | |
82 byte[] resp = receiveMessage(34000); | 73 byte[] resp = receiveMessage(34000); |
83 | |
84 TypesReader tr = new TypesReader(resp); | 74 TypesReader tr = new TypesReader(resp); |
85 | |
86 int t = tr.readByte(); | 75 int t = tr.readByte(); |
87 listener.read(Packet.forName(t)); | 76 listener.read(Packet.forName(t)); |
88 | |
89 int rep_id = tr.readUINT32(); | 77 int rep_id = tr.readUINT32(); |
90 if(rep_id != req_id) { | 78 |
79 if (rep_id != req_id) { | |
91 throw new RequestMismatchException(); | 80 throw new RequestMismatchException(); |
92 } | 81 } |
93 | 82 |
94 if(t == Packet.SSH_FXP_ATTRS) { | 83 if (t == Packet.SSH_FXP_ATTRS) { |
95 return new SFTPv6FileAttributes(tr); | 84 return new SFTPv6FileAttributes(tr); |
96 } | 85 } |
97 | 86 |
98 if(t != Packet.SSH_FXP_STATUS) { | 87 if (t != Packet.SSH_FXP_STATUS) { |
99 throw new PacketTypeException(t); | 88 throw new PacketTypeException(t); |
100 } | 89 } |
101 | 90 |
102 int errorCode = tr.readUINT32(); | 91 int errorCode = tr.readUINT32(); |
103 String errorMessage = tr.readString(); | 92 String errorMessage = tr.readString(); |
115 | 104 |
116 | 105 |
117 private List<SFTPv6DirectoryEntry> scanDirectory(byte[] handle) throws IOException { | 106 private List<SFTPv6DirectoryEntry> scanDirectory(byte[] handle) throws IOException { |
118 List<SFTPv6DirectoryEntry> files = new ArrayList<SFTPv6DirectoryEntry>(); | 107 List<SFTPv6DirectoryEntry> files = new ArrayList<SFTPv6DirectoryEntry>(); |
119 | 108 |
120 while(true) { | 109 while (true) { |
121 int req_id = generateNextRequestID(); | 110 int req_id = generateNextRequestID(); |
122 | |
123 TypesWriter tw = new TypesWriter(); | 111 TypesWriter tw = new TypesWriter(); |
124 tw.writeString(handle, 0, handle.length); | 112 tw.writeString(handle, 0, handle.length); |
125 | |
126 sendMessage(Packet.SSH_FXP_READDIR, req_id, tw.getBytes()); | 113 sendMessage(Packet.SSH_FXP_READDIR, req_id, tw.getBytes()); |
127 | |
128 byte[] resp = receiveMessage(34000); | 114 byte[] resp = receiveMessage(34000); |
129 | |
130 TypesReader tr = new TypesReader(resp); | 115 TypesReader tr = new TypesReader(resp); |
131 | |
132 int t = tr.readByte(); | 116 int t = tr.readByte(); |
133 listener.read(Packet.forName(t)); | 117 listener.read(Packet.forName(t)); |
134 int rep_id = tr.readUINT32(); | 118 int rep_id = tr.readUINT32(); |
135 if(rep_id != req_id) { | 119 |
120 if (rep_id != req_id) { | |
136 throw new RequestMismatchException(); | 121 throw new RequestMismatchException(); |
137 } | 122 } |
138 if(t == Packet.SSH_FXP_NAME) { | 123 |
124 if (t == Packet.SSH_FXP_NAME) { | |
139 int count = tr.readUINT32(); | 125 int count = tr.readUINT32(); |
140 if(log.isDebugEnabled()) { | 126 |
127 if (log.isDebugEnabled()) { | |
141 log.debug(String.format("Parsing %d name entries", count)); | 128 log.debug(String.format("Parsing %d name entries", count)); |
142 } | 129 } |
143 while(count > 0) { | 130 |
131 while (count > 0) { | |
144 SFTPv6DirectoryEntry file = new SFTPv6DirectoryEntry(); | 132 SFTPv6DirectoryEntry file = new SFTPv6DirectoryEntry(); |
145 file.filename = tr.readString(this.getCharset()); | 133 file.filename = tr.readString(this.getCharset()); |
146 listener.read(file.filename); | 134 listener.read(file.filename); |
147 file.attributes = new SFTPv6FileAttributes(tr); | 135 file.attributes = new SFTPv6FileAttributes(tr); |
148 if(log.isDebugEnabled()) { | 136 |
137 if (log.isDebugEnabled()) { | |
149 log.debug(String.format("Adding file %s", file)); | 138 log.debug(String.format("Adding file %s", file)); |
150 } | 139 } |
140 | |
151 files.add(file); | 141 files.add(file); |
152 count--; | 142 count--; |
153 } | 143 } |
144 | |
154 continue; | 145 continue; |
155 } | 146 } |
156 if(t != Packet.SSH_FXP_STATUS) { | 147 |
148 if (t != Packet.SSH_FXP_STATUS) { | |
157 throw new PacketTypeException(t); | 149 throw new PacketTypeException(t); |
158 } | 150 } |
151 | |
159 int errorCode = tr.readUINT32(); | 152 int errorCode = tr.readUINT32(); |
160 if(errorCode == ErrorCodes.SSH_FX_EOF) { | 153 |
154 if (errorCode == ErrorCodes.SSH_FX_EOF) { | |
161 return files; | 155 return files; |
162 } | 156 } |
157 | |
163 String errorMessage = tr.readString(); | 158 String errorMessage = tr.readString(); |
164 listener.read(errorMessage); | 159 listener.read(errorMessage); |
165 throw new SFTPException(errorMessage, errorCode); | 160 throw new SFTPException(errorMessage, errorCode); |
166 } | 161 } |
167 } | 162 } |
168 | 163 |
169 public final SFTPFileHandle openDirectory(String path) throws IOException { | 164 public final SFTPFileHandle openDirectory(String path) throws IOException { |
170 int req_id = generateNextRequestID(); | 165 int req_id = generateNextRequestID(); |
171 | |
172 TypesWriter tw = new TypesWriter(); | 166 TypesWriter tw = new TypesWriter(); |
173 tw.writeString(path, this.getCharset()); | 167 tw.writeString(path, this.getCharset()); |
174 | |
175 sendMessage(Packet.SSH_FXP_OPENDIR, req_id, tw.getBytes()); | 168 sendMessage(Packet.SSH_FXP_OPENDIR, req_id, tw.getBytes()); |
176 | |
177 byte[] resp = receiveMessage(34000); | 169 byte[] resp = receiveMessage(34000); |
178 | |
179 TypesReader tr = new TypesReader(resp); | 170 TypesReader tr = new TypesReader(resp); |
180 | |
181 int t = tr.readByte(); | 171 int t = tr.readByte(); |
182 listener.read(Packet.forName(t)); | 172 listener.read(Packet.forName(t)); |
183 | |
184 int rep_id = tr.readUINT32(); | 173 int rep_id = tr.readUINT32(); |
185 if(rep_id != req_id) { | 174 |
175 if (rep_id != req_id) { | |
186 throw new RequestMismatchException(); | 176 throw new RequestMismatchException(); |
187 } | 177 } |
188 | 178 |
189 if(t == Packet.SSH_FXP_HANDLE) { | 179 if (t == Packet.SSH_FXP_HANDLE) { |
190 return new SFTPFileHandle(this, tr.readByteString()); | 180 return new SFTPFileHandle(this, tr.readByteString()); |
191 } | 181 } |
192 | 182 |
193 if(t != Packet.SSH_FXP_STATUS) { | 183 if (t != Packet.SSH_FXP_STATUS) { |
194 throw new PacketTypeException(t); | 184 throw new PacketTypeException(t); |
195 } | 185 } |
196 | 186 |
197 int errorCode = tr.readUINT32(); | 187 int errorCode = tr.readUINT32(); |
198 String errorMessage = tr.readString(); | 188 String errorMessage = tr.readString(); |
249 } | 239 } |
250 | 240 |
251 @Override | 241 @Override |
252 public SFTPFileHandle openFile(String filename, int flags, SFTPFileAttributes attr) throws IOException { | 242 public SFTPFileHandle openFile(String filename, int flags, SFTPFileAttributes attr) throws IOException { |
253 int req_id = generateNextRequestID(); | 243 int req_id = generateNextRequestID(); |
254 | |
255 TypesWriter tw = new TypesWriter(); | 244 TypesWriter tw = new TypesWriter(); |
256 tw.writeString(filename, this.getCharset()); | 245 tw.writeString(filename, this.getCharset()); |
257 tw.writeUINT32(AceMask.ACE4_READ_DATA | AceMask.ACE4_READ_ATTRIBUTES | AceMask.ACE4_READ_ACL | AceMask.ACE4_READ_NAMED_ATTRS | 246 tw.writeUINT32(AceMask.ACE4_READ_DATA | AceMask.ACE4_READ_ATTRIBUTES | AceMask.ACE4_READ_ACL | AceMask.ACE4_READ_NAMED_ATTRS |
258 | AceMask.ACE4_WRITE_DATA | AceMask.ACE4_APPEND_DATA | AceMask.ACE4_WRITE_ATTRIBUTES | AceMask.ACE4_WRITE_ACL | AceMask.ACE4_WRITE_NAMED_ATTRS); | 247 | AceMask.ACE4_WRITE_DATA | AceMask.ACE4_APPEND_DATA | AceMask.ACE4_WRITE_ATTRIBUTES | AceMask.ACE4_WRITE_ACL | AceMask.ACE4_WRITE_NAMED_ATTRS); |
259 tw.writeUINT32(flags); | 248 tw.writeUINT32(flags); |
260 | |
261 tw.writeBytes(attr.toBytes()); | 249 tw.writeBytes(attr.toBytes()); |
262 | |
263 sendMessage(Packet.SSH_FXP_OPEN, req_id, tw.getBytes()); | 250 sendMessage(Packet.SSH_FXP_OPEN, req_id, tw.getBytes()); |
264 | |
265 byte[] resp = receiveMessage(34000); | 251 byte[] resp = receiveMessage(34000); |
266 | |
267 TypesReader tr = new TypesReader(resp); | 252 TypesReader tr = new TypesReader(resp); |
268 | |
269 int t = tr.readByte(); | 253 int t = tr.readByte(); |
270 listener.read(Packet.forName(t)); | 254 listener.read(Packet.forName(t)); |
271 | |
272 int rep_id = tr.readUINT32(); | 255 int rep_id = tr.readUINT32(); |
273 if(rep_id != req_id) { | 256 |
257 if (rep_id != req_id) { | |
274 throw new RequestMismatchException(); | 258 throw new RequestMismatchException(); |
275 } | 259 } |
276 | 260 |
277 if(t == Packet.SSH_FXP_HANDLE) { | 261 if (t == Packet.SSH_FXP_HANDLE) { |
278 return new SFTPFileHandle(this, tr.readByteString()); | 262 return new SFTPFileHandle(this, tr.readByteString()); |
279 } | 263 } |
280 | 264 |
281 if(t != Packet.SSH_FXP_STATUS) { | 265 if (t != Packet.SSH_FXP_STATUS) { |
282 throw new PacketTypeException(t); | 266 throw new PacketTypeException(t); |
283 } | 267 } |
284 | 268 |
285 int errorCode = tr.readUINT32(); | 269 int errorCode = tr.readUINT32(); |
286 String errorMessage = tr.readString(); | 270 String errorMessage = tr.readString(); |
289 } | 273 } |
290 | 274 |
291 @Override | 275 @Override |
292 public void createSymlink(String src, String target) throws IOException { | 276 public void createSymlink(String src, String target) throws IOException { |
293 int req_id = generateNextRequestID(); | 277 int req_id = generateNextRequestID(); |
294 | |
295 TypesWriter tw = new TypesWriter(); | 278 TypesWriter tw = new TypesWriter(); |
296 // new-link-path | 279 // new-link-path |
297 tw.writeString(src, this.getCharset()); | 280 tw.writeString(src, this.getCharset()); |
298 // existing-path | 281 // existing-path |
299 tw.writeString(target, this.getCharset()); | 282 tw.writeString(target, this.getCharset()); |
300 tw.writeBoolean(true); | 283 tw.writeBoolean(true); |
301 | |
302 sendMessage(Packet.SSH_FXP_LINK, req_id, tw.getBytes()); | 284 sendMessage(Packet.SSH_FXP_LINK, req_id, tw.getBytes()); |
303 | |
304 expectStatusOKMessage(req_id); | 285 expectStatusOKMessage(req_id); |
305 } | 286 } |
306 | 287 |
307 @Override | 288 @Override |
308 public void createHardlink(String src, String target) throws IOException { | 289 public void createHardlink(String src, String target) throws IOException { |
309 int req_id = generateNextRequestID(); | 290 int req_id = generateNextRequestID(); |
310 | |
311 TypesWriter tw = new TypesWriter(); | 291 TypesWriter tw = new TypesWriter(); |
312 // new-link-path | 292 // new-link-path |
313 tw.writeString(src, this.getCharset()); | 293 tw.writeString(src, this.getCharset()); |
314 // existing-path | 294 // existing-path |
315 tw.writeString(target, this.getCharset()); | 295 tw.writeString(target, this.getCharset()); |
316 tw.writeBoolean(false); | 296 tw.writeBoolean(false); |
317 | |
318 sendMessage(Packet.SSH_FXP_LINK, req_id, tw.getBytes()); | 297 sendMessage(Packet.SSH_FXP_LINK, req_id, tw.getBytes()); |
319 | |
320 expectStatusOKMessage(req_id); | 298 expectStatusOKMessage(req_id); |
321 } | 299 } |
322 } | 300 } |