sysdb_ops.c revision efc81d1b44169206a2e55bb8e900d3859375abe3
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher/*
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher SSSD
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher System Database
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher
c636315472e4f87313af7be30b7fbcad4b8ca8a4Stephen Gallagher Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher This program is free software; you can redistribute it and/or modify
fd5a4eacd56700ffb08a73121aeacdc806cb0132Sumit Bose it under the terms of the GNU General Public License as published by
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher the Free Software Foundation; either version 3 of the License, or
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher (at your option) any later version.
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher This program is distributed in the hope that it will be useful,
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher but WITHOUT ANY WARRANTY; without even the implied warranty of
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher GNU General Public License for more details.
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher You should have received a copy of the GNU General Public License
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher along with this program. If not, see <http://www.gnu.org/licenses/>.
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher*/
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "util/util.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "db/sysdb_private.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "db/sysdb_services.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "db/sysdb_autofs.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "util/crypto/sss_crypto.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <time.h>
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint add_string(struct ldb_message *msg, int flags,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *attr, const char *value)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose int ret;
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose ret = ldb_msg_add_empty(msg, attr, flags, NULL);
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (ret == LDB_SUCCESS) {
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke ret = ldb_msg_add_string(msg, attr, value);
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (ret == LDB_SUCCESS) return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher return ENOMEM;
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint add_ulong(struct ldb_message *msg, int flags,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *attr, unsigned long value)
d921c1eba437662437847279f251a0a5d8f70127Maxim{
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek 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_fmt(msg, attr, "%lu", value);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == LDB_SUCCESS) return EOK;
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic uint32_t get_attr_as_uint32(struct ldb_message *msg, const char *attr)
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher{
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr);
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek long long int l;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (!v || !v->data) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher return 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher errno = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher l = strtoll((const char *)v->data, NULL, 10);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (errno) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return (uint32_t)-1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
be1ef1c62ad13612be5e1f879476c24452a5d6d0Stephen Gallagher
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek if (l < 0 || l > ((uint32_t)(-1))) {
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek return (uint32_t)-1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher return l;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic int sss_ldb_modify_permissive(struct ldb_context *ldb,
558998ce664055a75595371118f818084d8f2b23Jan Cholasta struct ldb_message *msg)
558998ce664055a75595371118f818084d8f2b23Jan Cholasta{
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta struct ldb_request *req;
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta int ret = EOK;
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholasta ret = ldb_build_mod_req(&req, ldb, ldb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher NULL,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher NULL,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_op_default_callback,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != LDB_SUCCESS) return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = ldb_request_add_control(req, LDB_CONTROL_PERMISSIVE_MODIFY_OID,
f1828234a850dd28465425248a83a993f262918fPavel Březina false, NULL);
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay if (ret != LDB_SUCCESS) {
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay talloc_free(req);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_request(ldb, req);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == LDB_SUCCESS) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_wait(req->handle, LDB_WAIT_ALL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina talloc_free(req);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#define ERROR_OUT(v, r, l) do { v = r; goto l; } while(0)
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta/* =Remove-Entry-From-Sysdb=============================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Boseint sysdb_delete_entry(struct sysdb_ctx *sysdb,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose struct ldb_dn *dn,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose bool ignore_not_found)
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = ldb_delete(sysdb->ldb, dn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher switch (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case LDB_SUCCESS:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case LDB_ERR_NO_SUCH_OBJECT:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ignore_not_found) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* fall through */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher default:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(1, ("LDB Error: %s(%d)\nError Message: [%s]\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb)));
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher return sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek}
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
fe60346714a73ac3987f786731389320633dd245Pavel Březina/* =Remove-Subentries-From-Sysdb=========================================== */
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Boseint sysdb_delete_recursive(struct sysdb_ctx *sysdb,
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose struct ldb_dn *dn,
e5e8252ec48bfdd4e7529debc705c8e090264b9aSumit Bose bool ignore_not_found)
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina{
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher const char *no_attrs[] = { NULL };
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina struct ldb_message **msgs;
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina size_t msgs_count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int i;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek TALLOC_CTX *tmp_ctx;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh tmp_ctx = talloc_new(NULL);
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh if (!tmp_ctx) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ENOMEM;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek }
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ret = ldb_transaction_start(sysdb->ldb);
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose if (ret) {
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek ret = sysdb_error_to_errno(ret);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek goto done;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher LDB_SCOPE_SUBTREE, "(distinguishedName=*)",
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek no_attrs, &msgs_count, &msgs);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ignore_not_found && ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EOK;
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher }
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher if (ret) {
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher DEBUG(6, ("Search error: %d (%s)\n", ret, strerror(ret)));
fa551077410019fb34460dc730950e93b62b2963Jakub Hrozek }
fa551077410019fb34460dc730950e93b62b2963Jakub Hrozek goto done;
fa551077410019fb34460dc730950e93b62b2963Jakub Hrozek }
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher DEBUG(9, ("Found [%d] items to delete.\n", msgs_count));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher qsort(msgs, msgs_count,
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek sizeof(struct ldb_message *), compare_ldb_dn_comp_num);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < msgs_count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(9 ,("Trying to delete [%s].\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_dn_get_linearized(msgs[i]->dn)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_delete_entry(sysdb, msgs[i]->dn, false);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_transaction_cancel(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose talloc_free(tmp_ctx);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose return ret;
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose}
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke/* =Search-Entry========================================================== */
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzkeint sysdb_search_entry(TALLOC_CTX *mem_ctx,
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke struct sysdb_ctx *sysdb,
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke struct ldb_dn *base_dn,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher int scope,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher const char *filter,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t *msgs_count,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message ***msgs)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan Cholasta struct ldb_result *res;
b35f20cd8ecdc8308a3201e55752fb0443ec6ae4Jan Cholasta int ret;
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan Cholasta
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ret = ldb_search(sysdb->ldb, mem_ctx, &res,
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek base_dn, scope, attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter?"%s":NULL, filter);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return sysdb_error_to_errno(ret);
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan Cholasta }
b35f20cd8ecdc8308a3201e55752fb0443ec6ae4Jan Cholasta
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan Cholasta *msgs_count = res->count;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek *msgs = talloc_steal(mem_ctx, res->msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (res->count == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOENT;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
3b1df539835367cb81cd5ff0f9959947d5642e55Stephen Gallagher
3b1df539835367cb81cd5ff0f9959947d5642e55Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Search-User-by-[UID/NAME]============================================= */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagherint sysdb_search_user_by_name(TALLOC_CTX *mem_ctx,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char **attrs,
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek struct ldb_message **msg)
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose{
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose TALLOC_CTX *tmp_ctx;
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose 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 int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher tmp_ctx = talloc_new(NULL);
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher if (!tmp_ctx) {
15b266d9f14dad26da8678a79019749d0f69532eStephen Gallagher return ENOMEM;
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher }
b97595ae059c69b1960a6e7e56d74660388a683bJan Zeleny
6a6a821866091e0f722808566c25b951aa346d7cStephen Gallagher basedn = sysdb_user_dn(sysdb, tmp_ctx, domain, name);
48d7840cae22c5ff4d786149b0d8ecee7efb8306Lukas Slebodnik if (!basedn) {
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose ret = ENOMEM;
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_BASE, NULL,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen 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]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_search_user_by_uid(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uid_t uid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher 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;
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Bose char *filter;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher int ret;
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce SYSDB_TMPL_USER_BASE, domain->name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!basedn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
0ef783e186ef1c9f60e61a4e8e54c44cb366fdfePavel Březina
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek filter = talloc_asprintf(tmp_ctx, SYSDB_PWUID_FILTER, (unsigned long)uid);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (!filter) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Use SUBTREE scope here, not ONELEVEL
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * There is a bug in LDB that makes ONELEVEL searches extremely
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * slow (it ignores indexing)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_SUBTREE, filter,
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny attrs?attrs:def_attrs, &msgs_count, &msgs);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
db78f4c750943fcd4b60bca5f3fdfd6cc5d3d4f8Ondrej Kos if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek }
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek else if (ret) {
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek }
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březina return ret;
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březina}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Search-Group-by-[GID/NAME]============================================ */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_search_group_by_name(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name,
77d165f0629966db65753a3aee84a8b4971673afPavel Březina const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msg)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher static const char *def_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t msgs_count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher basedn = sysdb_group_dn(sysdb, tmp_ctx, domain, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!basedn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_BASE, NULL,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs?attrs:def_attrs, &msgs_count, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Boseint sysdb_search_group_by_gid(TALLOC_CTX *mem_ctx,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid_t gid,
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msg)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek 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;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
3a4186ae40d0c3b7be46a4c973166f6048fcfe38Lukas Slebodnik return ENOMEM;
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny SYSDB_TMPL_GROUP_BASE, domain->name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!basedn) {
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny }
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta filter = talloc_asprintf(tmp_ctx, SYSDB_GRGID_FILTER, (unsigned long)gid);
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos if (!filter) {
701f13b5c8e27bcbfc79e77ce7c76d9f768a448cLukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce /* Use SUBTREE scope here, not ONELEVEL
5f90993426fa2bdc3b3d994c9e85e0805bb92bbcSimo Sorce * There is a bug in LDB that makes ONELEVEL searches extremely
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek * slow (it ignores indexing)
7452f1b637276ce582b120f8f5482ae7f3b6bd47Jakub Hrozek */
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_SUBTREE, filter,
2fa8d6655ac37f9bdeb34420000052d921f4a543Michal Zidek attrs?attrs:def_attrs, &msgs_count, &msgs);
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *msg = talloc_steal(mem_ctx, msgs[0]);
e850be1ff2e13bba9812c94c3d102c0a0b570820Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher }
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher else if (ret) {
8c3a4809b3420657289b42f028a1c9019b112991Stephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Search-Group-by-Name============================================ */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_search_netgroup_by_name(TALLOC_CTX *mem_ctx,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek struct sysdb_ctx *sysdb,
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek struct sss_domain_info *domain,
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char **attrs,
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher struct ldb_message **msg)
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher static const char *def_attrs[] = { SYSDB_NAME, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t msgs_count = 0;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek int ret;
ac47e8854f3bc404f2a35c6682faf621673d6b32Pavel Březina
b79e0e50a935d108173ca3062f2afe16103fcb1dPavel Březina tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
f9961e5f82e0ef474d6492371bfdf9e74e208a99Pavel Březina return ENOMEM;
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher basedn = sysdb_netgroup_dn(sysdb, tmp_ctx, domain, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!basedn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
3441d0c2d11aea0c39b009751a1898333c009674Stephen Gallagher goto done;
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, basedn, LDB_SCOPE_BASE, NULL,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs?attrs:def_attrs, &msgs_count, &msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
4af1d1869d659fec84c518c26844132fa1df8f64Jakub Hrozek }
e9eeb4302e0e426c6cc1a4e65b95a6f7066e80b9Pavel Březina
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *msg = talloc_steal(mem_ctx, msgs[0]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagherdone:
ae8d047122c7ba8123f72b2eac68944868ac37d4Stephen Gallagher if (ret == ENOENT) {
fae99bfe4bfc8b4a12e9c2a0ad01b3684c22f934Simo Sorce DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek else if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
213ce2a78b1abe3921d8dc13c949a28130d00aecJan Zeleny }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
38e2ec1c757955ab557fd95807afa58042d09482Jan Zeleny return ret;
ad07ed37b6b51ef134d4524edaf2259e19ac984fJan Zeleny}
1a853121ca2ba8ede6df429ee76942131ffb0f65Jan Zeleny
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Replace-Attributes-On-Entry=========================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
81165faf5d951aca69f410713730c26ff048ec44Sumit Boseint sysdb_set_entry_attr(struct sysdb_ctx *sysdb,
3a62a99faf8e12965100d0b26fc9e07752bd3e2dStephen Gallagher struct ldb_dn *entry_dn,
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta struct sysdb_attrs *attrs,
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher int mod_op)
88275cccddf39892e01682b39b02292eb74729bdPavel Březina{
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina 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;
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta }
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher if (!entry_dn || attrs->num == 0) {
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher ret = EINVAL;
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose goto done;
e293fba4f5459f3c2dad254dcc966407d8fc3312Jakub Hrozek }
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta msg = ldb_msg_new(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!msg) {
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek ret = ENOMEM;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek goto done;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek }
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek
374bf54785365273b20690bd3792c25a44738041Pavel Březina msg->dn = entry_dn;
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher msg->elements = talloc_array(msg, struct ldb_message_element, attrs->num);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (!msg->elements) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = ENOMEM;
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher goto done;
374bf54785365273b20690bd3792c25a44738041Pavel Březina }
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher
374bf54785365273b20690bd3792c25a44738041Pavel Březina for (i = 0; i < attrs->num; i++) {
374bf54785365273b20690bd3792c25a44738041Pavel Březina msg->elements[i] = attrs->a[i];
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik msg->elements[i].flags = mod_op;
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik }
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik msg->num_elements = attrs->num;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek lret = ldb_modify(sysdb->ldb, msg);
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek if (lret != LDB_SUCCESS) {
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek ("ldb_modify failed: [%s]\n", ldb_strerror(lret)));
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_error_to_errno(lret);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagherdone:
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret == ENOENT) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt else if (ret) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher }
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher talloc_zfree(tmp_ctx);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return ret;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher}
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher/* =Replace-Attributes-On-User============================================ */
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagherint sysdb_set_user_attr(struct sysdb_ctx *sysdb,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct sss_domain_info *domain,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher const char *name,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct sysdb_attrs *attrs,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher int mod_op)
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny{
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *dn;
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher TALLOC_CTX *tmp_ctx;
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek errno_t ret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose tmp_ctx = talloc_new(NULL);
817b1bcafff27cc67630dd0cbd36df708c05fcccStephen Gallagher if (!tmp_ctx) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return ENOMEM;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher dn = sysdb_user_dn(sysdb, tmp_ctx, domain, name);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!dn) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = ENOMEM;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret != EOK) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = EOK;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagherdone:
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher talloc_zfree(tmp_ctx);
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny return ret;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek}
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek/* =Replace-Attributes-On-Group=========================================== */
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zelenyint sysdb_set_group_attr(struct sysdb_ctx *sysdb,
0a55f903a1da319338fdcf147efa01ed22f9710dMichal Zidek struct sss_domain_info *domain,
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce const char *name,
22d381367c27910fe82f476a76b9f4ede555e35aLukas Slebodnik struct sysdb_attrs *attrs,
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos int mod_op)
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina{
de38d860e39585486e3ccbb42555196e319c7efdSumit Bose struct ldb_dn *dn;
de38d860e39585486e3ccbb42555196e319c7efdSumit Bose TALLOC_CTX *tmp_ctx;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher errno_t ret;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik tmp_ctx = talloc_new(NULL);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (!tmp_ctx) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = ENOMEM;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek goto done;
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta }
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta dn = sysdb_group_dn(sysdb, tmp_ctx, domain, name);
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta if (!dn) {
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta ret = ENOMEM;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
fd98a28d6e94080e52bbedc789b06606a6019b10Lukas Slebodnik ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto done;
fd98a28d6e94080e52bbedc789b06606a6019b10Lukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = EOK;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagherdone:
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher talloc_free(tmp_ctx);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher return ret;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher}
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher/* =Replace-Attributes-On-Netgroup=========================================== */
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardtint sysdb_set_netgroup_attr(struct sysdb_ctx *sysdb,
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher struct sss_domain_info *domain,
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose const char *name,
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose struct sysdb_attrs *attrs,
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose int mod_op)
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek{
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek errno_t ret;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose struct ldb_dn *dn;
3cbbfb4b05d0eb0a0809704e83589d0075e117a0Sumit Bose TALLOC_CTX *tmp_ctx;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose tmp_ctx = talloc_new(NULL);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (!tmp_ctx) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ENOMEM;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt dn = sysdb_netgroup_dn(sysdb, tmp_ctx, domain, name);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (!dn) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = ENOMEM;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bosedone:
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Get-New-ID============================================================ */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_get_new_id(struct sysdb_ctx *sysdb,
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos struct sss_domain_info *domain,
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos uint32_t *_id)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik const char *attrs_1[] = { SYSDB_NEXTID, NULL };
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher const char *attrs_2[] = { SYSDB_UIDNUM, SYSDB_GIDNUM, NULL };
e369fc08906383e6d5c39832f31bb6600a33f887Simo Sorce struct ldb_dn *base_dn;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik char *filter;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t new_id = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **msgs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher uint32_t id;
8c3a4809b3420657289b42f028a1c9019b112991Stephen Gallagher int ret;
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return ENOMEM;
f427b36b0cecc426856ab3f77a9c684ac355659dSumit Bose }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher base_dn = sysdb_domain_dn(sysdb, tmp_ctx, domain);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!base_dn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher ret = ldb_transaction_start(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return ret;
300c772767c1b12077cac1d148ac89738b058f97Jan Zeleny }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, base_dn, LDB_SCOPE_BASE,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina SYSDB_NEXTID_FILTER, attrs_1, &count, &msgs);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina switch (ret) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina case EOK:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina new_id = get_attr_as_uint32(msgs[0], SYSDB_NEXTID);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (new_id == (uint32_t)(-1)) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina DEBUG(1, ("Invalid Next ID in domain %s\n", domain->name));
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = ERANGE;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (new_id < domain->id_min) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina new_id = domain->id_min;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if ((domain->id_max != 0) && (new_id > domain->id_max)) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to allocate new id, out of range (%u/%u)\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek new_id, domain->id_max));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = ERANGE;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto done;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek break;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek case ENOENT:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* looks like the domain is not initialized yet, use min_id */
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta new_id = domain->id_min;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta break;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
b42b5d5aaf4da165582e73ad985fdff6e34e61e4Jakub Hrozek default:
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta goto done;
bd03e67c9d2fc4ad0275e7a573385ee5b7b9307aJan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta talloc_zfree(msgs);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta count = 0;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta /* verify the id is actually really free.
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta * search all entries with id >= new_id and < max_id */
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (domain->id_max) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose filter = talloc_asprintf(tmp_ctx,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose "(|(&(%s>=%u)(%s<=%u))(&(%s>=%u)(%s<=%u)))",
e3f0014bb64b7e93979948936cf93cf869d3dc44Jan Zeleny SYSDB_UIDNUM, new_id,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose SYSDB_UIDNUM, domain->id_max,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose SYSDB_GIDNUM, new_id,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose SYSDB_GIDNUM, domain->id_max);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose else {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose filter = talloc_asprintf(tmp_ctx,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose "(|(%s>=%u)(%s>=%u))",
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose SYSDB_UIDNUM, new_id,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose SYSDB_GIDNUM, new_id);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (!filter) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose DEBUG(6, ("Error: Out of memory\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, base_dn, LDB_SCOPE_SUBTREE,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek filter, attrs_2, &count, &msgs);
ac47e8854f3bc404f2a35c6682faf621673d6b32Pavel Březina switch (ret) {
b79e0e50a935d108173ca3062f2afe16103fcb1dPavel Březina /* if anything was found, find the maximum and increment past it */
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher case EOK:
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher for (i = 0; i < count; i++) {
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik id = get_attr_as_uint32(msgs[i], SYSDB_UIDNUM);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (id != (uint32_t)(-1)) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (id > new_id) new_id = id;
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik 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;
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek new_id++;
52e0894fd65bff4715c88330eb62b28e1635228fStephen Gallagher
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher /* check again we are not falling out of range */
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek if ((domain->id_max != 0) && (new_id > domain->id_max)) {
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek DEBUG(0, ("Failed to allocate new id, out of range (%u/%u)\n",
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek new_id, domain->id_max));
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek ret = ERANGE;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
8a07521b413a3b5879f824e1872c5770c92ee5c0Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case ENOENT:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher default:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(msgs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* finally store the new next id */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg = ldb_msg_new(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!msg) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik DEBUG(6, ("Error: Out of memory\n"));
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg->dn = base_dn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek ret = add_ulong(msg, LDB_FLAG_MOD_REPLACE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher SYSDB_NEXTID, new_id + 1);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret) {
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce goto done;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce ret = ldb_modify(sysdb->ldb, msg);
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce ret = sysdb_error_to_errno(ret);
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *_id = new_id;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_error_to_errno(ret);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ldb_transaction_cancel(sysdb->ldb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik talloc_zfree(tmp_ctx);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt return ret;
a9eff330a7fbd231e8cc28a6828a1e5014ddb0d2Michal Zidek}
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Add-Basic-User-NO-CHECKS============================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozekint sysdb_add_basic_user(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik const char *name,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt uid_t uid, gid_t gid,
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek const char *gecos,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt const char *homedir,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *shell)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt tmp_ctx = talloc_new(NULL);
2c0a971010596c122d7a0c0d76c8eb85f16f6d06Jakub Hrozek if (!tmp_ctx) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg = ldb_msg_new(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!msg) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto done;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny /* user dn */
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny msg->dn = sysdb_user_dn(sysdb, msg, domain, name);
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek if (!msg->dn) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ERROR_OUT(ret, ENOMEM, done);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS, SYSDB_USER_CLASS);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret) goto done;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
f1828234a850dd28465425248a83a993f262918fPavel Březina ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
f1828234a850dd28465425248a83a993f262918fPavel Březina if (ret) goto done;
f1828234a850dd28465425248a83a993f262918fPavel Březina
f1828234a850dd28465425248a83a993f262918fPavel Březina ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_UIDNUM, (unsigned long)uid);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret) goto done;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
f1828234a850dd28465425248a83a993f262918fPavel Březina ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_GIDNUM, (unsigned long)gid);
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay if (ret) goto done;
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay /* We set gecos to be the same as fullname on user creation,
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay * But we will not enforce coherency after that, it's up to
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik * admins to decide if they want to keep it in sync if they change
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik * one of the 2 */
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay if (gecos && *gecos) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_FULLNAME, gecos);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina if (ret) goto done;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_GECOS, gecos);
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina if (ret) goto done;
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina }
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina if (homedir && *homedir) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_HOMEDIR, homedir);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina if (ret) goto done;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholasta if (shell && *shell) {
558998ce664055a75595371118f818084d8f2b23Jan Cholasta ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_SHELL, shell);
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta if (ret) goto done;
558998ce664055a75595371118f818084d8f2b23Jan Cholasta }
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholasta /* creation time */
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt (unsigned long)time(NULL));
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta if (ret) goto done;
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta ret = ldb_add(sysdb->ldb, msg);
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta ret = sysdb_error_to_errno(ret);
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholastadone:
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta if (ret) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
558998ce664055a75595371118f818084d8f2b23Jan Cholasta talloc_zfree(tmp_ctx);
558998ce664055a75595371118f818084d8f2b23Jan Cholasta return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic errno_t
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bosesysdb_remove_ghost_from_group(struct sysdb_ctx *sysdb,
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose struct ldb_message *group,
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose struct ldb_message_element *alias_el,
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose const char *name,
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose const char *orig_dn,
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose const char *userdn)
f74d7744f1b12fe0492eadfc8cf30afcb4092e40Lukas Slebodnik{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message_element *orig_members;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik bool add_member = false;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik errno_t ret = EOK;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik tmp_ctx = talloc_new(NULL);
25c394fc9d09aa7f58700e67b942aba86505934aLukas Slebodnik if (!tmp_ctx) {
25c394fc9d09aa7f58700e67b942aba86505934aLukas Slebodnik return ENOENT;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher msg = ldb_msg_new(tmp_ctx);
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik if (!msg) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ERROR_OUT(ret, ENOMEM, done);
f74d7744f1b12fe0492eadfc8cf30afcb4092e40Lukas Slebodnik }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce msg->dn = group->dn;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (orig_dn == NULL) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce /* We have no way of telling which groups this user belongs to.
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce * Add it to all that reference it in the ghost attribute */
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce add_member = true;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce } else {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce add_member = false;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce orig_members = ldb_msg_find_element(group, SYSDB_ORIG_MEMBER);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (orig_members) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce for (i = 0; i < orig_members->num_values; i++) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (strcmp((const char *) orig_members->values[i].data,
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce orig_dn) == 0) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce /* This is a direct member. Add the member attribute */
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce add_member = true;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce } else {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce /* Nothing to compare the originalDN with. Let's rely on the
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce * memberof plugin to do the right thing during initgroups..
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce */
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce add_member = true;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (add_member) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_MEMBER, userdn);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (ret) goto done;
16c351625346b3193e1762027e5215ab76042127Sumit Bose }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = add_string(msg, LDB_FLAG_MOD_DELETE, SYSDB_GHOST, name);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Delete aliases from the ghost attribute as well */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < alias_el->num_values; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strcmp((const char *)alias_el->values[i].data, name) == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher continue;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = ldb_msg_add_string(msg, SYSDB_GHOST,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (char *) alias_el->values[i].data);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != LDB_SUCCESS) {
16c351625346b3193e1762027e5215ab76042127Sumit Bose ERROR_OUT(ret, EINVAL, done);
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek }
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek }
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek ret = sss_ldb_modify_permissive(sysdb->ldb, msg);
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek ret = sysdb_error_to_errno(ret);
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek if (ret != EOK) {
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek goto done;
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek talloc_zfree(msg);
25f8fac2489fd209d603acb2b494f7c72968e9bbMichal Zidek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic errno_t
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghersysdb_remove_ghostattr_from_groups(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *orig_dn,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct sysdb_attrs *attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message **groups;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message_element *alias_el;
a70e88f62e8ba48c5042b881f20ed6586cb135a8Simo Sorce struct ldb_dn *tmpdn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *group_attrs[] = {SYSDB_NAME, SYSDB_GHOST, SYSDB_ORIG_MEMBER, NULL};
5843ad321944a028f6dee7e1fd4f9381c4953d07Sumit Bose const char *userdn;
fd8595874aa06c8057740001ec465ba76b4af142Jakub Hrozek char *filter;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher errno_t ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t group_count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int i;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce return ENOENT;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter = talloc_asprintf(tmp_ctx, "(|(%s=%s)", SYSDB_GHOST, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!filter) {
c8b8901b05da9e31dba320f305ec20301e928cfbSumit Bose ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_attrs_get_el(attrs, SYSDB_NAME_ALIAS, &alias_el);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < alias_el->num_values; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strcmp((const char *)alias_el->values[i].data, name) == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher continue;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter = talloc_asprintf_append(filter, "(%s=%s)",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher SYSDB_GHOST, alias_el->values[i].data);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (filter == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter = talloc_asprintf_append(filter, ")");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (filter == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmpdn = sysdb_user_dn(sysdb, tmp_ctx, sysdb->domain, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmpdn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ERROR_OUT(ret, ENOMEM, done);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher userdn = ldb_dn_get_linearized(tmpdn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!userdn) {
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek ERROR_OUT(ret, EINVAL, done);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmpdn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmpdn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
22d381367c27910fe82f476a76b9f4ede555e35aLukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* We need to find all groups that contain this object as a ghost user
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * and replace the ghost user by actual member record in direct parents.
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Note that this object can be referred to either by its name or any
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * of its aliases
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, tmpdn, LDB_SCOPE_SUBTREE, filter,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher group_attrs, &group_count, &groups);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK && ret != ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < group_count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher sysdb_remove_ghost_from_group(sysdb, groups[i], alias_el, name, orig_dn, userdn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_free(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Add-User-Function===================================================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_add_user(struct sysdb_ctx *sysdb,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uid_t uid, gid_t gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *gecos,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *homedir,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *shell,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *orig_dn,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik struct sysdb_attrs *attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int cache_timeout,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher time_t now)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct sysdb_attrs *id_attrs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t id;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *domain = sysdb->domain;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (sysdb->mpg) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (gid != 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(0, ("Cannot add user with arbitrary GID in MPG domain!\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EINVAL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid = uid;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (domain->id_max != 0 && uid != 0 &&
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (uid < domain->id_min || uid > domain->id_max)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(2, ("Supplied uid [%d] is not in the allowed range [%d-%d].\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uid, domain->id_min, domain->id_max));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ERANGE;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce }
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (domain->id_max != 0 && gid != 0 &&
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher (gid < domain->id_min || gid > domain->id_max)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(2, ("Supplied gid [%d] is not in the allowed range [%d-%d].\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher gid, domain->id_min, domain->id_max));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ERANGE;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
fe2091327ff44f80d6681c261494e4432404e9baStephen 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 talloc_free(tmp_ctx);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (sysdb->mpg) {
35872dc24058c5e8028cb4082fd405a27835dcd1Jakub Hrozek /* In MPG domains you can't have groups with the same name as users,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * search if a group with the same name exists.
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Don't worry about users, if we try to add a user with the same
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * name the operation will fail */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_group_by_name(tmp_ctx, sysdb, domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher name, NULL, &msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != ENOENT) {
c51f7a064b0d7ef86110bdeb6dc09fa6c08be7d3Jakub Hrozek if (ret == EOK) ret = EEXIST;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher /* check no other user with the same uid exist */
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (uid != 0) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher ret = sysdb_search_user_by_uid(tmp_ctx, sysdb, domain,
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher uid, NULL, &msg);
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (ret != ENOENT) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (ret == EOK) ret = EEXIST;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher goto done;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
d35ff4d0db1cd87c94091a85846b46e4732b1eeePavel Březina /* try to add the user */
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek ret = sysdb_add_basic_user(sysdb, domain, name,
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek uid, gid, gecos, homedir, shell);
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek if (ret) goto done;
584eda085e83a428f2c39dadf0d7adeaff5c87f4Jakub Hrozek
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek if (uid == 0) {
0cf0e2d758d09e9b314ba72ce6638df10b258462Pavel Březina ret = sysdb_get_new_id(sysdb, domain, &id);
0cf0e2d758d09e9b314ba72ce6638df10b258462Pavel Březina if (ret) goto done;
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher id_attrs = sysdb_new_attrs(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!id_attrs) {
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek ret = ENOMEM;
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik ret = sysdb_attrs_add_uint32(id_attrs, SYSDB_UIDNUM, id);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (sysdb->mpg) {
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek ret = sysdb_attrs_add_uint32(id_attrs, SYSDB_GIDNUM, id);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (ret) goto done;
c0bca1722d6f9dfb654ad78397be70f79ff39af1Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_user_attr(sysdb, domain, name,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher id_attrs, SYSDB_MOD_REP);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs = sysdb_new_attrs(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
fe60346714a73ac3987f786731389320633dd245Pavel Březina }
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina
2de495aed26bf75a750a76ca73b9f85d341fe1c5Pavel Březina if (!now) {
fe60346714a73ac3987f786731389320633dd245Pavel Březina now = time(NULL);
fe60346714a73ac3987f786731389320633dd245Pavel Březina }
fe60346714a73ac3987f786731389320633dd245Pavel Březina
fe60346714a73ac3987f786731389320633dd245Pavel Březina ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
fe60346714a73ac3987f786731389320633dd245Pavel Březina if (ret) goto done;
fe60346714a73ac3987f786731389320633dd245Pavel Březina
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
fe60346714a73ac3987f786731389320633dd245Pavel Březina ((cache_timeout) ?
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek (now + cache_timeout) : 0));
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (ret) goto done;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ret = sysdb_set_user_attr(sysdb, domain, name, attrs, SYSDB_MOD_REP);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (ret) goto done;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek /* remove all ghost users */
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ret = sysdb_remove_ghostattr_from_groups(sysdb, orig_dn, attrs, name);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (ret) goto done;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek ret = EOK;
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozekdone:
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek if (ret == EOK) {
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ret = sysdb_error_to_errno(ret);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher } else {
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ldb_transaction_cancel(sysdb->ldb);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher talloc_zfree(tmp_ctx);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher return ret;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher}
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher/* =Add-Basic-Group-NO-CHECKS============================================= */
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Boseint sysdb_add_basic_group(struct sysdb_ctx *sysdb,
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose const char *name, gid_t gid)
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose{
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose struct ldb_message *msg;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose int ret;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose TALLOC_CTX *tmp_ctx;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose tmp_ctx = talloc_new(NULL);
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose if (!tmp_ctx) {
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose return ENOMEM;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose }
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose msg = ldb_msg_new(tmp_ctx);
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose if (!msg) {
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose ret = ENOMEM;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose goto done;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose }
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose /* group dn */
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose msg->dn = sysdb_group_dn(sysdb, msg, sysdb->domain, name);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (!msg->dn) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ERROR_OUT(ret, ENOMEM, done);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS, SYSDB_GROUP_CLASS);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_GIDNUM, (unsigned long)gid);
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek if (ret) goto done;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek /* creation time */
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek (unsigned long)time(NULL));
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek if (ret) goto done;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
fd8595874aa06c8057740001ec465ba76b4af142Jakub Hrozek ret = ldb_add(sysdb->ldb, msg);
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek ret = sysdb_error_to_errno(ret);
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
f232789430a080384188d5da89b19d874cf17513Jakub Hrozekdone:
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek if (ret) {
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek }
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek talloc_zfree(tmp_ctx);
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce return ret;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce}
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek/* =Add-Group-Function==================================================== */
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
f232789430a080384188d5da89b19d874cf17513Jakub Hrozekint sysdb_add_group(struct sysdb_ctx *sysdb,
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce const char *name, gid_t gid,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik struct sysdb_attrs *attrs,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek int cache_timeout,
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek time_t now)
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek{
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek TALLOC_CTX *tmp_ctx;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek struct ldb_message *msg;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek uint32_t id;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek int ret;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek bool posix;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek struct sss_domain_info *domain = sysdb->domain;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
16c351625346b3193e1762027e5215ab76042127Sumit Bose if (domain->id_max != 0 && gid != 0 &&
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek (gid < domain->id_min || gid > domain->id_max)) {
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek DEBUG(2, ("Supplied gid [%d] is not in the allowed range [%d-%d].\n",
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek gid, domain->id_min, domain->id_max));
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek return ERANGE;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek tmp_ctx = talloc_new(NULL);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (!tmp_ctx) {
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek return ENOMEM;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek ret = ldb_transaction_start(sysdb->ldb);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (ret) {
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek ret = sysdb_error_to_errno(ret);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek talloc_free(tmp_ctx);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek return ret;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek }
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (sysdb->mpg) {
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik /* In MPG domains you can't have groups with the same name as users,
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik * search if a group with the same name exists.
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik * Don't worry about users, if we try to add a user with the same
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh * name the operation will fail */
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh ret = sysdb_search_user_by_name(tmp_ctx, sysdb, domain,
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh name, NULL, &msg);
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh if (ret != ENOENT) {
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh if (ret == EOK) ret = EEXIST;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh goto done;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh }
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh }
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce /* check no other groups with the same gid exist */
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh if (gid != 0) {
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh ret = sysdb_search_group_by_gid(tmp_ctx, sysdb, domain,
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh gid, NULL, &msg);
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh if (ret != ENOENT) {
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce if (ret == EOK) ret = EEXIST;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik goto done;
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh }
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh }
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh
25255e4d0e1517a5d443e8fee22e91862e255702Abhishek Singh /* try to add the group */
25255e4d0e1517a5d443e8fee22e91862e255702Abhishek Singh ret = sysdb_add_basic_group(sysdb, name, gid);
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh if (ret) goto done;
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh if (!attrs) {
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh attrs = sysdb_new_attrs(tmp_ctx);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (!attrs) {
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik ret = ENOMEM;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik goto done;
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik }
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik }
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik ret = sysdb_attrs_get_bool(attrs, SYSDB_POSIX, &posix);
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik if (ret == ENOENT) {
d65f692d7b7639ed8ba0f5cffa4f88b68056739aLukas Slebodnik posix = true;
16c351625346b3193e1762027e5215ab76042127Sumit Bose ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, true);
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek if (ret) goto done;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek } else if (ret != EOK) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek goto done;
04868f1573f4b26ef34610b6d7069172f93bd8abJakub Hrozek }
04868f1573f4b26ef34610b6d7069172f93bd8abJakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (posix && gid == 0) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ret = sysdb_get_new_id(sysdb, domain, &id);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (ret) goto done;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, id);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (ret) goto done;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek }
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek if (!now) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek now = time(NULL);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek if (ret) goto done;
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek ((cache_timeout) ?
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek (now + cache_timeout) : 0));
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek if (ret) goto done;
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik ret = sysdb_set_group_attr(sysdb, domain, name, attrs, SYSDB_MOD_REP);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnikdone:
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek if (ret == EOK) {
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ret = ldb_transaction_commit(sysdb->ldb);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ret = sysdb_error_to_errno(ret);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose } else {
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ldb_transaction_cancel(sysdb->ldb);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose }
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik talloc_zfree(tmp_ctx);
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose return ret;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose}
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Boseint sysdb_add_incomplete_group(struct sysdb_ctx *sysdb,
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose const char *name,
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose gid_t gid,
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose const char *original_dn,
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose bool posix,
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose time_t now)
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose{
221619d8e8d7cf269c55482e5f466f6511ed35adLukas Slebodnik TALLOC_CTX *tmp_ctx;
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose int ret;
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose struct sysdb_attrs *attrs;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek tmp_ctx = talloc_new(NULL);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek if (!tmp_ctx) {
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek return ENOMEM;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek }
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek /* try to add the group */
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek ret = sysdb_add_basic_group(sysdb, name, gid);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek if (ret) goto done;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek attrs = sysdb_new_attrs(tmp_ctx);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek if (!attrs) {
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek ret = ENOMEM;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek goto done;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek }
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek if (!now) {
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek now = time(NULL);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek }
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek if (ret) goto done;
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek now-1);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (ret) goto done;
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_bool(attrs, SYSDB_POSIX, posix);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina if (ret) goto done;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina if (original_dn) {
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek ret = sysdb_attrs_add_string(attrs, SYSDB_ORIG_DN, original_dn);
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek if (ret) goto done;
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek }
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_group_attr(sysdb, sysdb->domain, name, attrs, SYSDB_MOD_REP);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherdone:
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek if (ret != EOK) {
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher }
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher talloc_zfree(tmp_ctx);
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher return ret;
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek}
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek/* =Add-Or-Remove-Group-Memeber=========================================== */
6e8238868a4d17030bb4f01494961d0354a953bfJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* mod_op must be either SYSDB_MOD_ADD or SYSDB_MOD_DEL */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_mod_group_member(struct sysdb_ctx *sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *member_dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *group_dn,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int mod_op)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
f1ac7d7859b26f0f36f5e8ffacda609f8ece80e5Stephen Gallagher const char *dn;
f1ac7d7859b26f0f36f5e8ffacda609f8ece80e5Stephen Gallagher int ret;
f128b7b865062da662127712935dcc58bd022384Stephen Gallagher
cc7ee57f3adada83ac657e69636ca995d5b6948eStephen Gallagher msg = ldb_msg_new(NULL);
f128b7b865062da662127712935dcc58bd022384Stephen Gallagher if (!msg) {
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce ERROR_OUT(ret, ENOMEM, fail);
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce }
3a4186ae40d0c3b7be46a4c973166f6048fcfe38Lukas Slebodnik
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce msg->dn = group_dn;
1171986bdc3011555c5b62a9d9ee9f7481f48cdcSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_MEMBER, mod_op, NULL);
10eae23e2483733d4ca3c21f15b5bdb3f04c9839Simo Sorce if (ret != LDB_SUCCESS) {
5f216c753dbd2f2b25a011c5f705ee4f8ad924e6Simo Sorce ERROR_OUT(ret, ENOMEM, fail);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dn = ldb_dn_get_linearized(member_dn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!dn) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ERROR_OUT(ret, EINVAL, fail);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_msg_add_string(msg, SYSDB_MEMBER, dn);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != LDB_SUCCESS) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ERROR_OUT(ret, EINVAL, fail);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
2b7349575770521243a34611e97d73790946a961Stephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardtfail:
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek if (ret) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek/* =Add-Basic-Netgroup-NO-CHECKS============================================= */
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozekint sysdb_add_basic_netgroup(struct sysdb_ctx *sysdb,
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek const char *name, const char *description)
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek{
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek struct ldb_message *msg;
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek int ret;
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek msg = ldb_msg_new(NULL);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (!msg) {
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt return ENOMEM;
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek }
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina /* netgroup dn */
42870c7ac3608ffc58f2c9524ad3dfc1401bc1aaPavel Březina msg->dn = sysdb_netgroup_dn(sysdb, msg, sysdb->domain, name);
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek if (!msg->dn) {
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek ERROR_OUT(ret, ENOMEM, done);
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek }
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_ADD,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek SYSDB_OBJECTCLASS, SYSDB_NETGROUP_CLASS);
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek if (ret) goto done;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, name);
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek if (ret) goto done;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek if (description && *description) {
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek ret = add_string(msg, LDB_FLAG_MOD_ADD,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt SYSDB_DESCRIPTION, description);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt if (ret) goto done;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek }
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek /* creation time */
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek (unsigned long) time(NULL));
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ldb_add(sysdb->ldb, msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozekdone:
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek }
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek talloc_zfree(msg);
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek return ret;
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Add-Netgroup-Function==================================================== */
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagherint sysdb_add_netgroup(struct sysdb_ctx *sysdb,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *description,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek char **missing,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int cache_timeout,
619bd403265ce0880989ba6f8324b010949851bcSumit Bose time_t now)
796463906a54e259bd5b582ce84af4297a58eafcStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
f26c954658dfd7461f290f0b5d924951a6db219aJan Zeleny if (!tmp_ctx) {
f26c954658dfd7461f290f0b5d924951a6db219aJan Zeleny return ENOMEM;
755aee449c6311518200c2f11c1aae329a19b038Pavel Březina }
97ae45d61d921f07e812620e0156aee02b7b83a7Stephen Gallagher
f26c954658dfd7461f290f0b5d924951a6db219aJan Zeleny ret = ldb_transaction_start(sysdb->ldb);
d42d371c00c83ae44b9d1c3e88ecbe0e01b112e6Stephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_error_to_errno(ret);
619bd403265ce0880989ba6f8324b010949851bcSumit Bose talloc_free(tmp_ctx);
796463906a54e259bd5b582ce84af4297a58eafcStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* try to add the netgroup */
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher ret = sysdb_add_basic_netgroup(sysdb, name, description);
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher if (ret && ret != EEXIST) goto done;
ae8d047122c7ba8123f72b2eac68944868ac37d4Stephen Gallagher
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina if (!attrs) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek attrs = sysdb_new_attrs(tmp_ctx);
7b5e7e539ae9312ab55d75aa94feaad549b2a708Pavel Březina if (!attrs) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ret = ENOMEM;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher goto done;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (!now) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher now = time(NULL);
0ca19d792b717456f334abdf35279acddf6d71c2Pavel Březina }
c407643004a02566e35a864ba0d8b0c0f88d9d67Pavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (ret) goto done;
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ((cache_timeout) ?
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher (now + cache_timeout) : 0));
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (ret) goto done;
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ret = sysdb_set_netgroup_attr(sysdb, sysdb->domain, name, attrs, SYSDB_MOD_REP);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (missing) {
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher ret = sysdb_remove_attrs(sysdb, name,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher SYSDB_MEMBER_NETGROUP,
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher missing);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (ret != EOK) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE, ("Could not remove missing attributes\n"));
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagherdone:
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (ret == EOK) {
3441d0c2d11aea0c39b009751a1898333c009674Stephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
3441d0c2d11aea0c39b009751a1898333c009674Stephen Gallagher ret = sysdb_error_to_errno(ret);
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher }
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (ret != EOK) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ldb_transaction_cancel(sysdb->ldb);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher }
7a468783159880f81f7cd9270ee94bf0954d6a56Simo Sorce talloc_zfree(tmp_ctx);
93109c5f1d85c028ce5cf6e31e2249ca90a7f746Jakub Hrozek return ret;
fd8595874aa06c8057740001ec465ba76b4af142Jakub Hrozek}
a70e88f62e8ba48c5042b881f20ed6586cb135a8Simo Sorce
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Store-Users-(Native/Legacy)-(replaces-existing-data)================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* if one of the basic attributes is empty ("") as opposed to NULL,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * this will just remove it */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorceint sysdb_store_user(struct sysdb_ctx *sysdb,
41402c003fef1e6768f5468dd7ea2e20e16bfa19Benjamin Franzke const char *name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *pwd,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uid_t uid, gid_t gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *gecos,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *homedir,
88aeed9a31b734a92630d5e881c960c5f77ba0ceJakub Hrozek const char *shell,
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce const char *orig_dn,
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher struct sysdb_attrs *attrs,
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher char **remove_attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint64_t cache_timeout,
e92ecf948387d1687a5e772ac86e606b1b6af957Stephen Gallagher time_t now)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_message *msg;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher errno_t sret = EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool in_transaction = false;
04feeade1f6259368a6b23c6b3ecbad261161659Sumit Bose
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs = sysdb_new_attrs(tmp_ctx);
e92ecf948387d1687a5e772ac86e606b1b6af957Stephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
225d845476b6136be9b77f528ed986bba7a7f732Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (pwd && (sysdb->domain->legacy_passwords || !*pwd)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_PWD, pwd);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
e92ecf948387d1687a5e772ac86e606b1b6af957Stephen Gallagher ret = sysdb_transaction_start(sysdb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to start transaction\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher in_transaction = true;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_search_user_by_name(tmp_ctx, sysdb, sysdb->domain,
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce name, NULL, &msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret && ret != ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* get transaction timestamp */
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!now) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher now = time(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
e92ecf948387d1687a5e772ac86e606b1b6af957Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen 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) {
213ce2a78b1abe3921d8dc13c949a28130d00aecJan Zeleny /* This may be a user rename. If there is a user with the
8b1f2574ce7a964965a18ab047ab09c4694380c4Jan Zeleny * same UID, remove it and try to add the basic user again
e526b608657f229f7486b3aa8c53b0f2c53b42b1Jan Zeleny */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_delete_user(sysdb, NULL, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Not found by UID, return the original EEXIST,
ad07ed37b6b51ef134d4524edaf2259e19ac984fJan Zeleny * this may be a conflict in MPG domain or something
81165faf5d951aca69f410713730c26ff048ec44Sumit Bose * else */
881c4ba834b23ae651ac01db667801f314eb0a5dJan Zeleny ret = EEXIST;
caee9828ee30609e9f433957dbb3d0163390a207Sumit Bose goto fail;
36a12aea020a935ffa40505fa02860c3d921ad0cSumit Bose } else if (ret != EOK) {
e134a6af42102c8d865e82bf89e0b8c5a40fb5faStephen Gallagher goto fail;
e134a6af42102c8d865e82bf89e0b8c5a40fb5faStephen Gallagher }
e134a6af42102c8d865e82bf89e0b8c5a40fb5faStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
71ad247500b417836a1a2edec257a4433a7c415fJan Zeleny ("A user with the same UID [%llu] was removed from the "
e134a6af42102c8d865e82bf89e0b8c5a40fb5faStephen Gallagher "cache\n", (unsigned long long) uid));
e134a6af42102c8d865e82bf89e0b8c5a40fb5faStephen Gallagher ret = sysdb_add_user(sysdb, name, uid, gid, gecos, homedir,
e134a6af42102c8d865e82bf89e0b8c5a40fb5faStephen Gallagher shell, orig_dn, attrs, cache_timeout, now);
38e2ec1c757955ab557fd95807afa58042d09482Jan Zeleny }
1a853121ca2ba8ede6df429ee76942131ffb0f65Jan Zeleny
88275cccddf39892e01682b39b02292eb74729bdPavel Březina /* Handle the result of sysdb_add_user */
8ff0aba893d8da1a8163ccaf9ad2c5b6bccd121fSumit Bose if (ret == EOK) {
f8a4a5f6240156809e1b5ef03816f673281e3fa0Jakub Hrozek goto done;
f8a4a5f6240156809e1b5ef03816f673281e3fa0Jakub Hrozek } else {
f8a4a5f6240156809e1b5ef03816f673281e3fa0Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Could not add user\n"));
f8a4a5f6240156809e1b5ef03816f673281e3fa0Jakub Hrozek goto fail;
f8a4a5f6240156809e1b5ef03816f673281e3fa0Jakub Hrozek }
31ad608192c24eb56cf7a8294f6bfc080893193cJakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* the user exists, let's just replace attributes when set */
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (uid) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_UIDNUM, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce
41402c003fef1e6768f5468dd7ea2e20e16bfa19Benjamin Franzke if (gid) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, gid);
3275c56e7b5dd36d25e0a971bf90c70179f0ab8fLukas Slebodnik if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce if (uid && !gid && sysdb->mpg) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
f8a4a5f6240156809e1b5ef03816f673281e3fa0Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
88aeed9a31b734a92630d5e881c960c5f77ba0ceJakub Hrozek if (gecos) {
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_GECOS, gecos);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (ret) goto fail;
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher }
505e75ba28b42bb3de7a6d55de825091b70cc2b2Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (homedir) {
e92ecf948387d1687a5e772ac86e606b1b6af957Stephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_HOMEDIR, homedir);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (shell) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sysdb_attrs_add_string(attrs, SYSDB_SHELL, shell);
92ae9d2b909d0fd4a522a270157926878b5d0862Stephen Gallagher if (ret) goto fail;
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik }
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik if (ret) goto fail;
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta ((cache_timeout) ?
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta (now + cache_timeout) : 0));
dfea410202f366924f32662a91331660f1c143bbJakub Hrozek if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher ret = sysdb_set_user_attr(sysdb, sysdb->domain, name, attrs, SYSDB_MOD_REP);
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (ret != EOK) goto fail;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if (remove_attrs) {
74e95cfd9d3939dfe9417d79d2f6fc79b361405fJakub Hrozek ret = sysdb_remove_attrs(sysdb, name,
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher SYSDB_MEMBER_USER,
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher remove_attrs);
a4cce2c98eedecb5d3b47da62104634cae268434Stephen Gallagher if (ret != EOK) {
a4cce2c98eedecb5d3b47da62104634cae268434Stephen Gallagher DEBUG(4, ("Could not remove missing attributes\n"));
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina }
4cdaf239d4504966bed8ecd5e3fa07def74c7302Sumit Bose
4cdaf239d4504966bed8ecd5e3fa07def74c7302Sumit Bosedone:
31ad608192c24eb56cf7a8294f6bfc080893193cJakub Hrozek ret = sysdb_transaction_commit(sysdb);
31ad608192c24eb56cf7a8294f6bfc080893193cJakub Hrozek if (ret != EOK) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher goto fail;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher in_transaction = false;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherfail:
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce if (in_transaction) {
41402c003fef1e6768f5468dd7ea2e20e16bfa19Benjamin Franzke sret = sysdb_transaction_cancel(sysdb);
c3889e5a101a075defe533d81f5296d5e680f639Lukas Slebodnik if (sret != EOK) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina }
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce if (ret) {
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
c3889e5a101a075defe533d81f5296d5e680f639Lukas Slebodnik }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher talloc_zfree(tmp_ctx);
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher return ret;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher}
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher/* =Store-Group-(Native/Legacy)-(replaces-existing-data)================== */
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher/* this function does not check that all user members are actually present */
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherint sysdb_store_group(struct sysdb_ctx *sysdb,
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher const char *name,
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher gid_t gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_attrs *attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint64_t cache_timeout,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher time_t now)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx;
6a9bdb6289bb374d203861cef16f312185725cbcPavel Zuna static const char *src_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM,
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek SYSDB_ORIG_MODSTAMP, NULL };
64af76e2bef2565caa9738f675c108a4b3789237Simo Sorce struct ldb_message *msg;
6a9bdb6289bb374d203861cef16f312185725cbcPavel Zuna bool new_group = false;
dca03a97f4e1532ee2f2cbd26b1538ab6ccf18f7Sumit Bose int ret;
dca03a97f4e1532ee2f2cbd26b1538ab6ccf18f7Sumit Bose
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher ret = sysdb_search_group_by_name(tmp_ctx, sysdb, sysdb->domain,
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher name, src_attrs, &msg);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret && ret != ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
6a9bdb6289bb374d203861cef16f312185725cbcPavel Zuna if (ret == ENOENT) {
dca03a97f4e1532ee2f2cbd26b1538ab6ccf18f7Sumit Bose new_group = true;
dca03a97f4e1532ee2f2cbd26b1538ab6ccf18f7Sumit Bose }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs = sysdb_new_attrs(tmp_ctx);
6a9bdb6289bb374d203861cef16f312185725cbcPavel Zuna if (!attrs) {
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek ret = ENOMEM;
64af76e2bef2565caa9738f675c108a4b3789237Simo Sorce goto done;
6a9bdb6289bb374d203861cef16f312185725cbcPavel Zuna }
6a9bdb6289bb374d203861cef16f312185725cbcPavel Zuna }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* get transaction timestamp */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!now) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher now = time(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher /* FIXME: use the remote modification timestamp to know if the
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * group needs any update */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (new_group) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* group doesn't exist, turn into adding a group */
6a9bdb6289bb374d203861cef16f312185725cbcPavel Zuna ret = sysdb_add_group(sysdb, name, gid, attrs, cache_timeout, now);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == EEXIST) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* This may be a group rename. If there is a group with the
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * same GID, remove it and try to add the basic group again
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_delete_group(sysdb, NULL, gid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == ENOENT) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Not found by GID, return the original EEXIST,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * this may be a conflict in MPG domain or something
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * else */
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return EEXIST;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik } else if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
adc4351a04cef89ced2dbb240180e5d00fd8dd3cStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
adc4351a04cef89ced2dbb240180e5d00fd8dd3cStephen Gallagher ("A group with the same GID [%llu] was removed from the "
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "cache\n", (unsigned long long) gid));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_add_group(sysdb, name, gid, attrs, cache_timeout, now);
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher goto done;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* the group exists, let's just replace attributes when set */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (gid) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, gid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
9d7d4458d94d0aac0a7edf999368eb18f89cb76aJakub Hrozek if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ((cache_timeout) ?
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (now + cache_timeout) : 0));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_group_attr(sysdb, sysdb->domain, name, attrs, SYSDB_MOD_REP);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bosedone:
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose if (ret) {
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose }
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose talloc_zfree(tmp_ctx);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose return ret;
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose}
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek/* =Add-User-to-Group(Native/Legacy)====================================== */
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardtstatic int
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardtsysdb_group_membership_mod(struct sysdb_ctx *sysdb,
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose const char *group,
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose const char *member,
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose enum sysdb_member_type type,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int modify_op)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *group_dn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *member_dn;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ENOMEM;
4b60fd691cc04455810d15da4f7f4044b92b07b3Alexander Bokovoy }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if (type == SYSDB_MEMBER_USER) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher member_dn = sysdb_user_dn(sysdb, tmp_ctx, sysdb->domain, member);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else if (type == SYSDB_MEMBER_GROUP) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher member_dn = sysdb_group_dn(sysdb, tmp_ctx, sysdb->domain, member);
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek } else {
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek ret = EINVAL;
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek goto done;
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek }
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek if (!member_dn) {
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek ret = ENOMEM;
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek goto done;
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek }
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek group_dn = sysdb_group_dn(sysdb, tmp_ctx, sysdb->domain, group);
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek if (!group_dn) {
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose ret = ENOMEM;
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose goto done;
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose }
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose ret = sysdb_mod_group_member(sysdb, member_dn, group_dn, modify_op);
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose
60e51fd2764291df2332f36ff478777627d92b57Sumit Bosedone:
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose talloc_free(tmp_ctx);
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose return ret;
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose}
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose
60e51fd2764291df2332f36ff478777627d92b57Sumit Boseint sysdb_add_group_member(struct sysdb_ctx *sysdb,
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek const char *group,
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose const char *member,
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose enum sysdb_member_type type)
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose{
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose return sysdb_group_membership_mod(sysdb, group, member, type, SYSDB_MOD_ADD);
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose}
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose/* =Remove-member-from-Group(Native/Legacy)=============================== */
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Boseint sysdb_remove_group_member(struct sysdb_ctx *sysdb,
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose const char *group,
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose const char *member,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher enum sysdb_member_type type)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke return sysdb_group_membership_mod(sysdb, group, member, type, SYSDB_MOD_DEL);
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke}
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke/* =Password-Caching====================================================== */
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzkeint sysdb_cache_password(struct sysdb_ctx *sysdb,
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke const char *username,
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke const char *password)
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke{
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke TALLOC_CTX *tmp_ctx;
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke struct sysdb_attrs *attrs;
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke char *hash = NULL;
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek char *salt;
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek int ret;
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek tmp_ctx = talloc_new(NULL);
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher if (!tmp_ctx) {
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek return ENOMEM;
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher }
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek ret = s3crypt_gen_salt(tmp_ctx, &salt);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(4, ("Failed to generate random salt.\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek ret = s3crypt_sha512(tmp_ctx, password, salt, &hash);
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (ret) {
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek DEBUG(4, ("Failed to create password hash.\n"));
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek goto fail;
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher attrs = sysdb_new_attrs(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!attrs) {
0d7e647da737b71a7dbbe0bb5f94af18017e5aa9Maxim ERROR_OUT(ret, ENOMEM, fail);
0d7e647da737b71a7dbbe0bb5f94af18017e5aa9Maxim }
0d7e647da737b71a7dbbe0bb5f94af18017e5aa9Maxim
0d7e647da737b71a7dbbe0bb5f94af18017e5aa9Maxim ret = sysdb_attrs_add_string(attrs, SYSDB_CACHEDPWD, hash);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* FIXME: should we use a different attribute for chache passwords ?? */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_long(attrs, "lastCachedPasswordChange",
0d7e647da737b71a7dbbe0bb5f94af18017e5aa9Maxim (long)time(NULL));
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_uint32(attrs, SYSDB_FAILED_LOGIN_ATTEMPTS, 0U);
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher if (ret) goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_set_user_attr(sysdb, sysdb->domain,
03532fb1cbb7e8c1d5cf2e93aa3719f926631cabStephen Gallagher username, attrs, SYSDB_MOD_REP);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EOK;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherfail:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
558998ce664055a75595371118f818084d8f2b23Jan Cholasta talloc_zfree(tmp_ctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* =Custom Search================== */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint sysdb_search_custom(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sysdb_ctx *sysdb,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher const char *filter,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *subtree_name,
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher const char **attrs,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t *msgs_count,
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce struct ldb_message ***msgs)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ldb_dn *basedn;
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek int ret;
7197ce636c2b92152f5f6180bef6bda3752d148dJakub Hrozek
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek if (filter == NULL || subtree_name == NULL) {
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek return EINVAL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher basedn = sysdb_custom_subtree_dn(sysdb, mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher sysdb->domain, subtree_name);
8782e92079a2842955e04392d20605453de6d567Stephen Gallagher if (basedn == NULL) {
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose DEBUG(1, ("sysdb_custom_subtree_dn failed.\n"));
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ENOMEM;
f660877b38e563c4aa0cb1431624069808873fecJakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!ldb_dn_validate(basedn)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(1, ("Failed to create DN.\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EINVAL;
f660877b38e563c4aa0cb1431624069808873fecJakub Hrozek }
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher LDB_SCOPE_SUBTREE, filter, attrs,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher msgs_count, msgs);
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher return ret;
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher}
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagherint sysdb_search_custom_by_name(TALLOC_CTX *mem_ctx,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher struct sysdb_ctx *sysdb,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher const char *object_name,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher const char *subtree_name,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher const char **attrs,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher size_t *_count,
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher struct ldb_message ***_msgs)
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher{
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher TALLOC_CTX *tmp_ctx;
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher struct ldb_dn *basedn;
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher struct ldb_message **msgs;
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher size_t count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher if (object_name == NULL || subtree_name == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EINVAL;
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher tmp_ctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tmp_ctx) {
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher return ENOMEM;
374bf54785365273b20690bd3792c25a44738041Pavel Březina }
374bf54785365273b20690bd3792c25a44738041Pavel Březina
374bf54785365273b20690bd3792c25a44738041Pavel Březina basedn = sysdb_custom_dn(sysdb, tmp_ctx,
374bf54785365273b20690bd3792c25a44738041Pavel Březina sysdb->domain, object_name, subtree_name);
374bf54785365273b20690bd3792c25a44738041Pavel Březina if (basedn == NULL) {
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek DEBUG(1, ("sysdb_custom_dn failed.\n"));
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek ret = ENOMEM;
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek goto done;
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek }
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (!ldb_dn_validate(basedn)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(1, ("Failed to create DN.\n"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EINVAL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher ret = sysdb_search_entry(tmp_ctx, sysdb, basedn,
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher LDB_SCOPE_BASE, NULL, attrs, &count, &msgs);
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen 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"));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = EFAULT;
374bf54785365273b20690bd3792c25a44738041Pavel Březina goto done;
374bf54785365273b20690bd3792c25a44738041Pavel Březina }
374bf54785365273b20690bd3792c25a44738041Pavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *_count = count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher *_msgs = talloc_move(mem_ctx, &msgs);
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagherdone:
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher talloc_zfree(tmp_ctx);
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher return ret;
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher}
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher/* =Custom Store (replaces-existing-data)================== */
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagherint sysdb_store_custom(struct sysdb_ctx *sysdb,
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher const char *object_name,
374bf54785365273b20690bd3792c25a44738041Pavel Březina const char *subtree_name,
374bf54785365273b20690bd3792c25a44738041Pavel Březina struct sysdb_attrs *attrs)
374bf54785365273b20690bd3792c25a44738041Pavel Březina{
21f28bdbab10881b9fb0b890dfa15af429326606Sumit Bose TALLOC_CTX *tmp_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *search_attrs[] = { "*", NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher 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;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (object_name == NULL || subtree_name == NULL) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return EINVAL;
f1fab7b8210af4ae94453265b607e2dab06789caStephen Gallagher }
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher ret = ldb_transaction_start(sysdb->ldb);
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher if (ret) {
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher return sysdb_error_to_errno(ret);
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher }
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher tmp_ctx = talloc_new(NULL);
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher if (!tmp_ctx) {
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher ret = ENOMEM;
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher goto done;
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher }
78e5b91e6b22efbcd0621144b104ac9dfd487e5bJakub Hrozek
78395373edc3fcf62847de2c630b656967222901Stephen Gallagher ret = sysdb_search_custom_by_name(tmp_ctx, sysdb,
78395373edc3fcf62847de2c630b656967222901Stephen Gallagher object_name, subtree_name,
78395373edc3fcf62847de2c630b656967222901Stephen Gallagher search_attrs, &resp_count, &resp);
78395373edc3fcf62847de2c630b656967222901Stephen Gallagher if (ret != EOK && ret != ENOENT) {
78395373edc3fcf62847de2c630b656967222901Stephen Gallagher goto done;
78395373edc3fcf62847de2c630b656967222901Stephen Gallagher }
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher if (ret == ENOENT) {
78e5b91e6b22efbcd0621144b104ac9dfd487e5bJakub Hrozek add_object = true;
78e5b91e6b22efbcd0621144b104ac9dfd487e5bJakub Hrozek }
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher msg = ldb_msg_new(tmp_ctx);
263e4574dacb4b7d2a18d5d42122bf3dce4c45b0Stephen Gallagher if (msg == NULL) {
78fe240e7c47f45c87cdfba0107fca6390401137Stephen Gallagher ret = ENOMEM;
78fe240e7c47f45c87cdfba0107fca6390401137Stephen Gallagher goto done;
78fe240e7c47f45c87cdfba0107fca6390401137Stephen Gallagher }
13147b598a8409c338abb9472e74bbd606f224bdStephen Gallagher
78fe240e7c47f45c87cdfba0107fca6390401137Stephen Gallagher msg->dn = sysdb_custom_dn(sysdb, tmp_ctx,
78fe240e7c47f45c87cdfba0107fca6390401137Stephen Gallagher sysdb->domain, object_name, subtree_name);
cc751fbea9f05c7ce151f4c82afb6585d4b846bbStephen Gallagher if (!msg->dn) {
78e5b91e6b22efbcd0621144b104ac9dfd487e5bJakub Hrozek DEBUG(1, ("sysdb_custom_dn failed.\n"));
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher ret = ENOMEM;
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher goto done;
78e5b91e6b22efbcd0621144b104ac9dfd487e5bJakub Hrozek }
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher msg->elements = talloc_array(msg, struct ldb_message_element, attrs->num);
e9ea1b4e59384cdfe3accdf31e5c579c3dad5591Stephen Gallagher if (!msg->elements) {
1df8e4158e752f1f010394d09e8a5e4f8201fd7eStephen Gallagher ret = ENOMEM;
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher goto done;
13147b598a8409c338abb9472e74bbd606f224bdStephen Gallagher }
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher
13147b598a8409c338abb9472e74bbd606f224bdStephen Gallagher for (i = 0; i < attrs->num; i++) {
13147b598a8409c338abb9472e74bbd606f224bdStephen Gallagher msg->elements[i] = attrs->a[i];
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher if (add_object) {
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher msg->elements[i].flags = LDB_FLAG_MOD_ADD;
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher } else {
el = ldb_msg_find_element(resp[0], attrs->a[i].name);
if (el == NULL) {
msg->elements[i].flags = LDB_FLAG_MOD_ADD;
} else {
msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;
}
}
}
msg->num_elements = attrs->num;
if (add_object) {
ret = ldb_add(sysdb->ldb, msg);
} else {
ret = ldb_modify(sysdb->ldb, msg);
}
if (ret != LDB_SUCCESS) {
DEBUG(1, ("Failed to store custom entry: %s(%d)[%s]\n",
ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb)));
ret = sysdb_error_to_errno(ret);
}
done:
if (ret) {
DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
ldb_transaction_cancel(sysdb->ldb);
} else {
ret = ldb_transaction_commit(sysdb->ldb);
ret = sysdb_error_to_errno(ret);
}
talloc_zfree(tmp_ctx);
return ret;
}
/* = Custom Delete======================================= */
int sysdb_delete_custom(struct sysdb_ctx *sysdb,
const char *object_name,
const char *subtree_name)
{
TALLOC_CTX *tmp_ctx;
struct ldb_dn *dn;
int ret;
if (object_name == NULL || subtree_name == NULL) {
return EINVAL;
}
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
dn = sysdb_custom_dn(sysdb, tmp_ctx,
sysdb->domain, object_name, subtree_name);
if (dn == NULL) {
DEBUG(1, ("sysdb_custom_dn failed.\n"));
ret = ENOMEM;
goto done;
}
ret = ldb_delete(sysdb->ldb, dn);
switch (ret) {
case LDB_SUCCESS:
case LDB_ERR_NO_SUCH_OBJECT:
ret = EOK;
break;
default:
DEBUG(1, ("LDB Error: %s(%d)\nError Message: [%s]\n",
ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb)));
ret = sysdb_error_to_errno(ret);
break;
}
done:
talloc_zfree(tmp_ctx);
return ret;
}
/* = ASQ search request ======================================== */
int sysdb_asq_search(TALLOC_CTX *mem_ctx,
struct sysdb_ctx *sysdb,
struct ldb_dn *base_dn,
const char *expression,
const char *asq_attribute,
const char **attrs,
size_t *msgs_count,
struct ldb_message ***msgs)
{
TALLOC_CTX *tmp_ctx;
struct ldb_request *ldb_req;
struct ldb_control **ctrl;
struct ldb_asq_control *asq_control;
struct ldb_result *res;
int ret;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
ctrl = talloc_array(tmp_ctx, struct ldb_control *, 2);
if (ctrl == NULL) {
ret = ENOMEM;
goto fail;
}
ctrl[0] = talloc(ctrl, struct ldb_control);
if (ctrl[0] == NULL) {
ret = ENOMEM;
goto fail;
}
ctrl[1] = NULL;
ctrl[0]->oid = LDB_CONTROL_ASQ_OID;
ctrl[0]->critical = 1;
asq_control = talloc(ctrl[0], struct ldb_asq_control);
if (asq_control == NULL) {
ret = ENOMEM;
goto fail;
}
asq_control->request = 1;
asq_control->source_attribute = talloc_strdup(asq_control, asq_attribute);
if (asq_control->source_attribute == NULL) {
ret = ENOMEM;
goto fail;
}
asq_control->src_attr_len = strlen(asq_control->source_attribute);
ctrl[0]->data = asq_control;
res = talloc_zero(tmp_ctx, struct ldb_result);
if (!res) {
ret = ENOMEM;
goto fail;
}
ret = ldb_build_search_req(&ldb_req, sysdb->ldb, tmp_ctx,
base_dn, LDB_SCOPE_BASE,
expression, attrs, ctrl,
res, ldb_search_default_callback, NULL);
if (ret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(ret);
goto fail;
}
ret = ldb_request(sysdb->ldb, ldb_req);
if (ret == LDB_SUCCESS) {
ret = ldb_wait(ldb_req->handle, LDB_WAIT_ALL);
}
if (ret) {
ret = sysdb_error_to_errno(ret);
goto fail;
}
*msgs_count = res->count;
*msgs = talloc_move(mem_ctx, &res->msgs);
talloc_zfree(tmp_ctx);
return EOK;
fail:
if (ret == ENOENT) {
DEBUG(SSSDBG_TRACE_FUNC, ("No such entry\n"));
}
else if (ret) {
DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
}
talloc_zfree(tmp_ctx);
return ret;
}
/* =Search-Users-with-Custom-Filter====================================== */
int sysdb_search_users(TALLOC_CTX *mem_ctx,
struct sysdb_ctx *sysdb,
const char *sub_filter,
const char **attrs,
size_t *msgs_count,
struct ldb_message ***msgs)
{
TALLOC_CTX *tmp_ctx;
struct ldb_dn *basedn;
char *filter;
int ret;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
SYSDB_TMPL_USER_BASE, sysdb->domain->name);
if (!basedn) {
DEBUG(2, ("Failed to build base dn\n"));
ret = ENOMEM;
goto fail;
}
filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_UC, sub_filter);
if (!filter) {
DEBUG(2, ("Failed to build filter\n"));
ret = ENOMEM;
goto fail;
}
DEBUG(SSSDBG_TRACE_INTERNAL,
("Search users with filter: %s\n", filter));
ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
LDB_SCOPE_SUBTREE, filter, attrs,
msgs_count, msgs);
if (ret) {
goto fail;
}
talloc_zfree(tmp_ctx);
return EOK;
fail:
if (ret == ENOENT) {
DEBUG(SSSDBG_TRACE_INTERNAL, ("No such entry\n"));
}
else if (ret) {
DEBUG(SSSDBG_MINOR_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
}
talloc_zfree(tmp_ctx);
return ret;
}
/* =Delete-User-by-Name-OR-uid============================================ */
int sysdb_delete_user(struct sysdb_ctx *sysdb,
const char *name, uid_t uid)
{
TALLOC_CTX *tmp_ctx;
const char *attrs[] = {SYSDB_GHOST, NULL};
size_t msg_count;
char *filter;
struct ldb_message **msgs;
struct ldb_message *msg;
int ret;
int i;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
if (name) {
ret = sysdb_search_user_by_name(tmp_ctx, sysdb, sysdb->domain,
name, NULL, &msg);
} else {
ret = sysdb_search_user_by_uid(tmp_ctx, sysdb, sysdb->domain,
uid, NULL, &msg);
}
if (ret == EOK) {
if (name && uid) {
/* verify name/gid match */
const char *c_name;
uint64_t c_uid;
c_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
c_uid = ldb_msg_find_attr_as_uint64(msg, SYSDB_UIDNUM, 0);
if (c_name == NULL || c_uid == 0) {
DEBUG(2, ("Attribute is missing but this should never happen!\n"));
ret = EFAULT;
goto fail;
}
if (strcmp(name, c_name) || uid != c_uid) {
/* this is not the entry we are looking for */
ret = EINVAL;
goto fail;
}
}
ret = sysdb_delete_entry(sysdb, msg->dn, false);
if (ret) {
goto fail;
}
} else if (ret == ENOENT && name != NULL) {
/* Perhaps a ghost user? */
filter = talloc_asprintf(tmp_ctx, "(%s=%s)", SYSDB_GHOST, name);
if (filter == NULL) {
ret = ENOMEM;
goto fail;
}
ret = sysdb_search_groups(tmp_ctx, sysdb, filter, attrs, &msg_count, &msgs);
if (ret != EOK) {
goto fail;
}
for (i = 0; i < msg_count; i++) {
msg = ldb_msg_new(tmp_ctx);
if (!msg) {
ERROR_OUT(ret, ENOMEM, fail);
}
msg->dn = msgs[i]->dn;
ret = add_string(msg, LDB_FLAG_MOD_DELETE, SYSDB_GHOST, name);
if (ret) goto fail;
ret = ldb_modify(sysdb->ldb, msg);
ret = sysdb_error_to_errno(ret);
if (ret != EOK) {
goto fail;
}
talloc_zfree(msg);
}
} else {
goto fail;
}
talloc_zfree(tmp_ctx);
return EOK;
fail:
DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
talloc_zfree(tmp_ctx);
return ret;
}
/* =Search-Groups-with-Custom-Filter===================================== */
int sysdb_search_groups(TALLOC_CTX *mem_ctx,
struct sysdb_ctx *sysdb,
const char *sub_filter,
const char **attrs,
size_t *msgs_count,
struct ldb_message ***msgs)
{
TALLOC_CTX *tmp_ctx;
struct ldb_dn *basedn;
char *filter;
int ret;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
SYSDB_TMPL_GROUP_BASE, sysdb->domain->name);
if (!basedn) {
DEBUG(2, ("Failed to build base dn\n"));
ret = ENOMEM;
goto fail;
}
filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_GC, sub_filter);
if (!filter) {
DEBUG(2, ("Failed to build filter\n"));
ret = ENOMEM;
goto fail;
}
DEBUG(SSSDBG_TRACE_INTERNAL,
("Search groups with filter: %s\n", filter));
ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
LDB_SCOPE_SUBTREE, filter, attrs,
msgs_count, msgs);
if (ret) {
goto fail;
}
talloc_zfree(tmp_ctx);
return EOK;
fail:
if (ret == ENOENT) {
DEBUG(SSSDBG_TRACE_INTERNAL, ("No such entry\n"));
}
else if (ret) {
DEBUG(SSSDBG_MINOR_FAILURE, ("Error: %d (%s)\n", ret, strerror(ret)));
}
talloc_zfree(tmp_ctx);
return ret;
}
/* =Delete-Group-by-Name-OR-gid=========================================== */
int sysdb_delete_group(struct sysdb_ctx *sysdb,
const char *name, gid_t gid)
{
TALLOC_CTX *tmp_ctx;
struct ldb_message *msg;
int ret;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
if (name) {
ret = sysdb_search_group_by_name(tmp_ctx, sysdb, sysdb->domain,
name, NULL, &msg);
} else {
ret = sysdb_search_group_by_gid(tmp_ctx, sysdb, sysdb->domain,
gid, NULL, &msg);
}
if (ret) {
goto fail;
}
if (name && gid) {
/* verify name/gid match */
const char *c_name;
uint64_t c_gid;
c_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
c_gid = ldb_msg_find_attr_as_uint64(msg, SYSDB_GIDNUM, 0);
if (c_name == NULL || c_gid == 0) {
DEBUG(2, ("Attribute is missing but this should never happen!\n"));
ret = EFAULT;
goto fail;
}
if (strcmp(name, c_name) || gid != c_gid) {
/* this is not the entry we are looking for */
ret = EINVAL;
goto fail;
}
}
ret = sysdb_delete_entry(sysdb, msg->dn, false);
if (ret) {
goto fail;
}
talloc_zfree(tmp_ctx);
return EOK;
fail:
DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
talloc_zfree(tmp_ctx);
return ret;
}
/* =Search-Netgroups-with-Custom-Filter===================================== */
int sysdb_search_netgroups(TALLOC_CTX *mem_ctx,
struct sysdb_ctx *sysdb,
const char *sub_filter,
const char **attrs,
size_t *msgs_count,
struct ldb_message ***msgs)
{
TALLOC_CTX *tmp_ctx;
struct ldb_dn *basedn;
char *filter;
int ret;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
SYSDB_TMPL_NETGROUP_BASE, sysdb->domain->name);
if (!basedn) {
DEBUG(2, ("Failed to build base dn\n"));
ret = ENOMEM;
goto fail;
}
filter = talloc_asprintf(tmp_ctx, "(&(%s)%s)", SYSDB_NC, sub_filter);
if (!filter) {
DEBUG(2, ("Failed to build filter\n"));
ret = ENOMEM;
goto fail;
}
DEBUG(6, ("Search netgroups with filter: %s\n", filter));
ret = sysdb_search_entry(mem_ctx, sysdb, basedn,
LDB_SCOPE_SUBTREE, filter, attrs,
msgs_count, msgs);
if (ret) {
goto fail;
}
talloc_zfree(tmp_ctx);
return EOK;
fail:
if (ret == ENOENT) {
DEBUG(SSSDBG_TRACE_FUNC, ("Entry not found\n"));
} else {
DEBUG(SSSDBG_TRACE_FUNC, ("Error: %d (%s)\n", ret, strerror(ret)));
}
talloc_zfree(tmp_ctx);
return ret;
}
/* =Delete-Netgroup-by-Name============================================== */
int sysdb_delete_netgroup(struct sysdb_ctx *sysdb,
const char *name)
{
TALLOC_CTX *tmp_ctx;
struct ldb_message *msg;
int ret;
if (!name) return EINVAL;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
ret = sysdb_search_netgroup_by_name(tmp_ctx, sysdb, sysdb->domain,
name, NULL, &msg);
if (ret != EOK && ret != ENOENT) {
DEBUG(6, ("sysdb_search_netgroup_by_name failed: %d (%s)\n",
ret, strerror(ret)));
goto done;
} else if (ret == ENOENT) {
DEBUG(6, ("Netgroup does not exist, nothing to delete\n"));
ret = EOK;
goto done;
}
ret = sysdb_delete_entry(sysdb, msg->dn, false);
if (ret != EOK) {
goto done;
}
done:
if (ret != EOK) {
DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
}
talloc_free(tmp_ctx);
return ret;
}
/* ========= Authentication against cached password ============ */
errno_t check_failed_login_attempts(struct confdb_ctx *cdb,
struct ldb_message *ldb_msg,
uint32_t *failed_login_attempts,
time_t *delayed_until)
{
int ret;
int allowed_failed_login_attempts;
int failed_login_delay;
time_t last_failed_login;
time_t end;
TALLOC_CTX *tmp_ctx;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
*delayed_until = -1;
*failed_login_attempts = ldb_msg_find_attr_as_uint(ldb_msg,
SYSDB_FAILED_LOGIN_ATTEMPTS, 0);
last_failed_login = (time_t) ldb_msg_find_attr_as_int64(ldb_msg,
SYSDB_LAST_FAILED_LOGIN, 0);
ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
CONFDB_PAM_FAILED_LOGIN_ATTEMPTS,
CONFDB_DEFAULT_PAM_FAILED_LOGIN_ATTEMPTS,
&allowed_failed_login_attempts);
if (ret != EOK) {
DEBUG(1, ("Failed to read the number of allowed failed login "
"attempts.\n"));
ret = EIO;
goto done;
}
ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
CONFDB_PAM_FAILED_LOGIN_DELAY,
CONFDB_DEFAULT_PAM_FAILED_LOGIN_DELAY,
&failed_login_delay);
if (ret != EOK) {
DEBUG(1, ("Failed to read the failed login delay.\n"));
ret = EIO;
goto done;
}
DEBUG(9, ("Failed login attempts [%d], allowed failed login attempts [%d], "
"failed login delay [%d].\n", *failed_login_attempts,
allowed_failed_login_attempts, failed_login_delay));
if (allowed_failed_login_attempts) {
if (*failed_login_attempts >= allowed_failed_login_attempts) {
if (failed_login_delay) {
end = last_failed_login + (failed_login_delay * 60);
if (end < time(NULL)) {
DEBUG(7, ("failed_login_delay has passed, "
"resetting failed_login_attempts.\n"));
*failed_login_attempts = 0;
} else {
DEBUG(7, ("login delayed until %lld.\n", (long long) end));
*delayed_until = end;
ret = EACCES;
goto done;
}
} else {
DEBUG(4, ("Too many failed logins.\n"));
ret = EACCES;
goto done;
}
}
}
ret = EOK;
done:
talloc_free(tmp_ctx);
return ret;
}
int sysdb_cache_auth(struct sysdb_ctx *sysdb,
const char *name,
const char *password,
struct confdb_ctx *cdb,
bool just_check,
time_t *_expire_date,
time_t *_delayed_until)
{
TALLOC_CTX *tmp_ctx;
const char *attrs[] = { SYSDB_NAME, SYSDB_CACHEDPWD, SYSDB_DISABLED,
SYSDB_LAST_LOGIN, SYSDB_LAST_ONLINE_AUTH,
"lastCachedPasswordChange",
"accountExpires", SYSDB_FAILED_LOGIN_ATTEMPTS,
SYSDB_LAST_FAILED_LOGIN, NULL };
struct ldb_message *ldb_msg;
const char *userhash;
char *comphash;
uint64_t lastLogin = 0;
int cred_expiration;
uint32_t failed_login_attempts = 0;
struct sysdb_attrs *update_attrs;
bool authentication_successful = false;
time_t expire_date = -1;
time_t delayed_until = -1;
int ret;
if (name == NULL || *name == '\0') {
DEBUG(1, ("Missing user name.\n"));
return EINVAL;
}
if (cdb == NULL) {
DEBUG(1, ("Missing config db context.\n"));
return EINVAL;
}
if (sysdb == NULL) {
DEBUG(1, ("Missing sysdb db context.\n"));
return EINVAL;
}
if (!sysdb->domain->cache_credentials) {
DEBUG(3, ("Cached credentials not available.\n"));
return EINVAL;
}
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
ret = ldb_transaction_start(sysdb->ldb);
if (ret) {
talloc_zfree(tmp_ctx);
ret = sysdb_error_to_errno(ret);
return ret;
}
ret = sysdb_search_user_by_name(tmp_ctx, sysdb, sysdb->domain,
name, attrs, &ldb_msg);
if (ret != EOK) {
DEBUG(1, ("sysdb_search_user_by_name failed [%d][%s].\n",
ret, strerror(ret)));
goto done;
}
/* Check offline_auth_cache_timeout */
lastLogin = ldb_msg_find_attr_as_uint64(ldb_msg,
SYSDB_LAST_ONLINE_AUTH,
0);
ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
CONFDB_PAM_CRED_TIMEOUT, 0, &cred_expiration);
if (ret != EOK) {
DEBUG(1, ("Failed to read expiration time of offline credentials.\n"));
goto done;
}
DEBUG(9, ("Offline credentials expiration is [%d] days.\n",
cred_expiration));
if (cred_expiration) {
expire_date = lastLogin + (cred_expiration * 86400);
if (expire_date < time(NULL)) {
DEBUG(4, ("Cached user entry is too old.\n"));
expire_date = 0;
ret = EACCES;
goto done;
}
} else {
expire_date = 0;
}
ret = check_failed_login_attempts(cdb, ldb_msg, &failed_login_attempts,
&delayed_until);
if (ret != EOK) {
DEBUG(1, ("Failed to check login attempts\n"));
goto done;
}
/* TODO: verify user account (disabled, expired ...) */
userhash = ldb_msg_find_attr_as_string(ldb_msg, SYSDB_CACHEDPWD, NULL);
if (userhash == NULL || *userhash == '\0') {
DEBUG(4, ("Cached credentials not available.\n"));
ret = ENOENT;
goto done;
}
ret = s3crypt_sha512(tmp_ctx, password, userhash, &comphash);
if (ret) {
DEBUG(4, ("Failed to create password hash.\n"));
ret = EFAULT;
goto done;
}
update_attrs = sysdb_new_attrs(tmp_ctx);
if (update_attrs == NULL) {
DEBUG(1, ("sysdb_new_attrs failed.\n"));
ret = ENOMEM;
goto done;
}
if (strcmp(userhash, comphash) == 0) {
/* TODO: probable good point for audit logging */
DEBUG(4, ("Hashes do match!\n"));
authentication_successful = true;
if (just_check) {
ret = EOK;
goto done;
}
ret = sysdb_attrs_add_time_t(update_attrs,
SYSDB_LAST_LOGIN, time(NULL));
if (ret != EOK) {
DEBUG(3, ("sysdb_attrs_add_time_t failed, "
"but authentication is successful.\n"));
ret = EOK;
goto done;
}
ret = sysdb_attrs_add_uint32(update_attrs,
SYSDB_FAILED_LOGIN_ATTEMPTS, 0U);
if (ret != EOK) {
DEBUG(3, ("sysdb_attrs_add_uint32 failed, "
"but authentication is successful.\n"));
ret = EOK;
goto done;
}
} else {
DEBUG(4, ("Authentication failed.\n"));
authentication_successful = false;
ret = sysdb_attrs_add_time_t(update_attrs,
SYSDB_LAST_FAILED_LOGIN,
time(NULL));
if (ret != EOK) {
DEBUG(3, ("sysdb_attrs_add_time_t failed\n."));
goto done;
}
ret = sysdb_attrs_add_uint32(update_attrs,
SYSDB_FAILED_LOGIN_ATTEMPTS,
++failed_login_attempts);
if (ret != EOK) {
DEBUG(3, ("sysdb_attrs_add_uint32 failed.\n"));
goto done;
}
}
ret = sysdb_set_user_attr(sysdb, sysdb->domain,
name, update_attrs, LDB_FLAG_MOD_REPLACE);
if (ret) {
DEBUG(1, ("Failed to update Login attempt information!\n"));
}
done:
if (_expire_date != NULL) {
*_expire_date = expire_date;
}
if (_delayed_until != NULL) {
*_delayed_until = delayed_until;
}
if (ret) {
ldb_transaction_cancel(sysdb->ldb);
} else {
ret = ldb_transaction_commit(sysdb->ldb);
ret = sysdb_error_to_errno(ret);
if (ret) {
DEBUG(2, ("Failed to commit transaction!\n"));
}
}
if (authentication_successful) {
ret = EOK;
} else {
if (ret == EOK) {
ret = EINVAL;
}
}
talloc_free(tmp_ctx);
return ret;
}
errno_t sysdb_update_members(struct sysdb_ctx *sysdb,
const char *member,
enum sysdb_member_type type,
const char *const *add_groups,
const char *const *del_groups)
{
errno_t ret;
errno_t sret;
int i;
bool in_transaction = false;
TALLOC_CTX *tmp_ctx = talloc_new(NULL);
if(!tmp_ctx) {
return ENOMEM;
}
ret = sysdb_transaction_start(sysdb);
if (ret != EOK) {
DEBUG(0, ("Failed to start update transaction\n"));
goto done;
}
in_transaction = true;
if (add_groups) {
/* Add the user to all add_groups */
for (i = 0; add_groups[i]; i++) {
ret = sysdb_add_group_member(sysdb, add_groups[i], member,
type);
if (ret != EOK) {
DEBUG(1, ("Could not add member [%s] to group [%s]. "
"Skipping.\n", member, add_groups[i]));
/* Continue on, we should try to finish the rest */
}
}
}
if (del_groups) {
/* Remove the user from all del_groups */
for (i = 0; del_groups[i]; i++) {
ret = sysdb_remove_group_member(sysdb, del_groups[i], member,
type);
if (ret != EOK) {
DEBUG(1, ("Could not remove member [%s] from group [%s]. "
"Skipping\n", member, del_groups[i]));
/* Continue on, we should try to finish the rest */
}
}
}
ret = sysdb_transaction_commit(sysdb);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
goto done;
}
in_transaction = false;
done:
if (in_transaction) {
sret = sysdb_transaction_cancel(sysdb);
if (sret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
}
}
talloc_free(tmp_ctx);
return ret;
}
errno_t sysdb_remove_attrs(struct sysdb_ctx *sysdb,
const char *name,
enum sysdb_member_type type,
char **remove_attrs)
{
errno_t ret;
errno_t sret = EOK;
bool in_transaction = false;
struct ldb_message *msg;
int lret;
size_t i;
msg = ldb_msg_new(NULL);
if (!msg) return ENOMEM;
switch(type) {
case SYSDB_MEMBER_USER:
msg->dn = sysdb_user_dn(sysdb, msg, sysdb->domain, name);
break;
case SYSDB_MEMBER_GROUP:
msg->dn = sysdb_group_dn(sysdb, msg, sysdb->domain, name);
break;
case SYSDB_MEMBER_NETGROUP:
msg->dn = sysdb_netgroup_dn(sysdb, msg, sysdb->domain, name);
break;
case SYSDB_MEMBER_SERVICE:
msg->dn = sysdb_svc_dn(sysdb, msg, sysdb->domain->name, name);
break;
}
if (!msg->dn) {
ret = ENOMEM;
goto done;
}
ret = sysdb_transaction_start(sysdb);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to start transaction\n"));
goto done;
}
in_transaction = true;
for (i = 0; remove_attrs[i]; i++) {
/* SYSDB_MEMBEROF is exclusively handled by the memberof plugin */
if (strcasecmp(remove_attrs[i], SYSDB_MEMBEROF) == 0) {
continue;
}
DEBUG(8, ("Removing attribute [%s] from [%s]\n",
remove_attrs[i], name));
lret = ldb_msg_add_empty(msg, remove_attrs[i],
LDB_FLAG_MOD_DELETE, NULL);
if (lret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(lret);
goto done;
}
/* We need to do individual modifies so that we can
* skip unknown attributes. Otherwise, any nonexistent
* attribute in the sysdb will cause other removals to
* fail.
*/
lret = ldb_modify(sysdb->ldb, msg);
if (lret != LDB_SUCCESS && lret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
ret = sysdb_error_to_errno(lret);
goto done;
}
/* Remove this attribute and move on to the next one */
ldb_msg_remove_attr(msg, remove_attrs[i]);
}
ret = sysdb_transaction_commit(sysdb);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to commit transaction\n"));
goto done;
}
in_transaction = false;
ret = EOK;
done:
if (in_transaction) {
sret = sysdb_transaction_cancel(sysdb);
if (sret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
}
}
talloc_free(msg);
return ret;
}