Hi Andreas,

>> I'm wondering if the size of an ace should be dynamic,
>> which might make it possible to support other ace types
>> in future. E.g. supporting other identities like 128-bit values
>> to make it easier to map Windows SIDS.
> 
> I'm working on additionally supporting unmapped user@domain and
> group@domain identifier strings; we have to deal with that case in the
> nfs client; that may be useful for Samba as well.

Can this be any string? So would
"S-1-5-21-4052121579-2079768045-1474639452-1001" also work?

How would the current thread/process get a "token" that would match such
an ace?

>> Even without 128-bit ids, it would be very useful to mark an
>> ace so that it applies to a uid or gid at the same time.
>> This would reduce the size of the ace list when Samba uses
>> IDMAP_TYPE_BOTH, which means a SID is mapped to a unix id, which
>> is user (uid) and group (gid) at the same time. This feature is required
>> in order to support SID-Histories on accounts.
>> Currently Samba needs to add two aces (one uid and one gid)
>> in order to represent one Windows ace.
> 
> It's not clear to me if supporting this would be a good idea right now.
> The kernel would have to treat each such entry like two separate entries
> internally. How would we map a combined user-space "uid + gid"
> number to a kernel uid and gid since it could map to two distinct
> numbers there?

No, the numeric value is the same.

I think richacl_permission() is the only place that requires any action.

        richacl_for_each_entry(ace, acl) {
                unsigned int ace_mask = ace->e_mask;

                if (richace_is_inherit_only(ace))
                        continue;
                if (richace_is_owner(ace)) {
                        if (!uid_eq(current_fsuid(), inode->i_uid))
                                continue;
                } else if (richace_is_group(ace)) {
                        if (!in_owning_group)
                                continue;
+               } else if (richace_is_unix_both(ace)) {
+                       kuid_t uid = current_fsuid();
+
+                       if (!uid_eq(uid, ace->e_id.xid) && 
!in_group_p(ace->e_id.xid))
+                               continue;
                } else if (richace_is_unix_user(ace)) {
                        kuid_t uid = current_fsuid();

                        if (!uid_eq(uid, ace->e_id.uid))
                                continue;
                } else if (richace_is_unix_group(ace)) {
                        if (!in_group_p(ace->e_id.gid))
                                continue;
                } else
                        goto entry_matches_everyone;

In general shouldn't kuid_t uid = current_fsuid(); be at the top of the
function just once?

>> I haven't looked at the claims based acls on Windows, but it would be
>> good if the new infrastructure is dynamic enough to support something
>> like that in a future version.
> 
> I don't know, I have yet to see a use case that isn't totally crazy.

Ok, I found the a_version in struct richacl_xattr.

metze

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to