summaryrefslogtreecommitdiffstats
path: root/src/db
diff options
context:
space:
mode:
authorSumit Bose <sbose@redhat.com>2014-11-05 21:01:08 +0100
committerJakub Hrozek <jhrozek@redhat.com>2014-11-20 10:52:33 +0100
commit907a7c626db407d19d4cae85c2db7d3561120349 (patch)
treebdfb9808f5706f6dd0010fb346e3bc1b469ec1c5 /src/db
parenta5b55bdfcda8bfce8cb2ced981773998093d7857 (diff)
downloadsssd-907a7c626db407d19d4cae85c2db7d3561120349.tar.gz
sssd-907a7c626db407d19d4cae85c2db7d3561120349.tar.xz
sssd-907a7c626db407d19d4cae85c2db7d3561120349.zip
sysdb: add sysdb_search_object_by_uuid()
Related to https://fedorahosted.org/sssd/ticket/2481 Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Diffstat (limited to 'src/db')
-rw-r--r--src/db/sysdb.h7
-rw-r--r--src/db/sysdb_ops.c77
2 files changed, 84 insertions, 0 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index f582f6a51..7a51117f4 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -185,6 +185,7 @@
#define SYSDB_NETGR_TRIPLES_FILTER "(|("SYSDB_NAME_ALIAS"=%s)("SYSDB_NAME"=%s)("SYSDB_NAME_ALIAS"=%s)("SYSDB_MEMBEROF"=%s))"
#define SYSDB_SID_FILTER "(&(|("SYSDB_UC")("SYSDB_GC"))("SYSDB_SID_STR"=%s))"
+#define SYSDB_UUID_FILTER "(&(|("SYSDB_UC")("SYSDB_GC"))("SYSDB_UUID"=%s))"
#define SYSDB_HAS_ENUMERATED "has_enumerated"
@@ -1030,6 +1031,12 @@ errno_t sysdb_search_object_by_sid(TALLOC_CTX *mem_ctx,
const char **attrs,
struct ldb_result **msg);
+errno_t sysdb_search_object_by_uuid(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *uuid_str,
+ const char **attrs,
+ struct ldb_result **res);
+
/* === Functions related to GPOs === */
#define SYSDB_GPO_CONTAINER "cn=gpos,cn=ad,cn=custom"
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index c88ff9b4b..998046a2c 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -3499,12 +3499,79 @@ done:
return ret;
}
+static errno_t sysdb_search_object_by_str_attr(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *filter_tmpl,
+ const char *str,
+ const char **attrs,
+ struct ldb_result **_res)
+{
+ TALLOC_CTX *tmp_ctx;
+ const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, SYSDB_GIDNUM,
+ ORIGINALAD_PREFIX SYSDB_NAME,
+ SYSDB_OBJECTCLASS, NULL };
+ struct ldb_dn *basedn;
+ int ret;
+ struct ldb_result *res = NULL;
+
+ tmp_ctx = talloc_new(NULL);
+ if (!tmp_ctx) {
+ return ENOMEM;
+ }
+
+ basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb, SYSDB_DOM_BASE,
+ domain->name);
+ if (basedn == NULL) {
+ DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_new_fmt failed.\n");
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
+ basedn, LDB_SCOPE_SUBTREE, attrs?attrs:def_attrs,
+ filter_tmpl, str);
+ if (ret != EOK) {
+ ret = sysdb_error_to_errno(ret);
+ DEBUG(SSSDBG_OP_FAILURE, "ldb_search failed.\n");
+ goto done;
+ }
+
+ if (res->count > 1) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Search for [%s] with filter [%s] " \
+ "returned more than one object.\n",
+ str, filter_tmpl);
+ ret = EINVAL;
+ goto done;
+ } else if (res->count == 0) {
+ ret = ENOENT;
+ goto done;
+ }
+
+ *_res = talloc_steal(mem_ctx, res);
+
+done:
+ if (ret == ENOENT) {
+ DEBUG(SSSDBG_TRACE_FUNC, "No such entry.\n");
+ } else if (ret) {
+ DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
+ }
+
+ talloc_zfree(tmp_ctx);
+ return ret;
+}
+
errno_t sysdb_search_object_by_sid(TALLOC_CTX *mem_ctx,
struct sss_domain_info *domain,
const char *sid_str,
const char **attrs,
struct ldb_result **msg)
{
+/* TODO: use
+ return sysdb_search_object_by_str_attr(mem_ctx, domain, SYSDB_SID_FILTER,
+ sid_str, attrs, res);
+
+ when verified that all callers can handle ENOENT correctly. */
+
TALLOC_CTX *tmp_ctx;
const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, SYSDB_GIDNUM,
ORIGINALAD_PREFIX SYSDB_NAME,
@@ -3553,3 +3620,13 @@ done:
talloc_zfree(tmp_ctx);
return ret;
}
+
+errno_t sysdb_search_object_by_uuid(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *uuid_str,
+ const char **attrs,
+ struct ldb_result **res)
+{
+ return sysdb_search_object_by_str_attr(mem_ctx, domain, SYSDB_UUID_FILTER,
+ uuid_str, attrs, res);
+}