1 /* 2 * Unix SMB/Netbios implementation. 3 * Version 2.2.x 4 * Portable SMB ACL interface 5 * Copyright (C) Jeremy Allison 2000 6 * Copyright (C) 2007-2020 Wayne Davison 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 3 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * with this program; if not, visit the http://fsf.org website. 20 */ 21 22 #ifdef SUPPORT_ACLS 23 24 #ifdef HAVE_SYS_ACL_H 25 #include <sys/acl.h> 26 #endif 27 #ifdef HAVE_ACL_LIBACL_H 28 #include <acl/libacl.h> 29 #endif 30 31 #define SMB_MALLOC(cnt) new_array(char, cnt) 32 #define SMB_MALLOC_P(obj) new_array(obj, 1) 33 #define SMB_MALLOC_ARRAY(obj, cnt) new_array(obj, cnt) 34 #define SMB_REALLOC(mem, cnt) realloc_array(mem, char, cnt) 35 #define slprintf snprintf 36 37 #if defined HAVE_POSIX_ACLS /*-----------------------------------------------*/ 38 39 /* This is an identity mapping (just remove the SMB_). */ 40 41 #define SMB_ACL_TAG_T acl_tag_t 42 #define SMB_ACL_TYPE_T acl_type_t 43 44 /* Types of ACLs. */ 45 #define SMB_ACL_USER ACL_USER 46 #define SMB_ACL_USER_OBJ ACL_USER_OBJ 47 #define SMB_ACL_GROUP ACL_GROUP 48 #define SMB_ACL_GROUP_OBJ ACL_GROUP_OBJ 49 #define SMB_ACL_OTHER ACL_OTHER 50 #define SMB_ACL_MASK ACL_MASK 51 52 #define SMB_ACL_T acl_t 53 54 #define SMB_ACL_ENTRY_T acl_entry_t 55 56 #define SMB_ACL_FIRST_ENTRY ACL_FIRST_ENTRY 57 #define SMB_ACL_NEXT_ENTRY ACL_NEXT_ENTRY 58 59 #define SMB_ACL_TYPE_ACCESS ACL_TYPE_ACCESS 60 #define SMB_ACL_TYPE_DEFAULT ACL_TYPE_DEFAULT 61 62 #define SMB_ACL_VALID_NAME_BITS (4 | 2 | 1) 63 #define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1) 64 65 #define SMB_ACL_NEED_SORT 66 67 #elif defined HAVE_TRU64_ACLS /*---------------------------------------------*/ 68 69 /* This is for DEC/Compaq Tru64 UNIX */ 70 71 #define SMB_ACL_TAG_T acl_tag_t 72 #define SMB_ACL_TYPE_T acl_type_t 73 74 /* Types of ACLs. */ 75 #define SMB_ACL_USER ACL_USER 76 #define SMB_ACL_USER_OBJ ACL_USER_OBJ 77 #define SMB_ACL_GROUP ACL_GROUP 78 #define SMB_ACL_GROUP_OBJ ACL_GROUP_OBJ 79 #define SMB_ACL_OTHER ACL_OTHER 80 #define SMB_ACL_MASK ACL_MASK 81 82 #define SMB_ACL_T acl_t 83 84 #define SMB_ACL_ENTRY_T acl_entry_t 85 86 #define SMB_ACL_FIRST_ENTRY 0 87 #define SMB_ACL_NEXT_ENTRY 1 88 89 #define SMB_ACL_TYPE_ACCESS ACL_TYPE_ACCESS 90 #define SMB_ACL_TYPE_DEFAULT ACL_TYPE_DEFAULT 91 92 #define SMB_ACL_VALID_NAME_BITS (4 | 2 | 1) 93 #define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1) 94 95 #define SMB_ACL_NEED_SORT 96 97 #elif defined HAVE_UNIXWARE_ACLS || defined HAVE_SOLARIS_ACLS /*-------------*/ 98 99 /* Donated by Michael Davidson <md@sco.COM> for UnixWare / OpenUNIX. 100 * Modified by Toomas Soome <tsoome@ut.ee> for Solaris. */ 101 102 /* SVR4.2 ES/MP ACLs */ 103 typedef int SMB_ACL_TAG_T; 104 typedef int SMB_ACL_TYPE_T; 105 106 /* Types of ACLs. */ 107 #define SMB_ACL_USER USER 108 #define SMB_ACL_USER_OBJ USER_OBJ 109 #define SMB_ACL_GROUP GROUP 110 #define SMB_ACL_GROUP_OBJ GROUP_OBJ 111 #define SMB_ACL_OTHER OTHER_OBJ 112 #define SMB_ACL_MASK CLASS_OBJ 113 114 typedef struct SMB_ACL_T { 115 int size; 116 int count; 117 int next; 118 struct acl acl[1]; 119 } *SMB_ACL_T; 120 121 typedef struct acl *SMB_ACL_ENTRY_T; 122 123 #define SMB_ACL_FIRST_ENTRY 0 124 #define SMB_ACL_NEXT_ENTRY 1 125 126 #define SMB_ACL_TYPE_ACCESS 0 127 #define SMB_ACL_TYPE_DEFAULT 1 128 129 #define SMB_ACL_VALID_NAME_BITS (4 | 2 | 1) 130 #define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1) 131 132 #define SMB_ACL_NEED_SORT 133 134 #ifdef __CYGWIN__ 135 #define SMB_ACL_LOSES_SPECIAL_MODE_BITS 136 #endif 137 138 #elif defined HAVE_HPUX_ACLS /*----------------------------------------------*/ 139 140 /* Based on the Solaris & UnixWare code. */ 141 142 #ifndef __TANDEM 143 #undef GROUP 144 #endif 145 #include <sys/aclv.h> 146 147 /* SVR4.2 ES/MP ACLs */ 148 typedef int SMB_ACL_TAG_T; 149 typedef int SMB_ACL_TYPE_T; 150 151 /* Types of ACLs. */ 152 #define SMB_ACL_USER USER 153 #define SMB_ACL_USER_OBJ USER_OBJ 154 #define SMB_ACL_GROUP GROUP 155 #define SMB_ACL_GROUP_OBJ GROUP_OBJ 156 #define SMB_ACL_OTHER OTHER_OBJ 157 #define SMB_ACL_MASK CLASS_OBJ 158 159 typedef struct SMB_ACL_T { 160 int size; 161 int count; 162 int next; 163 struct acl acl[1]; 164 } *SMB_ACL_T; 165 166 typedef struct acl *SMB_ACL_ENTRY_T; 167 168 #define SMB_ACL_FIRST_ENTRY 0 169 #define SMB_ACL_NEXT_ENTRY 1 170 171 #define SMB_ACL_TYPE_ACCESS 0 172 #define SMB_ACL_TYPE_DEFAULT 1 173 174 #define SMB_ACL_VALID_NAME_BITS (4 | 2 | 1) 175 #define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1) 176 177 #define SMB_ACL_NEED_SORT 178 179 #elif defined HAVE_IRIX_ACLS /*----------------------------------------------*/ 180 181 /* IRIX ACLs */ 182 183 #define SMB_ACL_TAG_T acl_tag_t 184 #define SMB_ACL_TYPE_T acl_type_t 185 186 /* Types of ACLs. */ 187 #define SMB_ACL_USER ACL_USER 188 #define SMB_ACL_USER_OBJ ACL_USER_OBJ 189 #define SMB_ACL_GROUP ACL_GROUP 190 #define SMB_ACL_GROUP_OBJ ACL_GROUP_OBJ 191 #define SMB_ACL_OTHER ACL_OTHER_OBJ 192 #define SMB_ACL_MASK ACL_MASK 193 194 typedef struct SMB_ACL_T { 195 int next; 196 BOOL freeaclp; 197 struct acl *aclp; 198 } *SMB_ACL_T; 199 200 #define SMB_ACL_ENTRY_T acl_entry_t 201 202 #define SMB_ACL_FIRST_ENTRY 0 203 #define SMB_ACL_NEXT_ENTRY 1 204 205 #define SMB_ACL_TYPE_ACCESS ACL_TYPE_ACCESS 206 #define SMB_ACL_TYPE_DEFAULT ACL_TYPE_DEFAULT 207 208 #define SMB_ACL_VALID_NAME_BITS (4 | 2 | 1) 209 #define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1) 210 211 #define SMB_ACL_NEED_SORT 212 213 #elif defined HAVE_AIX_ACLS /*-----------------------------------------------*/ 214 215 /* Donated by Medha Date, mdate@austin.ibm.com, for IBM */ 216 217 #include "/usr/include/acl.h" 218 219 struct acl_entry_link{ 220 struct acl_entry_link *prevp; 221 struct new_acl_entry *entryp; 222 struct acl_entry_link *nextp; 223 int count; 224 }; 225 226 struct new_acl_entry{ 227 unsigned short ace_len; 228 unsigned short ace_type; 229 unsigned int ace_access; 230 struct ace_id ace_id[1]; 231 }; 232 233 #define SMB_ACL_ENTRY_T struct new_acl_entry* 234 #define SMB_ACL_T struct acl_entry_link* 235 236 #define SMB_ACL_TAG_T unsigned short 237 #define SMB_ACL_TYPE_T int 238 239 /* Types of ACLs. */ 240 #define SMB_ACL_USER ACEID_USER 241 #define SMB_ACL_USER_OBJ 3 242 #define SMB_ACL_GROUP ACEID_GROUP 243 #define SMB_ACL_GROUP_OBJ 4 244 #define SMB_ACL_OTHER 5 245 #define SMB_ACL_MASK 6 246 247 #define SMB_ACL_FIRST_ENTRY 1 248 #define SMB_ACL_NEXT_ENTRY 2 249 250 #define SMB_ACL_TYPE_ACCESS 0 251 #define SMB_ACL_TYPE_DEFAULT 1 252 253 #define SMB_ACL_VALID_NAME_BITS (4 | 2 | 1) 254 #define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1) 255 256 #define SMB_ACL_NEED_SORT 257 258 #elif defined(HAVE_OSX_ACLS) /*----------------------------------------------*/ 259 260 /* Special handling for OS X ACLs */ 261 262 #define SMB_ACL_TAG_T acl_tag_t 263 #define SMB_ACL_TYPE_T acl_type_t 264 265 #define SMB_ACL_T acl_t 266 267 #define SMB_ACL_ENTRY_T acl_entry_t 268 269 #define SMB_ACL_USER 1 270 #define SMB_ACL_GROUP 2 271 272 #define SMB_ACL_FIRST_ENTRY ACL_FIRST_ENTRY 273 #define SMB_ACL_NEXT_ENTRY ACL_NEXT_ENTRY 274 275 #define SMB_ACL_TYPE_ACCESS ACL_TYPE_EXTENDED 276 #define SMB_ACL_TYPE_DEFAULT ACL_TYPE_DEFAULT 277 278 #define SMB_ACL_VALID_NAME_BITS ((1<<25)-1) 279 #define SMB_ACL_VALID_OBJ_BITS 0 280 281 /*#undef SMB_ACL_NEED_SORT*/ 282 283 #else /*---------------------------------------------------------------------*/ 284 285 /* Unknown platform. */ 286 287 #error Cannot handle ACLs on this platform! 288 289 #endif 290 291 int sys_acl_get_entry(SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p); 292 int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p); 293 int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T *tag_type_p, uint32 *bits_p, id_t *u_g_id_p); 294 SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type); 295 SMB_ACL_T sys_acl_get_fd(int fd); 296 SMB_ACL_T sys_acl_init(int count); 297 int sys_acl_create_entry(SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry); 298 int sys_acl_set_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype, uint32 bits, id_t u_g_id); 299 int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits); 300 int sys_acl_valid(SMB_ACL_T theacl); 301 int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl); 302 int sys_acl_set_fd(int fd, SMB_ACL_T theacl); 303 int sys_acl_delete_def_file(const char *name); 304 int sys_acl_free_acl(SMB_ACL_T the_acl); 305 int no_acl_syscall_error(int err); 306 307 #endif /* SUPPORT_ACLS */ 308