1 /* 2 * security.h - Exports for handling security/ACLs in NTFS. 3 * Originated from the Linux-NTFS project. 4 * 5 * Copyright (c) 2004 Anton Altaparmakov 6 * Copyright (c) 2005-2006 Szabolcs Szakacsits 7 * Copyright (c) 2007-2010 Jean-Pierre Andre 8 * 9 * This program/include file is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License as published 11 * by the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program/include file is distributed in the hope that it will be 15 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 16 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program (in the main directory of the NTFS-3G 21 * distribution in the file COPYING); if not, write to the Free Software 22 * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 */ 24 25 #ifndef _NTFS_SECURITY_H 26 #define _NTFS_SECURITY_H 27 28 #include "types.h" 29 #include "layout.h" 30 #include "inode.h" 31 #include "dir.h" 32 33 #ifndef POSIXACLS 34 #define POSIXACLS 0 35 #endif 36 37 typedef u16 be16; 38 typedef u32 be32; 39 40 #if __BYTE_ORDER == __LITTLE_ENDIAN 41 #define const_cpu_to_be16(x) ((((x) & 255L) << 8) + (((x) >> 8) & 255L)) 42 #define const_cpu_to_be32(x) ((((x) & 255L) << 24) + (((x) & 0xff00L) << 8) \ 43 + (((x) >> 8) & 0xff00L) + (((x) >> 24) & 255L)) 44 #else 45 #define const_cpu_to_be16(x) (x) 46 #define const_cpu_to_be32(x) (x) 47 #endif 48 49 /* 50 * item in the mapping list 51 */ 52 53 struct MAPPING { 54 struct MAPPING *next; 55 int xid; /* linux id : uid or gid */ 56 SID *sid; /* Windows id : usid or gsid */ 57 int grcnt; /* group count (for users only) */ 58 gid_t *groups; /* groups which the user is member of */ 59 }; 60 61 /* 62 * Entry in the permissions cache 63 * Note : this cache is not organized as a generic cache 64 */ 65 66 struct CACHED_PERMISSIONS { 67 uid_t uid; 68 gid_t gid; 69 le32 inh_fileid; 70 le32 inh_dirid; 71 #if POSIXACLS 72 struct POSIX_SECURITY *pxdesc; 73 unsigned int pxdescsize:16; 74 #endif 75 unsigned int mode:12; 76 unsigned int valid:1; 77 } ; 78 79 /* 80 * Entry in the permissions cache for directories with no security_id 81 */ 82 83 struct CACHED_PERMISSIONS_LEGACY { 84 struct CACHED_PERMISSIONS_LEGACY *next; 85 struct CACHED_PERMISSIONS_LEGACY *previous; 86 void *variable; 87 size_t varsize; 88 union ALIGNMENT payload[0]; 89 /* above fields must match "struct CACHED_GENERIC" */ 90 u64 mft_no; 91 struct CACHED_PERMISSIONS perm; 92 } ; 93 94 /* 95 * Entry in the securid cache 96 */ 97 98 struct CACHED_SECURID { 99 struct CACHED_SECURID *next; 100 struct CACHED_SECURID *previous; 101 void *variable; 102 size_t varsize; 103 union ALIGNMENT payload[0]; 104 /* above fields must match "struct CACHED_GENERIC" */ 105 uid_t uid; 106 gid_t gid; 107 unsigned int dmode; 108 le32 securid; 109 } ; 110 111 /* 112 * Header of the security cache 113 * (has no cache structure by itself) 114 */ 115 116 struct CACHED_PERMISSIONS_HEADER { 117 unsigned int last; 118 /* statistics for permissions */ 119 unsigned long p_writes; 120 unsigned long p_reads; 121 unsigned long p_hits; 122 } ; 123 124 /* 125 * The whole permissions cache 126 */ 127 128 struct PERMISSIONS_CACHE { 129 struct CACHED_PERMISSIONS_HEADER head; 130 struct CACHED_PERMISSIONS *cachetable[1]; /* array of variable size */ 131 } ; 132 133 /* 134 * Security flags values 135 */ 136 137 enum { 138 SECURITY_DEFAULT, /* rely on fuse for permissions checking */ 139 SECURITY_RAW, /* force same ownership/permissions on files */ 140 SECURITY_ACL, /* enable Posix ACLs (when compiled in) */ 141 SECURITY_ADDSECURIDS, /* upgrade old security descriptors */ 142 SECURITY_STATICGRPS, /* use static groups for access control */ 143 SECURITY_WANTED /* a security related option was present */ 144 } ; 145 146 /* 147 * Security context, needed by most security functions 148 */ 149 150 enum { MAPUSERS, MAPGROUPS, MAPCOUNT } ; 151 152 struct SECURITY_CONTEXT { 153 ntfs_volume *vol; 154 struct MAPPING *mapping[MAPCOUNT]; 155 struct PERMISSIONS_CACHE **pseccache; 156 uid_t uid; /* uid of user requesting (not the mounter) */ 157 gid_t gid; /* gid of user requesting (not the mounter) */ 158 pid_t tid; /* thread id of thread requesting */ 159 mode_t umask; /* umask of requesting thread */ 160 } ; 161 162 #if POSIXACLS 163 164 /* 165 * Posix ACL structures 166 */ 167 168 struct POSIX_ACE { 169 u16 tag; 170 u16 perms; 171 s32 id; 172 } __attribute__((__packed__)); 173 174 struct POSIX_ACL { 175 u8 version; 176 u8 flags; 177 u16 filler; 178 struct POSIX_ACE ace[0]; 179 } __attribute__((__packed__)); 180 181 struct POSIX_SECURITY { 182 mode_t mode; 183 int acccnt; 184 int defcnt; 185 int firstdef; 186 u16 tagsset; 187 s32 alignment[0]; 188 struct POSIX_ACL acl; 189 } ; 190 191 /* 192 * Posix tags, cpu-endian 16 bits 193 */ 194 195 enum { 196 POSIX_ACL_USER_OBJ = 1, 197 POSIX_ACL_USER = 2, 198 POSIX_ACL_GROUP_OBJ = 4, 199 POSIX_ACL_GROUP = 8, 200 POSIX_ACL_MASK = 16, 201 POSIX_ACL_OTHER = 32, 202 POSIX_ACL_SPECIAL = 64 /* internal use only */ 203 } ; 204 205 #define POSIX_ACL_EXTENSIONS (POSIX_ACL_USER | POSIX_ACL_GROUP | POSIX_ACL_MASK) 206 207 /* 208 * Posix permissions, cpu-endian 16 bits 209 */ 210 211 enum { 212 POSIX_PERM_X = 1, 213 POSIX_PERM_W = 2, 214 POSIX_PERM_R = 4, 215 POSIX_PERM_DENIAL = 64 /* internal use only */ 216 } ; 217 218 #define POSIX_VERSION 2 219 220 #endif 221 222 extern BOOL ntfs_guid_is_zero(const GUID *guid); 223 extern char *ntfs_guid_to_mbs(const GUID *guid, char *guid_str); 224 225 /** 226 * ntfs_sid_is_valid - determine if a SID is valid 227 * @sid: SID for which to determine if it is valid 228 * 229 * Determine if the SID pointed to by @sid is valid. 230 * 231 * Return TRUE if it is valid and FALSE otherwise. 232 */ 233 static __inline__ BOOL ntfs_sid_is_valid(const SID *sid) 234 { 235 if (!sid || sid->revision != SID_REVISION || 236 sid->sub_authority_count > SID_MAX_SUB_AUTHORITIES) 237 return FALSE; 238 return TRUE; 239 } 240 241 extern int ntfs_sid_to_mbs_size(const SID *sid); 242 extern char *ntfs_sid_to_mbs(const SID *sid, char *sid_str, 243 size_t sid_str_size); 244 extern void ntfs_generate_guid(GUID *guid); 245 extern int ntfs_sd_add_everyone(ntfs_inode *ni); 246 247 extern le32 ntfs_security_hash(const SECURITY_DESCRIPTOR_RELATIVE *sd, 248 const u32 len); 249 250 int ntfs_build_mapping(struct SECURITY_CONTEXT *scx, const char *usermap_path, 251 BOOL allowdef); 252 int ntfs_get_owner_mode(struct SECURITY_CONTEXT *scx, 253 ntfs_inode *ni, struct stat*); 254 int ntfs_set_mode(struct SECURITY_CONTEXT *scx, ntfs_inode *ni, mode_t mode); 255 BOOL ntfs_allowed_as_owner(struct SECURITY_CONTEXT *scx, ntfs_inode *ni); 256 int ntfs_allowed_access(struct SECURITY_CONTEXT *scx, 257 ntfs_inode *ni, int accesstype); 258 int ntfs_allowed_create(struct SECURITY_CONTEXT *scx, 259 ntfs_inode *ni, gid_t *pgid, mode_t *pdsetgid); 260 BOOL old_ntfs_allowed_dir_access(struct SECURITY_CONTEXT *scx, 261 const char *path, int accesstype); 262 263 #if POSIXACLS 264 le32 ntfs_alloc_securid(struct SECURITY_CONTEXT *scx, 265 uid_t uid, gid_t gid, ntfs_inode *dir_ni, 266 mode_t mode, BOOL isdir); 267 #else 268 le32 ntfs_alloc_securid(struct SECURITY_CONTEXT *scx, 269 uid_t uid, gid_t gid, mode_t mode, BOOL isdir); 270 #endif 271 int ntfs_set_owner(struct SECURITY_CONTEXT *scx, ntfs_inode *ni, 272 uid_t uid, gid_t gid); 273 int ntfs_set_ownmod(struct SECURITY_CONTEXT *scx, 274 ntfs_inode *ni, uid_t uid, gid_t gid, mode_t mode); 275 #if POSIXACLS 276 int ntfs_set_owner_mode(struct SECURITY_CONTEXT *scx, 277 ntfs_inode *ni, uid_t uid, gid_t gid, 278 mode_t mode, struct POSIX_SECURITY *pxdesc); 279 #else 280 int ntfs_set_owner_mode(struct SECURITY_CONTEXT *scx, 281 ntfs_inode *ni, uid_t uid, gid_t gid, mode_t mode); 282 #endif 283 le32 ntfs_inherited_id(struct SECURITY_CONTEXT *scx, 284 ntfs_inode *dir_ni, BOOL fordir); 285 int ntfs_open_secure(ntfs_volume *vol); 286 void ntfs_close_secure(struct SECURITY_CONTEXT *scx); 287 288 #if POSIXACLS 289 290 int ntfs_set_inherited_posix(struct SECURITY_CONTEXT *scx, 291 ntfs_inode *ni, uid_t uid, gid_t gid, 292 ntfs_inode *dir_ni, mode_t mode); 293 int ntfs_get_posix_acl(struct SECURITY_CONTEXT *scx, ntfs_inode *ni, 294 const char *name, char *value, size_t size); 295 int ntfs_set_posix_acl(struct SECURITY_CONTEXT *scx, ntfs_inode *ni, 296 const char *name, const char *value, size_t size, 297 int flags); 298 int ntfs_remove_posix_acl(struct SECURITY_CONTEXT *scx, ntfs_inode *ni, 299 const char *name); 300 #endif 301 302 int ntfs_get_ntfs_acl(struct SECURITY_CONTEXT *scx, ntfs_inode *ni, 303 char *value, size_t size); 304 int ntfs_set_ntfs_acl(struct SECURITY_CONTEXT *scx, ntfs_inode *ni, 305 const char *value, size_t size, int flags); 306 307 int ntfs_get_ntfs_attrib(ntfs_inode *ni, char *value, size_t size); 308 int ntfs_set_ntfs_attrib(ntfs_inode *ni, 309 const char *value, size_t size, int flags); 310 311 312 /* 313 * Security API for direct access to security descriptors 314 * based on Win32 API 315 */ 316 317 #define MAGIC_API 0x09042009 318 319 struct SECURITY_API { 320 u32 magic; 321 struct SECURITY_CONTEXT security; 322 struct PERMISSIONS_CACHE *seccache; 323 } ; 324 325 /* 326 * The following constants are used in interfacing external programs. 327 * They are not to be stored on disk and must be defined in their 328 * native cpu representation. 329 * When disk representation (le) is needed, use SE_DACL_PRESENT, etc. 330 */ 331 enum { OWNER_SECURITY_INFORMATION = 1, 332 GROUP_SECURITY_INFORMATION = 2, 333 DACL_SECURITY_INFORMATION = 4, 334 SACL_SECURITY_INFORMATION = 8 335 } ; 336 337 int ntfs_get_file_security(struct SECURITY_API *scapi, 338 const char *path, u32 selection, 339 char *buf, u32 buflen, u32 *psize); 340 int ntfs_set_file_security(struct SECURITY_API *scapi, 341 const char *path, u32 selection, const char *attr); 342 int ntfs_get_file_attributes(struct SECURITY_API *scapi, 343 const char *path); 344 BOOL ntfs_set_file_attributes(struct SECURITY_API *scapi, 345 const char *path, s32 attrib); 346 BOOL ntfs_read_directory(struct SECURITY_API *scapi, 347 const char *path, ntfs_filldir_t callback, void *context); 348 int ntfs_read_sds(struct SECURITY_API *scapi, 349 char *buf, u32 size, u32 offset); 350 INDEX_ENTRY *ntfs_read_sii(struct SECURITY_API *scapi, 351 INDEX_ENTRY *entry); 352 INDEX_ENTRY *ntfs_read_sdh(struct SECURITY_API *scapi, 353 INDEX_ENTRY *entry); 354 struct SECURITY_API *ntfs_initialize_file_security(const char *device, 355 unsigned long flags); 356 BOOL ntfs_leave_file_security(struct SECURITY_API *scx); 357 358 int ntfs_get_usid(struct SECURITY_API *scapi, uid_t uid, char *buf); 359 int ntfs_get_gsid(struct SECURITY_API *scapi, gid_t gid, char *buf); 360 int ntfs_get_user(struct SECURITY_API *scapi, const SID *usid); 361 int ntfs_get_group(struct SECURITY_API *scapi, const SID *gsid); 362 363 #endif /* defined _NTFS_SECURITY_H */ 364