Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IFP: Fix of names in GetUserGroups method #240

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/responder/common/responder.h
Expand Up @@ -393,4 +393,25 @@ char *sss_resp_create_fqname(TALLOC_CTX *mem_ctx,

errno_t sss_resp_populate_cr_domains(struct resp_ctx *rctx);

/**
* Helper functions to format output names
*/

/* Format orig_name into a sized_string in output format as prescribed
* by the name_dom domain
*/
int sized_output_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *orig_name,
struct sss_domain_info *name_dom,
struct sized_string **_name);

/* Format orig_name into a sized_string in output format as prescribed
* by the domain read from the fully qualified name.
*/
int sized_domain_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *member_name,
struct sized_string **_name);

#endif /* __SSS_RESPONDER_H__ */
90 changes: 90 additions & 0 deletions src/responder/common/responder_common.c
Expand Up @@ -1651,3 +1651,93 @@ errno_t sss_resp_populate_cr_domains(struct resp_ctx *rctx)

return ret;
}

/**
* Helper functions to format output names
*/
int sized_output_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *orig_name,
struct sss_domain_info *name_dom,
struct sized_string **_name)
{
TALLOC_CTX *tmp_ctx = NULL;
errno_t ret;
char *username;
struct sized_string *name;

tmp_ctx = talloc_new(NULL);
if (tmp_ctx == NULL) {
return ENOMEM;
}

username = sss_output_name(tmp_ctx, orig_name, name_dom->case_preserve,
rctx->override_space);
if (username == NULL) {
ret = EIO;
goto done;
}

if (name_dom->fqnames) {
username = sss_tc_fqname(tmp_ctx, name_dom->names, name_dom, username);
if (username == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "sss_replace_space failed\n");
ret = EIO;
goto done;
}
}

name = talloc_zero(tmp_ctx, struct sized_string);
if (name == NULL) {
ret = ENOMEM;
goto done;
}

to_sized_string(name, username);
name->str = talloc_steal(name, username);
*_name = talloc_steal(mem_ctx, name);
ret = EOK;
done:
talloc_zfree(tmp_ctx);
return ret;
}

int sized_domain_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *member_name,
struct sized_string **_name)
{
TALLOC_CTX *tmp_ctx = NULL;
errno_t ret;
char *domname;
struct sss_domain_info *member_dom;

tmp_ctx = talloc_new(NULL);
if (tmp_ctx == NULL) {
return ENOMEM;
}

ret = sss_parse_internal_fqname(tmp_ctx, member_name, NULL, &domname);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "sss_parse_internal_fqname failed\n");
goto done;
}

if (domname == NULL) {
ret = ERR_WRONG_NAME_FORMAT;
goto done;
}

member_dom = find_domain_by_name(get_domains_head(rctx->domains),
domname, true);
if (member_dom == NULL) {
ret = ERR_DOMAIN_NOT_FOUND;
goto done;
}

ret = sized_output_name(mem_ctx, rctx, member_name,
member_dom, _name);
done:
talloc_free(tmp_ctx);
return ret;
}
29 changes: 15 additions & 14 deletions src/responder/ifp/ifpsrv_cmd.c
Expand Up @@ -369,10 +369,11 @@ ifp_user_get_groups_reply(struct sss_domain_info *domain,
struct ifp_req *ireq,
struct ldb_result *res)
{
int i, num;
int i, gri, num;
const char *name;
const char **groupnames;
char *out_name;
struct sized_string *group_name;
errno_t ret;

/* one less, the first one is the user entry */
num = res->count - 1;
Expand All @@ -381,6 +382,7 @@ ifp_user_get_groups_reply(struct sss_domain_info *domain,
return sbus_request_finish(ireq->dbus_req, NULL);
}

gri = 0;
for (i = 0; i < num; i++) {
name = sss_view_ldb_msg_find_attr_as_string(domain,
res->msgs[i + 1],
Expand All @@ -390,22 +392,21 @@ ifp_user_get_groups_reply(struct sss_domain_info *domain,
continue;
}

out_name = sss_output_name(ireq, name, domain->case_preserve,
ireq->ifp_ctx->rctx->override_space);
if (out_name == NULL) {
ret = sized_domain_name(ireq, ireq->ifp_ctx->rctx, name, &group_name);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
"Unable to get sized name for %s [%d]: %s\n",
name, ret, sss_strerror(ret));
continue;
}

if (domain->fqnames) {
groupnames[i] = sss_tc_fqname(groupnames, domain->names,
domain, out_name);
if (out_name == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "sss_tc_fqname failed\n");
continue;
}
} else {
groupnames[i] = talloc_steal(groupnames, out_name);
groupnames[gri] = talloc_strndup(groupnames,
group_name->str, group_name->len);
if (groupnames[gri] == NULL) {
DEBUG(SSSDBG_MINOR_FAILURE, "talloc_strndup failed\n");
continue;
}
gri++;

DEBUG(SSSDBG_TRACE_FUNC, "Adding group %s\n", groupnames[i]);
}
Expand Down
11 changes: 0 additions & 11 deletions src/responder/nss/nss_private.h
Expand Up @@ -140,17 +140,6 @@ const char *
nss_get_name_from_msg(struct sss_domain_info *domain,
struct ldb_message *msg);

int sized_output_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *orig_name,
struct sss_domain_info *name_dom,
struct sized_string **_name);

