Evaluate all group perms in ACL to emulate POSIX user perms
* security,cc (get_attribute_from_acl): Merge all group perms into user perms if user is member of group. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
e0d48debed
commit
c19f1b9f8e
|
@ -1,3 +1,8 @@
|
||||||
|
2015-08-14 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* security,cc (get_attribute_from_acl): Merge all group perms into
|
||||||
|
user perms if user is member of group.
|
||||||
|
|
||||||
2015-08-13 Corinna Vinschen <corinna@vinschen.de>
|
2015-08-13 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* autoload.cc (GetLogicalProcessorInformationEx): Import.
|
* autoload.cc (GetLogicalProcessorInformationEx): Import.
|
||||||
|
|
|
@ -243,6 +243,7 @@ get_attribute_from_acl (mode_t *attribute, PACL acl, PSID owner_sid,
|
||||||
mode_t deny = 0;
|
mode_t deny = 0;
|
||||||
mode_t *flags, *anti;
|
mode_t *flags, *anti;
|
||||||
bool isownergroup = RtlEqualSid (owner_sid, group_sid);
|
bool isownergroup = RtlEqualSid (owner_sid, group_sid);
|
||||||
|
bool userisowner = RtlEqualSid (owner_sid, cygheap->user.sid ());
|
||||||
|
|
||||||
for (DWORD i = 0; i < acl->AceCount; ++i)
|
for (DWORD i = 0; i < acl->AceCount; ++i)
|
||||||
{
|
{
|
||||||
|
@ -340,6 +341,24 @@ get_attribute_from_acl (mode_t *attribute, PACL acl, PSID owner_sid,
|
||||||
*flags |= S_IWGRP;
|
*flags |= S_IWGRP;
|
||||||
if (ace->Mask & FILE_EXEC_BITS)
|
if (ace->Mask & FILE_EXEC_BITS)
|
||||||
*flags |= S_IXGRP;
|
*flags |= S_IXGRP;
|
||||||
|
/* If the current user is the owner of the file, check if the
|
||||||
|
additional SIDs are in the user's token. Note that this is
|
||||||
|
some ugly hack, but a full-fledged solution requires to
|
||||||
|
create tokens or perhaps using AUTHZ. */
|
||||||
|
BOOL ret;
|
||||||
|
if (userisowner
|
||||||
|
&& CheckTokenMembership (cygheap->user.issetuid ()
|
||||||
|
? cygheap->user.imp_token () : NULL,
|
||||||
|
ace_sid, &ret)
|
||||||
|
&& ret)
|
||||||
|
{
|
||||||
|
if (ace->Mask & FILE_READ_BITS)
|
||||||
|
*flags |= (!(*anti & S_IRUSR)) ? S_IRUSR : 0;
|
||||||
|
if (ace->Mask & FILE_WRITE_BITS)
|
||||||
|
*flags |= (!(*anti & S_IWUSR)) ? S_IWUSR : 0;
|
||||||
|
if (ace->Mask & FILE_EXEC_BITS)
|
||||||
|
*flags |= (!(*anti & S_IXUSR)) ? S_IXUSR : 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*attribute &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISVTX | S_ISGID | S_ISUID);
|
*attribute &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISVTX | S_ISGID | S_ISUID);
|
||||||
|
|
Loading…
Reference in New Issue