148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/* 248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Copyright (c) 2006-2011 Christian Plattner. All rights reserved. 348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Please refer to the LICENSE.txt for licensing details. 448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpackage ch.ethz.ssh2; 648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/** 848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * A <code>SFTPv3FileAttributes</code> object represents detail information 948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * about a file on the server. Not all fields may/must be present. 1048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 1148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @author Christian Plattner, plattner@inf.ethz.ch 1248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @version $Id: SFTPv3FileAttributes.java 42 2011-06-02 15:34:20Z dkocher@sudo.ch $ 1348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 1448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 1548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpublic class SFTPv3FileAttributes 1648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood{ 1748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 1848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The SIZE attribute. <code>NULL</code> if not present. 1948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 2048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public Long size = null; 2148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 2248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 2348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The UID attribute. <code>NULL</code> if not present. 2448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 2548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public Integer uid = null; 2648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 2748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 2848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The GID attribute. <code>NULL</code> if not present. 2948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 3048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public Integer gid = null; 3148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 3248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 3348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The POSIX permissions. <code>NULL</code> if not present. 3448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <p> 3548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Here is a list: 3648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <p> 3748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <pre>Note: these numbers are all OCTAL. 3848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 3948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFMT 0170000 bitmask for the file type bitfields 4048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFSOCK 0140000 socket 4148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFLNK 0120000 symbolic link 4248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFREG 0100000 regular file 4348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFBLK 0060000 block device 4448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFDIR 0040000 directory 4548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFCHR 0020000 character device 4648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IFIFO 0010000 fifo 4748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_ISUID 0004000 set UID bit 4848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_ISGID 0002000 set GID bit 4948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_ISVTX 0001000 sticky bit 5048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 5148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IRWXU 00700 mask for file owner permissions 5248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IRUSR 00400 owner has read permission 5348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IWUSR 00200 owner has write permission 5448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IXUSR 00100 owner has execute permission 5548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IRWXG 00070 mask for group permissions 5648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IRGRP 00040 group has read permission 5748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IWGRP 00020 group has write permission 5848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IXGRP 00010 group has execute permission 5948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IRWXO 00007 mask for permissions for others (not in group) 6048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IROTH 00004 others have read permission 6148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IWOTH 00002 others have write permisson 6248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * S_IXOTH 00001 others have execute permission 6348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * </pre> 6448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 6548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public Integer permissions = null; 6648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 6748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 6848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The ATIME attribute. Represented as seconds from Jan 1, 1970 in UTC. 6948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <code>NULL</code> if not present. 7048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 7148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public Integer atime = null; 7248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 7348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 7448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The MTIME attribute. Represented as seconds from Jan 1, 1970 in UTC. 7548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <code>NULL</code> if not present. 7648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 7748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public Integer mtime = null; 7848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 7948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 8048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Checks if this entry is a directory. 8148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 8248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @return Returns true if permissions are available and they indicate 8348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * that this entry represents a directory. 8448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 8548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public boolean isDirectory() 8648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 8748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (permissions == null) 8848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return false; 8948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 9048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return ((permissions.intValue() & 0040000) == 0040000); 9148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 9248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 9348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 9448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Checks if this entry is a regular file. 9548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 9648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @return Returns true if permissions are available and they indicate 9748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * that this entry represents a regular file. 9848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 9948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public boolean isRegularFile() 10048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 10148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (permissions == null) 10248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return false; 10348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 10448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return ((permissions.intValue() & 0100000) == 0100000); 10548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 10648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 10748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 10848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Checks if this entry is a a symlink. 10948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 11048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @return Returns true if permissions are available and they indicate 11148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * that this entry represents a symlink. 11248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 11348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public boolean isSymlink() 11448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 11548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (permissions == null) 11648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return false; 11748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 11848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return ((permissions.intValue() & 0120000) == 0120000); 11948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 12048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 12148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 12248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Turn the POSIX permissions into a 7 digit octal representation. 12348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Note: the returned value is first masked with <code>0177777</code>. 12448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 12548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @return <code>NULL</code> if permissions are not available. 12648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 12748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public String getOctalPermissions() 12848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 12948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (permissions == null) 13048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return null; 13148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 13248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood String res = Integer.toString(permissions.intValue() & 0177777, 8); 13348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 13448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood StringBuilder sb = new StringBuilder(); 13548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 13648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood int leadingZeros = 7 - res.length(); 13748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 13848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood while (leadingZeros > 0) 13948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 14048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood sb.append('0'); 14148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood leadingZeros--; 14248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 14348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 14448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood sb.append(res); 14548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 14648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return sb.toString(); 14748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 14848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood}