MFV r275537:
Illumos issue: 5316 allow smbadm join to use RPC (Due to our lack of smbsrv this is mostly no-op on FreeBSD) MFC after: 2 weeks
This commit is contained in:
commit
4c6609d191
@ -68,6 +68,7 @@
|
||||
#ifdef sun
|
||||
#include <aclutils.h>
|
||||
#include <directory.h>
|
||||
#include <idmap.h>
|
||||
#endif
|
||||
|
||||
#include "zfs_iter.h"
|
||||
@ -2390,10 +2391,9 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space)
|
||||
/* SMB */
|
||||
char sid[ZFS_MAXNAMELEN + 32];
|
||||
uid_t id;
|
||||
uint64_t classes;
|
||||
#ifdef sun
|
||||
int err;
|
||||
directory_error_t e;
|
||||
int flag = IDMAP_REQ_FLG_USE_CACHE;
|
||||
#endif
|
||||
|
||||
smbentity = B_TRUE;
|
||||
@ -2416,10 +2416,13 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space)
|
||||
if (err == 0) {
|
||||
rid = id;
|
||||
if (!cb->cb_sid2posix) {
|
||||
e = directory_name_from_sid(NULL, sid, &name,
|
||||
&classes);
|
||||
if (e != NULL)
|
||||
directory_error_free(e);
|
||||
if (type == USTYPE_SMB_USR) {
|
||||
(void) idmap_getwinnamebyuid(rid, flag,
|
||||
&name, NULL);
|
||||
} else {
|
||||
(void) idmap_getwinnamebygid(rid, flag,
|
||||
&name, NULL);
|
||||
}
|
||||
if (name == NULL)
|
||||
name = sid;
|
||||
}
|
||||
|
@ -2615,7 +2615,7 @@ userquota_propname_decode(const char *propname, boolean_t zoned,
|
||||
boolean_t isuser;
|
||||
|
||||
domain[0] = '\0';
|
||||
|
||||
*ridp = 0;
|
||||
/* Figure out the property type ({user|group}{quota|space}) */
|
||||
for (type = 0; type < ZFS_NUM_USERQUOTA_PROPS; type++) {
|
||||
if (strncmp(propname, zfs_userquota_prop_prefixes[type],
|
||||
@ -2637,23 +2637,46 @@ userquota_propname_decode(const char *propname, boolean_t zoned,
|
||||
* It's a SID name (eg "user@domain") that needs to be
|
||||
* turned into S-1-domainID-RID.
|
||||
*/
|
||||
directory_error_t e;
|
||||
int flag = 0;
|
||||
idmap_stat stat, map_stat;
|
||||
uid_t pid;
|
||||
idmap_rid_t rid;
|
||||
idmap_get_handle_t *gh = NULL;
|
||||
|
||||
stat = idmap_get_create(&gh);
|
||||
if (stat != IDMAP_SUCCESS) {
|
||||
idmap_get_destroy(gh);
|
||||
return (ENOMEM);
|
||||
}
|
||||
if (zoned && getzoneid() == GLOBAL_ZONEID)
|
||||
return (ENOENT);
|
||||
if (isuser) {
|
||||
e = directory_sid_from_user_name(NULL,
|
||||
cp, &numericsid);
|
||||
stat = idmap_getuidbywinname(cp, NULL, flag, &pid);
|
||||
if (stat < 0)
|
||||
return (ENOENT);
|
||||
stat = idmap_get_sidbyuid(gh, pid, flag, &numericsid,
|
||||
&rid, &map_stat);
|
||||
} else {
|
||||
e = directory_sid_from_group_name(NULL,
|
||||
cp, &numericsid);
|
||||
stat = idmap_getgidbywinname(cp, NULL, flag, &pid);
|
||||
if (stat < 0)
|
||||
return (ENOENT);
|
||||
stat = idmap_get_sidbygid(gh, pid, flag, &numericsid,
|
||||
&rid, &map_stat);
|
||||
}
|
||||
if (e != NULL) {
|
||||
directory_error_free(e);
|
||||
if (stat < 0) {
|
||||
idmap_get_destroy(gh);
|
||||
return (ENOENT);
|
||||
}
|
||||
stat = idmap_get_mappings(gh);
|
||||
idmap_get_destroy(gh);
|
||||
|
||||
if (stat < 0) {
|
||||
return (ENOENT);
|
||||
}
|
||||
if (numericsid == NULL)
|
||||
return (ENOENT);
|
||||
cp = numericsid;
|
||||
*ridp = rid;
|
||||
/* will be further decoded below */
|
||||
#else /* !sun */
|
||||
return (ENOENT);
|
||||
@ -2663,12 +2686,15 @@ userquota_propname_decode(const char *propname, boolean_t zoned,
|
||||
if (strncmp(cp, "S-1-", 4) == 0) {
|
||||
/* It's a numeric SID (eg "S-1-234-567-89") */
|
||||
(void) strlcpy(domain, cp, domainlen);
|
||||
cp = strrchr(domain, '-');
|
||||
*cp = '\0';
|
||||
cp++;
|
||||
|
||||
errno = 0;
|
||||
*ridp = strtoull(cp, &end, 10);
|
||||
if (*ridp == 0) {
|
||||
cp = strrchr(domain, '-');
|
||||
*cp = '\0';
|
||||
cp++;
|
||||
*ridp = strtoull(cp, &end, 10);
|
||||
} else {
|
||||
end = "";
|
||||
}
|
||||
if (numericsid) {
|
||||
free(numericsid);
|
||||
numericsid = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user