int sized_member_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *member_name,
struct sized_string **_name);

const char *
nss_get_pwfield(struct nss_ctx *nctx,
struct sss_domain_info *dom);
Expand Down
2 changes: 1 addition & 1 deletion src/responder/nss/nss_protocol_grent.c
Expand Up @@ -163,7 +163,7 @@ nss_protocol_fill_members(struct sss_packet *packet,
}
}

ret = sized_member_name(tmp_ctx, rctx, member_name, &name);
ret = sized_domain_name(tmp_ctx, rctx, member_name, &name);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE, "Unable to get sized name [%d]: %s\n",
ret, sss_strerror(ret));
Expand Down
87 changes: 0 additions & 87 deletions src/responder/nss/nss_utils.c
Expand Up @@ -53,93 +53,6 @@ nss_get_name_from_msg(struct sss_domain_info *domain,
return ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
}

int sized_output_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *orig_name,
struct sss_domain_info *name_dom,
struct sized_string **_name)
{
TALLOC_CTX *tmp_ctx = NULL;
errno_t ret;
char *username;
struct sized_string *name;

tmp_ctx = talloc_new(NULL);
if (tmp_ctx == NULL) {
return ENOMEM;
}

username = sss_output_name(tmp_ctx, orig_name, name_dom->case_preserve,
rctx->override_space);
if (username == NULL) {
ret = EIO;
goto done;
}

if (name_dom->fqnames) {
username = sss_tc_fqname(tmp_ctx, name_dom->names, name_dom, username);
if (username == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "sss_replace_space failed\n");
ret = EIO;
goto done;
}
}

name = talloc_zero(tmp_ctx, struct sized_string);
if (name == NULL) {
ret = ENOMEM;
goto done;
}

to_sized_string(name, username);
name->str = talloc_steal(name, username);
*_name = talloc_steal(mem_ctx, name);
ret = EOK;
done:
talloc_zfree(tmp_ctx);
return ret;
}

int sized_member_name(TALLOC_CTX *mem_ctx,
struct resp_ctx *rctx,
const char *member_name,
struct sized_string **_name)
{
TALLOC_CTX *tmp_ctx = NULL;
errno_t ret;
char *domname;
struct sss_domain_info *member_dom;

tmp_ctx = talloc_new(NULL);
if (tmp_ctx == NULL) {
return ENOMEM;
}

ret = sss_parse_internal_fqname(tmp_ctx, member_name, NULL, &domname);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "sss_parse_internal_fqname failed\n");
goto done;
}

if (domname == NULL) {
ret = ERR_WRONG_NAME_FORMAT;
goto done;
}

member_dom = find_domain_by_name(get_domains_head(rctx->domains),
domname, true);
if (member_dom == NULL) {
ret = ERR_DOMAIN_NOT_FOUND;
goto done;
}

ret = sized_output_name(mem_ctx, rctx, member_name,
member_dom, _name);
done:
talloc_free(tmp_ctx);
return ret;
}

const char *
nss_get_pwfield(struct nss_ctx *nctx,
struct sss_domain_info *dom)
Expand Down