Mercurial > 510Connectbot
diff src/ch/ethz/ssh2/SFTPv6FileAttributes.java @ 273:91a31873c42a ganymed
start conversion from trilead to ganymed
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Fri, 18 Jul 2014 11:21:46 -0700 |
parents | |
children | d2b303406d63 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ch/ethz/ssh2/SFTPv6FileAttributes.java Fri Jul 18 11:21:46 2014 -0700 @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2006-2011 Christian Plattner. All rights reserved. + * Please refer to the LICENSE.txt for licensing details. + */ +package ch.ethz.ssh2; + +import java.io.IOException; + +import ch.ethz.ssh2.packets.TypesReader; +import ch.ethz.ssh2.packets.TypesWriter; +import ch.ethz.ssh2.sftp.AttribFlags; +import ch.ethz.ssh2.sftp.AttribTypes; + +/** + * A <code>SFTPv3FileAttributes</code> object represents detail information + * about a file on the server. Not all fields may/must be present. + * + * @author Christian Plattner, plattner@inf.ethz.ch + * @version $Id: SFTPv6FileAttributes.java 133 2014-04-14 12:26:29Z dkocher@sudo.ch $ + */ + +public class SFTPv6FileAttributes implements SFTPFileAttributes { + + /** + * The type field is always present + * + * @see ch.ethz.ssh2.sftp.AttribTypes + */ + private Integer type = null; + + /** + * The SIZE attribute. <code>NULL</code> if not present. + */ + public Long size = null; + + /** + * The POSIX permissions. <code>NULL</code> if not present. + * <p/> + * Here is a list: + * <p/> + * <pre>Note: these numbers are all OCTAL. + * <p/> + * S_IFMT 0170000 bitmask for the file type bitfields + * S_IFSOCK 0140000 socket + * S_IFLNK 0120000 symbolic link + * S_IFREG 0100000 regular file + * S_IFBLK 0060000 block device + * S_IFDIR 0040000 directory + * S_IFCHR 0020000 character device + * S_IFIFO 0010000 fifo + * S_ISUID 0004000 set UID bit + * S_ISGID 0002000 set GID bit + * S_ISVTX 0001000 sticky bit + * <p/> + * S_IRWXU 00700 mask for file owner permissions + * S_IRUSR 00400 owner has read permission + * S_IWUSR 00200 owner has write permission + * S_IXUSR 00100 owner has execute permission + * S_IRWXG 00070 mask for group permissions + * S_IRGRP 00040 group has read permission + * S_IWGRP 00020 group has write permission + * S_IXGRP 00010 group has execute permission + * S_IRWXO 00007 mask for permissions for others (not in group) + * S_IROTH 00004 others have read permission + * S_IWOTH 00002 others have write permisson + * S_IXOTH 00001 others have execute permission + * </pre> + */ + public Integer permissions = null; + + /** + * Creation time of the file. + * <p/> + * The createtime attribute. Represented as seconds from Jan 1, 1970 in UTC. + * <code>NULL</code> if not present. + */ + public Long createtime = null; + + /** + * Last access time of the file. + * <p/> + * The atime attribute. Represented as seconds from Jan 1, 1970 in UTC. + * <code>NULL</code> if not present. + */ + public Long atime = null; + + /** + * The mtime attribute. Represented as seconds from Jan 1, 1970 in UTC. + * <code>NULL</code> if not present. + */ + public Long mtime = null; + + /** + * Last time the file attributes were changed. The exact meaning of this field depends on the server. + * <p/> + * The ctime attribute. Represented as seconds from Jan 1, 1970 in UTC. + * <code>NULL</code> if not present. + */ + public Long ctime = null; + + /** + * The 'owner' and 'group' fields are represented as UTF-8 strings. user@localhost represents + * a user in the context of the server. + */ + public String owner = null; + + /** + * The 'owner' and 'group' fields are represented as UTF-8 strings + */ + public String group = null; + + /** + * Checks if this entry is a directory. + * + * @return Returns true if permissions are available and they indicate + * that this entry represents a directory. + */ + @Override + public boolean isDirectory() { + return (type & AttribTypes.SSH_FILEXFER_TYPE_DIRECTORY) == AttribTypes.SSH_FILEXFER_TYPE_DIRECTORY; + } + + /** + * Checks if this entry is a regular file. + * + * @return Returns true if permissions are available and they indicate + * that this entry represents a regular file. + */ + @Override + public boolean isRegularFile() { + return (type & AttribTypes.SSH_FILEXFER_TYPE_REGULAR) == AttribTypes.SSH_FILEXFER_TYPE_REGULAR; + } + + /** + * Checks if this entry is a a symlink. + * + * @return Returns true if permissions are available and they indicate + * that this entry represents a symlink. + */ + @Override + public boolean isSymlink() { + return (type & AttribTypes.SSH_FILEXFER_TYPE_SYMLINK) == AttribTypes.SSH_FILEXFER_TYPE_SYMLINK; + } + + public SFTPv6FileAttributes() { + // + } + + /** + * uint32 valid-attribute-flags + * byte type always present + * uint64 size if flag SIZE + * uint64 allocation-size if flag ALLOCATION_SIZE + * string owner if flag OWNERGROUP + * string group if flag OWNERGROUP + * uint32 permissions if flag PERMISSIONS + * int64 atime if flag ACCESSTIME + * uint32 atime-nseconds if flag SUBSECOND_TIMES + * int64 createtime if flag CREATETIME + * uint32 createtime-nseconds if flag SUBSECOND_TIMES + * int64 mtime if flag MODIFYTIME + * uint32 mtime-nseconds if flag SUBSECOND_TIMES + * int64 ctime if flag CTIME + * uint32 ctime-nseconds if flag SUBSECOND_TIMES + * string acl if flag ACL + * uint32 attrib-bits if flag BITS + * uint32 attrib-bits-valid if flag BITS + * byte text-hint if flag TEXT_HINT + * string mime-type if flag MIME_TYPE + * uint32 link-count if flag LINK_COUNT + * string untranslated-name if flag UNTRANSLATED_NAME + * uint32 extended-count if flag EXTENDED + * extension-pair extensions + */ + public SFTPv6FileAttributes(final TypesReader tr) throws IOException { + int flags = tr.readUINT32(); + // The type field is always present + this.type = tr.readByte(); + if((flags & AttribFlags.SSH_FILEXFER_ATTR_SIZE) != 0) { + this.size = tr.readUINT64(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_ALLOCATION_SIZE) != 0) { + // Ignore + tr.readUINT64(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_OWNERGROUP) != 0) { + this.owner = tr.readString(); + this.group = tr.readString(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_PERMISSIONS) != 0) { + this.permissions = tr.readUINT32(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_ACCESSTIME) != 0) { + this.atime = tr.readUINT64(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_SUBSECOND_TIMES) != 0) { + // Ignore + tr.readUINT32(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_CREATETIME) != 0) { + this.createtime = tr.readUINT64(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_SUBSECOND_TIMES) != 0) { + // Ignore + tr.readUINT32(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_MODIFYTIME) != 0) { + this.mtime = tr.readUINT64(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_SUBSECOND_TIMES) != 0) { + // Ignore + tr.readUINT32(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_CTIME) != 0) { + this.ctime = tr.readUINT64(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_SUBSECOND_TIMES) != 0) { + // Ignore + tr.readUINT32(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_ACL) != 0) { + // Ignore + tr.readString(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_BITS) != 0) { + // Ignore attrib-bits + tr.readUINT32(); + // Ignore attrib-bits-valid + tr.readUINT32(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_TEXT_HINT) != 0) { + // Ignore + tr.readByte(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_MIME_TYPE) != 0) { + // Ignore + tr.readString(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_LINK_COUNT) != 0) { + // Ignore + tr.readUINT32(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_UNTRANSLATED_NAME) != 0) { + // Ignore + tr.readString(); + } + if((flags & AttribFlags.SSH_FILEXFER_ATTR_EXTENDED) != 0) { + int count = tr.readUINT32(); + // Read it anyway to detect corrupt packets + while(count > 0) { + // extension-name + tr.readByteString(); + // extension-data + tr.readByteString(); + count--; + } + } + } + + /** + * The same encoding is used both when returning file + * attributes from the server and when sending file attributes to the + * server. + * + * @return Encoded attributes + */ + @Override + public byte[] toBytes() { + TypesWriter tw = new TypesWriter(); + // The 'valid-attribute-flags' specifies which of the fields are present. Those fields + // for which the corresponding flag is not set are not present + int attrFlags = 0; + if(this.size != null) { + attrFlags = attrFlags | AttribFlags.SSH_FILEXFER_ATTR_SIZE; + } + if((this.owner != null) && (this.group != null)) { + // If either the owner or group field is zero length, the field should + // be considered absent, and no change should be made to that specific + // field during a modification operation. + attrFlags = attrFlags | AttribFlags.SSH_FILEXFER_ATTR_OWNERGROUP; + } + if(this.permissions != null) { + attrFlags = attrFlags | AttribFlags.SSH_FILEXFER_ATTR_PERMISSIONS; + } + if(this.atime != null) { + attrFlags = attrFlags | AttribFlags.SSH_FILEXFER_ATTR_ACCESSTIME; + } + if(this.createtime != null) { + attrFlags = attrFlags | AttribFlags.SSH_FILEXFER_ATTR_CREATETIME; + } + if(this.mtime != null) { + attrFlags = attrFlags | AttribFlags.SSH_FILEXFER_ATTR_MODIFYTIME; + } + if(this.ctime != null) { + attrFlags = attrFlags | AttribFlags.SSH_FILEXFER_ATTR_CTIME; + } + tw.writeUINT32(attrFlags); + // The type field is always present. + if(this.size != null) { + tw.writeUINT64(this.size); + } + if((this.owner != null) && (this.group != null)) { + tw.writeString(owner); + tw.writeString(group); + } + if(this.permissions != null) { + tw.writeUINT32(this.permissions); + } + if(this.atime != null) { + tw.writeUINT64(this.atime); + } + if(this.createtime != null) { + tw.writeUINT64(this.createtime); + } + if(this.mtime != null) { + tw.writeUINT64(this.mtime); + } + if(this.ctime != null) { + tw.writeUINT64(this.ctime); + } + return tw.getBytes(); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SFTPv6FileAttributes{"); + sb.append("type=").append(type); + sb.append(", size=").append(size); + sb.append(", permissions=").append(permissions); + sb.append(", createtime=").append(createtime); + sb.append(", atime=").append(atime); + sb.append(", mtime=").append(mtime); + sb.append(", ctime=").append(ctime); + sb.append(", owner='").append(owner).append('\''); + sb.append(", group='").append(group).append('\''); + sb.append('}'); + return sb.toString(); + } +} \ No newline at end of file