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}