diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2009-03-02 09:35:06 -0500 |
---|---|---|
committer | Simo Sorce <ssorce@redhat.com> | 2009-03-02 09:47:54 -0500 |
commit | 5e3966c99180abdcd1e21774a882f1c14c47aae8 (patch) | |
tree | 1a882b9d49f2c7ac25d70f0bbb644b5cefed6439 /server/db | |
parent | 6f5b1ad8c234d58041e45aef4558d50f44d7f021 (diff) | |
download | sssd-5e3966c99180abdcd1e21774a882f1c14c47aae8.tar.gz sssd-5e3966c99180abdcd1e21774a882f1c14c47aae8.tar.bz2 sssd-5e3966c99180abdcd1e21774a882f1c14c47aae8.zip |
Implement GetUserAttributes in the InfoPipe
This patch adds support for requesting user data in the sysdb via
the InfoPipe. It currently has support for reading defined entries
of integral, floating-point or string types.
Tasks remaining:
1) Implement call to the provider when cache is out of date
2) Support byte arrays for userpic and similar
I modified sysdb_search_ctx in sysdb_search.c to accept an array of
attributes to pass into the LDB search.
I also made one additional related fix: the btreemap now sorts in the
correct order. Previously I had accidentally transposed the two
values for sorting, so the map would always have been in exact
reverse order.
Diffstat (limited to 'server/db')
-rw-r--r-- | server/db/sysdb.h | 31 | ||||
-rw-r--r-- | server/db/sysdb_search.c | 61 |
2 files changed, 92 insertions, 0 deletions
diff --git a/server/db/sysdb.h b/server/db/sysdb.h index 01df3c0c..498ad09b 100644 --- a/server/db/sysdb.h +++ b/server/db/sysdb.h @@ -23,6 +23,7 @@ #define __SYS_DB_H__ #include "ldb.h" +#include "confdb/confdb.h" #define SYSDB_CONF_SECTION "config/sysdb" #define SYSDB_FILE "sssd.ldb" @@ -50,6 +51,17 @@ #define SYSDB_GR_MEMBER "member" #define SYSDB_LEGACY_MEMBER "memberUid" +#define SYSDB_USER_ATTR_DEFAULTGROUP "defaultGroup" +#define SYSDB_USER_ATTR_GECOS "gecos" +#define SYSDB_USER_ATTR_HOMEDIR "homeDirectory" +#define SYSDB_USER_ATTR_SHELL "shell" +#define SYSDB_USER_ATTR_FULLNAME "fullName" +#define SYSDB_USER_ATTR_LOCALE "locale" +#define SYSDB_USER_ATTR_KEYBOARD "keyboard" +#define SYSDB_USER_ATTR_SESSION "session" +#define SYSDB_USER_ATTR_LAST_LOGIN "lastLogin" +#define SYSDB_USER_ATTR_USERPIC "userPicture" + #define SYSDB_LAST_UPDATE "lastUpdate" #define SYSDB_PWNAM_FILTER "(&(objectclass="SYSDB_USER_CLASS")("SYSDB_PW_NAME"=%s))" @@ -70,6 +82,18 @@ SYSDB_PW_HOMEDIR, SYSDB_PW_SHELL, \ SYSDB_LAST_UPDATE, \ NULL} +#define SYSDB_USER_ATTRS {SYSDB_USER_ATTR_DEFAULTGROUP, \ + SYSDB_USER_ATTR_GECOS, \ + SYSDB_USER_ATTR_HOMEDIR, \ + SYSDB_USER_ATTR_SHELL, \ + SYSDB_USER_ATTR_FULLNAME, \ + SYSDB_USER_ATTR_LOCALE, \ + SYSDB_USER_ATTR_KEYBOARD, \ + SYSDB_USER_ATTR_SESSION, \ + SYSDB_USER_ATTR_LAST_LOGIN, \ + SYSDB_USER_ATTR_USERPIC, \ + SYSDB_LAST_UPDATE, \ + NULL} #define SYSDB_GRNAM_ATTRS {SYSDB_GR_NAME, SYSDB_GR_GIDNUM, \ SYSDB_LAST_UPDATE, SYSDB_LEGACY_MEMBER, \ NULL} @@ -142,10 +166,17 @@ int sysdb_initgroups(TALLOC_CTX *mem_ctx, const char *name, bool legacy, sysdb_callback_t fn, void *ptr); +int sysdb_get_user_attr(TALLOC_CTX *mem_ctx, + struct sysdb_ctx *ctx, + struct sss_domain_info *domain, + const char *name, + const char **attributes, + sysdb_callback_t fn, void *ptr); struct ldb_context *sysdb_ctx_get_ldb(struct sysdb_ctx *ctx); struct sysdb_ctx *sysdb_req_get_ctx(struct sysdb_req *req); + int sysdb_transaction(TALLOC_CTX *mem_ctx, struct sysdb_ctx *ctx, sysdb_req_fn_t fn, void *pvt); diff --git a/server/db/sysdb_search.c b/server/db/sysdb_search.c index bb71079b..b1e63112 100644 --- a/server/db/sysdb_search.c +++ b/server/db/sysdb_search.c @@ -44,6 +44,8 @@ struct sysdb_search_ctx { struct get_mem_ctx *gmctx; struct ldb_result *res; + + const char **attrs; }; static struct sysdb_search_ctx *init_src_ctx(TALLOC_CTX *mem_ctx, @@ -204,6 +206,37 @@ static void pwd_search(struct sysdb_req *sysreq, void *ptr) } } +static void user_search(struct sysdb_req *sysreq, void *ptr) +{ + struct sysdb_search_ctx *sctx; + struct ldb_request *req; + struct ldb_dn *base_dn; + int ret; + + sctx = talloc_get_type(ptr, struct sysdb_search_ctx); + sctx->req = sysreq; + + base_dn = ldb_dn_new_fmt(sctx, sctx->ctx->ldb, + SYSDB_TMPL_USER_BASE, sctx->domain); + if (!base_dn) { + return request_error(sctx, ENOMEM); + } + + ret = ldb_build_search_req(&req, sctx->ctx->ldb, sctx, + base_dn, LDB_SCOPE_SUBTREE, + sctx->expression, sctx->attrs, NULL, + sctx, get_gen_callback, + NULL); + if (ret != LDB_SUCCESS) { + return request_ldberror(sctx, ret); + } + + ret = ldb_request(sctx->ctx->ldb, req); + if (ret != LDB_SUCCESS) { + return request_ldberror(sctx, ret); + } +} + int sysdb_getpwnam(TALLOC_CTX *mem_ctx, struct sysdb_ctx *ctx, const char *domain, @@ -729,3 +762,31 @@ int sysdb_initgroups(TALLOC_CTX *mem_ctx, return sysdb_operation(mem_ctx, ctx, initgr_search, sctx); } +int sysdb_get_user_attr(TALLOC_CTX *mem_ctx, + struct sysdb_ctx *ctx, + struct sss_domain_info *domain, + const char *name, + const char **attributes, + sysdb_callback_t fn, void *ptr) +{ + struct sysdb_search_ctx *sctx; + + if (!domain) { + return EINVAL; + } + + sctx = init_src_ctx(mem_ctx, domain->name, domain->legacy, ctx, fn, ptr); + if (!sctx) { + return ENOMEM; + } + + sctx->expression = talloc_asprintf(sctx, SYSDB_PWNAM_FILTER, name); + if (!sctx->expression) { + talloc_free(sctx); + return ENOMEM; + } + + sctx->attrs = attributes; + + return sysdb_operation(mem_ctx, ctx, user_search, sctx); +} |