1 /* 2 * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.nio.file.attribute; 27 28 import java.nio.file.*; 29 import java.util.List; 30 import java.io.IOException; 31 32 /** 33 * A file attribute view that supports reading or updating a file's Access 34 * Control Lists (ACL) or file owner attributes. 35 * 36 * <p> ACLs are used to specify access rights to file system objects. An ACL is 37 * an ordered list of {@link AclEntry access-control-entries}, each specifying a 38 * {@link UserPrincipal} and the level of access for that user principal. This 39 * file attribute view defines the {@link #getAcl() getAcl}, and {@link 40 * #setAcl(List) setAcl} methods to read and write ACLs based on the ACL 41 * model specified in <a href="http://www.ietf.org/rfc/rfc3530.txt"><i>RFC 3530: 42 * Network File System (NFS) version 4 Protocol</i></a>. This file attribute view 43 * is intended for file system implementations that support the NFSv4 ACL model 44 * or have a <em>well-defined</em> mapping between the NFSv4 ACL model and the ACL 45 * model used by the file system. The details of such mapping are implementation 46 * dependent and are therefore unspecified. 47 * 48 * <p> This class also extends {@code FileOwnerAttributeView} so as to define 49 * methods to get and set the file owner. 50 * 51 * <p> When a file system provides access to a set of {@link FileStore 52 * file-systems} that are not homogeneous then only some of the file systems may 53 * support ACLs. The {@link FileStore#supportsFileAttributeView 54 * supportsFileAttributeView} method can be used to test if a file system 55 * supports ACLs. 56 * 57 * <h2>Interoperability</h2> 58 * 59 * RFC 3530 allows for special user identities to be used on platforms that 60 * support the POSIX defined access permissions. The special user identities 61 * are "{@code OWNER@}", "{@code GROUP@}", and "{@code EVERYONE@}". When both 62 * the {@code AclFileAttributeView} and the {@link PosixFileAttributeView} 63 * are supported then these special user identities may be included in ACL {@link 64 * AclEntry entries} that are read or written. The file system's {@link 65 * UserPrincipalLookupService} may be used to obtain a {@link UserPrincipal} 66 * to represent these special identities by invoking the {@link 67 * UserPrincipalLookupService#lookupPrincipalByName lookupPrincipalByName} 68 * method. 69 * 70 * <p> <b>Usage Example:</b> 71 * Suppose we wish to add an entry to an existing ACL to grant "joe" access: 72 * <pre> 73 * // lookup "joe" 74 * UserPrincipal joe = file.getFileSystem().getUserPrincipalLookupService() 75 * .lookupPrincipalByName("joe"); 76 * 77 * // get view 78 * AclFileAttributeView view = Files.getFileAttributeView(file, AclFileAttributeView.class); 79 * 80 * // create ACE to give "joe" read access 81 * AclEntry entry = AclEntry.newBuilder() 82 * .setType(AclEntryType.ALLOW) 83 * .setPrincipal(joe) 84 * .setPermissions(AclEntryPermission.READ_DATA, AclEntryPermission.READ_ATTRIBUTES) 85 * .build(); 86 * 87 * // read ACL, insert ACE, re-write ACL 88 * List<AclEntry> acl = view.getAcl(); 89 * acl.add(0, entry); // insert before any DENY entries 90 * view.setAcl(acl); 91 * </pre> 92 * 93 * <h2> Dynamic Access </h2> 94 * <p> Where dynamic access to file attributes is required, the attributes 95 * supported by this attribute view are as follows: 96 * <blockquote> 97 * <table border="1" cellpadding="8" summary="Supported attributes"> 98 * <tr> 99 * <th> Name </th> 100 * <th> Type </th> 101 * </tr> 102 * <tr> 103 * <td> "acl" </td> 104 * <td> {@link List}<{@link AclEntry}> </td> 105 * </tr> 106 * <tr> 107 * <td> "owner" </td> 108 * <td> {@link UserPrincipal} </td> 109 * </tr> 110 * </table> 111 * </blockquote> 112 * 113 * <p> The {@link Files#getAttribute getAttribute} method may be used to read 114 * the ACL or owner attributes as if by invoking the {@link #getAcl getAcl} or 115 * {@link #getOwner getOwner} methods. 116 * 117 * <p> The {@link Files#setAttribute setAttribute} method may be used to 118 * update the ACL or owner attributes as if by invoking the {@link #setAcl setAcl} 119 * or {@link #setOwner setOwner} methods. 120 * 121 * <h2> Setting the ACL when creating a file </h2> 122 * 123 * <p> Implementations supporting this attribute view may also support setting 124 * the initial ACL when creating a file or directory. The initial ACL 125 * may be provided to methods such as {@link Files#createFile createFile} or {@link 126 * Files#createDirectory createDirectory} as an {@link FileAttribute} with {@link 127 * FileAttribute#name name} {@code "acl:acl"} and a {@link FileAttribute#value 128 * value} that is the list of {@code AclEntry} objects. 129 * 130 * <p> Where an implementation supports an ACL model that differs from the NFSv4 131 * defined ACL model then setting the initial ACL when creating the file must 132 * translate the ACL to the model supported by the file system. Methods that 133 * create a file should reject (by throwing {@link IOException IOException}) 134 * any attempt to create a file that would be less secure as a result of the 135 * translation. 136 * 137 * @since 1.7 138 */ 139 140 public interface AclFileAttributeView 141 extends FileOwnerAttributeView 142 { 143 /** 144 * Returns the name of the attribute view. Attribute views of this type 145 * have the name {@code "acl"}. 146 */ 147 @Override name()148 String name(); 149 150 /** 151 * Reads the access control list. 152 * 153 * <p> When the file system uses an ACL model that differs from the NFSv4 154 * defined ACL model, then this method returns an ACL that is the translation 155 * of the ACL to the NFSv4 ACL model. 156 * 157 * <p> The returned list is modifiable so as to facilitate changes to the 158 * existing ACL. The {@link #setAcl setAcl} method is used to update 159 * the file's ACL attribute. 160 * 161 * @return an ordered list of {@link AclEntry entries} representing the 162 * ACL 163 * 164 * @throws IOException 165 * if an I/O error occurs 166 * @throws SecurityException 167 * In the case of the default provider, a security manager is 168 * installed, and it denies {@link RuntimePermission}<tt>("accessUserInformation")</tt> 169 * or its {@link SecurityManager#checkRead(String) checkRead} method 170 * denies read access to the file. 171 */ getAcl()172 List<AclEntry> getAcl() throws IOException; 173 174 /** 175 * Updates (replace) the access control list. 176 * 177 * <p> Where the file system supports Access Control Lists, and it uses an 178 * ACL model that differs from the NFSv4 defined ACL model, then this method 179 * must translate the ACL to the model supported by the file system. This 180 * method should reject (by throwing {@link IOException IOException}) any 181 * attempt to write an ACL that would appear to make the file more secure 182 * than would be the case if the ACL were updated. Where an implementation 183 * does not support a mapping of {@link AclEntryType#AUDIT} or {@link 184 * AclEntryType#ALARM} entries, then this method ignores these entries when 185 * writing the ACL. 186 * 187 * <p> If an ACL entry contains a {@link AclEntry#principal user-principal} 188 * that is not associated with the same provider as this attribute view then 189 * {@link ProviderMismatchException} is thrown. Additional validation, if 190 * any, is implementation dependent. 191 * 192 * <p> If the file system supports other security related file attributes 193 * (such as a file {@link PosixFileAttributes#permissions 194 * access-permissions} for example), the updating the access control list 195 * may also cause these security related attributes to be updated. 196 * 197 * @param acl 198 * the new access control list 199 * 200 * @throws IOException 201 * if an I/O error occurs or the ACL is invalid 202 * @throws SecurityException 203 * In the case of the default provider, a security manager is 204 * installed, it denies {@link RuntimePermission}<tt>("accessUserInformation")</tt> 205 * or its {@link SecurityManager#checkWrite(String) checkWrite} 206 * method denies write access to the file. 207 */ setAcl(List<AclEntry> acl)208 void setAcl(List<AclEntry> acl) throws IOException; 209 } 210