diff options
Diffstat (limited to '')
-rw-r--r-- | librpc/idl/xattr.idl | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/librpc/idl/xattr.idl b/librpc/idl/xattr.idl new file mode 100644 index 0000000..e2f7cb4 --- /dev/null +++ b/librpc/idl/xattr.idl @@ -0,0 +1,239 @@ +#include "idl_types.h" + +/* + IDL structures for xattr file attributes + + this has nothing to do with RPC, we are just using our NDR/IDL + infrastructure as a convenient way to store linearised information + about a file in a architecture independent manner +*/ + +import "security.idl"; + +[ + version(0.0), + helper("../librpc/ndr/ndr_xattr.h"), + pyhelper("librpc/ndr/py_xattr.c"), + pointer_default(unique) +] +interface xattr +{ + const char *XATTR_DOSATTRIB_NAME = "user.DosAttrib"; + const char *XATTR_DOSATTRIB_NAME_S3 = "user.DOSATTRIB"; + const int XATTR_DOSATTRIB_ESTIMATED_SIZE = 64; + + /* we store basic dos attributes in a DosAttrib xattr. By + using a union we can cope with new version of this + structure more easily */ + + /* + * the FFFF level is never really used, + * it's used to pass the information from + * the old hex string attrib information + * we have a handwritten parser which converts + * the hex string to the xattr_DosInfoFFFFCompat structure + */ + + typedef struct { + uint32 attrib; + } xattr_DosInfoFFFFCompat; + + typedef struct { + uint32 attrib; + uint32 ea_size; + udlong size; + udlong alloc_size; + NTTIME create_time; + NTTIME change_time; + } xattr_DosInfo1; + +/* + We use xattrDosInfo1 again when we store values. + Because the sticky write time is now stored in the opendb + and xattr_DosInfo2Old is only present to parse existing + values from disk. + + const int XATTR_ATTRIB_FLAG_STICKY_WRITE_TIME = 0x1; +*/ + typedef struct { + uint32 flags; + uint32 attrib; + uint32 ea_size; + udlong size; + udlong alloc_size; + NTTIME create_time; + NTTIME change_time; + NTTIME write_time; /* only used when sticky write time is set */ + utf8string name; + } xattr_DosInfo2Old; + + typedef [bitmap32bit] bitmap { + XATTR_DOSINFO_ATTRIB = 0x00000001, + XATTR_DOSINFO_EA_SIZE = 0x00000002, + XATTR_DOSINFO_SIZE = 0x00000004, + XATTR_DOSINFO_ALLOC_SIZE = 0x00000008, + XATTR_DOSINFO_CREATE_TIME = 0x00000010, + XATTR_DOSINFO_CHANGE_TIME = 0x00000020, + XATTR_DOSINFO_ITIME = 0x00000040 + } xattr_DosInfoValidFlags; + + typedef struct { + xattr_DosInfoValidFlags valid_flags; + uint32 attrib; + uint32 ea_size; + udlong size; + udlong alloc_size; + NTTIME create_time; + NTTIME change_time; + } xattr_DosInfo3; + + typedef struct { + xattr_DosInfoValidFlags valid_flags; + uint32 attrib; + NTTIME itime; + NTTIME create_time; + } xattr_DosInfo4; + + typedef struct { + xattr_DosInfoValidFlags valid_flags; + uint32 attrib; + NTTIME create_time; + } xattr_DosInfo5; + + typedef [public,switch_type(uint16)] union { + [case(0xFFFF)] xattr_DosInfoFFFFCompat compatinfoFFFF; + [case(1)] xattr_DosInfo1 info1; + [case(2)] xattr_DosInfo2Old oldinfo2; + [case(3)] xattr_DosInfo3 info3; + [case(4)] xattr_DosInfo4 info4; + [case(5)] xattr_DosInfo5 info5; + } xattr_DosInfo; + + typedef [public] struct { + uint16 version; + [switch_is(version)] xattr_DosInfo info; + } xattr_DosAttrib; + + typedef [public,nopush,nopull,noprint] struct { + astring attrib_hex; + uint16 version; + [switch_is(version)] xattr_DosInfo info; + } xattr_DOSATTRIB; + + /* we store DOS style extended attributes in a DosEAs xattr */ + const char *XATTR_DOSEAS_NAME = "user.DosEAs"; + + typedef struct { + utf8string name; + DATA_BLOB value; + } xattr_EA; + + typedef [public] struct { + uint16 num_eas; + [size_is(num_eas)] xattr_EA *eas; + } xattr_DosEAs; + + /* Slightly different version, used by the vfs_xattr_tdb module */ + typedef [public] struct { + uint32 num_eas; + xattr_EA eas[num_eas]; + } tdb_xattrs; + + /* we store stream information in this xattr structure. Then + the streams themselves are stored in + user.DosStream.STREAMNAME or in external files, according + to the flags */ + const char *XATTR_DOSSTREAMS_NAME = "user.DosStreams"; + + const int XATTR_STREAM_FLAG_INTERNAL = 0x00000001; + + /* stream data is stored in attributes with the given prefix */ + const char *XATTR_DOSSTREAM_PREFIX = "user.DosStream."; + + const int XATTR_MAX_STREAM_SIZE = 0x4000; + const int XATTR_MAX_STREAM_SIZE_TDB = 0x100000; + + typedef struct { + uint32 flags; + udlong size; + udlong alloc_size; + utf8string name; + } xattr_DosStream; + + typedef [public] struct { + uint32 num_streams; + [size_is(num_streams)] xattr_DosStream *streams; + } xattr_DosStreams; + + + /* we store the NT ACL a NTACL xattr. It is versioned so we + can later add other acl attribs (such as posix acl mapping) + + we put this xattr in the security namespace to ensure that + only trusted users can write to the ACL + + stored in "security.NTACL" + + Version 1. raw SD stored as Samba4 does it. + Version 2. raw SD + last changed hash so we + can discard if this doesn't match the underlying ACL hash. + */ + + const char *XATTR_NTACL_NAME = "security.NTACL"; + + const int XATTR_SD_HASH_SIZE = 64; + const int XATTR_SD_HASH_TYPE_NONE = 0x0; + const int XATTR_SD_HASH_TYPE_SHA256 = 0x1; + + typedef [public] struct { + security_descriptor *sd; + uint8 hash[16]; + } security_descriptor_hash_v2; /* Hash never used in this version. */ + + typedef [public] struct { + security_descriptor *sd; + uint16 hash_type; + uint8 hash[64]; /* 64 bytes hash. */ + } security_descriptor_hash_v3; + + typedef [public] struct { + security_descriptor *sd; + uint16 hash_type; + uint8 hash[64]; /* 64 bytes hash. */ + utf8string description; /* description of what created + * this hash (to allow + * forensics later, if we have + * a bug in one codepath */ + /* + * "time" is always set to 0. Left here to avoid + * bumping the union versions. Remove in case a v5 is + * necessary. + */ + NTTIME time; + uint8 sys_acl_hash[64]; /* 64 bytes hash. */ + } security_descriptor_hash_v4; + + typedef [switch_type(uint16)] union { + [case(1)] security_descriptor *sd; + [case(2)] security_descriptor_hash_v2 *sd_hs2; + [case(3)] security_descriptor_hash_v3 *sd_hs3; + [case(4)] security_descriptor_hash_v4 *sd_hs4; + } xattr_NTACL_Info; + + typedef [public] struct { + uint16 version; + [switch_is(version)] xattr_NTACL_Info info; + } xattr_NTACL; + + /* + * A wrapper of the common information required to be in the + * hash of the ACL, for the acl_xattr and acl_tdb modules. + */ + [public] typedef struct { + DATA_BLOB acl_as_blob; + uid_t owner; + gid_t group; + mode_t mode; + } xattr_sys_acl_hash_wrapper; + +} |