sysdb_ops.c revision b01d8c856117f42f1a2c11669c9704166dc8f9ca
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 Gallagherstatic int sss_ldb_modify_permissive(struct ldb_context *ldb,
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek struct ldb_message *msg)
5377441d7a846461c2d9a7a870cea711360a529aNikolai Kondrashov{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_request *req;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret = EOK;
32381402a4a9afc003782c9e2301fc59c9bda2a9Yassir Elley
dbfc407eef1d9ba2469687c3ffbe7fd8bb111d94Jakub Hrozek ret = ldb_build_mod_req(&req, ldb, ldb,
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher msg,
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher NULL,
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek NULL,
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek ldb_op_default_callback,
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher NULL);
6dcbfe52d5e64205c0d922f3e89add066b42c496Jakub Hrozek
614545382c4ac75d85fb8c80917cc675bc0ec580Lukas Slebodnik if (ret != LDB_SUCCESS) return ret;
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_request_add_control(req, LDB_CONTROL_PERMISSIVE_MODIFY_OID,
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio false, NULL);
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio if (ret != LDB_SUCCESS) {
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio talloc_free(req);
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio return ret;
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio }
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio ret = ldb_request(ldb, req);
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio if (ret == LDB_SUCCESS) {
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio ret = ldb_wait(req->handle, LDB_WAIT_ALL);
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce talloc_free(req);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher return ret;
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek}
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek#define ERROR_OUT(v, r, l) do { v = r; goto l; } while(0)
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce/* =Remove-Entry-From-Sysdb=============================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_delete_entry(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool ignore_not_found)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
054b5d4bb98973698f74d66b14ccd14394b53f10Lukas Slebodnik
054b5d4bb98973698f74d66b14ccd14394b53f10Lukas Slebodnik ret = ldb_delete(sysdb->ldb, dn);
62bda5f75bda6b77aea30d708c74efaf725d9367Lukas Slebodnik switch (ret) {
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek case LDB_SUCCESS:
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case LDB_ERR_NO_SUCH_OBJECT:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ignore_not_found) {
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik return EOK;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* fall through */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher default:
558998ce664055a75595371118f818084d8f2b23Jan Cholasta DEBUG(1, ("LDB Error: %s(%d)\nError Message: [%s]\n",
558998ce664055a75595371118f818084d8f2b23Jan Cholasta ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb)));
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta return sysdb_error_to_errno(ret);
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta }
558998ce664055a75595371118f818084d8f2b23Jan Cholasta}
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
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)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *no_attrs[] = { NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny size_t msgs_count;
f1828234a850dd28465425248a83a993f262918fPavel Březina int ret;
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay int i;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina TALLOC_CTX *tmp_ctx;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina tmp_ctx = talloc_new(NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_start(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek }
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek ret = sysdb_search_entry(tmp_ctx, sysdb, dn,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina LDB_SCOPE_SUBTREE, "(distinguishedName=*)",
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina no_attrs, &msgs_count, &msgs);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ignore_not_found && ret == ENOENT) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (ret) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta DEBUG(6, ("Search error: %d (%s)\n", ret, strerror(ret)));
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek goto done;
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek }
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
19d3aba12c70528708be9440aca66038a291f29eYassir Elley DEBUG(9, ("Found [%d] items to delete.\n", msgs_count));
19d3aba12c70528708be9440aca66038a291f29eYassir Elley
19d3aba12c70528708be9440aca66038a291f29eYassir Elley qsort(msgs, msgs_count,
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek sizeof(struct ldb_message *), compare_ldb_dn_comp_num);
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek for (i = 0; i < msgs_count; i++) {
45726939a48e605b0166521f94300ae04981a3a7Sumit Bose DEBUG(9 ,("Trying to delete [%s].\n",
45726939a48e605b0166521f94300ae04981a3a7Sumit Bose ldb_dn_get_linearized(msgs[i]->dn)));
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek ret = sysdb_delete_entry(sysdb, msgs[i]->dn, false);
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek if (ret) {
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose goto done;
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose }
45726939a48e605b0166521f94300ae04981a3a7Sumit Bose }
5484044ea7bb632b915f706685fce509f6eacc48Jakub Hrozek
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorcedone:
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce if (ret == EOK) {
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce ret = ldb_transaction_commit(sysdb->ldb);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek ret = sysdb_error_to_errno(ret);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek } else {
614545382c4ac75d85fb8c80917cc675bc0ec580Lukas Slebodnik ldb_transaction_cancel(sysdb->ldb);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek }
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose}
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio/* =Search-Entry========================================================== */
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncioint sysdb_search_entry(TALLOC_CTX *mem_ctx,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *base_dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int scope,
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce const char *filter,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t *msgs_count,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message ***msgs)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_result *res;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_search(sysdb->ldb, mem_ctx, &res,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher base_dn, scope, attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter?"%s":NULL, filter);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher return sysdb_error_to_errno(ret);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
fe60346714a73ac3987f786731389320633dd245Pavel Březina *msgs_count = res->count;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose *msgs = talloc_steal(mem_ctx, res->msgs);
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter if (res->count == 0) {
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek return ENOENT;
e5e8252ec48bfdd4e7529debc705c8e090264b9aSumit Bose }
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher return EOK;
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina}
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek/* =Search-User-by-[UID/NAME]============================================= */
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozekint sysdb_search_user_by_name(TALLOC_CTX *mem_ctx,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek struct sysdb_ctx *sysdb,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek const char *name,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msg)
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek{
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek TALLOC_CTX *tmp_ctx;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, NULL };
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh struct ldb_message **msgs = NULL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct ldb_dn *basedn;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha size_t msgs_count = 0;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha int ret;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek tmp_ctx = talloc_new(NULL);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose if (!tmp_ctx) {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek return ENOMEM;
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose }
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek basedn = sysdb_user_dn(sysdb, tmp_ctx, name);
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek if (!basedn) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = ENOMEM;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek goto done;
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek }
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_BASE, NULL,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl attrs?attrs:def_attrs, &msgs_count, &msgs);
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl if (ret) {
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek goto done;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek }
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek *msg = talloc_steal(mem_ctx, msgs[0]);
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cechdone:
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (ret == ENOENT) {
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose }
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina else if (ret) {
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek talloc_zfree(tmp_ctx);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina return ret;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina}
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek
2b62d5a414b8b7dba4f714dc5033e28dc4b1f4feJakub Hrozekint sysdb_search_user_by_uid(TALLOC_CTX *mem_ctx,
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek struct sysdb_ctx *sysdb,
b590f44c06158485357d69cc5b24d5af05f1bb95Petr Cech uid_t uid,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek const char **attrs,
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose struct ldb_message **msg)
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek{
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek TALLOC_CTX *tmp_ctx;
b9d83e10cec267ae11fee64a30f42a12bbf7abe4Pavel Březina const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, NULL };
49c467733ca65c9b77b9c33f38cdc223a99562e1Pavel Reichl struct ldb_message **msgs = NULL;
62370340092503baeaf6587d7ffe4fe25bd9582dPavel Reichl struct ldb_dn *basedn;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina size_t msgs_count = 0;
583c1b9a052f4eb5ba046c5f2b7d2ed2a81b6d66Jakub Hrozek char *filter;
167b05b28d6b969230973646bee2f1c1f49205d2Sumit Bose int ret;
9a9b5e115b079751422be22fd252c0b283611c62Jakub Hrozek
a20fb9cbd5f42a6ca895aea1b84347fdfea34b89Sumit Bose tmp_ctx = talloc_new(NULL);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek if (!tmp_ctx) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek return ENOMEM;
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose }
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek SYSDB_TMPL_USER_BASE, sysdb->domain->name);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek if (!basedn) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek ret = ENOMEM;
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek goto done;
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek }
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek
8cfb42e1985550e99585d311f68087d414932806Jakub Hrozek filter = talloc_asprintf(tmp_ctx, SYSDB_PWUID_FILTER, (unsigned long)uid);
8cfb42e1985550e99585d311f68087d414932806Jakub Hrozek if (!filter) {
8cfb42e1985550e99585d311f68087d414932806Jakub Hrozek ret = ENOMEM;
8cfb42e1985550e99585d311f68087d414932806Jakub Hrozek goto done;
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek }
2b5518eeaacc6245cfa77ee4a7086f16208060fcJakub Hrozek
2b5518eeaacc6245cfa77ee4a7086f16208060fcJakub Hrozek /* Use SUBTREE scope here, not ONELEVEL
2b5518eeaacc6245cfa77ee4a7086f16208060fcJakub Hrozek * There is a bug in LDB that makes ONELEVEL searches extremely
2b5518eeaacc6245cfa77ee4a7086f16208060fcJakub Hrozek * slow (it ignores indexing)
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek */
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_SUBTREE, filter,
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik attrs?attrs:def_attrs, &msgs_count, &msgs);
99f8be128274eba264ea1434a7eb2800bced5902Lukas Slebodnik if (ret) {
99f8be128274eba264ea1434a7eb2800bced5902Lukas Slebodnik goto done;
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bose }
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bose
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech *msg = talloc_steal(mem_ctx, msgs[0]);
4117ae3230f6744c255b0309e86d519d7e41d2d7Lukas Slebodnik
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bosedone:
91d312000e6ded4a93327c137b10c5beda55f65cSumit Bose if (ret == ENOENT) {
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik }
b4e45531b3e98efce868d8a01ebd2dbe54348217Sumit Bose else if (ret) {
b4e45531b3e98efce868d8a01ebd2dbe54348217Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
b4e45531b3e98efce868d8a01ebd2dbe54348217Sumit Bose }
b4e45531b3e98efce868d8a01ebd2dbe54348217Sumit Bose
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek talloc_zfree(tmp_ctx);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek/* =Search-Group-by-[GID/NAME]============================================ */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_search_group_by_name(TALLOC_CTX *mem_ctx,
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek struct sysdb_ctx *sysdb,
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek const char *name,
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek const char **attrs,
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek struct ldb_message **msg)
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher{
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher TALLOC_CTX *tmp_ctx;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik static const char *def_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM, NULL };
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik struct ldb_message **msgs = NULL;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik struct ldb_dn *basedn;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik size_t msgs_count = 0;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik int ret;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik tmp_ctx = talloc_new(NULL);
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik if (!tmp_ctx) {
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik return ENOMEM;
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik }
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher basedn = sysdb_group_dn(sysdb, tmp_ctx, name);
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher if (!basedn) {
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_BASE, NULL,
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov attrs?attrs:def_attrs, &msgs_count, &msgs);
6ad1f2da4055e2cfe9bf8c79b79e408dba171691Lukas Slebodnik if (ret) {
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek if (ret == ENOENT) {
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik else if (ret) {
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik }
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik talloc_zfree(tmp_ctx);
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik return ret;
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik}
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozekint sysdb_search_group_by_gid(TALLOC_CTX *mem_ctx,
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek struct sysdb_ctx *sysdb,
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek gid_t gid,
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek const char **attrs,
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek struct ldb_message **msg)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t msgs_count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *filter;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose tmp_ctx = talloc_new(NULL);
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose if (!tmp_ctx) {
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose return ENOMEM;
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose }
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose if (!basedn) {
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose ret = ENOMEM;
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke goto done;
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke }
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke filter = talloc_asprintf(tmp_ctx, SYSDB_GRGID_FILTER, (unsigned long)gid);
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (!filter) {
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose ret = ENOMEM;
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose goto done;
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose }
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose /* Use SUBTREE scope here, not ONELEVEL
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose * There is a bug in LDB that makes ONELEVEL searches extremely
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher * slow (it ignores indexing)
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher */
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_SUBTREE, filter,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs?attrs:def_attrs, &msgs_count, &msgs);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (ret) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik goto done;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik *msg = talloc_steal(mem_ctx, msgs[0]);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnikdone:
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik if (ret == ENOENT) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik else if (ret) {
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik talloc_zfree(tmp_ctx);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Search-Group-by-Name============================================ */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagherint sysdb_search_netgroup_by_name(TALLOC_CTX *mem_ctx,
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher struct sysdb_ctx *sysdb,
15b266d9f14dad26da8678a79019749d0f69532eStephen Gallagher const char *name,
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik const char **attrs,
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik struct ldb_message **msg)
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher{
b97595ae059c69b1960a6e7e56d74660388a683bJan Zeleny TALLOC_CTX *tmp_ctx;
6a6a821866091e0f722808566c25b951aa346d7cStephen Gallagher static const char *def_attrs[] = { SYSDB_NAME, NULL };
48d7840cae22c5ff4d786149b0d8ecee7efb8306Lukas Slebodnik struct ldb_message **msgs = NULL;
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov struct ldb_dn *basedn;
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov size_t msgs_count = 0;
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov int ret;
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose tmp_ctx = talloc_new(NULL);
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik if (!tmp_ctx) {
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik return ENOMEM;
51d65c4ad15c2cc23f38fa09dd6efeb15e4f3e86Jakub Hrozek }
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik basedn = sysdb_netgroup_dn(sysdb, tmp_ctx, name);
51d65c4ad15c2cc23f38fa09dd6efeb15e4f3e86Jakub Hrozek if (!basedn) {
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashov ret = ENOMEM;
6ad1f2da4055e2cfe9bf8c79b79e408dba171691Lukas Slebodnik goto done;
7bb9ba8688ec1ca930d693eea05e936bc38f6d1bSumit Bose }
51d65c4ad15c2cc23f38fa09dd6efeb15e4f3e86Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_BASE, NULL,
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher attrs?attrs:def_attrs, &msgs_count, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
17f08cbd0f909181536b93d6c12c7cd69995f09eSumit Bose
1773fdad2730f3f910782781fa286f402ce36ccaLukas Slebodnikdone:
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov if (ret == ENOENT) {
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov }
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov else if (ret) {
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov }
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov talloc_zfree(tmp_ctx);
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose return ret;
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose}
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov/* =Replace-Attributes-On-Entry=========================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_set_entry_attr(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *entry_dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int mod_op)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int i, ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int lret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!entry_dn || attrs->num == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EINVAL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg = ldb_msg_new(tmp_ctx);
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Bose if (!msg) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher ret = ENOMEM;
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
a5bb518446d5ce565d7ba819590a009cabb0b0b4Jakub Hrozek msg->dn = entry_dn;
eaaeaa7e00c3d4bfa792cc4d3c6770dc1e28ef0cSumit Bose
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->elements = talloc_array(msg, struct ldb_message_element, attrs->num);
c42ca36247022490ad65a33c453cb5e43900dbe9Lukas Slebodnik if (!msg->elements) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < attrs->num; i++) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose msg->elements[i] = attrs->a[i];
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->elements[i].flags = mod_op;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
0ef783e186ef1c9f60e61a4e8e54c44cb366fdfePavel Březina
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek msg->num_elements = attrs->num;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik lret = ldb_modify(sysdb->ldb, msg);
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik if (lret != LDB_SUCCESS) {
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik DEBUG(SSSDBG_MINOR_FAILURE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ("ldb_modify failed: [%s]\n", ldb_strerror(lret)));
b3b6189850d50c656d62efbd498789124c033b00Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina ret = sysdb_error_to_errno(lret);
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
7cd226414c7bcdd32f05416df64ebda3ac869bd7Pavel Březinadone:
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina if (ret == ENOENT) {
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
66c8e92eb5a4985bb7f64c349a53b08030a000cfFabiano Fidêncio }
382a972a80ac571cdbf70d88571f6de49fe1cd23Nikolai Kondrashov else if (ret) {
7a2ca8d776df685bddbb64370181fb32d776f676Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
a79acee185654d110c0e35ba351368d664e4e53dPavel Březina }
12d771585a84a7523a5b7d9cf502d4bcddecb9b9Pavel Březina talloc_zfree(tmp_ctx);
0ae7e46a3990c47873fca879a9395e3ce00d9150Pavel Březina return ret;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina}
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina/* =Replace-Attributes-On-User============================================ */
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březinaint sysdb_set_user_attr(struct sysdb_ctx *sysdb,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina const char *name,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina struct sysdb_attrs *attrs,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina int mod_op)
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina{
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina struct ldb_dn *dn;
488518dde58724daa13b9216a0f1af6e0ba5401fPavel Březina TALLOC_CTX *tmp_ctx;
3be2628d8aba6aeb99ac1484da990f1fad8169ecPavel Březina errno_t ret;
2e13817e64ff1e0e47dc844be501f2d3ab299f34Pavel Březina
c2fc9459c31cb1192ab3c15ce4df1c150e99bf95Pavel Březina tmp_ctx = talloc_new(NULL);
6b159f14f69134bba8510a6b50ab62493a23a73fPavel Březina if (!tmp_ctx) {
53c31b83e4d06ea4c2813eec2f1e647a613b4a2bPavel Březina return ENOMEM;
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina }
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek dn = sysdb_user_dn(sysdb, tmp_ctx, name);
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek if (!dn) {
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek ret = ENOMEM;
205a0b9e9234327730fa808be95b2e1db7ffee95Jakub Hrozek goto done;
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek }
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
53c31b83e4d06ea4c2813eec2f1e647a613b4a2bPavel Březina talloc_zfree(tmp_ctx);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return ret;
769347ad4d35d43488eb98f980143495b0db415dStef Walter}
115de6d50f0d0bdd5745a5d8eb0d067be9128528Sumit Bose
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina/* =Replace-Attributes-On-Group=========================================== */
769347ad4d35d43488eb98f980143495b0db415dStef Walter
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březinaint sysdb_set_group_attr(struct sysdb_ctx *sysdb,
29dd456102dc995aa59a56483363087071bb84d6Nikolai Kondrashov const char *name,
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek struct sysdb_attrs *attrs,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina int mod_op)
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *dn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher errno_t ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina tmp_ctx = talloc_new(NULL);
aea1d5c0ca9bb1470759b024c8b97b6c1f577193Pavel Březina if (!tmp_ctx) {
d2d8f342cd5e90bb9fd947c448492225f959aa86Pavel Březina ret = ENOMEM;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina goto done;
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek dn = sysdb_group_dn(sysdb, tmp_ctx, name);
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek if (!dn) {
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek ret = ENOMEM;
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek goto done;
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březina ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březina if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
77d165f0629966db65753a3aee84a8b4971673afPavel Březina ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Replace-Attributes-On-Netgroup=========================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_set_netgroup_attr(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int mod_op)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim errno_t ret;
6499d0b915209b670f8e337c4fe76a8be9fa6576Simo Sorce struct ldb_dn *dn;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
4e0404ca1b19830dc0f729e59efd5bbd0a9d6103Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dn = sysdb_netgroup_dn(sysdb, tmp_ctx, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!dn) {
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Bose
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher/* =Get-New-ID============================================================ */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_get_new_id(struct sysdb_ctx *sysdb,
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek uint32_t *_id)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *attrs_1[] = { SYSDB_NEXTID, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *attrs_2[] = { SYSDB_UIDNUM, SYSDB_GIDNUM, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *base_dn;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek char *filter;
8f1316a0c677f211eaaa1346e21a03446b8c4fb1Lukas Slebodnik uint32_t new_id = 0;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose struct ldb_message **msgs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t count;
558ec7d717735bb16c210c675c2cc5bee1da4576Lukas Slebodnik struct ldb_message *msg;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t id;
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce int ret;
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter int i;
99b96048b79b0228c3f7c431ea12010f7bd5b362Nikolai Kondrashov
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain = sysdb->domain;
46e36286953de4e5af5e4289b90a529929bdd17cPetr Cech
a5a3bbb0bbaeb8946c228c2fb7f0cf450595dd3ePavel Březina tmp_ctx = talloc_new(NULL);
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik if (!tmp_ctx) {
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher base_dn = sysdb_domain_dn(sysdb, tmp_ctx);
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny if (!base_dn) {
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce talloc_zfree(tmp_ctx);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher return ENOMEM;
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta }
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos
701f13b5c8e27bcbfc79e77ce7c76d9f768a448cLukas Slebodnik ret = ldb_transaction_start(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
5f90993426fa2bdc3b3d994c9e85e0805bb92bbcSimo Sorce return ret;
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek }
7452f1b637276ce582b120f8f5482ae7f3b6bd47Jakub Hrozek
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce ret = sysdb_search_entry(tmp_ctx, sysdb, base_dn, LDB_SCOPE_BASE,
bc052ea17d858c19f9cb9c9e2bc602e754f68831Sumit Bose SYSDB_NEXTID_FILTER, attrs_1, &count, &msgs);
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina switch (ret) {
6499d0b915209b670f8e337c4fe76a8be9fa6576Simo Sorce case EOK:
8cfb42e1985550e99585d311f68087d414932806Jakub Hrozek new_id = get_attr_as_uint32(msgs[0], SYSDB_NEXTID);
9a9b5e115b079751422be22fd252c0b283611c62Jakub Hrozek if (new_id == (uint32_t)(-1)) {
ca90f2102a43a3d49a2ef26610d7b4ff3062a823Jakub Hrozek DEBUG(1, ("Invalid Next ID in domain %s\n", domain->name));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ERANGE;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (new_id < domain->id_min) {
e850be1ff2e13bba9812c94c3d102c0a0b570820Jakub Hrozek new_id = domain->id_min;
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek }
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina if ((domain->id_max != 0) && (new_id > domain->id_max)) {
66c8e92eb5a4985bb7f64c349a53b08030a000cfFabiano Fidêncio DEBUG(0, ("Failed to allocate new id, out of range (%u/%u)\n",
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina new_id, domain->id_max));
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina ret = ERANGE;
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher break;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina case ENOENT:
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina /* looks like the domain is not initialized yet, use min_id */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina new_id = domain->id_min;
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce break;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech default:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_zfree(msgs);
a8191ce7ad5364801ad9458c3194075a7ca77b8aPavel Březina count = 0;
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina
7f0b01bf0a8f5c5b3ef145e81511b6db2cb4f98fPavel Březina /* verify the id is actually really free.
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek * search all entries with id >= new_id and < max_id */
590582be38cdbfde387fcc57df92903d48c5a083Jakub Hrozek if (domain->id_max) {
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina filter = talloc_asprintf(tmp_ctx,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "(|(&(%s>=%u)(%s<=%u))(&(%s>=%u)(%s<=%u)))",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina SYSDB_UIDNUM, new_id,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina SYSDB_UIDNUM, domain->id_max,
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce SYSDB_GIDNUM, new_id,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce SYSDB_GIDNUM, domain->id_max);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce else {
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek filter = talloc_asprintf(tmp_ctx,
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek "(|(%s>=%u)(%s>=%u))",
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek SYSDB_UIDNUM, new_id,
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek SYSDB_GIDNUM, new_id);
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek }
1ec4198f38d34a1f82a2db55d8c9782a434fb55fJakub Hrozek if (!filter) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(6, ("Error: Out of memory\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
df4e1db5d41c903ae57fd880acc76a0ad84aa7b2Pavel Březina
364b3572bab5a9649e8f2d4da835d05d3c8ca7a9Pavel Březina ret = sysdb_search_entry(tmp_ctx, sysdb, base_dn, LDB_SCOPE_SUBTREE,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina filter, attrs_2, &count, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher switch (ret) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* if anything was found, find the maximum and increment past it */
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek case EOK:
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny for (i = 0; i < count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher id = get_attr_as_uint32(msgs[i], SYSDB_UIDNUM);
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher if (id != (uint32_t)(-1)) {
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta if (id > new_id) new_id = id;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher id = get_attr_as_uint32(msgs[i], SYSDB_GIDNUM);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (id != (uint32_t)(-1)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (id > new_id) new_id = id;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
376eaf187c13c2a1eaea0ffbdd970b6b563ab74cPetr Cech }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina new_id++;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* check again we are not falling out of range */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if ((domain->id_max != 0) && (new_id > domain->id_max)) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(0, ("Failed to allocate new id, out of range (%u/%u)\n",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina new_id, domain->id_max));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ERANGE;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
cc2d77d5218c188119fa954c856e858cbde76947Pavel Březina }
892ddeb5190dd5c1ffa26a95142a10a0034fc5e3Pavel Březina break;
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina case ENOENT:
50c2a57dea6d38a4f6753a917a5d745b07036325Pavel Březina break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
f9961e5f82e0ef474d6492371bfdf9e74e208a99Pavel Březina default:
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
c777f575b0ec0c48ce3b85ea2c5cc298db02450eJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
3441d0c2d11aea0c39b009751a1898333c009674Stephen Gallagher /* finally store the new next id */
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher msg = ldb_msg_new(tmp_ctx);
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek if (!msg) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(6, ("Error: Out of memory\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
cce3e8526176ce2fe9baa5bda1bb457b996b7bcfSumit Bose msg->dn = base_dn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
e9eeb4302e0e426c6cc1a4e65b95a6f7066e80b9Pavel Březina ret = add_ulong(msg, LDB_FLAG_MOD_REPLACE,
85feb8d77a2c832787880944e02104846c4d5376Pavel Březina SYSDB_NEXTID, new_id + 1);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher }
cdaa29d2c5724a4c72bfa0f42284ccfac3d5a464Pavel Reichl
ae8d047122c7ba8123f72b2eac68944868ac37d4Stephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
fae99bfe4bfc8b4a12e9c2a0ad01b3684c22f934Simo Sorce ret = sysdb_error_to_errno(ret);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek *_id = new_id;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
213ce2a78b1abe3921d8dc13c949a28130d00aecJan Zeleny if (ret == EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
38e2ec1c757955ab557fd95807afa58042d09482Jan Zeleny ret = sysdb_error_to_errno(ret);
ad07ed37b6b51ef134d4524edaf2259e19ac984fJan Zeleny } else {
1a853121ca2ba8ede6df429ee76942131ffb0f65Jan Zeleny ldb_transaction_cancel(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
81165faf5d951aca69f410713730c26ff048ec44Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
3a62a99faf8e12965100d0b26fc9e07752bd3e2dStephen Gallagher }
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta talloc_zfree(tmp_ctx);
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher return ret;
88275cccddf39892e01682b39b02292eb74729bdPavel Březina}
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio/* =Add-Basic-User-NO-CHECKS============================================== */
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaint sysdb_add_basic_user(struct sysdb_ctx *sysdb,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uid_t uid, gid_t gid,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *gecos,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *homedir,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *shell)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ldb_message *msg;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
e07d700ed9daf0cf96607fa2d72978cb2431b794Pavel Březina TALLOC_CTX *tmp_ctx;
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta }
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher msg = ldb_msg_new(tmp_ctx);
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher if (!msg) {
3f32406640d89face5e79244b4d8dab34adb6c7cPavel Březina ret = ENOMEM;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina goto done;
b1a822a16e3ef97e31d167f9e97efec06fc121dcJakub Hrozek }
d43c9d18fb263b1ea4071b20e93ce4994583f62fJakub Hrozek
077f8c9ca849ec895da3f0a25d15484ead08e99eLukas Slebodnik /* user dn */
3e5e98aae4b14f5447c561ff5b0d854b74046312Pavel Březina msg->dn = sysdb_user_dn(sysdb, msg, name);
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina if (!msg->dn) {
bf6c3f07d653d474da9e43b2b7cced57fc4ea069Sumit Bose ERROR_OUT(ret, ENOMEM, done);
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose }
e293fba4f5459f3c2dad254dcc966407d8fc3312Jakub Hrozek
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS, SYSDB_USER_CLASS);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret) goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer if (ret) goto done;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_UIDNUM, (unsigned long)uid);
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose if (ret) goto done;
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik
284937e6b5b0c9d7a1d3382d0d2820d1168842fbPavel Březina ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_GIDNUM, (unsigned long)gid);
aea1d5c0ca9bb1470759b024c8b97b6c1f577193Pavel Březina if (ret) goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina /* We set gecos to be the same as fullname on user creation,
53f1b03f4e61ebe21df0c2fd05e09e0504fd8881Jakub Hrozek * But we will not enforce coherency after that, it's up to
3996e391054a1c02ab62e1541ae21a8204bd5d0aAmitKumar * admins to decide if they want to keep it in sync if they change
3996e391054a1c02ab62e1541ae21a8204bd5d0aAmitKumar * one of the 2 */
3996e391054a1c02ab62e1541ae21a8204bd5d0aAmitKumar if (gecos && *gecos) {
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_FULLNAME, gecos);
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_GECOS, gecos);
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek if (ret) goto done;
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce }
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek if (homedir && *homedir) {
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_HOMEDIR, homedir);
374bf54785365273b20690bd3792c25a44738041Pavel Březina if (ret) goto done;
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher }
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (shell && *shell) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_SHELL, shell);
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher if (ret) goto done;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina }
2d5d7761ef2b0d43c39dadf877b87aae19231036Lukas Slebodnik
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina /* creation time */
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik (unsigned long)time(NULL));
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik if (ret) goto done;
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek ret = ldb_add(sysdb->ldb, msg);
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek ret = sysdb_error_to_errno(ret);
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagherdone:
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher talloc_zfree(tmp_ctx);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return ret;
11e8f3ecdddf8edd8b1bbe9f41b49ce8b709b92aPetr Cech}
11e8f3ecdddf8edd8b1bbe9f41b49ce8b709b92aPetr Cech
11e8f3ecdddf8edd8b1bbe9f41b49ce8b709b92aPetr Cech
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt/* =Add-User-Function===================================================== */
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagherint sysdb_add_user(struct sysdb_ctx *sysdb,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher const char *name,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher uid_t uid, gid_t gid,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher const char *gecos,
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher const char *homedir,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik const char *shell,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik const char *orig_dn,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik struct sysdb_attrs *attrs,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik int cache_timeout,
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik time_t now)
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik{
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher TALLOC_CTX *tmp_ctx;
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher struct ldb_message *msg;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik struct ldb_message **groups;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik struct ldb_message_element *alias_el;
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik struct ldb_message_element *orig_members;
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik size_t group_count = 0;
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik struct sysdb_attrs *id_attrs;
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik const char *group_attrs[] = {SYSDB_NAME, SYSDB_GHOST, SYSDB_ORIG_MEMBER, NULL};
69b46c32357ccf1aab9c0bd6d1afa33a8724ad77Lukas Slebodnik struct ldb_dn *tmpdn;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik const char *userdn;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik char *filter;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik uint32_t id;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik int ret, i, j;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik bool add_member = false;
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce struct sss_domain_info *domain = sysdb->domain;
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce
b3a22ee1d91aa4ed1544475be16ec2b7cf886180Jakub Hrozek if (sysdb->mpg) {
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce if (gid != 0) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik DEBUG(0, ("Cannot add user with arbitrary GID in MPG domain!\n"));
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik return EINVAL;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose gid = uid;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if (domain->id_max != 0 && uid != 0 &&
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose (uid < domain->id_min || uid > domain->id_max)) {
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose DEBUG(2, ("Supplied uid [%d] is not in the allowed range [%d-%d].\n",
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose uid, domain->id_min, domain->id_max));
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose return ERANGE;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (domain->id_max != 0 && gid != 0 &&
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik (gid < domain->id_min || gid > domain->id_max)) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik DEBUG(2, ("Supplied gid [%d] is not in the allowed range [%d-%d].\n",
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik gid, domain->id_min, domain->id_max));
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce return ERANGE;
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce }
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce
b3a22ee1d91aa4ed1544475be16ec2b7cf886180Jakub Hrozek tmp_ctx = talloc_new(NULL);
625bb2ddf15e8f305a53afa44e87f2146fa930afSimo Sorce if (!tmp_ctx) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik return ENOMEM;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose ret = ldb_transaction_start(sysdb->ldb);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if (ret) {
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose ret = sysdb_error_to_errno(ret);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose talloc_free(tmp_ctx);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose return ret;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if (sysdb->mpg) {
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose /* In MPG domains you can't have groups with the same name as users,
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose * search if a group with the same name exists.
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik * Don't worry about users, if we try to add a user with the same
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik * name the operation will fail */
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = sysdb_search_group_by_name(tmp_ctx, sysdb,
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik name, NULL, &msg);
3b1aa479b377e570c6dff359a1f8099289a2af75Michal Židek if (ret != ENOENT) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (ret == EOK) ret = EEXIST;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik goto done;
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik }
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik }
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik /* check no other user with the same uid exist */
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (uid != 0) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik ret = sysdb_search_user_by_uid(tmp_ctx, sysdb,
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik uid, NULL, &msg);
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (ret != ENOENT) {
25d4435998d0446f7699e7ab0874c7a6f610ab58Lukas Slebodnik if (ret == EOK) ret = EEXIST;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose goto done;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose }
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose }
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose /* try to add the user */
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose ret = sysdb_add_basic_user(sysdb, name, uid, gid, gecos, homedir, shell);
3b1aa479b377e570c6dff359a1f8099289a2af75Michal Židek if (ret) goto done;
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (uid == 0) {
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose ret = sysdb_get_new_id(sysdb, &id);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose if (ret) goto done;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose id_attrs = sysdb_new_attrs(tmp_ctx);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (!id_attrs) {
b341ee51cffd98b642b9c68a417f8a7504e303a1Sumit Bose ret = ENOMEM;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose goto done;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose }
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose ret = sysdb_attrs_add_uint32(id_attrs, SYSDB_UIDNUM, id);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose if (ret) goto done;
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher if (sysdb->mpg) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_attrs_add_uint32(id_attrs, SYSDB_GIDNUM, id);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_set_user_attr(sysdb, name, id_attrs, SYSDB_MOD_REP);
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
6e9d7cbe43fdfc866b18f9ef0779bbfc10ad6f3aJakub Hrozek
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher if (!attrs) {
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek attrs = sysdb_new_attrs(tmp_ctx);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (!attrs) {
2ef62c64e7f07c8aced3f72850008ecb72860162Sumit Bose ret = ENOMEM;
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose goto done;
817b1bcafff27cc67630dd0cbd36df708c05fcccStephen Gallagher }
64074e584a56611d7563667e0fcdadd215b0c922Yassir Elley }
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (!now) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher now = time(NULL);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ((cache_timeout) ?
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina (now + cache_timeout) : 0));
42c28b9424b6ef8a0021b124773e171dd5defaddJakub Hrozek if (ret) goto done;
df4e1db5d41c903ae57fd880acc76a0ad84aa7b2Pavel Březina
1319e71fd1680ca4864afe0b1aca2b8c8e4a1ee4Stef Walter ret = sysdb_set_user_attr(sysdb, name, attrs, SYSDB_MOD_REP);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (ret) goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
ae7247551b78a05a5397d3c790afad7ef51b0d9dPavel Březina /* remove all ghost users */
d4aa049726ce8c6feeaf6995d4abb4cb5155b9a1Pavel Březina filter = talloc_asprintf(tmp_ctx, "(|(%s=%s)", SYSDB_GHOST, name);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (!filter) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = ENOMEM;
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter ret = sysdb_attrs_get_el(attrs, SYSDB_NAME_ALIAS, &alias_el);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret != EOK) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher for (i = 0; i < alias_el->num_values; i++) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (strcmp((const char *)alias_el->values[i].data, name) == 0) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher continue;
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny }
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek filter = talloc_asprintf_append(filter, "(%s=%s)",
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce SYSDB_GHOST, alias_el->values[i].data);
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny if (filter == NULL) {
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek ret = ENOMEM;
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce goto done;
bc052ea17d858c19f9cb9c9e2bc602e754f68831Sumit Bose }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
0a55f903a1da319338fdcf147efa01ed22f9710dMichal Zidek
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce filter = talloc_asprintf_append(filter, ")");
22d381367c27910fe82f476a76b9f4ede555e35aLukas Slebodnik if (filter == NULL) {
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik ret = ENOMEM;
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos goto done;
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina }
de38d860e39585486e3ccbb42555196e319c7efdSumit Bose
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik tmpdn = sysdb_user_dn(sysdb, tmp_ctx, name);
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik if (!tmpdn) {
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek ERROR_OUT(ret, ENOMEM, done);
75ba524d356fed615a9c92152f64aebf0bdaf9c2Simo Sorce }
a5a3bbb0bbaeb8946c228c2fb7f0cf450595dd3ePavel Březina
5b93634c7f0e34f69b4cf8fb9b2e77b9179024a7Fabiano Fidêncio userdn = ldb_dn_get_linearized(tmpdn);
5b93634c7f0e34f69b4cf8fb9b2e77b9179024a7Fabiano Fidêncio if (!userdn) {
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik ERROR_OUT(ret, EINVAL, done);
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik }
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek tmpdn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!tmpdn) {
6d11fdcd8ef05000dd20b3431f8491790f99a802Lukas Slebodnik ret = ENOMEM;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher goto done;
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik }
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik /* We need to find all groups that contain this object as a ghost user
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik * and replace the ghost user by actual member record in direct parents.
5a05b6127064c74349f1edae32e5e13032c386feLukas Slebodnik * Note that this object can be referred to either by its name or any
7d8b7d82f0a91ed656320577fc781f24a66db9f8Sumit Bose * of its aliases
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_search_entry(tmp_ctx, sysdb, tmpdn, LDB_SCOPE_SUBTREE, filter,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek group_attrs, &group_count, &groups);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (ret != EOK && ret != ENOENT) {
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta goto done;
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta }
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta for (i = 0; i < group_count; i++) {
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta msg = ldb_msg_new(tmp_ctx);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (!msg) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ERROR_OUT(ret, ENOMEM, done);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->dn = groups[i]->dn;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek if (orig_dn == NULL) {
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek /* We have no way of telling which groups this user belongs to.
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek * Add it to all that reference it in the ghost attribute */
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek add_member = true;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek } else {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek add_member = false;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek orig_members = ldb_msg_find_element(groups[i], SYSDB_ORIG_MEMBER);
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (orig_members) {
1e0fa55fb377db788e065de917ba8e149eb56161Jakub Hrozek for (j = 0; j < orig_members->num_values; j++) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (strcmp((const char *) orig_members->values[j].data,
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek orig_dn) == 0) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek /* This is a direct member. Add the member attribute */
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek add_member = true;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek } else {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek /* Nothing to compare the originalDN with. Let's rely on the
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek * memberof plugin to do the right thing during initgroups..
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik */
fd98a28d6e94080e52bbedc789b06606a6019b10Lukas Slebodnik add_member = true;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (add_member) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_MEMBER, userdn);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret) goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_DELETE, SYSDB_GHOST, name);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret) goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek /* Delete aliases from the ghost attribute as well */
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek for (j = 0; j < alias_el->num_values; j++) {
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher if (strcmp((const char *)alias_el->values[j].data, name) == 0) {
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek continue;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher }
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik ret = ldb_msg_add_string(msg, SYSDB_GHOST,
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik (char *) alias_el->values[j].data);
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik if (ret != LDB_SUCCESS) {
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik ERROR_OUT(ret, EINVAL, done);
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek }
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek }
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek
de5fa34860886ad68fba5e739987e16c342e8f14Lukas Slebodnik ret = sss_ldb_modify_permissive(sysdb->ldb, msg);
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek ret = sysdb_error_to_errno(ret);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret != EOK) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher goto done;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek
65ce66c43141f7e5c8482a8f8e7e217a23791588Petr Cech talloc_zfree(msg);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher }
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = EOK;
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnikdone:
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose if (ret == EOK) {
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose ret = ldb_transaction_commit(sysdb->ldb);
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek ret = sysdb_error_to_errno(ret);
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek } else {
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ldb_transaction_cancel(sysdb->ldb);
c377d4d604f1e7b35c484711f1084b7a761772b6Sumit Bose }
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose talloc_zfree(tmp_ctx);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik return ret;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik}
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik/* =Add-Basic-Group-NO-CHECKS============================================= */
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Boseint sysdb_add_basic_group(struct sysdb_ctx *sysdb,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose const char *name, gid_t gid)
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose{
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt struct ldb_message *msg;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt int ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose TALLOC_CTX *tmp_ctx;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
440797cba931aa491bf418035f55935943e22b4bSumit Bose tmp_ctx = talloc_new(NULL);
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose if (!tmp_ctx) {
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik return ENOMEM;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik }
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose
e0c86d21388bffe2e3919e780780c40d96186abbJakub Hrozek msg = ldb_msg_new(tmp_ctx);
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose if (!msg) {
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose ret = ENOMEM;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose goto done;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose }
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose /* group dn */
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose msg->dn = sysdb_group_dn(sysdb, msg, name);
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose if (!msg->dn) {
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose ERROR_OUT(ret, ENOMEM, done);
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose }
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS, SYSDB_GROUP_CLASS);
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose if (ret) goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret) goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_GIDNUM, (unsigned long)gid);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret) goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose /* creation time */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose (unsigned long)time(NULL));
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret) goto done;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose ret = ldb_add(sysdb->ldb, msg);
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose ret = sysdb_error_to_errno(ret);
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bosedone:
02bb4f87413c634599ad1d8f384d97605ee53771Lukas Slebodnik if (ret) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose }
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose talloc_zfree(tmp_ctx);
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose return ret;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose}
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose/* =Add-Group-Function==================================================== */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Boseint sysdb_add_group(struct sysdb_ctx *sysdb,
1270ffe9f3809f2fd488ef4a320d344ae107ab87Sumit Bose const char *name, gid_t gid,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose struct sysdb_attrs *attrs,
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose int cache_timeout,
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose time_t now)
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher{
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina TALLOC_CTX *tmp_ctx;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina struct ldb_message *msg;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina uint32_t id;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina int ret;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina bool posix;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina struct sss_domain_info *domain = sysdb->domain;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina if (domain->id_max != 0 && gid != 0 &&
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina (gid < domain->id_min || gid > domain->id_max)) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina DEBUG(2, ("Supplied gid [%d] is not in the allowed range [%d-%d].\n",
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina gid, domain->id_min, domain->id_max));
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina return ERANGE;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina }
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina tmp_ctx = talloc_new(NULL);
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina if (!tmp_ctx) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina return ENOMEM;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina }
40ff10d73063949ca699670ca212e96b809d5fcdSumit Bose
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina ret = ldb_transaction_start(sysdb->ldb);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina if (ret) {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina ret = sysdb_error_to_errno(ret);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina talloc_free(tmp_ctx);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina return ret;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina }
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina if (sysdb->mpg) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek /* In MPG domains you can't have groups with the same name as users,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek * search if a group with the same name exists.
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek * Don't worry about users, if we try to add a user with the same
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek * name the operation will fail */
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ret = sysdb_search_user_by_name(tmp_ctx, sysdb,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek name, NULL, &msg);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (ret != ENOENT) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (ret == EOK) ret = EEXIST;
6dcbfe52d5e64205c0d922f3e89add066b42c496Jakub Hrozek goto done;
6dcbfe52d5e64205c0d922f3e89add066b42c496Jakub Hrozek }
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozek }
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozek
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozek /* check no other groups with the same gid exist */
8c829226ce0cf98c35ffce39a66f9645cff65767Jakub Hrozek if (gid != 0) {
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek ret = sysdb_search_group_by_gid(tmp_ctx, sysdb,
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek gid, NULL, &msg);
c23ea7772113a163139a7b7669303e9e80dc1d09Jakub Hrozek if (ret != ENOENT) {
1182dd93a5a6bb18943284273f7fd59b83468843Justin Stephenson if (ret == EOK) ret = EEXIST;
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek goto done;
41291f19dbc5bf14f20729959b852fa605fcc02dJakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek /* try to add the group */
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ret = sysdb_add_basic_group(sysdb, name, gid);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (ret) goto done;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (!attrs) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek attrs = sysdb_new_attrs(tmp_ctx);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (!attrs) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ret = ENOMEM;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek goto done;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ret = sysdb_attrs_get_bool(attrs, SYSDB_POSIX, &posix);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (ret == ENOENT) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek posix = true;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, true);
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek if (ret) goto done;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek } else if (ret != EOK) {
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek goto done;
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek }
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (posix && gid == 0) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_get_new_id(sysdb, &id);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret) goto done;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, id);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret) goto done;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
769347ad4d35d43488eb98f980143495b0db415dStef Walter
769347ad4d35d43488eb98f980143495b0db415dStef Walter if (!now) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina now = time(NULL);
e07d700ed9daf0cf96607fa2d72978cb2431b794Pavel Březina }
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek if (ret) goto done;
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ((cache_timeout) ?
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter (now + cache_timeout) : 0));
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret) goto done;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_set_group_attr(sysdb, name, attrs, SYSDB_MOD_REP);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterdone:
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret == EOK) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = ldb_transaction_commit(sysdb->ldb);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_error_to_errno(ret);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter } else {
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ldb_transaction_cancel(sysdb->ldb);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter talloc_zfree(tmp_ctx);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return ret;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter}
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterint sysdb_add_incomplete_group(struct sysdb_ctx *sysdb,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char *name,
29c5542feb4c45865ea61be97e0e84a1d1f04918Jakub Hrozek gid_t gid,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char *original_dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool posix,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher time_t now)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs;
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos
769347ad4d35d43488eb98f980143495b0db415dStef Walter tmp_ctx = talloc_new(NULL);
d2d8f342cd5e90bb9fd947c448492225f959aa86Pavel Březina if (!tmp_ctx) {
ee6c7e8b589497119ec1ee40e99611f362111600Jakub Hrozek return ENOMEM;
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* try to add the group */
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik ret = sysdb_add_basic_group(sysdb, name, gid);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) goto done;
e369fc08906383e6d5c39832f31bb6600a33f887Simo Sorce
d4063e9a21a4e203bee7e0a0144fa8cabb14cc46Victor Tapia attrs = sysdb_new_attrs(tmp_ctx);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (!now) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina now = time(NULL);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret) goto done;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina now-1);
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina if (ret) goto done;
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, posix);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (original_dn) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_ORIG_DN, original_dn);
f427b36b0cecc426856ab3f77a9c684ac355659dSumit Bose if (ret) goto done;
1a45124f3f300f9afdcb08eab0938e5e7d0534d9Sumit Bose }
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_set_group_attr(sysdb, name, attrs, SYSDB_MOD_REP);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Add-Or-Remove-Group-Memeber=========================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher/* mod_op must be either SYSDB_MOD_ADD or SYSDB_MOD_DEL */
300c772767c1b12077cac1d148ac89738b058f97Jan Zelenyint sysdb_mod_group_member(struct sysdb_ctx *sysdb,
bdc2aced1185c4ee36921fa01b8dc01789a63900Jakub Hrozek struct ldb_dn *member_dn,
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce struct ldb_dn *group_dn,
bdc2aced1185c4ee36921fa01b8dc01789a63900Jakub Hrozek int mod_op)
bdc2aced1185c4ee36921fa01b8dc01789a63900Jakub Hrozek{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina const char *dn;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int ret;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina msg = ldb_msg_new(NULL);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (!msg) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ERROR_OUT(ret, ENOMEM, fail);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina msg->dn = group_dn;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = ldb_msg_add_empty(msg, SYSDB_MEMBER, mod_op, NULL);
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce if (ret != LDB_SUCCESS) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ERROR_OUT(ret, ENOMEM, fail);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek dn = ldb_dn_get_linearized(member_dn);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!dn) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ERROR_OUT(ret, EINVAL, fail);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = ldb_msg_add_string(msg, SYSDB_MEMBER, dn);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != LDB_SUCCESS) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ERROR_OUT(ret, EINVAL, fail);
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = ldb_modify(sysdb->ldb, msg);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sysdb_error_to_errno(ret);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastafail:
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (ret) {
a8191ce7ad5364801ad9458c3194075a7ca77b8aPavel Březina DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
a8191ce7ad5364801ad9458c3194075a7ca77b8aPavel Březina }
a8191ce7ad5364801ad9458c3194075a7ca77b8aPavel Březina talloc_zfree(msg);
a8191ce7ad5364801ad9458c3194075a7ca77b8aPavel Březina return ret;
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose}
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta/* =Add-Basic-Netgroup-NO-CHECKS============================================= */
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Boseint sysdb_add_basic_netgroup(struct sysdb_ctx *sysdb,
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce const char *name, const char *description)
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose{
4de84af23db74e13e867985c9093f394c9fa8d51Sumit Bose struct ldb_message *msg;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta int ret;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose msg = ldb_msg_new(NULL);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (!msg) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose return ENOMEM;
d0d7de66c9494621c1bc12384e41e5e38a77fbebSumit Bose }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose /* netgroup dn */
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose msg->dn = sysdb_netgroup_dn(sysdb, msg, name);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (!msg->dn) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose ERROR_OUT(ret, ENOMEM, done);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD,
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce SYSDB_OBJECTCLASS, SYSDB_NETGROUP_CLASS);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (ret) goto done;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek if (ret) goto done;
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek if (description && *description) {
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_ADD,
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek SYSDB_DESCRIPTION, description);
772199031f0ec687fa1fefd939206858c440e5a1Pavel Březina if (ret) goto done;
2b7ef850846029641cc59560c2d8d4ab7254dda5Pavel Březina }
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek
590582be38cdbfde387fcc57df92903d48c5a083Jakub Hrozek /* creation time */
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina (unsigned long) time(NULL));
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret) goto done;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek ret = ldb_add(sysdb->ldb, msg);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek ret = sysdb_error_to_errno(ret);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozekdone:
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek if (ret) {
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose talloc_zfree(msg);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return ret;
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek}
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek/* =Add-Netgroup-Function==================================================== */
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncioint sysdb_add_netgroup(struct sysdb_ctx *sysdb,
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio const char *name,
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio const char *description,
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio struct sysdb_attrs *attrs,
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio char **missing,
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio int cache_timeout,
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio time_t now)
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio{
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio TALLOC_CTX *tmp_ctx;
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio int ret;
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio tmp_ctx = talloc_new(NULL);
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio if (!tmp_ctx) {
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio return ENOMEM;
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio }
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio ret = ldb_transaction_start(sysdb->ldb);
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio if (ret) {
9222a4fcbeec9d5a6f84aab31a5131f14d4a6430Fabiano Fidêncio ret = sysdb_error_to_errno(ret);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek talloc_free(tmp_ctx);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek return ret;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce /* try to add the netgroup */
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce ret = sysdb_add_basic_netgroup(sysdb, name, description);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (ret && ret != EEXIST) goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!attrs) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce attrs = sysdb_new_attrs(tmp_ctx);
df99d709c8cbef3c378c111944d83b7345e4c1eaPavel Březina if (!attrs) {
df99d709c8cbef3c378c111944d83b7345e4c1eaPavel Březina ret = ENOMEM;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce goto done;
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!now) {
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce now = time(NULL);
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce }
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce if (ret) goto done;
df99d709c8cbef3c378c111944d83b7345e4c1eaPavel Březina
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce ((cache_timeout) ?
a8d1a344e580f29699aed9b88d87fc3c6f5d113bSimo Sorce (now + cache_timeout) : 0));
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek if (ret) goto done;
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek ret = sysdb_set_netgroup_attr(sysdb, name, attrs, SYSDB_MOD_REP);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek if (missing) {
70fe6e2bb398b8669ad1aebeaf0abcbffc307475Jakub Hrozek ret = sysdb_remove_attrs(sysdb, name,
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek SYSDB_MEMBER_NETGROUP,
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek missing);
1ec4198f38d34a1f82a2db55d8c9782a434fb55fJakub Hrozek if (ret != EOK) {
2b5518eeaacc6245cfa77ee4a7086f16208060fcJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE, ("Could not remove missing attributes\n"));
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek }
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek }
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozekdone:
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek if (ret == EOK) {
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek ret = ldb_transaction_commit(sysdb->ldb);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek ret = sysdb_error_to_errno(ret);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek }
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek if (ret != EOK) {
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek ldb_transaction_cancel(sysdb->ldb);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek }
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek talloc_zfree(tmp_ctx);
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek return ret;
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek}
cac0db2f8004ae88b9263dc3888a11a2d3d3d114Jakub Hrozek
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek/* =Store-Users-(Native/Legacy)-(replaces-existing-data)================== */
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek
bea0dc79faf609de8603cb42f190adae544bc8fbJakub Hrozek/* if one of the basic attributes is empty ("") as opposed to NULL,
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek * this will just remove it */
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozekint sysdb_store_user(struct sysdb_ctx *sysdb,
b9c563c29243291f40489bb0dcbf3946fca72d58Jakub Hrozek const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *pwd,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uid_t uid, gid_t gid,
376eaf187c13c2a1eaea0ffbdd970b6b563ab74cPetr Cech const char *gecos,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *homedir,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *shell,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *orig_dn,
0429e21a45aa26c133cb4d8285a60446a0611e44Pavel Březina struct sysdb_attrs *attrs,
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina char **remove_attrs,
38b2bd97e41388995594126ea4e6b7c55ea0eb5cPavel Březina uint64_t cache_timeout,
769347ad4d35d43488eb98f980143495b0db415dStef Walter time_t now)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina TALLOC_CTX *tmp_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct ldb_message *msg;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t sret = EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina bool in_transaction = false;
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina tmp_ctx = talloc_new(NULL);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (!tmp_ctx) {
b3ee4be9e1794fa823696d70d4958f3b0269939cJakub Hrozek return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (!attrs) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina attrs = sysdb_new_attrs(tmp_ctx);
a1bf79449204ce9a5392b9d09b953a6bdf53a122Pavel Březina if (!attrs) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto fail;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (pwd && (sysdb->domain->legacy_passwords || !*pwd)) {
5ea60d18ddb8eaff25d274c22c7db7df57b6ec4dNikolai Kondrashov ret = sysdb_attrs_add_string(attrs, SYSDB_PWD, pwd);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) goto fail;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_transaction_start(sysdb);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret != EOK) {
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to start transaction\n"));
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce in_transaction = true;
d46d59e78600aa72176df7217c94743b7e71881aJustin Stephenson
d46d59e78600aa72176df7217c94743b7e71881aJustin Stephenson ret = sysdb_search_user_by_name(tmp_ctx, sysdb,
d46d59e78600aa72176df7217c94743b7e71881aJustin Stephenson name, NULL, &msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret && ret != ENOENT) {
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek goto fail;
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek }
52e0894fd65bff4715c88330eb62b28e1635228fStephen Gallagher
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher /* get transaction timestamp */
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek if (!now) {
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek now = time(NULL);
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek }
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
8a07521b413a3b5879f824e1872c5770c92ee5c0Stephen Gallagher /* users doesn't exist, turn into adding a user */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_add_user(sysdb, 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(sysdb, NULL, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher /* Not found by UID, return the original EEXIST,
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher * this may be a conflict in MPG domain or something
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher * else */
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher ret = EEXIST;
59744cff6edb106ae799b2321cb8731edadf409aStephen Gallagher goto fail;
59744cff6edb106ae799b2321cb8731edadf409aStephen 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(sysdb, name, uid, gid, gecos, homedir,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher shell, orig_dn, attrs, cache_timeout, now);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek /* Handle the result of sysdb_add_user */
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (ret == EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_OP_FAILURE, ("Could not add user\n"));
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek /* the user exists, let's just replace attributes when set */
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (uid) {
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek ret = sysdb_attrs_add_uint32(attrs, SYSDB_UIDNUM, uid);
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce if (ret) goto fail;
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (gid) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, gid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (uid && !gid && sysdb->mpg) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (gecos) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_attrs_add_string(attrs, SYSDB_GECOS, gecos);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret) goto fail;
a9eff330a7fbd231e8cc28a6828a1e5014ddb0d2Michal Zidek }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (homedir) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_HOMEDIR, homedir);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (shell) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt ret = sysdb_attrs_add_string(attrs, SYSDB_SHELL, shell);
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (ret) goto fail;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek }
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt 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,
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek ((cache_timeout) ?
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (now + cache_timeout) : 0));
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret) goto fail;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek ret = sysdb_set_user_attr(sysdb, name, attrs, SYSDB_MOD_REP);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret != EOK) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (remove_attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_remove_attrs(sysdb, name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher SYSDB_MEMBER_USER,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher remove_attrs);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret != EOK) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik DEBUG(4, ("Could not remove missing attributes\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozekdone:
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_transaction_commit(sysdb);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret != EOK) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek goto fail;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
f1828234a850dd28465425248a83a993f262918fPavel Březina in_transaction = false;
f1828234a850dd28465425248a83a993f262918fPavel Březina
f1828234a850dd28465425248a83a993f262918fPavel Březinafail:
f1828234a850dd28465425248a83a993f262918fPavel Březina if (in_transaction) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik sret = sysdb_transaction_cancel(sysdb);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (sret != EOK) {
f1828234a850dd28465425248a83a993f262918fPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay }
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay }
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay if (ret) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay talloc_zfree(tmp_ctx);
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek return ret;
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek}
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek/* =Store-Group-(Native/Legacy)-(replaces-existing-data)================== */
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek/* this function does not check that all user members are actually present */
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozekint sysdb_store_group(struct sysdb_ctx *sysdb,
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek const char *name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina gid_t gid,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sysdb_attrs *attrs,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina uint64_t cache_timeout,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina time_t now)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina TALLOC_CTX *tmp_ctx;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina static const char *src_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina SYSDB_ORIG_MODSTAMP, NULL };
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct ldb_message *msg;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina bool new_group = false;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina tmp_ctx = talloc_new(NULL);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina if (!tmp_ctx) {
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina return ENOMEM;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina ret = sysdb_search_group_by_name(tmp_ctx, sysdb,
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina name, src_attrs, &msg);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina if (ret && ret != ENOENT) {
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina goto done;
e088912418fd4db750f2097dfde8ef9b77303f05Michal Židek }
4a9160e2b3b9c531e2b4a7884f49bfbb4a07a992Sumit Bose if (ret == ENOENT) {
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina new_group = true;
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina }
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina if (!attrs) {
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina attrs = sysdb_new_attrs(tmp_ctx);
4a9160e2b3b9c531e2b4a7884f49bfbb4a07a992Sumit Bose if (!attrs) {
4a9160e2b3b9c531e2b4a7884f49bfbb4a07a992Sumit Bose ret = ENOMEM;
4a9160e2b3b9c531e2b4a7884f49bfbb4a07a992Sumit Bose goto done;
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina }
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina }
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina /* get transaction timestamp */
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina if (!now) {
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina now = time(NULL);
e157b9f6cb370e1b94bcac2044d26ad66d640fbaPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina /* FIXME: use the remote modification timestamp to know if the
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina * group needs any update */
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina if (new_group) {
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek /* group doesn't exist, turn into adding a group */
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina ret = sysdb_add_group(sysdb, name, gid, attrs, cache_timeout, now);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret == EEXIST) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina /* This may be a group rename. If there is a group with the
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina * same GID, remove it and try to add the basic group again
558998ce664055a75595371118f818084d8f2b23Jan Cholasta */
558998ce664055a75595371118f818084d8f2b23Jan Cholasta ret = sysdb_delete_group(sysdb, NULL, gid);
558998ce664055a75595371118f818084d8f2b23Jan Cholasta if (ret == ENOENT) {
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta /* Not found by GID, return the original EEXIST,
558998ce664055a75595371118f818084d8f2b23Jan Cholasta * this may be a conflict in MPG domain or something
558998ce664055a75595371118f818084d8f2b23Jan Cholasta * else */
558998ce664055a75595371118f818084d8f2b23Jan Cholasta return EEXIST;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt } else if (ret != EOK) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt goto done;
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta }
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta DEBUG(SSSDBG_MINOR_FAILURE,
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta ("A group with the same GID [%llu] was removed from the "
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta "cache\n", (unsigned long long) gid));
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta ret = sysdb_add_group(sysdb, name, gid, attrs, cache_timeout, now);
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta }
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta goto done;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
558998ce664055a75595371118f818084d8f2b23Jan Cholasta /* the group exists, let's just replace attributes when set */
558998ce664055a75595371118f818084d8f2b23Jan Cholasta if (gid) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, gid);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret) goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret) goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ((cache_timeout) ?
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio (now + cache_timeout) : 0));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret) goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = sysdb_set_group_attr(sysdb, name, attrs, SYSDB_MOD_REP);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidênciodone:
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret) {
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose }
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose talloc_zfree(tmp_ctx);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose return ret;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose}
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose
a20fb9cbd5f42a6ca895aea1b84347fdfea34b89Sumit Bose/* =Add-User-to-Group(Native/Legacy)====================================== */
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosestatic int
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosesysdb_group_membership_mod(struct sysdb_ctx *sysdb,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose const char *group,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose const char *member,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose enum sysdb_member_type type,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose int modify_op)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose{
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose struct ldb_dn *group_dn;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose struct ldb_dn *member_dn;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose int ret;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose TALLOC_CTX *tmp_ctx = talloc_new(NULL);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose if (!tmp_ctx) {
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose return ENOMEM;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose }
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose if (type == SYSDB_MEMBER_USER) {
84fecc2fd535030bc56b5046ba2a1ba95c46bc34Lukas Slebodnik member_dn = sysdb_user_dn(sysdb, tmp_ctx, member);
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose } else if (type == SYSDB_MEMBER_GROUP) {
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose member_dn = sysdb_group_dn(sysdb, tmp_ctx, member);
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose } else {
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose ret = EINVAL;
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose goto done;
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose }
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose if (!member_dn) {
84fecc2fd535030bc56b5046ba2a1ba95c46bc34Lukas Slebodnik ret = ENOMEM;
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose goto done;
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose }
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose group_dn = sysdb_group_dn(sysdb, tmp_ctx, group);
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose if (!group_dn) {
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose ret = ENOMEM;
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose goto done;
31a6661ff2a640fbcf97460df2415fd1bab309b5Sumit Bose }
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose ret = sysdb_mod_group_member(sysdb, member_dn, group_dn, modify_op);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
6e973aa578a692b2e7597811dfdfdb1a442c85f8Nikolai Kondrashov}
62b20154899f847e760d6dfbae6a32fb45b448deLukas Slebodnik
cbff3fcdce5b0377a62fbe74f32e476efbf7ca9cNikolai Kondrashovint sysdb_add_group_member(struct sysdb_ctx *sysdb,
6e973aa578a692b2e7597811dfdfdb1a442c85f8Nikolai Kondrashov const char *group,
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose const char *member,
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose enum sysdb_member_type type)
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek{
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose return sysdb_group_membership_mod(sysdb, group, member, type, SYSDB_MOD_ADD);
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose}
f74d7744f1b12fe0492eadfc8cf30afcb4092e40Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Remove-member-from-Group(Native/Legacy)=============================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnikint sysdb_remove_group_member(struct sysdb_ctx *sysdb,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik const char *group,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik const char *member,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher enum sysdb_member_type type)
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik{
25c394fc9d09aa7f58700e67b942aba86505934aLukas Slebodnik return sysdb_group_membership_mod(sysdb, group, member, type, SYSDB_MOD_DEL);
af820c9fc6aa1768e2e6b0df78fb489dbb1b28d0Pavel Březina}
af820c9fc6aa1768e2e6b0df78fb489dbb1b28d0Pavel Březina
af820c9fc6aa1768e2e6b0df78fb489dbb1b28d0Pavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Password-Caching====================================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_cache_password(struct sysdb_ctx *sysdb,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik const char *username,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *password)
f74d7744f1b12fe0492eadfc8cf30afcb4092e40Lukas Slebodnik{
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik TALLOC_CTX *tmp_ctx;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik struct sysdb_attrs *attrs;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik char *hash = NULL;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce char *salt;
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik int ret;
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose tmp_ctx = talloc_new(NULL);
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose if (!tmp_ctx) {
1d1a0a019d8d4d9ab0f51ada03604cd2cada287eSumit Bose return ENOMEM;
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik }
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = s3crypt_gen_salt(tmp_ctx, &salt);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (ret) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce DEBUG(4, ("Failed to generate random salt.\n"));
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce goto fail;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = s3crypt_sha512(tmp_ctx, password, salt, &hash);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (ret) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce DEBUG(4, ("Failed to create password hash.\n"));
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce goto fail;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
d46d59e78600aa72176df7217c94743b7e71881aJustin Stephenson
d46d59e78600aa72176df7217c94743b7e71881aJustin Stephenson attrs = sysdb_new_attrs(tmp_ctx);
d46d59e78600aa72176df7217c94743b7e71881aJustin Stephenson if (!attrs) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ERROR_OUT(ret, ENOMEM, fail);
1116fbbf0e50827841a6bafd80c027c3d3548c1fLukas Slebodnik }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = sysdb_attrs_add_string(attrs, SYSDB_CACHEDPWD, hash);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (ret) goto fail;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce /* FIXME: should we use a different attribute for chache passwords ?? */
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = sysdb_attrs_add_long(attrs, "lastCachedPasswordChange",
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik (long)time(NULL));
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik if (ret) goto fail;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = sysdb_attrs_add_uint32(attrs, SYSDB_FAILED_LOGIN_ATTEMPTS, 0U);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik if (ret) goto fail;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik ret = sysdb_set_user_attr(sysdb, username, attrs, SYSDB_MOD_REP);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik if (ret) {
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik goto fail;
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik }
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik talloc_zfree(tmp_ctx);
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik return EOK;
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnikfail:
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik if (ret) {
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce talloc_zfree(tmp_ctx);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce return ret;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce}
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce/* =Custom Search================== */
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorceint sysdb_search_custom(TALLOC_CTX *mem_ctx,
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce struct sysdb_ctx *sysdb,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *filter,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char *subtree_name,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek const char **attrs,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek size_t *msgs_count,
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek struct ldb_message ***msgs)
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek{
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek struct ldb_dn *basedn;
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek int ret;
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek if (filter == NULL || subtree_name == NULL) {
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek return EINVAL;
4b39208286ca0351ee76d4e64e077e7ad5ca8568Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
16c351625346b3193e1762027e5215ab76042127Sumit Bose basedn = sysdb_custom_subtree_dn(sysdb, mem_ctx, subtree_name);
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek if (basedn == NULL) {
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek DEBUG(1, ("sysdb_custom_subtree_dn failed.\n"));
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek return ENOMEM;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek }
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek if (!ldb_dn_validate(basedn)) {
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek DEBUG(1, ("Failed to create DN.\n"));
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek return EINVAL;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek }
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek LDB_SCOPE_SUBTREE, filter, attrs,
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek msgs_count, msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_search_custom_by_name(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *object_name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *subtree_name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t *_count,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct ldb_message ***_msgs)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t count;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina if (object_name == NULL || subtree_name == NULL) {
5843ad321944a028f6dee7e1fd4f9381c4953d07Sumit Bose return EINVAL;
9a9b5e115b079751422be22fd252c0b283611c62Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek return ENOMEM;
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek }
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher basedn = sysdb_custom_dn(sysdb, tmp_ctx, object_name, subtree_name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (basedn == NULL) {
22091abbe7b4a5667f62603dfd875e9ec6adf789Alexey Shabalin DEBUG(1, ("sysdb_custom_dn failed.\n"));
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!ldb_dn_validate(basedn)) {
c8b8901b05da9e31dba320f305ec20301e928cfbSumit Bose DEBUG(1, ("Failed to create DN.\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EINVAL;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, basedn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher LDB_SCOPE_BASE, NULL, attrs, &count, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (count > 1) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(1, ("More than one result found.\n"));
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = EFAULT;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *_count = count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *_msgs = talloc_move(mem_ctx, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Custom Store (replaces-existing-data)================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_store_custom(struct sysdb_ctx *sysdb,
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek const char *object_name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *subtree_name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek TALLOC_CTX *tmp_ctx;
5b93634c7f0e34f69b4cf8fb9b2e77b9179024a7Fabiano Fidêncio const char *search_attrs[] = { "*", NULL };
5b93634c7f0e34f69b4cf8fb9b2e77b9179024a7Fabiano Fidêncio size_t resp_count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **resp;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message_element *el;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool add_object = false;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
22d381367c27910fe82f476a76b9f4ede555e35aLukas Slebodnik int i;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
c71e0a6710418991d759a329b8dcb77c7ad3e16eJakub Hrozek if (object_name == NULL || subtree_name == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EINVAL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_start(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return sysdb_error_to_errno(ret);
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_custom_by_name(tmp_ctx, sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher object_name, subtree_name,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik search_attrs, &resp_count, &resp);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK && ret != ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
e3c06950bdb0bee6df603b101b30b75ef38439a4Lukas Slebodnik if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher add_object = true;
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg = ldb_msg_new(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (msg == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->dn = sysdb_custom_dn(sysdb, tmp_ctx, object_name, subtree_name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!msg->dn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(1, ("sysdb_custom_dn failed.\n"));
e3c06950bdb0bee6df603b101b30b75ef38439a4Lukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->elements = talloc_array(msg, struct ldb_message_element, attrs->num);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!msg->elements) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < attrs->num; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->elements[i] = attrs->a[i];
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (add_object) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->elements[i].flags = LDB_FLAG_MOD_ADD;
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek } else {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher el = ldb_msg_find_element(resp[0], attrs->a[i].name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (el == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->elements[i].flags = LDB_FLAG_MOD_ADD;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce }
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher msg->num_elements = attrs->num;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (add_object) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_add(sysdb->ldb, msg);
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != LDB_SUCCESS) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher DEBUG(1, ("Failed to store custom entry: %s(%d)[%s]\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_transaction_cancel(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
35872dc24058c5e8028cb4082fd405a27835dcd1Jakub Hrozek ret = sysdb_error_to_errno(ret);
fcb8e3f1f49bb34c409d8dbd75889eb72be05517Jakub Hrozek }
fcb8e3f1f49bb34c409d8dbd75889eb72be05517Jakub Hrozek talloc_zfree(tmp_ctx);
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek return ret;
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina}
9e6f8d1c66b4b3543bab67d807bd26f1d6256c75Pavel Březina
676bf6dda60776d9db79dad1c2506c0e57bb5503Pavel Březina/* = Custom Delete======================================= */
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorceint sysdb_delete_custom(struct sysdb_ctx *sysdb,
fcb8e3f1f49bb34c409d8dbd75889eb72be05517Jakub Hrozek const char *object_name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *subtree_name)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *dn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (object_name == NULL || subtree_name == NULL) {
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek return EINVAL;
c51f7a064b0d7ef86110bdeb6dc09fa6c08be7d3Jakub Hrozek }
d12c95d840ed5de7f34e21002943c48e711a33f4Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher return ENOMEM;
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina }
9e6f8d1c66b4b3543bab67d807bd26f1d6256c75Pavel Březina
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina dn = sysdb_custom_dn(sysdb, tmp_ctx, object_name, subtree_name);
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (dn == NULL) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher DEBUG(1, ("sysdb_custom_dn failed.\n"));
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher ret = ENOMEM;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher goto done;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher ret = ldb_delete(sysdb->ldb, dn);
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher switch (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case LDB_SUCCESS:
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl case LDB_ERR_NO_SUCH_OBJECT:
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl default:
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl DEBUG(1, ("LDB Error: %s(%d)\nError Message: [%s]\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichldone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter return ret;
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter}
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter/* = ASQ search request ======================================== */
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walterint sysdb_asq_search(TALLOC_CTX *mem_ctx,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter struct sysdb_ctx *sysdb,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter struct ldb_dn *base_dn,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter const char *expression,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter const char *asq_attribute,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter const char **attrs,
fe60346714a73ac3987f786731389320633dd245Pavel Březina size_t *msgs_count,
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina struct ldb_message ***msgs)
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina{
fe60346714a73ac3987f786731389320633dd245Pavel Březina TALLOC_CTX *tmp_ctx;
fe60346714a73ac3987f786731389320633dd245Pavel Březina struct ldb_request *ldb_req;
fe60346714a73ac3987f786731389320633dd245Pavel Březina struct ldb_control **ctrl;
fe60346714a73ac3987f786731389320633dd245Pavel Březina struct ldb_asq_control *asq_control;
fe60346714a73ac3987f786731389320633dd245Pavel Březina struct ldb_result *res;
fe60346714a73ac3987f786731389320633dd245Pavel Březina int ret;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
fe60346714a73ac3987f786731389320633dd245Pavel Březina tmp_ctx = talloc_new(NULL);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (!tmp_ctx) {
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek return ENOMEM;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek }
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ctrl = talloc_array(tmp_ctx, struct ldb_control *, 2);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (ctrl == NULL) {
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ret = ENOMEM;
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnik goto fail;
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnik }
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnik
8f61739e0de45ce2ee3be436fc91ef12a1a1c4f3Lukas Slebodnik ctrl[0] = talloc(ctrl, struct ldb_control);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (ctrl[0] == NULL) {
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ret = ENOMEM;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher goto fail;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ctrl[1] = NULL;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ctrl[0]->oid = LDB_CONTROL_ASQ_OID;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ctrl[0]->critical = 1;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher asq_control = talloc(ctrl[0], struct ldb_asq_control);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher if (asq_control == NULL) {
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ret = ENOMEM;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher goto fail;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose }
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose asq_control->request = 1;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose asq_control->source_attribute = talloc_strdup(asq_control, asq_attribute);
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose if (asq_control->source_attribute == NULL) {
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose ret = ENOMEM;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose goto fail;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose }
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose asq_control->src_attr_len = strlen(asq_control->source_attribute);
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose ctrl[0]->data = asq_control;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose res = talloc_zero(tmp_ctx, struct ldb_result);
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose if (!res) {
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech ret = ENOMEM;
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech goto fail;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose }
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina ret = ldb_build_search_req(&ldb_req, sysdb->ldb, tmp_ctx,
66c8e92eb5a4985bb7f64c349a53b08030a000cfFabiano Fidêncio base_dn, LDB_SCOPE_BASE,
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina expression, attrs, ctrl,
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek res, ldb_search_default_callback, NULL);
29dd456102dc995aa59a56483363087071bb84d6Nikolai Kondrashov if (ret != LDB_SUCCESS) {
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek ret = sysdb_error_to_errno(ret);
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozek goto fail;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose }
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose ret = ldb_request(sysdb->ldb, ldb_req);
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose if (ret == LDB_SUCCESS) {
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose ret = ldb_wait(ldb_req->handle, LDB_WAIT_ALL);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret) {
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce ret = sysdb_error_to_errno(ret);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msgs_count = res->count;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher *msgs = talloc_move(mem_ctx, &res->msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
f232789430a080384188d5da89b19d874cf17513Jakub Hrozekfail:
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek if (ret == ENOENT) {
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek }
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek else if (ret) {
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
291a6c8af9759e41cec6f332cb72606ca90768c3Pavel Březina }
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek talloc_zfree(tmp_ctx);
9a9b5e115b079751422be22fd252c0b283611c62Jakub Hrozek return ret;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek}
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek/* =Search-Users-with-Custom-Filter====================================== */
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozekint sysdb_search_users(TALLOC_CTX *mem_ctx,
9df7cddb68c61ef4e0397c196604999c68f4be0dJakub Hrozek struct sysdb_ctx *sysdb,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek const char *sub_filter,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek const char **attrs,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek size_t *msgs_count,
22091abbe7b4a5667f62603dfd875e9ec6adf789Alexey Shabalin struct ldb_message ***msgs)
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik{
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek TALLOC_CTX *tmp_ctx;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik struct ldb_dn *basedn;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek char *filter;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek int ret;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik tmp_ctx = talloc_new(NULL);
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek if (!tmp_ctx) {
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek return ENOMEM;
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek }
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter SYSDB_TMPL_USER_BASE, sysdb->domain->name);
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter if (!basedn) {
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter DEBUG(2, ("Failed to build base dn\n"));
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech ret = ENOMEM;
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter goto fail;
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter }
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_UC, sub_filter);
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter if (!filter) {
f5e47e1d65f80ffdb1893feab18583a74d661214Stef Walter DEBUG(2, ("Failed to build filter\n"));
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = ENOMEM;
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina goto fail;
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina }
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina
7ac503a73a26abe49f9f7d175c74df705380898dPavel Březina DEBUG(SSSDBG_TRACE_INTERNAL,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ("Search users with filter: %s\n", filter));
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter LDB_SCOPE_SUBTREE, filter, attrs,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter msgs_count, msgs);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (ret) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter goto fail;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek talloc_zfree(tmp_ctx);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek return EOK;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozekfail:
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (ret == ENOENT) {
c440c424443517b12afa8d56f989d92ca6ba56a3Jakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL, ("No such entry\n"));
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek else if (ret) {
e7ccfb139388c947ec2dee16cfe3005f5643b90dPetr Cech DEBUG(SSSDBG_MINOR_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina talloc_zfree(tmp_ctx);
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina return ret;
83a79d93035c2d75a1941f3b54426119174044a0Pavel Březina}
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
29dd456102dc995aa59a56483363087071bb84d6Nikolai Kondrashov/* =Delete-User-by-Name-OR-uid============================================ */
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina
c109f063b4469818fd335b8b509f0458e7b33b0aJakub Hrozekint sysdb_delete_user(struct sysdb_ctx *sysdb,
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina const char *name, uid_t uid)
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek{
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina TALLOC_CTX *tmp_ctx;
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce const char *attrs[] = {SYSDB_GHOST, NULL};
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina size_t msg_count;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina char *filter;
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina struct ldb_message **msgs;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina struct ldb_message *msg;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina int ret;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina int i;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina tmp_ctx = talloc_new(NULL);
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina if (!tmp_ctx) {
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina return ENOMEM;
dc70b11ddc2dfc6ed99cd895f020cd3429278968Pavel Březina }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (name) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = sysdb_search_user_by_name(tmp_ctx, sysdb,
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek name, NULL, &msg);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek } else {
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina ret = sysdb_search_user_by_uid(tmp_ctx, sysdb,
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina uid, NULL, &msg);
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina }
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina if (ret == EOK) {
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina if (name && uid) {
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina /* verify name/gid match */
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina const char *c_name;
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina uint64_t c_uid;
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina
8d5292227a8d1ab9c6aa5b88d8ac8655cd1223e5Pavel Březina c_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek c_uid = ldb_msg_find_attr_as_uint64(msg, SYSDB_UIDNUM, 0);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (c_name == NULL || c_uid == 0) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek DEBUG(2, ("Attribute is missing but this should never happen!\n"));
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = EFAULT;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek goto fail;
54039570d26e29444c398aa4ad6ba638f1713566Sumit Bose }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (strcmp(name, c_name) || uid != c_uid) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek /* this is not the entry we are looking for */
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = EINVAL;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek goto fail;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = sysdb_delete_entry(sysdb, msg->dn, false);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (ret) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek goto fail;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek } else if (ret == ENOENT && name != NULL) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek /* Perhaps a ghost user? */
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek filter = talloc_asprintf(tmp_ctx, "(%s=%s)", SYSDB_GHOST, name);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (filter == NULL) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = ENOMEM;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek goto fail;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
ec9ac22d699a17d590b1d4ba9ba3750eb719f340Sumit Bose ret = sysdb_search_groups(tmp_ctx, sysdb, filter, attrs, &msg_count, &msgs);
ec9ac22d699a17d590b1d4ba9ba3750eb719f340Sumit Bose if (ret != EOK) {
ec9ac22d699a17d590b1d4ba9ba3750eb719f340Sumit Bose goto fail;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek for (i = 0; i < msg_count; i++) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek msg = ldb_msg_new(tmp_ctx);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (!msg) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ERROR_OUT(ret, ENOMEM, fail);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek msg->dn = msgs[i]->dn;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_DELETE, SYSDB_GHOST, name);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (ret) goto fail;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = ldb_modify(sysdb->ldb, msg);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek ret = sysdb_error_to_errno(ret);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek if (ret != EOK) {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek goto fail;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek talloc_zfree(msg);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek } else {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek goto fail;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek }
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek talloc_zfree(tmp_ctx);
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek return EOK;
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozekfail:
ea422c7061072c125eb53b40d7f3ca444d886913Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek talloc_zfree(tmp_ctx);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek return ret;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek}
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek/* =Search-Groups-with-Custom-Filter===================================== */
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozekint sysdb_search_groups(TALLOC_CTX *mem_ctx,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct sysdb_ctx *sysdb,
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech const char *sub_filter,
56c9f8731173eae841a05f31bb03d311076a8485Petr Cech const char **attrs,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek size_t *msgs_count,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct ldb_message ***msgs)
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek{
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek TALLOC_CTX *tmp_ctx;
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce struct ldb_dn *basedn;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek char *filter;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek int ret;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek tmp_ctx = talloc_new(NULL);
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek if (!tmp_ctx) {
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek return ENOMEM;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek }
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek if (!basedn) {
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek DEBUG(2, ("Failed to build base dn\n"));
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek ret = ENOMEM;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek goto fail;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek }
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_GC, sub_filter);
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek if (!filter) {
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek DEBUG(2, ("Failed to build filter\n"));
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek ret = ENOMEM;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek goto fail;
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek }
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek DEBUG(SSSDBG_TRACE_INTERNAL,
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek ("Search groups with filter: %s\n", filter));
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek LDB_SCOPE_SUBTREE, filter, attrs,
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek msgs_count, msgs);
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek if (ret) {
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek goto fail;
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek }
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek talloc_zfree(tmp_ctx);
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek return EOK;
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židekfail:
537103f296b7112d9fd505af941a6d83d7902eb1Michal Židek if (ret == ENOENT) {
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh DEBUG(SSSDBG_TRACE_INTERNAL, ("No such entry\n"));
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh }
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh else if (ret) {
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh DEBUG(SSSDBG_MINOR_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh }
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh talloc_zfree(tmp_ctx);
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh return ret;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh}
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce/* =Delete-Group-by-Name-OR-gid=========================================== */
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singhint sysdb_delete_group(struct sysdb_ctx *sysdb,
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh const char *name, gid_t gid)
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh{
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce TALLOC_CTX *tmp_ctx;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik struct ldb_message *msg;
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh int ret;
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh tmp_ctx = talloc_new(NULL);
25255e4d0e1517a5d443e8fee22e91862e255702Abhishek Singh if (!tmp_ctx) {
25255e4d0e1517a5d443e8fee22e91862e255702Abhishek Singh return ENOMEM;
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh }
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh if (name) {
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh ret = sysdb_search_group_by_name(tmp_ctx, sysdb,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek name, NULL, &msg);
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha } else {
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha ret = sysdb_search_group_by_gid(tmp_ctx, sysdb,
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha gid, NULL, &msg);
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha }
9face844e3063b61ab19e1d82bbf3d9f9de76ac7Petr Cech if (ret) {
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha goto fail;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha }
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha if (name && gid) {
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha /* verify name/gid match */
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha const char *c_name;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha uint64_t c_gid;
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce c_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha c_gid = ldb_msg_find_attr_as_uint64(msg, SYSDB_GIDNUM, 0);
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha if (c_name == NULL || c_gid == 0) {
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha DEBUG(2, ("Attribute is missing but this should never happen!\n"));
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha ret = EFAULT;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha goto fail;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha }
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha if (strcmp(name, c_name) || gid != c_gid) {
bc052ea17d858c19f9cb9c9e2bc602e754f68831Sumit Bose /* this is not the entry we are looking for */
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose ret = EINVAL;
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose goto fail;
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose }
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha }
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha ret = sysdb_delete_entry(sysdb, msg->dn, false);
80b5dbe123ec94c5a8fcb99f9a4953c1513deb58Sumit Bose if (ret) {
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose goto fail;
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose }
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha talloc_zfree(tmp_ctx);
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha return EOK;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha
80b5dbe123ec94c5a8fcb99f9a4953c1513deb58Sumit Bosefail:
80b5dbe123ec94c5a8fcb99f9a4953c1513deb58Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose talloc_zfree(tmp_ctx);
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose return ret;
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha}
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik/* =Search-Netgroups-with-Custom-Filter===================================== */
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnikint sysdb_search_netgroups(TALLOC_CTX *mem_ctx,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik struct sysdb_ctx *sysdb,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik const char *sub_filter,
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik const char **attrs,
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik size_t *msgs_count,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik struct ldb_message ***msgs)
16c351625346b3193e1762027e5215ab76042127Sumit Bose{
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek TALLOC_CTX *tmp_ctx;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct ldb_dn *basedn;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek char *filter;
d43c9d18fb263b1ea4071b20e93ce4994583f62fJakub Hrozek int ret;
04868f1573f4b26ef34610b6d7069172f93bd8abJakub Hrozek
04868f1573f4b26ef34610b6d7069172f93bd8abJakub Hrozek tmp_ctx = talloc_new(NULL);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (!tmp_ctx) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek return ENOMEM;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek }
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek SYSDB_TMPL_NETGROUP_BASE, sysdb->domain->name);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (!basedn) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek DEBUG(2, ("Failed to build base dn\n"));
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ret = ENOMEM;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek goto fail;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_NC, sub_filter);
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek if (!filter) {
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek DEBUG(2, ("Failed to build filter\n"));
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek ret = ENOMEM;
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek goto fail;
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek }
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek DEBUG(6, ("Search netgroups with filter: %s\n", filter));
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik LDB_SCOPE_SUBTREE, filter, attrs,
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek msgs_count, msgs);
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek if (ret) {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek goto fail;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek }
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek talloc_zfree(tmp_ctx);
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek return EOK;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozekfail:
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek if (ret == ENOENT) {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Entry not found\n"));
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek } else {
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek }
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek talloc_zfree(tmp_ctx);
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek return ret;
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek}
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek/* =Delete-Netgroup-by-Name============================================== */
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozekint sysdb_delete_netgroup(struct sysdb_ctx *sysdb,
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek const char *name)
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek{
3432a503c714732407ea18b2dd32f4f432a6c545Jakub Hrozek TALLOC_CTX *tmp_ctx;
e046ae03d0f55b1c8b0ec2fa6139bf86a3449adfPavel Březina struct ldb_message *msg;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose int ret;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose if (!name) return EINVAL;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose tmp_ctx = talloc_new(NULL);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose if (!tmp_ctx) {
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik return ENOMEM;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose }
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose ret = sysdb_search_netgroup_by_name(tmp_ctx, sysdb,
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose name, NULL, &msg);
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose if (ret != EOK && ret != ENOENT) {
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose DEBUG(6, ("sysdb_search_netgroup_by_name failed: %d (%s)\n",
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose ret, strerror(ret)));
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose goto done;
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose } else if (ret == ENOENT) {
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose DEBUG(6, ("Netgroup does not exist, nothing to delete\n"));
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose ret = EOK;
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose goto done;
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose }
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose ret = sysdb_delete_entry(sysdb, msg->dn, false);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose if (ret != EOK) {
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose goto done;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose }
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose
b5f61c9b3f5ea79bf319c18ff59394070c04d607Pavel Reichldone:
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik if (ret != EOK) {
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
d82ffa52dd4c3bb11115b1687edc189284797329Lukas Slebodnik }
d82ffa52dd4c3bb11115b1687edc189284797329Lukas Slebodnik talloc_free(tmp_ctx);
d82ffa52dd4c3bb11115b1687edc189284797329Lukas Slebodnik return ret;
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose}
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose/* ========= Authentication against cached password ============ */
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik
939246537b0b9a4af6862c513d3919501ad57d92Sumit Boseerrno_t check_failed_login_attempts(struct confdb_ctx *cdb,
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose struct ldb_message *ldb_msg,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek uint32_t *failed_login_attempts,
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl time_t *delayed_until)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl int ret;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl int allowed_failed_login_attempts;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik int failed_login_delay;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl time_t last_failed_login;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl time_t end;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik TALLOC_CTX *tmp_ctx;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik tmp_ctx = talloc_new(NULL);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl if (!tmp_ctx) {
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl return ENOMEM;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl }
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl *delayed_until = -1;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl *failed_login_attempts = ldb_msg_find_attr_as_uint(ldb_msg,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl SYSDB_FAILED_LOGIN_ATTEMPTS, 0);
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik last_failed_login = (time_t) ldb_msg_find_attr_as_int64(ldb_msg,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl SYSDB_LAST_FAILED_LOGIN, 0);
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik CONFDB_PAM_FAILED_LOGIN_ATTEMPTS,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl CONFDB_DEFAULT_PAM_FAILED_LOGIN_ATTEMPTS,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl &allowed_failed_login_attempts);
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek if (ret != EOK) {
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek DEBUG(1, ("Failed to read the number of allowed failed login "
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek "attempts.\n"));
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek ret = EIO;
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek goto done;
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek }
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek CONFDB_PAM_FAILED_LOGIN_DELAY,
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek CONFDB_DEFAULT_PAM_FAILED_LOGIN_DELAY,
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek &failed_login_delay);
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek if (ret != EOK) {
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek DEBUG(1, ("Failed to read the failed login delay.\n"));
338af078fcc18126df939f20182acea7a646b7c8Michal Zidek ret = EIO;
e2e334b2f51118cb14c7391c4e4e44ff247ef638Pavel Reichl goto done;
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl }
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl DEBUG(9, ("Failed login attempts [%d], allowed failed login attempts [%d], "
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl "failed login delay [%d].\n", *failed_login_attempts,
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl allowed_failed_login_attempts, failed_login_delay));
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl if (allowed_failed_login_attempts) {
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik if (*failed_login_attempts >= allowed_failed_login_attempts) {
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl if (failed_login_delay) {
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl end = last_failed_login + (failed_login_delay * 60);
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik if (end < time(NULL)) {
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl DEBUG(7, ("failed_login_delay has passed, "
50b8a36b0932a510e825ed1ad8103f81ead2b7d8Pavel Reichl "resetting failed_login_attempts.\n"));
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek *failed_login_attempts = 0;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek } else {
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek DEBUG(7, ("login delayed until %lld.\n", (long long) end));
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek *delayed_until = end;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik ret = EACCES;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik goto done;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik }
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek } else {
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek DEBUG(4, ("Too many failed logins.\n"));
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik ret = EACCES;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik goto done;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik }
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik }
0352c371e743d8dae996123f658b5d32c677614eYassir Elley }
0352c371e743d8dae996123f658b5d32c677614eYassir Elley
0352c371e743d8dae996123f658b5d32c677614eYassir Elley ret = EOK;
0352c371e743d8dae996123f658b5d32c677614eYassir Elleydone:
0352c371e743d8dae996123f658b5d32c677614eYassir Elley talloc_free(tmp_ctx);
0352c371e743d8dae996123f658b5d32c677614eYassir Elley return ret;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik}
0352c371e743d8dae996123f658b5d32c677614eYassir Elley
0352c371e743d8dae996123f658b5d32c677614eYassir Elleyint sysdb_cache_auth(struct sysdb_ctx *sysdb,
0352c371e743d8dae996123f658b5d32c677614eYassir Elley const char *name,
0352c371e743d8dae996123f658b5d32c677614eYassir Elley const uint8_t *authtok,
0352c371e743d8dae996123f658b5d32c677614eYassir Elley size_t authtok_size,
0352c371e743d8dae996123f658b5d32c677614eYassir Elley struct confdb_ctx *cdb,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek bool just_check,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek time_t *_expire_date,
a801d42c4637bbdf9664d0d8b913ffcab81b904eLukas Slebodnik time_t *_delayed_until)
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik{
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik TALLOC_CTX *tmp_ctx;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik const char *attrs[] = { SYSDB_NAME, SYSDB_CACHEDPWD, SYSDB_DISABLED,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek SYSDB_LAST_LOGIN, SYSDB_LAST_ONLINE_AUTH,
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek "lastCachedPasswordChange",
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek "accountExpires", SYSDB_FAILED_LOGIN_ATTEMPTS,
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek SYSDB_LAST_FAILED_LOGIN, NULL };
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek struct ldb_message *ldb_msg;
9e6f8d1c66b4b3543bab67d807bd26f1d6256c75Pavel Březina const char *userhash;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *comphash;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *password = NULL;
7fe7073ad2c84946a699528a3bb79f7803c96b69Sumit Bose uint64_t lastLogin = 0;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int cred_expiration;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose uint32_t failed_login_attempts = 0;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sysdb_attrs *update_attrs;
4f2509f8d23d9e921f07b2ead63392ae82ad3a38Petr Čech bool authentication_successful = false;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose time_t expire_date = -1;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose time_t delayed_until = -1;
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek int ret;
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek int i;
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek if (name == NULL || *name == '\0') {
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek DEBUG(1, ("Missing user name.\n"));
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek return EINVAL;
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek }
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek if (cdb == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(1, ("Missing config db context.\n"));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return EINVAL;
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek }
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (sysdb == NULL) {
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek DEBUG(1, ("Missing sysdb db context.\n"));
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek return EINVAL;
802909e59daa52c734dbe7f8fa13b0ee23e3e576Lukas Slebodnik }
51b5e1475b3e0b7acac34ed382cfaca8411883a4Jakub Hrozek
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek if (!sysdb->domain->cache_credentials) {
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek DEBUG(3, ("Cached credentials not available.\n"));
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek return EINVAL;
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek }
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek tmp_ctx = talloc_new(NULL);
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek if (!tmp_ctx) {
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek return ENOMEM;
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek }
5c36e1f8901a4baff2b51d81d87c2b577f84fef6Lukas Slebodnik
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek ret = ldb_transaction_start(sysdb->ldb);
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek if (ret) {
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek talloc_zfree(tmp_ctx);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret = sysdb_error_to_errno(ret);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek return ret;
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek }
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret = sysdb_search_user_by_name(tmp_ctx, sysdb,
f7ea0b1d46197275c87bdc73a6e38a6fd7f855eePavel Březina name, attrs, &ldb_msg);
676bf6dda60776d9db79dad1c2506c0e57bb5503Pavel Březina if (ret != EOK) {
5dbf360f2d6b0281c32f1bba6ebf5cc834c1716eSimo Sorce DEBUG(1, ("sysdb_search_user_by_name failed [%d][%s].\n",
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret, strerror(ret)));
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek goto done;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek }
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek /* Check offline_auth_cache_timeout */
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek lastLogin = ldb_msg_find_attr_as_uint64(ldb_msg,
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek SYSDB_LAST_ONLINE_AUTH,
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek 0);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek CONFDB_PAM_CRED_TIMEOUT, 0, &cred_expiration);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek if (ret != EOK) {
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek DEBUG(1, ("Failed to read expiration time of offline credentials.\n"));
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek goto done;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek }
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek DEBUG(9, ("Offline credentials expiration is [%d] days.\n",
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek cred_expiration));
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
fb83de0699b16e7d8eca803305e2112795807b4cJakub Hrozek if (cred_expiration) {
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek expire_date = lastLogin + (cred_expiration * 86400);
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek if (expire_date < time(NULL)) {
842f83f8db513214241a0fea076ac160b180e1ddLukas Slebodnik DEBUG(4, ("Cached user entry is too old.\n"));
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek expire_date = 0;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek ret = EACCES;
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek goto done;
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek }
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek } else {
2dcf7b9b65df21f2aee6cdf051a7fbdef6dfe034Jakub Hrozek expire_date = 0;
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek }
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek
3fe339bcba0e211cc666bb3afe34e5c8fce85f4fJakub Hrozek ret = check_failed_login_attempts(cdb, ldb_msg, &failed_login_attempts,
115de6d50f0d0bdd5745a5d8eb0d067be9128528Sumit Bose &delayed_until);
115de6d50f0d0bdd5745a5d8eb0d067be9128528Sumit Bose if (ret != EOK) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek DEBUG(1, ("Failed to check login attempts\n"));
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek goto done;
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek }
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek /* TODO: verify user account (disabled, expired ...) */
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce password = talloc_strndup(tmp_ctx, (const char *)authtok, authtok_size);
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek if (password == NULL) {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina DEBUG(1, ("talloc_strndup failed.\n"));
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina ret = ENOMEM;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina goto done;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina userhash = ldb_msg_find_attr_as_string(ldb_msg, SYSDB_CACHEDPWD, NULL);
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina if (userhash == NULL || *userhash == '\0') {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina DEBUG(4, ("Cached credentials not available.\n"));
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina ret = ENOENT;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina goto done;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina ret = s3crypt_sha512(tmp_ctx, password, userhash, &comphash);
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina if (ret) {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina DEBUG(4, ("Failed to create password hash.\n"));
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina ret = EFAULT;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina goto done;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina update_attrs = sysdb_new_attrs(tmp_ctx);
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina if (update_attrs == NULL) {
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina DEBUG(1, ("sysdb_new_attrs failed.\n"));
770dc892f867639f36f84455d65be6287935a529Jakub Hrozek ret = ENOMEM;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek goto done;
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek }
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek if (strcmp(userhash, comphash) == 0) {
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek /* TODO: probable good point for audit logging */
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek DEBUG(4, ("Hashes do match!\n"));
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek authentication_successful = true;
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek if (just_check) {
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek ret = EOK;
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek goto done;
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek }
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek ret = sysdb_attrs_add_time_t(update_attrs,
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek SYSDB_LAST_LOGIN, time(NULL));
6ea6662287147308b81b9c9f2f1f3c992d01bc50Jakub Hrozek if (ret != EOK) {
a524965fbe0551f1b3a68f1e5c7a5689a652998fSumit Bose DEBUG(3, ("sysdb_attrs_add_time_t failed, "
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek "but authentication is successful.\n"));
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek ret = EOK;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek goto done;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek }
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek ret = sysdb_attrs_add_uint32(update_attrs,
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek SYSDB_FAILED_LOGIN_ATTEMPTS, 0U);
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek if (ret != EOK) {
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek DEBUG(3, ("sysdb_attrs_add_uint32 failed, "
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek "but authentication is successful.\n"));
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek ret = EOK;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek goto done;
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek }
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek
d36f4db9bb5efc63b94190cca25adb08ee56971cJakub Hrozek } else {
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek DEBUG(4, ("Authentication failed.\n"));
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek authentication_successful = false;
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek ret = sysdb_attrs_add_time_t(update_attrs,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek SYSDB_LAST_FAILED_LOGIN,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek time(NULL));
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek if (ret != EOK) {
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek DEBUG(3, ("sysdb_attrs_add_time_t failed\n."));
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek goto done;
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek }
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek ret = sysdb_attrs_add_uint32(update_attrs,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek SYSDB_FAILED_LOGIN_ATTEMPTS,
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek ++failed_login_attempts);
526a15438525417cd701f837d7085b7f8c8a6325Jakub Hrozek if (ret != EOK) {
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose DEBUG(3, ("sysdb_attrs_add_uint32 failed.\n"));
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose goto done;
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose }
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose }
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose ret = sysdb_set_user_attr(sysdb, name, update_attrs, LDB_FLAG_MOD_REPLACE);
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose if (ret) {
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose DEBUG(1, ("Failed to update Login attempt information!\n"));
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose }
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bosedone:
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose if (_expire_date != NULL) {
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose *_expire_date = expire_date;
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose }
49f8ec8e0a3723a748bdb043d6dc1fb2a3977a8aSumit Bose if (_delayed_until != NULL) {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech *_delayed_until = delayed_until;
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech }
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech if (password) for (i = 0; password[i]; i++) password[i] = 0;
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech if (ret) {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech ldb_transaction_cancel(sysdb->ldb);
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech } else {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech ret = ldb_transaction_commit(sysdb->ldb);
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech ret = sysdb_error_to_errno(ret);
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech if (ret) {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech DEBUG(2, ("Failed to commit transaction!\n"));
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech }
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech }
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech if (authentication_successful) {
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech ret = EOK;
27a7dedb0ee4d4b51ca4c196aa894ad30cb3e821Petr Cech } else {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose if (ret == EOK) {
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose ret = EINVAL;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose }
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose talloc_free(tmp_ctx);
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose return ret;
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose}
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose
1d93029624d708119bbf803e6647a2cbb271f001Sumit Boseerrno_t sysdb_update_members(struct sysdb_ctx *sysdb,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose const char *member,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose enum sysdb_member_type type,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose const char *const *add_groups,
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose const char *const *del_groups)
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose{
1d93029624d708119bbf803e6647a2cbb271f001Sumit Bose errno_t ret;
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio errno_t sret;
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio int i;
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio bool in_transaction = false;
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio TALLOC_CTX *tmp_ctx = talloc_new(NULL);
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio if(!tmp_ctx) {
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio return ENOMEM;
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio }
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio ret = sysdb_transaction_start(sysdb);
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio if (ret != EOK) {
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio DEBUG(0, ("Failed to start update transaction\n"));
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio goto done;
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio }
723d514f641e2b5a5cbfe1c6c7bdd2a6f3c5070eFabiano Fidêncio
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose in_transaction = true;
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose if (add_groups) {
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose /* Add the user to all add_groups */
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose for (i = 0; add_groups[i]; i++) {
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose ret = sysdb_add_group_member(sysdb, add_groups[i], member,
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose type);
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose if (ret != EOK) {
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose DEBUG(1, ("Could not add member [%s] to group [%s]. "
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose "Skipping.\n", member, add_groups[i]));
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose /* Continue on, we should try to finish the rest */
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose }
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose }
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose }
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose
c369b062182c746849196e495db467198039edf4Lukas Slebodnik if (del_groups) {
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose /* Remove the user from all del_groups */
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose for (i = 0; del_groups[i]; i++) {
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose ret = sysdb_remove_group_member(sysdb, del_groups[i], member,
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose type);
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose if (ret != EOK) {
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose DEBUG(1, ("Could not remove member [%s] from group [%s]. "
0b78b4e32955ced0f35c6d4685bd277bb03d04cbSumit Bose "Skipping\n", member, del_groups[i]));
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina /* Continue on, we should try to finish the rest */
d43c9d18fb263b1ea4071b20e93ce4994583f62fJakub Hrozek }
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina }
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina }
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina ret = sysdb_transaction_commit(sysdb);
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina if (ret != EOK) {
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina goto done;
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina }
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina in_transaction = false;
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březinadone:
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina if (in_transaction) {
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina sret = sysdb_transaction_cancel(sysdb);
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose if (sret != EOK) {
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose }
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose }
9a9b5e115b079751422be22fd252c0b283611c62Jakub Hrozek talloc_free(tmp_ctx);
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose return ret;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose}
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Boseerrno_t sysdb_add_netgroup_tuple(struct sysdb_ctx *sysdb,
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *netgroup,
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *hostname,
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *username,
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *domainname)
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose{
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose return sysdb_mod_netgroup_tuple(sysdb, netgroup, hostname,
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose username, domainname, SYSDB_MOD_ADD);
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose}
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose
a0ab15ceb80290db80c2052520830a95390de385Sumit Boseerrno_t sysdb_remove_netgroup_tuple(struct sysdb_ctx *sysdb,
b1a822a16e3ef97e31d167f9e97efec06fc121dcJakub Hrozek const char *netgroup,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *hostname,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *username,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *domainname)
9a9b5e115b079751422be22fd252c0b283611c62Jakub Hrozek{
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose return sysdb_mod_netgroup_tuple(sysdb, netgroup, hostname,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose username, domainname, SYSDB_MOD_DEL);
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose}
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose
a0ab15ceb80290db80c2052520830a95390de385Sumit Boseerrno_t sysdb_mod_netgroup_tuple(struct sysdb_ctx *sysdb,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *netgroup,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *hostname,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *username,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose const char *domainname,
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose int mod_op)
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose{
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose errno_t ret;
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose int lret;
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek struct ldb_message *msg;
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek char *triple;
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek msg = ldb_msg_new(NULL);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if (!msg) {
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek ERROR_OUT(ret, ENOMEM, done);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek msg->dn = sysdb_netgroup_dn(sysdb, msg, netgroup);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if (!msg->dn) {
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik ERROR_OUT(ret, ENOMEM, done);
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik }
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik triple = talloc_asprintf(msg, "(%s,%s,%s)",
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik hostname, username, domainname);
843bc50c04afa6e4f4a4561d887bbbd5f7101ce1Sumit Bose if (!triple) {
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek ERROR_OUT(ret, ENOMEM, done);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek ret = add_string(msg, mod_op, SYSDB_NETGROUP_TRIPLE, triple);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek if (ret != EOK) {
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek goto done;
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek }
44703b84feaafa4f0a4f8df11c5a503dcf48616eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek lret = ldb_modify(sysdb->ldb, msg);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek ret = sysdb_error_to_errno(lret);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozekdone:
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik if (ret) {
4d9db278db1197ae84fecb8f269e2de368a6be2aLukas Slebodnik DEBUG(3, ("Error: %d (%s)\n", ret, strerror(ret)));
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek }
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek talloc_free(msg);
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek return ret;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina}
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinaerrno_t sysdb_add_netgroup_member(struct sysdb_ctx *sysdb,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const char *netgroup,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const char *member_netgroup)
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina{
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina return sysdb_mod_netgroup_member(sysdb, netgroup,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina member_netgroup, SYSDB_MOD_ADD);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina}
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinaerrno_t sysdb_remove_netgroup_member(struct sysdb_ctx *sysdb,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const char *netgroup,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const char *member_netgroup)
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina{
e5911e72198df96ec7cfe486ff66363c2297a5f7Simo Sorce return sysdb_mod_netgroup_member(sysdb, netgroup,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina member_netgroup, SYSDB_MOD_DEL);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina}
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březinaerrno_t sysdb_mod_netgroup_member(struct sysdb_ctx *sysdb,
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina const char *netgroup,
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina const char *member_netgroup,
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina int mod_op)
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina{
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina errno_t ret;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina int lret;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina struct ldb_message *msg;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina char *member;
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina msg = ldb_msg_new(NULL);
3a8f6b575f4019f21c9425a26f1b346c08a197aePavel Březina if (!msg) {
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek ERROR_OUT(ret, ENOMEM, done);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek }
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek msg->dn = sysdb_netgroup_dn(sysdb, msg, netgroup);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek if (!msg->dn) {
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek ERROR_OUT(ret, ENOMEM, done);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek }
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek member = talloc_asprintf(msg, SYSDB_TMPL_NETGROUP,
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek member_netgroup, sysdb->domain->name);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek if (!member) {
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek ret = ENOMEM;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek goto done;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek }
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek ret = add_string(msg, mod_op, SYSDB_MEMBER, member);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek if (ret != EOK) {
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek goto done;
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek }
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek lret = ldb_modify(sysdb->ldb, msg);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek ret = sysdb_error_to_errno(lret);
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozekdone:
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek if (ret) {
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek DEBUG(3, ("Error: %d (%s)\n", ret, strerror(ret)));
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek }
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek talloc_free(msg);
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek return ret;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek}
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozekerrno_t sysdb_remove_attrs(struct sysdb_ctx *sysdb,
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek const char *name,
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek enum sysdb_member_type type,
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek char **remove_attrs)
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek{
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek errno_t ret;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek errno_t sret = EOK;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek bool in_transaction = false;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek struct ldb_message *msg;
8df69bbc58c2f4d3f0b34be9756d9ddf24b1db6dJakub Hrozek int lret;
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech size_t i;
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech msg = ldb_msg_new(NULL);
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech if (!msg) return ENOMEM;
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech switch(type) {
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech case SYSDB_MEMBER_USER:
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech msg->dn = sysdb_user_dn(sysdb, msg, name);
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech break;
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech case SYSDB_MEMBER_GROUP:
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech msg->dn = sysdb_group_dn(sysdb, msg, name);
e5d8b0e10238490c5d199063c0a258ba53c2ac65Lukas Slebodnik break;
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech
e5d8b0e10238490c5d199063c0a258ba53c2ac65Lukas Slebodnik case SYSDB_MEMBER_NETGROUP:
e5d8b0e10238490c5d199063c0a258ba53c2ac65Lukas Slebodnik msg->dn = sysdb_netgroup_dn(sysdb, msg, name);
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech break;
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech case SYSDB_MEMBER_SERVICE:
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech msg->dn = sysdb_svc_dn(sysdb, msg, sysdb->domain->name, name);
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech break;
0b7ded15e53b3f31f1570c366f04bc41e5761929Petr Čech }
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech if (!msg->dn) {
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech ret = ENOMEM;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech goto done;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech }
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech ret = sysdb_transaction_start(sysdb);
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech if (ret != EOK) {
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to start transaction\n"));
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech goto done;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech }
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech in_transaction = true;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech for (i = 0; remove_attrs[i]; i++) {
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech /* SYSDB_MEMBEROF is exclusively handled by the memberof plugin */
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech if (strcasecmp(remove_attrs[i], SYSDB_MEMBEROF) == 0) {
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech continue;
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech }
e4d18b748fd8298b5cc6b6687ca05ffffa20c574Petr Cech DEBUG(8, ("Removing attribute [%s] from [%s]\n",
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek remove_attrs[i], name));
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek lret = ldb_msg_add_empty(msg, remove_attrs[i],
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek LDB_FLAG_MOD_DELETE, NULL);
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek if (lret != LDB_SUCCESS) {
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek ret = sysdb_error_to_errno(lret);
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek goto done;
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek }
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek /* We need to do individual modifies so that we can
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek * skip unknown attributes. Otherwise, any nonexistent
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek * attribute in the sysdb will cause other removals to
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek * fail.
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek */
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek lret = ldb_modify(sysdb->ldb, msg);
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek if (lret != LDB_SUCCESS && lret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
89ddc9ed474e9ac2b1e7bccb0a58610babf26cf8Jakub Hrozek ret = sysdb_error_to_errno(lret);
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek goto done;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek /* Remove this attribute and move on to the next one */
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek ldb_msg_remove_attr(msg, remove_attrs[i]);
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek ret = sysdb_transaction_commit(sysdb);
676bf6dda60776d9db79dad1c2506c0e57bb5503Pavel Březina if (ret != EOK) {
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek goto done;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
bee2f31ca5d151b7fe35c509fe7eae24ca4f4451Lukas Slebodnik
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek in_transaction = false;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek ret = EOK;
64ea4127f463798410a2c20e0261c6b15f60257fJakub Hrozekdone:
323943605c88838f1f86a72f891eb28600bb34e2Lukas Slebodnik if (in_transaction) {
db5f9ab3feb85aa444eab20428ca2b98801b6783Jakub Hrozek sret = sysdb_transaction_cancel(sysdb);
db5f9ab3feb85aa444eab20428ca2b98801b6783Jakub Hrozek if (sret != EOK) {
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek }
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek talloc_free(msg);
64ea4127f463798410a2c20e0261c6b15f60257fJakub Hrozek return ret;
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek}
f4025ea817b3467be1c2e6092014a11fe4547c0dJakub Hrozek