sysdb_search.c revision 8a1738f9379a1b8fb5c95c3df649e014ff5a1434
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly System Database
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
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.
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.
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/>.
c0833539c8cf577dd3f2497792fbdd818442744cChristian Maeder static const char *attrs[] = SYSDB_PW_ATTRS;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = sss_filter_sanitize(tmpctx, name, &sanitized_name);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder LDB_SCOPE_SUBTREE, attrs, SYSDB_PWNAM_FILTER,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder static const char *attrs[] = SYSDB_PW_ATTRS;
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder LDB_SCOPE_SUBTREE, attrs, SYSDB_PWUID_FILTER, ul_uid);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder static const char *attrs[] = SYSDB_PW_ATTRS;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder SYSDB_TMPL_USER_BASE, sysdb->domain->name);
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder LDB_SCOPE_SUBTREE, attrs, SYSDB_PWENT_FILTER);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstatic int mpg_convert(struct ldb_message *msg)
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder el = ldb_msg_find_element(msg, "objectClass");
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* see if this is a user to convert to a group */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* no, leave as is */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* yes, convert */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder val->data = (uint8_t *)talloc_strdup(msg, SYSDB_GROUP_CLASS);
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reillystatic int mpg_res_convert(struct ldb_result *res)
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maeder static const char *attrs[] = SYSDB_GRSRC_ATTRS;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly ret = sss_filter_sanitize(tmpctx, name, &sanitized_name);
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder static const char *attrs[] = SYSDB_GRSRC_ATTRS;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder LDB_SCOPE_SUBTREE, attrs, fmt_filter, ul_gid);
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder static const char *attrs[] = SYSDB_GRSRC_ATTRS;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder base_dn = ldb_dn_new_fmt(tmpctx, sysdb->ldb,
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
ace03c3051e5c5144e43ae78cae73f6a29dde6d5Christian Maeder ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder static const char *attrs[] = SYSDB_INITGR_ATTRS;
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder ret = sysdb_getpwnam(tmpctx, sysdb, name, &res);
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder DEBUG(1, ("sysdb_getpwnam failed: [%d][%s]\n",
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly /* User is not cached yet */
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder DEBUG(1, ("sysdb_getpwnam returned count: [%d]\n", res->count));
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* no need to steal the dn, we are not freeing the result */
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 ctrl = talloc_array(tmpctx, struct ldb_control *, 2);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly control = talloc(ctrl[0], struct ldb_asq_control);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly control->source_attribute = talloc_strdup(control, SYSDB_INITGR_ATTR);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly control->src_attr_len = strlen(control->source_attribute);
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly ret = ldb_build_search_req(&req, sysdb->ldb, tmpctx,
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly ret = sss_filter_sanitize(tmpctx, name, &sanitized_name);
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly ret = ldb_search(sysdb->ldb, tmpctx, &res, base_dn,
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
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * This behavior is compatible with nss_ldap's
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * implementation.
bcd914850de931848b86d7728192a149f9c0108bChristian Maederstatic errno_t sysdb_netgr_split_triple(TALLOC_CTX *mem_ctx,
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder const char *p = triple;
05cc55892e6c93bdd7b9c3f100ab1bb65fe6a21eLiam O'Reilly /* Pre-set the values to NULL here so if they are not
if (!tmp_ctx) {
return ENOMEM;
while (*p && isspace(*p)) p++;
goto done;
p_host = p;
goto done;
if (len > 0) {
if (!host) {
goto done;
p_user = p;
goto done;
if (len > 0) {
if (!user) {
goto done;
p_domain = p;
goto done;
if (len > 0) {
if (!domain) {
goto done;
while (*p && isspace(*p)) p++;
goto done;
if (host) {
if (user) {
if (domain) {
done:
return ret;
size_t c = 0;
char *triple_str;
return ENOENT;
if (!tmp_ctx) {
return ENOMEM;
goto done;
if (size != 0) {
if (!triple_str) {
goto done;
struct sysdb_netgroup_ctx);
if (!tmp_entry[c]) {
goto done;
goto done;
struct sysdb_netgroup_ctx);
if (!tmp_entry[c]) {
goto done;
goto done;
done:
return ret;
const char *netgroup,
char *sanitized_netgroup;
char *netgroup_dn;
int lret;
if (!tmp_ctx) {
return ENOMEM;
if (!base_dn) {
goto done;
goto done;
if (!netgroup_dn) {
goto done;
goto done;
done:
return ret;
const char *netgrname,
const char **attributes,
char *sanitized_netgroup;
int ret;
if (!tmpctx) {
return ENOMEM;
if (!base_dn) {
goto done;
goto done;
if (ret) {
goto done;
done:
return ret;