sysdb_search.c revision 8a1738f9379a1b8fb5c95c3df649e014ff5a1434
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder/*
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly SSSD
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly System Database
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly This program is free software; you can redistribute it and/or modify
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly it under the terms of the GNU General Public License as published by
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly the Free Software Foundation; either version 3 of the License, or
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly (at your option) any later version.
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly This program is distributed in the hope that it will be useful,
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly but WITHOUT ANY WARRANTY; without even the implied warranty of
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly GNU General Public License for more details.
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder You should have received a copy of the GNU General Public License
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder along with this program. If not, see <http://www.gnu.org/licenses/>.
e90dc723887d541f809007ae81c9bb73ced9592eChristian Maeder*/
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly#include "util/util.h"
56899f6457976a2ee20f6a23f088cb5655b15715Liam O'Reilly#include "db/sysdb_private.h"
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder#include "confdb/confdb.h"
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder#include <time.h>
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly#include <ctype.h>
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly/* users */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederint sysdb_getpwnam(TALLOC_CTX *mem_ctx,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder struct sysdb_ctx *sysdb,
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly const char *name,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct ldb_result **_res)
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder{
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly TALLOC_CTX *tmpctx;
c0833539c8cf577dd3f2497792fbdd818442744cChristian Maeder static const char *attrs[] = SYSDB_PW_ATTRS;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly struct ldb_dn *base_dn;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly struct ldb_result *res;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder char *sanitized_name;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly int ret;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
036ecbd8f721096321f47cf6a354a9d1bf3d032fChristian Maeder tmpctx = talloc_new(mem_ctx);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if (!tmpctx) {
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder return ENOMEM;
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly }
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly SYSDB_TMPL_USER_BASE, sysdb->domain->name);
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly if (!base_dn) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ENOMEM;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = sss_filter_sanitize(tmpctx, name, &sanitized_name);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if (ret != EOK) {
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder goto done;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder LDB_SCOPE_SUBTREE, attrs, SYSDB_PWNAM_FILTER,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder sanitized_name);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if (ret) {
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = sysdb_error_to_errno(ret);
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder goto done;
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder }
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly *_res = talloc_steal(mem_ctx, res);
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reillydone:
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder talloc_zfree(tmpctx);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder return ret;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder}
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maederint sysdb_getpwuid(TALLOC_CTX *mem_ctx,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct sysdb_ctx *sysdb,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly uid_t uid,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly struct ldb_result **_res)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder{
fa373bc327620e08861294716b4454be8d25669fChristian Maeder TALLOC_CTX *tmpctx;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder unsigned long int ul_uid = uid;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder static const char *attrs[] = SYSDB_PW_ATTRS;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder struct ldb_dn *base_dn;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder struct ldb_result *res;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder int ret;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder tmpctx = talloc_new(mem_ctx);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if (!tmpctx) {
fa373bc327620e08861294716b4454be8d25669fChristian Maeder return ENOMEM;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly SYSDB_TMPL_USER_BASE, sysdb->domain->name);
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly if (!base_dn) {
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder ret = ENOMEM;
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder goto done;
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly }
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder LDB_SCOPE_SUBTREE, attrs, SYSDB_PWUID_FILTER, ul_uid);
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder if (ret) {
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder ret = sysdb_error_to_errno(ret);
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly goto done;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder *_res = talloc_steal(mem_ctx, res);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederdone:
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder talloc_zfree(tmpctx);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder return ret;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder}
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederint sysdb_enumpwent(TALLOC_CTX *mem_ctx,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct sysdb_ctx *sysdb,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct ldb_result **_res)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder{
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder TALLOC_CTX *tmpctx;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder static const char *attrs[] = SYSDB_PW_ATTRS;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder struct ldb_dn *base_dn;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder struct ldb_result *res;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder int ret;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder tmpctx = talloc_new(mem_ctx);
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder if (!tmpctx) {
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder return ENOMEM;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder }
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder SYSDB_TMPL_USER_BASE, sysdb->domain->name);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if (!base_dn) {
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = ENOMEM;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder goto done;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder LDB_SCOPE_SUBTREE, attrs, SYSDB_PWENT_FILTER);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if (ret) {
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = sysdb_error_to_errno(ret);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder goto done;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder *_res = talloc_steal(mem_ctx, res);
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederdone:
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder talloc_zfree(tmpctx);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder return ret;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly}
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder/* groups */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstatic int mpg_convert(struct ldb_message *msg)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder{
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maeder struct ldb_message_element *el;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct ldb_val *val;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder int i;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder el = ldb_msg_find_element(msg, "objectClass");
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder if (!el) return EINVAL;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* see if this is a user to convert to a group */
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder for (i = 0; i < el->num_values; i++) {
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder val = &(el->values[i]);
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder if (strncasecmp(SYSDB_USER_CLASS,
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder (char *)val->data, val->length) == 0) {
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder break;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* no, leave as is */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if (i == el->num_values) return EOK;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* yes, convert */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder val->data = (uint8_t *)talloc_strdup(msg, SYSDB_GROUP_CLASS);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if (val->data == NULL) return ENOMEM;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder val->length = strlen(SYSDB_GROUP_CLASS);
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly return EOK;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly}
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reillystatic int mpg_res_convert(struct ldb_result *res)
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly{
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly int ret;
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly int i;
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly for (i = 0; i < res->count; i++) {
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly ret = mpg_convert(res->msgs[i]);
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly if (ret) {
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly return ret;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly return EOK;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly}
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reillyint sysdb_getgrnam(TALLOC_CTX *mem_ctx,
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly struct sysdb_ctx *sysdb,
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly const char *name,
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly struct ldb_result **_res)
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder{
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder TALLOC_CTX *tmpctx;
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maeder static const char *attrs[] = SYSDB_GRSRC_ATTRS;
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maeder const char *fmt_filter;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder char *sanitized_name;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder struct ldb_dn *base_dn;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly struct ldb_result *res;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly int ret;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly tmpctx = talloc_new(mem_ctx);
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly if (!tmpctx) {
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly return ENOMEM;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly if (sysdb->mpg) {
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly fmt_filter = SYSDB_GRNAM_MPG_FILTER;
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly SYSDB_DOM_BASE, sysdb->domain->name);
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly } else {
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly fmt_filter = SYSDB_GRNAM_FILTER;
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly }
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly if (!base_dn) {
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly ret = ENOMEM;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly goto done;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly ret = sss_filter_sanitize(tmpctx, name, &sanitized_name);
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly if (ret != EOK) {
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly goto done;
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly LDB_SCOPE_SUBTREE, attrs, fmt_filter,
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly sanitized_name);
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly if (ret) {
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly ret = sysdb_error_to_errno(ret);
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly goto done;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly ret = mpg_res_convert(res);
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder if (ret) {
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder goto done;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder }
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder *_res = talloc_steal(mem_ctx, res);
dc403ff45531bc75a7544b8b5fc52a5217a1a54aChristian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maederdone:
45e2bc90dd11147156ddd7f9651ce8b2ec00f2a1Christian Maeder talloc_zfree(tmpctx);
45e2bc90dd11147156ddd7f9651ce8b2ec00f2a1Christian Maeder return ret;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder}
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reillyint sysdb_getgrgid(TALLOC_CTX *mem_ctx,
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly struct sysdb_ctx *sysdb,
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder gid_t gid,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder struct ldb_result **_res)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder{
fa373bc327620e08861294716b4454be8d25669fChristian Maeder TALLOC_CTX *tmpctx;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder unsigned long int ul_gid = gid;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder static const char *attrs[] = SYSDB_GRSRC_ATTRS;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder const char *fmt_filter;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder struct ldb_dn *base_dn;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder struct ldb_result *res;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder int ret;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder tmpctx = talloc_new(mem_ctx);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if (!tmpctx) {
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder return ENOMEM;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if (sysdb->mpg) {
fa373bc327620e08861294716b4454be8d25669fChristian Maeder fmt_filter = SYSDB_GRGID_MPG_FILTER;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder SYSDB_DOM_BASE, sysdb->domain->name);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder } else {
fa373bc327620e08861294716b4454be8d25669fChristian Maeder fmt_filter = SYSDB_GRGID_FILTER;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if (!base_dn) {
fa373bc327620e08861294716b4454be8d25669fChristian Maeder ret = ENOMEM;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder goto done;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder LDB_SCOPE_SUBTREE, attrs, fmt_filter, ul_gid);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if (ret) {
fa373bc327620e08861294716b4454be8d25669fChristian Maeder ret = sysdb_error_to_errno(ret);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder goto done;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder ret = mpg_res_convert(res);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if (ret) {
fa373bc327620e08861294716b4454be8d25669fChristian Maeder goto done;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder *_res = talloc_steal(mem_ctx, res);
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maederdone:
fa373bc327620e08861294716b4454be8d25669fChristian Maeder talloc_zfree(tmpctx);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder return ret;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder}
56899f6457976a2ee20f6a23f088cb5655b15715Liam O'Reilly
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maederint sysdb_enumgrent(TALLOC_CTX *mem_ctx,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder struct sysdb_ctx *sysdb,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder struct ldb_result **_res)
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder{
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder TALLOC_CTX *tmpctx;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder static const char *attrs[] = SYSDB_GRSRC_ATTRS;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder const char *fmt_filter;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder struct ldb_dn *base_dn;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder struct ldb_result *res;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder int ret;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder tmpctx = talloc_new(mem_ctx);
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if (!tmpctx) {
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder return ENOMEM;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder }
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder if (sysdb->mpg) {
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder fmt_filter = SYSDB_GRENT_MPG_FILTER;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder SYSDB_DOM_BASE, sysdb->domain->name);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly } else {
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder fmt_filter = SYSDB_GRENT_FILTER;
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder }
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder if (!base_dn) {
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder ret = ENOMEM;
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder goto done;
ace03c3051e5c5144e43ae78cae73f6a29dde6d5Christian Maeder }
ace03c3051e5c5144e43ae78cae73f6a29dde6d5Christian Maeder
ace03c3051e5c5144e43ae78cae73f6a29dde6d5Christian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
ace03c3051e5c5144e43ae78cae73f6a29dde6d5Christian Maeder LDB_SCOPE_SUBTREE, attrs, fmt_filter);
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder if (ret) {
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder ret = sysdb_error_to_errno(ret);
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder goto done;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder }
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = mpg_res_convert(res);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (ret) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder *_res = talloc_steal(mem_ctx, res);
8e9c3881fb6e710b1e08bf5ac8ff9d393df2e74eChristian Maeder
8e9c3881fb6e710b1e08bf5ac8ff9d393df2e74eChristian Maederdone:
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder talloc_zfree(tmpctx);
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder return ret;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder}
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maeder
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maederint sysdb_initgroups(TALLOC_CTX *mem_ctx,
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maeder struct sysdb_ctx *sysdb,
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly const char *name,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly struct ldb_result **_res)
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder{
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder TALLOC_CTX *tmpctx;
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder struct ldb_result *res;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder struct ldb_dn *user_dn;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder struct ldb_request *req;
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder struct ldb_control **ctrl;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder struct ldb_asq_control *control;
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder static const char *attrs[] = SYSDB_INITGR_ATTRS;
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder int ret;
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder tmpctx = talloc_new(mem_ctx);
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if (!tmpctx) {
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder return ENOMEM;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder }
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder ret = sysdb_getpwnam(tmpctx, sysdb, name, &res);
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder if (ret != EOK) {
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder DEBUG(1, ("sysdb_getpwnam failed: [%d][%s]\n",
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder ret, strerror(ret)));
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder goto done;
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder }
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder if (res->count == 0) {
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly /* User is not cached yet */
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly *_res = talloc_steal(mem_ctx, res);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = EOK;
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder goto done;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder } else if (res->count != 1) {
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder ret = EIO;
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder DEBUG(1, ("sysdb_getpwnam returned count: [%d]\n", res->count));
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* no need to steal the dn, we are not freeing the result */
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder user_dn = res->msgs[0]->dn;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly /* note we count on the fact that the default search callback
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * will just keep appending values. This is by design and can't
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder * change so it is ok to already have a result (from the getpwnam)
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder * even before we call the next search */
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ctrl = talloc_array(tmpctx, struct ldb_control *, 2);
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly if (!ctrl) {
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder ret = ENOMEM;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ctrl[1] = NULL;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ctrl[0] = talloc(ctrl, struct ldb_control);
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly if (!ctrl[0]) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ENOMEM;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ctrl[0]->oid = LDB_CONTROL_ASQ_OID;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ctrl[0]->critical = 1;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly control = talloc(ctrl[0], struct ldb_asq_control);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (!control) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ENOMEM;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly control->request = 1;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly control->source_attribute = talloc_strdup(control, SYSDB_INITGR_ATTR);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (!control->source_attribute) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ENOMEM;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly control->src_attr_len = strlen(control->source_attribute);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ctrl[0]->data = control;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ldb_build_search_req(&req, sysdb->ldb, tmpctx,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly user_dn, LDB_SCOPE_BASE,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly SYSDB_INITGR_FILTER, attrs, ctrl,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly res, ldb_search_default_callback,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly NULL);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (ret != LDB_SUCCESS) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = sysdb_error_to_errno(ret);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly goto done;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ldb_request(sysdb->ldb, req);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (ret == LDB_SUCCESS) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ldb_wait(req->handle, LDB_WAIT_ALL);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (ret != LDB_SUCCESS) {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = sysdb_error_to_errno(ret);
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder goto done;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly *_res = talloc_steal(mem_ctx, res);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reillydone:
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly talloc_zfree(tmpctx);
dd7da1b5fedc05b92ba023ebd803e6f4a662503bChristian Maeder return ret;
dd7da1b5fedc05b92ba023ebd803e6f4a662503bChristian Maeder}
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reillyint sysdb_get_user_attr(TALLOC_CTX *mem_ctx,
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly struct sysdb_ctx *sysdb,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly const char *name,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly const char **attributes,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly struct ldb_result **_res)
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly{
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder TALLOC_CTX *tmpctx;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly struct ldb_dn *base_dn;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly struct ldb_result *res;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly char *sanitized_name;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly int ret;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly tmpctx = talloc_new(mem_ctx);
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly if (!tmpctx) {
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly return ENOMEM;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly }
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly SYSDB_TMPL_USER_BASE, sysdb->domain->name);
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly if (!base_dn) {
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly ret = ENOMEM;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly goto done;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly }
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly ret = sss_filter_sanitize(tmpctx, name, &sanitized_name);
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly if (ret != EOK) {
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly goto done;
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly }
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly LDB_SCOPE_SUBTREE, attributes,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly SYSDB_PWNAM_FILTER, sanitized_name);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (ret) {
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = sysdb_error_to_errno(ret);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder goto done;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
7447e9fcbe38c1d04effa0df67f49240bd9963d6Liam O'Reilly
7447e9fcbe38c1d04effa0df67f49240bd9963d6Liam O'Reilly *_res = talloc_steal(mem_ctx, res);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reillydone:
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder talloc_zfree(tmpctx);
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder return ret;
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder}
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder/* This function splits a three-tuple into three strings
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder * It assumes that any whitespace between the parentheses
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * and commas are intentional and does not attempt to
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * strip them out. Leading and trailing whitespace is
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly * ignored.
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder *
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * This behavior is compatible with nss_ldap's
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * implementation.
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder */
bcd914850de931848b86d7728192a149f9c0108bChristian Maederstatic errno_t sysdb_netgr_split_triple(TALLOC_CTX *mem_ctx,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly const char *triple,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder char **hostname,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder char **username,
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly char **domainname)
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder{
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder errno_t ret;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder TALLOC_CTX *tmp_ctx;
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder const char *p = triple;
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder const char *p_host;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly const char *p_user;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly const char *p_domain;
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly size_t len;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder
05cc55892e6c93bdd7b9c3f100ab1bb65fe6a21eLiam O'Reilly char *host = NULL;
05cc55892e6c93bdd7b9c3f100ab1bb65fe6a21eLiam O'Reilly char *user = NULL;
05cc55892e6c93bdd7b9c3f100ab1bb65fe6a21eLiam O'Reilly char *domain = NULL;
05cc55892e6c93bdd7b9c3f100ab1bb65fe6a21eLiam O'Reilly
05cc55892e6c93bdd7b9c3f100ab1bb65fe6a21eLiam O'Reilly /* Pre-set the values to NULL here so if they are not
* copied, we don't return garbage below.
*/
*hostname = NULL;
*username = NULL;
*domainname = NULL;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
/* Remove any leading whitespace */
while (*p && isspace(*p)) p++;
if (*p != '(') {
/* Triple must start and end with parentheses */
ret = EINVAL;
goto done;
}
p++;
p_host = p;
/* Find the first comma */
while (*p && *p != ',') p++;
if (!*p) {
/* No comma was found: parse error */
ret = EINVAL;
goto done;
}
len = p - p_host;
if (len > 0) {
/* Copy the host string */
host = talloc_strndup(tmp_ctx, p_host, len);
if (!host) {
ret = ENOMEM;
goto done;
}
}
p++;
p_user = p;
/* Find the second comma */
while (*p && *p != ',') p++;
if (!*p) {
/* No comma was found: parse error */
ret = EINVAL;
goto done;
}
len = p - p_user;
if (len > 0) {
/* Copy the user string */
user = talloc_strndup(tmp_ctx, p_user, len);
if (!user) {
ret = ENOMEM;
goto done;
}
}
p++;
p_domain = p;
/* Find the closing parenthesis */
while (*p && *p != ')') p++;
if (*p != ')') {
/* No trailing parenthesis: parse error */
ret = EINVAL;
goto done;
}
len = p - p_domain;
if (len > 0) {
/* Copy the domain string */
domain = talloc_strndup(tmp_ctx, p_domain, len);
if (!domain) {
ret = ENOMEM;
goto done;
}
}
p++;
/* skip trailing whitespace */
while (*p && isspace(*p)) p++;
if (*p) {
/* Extra data after the closing parenthesis
* is a parse error
*/
ret = EINVAL;
goto done;
}
/* Return any non-NULL values */
if (host) {
*hostname = talloc_steal(mem_ctx, host);
}
if (user) {
*username = talloc_steal(mem_ctx, user);
}
if (domain) {
*domainname = talloc_steal(mem_ctx, domain);
}
ret = EOK;
done:
talloc_free(tmp_ctx);
return ret;
}
errno_t sysdb_netgr_to_entries(TALLOC_CTX *mem_ctx,
struct ldb_result *res,
struct sysdb_netgroup_ctx ***entries)
{
errno_t ret;
size_t size = 0;
size_t c = 0;
char *triple_str;
TALLOC_CTX *tmp_ctx;
struct sysdb_netgroup_ctx **tmp_entry = NULL;
struct ldb_message_element *el;
int i, j;
if(!res || res->count == 0) {
return ENOENT;
}
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
for (i=0; i < res->count; i++) {
el = ldb_msg_find_element(res->msgs[i], SYSDB_NETGROUP_TRIPLE);
if (el != NULL) {
size += el->num_values;
}
el = ldb_msg_find_element(res->msgs[i], SYSDB_NETGROUP_MEMBER);
if (el != NULL) {
size += el->num_values;
}
}
tmp_entry = talloc_array(tmp_ctx, struct sysdb_netgroup_ctx *, size + 1);
if (tmp_entry == NULL) {
ret = ENOMEM;
goto done;
}
if (size != 0) {
for (i=0; i < res->count; i++) {
el = ldb_msg_find_element(res->msgs[i], SYSDB_NETGROUP_TRIPLE);
if (el != NULL) {
/* Copy in all of the entries */
for(j = 0; j < el->num_values; j++) {
triple_str = talloc_strndup(tmp_ctx,
(const char *)el->values[j].data,
el->values[j].length);
if (!triple_str) {
ret = ENOMEM;
goto done;
}
tmp_entry[c] = talloc_zero(tmp_entry,
struct sysdb_netgroup_ctx);
if (!tmp_entry[c]) {
ret = ENOMEM;
goto done;
}
tmp_entry[c]->type = SYSDB_NETGROUP_TRIPLE_VAL;
ret = sysdb_netgr_split_triple(tmp_entry[c],
triple_str,
&tmp_entry[c]->value.triple.hostname,
&tmp_entry[c]->value.triple.username,
&tmp_entry[c]->value.triple.domainname);
if (ret != EOK) {
goto done;
}
c++;
}
}
el = ldb_msg_find_element(res->msgs[i], SYSDB_NETGROUP_MEMBER);
if (el != NULL) {
for(j = 0; j < el->num_values; j++) {
tmp_entry[c] = talloc_zero(tmp_entry,
struct sysdb_netgroup_ctx);
if (!tmp_entry[c]) {
ret = ENOMEM;
goto done;
}
tmp_entry[c]->type = SYSDB_NETGROUP_GROUP_VAL;
tmp_entry[c]->value.groupname = talloc_strndup(tmp_entry[c],
(const char *)el->values[j].data,
el->values[j].length);
if (tmp_entry[c]->value.groupname == NULL) {
ret = ENOMEM;
goto done;
}
c++;
}
}
}
}
/* Add NULL terminator */
tmp_entry[c] = NULL;
*entries = talloc_steal(mem_ctx, tmp_entry);
ret = EOK;
done:
talloc_free(tmp_ctx);
return ret;
}
errno_t sysdb_getnetgr(TALLOC_CTX *mem_ctx,
struct sysdb_ctx *sysdb,
const char *netgroup,
struct ldb_result **res)
{
TALLOC_CTX *tmp_ctx;
static const char *attrs[] = SYSDB_NETGR_ATTRS;
struct ldb_dn *base_dn;
struct ldb_result *result;
char *sanitized_netgroup;
char *netgroup_dn;
int lret;
errno_t ret;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
base_dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
SYSDB_TMPL_NETGROUP_BASE,
sysdb->domain->name);
if (!base_dn) {
ret = ENOMEM;
goto done;
}
ret = sss_filter_sanitize(tmp_ctx, netgroup, &sanitized_netgroup);
if (ret != EOK) {
goto done;
}
netgroup_dn = talloc_asprintf(tmp_ctx, SYSDB_TMPL_NETGROUP,
sanitized_netgroup, sysdb->domain->name);
if (!netgroup_dn) {
ret = ENOMEM;
goto done;
}
lret = ldb_search(sysdb->ldb, tmp_ctx, &result, base_dn,
LDB_SCOPE_SUBTREE, attrs,
SYSDB_NETGR_TRIPLES_FILTER,
sanitized_netgroup, netgroup_dn);
ret = sysdb_error_to_errno(lret);
if (ret != EOK) {
goto done;
}
*res = talloc_steal(mem_ctx, result);
ret = EOK;
done:
talloc_zfree(tmp_ctx);
return ret;
}
int sysdb_get_netgroup_attr(TALLOC_CTX *mem_ctx,
struct sysdb_ctx *sysdb,
const char *netgrname,
const char **attributes,
struct ldb_result **res)
{
TALLOC_CTX *tmpctx;
struct ldb_dn *base_dn;
struct ldb_result *result;
char *sanitized_netgroup;
int ret;
tmpctx = talloc_new(mem_ctx);
if (!tmpctx) {
return ENOMEM;
}
base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
SYSDB_TMPL_NETGROUP_BASE, sysdb->domain->name);
if (!base_dn) {
ret = ENOMEM;
goto done;
}
ret = sss_filter_sanitize(tmpctx, netgrname, &sanitized_netgroup);
if (ret != EOK) {
goto done;
}
ret = ldb_search(sysdb->ldb, tmpctx, &result, base_dn,
LDB_SCOPE_SUBTREE, attributes,
SYSDB_NETGR_FILTER,
sanitized_netgroup);
if (ret) {
ret = sysdb_error_to_errno(ret);
goto done;
}
*res = talloc_steal(mem_ctx, result);
done:
talloc_zfree(tmpctx);
return ret;
}