Imported Debian patch 4.7.2-3
This commit is contained in:
committed by
Mario Fetka
parent
27edeba051
commit
8bc559c5a1
@@ -114,13 +114,6 @@ int __nss_to_err(enum nss_status errcode)
|
||||
}
|
||||
}
|
||||
|
||||
static int get_timeout(struct ipa_extdom_ctx *ctx) {
|
||||
if (ctx == NULL || ctx->nss_ctx == NULL) {
|
||||
return DEFAULT_MAX_NSS_TIMEOUT;
|
||||
}
|
||||
return back_extdom_get_timeout(ctx->nss_ctx);
|
||||
}
|
||||
|
||||
int getpwnam_r_wrapper(struct ipa_extdom_ctx *ctx, const char *name,
|
||||
struct passwd *pwd, char **buf, size_t *buf_len)
|
||||
{
|
||||
@@ -278,9 +271,7 @@ int parse_request_data(struct berval *req_val, struct extdom_req **_req)
|
||||
* sid (1),
|
||||
* name (2),
|
||||
* posix uid (3),
|
||||
* posix gid (4),
|
||||
* username (5),
|
||||
* groupname (6)
|
||||
* posix gid (3)
|
||||
* },
|
||||
* requestType ENUMERATED {
|
||||
* simple (1),
|
||||
@@ -346,8 +337,6 @@ int parse_request_data(struct berval *req_val, struct extdom_req **_req)
|
||||
|
||||
switch (req->input_type) {
|
||||
case INP_NAME:
|
||||
case INP_USERNAME:
|
||||
case INP_GROUPNAME:
|
||||
tag = ber_scanf(ber, "{aa}}", &req->data.name.domain_name,
|
||||
&req->data.name.object_name);
|
||||
break;
|
||||
@@ -389,8 +378,6 @@ void free_req_data(struct extdom_req *req)
|
||||
|
||||
switch (req->input_type) {
|
||||
case INP_NAME:
|
||||
case INP_USERNAME:
|
||||
case INP_GROUPNAME:
|
||||
ber_memfree(req->data.name.domain_name);
|
||||
ber_memfree(req->data.name.object_name);
|
||||
break;
|
||||
@@ -420,12 +407,6 @@ int check_request(struct extdom_req *req, enum extdom_version version)
|
||||
}
|
||||
}
|
||||
|
||||
if (version == EXTDOM_V0 || version == EXTDOM_V1) {
|
||||
if (req->input_type == INP_USERNAME || req->input_type == INP_GROUPNAME) {
|
||||
return LDAP_PROTOCOL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -542,7 +523,7 @@ int pack_ber_user(struct ipa_extdom_ctx *ctx,
|
||||
if (strcasecmp(locat+1, domain_name) == 0 ) {
|
||||
locat[0] = '\0';
|
||||
} else {
|
||||
ret = LDAP_INVALID_SYNTAX;
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
@@ -587,12 +568,10 @@ int pack_ber_user(struct ipa_extdom_ctx *ctx,
|
||||
ret = getgrgid_r_wrapper(ctx,
|
||||
groups[c], &grp, &buf, &buf_len);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
} else {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
@@ -655,7 +634,7 @@ int pack_ber_group(enum response_types response_type,
|
||||
if (strcasecmp(locat+1, domain_name) == 0 ) {
|
||||
locat[0] = '\0';
|
||||
} else {
|
||||
ret = LDAP_INVALID_SYNTAX;
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
@@ -852,14 +831,11 @@ static int handle_uid_request(struct ipa_extdom_ctx *ctx,
|
||||
}
|
||||
|
||||
if (request_type == REQ_SIMPLE) {
|
||||
ret = sss_nss_getsidbyid_timeout(uid, get_timeout(ctx),
|
||||
&sid_str, &id_type);
|
||||
ret = sss_nss_getsidbyid(uid, &sid_str, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_UID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
set_err_msg(req, "Failed to lookup SID by UID");
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
@@ -871,26 +847,21 @@ static int handle_uid_request(struct ipa_extdom_ctx *ctx,
|
||||
} else {
|
||||
ret = getpwuid_r_wrapper(ctx, uid, &pwd, &buf, &buf_len);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
} else {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname_timeout(pwd.pw_name, get_timeout(ctx),
|
||||
&kv_list, &id_type);
|
||||
ret = sss_nss_getorigbyname(pwd.pw_name, &kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_UID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
@@ -932,13 +903,10 @@ static int handle_gid_request(struct ipa_extdom_ctx *ctx,
|
||||
}
|
||||
|
||||
if (request_type == REQ_SIMPLE) {
|
||||
ret = sss_nss_getsidbyid_timeout(gid, get_timeout(ctx),
|
||||
&sid_str, &id_type);
|
||||
ret = sss_nss_getsidbyid(gid, &sid_str, &id_type);
|
||||
if (ret != 0 || id_type != SSS_ID_TYPE_GID) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
set_err_msg(req, "Failed to lookup SID by GID");
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
@@ -950,26 +918,21 @@ static int handle_gid_request(struct ipa_extdom_ctx *ctx,
|
||||
} else {
|
||||
ret = getgrgid_r_wrapper(ctx, gid, &grp, &buf, &buf_len);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
} else {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname_timeout(grp.gr_name, get_timeout(ctx),
|
||||
&kv_list, &id_type);
|
||||
ret = sss_nss_getorigbyname(grp.gr_name, &kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_GID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
@@ -1009,13 +972,10 @@ static int handle_cert_request(struct ipa_extdom_ctx *ctx,
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = sss_nss_getlistbycert_timeout(input, get_timeout(ctx),
|
||||
&fq_names, &id_types);
|
||||
ret = sss_nss_getlistbycert(input, &fq_names, &id_types);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
set_err_msg(req, "Failed to lookup name by certificate");
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
@@ -1056,13 +1016,10 @@ static int handle_sid_request(struct ipa_extdom_ctx *ctx,
|
||||
enum sss_id_type id_type;
|
||||
struct sss_nss_kv *kv_list = NULL;
|
||||
|
||||
ret = sss_nss_getnamebysid_timeout(input, get_timeout(ctx),
|
||||
&fq_name, &id_type);
|
||||
ret = sss_nss_getnamebysid(input, &fq_name, &id_type);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
set_err_msg(req, "Failed to lookup name by SID");
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
@@ -1100,26 +1057,21 @@ static int handle_sid_request(struct ipa_extdom_ctx *ctx,
|
||||
case SSS_ID_TYPE_BOTH:
|
||||
ret = getpwnam_r_wrapper(ctx, fq_name, &pwd, &buf, &buf_len);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
} else {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname_timeout(pwd.pw_name, get_timeout(ctx),
|
||||
&kv_list, &id_type);
|
||||
ret = sss_nss_getorigbyname(pwd.pw_name, &kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_UID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
@@ -1137,26 +1089,21 @@ static int handle_sid_request(struct ipa_extdom_ctx *ctx,
|
||||
case SSS_ID_TYPE_GID:
|
||||
ret = getgrnam_r_wrapper(ctx, fq_name, &grp, &buf, &buf_len);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
} else {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname_timeout(grp.gr_name, get_timeout(ctx),
|
||||
&kv_list, &id_type);
|
||||
ret = sss_nss_getorigbyname(grp.gr_name, &kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_GID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
@@ -1184,48 +1131,17 @@ done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int handle_simple_request(struct ipa_extdom_ctx *ctx,
|
||||
struct extdom_req *req,
|
||||
const char *fq_name,
|
||||
struct berval **berval)
|
||||
{
|
||||
int ret;
|
||||
char *sid_str = NULL;
|
||||
enum sss_id_type id_type;
|
||||
|
||||
ret = sss_nss_getsidbyname_timeout(fq_name, get_timeout(ctx),
|
||||
&sid_str, &id_type);
|
||||
switch(ret) {
|
||||
case 0:
|
||||
ret = pack_ber_sid(sid_str, berval);
|
||||
break;
|
||||
case ENOENT:
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
break;
|
||||
case ETIMEDOUT:
|
||||
case ETIME:
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
break;
|
||||
default:
|
||||
set_err_msg(req, "Failed to lookup SID by name");
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
free(sid_str);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int handle_username_request(struct ipa_extdom_ctx *ctx,
|
||||
struct extdom_req *req,
|
||||
enum request_types request_type,
|
||||
const char *name, const char *domain_name,
|
||||
struct berval **berval)
|
||||
static int handle_name_request(struct ipa_extdom_ctx *ctx,
|
||||
struct extdom_req *req,
|
||||
enum request_types request_type,
|
||||
const char *name, const char *domain_name,
|
||||
struct berval **berval)
|
||||
{
|
||||
int ret;
|
||||
char *fq_name = NULL;
|
||||
struct passwd pwd;
|
||||
struct group grp;
|
||||
char *sid_str = NULL;
|
||||
enum sss_id_type id_type;
|
||||
size_t buf_len;
|
||||
char *buf = NULL;
|
||||
@@ -1247,159 +1163,93 @@ static int handle_username_request(struct ipa_extdom_ctx *ctx,
|
||||
}
|
||||
|
||||
if (request_type == REQ_SIMPLE) {
|
||||
/* REQ_SIMPLE */
|
||||
ret = handle_simple_request(ctx, req, fq_name, berval);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* REQ_FULL || REQ_FULL_WITH_GROUPS */
|
||||
ret = get_buffer(&buf_len, &buf);
|
||||
if (ret != LDAP_SUCCESS) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = getpwnam_r_wrapper(ctx, fq_name, &pwd, &buf, &buf_len);
|
||||
switch(ret) {
|
||||
case 0:
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname_timeout(pwd.pw_name,
|
||||
get_timeout(ctx),
|
||||
&kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_UID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else if (ret == ETIMEDOUT || ret == ETIME) {
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
} else {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
ret = pack_ber_user(ctx,
|
||||
(request_type == REQ_FULL ? RESP_USER
|
||||
: RESP_USER_GROUPLIST),
|
||||
domain_name, pwd.pw_name, pwd.pw_uid,
|
||||
pwd.pw_gid, pwd.pw_gecos, pwd.pw_dir,
|
||||
pwd.pw_shell, kv_list, berval);
|
||||
break;
|
||||
case ENOMEM:
|
||||
case ERANGE:
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
break;
|
||||
case ETIMEDOUT:
|
||||
ret = LDAP_TIMELIMIT_EXCEEDED;
|
||||
break;
|
||||
default:
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
break;
|
||||
}
|
||||
|
||||
done:
|
||||
sss_nss_free_kv(kv_list);
|
||||
free(fq_name);
|
||||
free(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int handle_groupname_request(struct ipa_extdom_ctx *ctx,
|
||||
struct extdom_req *req,
|
||||
enum request_types request_type,
|
||||
const char *name, const char *domain_name,
|
||||
struct berval **berval)
|
||||
{
|
||||
int ret;
|
||||
char *fq_name = NULL;
|
||||
struct group grp;
|
||||
enum sss_id_type id_type;
|
||||
size_t buf_len;
|
||||
char *buf = NULL;
|
||||
struct sss_nss_kv *kv_list = NULL;
|
||||
|
||||
/* with groups we can be sure that name doesn't contain the domain_name */
|
||||
ret = asprintf(&fq_name, "%s%c%s", name, SSSD_DOMAIN_SEPARATOR,
|
||||
domain_name);
|
||||
if (ret == -1) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
set_err_msg(req, "Failed to create fully qualified name");
|
||||
fq_name = NULL; /* content is undefined according to
|
||||
asprintf(3) */
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (request_type == REQ_SIMPLE) {
|
||||
/* REQ_SIMPLE */
|
||||
ret = handle_simple_request(ctx, req, fq_name, berval);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* REQ_FULL || REQ_FULL_WITH_GROUPS */
|
||||
ret = get_buffer(&buf_len, &buf);
|
||||
if (ret != LDAP_SUCCESS) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = getgrnam_r_wrapper(ctx, fq_name, &grp, &buf, &buf_len);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
} else {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname_timeout(grp.gr_name, get_timeout(ctx),
|
||||
&kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_GID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
ret = sss_nss_getsidbyname(fq_name, &sid_str, &id_type);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
set_err_msg(req, "Failed to lookup SID by name");
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
ret = pack_ber_group((request_type == REQ_FULL ? RESP_GROUP
|
||||
: RESP_GROUP_MEMBERS),
|
||||
domain_name, grp.gr_name, grp.gr_gid,
|
||||
grp.gr_mem, kv_list, berval);
|
||||
ret = pack_ber_sid(sid_str, berval);
|
||||
} else {
|
||||
ret = get_buffer(&buf_len, &buf);
|
||||
if (ret != LDAP_SUCCESS) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = getpwnam_r_wrapper(ctx, fq_name, &pwd, &buf, &buf_len);
|
||||
if (ret == 0) {
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname(pwd.pw_name, &kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_UID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
ret = pack_ber_user(ctx,
|
||||
(request_type == REQ_FULL ? RESP_USER
|
||||
: RESP_USER_GROUPLIST),
|
||||
domain_name, pwd.pw_name, pwd.pw_uid,
|
||||
pwd.pw_gid, pwd.pw_gecos, pwd.pw_dir,
|
||||
pwd.pw_shell, kv_list, berval);
|
||||
} else if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
goto done;
|
||||
} else { /* no user entry found */
|
||||
/* according to the getpwnam() man page there are a couple of
|
||||
* error codes which can indicate that the user was not found. To
|
||||
* be on the safe side we fail back to the group lookup on all
|
||||
* errors. */
|
||||
ret = getgrnam_r_wrapper(ctx, fq_name, &grp, &buf, &buf_len);
|
||||
if (ret != 0) {
|
||||
if (ret == ENOMEM || ret == ERANGE) {
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
} else {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (request_type == REQ_FULL_WITH_GROUPS) {
|
||||
ret = sss_nss_getorigbyname(grp.gr_name, &kv_list, &id_type);
|
||||
if (ret != 0 || !(id_type == SSS_ID_TYPE_GID
|
||||
|| id_type == SSS_ID_TYPE_BOTH)) {
|
||||
if (ret == ENOENT) {
|
||||
ret = LDAP_NO_SUCH_OBJECT;
|
||||
} else {
|
||||
set_err_msg(req, "Failed to read original data");
|
||||
ret = LDAP_OPERATIONS_ERROR;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
ret = pack_ber_group((request_type == REQ_FULL ? RESP_GROUP
|
||||
: RESP_GROUP_MEMBERS),
|
||||
domain_name, grp.gr_name, grp.gr_gid,
|
||||
grp.gr_mem, kv_list, berval);
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
sss_nss_free_kv(kv_list);
|
||||
free(fq_name);
|
||||
free(sid_str);
|
||||
free(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int handle_name_request(struct ipa_extdom_ctx *ctx,
|
||||
struct extdom_req *req,
|
||||
enum request_types request_type,
|
||||
const char *name, const char *domain_name,
|
||||
struct berval **berval)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
||||
ret = handle_username_request(ctx, req, request_type,
|
||||
name, domain_name, berval);
|
||||
if (ret == LDAP_NO_SUCH_OBJECT) {
|
||||
ret = handle_groupname_request(ctx, req, request_type,
|
||||
name, domain_name, berval);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int handle_request(struct ipa_extdom_ctx *ctx, struct extdom_req *req,
|
||||
struct berval **berval)
|
||||
{
|
||||
@@ -1431,18 +1281,6 @@ int handle_request(struct ipa_extdom_ctx *ctx, struct extdom_req *req,
|
||||
req->data.name.object_name,
|
||||
req->data.name.domain_name, berval);
|
||||
|
||||
break;
|
||||
case INP_GROUPNAME:
|
||||
ret = handle_groupname_request(ctx, req, req->request_type,
|
||||
req->data.name.object_name,
|
||||
req->data.name.domain_name, berval);
|
||||
|
||||
break;
|
||||
case INP_USERNAME:
|
||||
ret = handle_username_request(ctx, req, req->request_type,
|
||||
req->data.name.object_name,
|
||||
req->data.name.domain_name, berval);
|
||||
|
||||
break;
|
||||
default:
|
||||
set_err_msg(req, "Unknown input type");
|
||||
|
||||
Reference in New Issue
Block a user