sysdb_ops.c revision e60b425ddc0e24178d044bef04ab7349ac7a7826
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher/*
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher SSSD
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher System Database
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher
c252d148fa8ab50aaaa8bbae7beb4d208025171dNikolai Kondrashov Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher This program is free software; you can redistribute it and/or modify
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher it under the terms of the GNU General Public License as published by
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov the Free Software Foundation; either version 3 of the License, or
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov (at your option) any later version.
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov This program is distributed in the hope that it will be useful,
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov but WITHOUT ANY WARRANTY; without even the implied warranty of
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek GNU General Public License for more details.
fd5a4eacd56700ffb08a73121aeacdc806cb0132Sumit Bose
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher You should have received a copy of the GNU General Public License
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher along with this program. If not, see <http://www.gnu.org/licenses/>.
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher*/
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher#include "util/util.h"
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher#include "db/sysdb_private.h"
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov#include "db/sysdb_services.h"
428db8a58c0c149d5efccc6d788f70916c1d34d7Jakub Hrozek#include "db/sysdb_autofs.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "util/crypto/sss_crypto.h"
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher#include <time.h>
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint add_string(struct ldb_message *msg, int flags,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *attr, const char *value)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_msg_add_empty(msg, attr, flags, NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == LDB_SUCCESS) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_msg_add_string(msg, attr, value);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == LDB_SUCCESS) return EOK;
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint add_ulong(struct ldb_message *msg, int flags,
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose const char *attr, unsigned long value)
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose{
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose int ret;
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose ret = ldb_msg_add_empty(msg, attr, flags, NULL);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose if (ret == LDB_SUCCESS) {
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke ret = ldb_msg_add_fmt(msg, attr, "%lu", value);
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (ret == LDB_SUCCESS) return EOK;
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke }
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose return ENOMEM;
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose}
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bosestatic uint32_t get_attr_as_uint32(struct ldb_message *msg, const char *attr)
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose{
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher long long int l;
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher if (!v || !v->data) {
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek return 0;
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek }
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek
a5bb518446d5ce565d7ba819590a009cabb0b0b4Jakub Hrozek errno = 0;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce l = strtoll((const char *)v->data, NULL, 10);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (errno) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return (uint32_t)-1;
d921c1eba437662437847279f251a0a5d8f70127Maxim }
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (l < 0 || l > ((uint32_t)(-1))) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return (uint32_t)-1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return l;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek * The wrapper around ldb_modify that uses LDB_CONTROL_PERMISSIVE_MODIFY_OID
5377441d7a846461c2d9a7a870cea711360a529aNikolai Kondrashov * so that on adds entries that already exist are skipped and similarly
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * entries that are missing are ignored on deletes
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
32381402a4a9afc003782c9e2301fc59c9bda2a9Yassir Elleyint sss_ldb_modify_permissive(struct ldb_context *ldb,
dbfc407eef1d9ba2469687c3ffbe7fd8bb111d94Jakub Hrozek struct ldb_message *msg)
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher{
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher struct ldb_request *req;
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek int ret = EOK;
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher ret = ldb_build_mod_req(&req, ldb, ldb,
6dcbfe52d5e64205c0d922f3e89add066b42c496Jakub Hrozek msg,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher NULL,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce NULL,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ldb_op_default_callback,
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher NULL);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek if (ret != LDB_SUCCESS) return ret;
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek ret = ldb_request_add_control(req, LDB_CONTROL_PERMISSIVE_MODIFY_OID,
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek false, NULL);
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek if (ret != LDB_SUCCESS) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce talloc_free(req);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_request(ldb, req);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == LDB_SUCCESS) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_wait(req->handle, LDB_WAIT_ALL);
054b5d4bb98973698f74d66b14ccd14394b53f10Lukas Slebodnik }
054b5d4bb98973698f74d66b14ccd14394b53f10Lukas Slebodnik
62bda5f75bda6b77aea30d708c74efaf725d9367Lukas Slebodnik talloc_free(req);
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik#define ERROR_OUT(v, r, l) do { v = r; goto l; } while(0)
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Remove-Entry-From-Sysdb=============================================== */
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholastaint sysdb_delete_entry(struct sysdb_ctx *sysdb,
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta struct ldb_dn *dn,
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta bool ignore_not_found)
558998ce664055a75595371118f818084d8f2b23Jan Cholasta{
558998ce664055a75595371118f818084d8f2b23Jan Cholasta int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_delete(sysdb->ldb, dn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher switch (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case LDB_SUCCESS:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case LDB_ERR_NO_SUCH_OBJECT:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ignore_not_found) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EOK;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
f1828234a850dd28465425248a83a993f262918fPavel Březina /* fall through */
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay default:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(1, ("LDB Error: %s(%d)\nError Message: [%s]\n",
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb)));
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina return sysdb_error_to_errno(ret);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Remove-Subentries-From-Sysdb=========================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_delete_recursive(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool ignore_not_found)
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek{
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek const char *no_attrs[] = { NULL };
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek struct ldb_message **msgs;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina size_t msgs_count;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int ret;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int i;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TALLOC_CTX *tmp_ctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek tmp_ctx = talloc_new(NULL);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (!tmp_ctx) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta return ENOMEM;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek ret = ldb_transaction_start(sysdb->ldb);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek if (ret) {
19d3aba12c70528708be9440aca66038a291f29eYassir Elley ret = sysdb_error_to_errno(ret);
19d3aba12c70528708be9440aca66038a291f29eYassir Elley goto done;
19d3aba12c70528708be9440aca66038a291f29eYassir Elley }
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek ret = sysdb_search_entry(tmp_ctx, sysdb, dn,
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek LDB_SCOPE_SUBTREE, "(distinguishedName=*)",
45726939a48e605b0166521f94300ae04981a3a7Sumit Bose no_attrs, &msgs_count, &msgs);
45726939a48e605b0166521f94300ae04981a3a7Sumit Bose if (ret) {
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose if (ignore_not_found && ret == ENOENT) {
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek ret = EOK;
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek }
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose if (ret) {
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose DEBUG(6, ("Search error: %d (%s)\n", ret, strerror(ret)));
45726939a48e605b0166521f94300ae04981a3a7Sumit Bose }
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek goto done;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce DEBUG(SSSDBG_TRACE_ALL, ("Found [%zu] items to delete.\n", msgs_count));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose qsort(msgs, msgs_count,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose sizeof(struct ldb_message *), compare_ldb_dn_comp_num);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose for (i = 0; i < msgs_count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(9 ,("Trying to delete [%s].\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_dn_get_linearized(msgs[i]->dn)));
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek ret = sysdb_delete_entry(sysdb, msgs[i]->dn, false);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher ldb_transaction_cancel(sysdb->ldb);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher talloc_free(tmp_ctx);
fe60346714a73ac3987f786731389320633dd245Pavel Březina return ret;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose}
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek/* =Search-Entry========================================================== */
e5e8252ec48bfdd4e7529debc705c8e090264b9aSumit Bose
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březinaint sysdb_search_entry(TALLOC_CTX *mem_ctx,
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher struct sysdb_ctx *sysdb,
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina struct ldb_dn *base_dn,
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina int scope,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek const char *filter,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek const char **attrs,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek size_t *msgs_count,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek struct ldb_message ***msgs)
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek{
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek struct ldb_result *res;
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek ret = ldb_search(sysdb->ldb, mem_ctx, &res,
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek base_dn, scope, attrs,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek filter?"%s":NULL, filter);
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh if (ret) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return sysdb_error_to_errno(ret);
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha }
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek *msgs_count = res->count;
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek *msgs = talloc_steal(mem_ctx, res->msgs);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek if (res->count == 0) {
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose return ENOENT;
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose }
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek return EOK;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek}
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina/* =Search-Entry-by-SID-string============================================ */
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichlint sysdb_search_entry_by_sid_str(TALLOC_CTX *mem_ctx,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl struct sss_domain_info *domain,
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek const char *search_base,
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek const char *filter_str,
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek const char *sid_str,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek const char **attrs,
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech struct ldb_message **msg)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose{
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina TALLOC_CTX *tmp_ctx;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *def_attrs[] = { SYSDB_NAME, SYSDB_SID_STR, NULL };
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose struct ldb_message **msgs = NULL;
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek struct ldb_dn *basedn;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina size_t msgs_count = 0;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina char *filter;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek int ret;
2b62d5a414b8b7dba4f714dc5033e28dc4b1f4feJakub Hrozek
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek tmp_ctx = talloc_new(NULL);
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech if (!tmp_ctx) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return ENOMEM;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose }
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina search_base, domain->name);
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl if (!basedn) {
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl ret = ENOMEM;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek }
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek filter = talloc_asprintf(tmp_ctx, filter_str, sid_str);
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek if (!filter) {
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek ret = ENOMEM;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek goto done;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek }
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn, LDB_SCOPE_SUBTREE,
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek filter, attrs?attrs:def_attrs, &msgs_count,
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek &msgs);
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek if (ret) {
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik goto done;
99f8be128274eba264ea1434a7eb2800bced5902Lukas Slebodnik }
99f8be128274eba264ea1434a7eb2800bced5902Lukas Slebodnik
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bose *msg = talloc_steal(mem_ctx, msgs[0]);
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bose
4117ae3230f6744c255b0309e86d519d7e41d2d7Lukas Slebodnikdone:
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bose if (ret == ENOENT) {
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik }
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik else if (ret) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek return ret;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Search-User-by-[UID/SID/NAME]============================================= */
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozekint sysdb_search_user_by_name(TALLOC_CTX *mem_ctx,
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek struct sss_domain_info *domain,
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek const char *name,
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher const char **attrs,
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher struct ldb_message **msg)
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik{
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik TALLOC_CTX *tmp_ctx;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, NULL };
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik struct ldb_message **msgs = NULL;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik struct ldb_dn *basedn;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik size_t msgs_count = 0;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik char *sanitized_name;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik char *filter;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik int ret;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik tmp_ctx = talloc_new(NULL);
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher if (!tmp_ctx) {
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher return ENOMEM;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek SYSDB_TMPL_USER_BASE, domain->name);
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov if (!basedn) {
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov ret = ENOMEM;
6ad1f2da4055e2cfe9bf8c79b79e408dba171691Lukas Slebodnik goto done;
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sss_filter_sanitize(tmp_ctx, name, &sanitized_name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter = talloc_asprintf(tmp_ctx, SYSDB_PWNAM_FILTER, sanitized_name,
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik sanitized_name);
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik if (!filter) {
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik ret = ENOMEM;
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik goto done;
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik }
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn, LDB_SCOPE_SUBTREE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter, attrs?attrs:def_attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &msgs_count, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bosedone:
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose if (ret == ENOENT) {
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose }
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose else if (ret) {
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose }
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose talloc_zfree(tmp_ctx);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose return ret;
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke}
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzkeint sysdb_search_user_by_uid(TALLOC_CTX *mem_ctx,
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke struct sss_domain_info *domain,
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke uid_t uid,
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose const char **attrs,
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose struct ldb_message **msg)
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose{
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose TALLOC_CTX *tmp_ctx;
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, NULL };
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose struct ldb_message **msgs = NULL;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher struct ldb_dn *basedn;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher size_t msgs_count = 0;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik char *filter;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik tmp_ctx = talloc_new(NULL);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (!tmp_ctx) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik return ENOMEM;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik SYSDB_TMPL_USER_BASE, domain->name);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (!basedn) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik ret = ENOMEM;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik goto done;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik filter = talloc_asprintf(tmp_ctx, SYSDB_PWUID_FILTER, (unsigned long)uid);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (!filter) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Use SUBTREE scope here, not ONELEVEL
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * There is a bug in LDB that makes ONELEVEL searches extremely
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher * slow (it ignores indexing)
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher */
15b266d9f14dad26da8678a79019749d0f69532eStephen Gallagher ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn,
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik LDB_SCOPE_SUBTREE, filter,
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik attrs?attrs:def_attrs, &msgs_count, &msgs);
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher if (ret) {
b97595ae059c69b1960a6e7e56d74660388a683bJan Zeleny goto done;
6a6a821866091e0f722808566c25b951aa346d7cStephen Gallagher }
48d7840cae22c5ff4d786149b0d8ecee7efb8306Lukas Slebodnik
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov *msg = talloc_steal(mem_ctx, msgs[0]);
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashovdone:
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov if (ret == ENOENT) {
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik }
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik else if (ret) {
51d65c4ad15c2cc23f38fa09dd6efeb15e4f3e86Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik }
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik
51d65c4ad15c2cc23f38fa09dd6efeb15e4f3e86Jakub Hrozek talloc_zfree(tmp_ctx);
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov return ret;
6ad1f2da4055e2cfe9bf8c79b79e408dba171691Lukas Slebodnik}
7bb9ba8688ec1ca930d693eea05e936bc38f6d1bSumit Bose
51d65c4ad15c2cc23f38fa09dd6efeb15e4f3e86Jakub Hrozekint sysdb_search_user_by_sid_str(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher const char *sid_str,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msg)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return sysdb_search_entry_by_sid_str(mem_ctx, domain,
17f08cbd0f909181536b93d6c12c7cd69995f09eSumit Bose SYSDB_TMPL_USER_BASE,
1773fdad2730f3f910782781fa286f402ce36ccaLukas Slebodnik SYSDB_PWSID_FILTER,
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov sid_str, attrs, msg);
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov}
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov/* =Search-Group-by-[GID/SID/NAME]============================================ */
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashovint sysdb_search_group_by_name(TALLOC_CTX *mem_ctx,
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov struct sss_domain_info *domain,
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose const char *name,
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose const char **attrs,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek struct ldb_message **msg)
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher static const char *def_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t msgs_count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher basedn = sysdb_group_dn(tmp_ctx, domain, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!basedn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn, LDB_SCOPE_BASE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher NULL, attrs?attrs:def_attrs, &msgs_count, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Bose }
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek *msg = talloc_steal(mem_ctx, msgs[0]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
a5bb518446d5ce565d7ba819590a009cabb0b0b4Jakub Hrozek if (ret == ENOENT) {
eaaeaa7e00c3d4bfa792cc4d3c6770dc1e28ef0cSumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
c42ca36247022490ad65a33c453cb5e43900dbe9Lukas Slebodnik else if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher talloc_zfree(tmp_ctx);
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Boseint sysdb_search_group_by_gid(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce gid_t gid,
0ef783e186ef1c9f60e61a4e8e54c44cb366fdfePavel Březina const char **attrs,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek struct ldb_message **msg)
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta{
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik TALLOC_CTX *tmp_ctx;
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik const char *def_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM, NULL };
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik struct ldb_message **msgs = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
b3b6189850d50c656d62efbd498789124c033b00Lukas Slebodnik size_t msgs_count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *filter;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina int ret;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina tmp_ctx = talloc_new(NULL);
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina if (!tmp_ctx) {
7a2ca8d776df685bddbb64370181fb32d776f676Pavel Březina return ENOMEM;
a79acee185654d110c0e35ba351368d664e4e53dPavel Březina }
12d771585a84a7523a5b7d9cf502d4bcddecb9b9Pavel Březina
0ae7e46a3990c47873fca879a9395e3ce00d9150Pavel Březina basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina SYSDB_TMPL_GROUP_BASE, domain->name);
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina if (!basedn) {
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina ret = ENOMEM;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina goto done;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina }
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina filter = talloc_asprintf(tmp_ctx, SYSDB_GRGID_FILTER, (unsigned long)gid);
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina if (!filter) {
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina ret = ENOMEM;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina goto done;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina }
488518dde58724daa13b9216a0f1af6e0ba5401fPavel Březina
3be2628d8aba6aeb99ac1484da990f1fad8169ecPavel Březina /* Use SUBTREE scope here, not ONELEVEL
2e13817e64ff1e0e47dc844be501f2d3ab299f34Pavel Březina * There is a bug in LDB that makes ONELEVEL searches extremely
c2fc9459c31cb1192ab3c15ce4df1c150e99bf95Pavel Březina * slow (it ignores indexing)
6b159f14f69134bba8510a6b50ab62493a23a73fPavel Březina */
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn, LDB_SCOPE_SUBTREE,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina filter, attrs?attrs:def_attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &msgs_count, &msgs);
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
769347ad4d35d43488eb98f980143495b0db415dStef Walterdone:
115de6d50f0d0bdd5745a5d8eb0d067be9128528Sumit Bose if (ret == ENOENT) {
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina }
769347ad4d35d43488eb98f980143495b0db415dStef Walter else if (ret) {
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina }
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_search_group_by_sid_str(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina const char *sid_str,
aea1d5c0ca9bb1470759b024c8b97b6c1f577193Pavel Březina const char **attrs,
d2d8f342cd5e90bb9fd947c448492225f959aa86Pavel Březina struct ldb_message **msg)
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina{
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return sysdb_search_entry_by_sid_str(mem_ctx, domain,
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek SYSDB_TMPL_GROUP_BASE,
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek SYSDB_GRSID_FILTER,
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek sid_str, attrs, msg);
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek}
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Search-Group-by-Name============================================ */
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březina
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březinaint sysdb_search_netgroup_by_name(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char **attrs,
77d165f0629966db65753a3aee84a8b4971673afPavel Březina struct ldb_message **msg)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher static const char *def_attrs[] = { SYSDB_NAME, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t msgs_count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim
6499d0b915209b670f8e337c4fe76a8be9fa6576Simo Sorce basedn = sysdb_netgroup_dn(tmp_ctx, domain, name);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!basedn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn, LDB_SCOPE_BASE,
4e0404ca1b19830dc0f729e59efd5bbd0a9d6103Lukas Slebodnik NULL, attrs?attrs:def_attrs, &msgs_count,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else if (ret) {
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Bose DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Replace-Attributes-On-Entry=========================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_set_entry_attr(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *entry_dn,
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek struct sysdb_attrs *attrs,
8f1316a0c677f211eaaa1346e21a03446b8c4fb1Lukas Slebodnik int mod_op)
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
558ec7d717735bb16c210c675c2cc5bee1da4576Lukas Slebodnik int i, ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int lret;
3a4186ae40d0c3b7be46a4c973166f6048fcfe38Lukas Slebodnik TALLOC_CTX *tmp_ctx;
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
46e36286953de4e5af5e4289b90a529929bdd17cPetr Cech return ENOMEM;
a5a3bbb0bbaeb8946c228c2fb7f0cf450595dd3ePavel Březina }
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny if (!entry_dn || attrs->num == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EINVAL;
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce msg = ldb_msg_new(tmp_ctx);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (!msg) {
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta ret = ENOMEM;
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos goto done;
701f13b5c8e27bcbfc79e77ce7c76d9f768a448cLukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->dn = entry_dn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce msg->elements = talloc_array(msg, struct ldb_message_element, attrs->num);
5f90993426fa2bdc3b3d994c9e85e0805bb92bbcSimo Sorce if (!msg->elements) {
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek ret = ENOMEM;
7452f1b637276ce582b120f8f5482ae7f3b6bd47Jakub Hrozek goto done;
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce }
bc052ea17d858c19f9cb9c9e2bc602e754f68831Sumit Bose
2fa8d6655ac37f9bdeb34420000052d921f4a543Michal Zidek for (i = 0; i < attrs->num; i++) {
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina msg->elements[i] = attrs->a[i];
6499d0b915209b670f8e337c4fe76a8be9fa6576Simo Sorce msg->elements[i].flags = mod_op;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina msg->num_elements = attrs->num;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher lret = ldb_modify(sysdb->ldb, msg);
e850be1ff2e13bba9812c94c3d102c0a0b570820Jakub Hrozek if (lret != LDB_SUCCESS) {
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina DEBUG(SSSDBG_MINOR_FAILURE,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina ("ldb_modify failed: [%s]\n", ldb_strerror(lret)));
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina }
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(lret);
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher if (ret == ENOENT) {
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
8c3a4809b3420657289b42f028a1c9019b112991Stephen Gallagher }
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce else if (ret) {
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose talloc_zfree(tmp_ctx);
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta/* =Replace-Attributes-On-User============================================ */
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina
7f0b01bf0a8f5c5b3ef145e81511b6db2cb4f98fPavel Březinaint sysdb_set_user_attr(struct sss_domain_info *domain,
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek const char *name,
590582be38cdbfde387fcc57df92903d48c5a083Jakub Hrozek struct sysdb_attrs *attrs,
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina int mod_op)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_dn *dn;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina TALLOC_CTX *tmp_ctx;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce errno_t ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce tmp_ctx = talloc_new(NULL);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dn = sysdb_user_dn(tmp_ctx, domain, name);
df4e1db5d41c903ae57fd880acc76a0ad84aa7b2Pavel Březina if (!dn) {
364b3572bab5a9649e8f2d4da835d05d3c8ca7a9Pavel Březina ret = ENOMEM;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek ret = sysdb_set_entry_attr(domain->sysdb, dn, attrs, mod_op);
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher }
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
376eaf187c13c2a1eaea0ffbdd970b6b563ab74cPetr Cech}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/* =Replace-Attributes-On-Group=========================================== */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaint sysdb_set_group_attr(struct sss_domain_info *domain,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sysdb_attrs *attrs,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int mod_op)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
cc2d77d5218c188119fa954c856e858cbde76947Pavel Březina struct ldb_dn *dn;
892ddeb5190dd5c1ffa26a95142a10a0034fc5e3Pavel Březina TALLOC_CTX *tmp_ctx;
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina errno_t ret;
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina
50c2a57dea6d38a4f6753a917a5d745b07036325Pavel Březina tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
f9961e5f82e0ef474d6492371bfdf9e74e208a99Pavel Březina ret = ENOMEM;
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
c777f575b0ec0c48ce3b85ea2c5cc298db02450eJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dn = sysdb_group_dn(tmp_ctx, domain, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!dn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
3441d0c2d11aea0c39b009751a1898333c009674Stephen Gallagher goto done;
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher }
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_entry_attr(domain->sysdb, dn, attrs, mod_op);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
cce3e8526176ce2fe9baa5bda1bb457b996b7bcfSumit Bose
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EOK;
e9eeb4302e0e426c6cc1a4e65b95a6f7066e80b9Pavel Březinadone:
85feb8d77a2c832787880944e02104846c4d5376Pavel Březina talloc_free(tmp_ctx);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher
cdaa29d2c5724a4c72bfa0f42284ccfac3d5a464Pavel Reichl/* =Replace-Attributes-On-Netgroup=========================================== */
ae8d047122c7ba8123f72b2eac68944868ac37d4Stephen Gallagher
fae99bfe4bfc8b4a12e9c2a0ad01b3684c22f934Simo Sorceint sysdb_set_netgroup_attr(struct sss_domain_info *domain,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek const char *name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sysdb_attrs *attrs,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina int mod_op)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
213ce2a78b1abe3921d8dc13c949a28130d00aecJan Zeleny errno_t ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *dn;
38e2ec1c757955ab557fd95807afa58042d09482Jan Zeleny TALLOC_CTX *tmp_ctx;
ad07ed37b6b51ef134d4524edaf2259e19ac984fJan Zeleny
1a853121ca2ba8ede6df429ee76942131ffb0f65Jan Zeleny tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
81165faf5d951aca69f410713730c26ff048ec44Sumit Bose }
3a62a99faf8e12965100d0b26fc9e07752bd3e2dStephen Gallagher
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta dn = sysdb_netgroup_dn(tmp_ctx, domain, name);
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher if (!dn) {
88275cccddf39892e01682b39b02292eb74729bdPavel Březina ret = ENOMEM;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina }
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = sysdb_set_entry_attr(domain->sysdb, dn, attrs, mod_op);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinadone:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_free(tmp_ctx);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina/* =Get-New-ID============================================================ */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
e07d700ed9daf0cf96607fa2d72978cb2431b794Pavel Březinaint sysdb_get_new_id(struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t *_id)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta const char *attrs_1[] = { SYSDB_NEXTID, NULL };
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek const char *attrs_2[] = { SYSDB_UIDNUM, SYSDB_GIDNUM, NULL };
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher struct ldb_dn *base_dn;
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher char *filter;
3f32406640d89face5e79244b4d8dab34adb6c7cPavel Březina uint32_t new_id = 0;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina struct ldb_message **msgs;
b1a822a16e3ef97e31d167f9e97efec06fc121dcJakub Hrozek size_t count;
d43c9d18fb263b1ea4071b20e93ce4994583f62fJakub Hrozek struct ldb_message *msg;
077f8c9ca849ec895da3f0a25d15484ead08e99eLukas Slebodnik uint32_t id;
3e5e98aae4b14f5447c561ff5b0d854b74046312Pavel Březina int ret;
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina int i;
bf6c3f07d653d474da9e43b2b7cced57fc4ea069Sumit Bose
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose tmp_ctx = talloc_new(NULL);
e293fba4f5459f3c2dad254dcc966407d8fc3312Jakub Hrozek if (!tmp_ctx) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return ENOMEM;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose base_dn = sysdb_domain_dn(tmp_ctx, domain);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (!base_dn) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina talloc_zfree(tmp_ctx);
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik return ENOMEM;
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose }
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = ldb_transaction_start(domain->sysdb->ldb);
aea1d5c0ca9bb1470759b024c8b97b6c1f577193Pavel Březina if (ret) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_zfree(tmp_ctx);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina ret = sysdb_error_to_errno(ret);
53f1b03f4e61ebe21df0c2fd05e09e0504fd8881Jakub Hrozek return ret;
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik }
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, domain->sysdb, base_dn, LDB_SCOPE_BASE,
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek SYSDB_NEXTID_FILTER, attrs_1, &count, &msgs);
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce switch (ret) {
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce case EOK:
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek new_id = get_attr_as_uint32(msgs[0], SYSDB_NEXTID);
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek if (new_id == (uint32_t)(-1)) {
374bf54785365273b20690bd3792c25a44738041Pavel Březina DEBUG(1, ("Invalid Next ID in domain %s\n", domain->name));
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher ret = ERANGE;
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher if (new_id < domain->id_min) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina new_id = domain->id_min;
2d5d7761ef2b0d43c39dadf877b87aae19231036Lukas Slebodnik }
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina if ((domain->id_max != 0) && (new_id > domain->id_max)) {
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik DEBUG(0, ("Failed to allocate new id, out of range (%u/%u)\n",
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik new_id, domain->id_max));
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek ret = ERANGE;
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek goto done;
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek }
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek break;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher case ENOENT:
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher /* looks like the domain is not initialized yet, use min_id */
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher new_id = domain->id_min;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher break;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
11e8f3ecdddf8edd8b1bbe9f41b49ce8b709b92aPetr Cech default:
11e8f3ecdddf8edd8b1bbe9f41b49ce8b709b92aPetr Cech goto done;
11e8f3ecdddf8edd8b1bbe9f41b49ce8b709b92aPetr Cech }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt talloc_zfree(msgs);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt count = 0;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher /* verify the id is actually really free.
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher * search all entries with id >= new_id and < max_id */
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher if (domain->id_max) {
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher filter = talloc_asprintf(tmp_ctx,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik "(|(&(%s>=%u)(%s<=%u))(&(%s>=%u)(%s<=%u)))",
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik SYSDB_UIDNUM, new_id,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik SYSDB_UIDNUM, domain->id_max,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik SYSDB_GIDNUM, new_id,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik SYSDB_GIDNUM, domain->id_max);
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik }
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher else {
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher filter = talloc_asprintf(tmp_ctx,
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik "(|(%s>=%u)(%s>=%u))",
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik SYSDB_UIDNUM, new_id,
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik SYSDB_GIDNUM, new_id);
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik }
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik if (!filter) {
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik DEBUG(6, ("Error: Out of memory\n"));
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik ret = ENOMEM;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik goto done;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik }
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = sysdb_search_entry(tmp_ctx, domain->sysdb, base_dn, LDB_SCOPE_SUBTREE,
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik filter, attrs_2, &count, &msgs);
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce switch (ret) {
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce /* if anything was found, find the maximum and increment past it */
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce case EOK:
b3a22ee1d91aa4ed1544475be16ec2b7cf886180Jakub Hrozek for (i = 0; i < count; i++) {
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce id = get_attr_as_uint32(msgs[i], SYSDB_UIDNUM);
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (id != (uint32_t)(-1)) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (id > new_id) new_id = id;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose id = get_attr_as_uint32(msgs[i], SYSDB_GIDNUM);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if (id != (uint32_t)(-1)) {
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if (id > new_id) new_id = id;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose new_id++;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose /* check again we are not falling out of range */
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if ((domain->id_max != 0) && (new_id > domain->id_max)) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik DEBUG(0, ("Failed to allocate new id, out of range (%u/%u)\n",
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik new_id, domain->id_max));
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = ERANGE;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik goto done;
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce }
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce break;
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce
b3a22ee1d91aa4ed1544475be16ec2b7cf886180Jakub Hrozek case ENOENT:
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce break;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik default:
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose goto done;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose talloc_zfree(msgs);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose count = 0;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose /* finally store the new next id */
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose msg = ldb_msg_new(tmp_ctx);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if (!msg) {
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose DEBUG(6, ("Error: Out of memory\n"));
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose ret = ENOMEM;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik goto done;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik }
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik msg->dn = base_dn;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = add_ulong(msg, LDB_FLAG_MOD_REPLACE,
3b1aa479b377e570c6dff359a1f8099289a2af75Michal Židek SYSDB_NEXTID, new_id + 1);
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (ret) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik goto done;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik }
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = ldb_modify(domain->sysdb->ldb, msg);
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = sysdb_error_to_errno(ret);
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik *_id = new_id;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnikdone:
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (ret == EOK) {
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose ret = ldb_transaction_commit(domain->sysdb->ldb);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose ret = sysdb_error_to_errno(ret);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose } else {
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose ldb_transaction_cancel(domain->sysdb->ldb);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose }
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (ret) {
3b1aa479b377e570c6dff359a1f8099289a2af75Michal Židek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose talloc_zfree(tmp_ctx);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose return ret;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose}
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose/* =Add-Basic-User-NO-CHECKS============================================== */
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose
bf01e8179cbb2be476805340636098deda7e1366Sumit Boseint sysdb_add_basic_user(struct sss_domain_info *domain,
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose const char *name,
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose uid_t uid, gid_t gid,
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose const char *gecos,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher const char *homedir,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher const char *shell)
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher{
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct ldb_message *msg;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher int ret;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher TALLOC_CTX *tmp_ctx;
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher tmp_ctx = talloc_new(NULL);
6e9d7cbe43fdfc866b18f9ef0779bbfc10ad6f3aJakub Hrozek if (!tmp_ctx) {
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher return ENOMEM;
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
2ef62c64e7f07c8aced3f72850008ecb72860162Sumit Bose msg = ldb_msg_new(tmp_ctx);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose if (!msg) {
817b1bcafff27cc67630dd0cbd36df708c05fcccStephen Gallagher ret = ENOMEM;
64074e584a56611d7563667e0fcdadd215b0c922Yassir Elley goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher /* user dn */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina msg->dn = sysdb_user_dn(msg, domain, name);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!msg->dn) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ERROR_OUT(ret, ENOMEM, done);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS, SYSDB_USER_CLASS);
42c28b9424b6ef8a0021b124773e171dd5defaddJakub Hrozek if (ret) goto done;
df4e1db5d41c903ae57fd880acc76a0ad84aa7b2Pavel Březina
1319e71fd1680ca4864afe0b1aca2b8c8e4a1ee4Stef Walter ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (ret) goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
ae7247551b78a05a5397d3c790afad7ef51b0d9dPavel Březina ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_UIDNUM, (unsigned long)uid);
d4aa049726ce8c6feeaf6995d4abb4cb5155b9a1Pavel Březina if (ret) goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_GIDNUM, (unsigned long)gid);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) goto done;
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher /* We set gecos to be the same as fullname on user creation,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher * But we will not enforce coherency after that, it's up to
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher * admins to decide if they want to keep it in sync if they change
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher * one of the 2 */
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (gecos && *gecos) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_FULLNAME, gecos);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (ret) goto done;
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_GECOS, gecos);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek if (ret) goto done;
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce }
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek if (homedir && *homedir) {
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_HOMEDIR, homedir);
bc052ea17d858c19f9cb9c9e2bc602e754f68831Sumit Bose if (ret) goto done;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
0a55f903a1da319338fdcf147efa01ed22f9710dMichal Zidek
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce if (shell && *shell) {
22d381367c27910fe82f476a76b9f4ede555e35aLukas Slebodnik ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_SHELL, shell);
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik if (ret) goto done;
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos }
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina
de38d860e39585486e3ccbb42555196e319c7efdSumit Bose /* creation time */
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik (unsigned long)time(NULL));
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek if (ret) goto done;
75ba524d356fed615a9c92152f64aebf0bdaf9c2Simo Sorce
a5a3bbb0bbaeb8946c228c2fb7f0cf450595dd3ePavel Březina ret = ldb_add(domain->sysdb->ldb, msg);
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik ret = sysdb_error_to_errno(ret);
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnikdone:
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek if (ret) {
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
6d11fdcd8ef05000dd20b3431f8491790f99a802Lukas Slebodnik talloc_zfree(tmp_ctx);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return ret;
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik}
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnikstatic errno_t
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodniksysdb_remove_ghost_from_group(struct sss_domain_info *dom,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik struct ldb_message *group,
7d8b7d82f0a91ed656320577fc781f24a66db9f8Sumit Bose struct ldb_message_element *alias_el,
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek const char *name,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const char *orig_dn,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const char *userdn)
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek{
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta TALLOC_CTX *tmp_ctx;
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta struct ldb_message *msg;
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta struct ldb_message_element *orig_members;
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta bool add_member = false;
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta errno_t ret = EOK;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek int i;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek tmp_ctx = talloc_new(NULL);
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOENT;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek }
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek msg = ldb_msg_new(tmp_ctx);
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek if (!msg) {
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek ERROR_OUT(ret, ENOMEM, done);
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek msg->dn = group->dn;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek if (orig_dn == NULL) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek /* We have no way of telling which groups this user belongs to.
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek * Add it to all that reference it in the ghost attribute */
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek add_member = true;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek } else {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek add_member = false;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek orig_members = ldb_msg_find_element(group, SYSDB_ORIG_MEMBER);
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (orig_members) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek for (i = 0; i < orig_members->num_values; i++) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (strcmp((const char *) orig_members->values[i].data,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik orig_dn) == 0) {
fd98a28d6e94080e52bbedc789b06606a6019b10Lukas Slebodnik /* This is a direct member. Add the member attribute */
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik add_member = true;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek } else {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik /* Nothing to compare the originalDN with. Let's rely on the
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose * memberof plugin to do the right thing during initgroups..
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose add_member = true;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek if (add_member) {
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_MEMBER, userdn);
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek if (ret) goto done;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher }
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik ret = add_string(msg, LDB_FLAG_MOD_DELETE, SYSDB_GHOST, name);
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik if (ret) goto done;
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek /* Delete aliases from the ghost attribute as well */
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek for (i = 0; i < alias_el->num_values; i++) {
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek if (strcmp((const char *)alias_el->values[i].data, name) == 0) {
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik continue;
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt ret = ldb_msg_add_string(msg, SYSDB_GHOST,
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher (char *) alias_el->values[i].data);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret != LDB_SUCCESS) {
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek ERROR_OUT(ret, EINVAL, done);
65ce66c43141f7e5c8482a8f8e7e217a23791588Petr Cech }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher }
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik ret = sss_ldb_modify_permissive(dom->sysdb->ldb, msg);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = sysdb_error_to_errno(ret);
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose if (ret != EOK) {
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose goto done;
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek }
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose talloc_zfree(msg);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bosedone:
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik talloc_free(tmp_ctx);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik return ret;
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik}
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bosestatic errno_t
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bosesysdb_remove_ghostattr_from_groups(struct sss_domain_info *domain,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose const char *orig_dn,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct sysdb_attrs *attrs,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt const char *name)
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt{
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose TALLOC_CTX *tmp_ctx;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik struct ldb_message **groups;
9c88f837ffacf6548c13825589b327de1a5525f3Sumit Bose struct ldb_message_element *alias_el;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose struct ldb_dn *tmpdn;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik const char *group_attrs[] = {SYSDB_NAME, SYSDB_GHOST, SYSDB_ORIG_MEMBER, NULL};
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik const char *userdn;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose char *sanitized_name;
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek char *filter;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose errno_t ret = EOK;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose size_t group_count = 0;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose int i;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose tmp_ctx = talloc_new(NULL);
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose if (!tmp_ctx) {
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose return ENOENT;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose }
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose ret = sss_filter_sanitize(tmp_ctx, name, &sanitized_name);
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose if (ret != EOK) {
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose filter = talloc_asprintf(tmp_ctx, "(|(%s=%s)",
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose SYSDB_GHOST, sanitized_name);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (!filter) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = ENOMEM;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = sysdb_attrs_get_el(attrs, SYSDB_NAME_ALIAS, &alias_el);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret != EOK) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose for (i = 0; i < alias_el->num_values; i++) {
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose if (strcmp((const char *)alias_el->values[i].data, name) == 0) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose continue;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose filter = talloc_asprintf_append(filter, "(%s=%s)",
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose SYSDB_GHOST, alias_el->values[i].data);
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose if (filter == NULL) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = ENOMEM;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose goto done;
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose }
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose filter = talloc_asprintf_append(filter, ")");
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose if (filter == NULL) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = ENOMEM;
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose goto done;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina tmpdn = sysdb_user_dn(tmp_ctx, domain, name);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina if (!tmpdn) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina ERROR_OUT(ret, ENOMEM, done);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina }
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina userdn = ldb_dn_get_linearized(tmpdn);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina if (!userdn) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina ERROR_OUT(ret, EINVAL, done);
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina }
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina tmpdn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina SYSDB_TMPL_GROUP_BASE, domain->name);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina if (!tmpdn) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina ret = ENOMEM;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina goto done;
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina }
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina /* We need to find all groups that contain this object as a ghost user
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina * and replace the ghost user by actual member record in direct parents.
36e262020c80479baa09b2c4c8dd045c7a0f32a1Pavel Březina * Note that this object can be referred to either by its name or any
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina * of its aliases
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina */
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina ret = sysdb_search_entry(tmp_ctx, domain->sysdb, tmpdn, LDB_SCOPE_SUBTREE,
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina filter, group_attrs, &group_count, &groups);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina if (ret != EOK && ret != ENOENT) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina goto done;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina }
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek for (i = 0; i < group_count; i++) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek sysdb_remove_ghost_from_group(domain, groups[i], alias_el, name,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek orig_dn, userdn);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ret = EOK;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozekdone:
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek talloc_free(tmp_ctx);
6dcbfe52d5e64205c0d922f3e89add066b42c496Jakub Hrozek return ret;
6dcbfe52d5e64205c0d922f3e89add066b42c496Jakub Hrozek}
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozek
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozek/* =Add-User-Function===================================================== */
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozek
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozekint sysdb_add_user(struct sss_domain_info *domain,
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek const char *name,
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek uid_t uid, gid_t gid,
c23ea7772113a163139a7b7669303e9e80dc1d09Jakub Hrozek const char *gecos,
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek const char *homedir,
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek const char *shell,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek const char *orig_dn,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek struct sysdb_attrs *attrs,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek int cache_timeout,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek time_t now)
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek{
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek TALLOC_CTX *tmp_ctx;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek struct ldb_message *msg;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek struct sysdb_attrs *id_attrs;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek uint32_t id;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek int ret;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (domain->mpg) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (gid != 0) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek DEBUG(0, ("Cannot add user with arbitrary GID in MPG domain!\n"));
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek return EINVAL;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek gid = uid;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (domain->id_max != 0 && uid != 0 &&
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek (uid < domain->id_min || uid > domain->id_max)) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ("Supplied uid [%"SPRIuid"] is not in the allowed range "
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter "[%d-%d].\n", uid, domain->id_min, domain->id_max));
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return ERANGE;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (domain->id_max != 0 && gid != 0 &&
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter (gid < domain->id_min || gid > domain->id_max)) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter DEBUG(SSSDBG_OP_FAILURE,
769347ad4d35d43488eb98f980143495b0db415dStef Walter ("Supplied gid [%"SPRIgid"] is not in the allowed range "
769347ad4d35d43488eb98f980143495b0db415dStef Walter "[%d-%d].\n", gid, domain->id_min, domain->id_max));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ERANGE;
e07d700ed9daf0cf96607fa2d72978cb2431b794Pavel Březina }
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina tmp_ctx = talloc_new(NULL);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (!tmp_ctx) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return ENOMEM;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = ldb_transaction_start(domain->sysdb->ldb);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_error_to_errno(ret);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter talloc_free(tmp_ctx);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return ret;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (domain->mpg) {
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter /* In MPG domains you can't have groups with the same name as users,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter * search if a group with the same name exists.
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter * Don't worry about users, if we try to add a user with the same
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter * name the operation will fail */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_search_group_by_name(tmp_ctx, domain, name, NULL, &msg);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret != ENOENT) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret == EOK) ret = EEXIST;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter goto done;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* check no other user with the same uid exist */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (uid != 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_user_by_uid(tmp_ctx, domain, uid, NULL, &msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EOK) ret = EEXIST;
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos goto done;
769347ad4d35d43488eb98f980143495b0db415dStef Walter }
d2d8f342cd5e90bb9fd947c448492225f959aa86Pavel Březina }
d2d8f342cd5e90bb9fd947c448492225f959aa86Pavel Březina
d2d8f342cd5e90bb9fd947c448492225f959aa86Pavel Březina /* try to add the user */
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina ret = sysdb_add_basic_user(domain, name, uid, gid, gecos, homedir, shell);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik if (uid == 0) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_get_new_id(domain, &id);
e369fc08906383e6d5c39832f31bb6600a33f887Simo Sorce if (ret) goto done;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher id_attrs = sysdb_new_attrs(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!id_attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher }
8c3a4809b3420657289b42f028a1c9019b112991Stephen Gallagher ret = sysdb_attrs_add_uint32(id_attrs, SYSDB_UIDNUM, id);
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce if (ret) goto done;
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina if (domain->mpg) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(id_attrs, SYSDB_GIDNUM, id);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
f427b36b0cecc426856ab3f77a9c684ac355659dSumit Bose ret = sysdb_set_user_attr(domain, name, id_attrs, SYSDB_MOD_REP);
1a45124f3f300f9afdcb08eab0938e5e7d0534d9Sumit Bose goto done;
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs = sysdb_new_attrs(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!now) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher now = time(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
300c772767c1b12077cac1d148ac89738b058f97Jan Zeleny ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
bdc2aced1185c4ee36921fa01b8dc01789a63900Jakub Hrozek if (ret) goto done;
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce
bdc2aced1185c4ee36921fa01b8dc01789a63900Jakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
bdc2aced1185c4ee36921fa01b8dc01789a63900Jakub Hrozek ((cache_timeout) ?
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (now + cache_timeout) : 0));
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret) goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = sysdb_set_user_attr(domain, name, attrs, SYSDB_MOD_REP);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret) goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (domain->enumerate == false) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* If we're not enumerating, previous getgr{nam,gid} calls might
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * have stored ghost users into the cache, so we need to link them
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * with the newly-created user entry
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina */
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce ret = sysdb_remove_ghostattr_from_groups(domain, orig_dn, attrs,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik name);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret) goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekdone:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret == EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = ldb_transaction_commit(domain->sysdb->ldb);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sysdb_error_to_errno(ret);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek } else {
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ldb_transaction_cancel(domain->sysdb->ldb);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_zfree(tmp_ctx);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta return ret;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta}
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
b42b5d5aaf4da165582e73ad985fdff6e34e61e4Jakub Hrozek/* =Add-Basic-Group-NO-CHECKS============================================= */
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Boseint sysdb_add_basic_group(struct sss_domain_info *domain,
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose const char *name, gid_t gid)
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta{
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta struct ldb_message *msg;
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose int ret;
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce TALLOC_CTX *tmp_ctx;
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose tmp_ctx = talloc_new(NULL);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (!tmp_ctx) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta return ENOMEM;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose msg = ldb_msg_new(tmp_ctx);
d0d7de66c9494621c1bc12384e41e5e38a77fbebSumit Bose if (!msg) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose ret = ENOMEM;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose goto done;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose /* group dn */
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose msg->dn = sysdb_group_dn(msg, domain, name);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (!msg->dn) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose ERROR_OUT(ret, ENOMEM, done);
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS, SYSDB_GROUP_CLASS);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (ret) goto done;
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek if (ret) goto done;
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_GIDNUM, (unsigned long)gid);
772199031f0ec687fa1fefd939206858c440e5a1Pavel Březina if (ret) goto done;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek /* creation time */
590582be38cdbfde387fcc57df92903d48c5a083Jakub Hrozek ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina (unsigned long)time(NULL));
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (ret) goto done;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ldb_add(domain->sysdb->ldb, msg);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek ret = sysdb_error_to_errno(ret);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozekdone:
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek if (ret) {
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose talloc_zfree(tmp_ctx);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return ret;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose}
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek/* =Add-Group-Function==================================================== */
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozekint sysdb_add_group(struct sss_domain_info *domain,
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek const char *name, gid_t gid,
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce struct sysdb_attrs *attrs,
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce int cache_timeout,
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce time_t now)
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce TALLOC_CTX *tmp_ctx;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce struct ldb_message *msg;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce uint32_t id;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce int ret;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce bool posix;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce if (domain->id_max != 0 && gid != 0 &&
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce (gid < domain->id_min || gid > domain->id_max)) {
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce DEBUG(SSSDBG_OP_FAILURE,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ("Supplied gid [%"SPRIgid"] is not in the allowed range "
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce "[%d-%d].\n", gid, domain->id_min, domain->id_max));
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce return ERANGE;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce tmp_ctx = talloc_new(NULL);
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce if (!tmp_ctx) {
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce return ENOMEM;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_start(domain->sysdb->ldb);
376eaf187c13c2a1eaea0ffbdd970b6b563ab74cPetr Cech if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
0429e21a45aa26c133cb4d8285a60446a0611e44Pavel Březina }
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina
38b2bd97e41388995594126ea4e6b7c55ea0eb5cPavel Březina if (domain->mpg) {
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* In MPG domains you can't have groups with the same name as users,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * search if a group with the same name exists.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * Don't worry about users, if we try to add a user with the same
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * name the operation will fail */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sysdb_search_user_by_name(tmp_ctx, domain, name, NULL, &msg);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != ENOENT) {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina if (ret == EOK) ret = EEXIST;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* check no other groups with the same gid exist */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (gid != 0) {
a1bf79449204ce9a5392b9d09b953a6bdf53a122Pavel Březina ret = sysdb_search_group_by_gid(tmp_ctx, domain, gid, NULL, &msg);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != ENOENT) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret == EOK) ret = EEXIST;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher /* try to add the group */
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_add_basic_group(domain, name, gid);
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik if (ret) goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!attrs) {
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce attrs = sysdb_new_attrs(tmp_ctx);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek ret = sysdb_attrs_get_bool(attrs, SYSDB_POSIX, &posix);
52e0894fd65bff4715c88330eb62b28e1635228fStephen Gallagher if (ret == ENOENT) {
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher posix = true;
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, true);
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek if (ret) goto done;
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek } else if (ret != EOK) {
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
8a07521b413a3b5879f824e1872c5770c92ee5c0Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (posix && gid == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_get_new_id(domain, &id);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, id);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher if (!now) {
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher now = time(NULL);
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher }
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ((cache_timeout) ?
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (now + cache_timeout) : 0));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_group_attr(domain, name, attrs, SYSDB_MOD_REP);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidekdone:
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (ret == EOK) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek ret = ldb_transaction_commit(domain->sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek ldb_transaction_cancel(domain->sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik talloc_zfree(tmp_ctx);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt return ret;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek}
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidekint sysdb_add_incomplete_group(struct sss_domain_info *domain,
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce const char *name,
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik gid_t gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *original_dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *sid_str,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool posix,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher time_t now)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik TALLOC_CTX *tmp_ctx;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
a9eff330a7fbd231e8cc28a6828a1e5014ddb0d2Michal Zidek /* try to add the group */
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt ret = sysdb_add_basic_group(domain, name, gid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs = sysdb_new_attrs(tmp_ctx);
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto done;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (!now) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek now = time(NULL);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik now-1);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret) goto done;
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, posix);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (original_dn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_ORIG_DN, original_dn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (sid_str) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, sid_str);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret) goto done;
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_set_group_attr(domain, name, attrs, SYSDB_MOD_REP);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozekdone:
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
f1828234a850dd28465425248a83a993f262918fPavel Březina }
f1828234a850dd28465425248a83a993f262918fPavel Březina talloc_zfree(tmp_ctx);
f1828234a850dd28465425248a83a993f262918fPavel Březina return ret;
f1828234a850dd28465425248a83a993f262918fPavel Březina}
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik/* =Add-Or-Remove-Group-Memeber=========================================== */
f1828234a850dd28465425248a83a993f262918fPavel Březina
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay/* mod_op must be either SYSDB_MOD_ADD or SYSDB_MOD_DEL */
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guayint sysdb_mod_group_member(struct sss_domain_info *domain,
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay struct ldb_dn *member_dn,
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay struct ldb_dn *group_dn,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik int mod_op)
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik{
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay struct ldb_message *msg;
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek const char *dn;
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek int ret;
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek msg = ldb_msg_new(NULL);
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek if (!msg) {
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek ERROR_OUT(ret, ENOMEM, fail);
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek }
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek msg->dn = group_dn;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ldb_msg_add_empty(msg, SYSDB_MEMBER, mod_op, NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != LDB_SUCCESS) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ERROR_OUT(ret, ENOMEM, fail);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina dn = ldb_dn_get_linearized(member_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (!dn) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ERROR_OUT(ret, EINVAL, fail);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ldb_msg_add_string(msg, SYSDB_MEMBER, dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != LDB_SUCCESS) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ERROR_OUT(ret, EINVAL, fail);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina }
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina ret = ldb_modify(domain->sysdb->ldb, msg);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina ret = sysdb_error_to_errno(ret);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březinafail:
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina if (ret) {
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
e088912418fd4db750f2097dfde8ef9b77303f05Michal Židek }
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina talloc_zfree(msg);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina return ret;
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina}
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina/* =Add-Basic-Netgroup-NO-CHECKS============================================= */
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březinaint sysdb_add_basic_netgroup(struct sss_domain_info *domain,
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina const char *name, const char *description)
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina{
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina struct ldb_message *msg;
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina int ret;
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina msg = ldb_msg_new(NULL);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina if (!msg) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina return ENOMEM;
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina }
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek /* netgroup dn */
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina msg->dn = sysdb_netgroup_dn(msg, domain, name);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (!msg->dn) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina ERROR_OUT(ret, ENOMEM, done);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholasta ret = add_string(msg, LDB_FLAG_MOD_ADD,
558998ce664055a75595371118f818084d8f2b23Jan Cholasta SYSDB_OBJECTCLASS, SYSDB_NETGROUP_CLASS);
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta if (ret) goto done;
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholasta ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
558998ce664055a75595371118f818084d8f2b23Jan Cholasta if (ret) goto done;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (description && *description) {
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta ret = add_string(msg, LDB_FLAG_MOD_ADD,
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta SYSDB_DESCRIPTION, description);
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta if (ret) goto done;
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta }
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta /* creation time */
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt (unsigned long) time(NULL));
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret) goto done;
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholasta ret = ldb_add(domain->sysdb->ldb, msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
6e973aa578a692b2e7597811dfdfdb1a442c85f8Nikolai Kondrashov if (ret) {
62b20154899f847e760d6dfbae6a32fb45b448deLukas Slebodnik DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov }
6e973aa578a692b2e7597811dfdfdb1a442c85f8Nikolai Kondrashov talloc_zfree(msg);
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose return ret;
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose}
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose/* =Add-Netgroup-Function==================================================== */
f74d7744f1b12fe0492eadfc8cf30afcb4092e40Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_add_netgroup(struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *description,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik struct sysdb_attrs *attrs,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik char **missing,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik int cache_timeout,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher time_t now)
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik{
25c394fc9d09aa7f58700e67b942aba86505934aLukas Slebodnik TALLOC_CTX *tmp_ctx;
af820c9fc6aa1768e2e6b0df78fb489dbb1b28d0Pavel Březina int ret;
af820c9fc6aa1768e2e6b0df78fb489dbb1b28d0Pavel Březina
af820c9fc6aa1768e2e6b0df78fb489dbb1b28d0Pavel Březina tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_start(domain->sysdb->ldb);
f74d7744f1b12fe0492eadfc8cf30afcb4092e40Lukas Slebodnik if (ret) {
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = sysdb_error_to_errno(ret);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik talloc_free(tmp_ctx);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik return ret;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose /* try to add the netgroup */
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose ret = sysdb_add_basic_netgroup(domain, name, description);
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose if (ret && ret != EEXIST) goto done;
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik if (!attrs) {
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik attrs = sysdb_new_attrs(tmp_ctx);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (!attrs) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = ENOMEM;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce goto done;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (!now) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce now = time(NULL);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (ret) goto done;
1116fbbf0e50827841a6bafd80c027c3d3548c1fLukas Slebodnik
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ((cache_timeout) ?
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce (now + cache_timeout) : 0));
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (ret) goto done;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = sysdb_set_netgroup_attr(domain, name, attrs, SYSDB_MOD_REP);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik if (missing) {
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = sysdb_remove_attrs(domain, name,
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik SYSDB_MEMBER_NETGROUP,
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik missing);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik if (ret != EOK) {
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik DEBUG(SSSDBG_MINOR_FAILURE, ("Could not remove missing attributes\n"));
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik }
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik }
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnikdone:
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik if (ret == EOK) {
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik ret = ldb_transaction_commit(domain->sysdb->ldb);
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik ret = sysdb_error_to_errno(ret);
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik }
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik if (ret != EOK) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ldb_transaction_cancel(domain->sysdb->ldb);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce talloc_zfree(tmp_ctx);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce return ret;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce}
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce/* =Store-Users-(Native/Legacy)-(replaces-existing-data)================== */
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek/* if one of the basic attributes is empty ("") as opposed to NULL,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek * this will just remove it */
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozekint sysdb_store_user(struct sss_domain_info *domain,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *name,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *pwd,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek uid_t uid, gid_t gid,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *gecos,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *homedir,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *shell,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *orig_dn,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek struct sysdb_attrs *attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char **remove_attrs,
16c351625346b3193e1762027e5215ab76042127Sumit Bose uint64_t cache_timeout,
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek time_t now)
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek{
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek TALLOC_CTX *tmp_ctx;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek struct ldb_message *msg;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek int ret;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek errno_t sret = EOK;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek bool in_transaction = false;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek tmp_ctx = talloc_new(NULL);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (!tmp_ctx) {
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek return ENOMEM;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs = sysdb_new_attrs(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (pwd && (domain->legacy_passwords || !*pwd)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_PWD, pwd);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_transaction_start(domain->sysdb);
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to start transaction\n"));
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina goto fail;
5843ad321944a028f6dee7e1fd4f9381c4953d07Sumit Bose }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher in_transaction = true;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek ret = sysdb_search_user_by_name(tmp_ctx, domain, name, NULL, &msg);
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek if (ret && ret != ENOENT) {
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
22091abbe7b4a5667f62603dfd875e9ec6adf789Alexey Shabalin /* get transaction timestamp */
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik if (!now) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher now = time(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
c8b8901b05da9e31dba320f305ec20301e928cfbSumit Bose if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* users doesn't exist, turn into adding a user */
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_add_user(domain, name, uid, gid, gecos, homedir,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher shell, orig_dn, attrs, cache_timeout, now);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EEXIST) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* This may be a user rename. If there is a user with the
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * same UID, remove it and try to add the basic user again
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_delete_user(domain, NULL, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Not found by UID, return the original EEXIST,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * this may be a conflict in MPG domain or something
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * else */
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = EEXIST;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ("A user with the same UID [%llu] was removed from the "
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "cache\n", (unsigned long long) uid));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_add_user(domain, name, uid, gid, gecos, homedir,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher shell, orig_dn, attrs, cache_timeout, now);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Handle the result of sysdb_add_user */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_OP_FAILURE, ("Could not add user\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* the user exists, let's just replace attributes when set */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (uid) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_UIDNUM, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
22d381367c27910fe82f476a76b9f4ede555e35aLukas Slebodnik if (gid) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, gid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (uid && !gid && domain->mpg) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (gecos) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_GECOS, gecos);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (homedir) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_HOMEDIR, homedir);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (shell) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_SHELL, shell);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
e3c06950bdb0bee6df603b101b30b75ef38439a4Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ((cache_timeout) ?
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik (now + cache_timeout) : 0));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_user_attr(domain, name, attrs, SYSDB_MOD_REP);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
e3c06950bdb0bee6df603b101b30b75ef38439a4Lukas Slebodnik if (remove_attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_remove_attrs(domain, name,
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech SYSDB_MEMBER_USER,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher remove_attrs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(4, ("Could not remove missing attributes\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_transaction_commit(domain->sysdb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher in_transaction = false;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherfail:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (in_transaction) {
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce sret = sysdb_transaction_cancel(domain->sysdb);
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce if (sret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Store-Group-(Native/Legacy)-(replaces-existing-data)================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* this function does not check that all user members are actually present */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_store_group(struct sss_domain_info *domain,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid_t gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint64_t cache_timeout,
35872dc24058c5e8028cb4082fd405a27835dcd1Jakub Hrozek time_t now)
fcb8e3f1f49bb34c409d8dbd75889eb72be05517Jakub Hrozek{
fcb8e3f1f49bb34c409d8dbd75889eb72be05517Jakub Hrozek TALLOC_CTX *tmp_ctx;
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek static const char *src_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM,
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina SYSDB_ORIG_MODSTAMP, NULL };
9e6f8d1c66b4b3543bab67d807bd26f1d6256c75Pavel Březina struct ldb_message *msg;
676bf6dda60776d9db79dad1c2506c0e57bb5503Pavel Březina bool new_group = false;
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina int ret;
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce
fcb8e3f1f49bb34c409d8dbd75889eb72be05517Jakub Hrozek tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_group_by_name(tmp_ctx, domain, name, src_attrs, &msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret && ret != ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek }
c51f7a064b0d7ef86110bdeb6dc09fa6c08be7d3Jakub Hrozek if (ret == ENOENT) {
d12c95d840ed5de7f34e21002943c48e711a33f4Lukas Slebodnik new_group = true;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (!attrs) {
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina attrs = sysdb_new_attrs(tmp_ctx);
9e6f8d1c66b4b3543bab67d807bd26f1d6256c75Pavel Březina if (!attrs) {
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina ret = ENOMEM;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher goto done;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher /* get transaction timestamp */
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (!now) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher now = time(NULL);
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* FIXME: use the remote modification timestamp to know if the
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl * group needs any update */
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (new_group) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* group doesn't exist, turn into adding a group */
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl ret = sysdb_add_group(domain, name, gid, attrs, cache_timeout,
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl now);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EEXIST) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* This may be a group rename. If there is a group with the
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * same GID, remove it and try to add the basic group again
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik */
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl ret = sysdb_delete_group(domain, NULL, gid);
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Not found by GID, return the original EEXIST,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter * this may be a conflict in MPG domain or something
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter * else */
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter return EEXIST;
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter } else if (ret != EOK) {
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter goto done;
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter }
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter DEBUG(SSSDBG_MINOR_FAILURE,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter ("A group with the same GID [%llu] was removed from the "
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter "cache\n", (unsigned long long) gid));
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter ret = sysdb_add_group(domain, name, gid, attrs, cache_timeout,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter now);
fe60346714a73ac3987f786731389320633dd245Pavel Březina }
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina goto done;
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina }
fe60346714a73ac3987f786731389320633dd245Pavel Březina
fe60346714a73ac3987f786731389320633dd245Pavel Březina /* the group exists, let's just replace attributes when set */
fe60346714a73ac3987f786731389320633dd245Pavel Březina if (gid) {
fe60346714a73ac3987f786731389320633dd245Pavel Březina ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, gid);
fe60346714a73ac3987f786731389320633dd245Pavel Březina if (ret) goto done;
fe60346714a73ac3987f786731389320633dd245Pavel Březina }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
fe60346714a73ac3987f786731389320633dd245Pavel Březina ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (ret) goto done;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ((cache_timeout) ?
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek (now + cache_timeout) : 0));
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (ret) goto done;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnik ret = sysdb_set_group_attr(domain, name, attrs, SYSDB_MOD_REP);
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnik
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnikdone:
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnik if (ret) {
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher talloc_zfree(tmp_ctx);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher return ret;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher}
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher/* =Add-User-to-Group(Native/Legacy)====================================== */
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagherstatic int
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallaghersysdb_group_membership_mod(struct sss_domain_info *domain,
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher const char *group,
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher const char *member,
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher enum sysdb_member_type type,
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose int modify_op,
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose bool is_dn)
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose{
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose struct ldb_dn *group_dn;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose struct ldb_dn *member_dn;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose int ret;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose TALLOC_CTX *tmp_ctx = talloc_new(NULL);
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose if (!tmp_ctx) {
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose return ENOMEM;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose }
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose if (type == SYSDB_MEMBER_USER) {
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose member_dn = sysdb_user_dn(tmp_ctx, domain, member);
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech } else if (type == SYSDB_MEMBER_GROUP) {
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech member_dn = sysdb_group_dn(tmp_ctx, domain, member);
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose } else {
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose ret = EINVAL;
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina goto done;
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina }
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose if (!member_dn) {
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose ret = ENOMEM;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose goto done;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose }
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (!is_dn) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik group_dn = sysdb_group_dn(tmp_ctx, domain, group);
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce } else {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik group_dn = ldb_dn_new(tmp_ctx, domain->sysdb->ldb, group);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!group_dn) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_mod_group_member(domain, member_dn, group_dn, modify_op);
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
f232789430a080384188d5da89b19d874cf17513Jakub Hrozekdone:
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek talloc_free(tmp_ctx);
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek return ret;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek}
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březinaint sysdb_add_group_member(struct sss_domain_info *domain,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek const char *group,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek const char *member,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek enum sysdb_member_type type,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek bool is_dn)
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek{
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek return sysdb_group_membership_mod(domain, group, member, type,
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek SYSDB_MOD_ADD, is_dn);
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek}
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek/* =Remove-member-from-Group(Native/Legacy)=============================== */
22091abbe7b4a5667f62603dfd875e9ec6adf789Alexey Shabalin
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik
f232789430a080384188d5da89b19d874cf17513Jakub Hrozekint sysdb_remove_group_member(struct sss_domain_info *domain,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik const char *group,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek const char *member,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek enum sysdb_member_type type,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek bool is_dn)
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik{
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek return sysdb_group_membership_mod(domain, group, member, type,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek SYSDB_MOD_DEL, is_dn);
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek}
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter/* =Password-Caching====================================================== */
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walterint sysdb_cache_password(struct sss_domain_info *domain,
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech const char *username,
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter const char *password)
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter{
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter TALLOC_CTX *tmp_ctx;
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter struct sysdb_attrs *attrs;
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter char *hash = NULL;
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter char *salt;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter int ret;
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina tmp_ctx = talloc_new(NULL);
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina if (!tmp_ctx) {
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina return ENOMEM;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = s3crypt_gen_salt(tmp_ctx, &salt);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter DEBUG(4, ("Failed to generate random salt.\n"));
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter goto fail;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek ret = s3crypt_sha512(tmp_ctx, password, salt, &hash);
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek if (ret) {
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek DEBUG(4, ("Failed to create password hash.\n"));
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek goto fail;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
c440c424443517b12afa8d56f989d92ca6ba56a3Jakub Hrozek attrs = sysdb_new_attrs(tmp_ctx);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (!attrs) {
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek ERROR_OUT(ret, ENOMEM, fail);
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_CACHEDPWD, hash);
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina if (ret) goto fail;
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek /* FIXME: should we use a different attribute for chache passwords ?? */
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina ret = sysdb_attrs_add_long(attrs, "lastCachedPasswordChange",
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina (long)time(NULL));
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (ret) goto fail;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce ret = sysdb_attrs_add_uint32(attrs, SYSDB_FAILED_LOGIN_ATTEMPTS, 0U);
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina if (ret) goto fail;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina ret = sysdb_set_user_attr(domain, username, attrs, SYSDB_MOD_REP);
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina if (ret) {
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina goto fail;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina }
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina talloc_zfree(tmp_ctx);
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina return EOK;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březinafail:
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (ret) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek talloc_zfree(tmp_ctx);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return ret;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek}
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek/* =Custom Search================== */
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozekint sysdb_search_custom(TALLOC_CTX *mem_ctx,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek struct sss_domain_info *domain,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek const char *filter,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek const char *subtree_name,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek const char **attrs,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek size_t *msgs_count,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek struct ldb_message ***msgs)
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek{
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek struct ldb_dn *basedn;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek int ret;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (filter == NULL || subtree_name == NULL) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return EINVAL;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek basedn = sysdb_custom_subtree_dn(mem_ctx, domain, subtree_name);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (basedn == NULL) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek DEBUG(1, ("sysdb_custom_subtree_dn failed.\n"));
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return ENOMEM;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (!ldb_dn_validate(basedn)) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek DEBUG(1, ("Failed to create DN.\n"));
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return EINVAL;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = sysdb_search_entry(mem_ctx, domain->sysdb, basedn,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek LDB_SCOPE_SUBTREE, filter, attrs,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek msgs_count, msgs);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return ret;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek}
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozekint sysdb_search_custom_by_name(TALLOC_CTX *mem_ctx,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek struct sss_domain_info *domain,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek const char *object_name,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek const char *subtree_name,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek const char **attrs,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek size_t *_count,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek struct ldb_message ***_msgs)
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek{
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek TALLOC_CTX *tmp_ctx;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek struct ldb_dn *basedn;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek struct ldb_message **msgs;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek size_t count;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek int ret;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (object_name == NULL || subtree_name == NULL) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return EINVAL;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek tmp_ctx = talloc_new(NULL);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (!tmp_ctx) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return ENOMEM;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
ea422c7061072c125eb53b40d7f3ca444d886913Sumit Bose
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek basedn = sysdb_custom_dn(tmp_ctx, domain, object_name, subtree_name);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (basedn == NULL) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek DEBUG(1, ("sysdb_custom_dn failed.\n"));
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech ret = ENOMEM;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek goto done;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (!ldb_dn_validate(basedn)) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek DEBUG(1, ("Failed to create DN.\n"));
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = EINVAL;
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech goto done;
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek LDB_SCOPE_BASE, NULL, attrs, &count, &msgs);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (ret) {
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce goto done;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek if (count > 1) {
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek DEBUG(1, ("More than one result found.\n"));
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek ret = EFAULT;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek goto done;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek }
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek *_count = count;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek *_msgs = talloc_move(mem_ctx, &msgs);
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozekdone:
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek talloc_zfree(tmp_ctx);
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek return ret;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek}
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek/* =Custom Store (replaces-existing-data)================== */
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozekint sysdb_store_custom(struct sss_domain_info *domain,
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek const char *object_name,
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek const char *subtree_name,
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek struct sysdb_attrs *attrs)
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh{
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh TALLOC_CTX *tmp_ctx;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh const char *search_attrs[] = { "*", NULL };
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh size_t resp_count = 0;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh struct ldb_message **resp;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh struct ldb_message *msg;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh struct ldb_message_element *el;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh bool add_object = false;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce int ret;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce int i;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh if (object_name == NULL || subtree_name == NULL) {
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh return EINVAL;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh }
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = ldb_transaction_start(domain->sysdb->ldb);
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh if (ret) {
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh return sysdb_error_to_errno(ret);
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh }
25255e4d0e1517a5d443e8fee22e91862e255702Abhishek Singh
25255e4d0e1517a5d443e8fee22e91862e255702Abhishek Singh tmp_ctx = talloc_new(NULL);
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh if (!tmp_ctx) {
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh ret = ENOMEM;
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh goto done;
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh }
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha ret = sysdb_search_custom_by_name(tmp_ctx, domain,
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha object_name, subtree_name,
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha search_attrs, &resp_count, &resp);
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha if (ret != EOK && ret != ENOENT) {
9face844e3063b61ab19e1d82bbf3d9f9de76ac7Petr Cech goto done;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha }
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha if (ret == ENOENT) {
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha add_object = true;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha }
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha msg = ldb_msg_new(tmp_ctx);
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha if (msg == NULL) {
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce ret = ENOMEM;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha goto done;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha }
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha msg->dn = sysdb_custom_dn(tmp_ctx, domain, object_name, subtree_name);
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha if (!msg->dn) {
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha DEBUG(1, ("sysdb_custom_dn failed.\n"));
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha ret = ENOMEM;
bc052ea17d858c19f9cb9c9e2bc602e754f68831Sumit Bose goto done;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha }
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha msg->elements = talloc_array(msg, struct ldb_message_element, attrs->num);
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha if (!msg->elements) {
80b5dbe123ec94c5a8fcb99f9a4953c1513deb58Sumit Bose ret = ENOMEM;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha goto done;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha }
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha for (i = 0; i < attrs->num; i++) {
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha msg->elements[i] = attrs->a[i];
80b5dbe123ec94c5a8fcb99f9a4953c1513deb58Sumit Bose if (add_object) {
80b5dbe123ec94c5a8fcb99f9a4953c1513deb58Sumit Bose msg->elements[i].flags = LDB_FLAG_MOD_ADD;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha } else {
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha el = ldb_msg_find_element(resp[0], attrs->a[i].name);
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik if (el == NULL) {
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik msg->elements[i].flags = LDB_FLAG_MOD_ADD;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik } else {
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik }
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik }
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik }
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik msg->num_elements = attrs->num;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik
16c351625346b3193e1762027e5215ab76042127Sumit Bose if (add_object) {
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek ret = ldb_add(domain->sysdb->ldb, msg);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek } else {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ret = ldb_modify(domain->sysdb->ldb, msg);
d43c9d18fb263b1ea4071b20e93ce4994583f62fJakub Hrozek }
04868f1573f4b26ef34610b6d7069172f93bd8abJakub Hrozek if (ret != LDB_SUCCESS) {
04868f1573f4b26ef34610b6d7069172f93bd8abJakub Hrozek DEBUG(1, ("Failed to store custom entry: %s(%d)[%s]\n",
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ldb_strerror(ret), ret, ldb_errstring(domain->sysdb->ldb)));
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ret = sysdb_error_to_errno(ret);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek }
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekdone:
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (ret) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ldb_transaction_cancel(domain->sysdb->ldb);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek } else {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ret = ldb_transaction_commit(domain->sysdb->ldb);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_error_to_errno(ret);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik talloc_zfree(tmp_ctx);
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek return ret;
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek}
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek/* = Custom Delete======================================= */
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozekint sysdb_delete_custom(struct sss_domain_info *domain,
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek const char *object_name,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik const char *subtree_name)
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik{
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik TALLOC_CTX *tmp_ctx;
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek struct ldb_dn *dn;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek int ret;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek if (object_name == NULL || subtree_name == NULL) {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek return EINVAL;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek }
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek tmp_ctx = talloc_new(NULL);
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek if (!tmp_ctx) {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek return ENOMEM;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek }
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek dn = sysdb_custom_dn(tmp_ctx, domain, object_name, subtree_name);
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek if (dn == NULL) {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek DEBUG(1, ("sysdb_custom_dn failed.\n"));
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek ret = ENOMEM;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek goto done;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek }
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek ret = ldb_delete(domain->sysdb->ldb, dn);
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek switch (ret) {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek case LDB_SUCCESS:
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek case LDB_ERR_NO_SUCH_OBJECT:
e046ae03d0f55b1c8b0ec2fa6139bf86a3449adfPavel Březina ret = EOK;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose break;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose default:
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose DEBUG(1, ("LDB Error: %s(%d)\nError Message: [%s]\n",
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ldb_strerror(ret), ret, ldb_errstring(domain->sysdb->ldb)));
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ret = sysdb_error_to_errno(ret);
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik break;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose }
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose
f69f3581658351003a6d9245045e41d0efb85022Sumit Bosedone:
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose talloc_zfree(tmp_ctx);
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose return ret;
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose}
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose/* = ASQ search request ======================================== */
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose
f69f3581658351003a6d9245045e41d0efb85022Sumit Boseint sysdb_asq_search(TALLOC_CTX *mem_ctx,
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose struct sss_domain_info *domain,
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose struct ldb_dn *base_dn,
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose const char *expression,
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose const char *asq_attribute,
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose const char **attrs,
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose size_t *msgs_count,
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose struct ldb_message ***msgs)
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose{
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose TALLOC_CTX *tmp_ctx;
b5f61c9b3f5ea79bf319c18ff59394070c04d607Pavel Reichl struct ldb_request *ldb_req;
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik struct ldb_control **ctrl;
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik struct ldb_asq_control *asq_control;
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik struct ldb_result *res;
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose int ret;
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose tmp_ctx = talloc_new(NULL);
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose if (!tmp_ctx) {
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik return ENOMEM;
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose }
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek ctrl = talloc_array(tmp_ctx, struct ldb_control *, 2);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl if (ctrl == NULL) {
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl ret = ENOMEM;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl goto fail;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl }
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl ctrl[0] = talloc(ctrl, struct ldb_control);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl if (ctrl[0] == NULL) {
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik ret = ENOMEM;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik goto fail;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik }
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl ctrl[1] = NULL;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl ctrl[0]->oid = LDB_CONTROL_ASQ_OID;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl ctrl[0]->critical = 1;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl asq_control = talloc(ctrl[0], struct ldb_asq_control);
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl if (asq_control == NULL) {
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik ret = ENOMEM;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl goto fail;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl }
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl asq_control->request = 1;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl asq_control->source_attribute = talloc_strdup(asq_control, asq_attribute);
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek if (asq_control->source_attribute == NULL) {
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek ret = ENOMEM;
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek goto fail;
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek }
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek asq_control->src_attr_len = strlen(asq_control->source_attribute);
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek ctrl[0]->data = asq_control;
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek res = talloc_zero(tmp_ctx, struct ldb_result);
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek if (!res) {
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek ret = ENOMEM;
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek goto fail;
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek }
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek
e2e334b2f51118cb14c7391c4e4e44ff247ef638Pavel Reichl ret = ldb_build_search_req(&ldb_req, domain->sysdb->ldb, tmp_ctx,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl base_dn, LDB_SCOPE_BASE,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl expression, attrs, ctrl,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl res, ldb_search_default_callback, NULL);
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl if (ret != LDB_SUCCESS) {
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl ret = sysdb_error_to_errno(ret);
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl goto fail;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik }
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl ret = ldb_request(domain->sysdb->ldb, ldb_req);
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik if (ret == LDB_SUCCESS) {
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl ret = ldb_wait(ldb_req->handle, LDB_WAIT_ALL);
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl }
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek if (ret) {
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek ret = sysdb_error_to_errno(ret);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek goto fail;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek }
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik *msgs_count = res->count;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik *msgs = talloc_move(mem_ctx, &res->msgs);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek talloc_zfree(tmp_ctx);
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik return EOK;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnikfail:
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik if (ret == ENOENT) {
0352c371e743d8dae996123f658b5d32c677614eYassir Elley DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
0352c371e743d8dae996123f658b5d32c677614eYassir Elley }
0352c371e743d8dae996123f658b5d32c677614eYassir Elley else if (ret) {
0352c371e743d8dae996123f658b5d32c677614eYassir Elley DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
0352c371e743d8dae996123f658b5d32c677614eYassir Elley }
0352c371e743d8dae996123f658b5d32c677614eYassir Elley talloc_zfree(tmp_ctx);
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik return ret;
0352c371e743d8dae996123f658b5d32c677614eYassir Elley}
0352c371e743d8dae996123f658b5d32c677614eYassir Elley
0352c371e743d8dae996123f658b5d32c677614eYassir Elley/* =Search-Users-with-Custom-Filter====================================== */
0352c371e743d8dae996123f658b5d32c677614eYassir Elley
0352c371e743d8dae996123f658b5d32c677614eYassir Elleyint sysdb_search_users(TALLOC_CTX *mem_ctx,
0352c371e743d8dae996123f658b5d32c677614eYassir Elley struct sss_domain_info *domain,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek const char *sub_filter,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek const char **attrs,
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik size_t *msgs_count,
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik struct ldb_message ***msgs)
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik{
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik TALLOC_CTX *tmp_ctx;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek struct ldb_dn *basedn;
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek char *filter;
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek int ret;
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek tmp_ctx = talloc_new(NULL);
9e6f8d1c66b4b3543bab67d807bd26f1d6256c75Pavel Březina if (!tmp_ctx) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
7fe7073ad2c84946a699528a3bb79f7803c96b69Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose SYSDB_TMPL_USER_BASE, domain->name);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (!basedn) {
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech DEBUG(2, ("Failed to build base dn\n"));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto fail;
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek }
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_UC, sub_filter);
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek if (!filter) {
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek DEBUG(2, ("Failed to build filter\n"));
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek ret = ENOMEM;
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek goto fail;
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek }
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_TRACE_INTERNAL,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ("Search users with filter: %s\n", filter));
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek ret = sysdb_search_entry(mem_ctx, domain->sysdb, basedn,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose LDB_SCOPE_SUBTREE, filter, attrs,
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek msgs_count, msgs);
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek if (ret) {
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik goto fail;
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek }
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek talloc_zfree(tmp_ctx);
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek return EOK;
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozekfail:
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek if (ret == ENOENT) {
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL, ("No such entry\n"));
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek }
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek else if (ret) {
5c36e1f8901a4baff2b51d81d87c2b577f84fef6Lukas Slebodnik DEBUG(SSSDBG_MINOR_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek }
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek talloc_zfree(tmp_ctx);
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek return ret;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek}
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek/* =Delete-User-by-Name-OR-uid============================================ */
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozekint sysdb_delete_user(struct sss_domain_info *domain,
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina const char *name, uid_t uid)
676bf6dda60776d9db79dad1c2506c0e57bb5503Pavel Březina{
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce TALLOC_CTX *tmp_ctx;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek const char *attrs[] = {SYSDB_GHOST, NULL};
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek size_t msg_count;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek char *filter;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek struct ldb_message **msgs;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek struct ldb_message *msg;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek int ret;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek int i;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek char *sanitized_name;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek tmp_ctx = talloc_new(NULL);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek if (!tmp_ctx) {
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek return ENOMEM;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek }
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek if (name) {
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret = sysdb_search_user_by_name(tmp_ctx, domain, name, NULL, &msg);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek } else {
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret = sysdb_search_user_by_uid(tmp_ctx, domain, uid, NULL, &msg);
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek }
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek if (ret == EOK) {
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek if (name && uid) {
842f83f8db513214241a0fea076ac160b180e1ddLukas Slebodnik /* verify name/gid match */
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek const char *c_name;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek uint64_t c_uid;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek c_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek c_uid = ldb_msg_find_attr_as_uint64(msg, SYSDB_UIDNUM, 0);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (c_name == NULL || c_uid == 0) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek DEBUG(2, ("Attribute is missing but this should never happen!\n"));
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek ret = EFAULT;
3fe339bcba0e211cc666bb3afe34e5c8fce85f4fJakub Hrozek goto fail;
115de6d50f0d0bdd5745a5d8eb0d067be9128528Sumit Bose }
115de6d50f0d0bdd5745a5d8eb0d067be9128528Sumit Bose if (strcmp(name, c_name) || uid != c_uid) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek /* this is not the entry we are looking for */
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek ret = EINVAL;
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek goto fail;
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek }
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek }
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce ret = sysdb_delete_entry(domain->sysdb, msg->dn, false);
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek if (ret) {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina goto fail;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina } else if (ret == ENOENT && name != NULL) {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina /* Perhaps a ghost user? */
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina ret = sss_filter_sanitize(tmp_ctx, name, &sanitized_name);
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina if (ret != EOK) {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina goto fail;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina filter = talloc_asprintf(tmp_ctx, "(%s=%s)",
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina SYSDB_GHOST, sanitized_name);
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina if (filter == NULL) {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina ret = ENOMEM;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina goto fail;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina ret = sysdb_search_groups(tmp_ctx, domain, filter, attrs,
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina &msg_count, &msgs);
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina if (ret != EOK) {
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina goto fail;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina
770dc892f867639f36f84455d65be6287935a529Jakub Hrozek for (i = 0; i < msg_count; i++) {
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek msg = ldb_msg_new(tmp_ctx);
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek if (!msg) {
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek ERROR_OUT(ret, ENOMEM, fail);
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek }
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek msg->dn = msgs[i]->dn;
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_DELETE, SYSDB_GHOST, name);
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek if (ret) goto fail;
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek ret = ldb_modify(domain->sysdb->ldb, msg);
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek ret = sysdb_error_to_errno(ret);
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek if (ret != EOK) {
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek goto fail;
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek }
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
a524965fbe0551f1b3a68f1e5c7a5689a652998fSumit Bose talloc_zfree(msg);
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek }
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek } else {
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek goto fail;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek }
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek talloc_zfree(tmp_ctx);
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek return EOK;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozekfail:
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek talloc_zfree(tmp_ctx);
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek return ret;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek}
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek/* =Search-Groups-with-Custom-Filter===================================== */
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozekint sysdb_search_groups(TALLOC_CTX *mem_ctx,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek struct sss_domain_info *domain,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek const char *sub_filter,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek const char **attrs,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek size_t *msgs_count,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek struct ldb_message ***msgs)
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek{
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek TALLOC_CTX *tmp_ctx;
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek struct ldb_dn *basedn;
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek char *filter;
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek int ret;
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek tmp_ctx = talloc_new(NULL);
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech if (!tmp_ctx) {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech return ENOMEM;
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech }
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech SYSDB_TMPL_GROUP_BASE, domain->name);
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech if (!basedn) {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech DEBUG(2, ("Failed to build base dn\n"));
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech ret = ENOMEM;
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech goto fail;
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech }
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_GC, sub_filter);
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech if (!filter) {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech DEBUG(2, ("Failed to build filter\n"));
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose ret = ENOMEM;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose goto fail;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose DEBUG(SSSDBG_TRACE_INTERNAL,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose ("Search groups with filter: %s\n", filter));
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose ret = sysdb_search_entry(mem_ctx, domain->sysdb, basedn,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose LDB_SCOPE_SUBTREE, filter, attrs,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose msgs_count, msgs);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (ret) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose goto fail;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose talloc_zfree(tmp_ctx);
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina return EOK;
d43c9d18fb263b1ea4071b20e93ce4994583f62fJakub Hrozek
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březinafail:
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina if (ret == ENOENT) {
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina DEBUG(SSSDBG_TRACE_INTERNAL, ("No such entry\n"));
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina }
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina else if (ret) {
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina DEBUG(SSSDBG_MINOR_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina }
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina talloc_zfree(tmp_ctx);
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina return ret;
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina}
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina/* =Delete-Group-by-Name-OR-gid=========================================== */
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březinaint sysdb_delete_group(struct sss_domain_info *domain,
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *name, gid_t gid)
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose{
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose TALLOC_CTX *tmp_ctx;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose struct ldb_message *msg;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose int ret;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose tmp_ctx = talloc_new(NULL);
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose if (!tmp_ctx) {
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose return ENOMEM;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose }
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose if (name) {
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose ret = sysdb_search_group_by_name(tmp_ctx, domain, name, NULL, &msg);
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose } else {
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose ret = sysdb_search_group_by_gid(tmp_ctx, domain, gid, NULL, &msg);
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose }
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose if (ret) {
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose goto fail;
b1a822a16e3ef97e31d167f9e97efec06fc121dcJakub Hrozek }
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose if (name && gid) {
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose /* verify name/gid match */
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *c_name;
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose uint64_t c_gid;
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose c_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose c_gid = ldb_msg_find_attr_as_uint64(msg, SYSDB_GIDNUM, 0);
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose if (c_name == NULL || c_gid == 0) {
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose DEBUG(2, ("Attribute is missing but this should never happen!\n"));
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose ret = EFAULT;
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose goto fail;
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose }
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose if (strcmp(name, c_name) || gid != c_gid) {
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose /* this is not the entry we are looking for */
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose ret = EINVAL;
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek goto fail;
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek }
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek ret = sysdb_delete_entry(domain->sysdb, msg->dn, false);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if (ret) {
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek goto fail;
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek talloc_zfree(tmp_ctx);
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik return EOK;
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnikfail:
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik talloc_zfree(tmp_ctx);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek return ret;
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek}
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek/* =Search-Netgroups-with-Custom-Filter===================================== */
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozekint sysdb_search_netgroups(TALLOC_CTX *mem_ctx,
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek struct sss_domain_info *domain,
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek const char *sub_filter,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek const char **attrs,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek size_t *msgs_count,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek struct ldb_message ***msgs)
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek{
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik TALLOC_CTX *tmp_ctx;
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik struct ldb_dn *basedn;
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek char *filter;
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek int ret;
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina tmp_ctx = talloc_new(NULL);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina if (!tmp_ctx) {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina return ENOMEM;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina }
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina SYSDB_TMPL_NETGROUP_BASE, domain->name);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina if (!basedn) {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina DEBUG(2, ("Failed to build base dn\n"));
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ret = ENOMEM;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina goto fail;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina }
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_NC, sub_filter);
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce if (!filter) {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina DEBUG(2, ("Failed to build filter\n"));
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ret = ENOMEM;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina goto fail;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina }
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina DEBUG(6, ("Search netgroups with filter: %s\n", filter));
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina ret = sysdb_search_entry(mem_ctx, domain->sysdb, basedn,
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina LDB_SCOPE_SUBTREE, filter, attrs,
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina msgs_count, msgs);
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina if (ret) {
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina goto fail;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina }
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina talloc_zfree(tmp_ctx);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek return EOK;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozekfail:
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek if (ret == ENOENT) {
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Entry not found\n"));
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek } else {
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek }
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek talloc_zfree(tmp_ctx);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek return ret;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek}
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek/* =Delete-Netgroup-by-Name============================================== */
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozekint sysdb_delete_netgroup(struct sss_domain_info *domain,
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek const char *name)
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek{
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek TALLOC_CTX *tmp_ctx;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek struct ldb_message *msg;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek int ret;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek if (!name) return EINVAL;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek tmp_ctx = talloc_new(NULL);
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek if (!tmp_ctx) {
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek return ENOMEM;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek }
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek ret = sysdb_search_netgroup_by_name(tmp_ctx, domain, name, NULL, &msg);
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek if (ret != EOK && ret != ENOENT) {
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek DEBUG(6, ("sysdb_search_netgroup_by_name failed: %d (%s)\n",
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek ret, strerror(ret)));
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek goto done;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek } else if (ret == ENOENT) {
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek DEBUG(6, ("Netgroup does not exist, nothing to delete\n"));
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek ret = EOK;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek goto done;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek }
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek ret = sysdb_delete_entry(domain->sysdb, msg->dn, false);
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek if (ret != EOK) {
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech goto done;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech }
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cechdone:
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech if (ret != EOK) {
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech }
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech talloc_free(tmp_ctx);
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech return ret;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech}
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cechint sysdb_delete_by_sid(struct sysdb_ctx *sysdb,
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech struct sss_domain_info *domain,
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech const char *sid_str)
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech{
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech TALLOC_CTX *tmp_ctx;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech struct ldb_result *res;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech int ret;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek if (!sid_str) return EINVAL;
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek tmp_ctx = talloc_new(NULL);
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek if (!tmp_ctx) {
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek return ENOMEM;
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek }
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek ret = sysdb_search_object_by_sid(tmp_ctx, domain, sid_str, NULL, &res);
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek if (ret != EOK) {
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("search by sid failed: %d (%s)\n",
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek ret, strerror(ret)));
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek goto done;
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek }
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek if (res->count > 1) {
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek DEBUG(SSSDBG_FATAL_FAILURE, ("getbysid call returned more than one " \
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek "result !?!\n"));
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek ret = EIO;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek goto done;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek if (res->count == 0) {
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek /* No existing entry. Just quit. */
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek ret = EOK;
676bf6dda60776d9db79dad1c2506c0e57bb5503Pavel Březina goto done;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek ret = sysdb_delete_entry(sysdb, res->msgs[0]->dn, false);
bee2f31ca5d151b7fe35c509fe7eae24ca4f4451Lukas Slebodnik if (ret != EOK) {
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek goto done;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
64ea4127f463798410a2c20e0261c6b15f60257fJakub Hrozekdone:
323943605c88838f1f86a72f891eb28600bb34e2Lukas Slebodnik if (ret != EOK) {
db5f9ab3feb85aa444eab20428ca2b98801b6783Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
db5f9ab3feb85aa444eab20428ca2b98801b6783Jakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek talloc_free(tmp_ctx);
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek return ret;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek}
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
64ea4127f463798410a2c20e0261c6b15f60257fJakub Hrozek/* ========= Authentication against cached password ============ */
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozekerrno_t check_failed_login_attempts(struct confdb_ctx *cdb,
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik struct ldb_message *ldb_msg,
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek uint32_t *failed_login_attempts,
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik time_t *delayed_until)
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek{
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek int ret;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech int allowed_failed_login_attempts;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech int failed_login_delay;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech time_t last_failed_login;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech time_t end;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech TALLOC_CTX *tmp_ctx;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech tmp_ctx = talloc_new(NULL);
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech if (!tmp_ctx) {
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech return ENOMEM;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech }
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech *delayed_until = -1;
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech *failed_login_attempts = ldb_msg_find_attr_as_uint(ldb_msg,
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech SYSDB_FAILED_LOGIN_ATTEMPTS, 0);
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech last_failed_login = (time_t) ldb_msg_find_attr_as_int64(ldb_msg,
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech SYSDB_LAST_FAILED_LOGIN, 0);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek CONFDB_PAM_FAILED_LOGIN_ATTEMPTS,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek CONFDB_DEFAULT_PAM_FAILED_LOGIN_ATTEMPTS,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek &allowed_failed_login_attempts);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (ret != EOK) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek DEBUG(1, ("Failed to read the number of allowed failed login "
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek "attempts.\n"));
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = ERR_INTERNAL;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek goto done;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek CONFDB_PAM_FAILED_LOGIN_DELAY,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek CONFDB_DEFAULT_PAM_FAILED_LOGIN_DELAY,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek &failed_login_delay);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (ret != EOK) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek DEBUG(1, ("Failed to read the failed login delay.\n"));
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose ret = ERR_INTERNAL;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose goto done;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose }
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose DEBUG(9, ("Failed login attempts [%d], allowed failed login attempts [%d], "
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose "failed login delay [%d].\n", *failed_login_attempts,
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose allowed_failed_login_attempts, failed_login_delay));
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (allowed_failed_login_attempts) {
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (*failed_login_attempts >= allowed_failed_login_attempts) {
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (failed_login_delay) {
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose end = last_failed_login + (failed_login_delay * 60);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (end < time(NULL)) {
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose DEBUG(7, ("failed_login_delay has passed, "
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose "resetting failed_login_attempts.\n"));
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose *failed_login_attempts = 0;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose } else {
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose DEBUG(7, ("login delayed until %lld.\n", (long long) end));
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek *delayed_until = end;
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek ret = ERR_AUTH_DENIED;
71493344f59002272c2cc069daa3b6147e9cb0c3Lukas Slebodnik goto done;
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek }
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek } else {
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek DEBUG(4, ("Too many failed logins.\n"));
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek ret = ERR_AUTH_DENIED;
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek goto done;
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek }
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek }
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek }
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek ret = EOK;
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozekdone:
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek talloc_free(tmp_ctx);
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek return ret;
71493344f59002272c2cc069daa3b6147e9cb0c3Lukas Slebodnik}
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek
73ec8fdfddb2d4bf99977f758eec80e1b1ee8542Lukas Slebodnikint sysdb_cache_auth(struct sss_domain_info *domain,
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek const char *name,
71493344f59002272c2cc069daa3b6147e9cb0c3Lukas Slebodnik const char *password,
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek struct confdb_ctx *cdb,
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek bool just_check,
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina time_t *_expire_date,
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina time_t *_delayed_until)
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina{
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina TALLOC_CTX *tmp_ctx;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina const char *attrs[] = { SYSDB_NAME, SYSDB_CACHEDPWD, SYSDB_DISABLED,
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina SYSDB_LAST_LOGIN, SYSDB_LAST_ONLINE_AUTH,
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina "lastCachedPasswordChange",
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina "accountExpires", SYSDB_FAILED_LOGIN_ATTEMPTS,
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina SYSDB_LAST_FAILED_LOGIN, NULL };
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina struct ldb_message *ldb_msg;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina const char *userhash;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina char *comphash;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina uint64_t lastLogin = 0;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina int cred_expiration;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina uint32_t failed_login_attempts = 0;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina struct sysdb_attrs *update_attrs;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina bool authentication_successful = false;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl time_t expire_date = -1;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl time_t delayed_until = -1;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl int ret;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl if (name == NULL || *name == '\0') {
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl DEBUG(1, ("Missing user name.\n"));
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl return EINVAL;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl }
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl if (cdb == NULL) {
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl DEBUG(1, ("Missing config db context.\n"));
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl return EINVAL;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl }
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl if (domain->sysdb == NULL) {
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl DEBUG(1, ("Missing sysdb db context.\n"));
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl return EINVAL;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl }
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl if (!domain->cache_credentials) {
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl DEBUG(3, ("Cached credentials not available.\n"));
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl return EINVAL;
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl }
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl tmp_ctx = talloc_new(NULL);
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl if (!tmp_ctx) {
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl return ENOMEM;
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl }
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl ret = ldb_transaction_start(domain->sysdb->ldb);
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl if (ret) {
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl talloc_zfree(tmp_ctx);
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl ret = sysdb_error_to_errno(ret);
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl return ret;
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl }
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl ret = sysdb_search_user_by_name(tmp_ctx, domain, name, attrs, &ldb_msg);
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl if (ret != EOK) {
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl DEBUG(1, ("sysdb_search_user_by_name failed [%d][%s].\n",
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl ret, strerror(ret)));
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl if (ret == ENOENT) ret = ERR_ACCOUNT_UNKNOWN;
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl goto done;
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl }
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl /* Check offline_auth_cache_timeout */
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl lastLogin = ldb_msg_find_attr_as_uint64(ldb_msg,
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl SYSDB_LAST_ONLINE_AUTH,
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl 0);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina CONFDB_PAM_CRED_TIMEOUT, 0, &cred_expiration);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (ret != EOK) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina DEBUG(1, ("Failed to read expiration time of offline credentials.\n"));
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina DEBUG(9, ("Offline credentials expiration is [%d] days.\n",
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina cred_expiration));
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (cred_expiration) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina expire_date = lastLogin + (cred_expiration * 86400);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (expire_date < time(NULL)) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina DEBUG(4, ("Cached user entry is too old.\n"));
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina expire_date = 0;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ret = ERR_CACHED_CREDS_EXPIRED;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina } else {
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek expire_date = 0;
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek }
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek ret = check_failed_login_attempts(cdb, ldb_msg, &failed_login_attempts,
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek &delayed_until);
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek if (ret != EOK) {
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek DEBUG(1, ("Failed to check login attempts\n"));
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek goto done;
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek }
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek /* TODO: verify user account (disabled, expired ...) */
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek userhash = ldb_msg_find_attr_as_string(ldb_msg, SYSDB_CACHEDPWD, NULL);
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek if (userhash == NULL || *userhash == '\0') {
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek DEBUG(4, ("Cached credentials not available.\n"));
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek ret = ERR_NO_CACHED_CREDS;
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek goto done;
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek }
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek ret = s3crypt_sha512(tmp_ctx, password, userhash, &comphash);
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek if (ret) {
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose DEBUG(4, ("Failed to create password hash.\n"));
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose ret = ERR_INTERNAL;
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose goto done;
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose }
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose update_attrs = sysdb_new_attrs(tmp_ctx);
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose if (update_attrs == NULL) {
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose DEBUG(1, ("sysdb_new_attrs failed.\n"));
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose ret = ENOMEM;
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose goto done;
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose }
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose if (strcmp(userhash, comphash) == 0) {
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose /* TODO: probable good point for audit logging */
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose DEBUG(4, ("Hashes do match!\n"));
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose authentication_successful = true;
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek if (just_check) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina ret = sysdb_attrs_add_time_t(update_attrs,
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek SYSDB_LAST_LOGIN, time(NULL));
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek if (ret != EOK) {
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek DEBUG(3, ("sysdb_attrs_add_time_t failed, "
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek "but authentication is successful.\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EOK;
d2d21d45a88d0869f860e215c2cf946f032818caLukas Slebodnik goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher ret = sysdb_attrs_add_uint32(update_attrs,
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher SYSDB_FAILED_LOGIN_ATTEMPTS, 0U);
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher if (ret != EOK) {
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher DEBUG(3, ("sysdb_attrs_add_uint32 failed, "
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek "but authentication is successful.\n"));
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt ret = EOK;
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek goto done;
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek }
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov } else {
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov DEBUG(4, ("Authentication failed.\n"));
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio authentication_successful = false;
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek ret = sysdb_attrs_add_time_t(update_attrs,
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek SYSDB_LAST_FAILED_LOGIN,
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek time(NULL));
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek if (ret != EOK) {
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek DEBUG(3, ("sysdb_attrs_add_time_t failed\n."));
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek goto done;
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek }
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek ret = sysdb_attrs_add_uint32(update_attrs,
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek SYSDB_FAILED_LOGIN_ATTEMPTS,
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek ++failed_login_attempts);
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek if (ret != EOK) {
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek DEBUG(3, ("sysdb_attrs_add_uint32 failed.\n"));
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek goto done;
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek }
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek }
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio ret = sysdb_set_user_attr(domain, name, update_attrs,
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio LDB_FLAG_MOD_REPLACE);
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio if (ret) {
bc1e74e5f0f69d7ed9a7ad8455de59c979816431Lukas Slebodnik DEBUG(1, ("Failed to update Login attempt information!\n"));
9639cf410dd6ba9670748535811f061e0c475bc6Fabiano Fidêncio }
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozekdone:
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio if (_expire_date != NULL) {
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio *_expire_date = expire_date;
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio }
bc1e74e5f0f69d7ed9a7ad8455de59c979816431Lukas Slebodnik if (_delayed_until != NULL) {
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio *_delayed_until = delayed_until;
bae42db17f223e9ba7fa239d899414877d9d8eafJakub Hrozek }
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov if (ret) {
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio ldb_transaction_cancel(domain->sysdb->ldb);
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio } else {
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio ret = ldb_transaction_commit(domain->sysdb->ldb);
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio ret = sysdb_error_to_errno(ret);
6159c33125f8ee82e88d495ea2aa5d00018ea844Fabiano Fidêncio if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(2, ("Failed to commit transaction!\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (authentication_successful) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EOK) {
f1ac7d7859b26f0f36f5e8ffacda609f8ece80e5Stephen Gallagher ret = ERR_AUTH_FAILED;
f1ac7d7859b26f0f36f5e8ffacda609f8ece80e5Stephen Gallagher }
f128b7b865062da662127712935dcc58bd022384Stephen Gallagher }
cc7ee57f3adada83ac657e69636ca995d5b6948eStephen Gallagher talloc_free(tmp_ctx);
f128b7b865062da662127712935dcc58bd022384Stephen Gallagher return ret;
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce}
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce
3a4186ae40d0c3b7be46a4c973166f6048fcfe38Lukas Slebodnikstatic errno_t sysdb_update_members_ex(struct sss_domain_info *domain,
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce const char *member,
1171986bdc3011555c5b62a9d9ee9f7481f48cdcSimo Sorce enum sysdb_member_type type,
10eae23e2483733d4ca3c21f15b5bdb3f04c9839Simo Sorce const char *const *add_groups,
88e68607e474ab2ce46c562753ef2e988516d1e9Lukas Slebodnik const char *const *del_groups,
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce bool is_dn)
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt{
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt errno_t ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher errno_t sret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool in_transaction = false;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx = talloc_new(NULL);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if(!tmp_ctx) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer return ENOMEM;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer }
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer ret = sysdb_transaction_start(domain->sysdb);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (ret != EOK) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer DEBUG(0, ("Failed to start update transaction\n"));
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer goto done;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer }
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer in_transaction = true;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (add_groups) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer /* Add the user to all add_groups */
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer for (i = 0; add_groups[i]; i++) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer ret = sysdb_add_group_member(domain, add_groups[i],
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer member, type, is_dn);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (ret != EOK) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer DEBUG(1, ("Could not add member [%s] to group [%s]. "
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer "Skipping.\n", member, add_groups[i]));
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer /* Continue on, we should try to finish the rest */
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
bf6c3f07d653d474da9e43b2b7cced57fc4ea069Sumit Bose if (del_groups) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Remove the user from all del_groups */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; del_groups[i]; i++) {
2b7349575770521243a34611e97d73790946a961Stephen Gallagher ret = sysdb_remove_group_member(domain, del_groups[i],
e5698314b87e147c0223d0d8bcac206733dfae8cSumit Bose member, type, is_dn);
683e1f67d08be7165ea456d4594c4c8a4eddc9b3Lukas Slebodnik if (ret != EOK) {
683e1f67d08be7165ea456d4594c4c8a4eddc9b3Lukas Slebodnik DEBUG(1, ("Could not remove member [%s] from group [%s]. "
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Skipping\n", member, del_groups[i]));
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt /* Continue on, we should try to finish the rest */
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek }
d2d21d45a88d0869f860e215c2cf946f032818caLukas Slebodnik }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_transaction_commit(domain->sysdb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek goto done;
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek }
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek in_transaction = false;
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozekdone:
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek if (in_transaction) {
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek sret = sysdb_transaction_cancel(domain->sysdb);
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek if (sret != EOK) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek }
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek talloc_free(tmp_ctx);
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina return ret;
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina}
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozekerrno_t sysdb_update_members(struct sss_domain_info *domain,
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek const char *member,
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek enum sysdb_member_type type,
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek const char *const *add_groups,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek const char *const *del_groups)
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek{
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek return sysdb_update_members_ex(domain, member, type,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek add_groups, del_groups, false);
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek}
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozekerrno_t sysdb_update_members_dn(struct sss_domain_info *member_domain,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek const char *member,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt enum sysdb_member_type type,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt const char *const *add_groups,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek const char *const *del_groups)
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek{
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek return sysdb_update_members_ex(member_domain, member, type,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek add_groups, del_groups, true);
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek}
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghererrno_t sysdb_remove_attrs(struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher enum sysdb_member_type type,
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek char **remove_attrs)
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek{
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek errno_t ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher errno_t sret = EOK;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek bool in_transaction = false;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek struct ldb_message *msg;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek int lret;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek size_t i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg = ldb_msg_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!msg) return ENOMEM;
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik switch(type) {
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik case SYSDB_MEMBER_USER:
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik msg->dn = sysdb_user_dn(msg, domain, name);
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik break;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher case SYSDB_MEMBER_GROUP:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->dn = sysdb_group_dn(msg, domain, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case SYSDB_MEMBER_NETGROUP:
619bd403265ce0880989ba6f8324b010949851bcSumit Bose msg->dn = sysdb_netgroup_dn(msg, domain, name);
796463906a54e259bd5b582ce84af4297a58eafcStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case SYSDB_MEMBER_SERVICE:
ce35bb272d25926b8fa0f9450c8b74064f25c816Pavel Březina msg->dn = sysdb_svc_dn(domain->sysdb, msg, domain->name, name);
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina break;
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!msg->dn) {
f26c954658dfd7461f290f0b5d924951a6db219aJan Zeleny ret = ENOMEM;
f26c954658dfd7461f290f0b5d924951a6db219aJan Zeleny goto done;
755aee449c6311518200c2f11c1aae329a19b038Pavel Březina }
97ae45d61d921f07e812620e0156aee02b7b83a7Stephen Gallagher
f26c954658dfd7461f290f0b5d924951a6db219aJan Zeleny ret = sysdb_transaction_start(domain->sysdb);
d42d371c00c83ae44b9d1c3e88ecbe0e01b112e6Stephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to start transaction\n"));
619bd403265ce0880989ba6f8324b010949851bcSumit Bose goto done;
796463906a54e259bd5b582ce84af4297a58eafcStephen Gallagher }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
bad2fc8133d941e5a6c8d8016c9689e039265c61Lukas Slebodnik in_transaction = true;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; remove_attrs[i]; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* SYSDB_MEMBEROF is exclusively handled by the memberof plugin */
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher if (strcasecmp(remove_attrs[i], SYSDB_MEMBEROF) == 0) {
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher continue;
ae8d047122c7ba8123f72b2eac68944868ac37d4Stephen Gallagher }
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina DEBUG(8, ("Removing attribute [%s] from [%s]\n",
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek remove_attrs[i], name));
7b5e7e539ae9312ab55d75aa94feaad549b2a708Pavel Březina lret = ldb_msg_add_empty(msg, remove_attrs[i],
25ac7bda643c8872b5a29bc856c374e76a7f8363Pavel Březina LDB_FLAG_MOD_DELETE, NULL);
82a4f022ec1cbb9530ffa21d95474152b24acf50Pavel Březina if (lret != LDB_SUCCESS) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina ret = sysdb_error_to_errno(lret);
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik goto done;
a6dd4a6c55773e81490dcafd61d4b9782705e9bfPavel Březina }
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce /* We need to do individual modifies so that we can
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl * skip unknown attributes. Otherwise, any nonexistent
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl * attribute in the sysdb will cause other removals to
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik * fail.
3b1aa479b377e570c6dff359a1f8099289a2af75Michal Židek */
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl lret = ldb_modify(domain->sysdb->ldb, msg);
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl if (lret != LDB_SUCCESS && lret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
7fc27c7a3ccbb6aecb8cf4a4a5f91962028cb897Lukas Slebodnik ret = sysdb_error_to_errno(lret);
534c5427e5216d5d25f9b10925294e803ecf016fLukas Slebodnik goto done;
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik }
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl /* Remove this attribute and move on to the next one */
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl ldb_msg_remove_attr(msg, remove_attrs[i]);
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl }
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl ret = sysdb_transaction_commit(domain->sysdb);
13ec767e6ca3e435e119f1f07bda10eb213383f6Pavel Reichl if (ret != EOK) {
630f3ff08c1d17c7900b9bde814922f775ca2703Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
630f3ff08c1d17c7900b9bde814922f775ca2703Jakub Hrozek goto done;
630f3ff08c1d17c7900b9bde814922f775ca2703Jakub Hrozek }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher in_transaction = false;
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
0ca19d792b717456f334abdf35279acddf6d71c2Pavel Březina ret = EOK;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březinadone:
a13cf3d295a4a6654dfa7e4193c0a2bc8bb78e92Pavel Březina if (in_transaction) {
85feb8d77a2c832787880944e02104846c4d5376Pavel Březina sret = sysdb_transaction_cancel(domain->sysdb);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (sret != EOK) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher talloc_free(msg);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher return ret;
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher}
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallaghererrno_t sysdb_search_object_by_sid(TALLOC_CTX *mem_ctx,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher struct sss_domain_info *domain,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher const char *sid_str,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher const char **attrs,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher struct ldb_result **msg)
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher{
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher TALLOC_CTX *tmp_ctx;
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, SYSDB_GIDNUM,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher SYSDB_OBJECTCLASS, NULL };
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher struct ldb_dn *basedn;
3441d0c2d11aea0c39b009751a1898333c009674Stephen Gallagher int ret;
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik struct ldb_result *res = NULL;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek tmp_ctx = talloc_new(NULL);
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek if (!tmp_ctx) {
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek return ENOMEM;
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik }
3b1aa479b377e570c6dff359a1f8099289a2af75Michal Židek
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb, SYSDB_DOM_BASE, domain->name);
717008c8c3f29f3a1a77266cc72a6cfa616bf295Benjamin Franzke if (basedn == NULL) {
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik DEBUG(SSSDBG_OP_FAILURE, ("ldb_dn_new_fmt failed.\n"));
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik ret = ENOMEM;
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik goto done;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher }
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher basedn, LDB_SCOPE_SUBTREE, attrs?attrs:def_attrs,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher SYSDB_SID_FILTER, sid_str);
cc1c033c34b5f816b633d27a21aefbf811a7cf72Lukas Slebodnik if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_OP_FAILURE, ("ldb_search failed.\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (res->count > 1) {
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik DEBUG(SSSDBG_CRIT_FAILURE, ("Search for SID [%s] returned more than " \
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik "one object.\n", sid_str));
6261893e00bd14fdd192ffc9a1379cb9c647d326Lukas Slebodnik ret = EINVAL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
e92ecf948387d1687a5e772ac86e606b1b6af957Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher *msg = talloc_steal(mem_ctx, res);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, ("No such entry.\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else if (ret) {
04feeade1f6259368a6b23c6b3ecbad261161659Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher }
769347ad4d35d43488eb98f980143495b0db415dStef Walter
e07d700ed9daf0cf96607fa2d72978cb2431b794Pavel Březina talloc_zfree(tmp_ctx);
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher