pysss.c revision 758ce3f01b4ed73c3bc35cd7039fac26fdf16386
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher/*
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher Authors:
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher Jakub Hrozek <jhrozek@redhat.com>
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher Copyright (C) 2009 Red Hat
c252d148fa8ab50aaaa8bbae7beb4d208025171dNikolai Kondrashov
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher This program is free software; you can redistribute it and/or modify
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher it under the terms of the GNU General Public License as published by
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher the Free Software Foundation; either version 3 of the License, or
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov (at your option) any later version.
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov This program is distributed in the hope that it will be useful,
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov but WITHOUT ANY WARRANTY; without even the implied warranty of
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fd5a4eacd56700ffb08a73121aeacdc806cb0132Sumit Bose GNU General Public License for more details.
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher You should have received a copy of the GNU General Public License
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher along with this program. If not, see <http://www.gnu.org/licenses/>.
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher*/
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher#include <Python.h>
428db8a58c0c149d5efccc6d788f70916c1d34d7Jakub Hrozek#include <structmember.h>
428db8a58c0c149d5efccc6d788f70916c1d34d7Jakub Hrozek#include <talloc.h>
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <pwd.h>
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher#include <grp.h>
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "util/util.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "util/sss_python.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "db/sysdb.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "tools/tools_util.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "tools/sss_sync_ops.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "util/crypto/sss_crypto.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * function taken from samba sources tree as of Aug 20 2009,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * file source4/lib/ldb/pyldb.c
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic char **PyList_AsStringList(TALLOC_CTX *mem_ctx, PyObject *list,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *paramname)
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose{
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose char **ret;
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose int i;
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose ret = talloc_array(mem_ctx, char *, PyList_Size(list)+1);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose for (i = 0; i < PyList_Size(list); i++) {
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke PyObject *item = PyList_GetItem(list, i);
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (!PyString_Check(item)) {
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke PyErr_Format(PyExc_TypeError, "%s should be strings", paramname);
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose return NULL;
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose }
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose ret[i] = talloc_strndup(ret, PyString_AsString(item),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyString_Size(item));
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher }
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallagher
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek ret[i] = NULL;
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek return ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
d921c1eba437662437847279f251a0a5d8f70127Maxim/* ======================= sysdb python wrappers ==========================*/
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub Hrozek
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * The sss.password object
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghertypedef struct {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject_HEAD
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce TALLOC_CTX *mem_ctx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct tevent_context *ev;
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek struct sysdb_ctx *sysdb;
5377441d7a846461c2d9a7a870cea711360a529aNikolai Kondrashov struct confdb_ctx *confdb;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct sss_domain_info *local;
32381402a4a9afc003782c9e2301fc59c9bda2a9Yassir Elley
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher int lock;
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher int unlock;
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek} PySssLocalObject;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher/*
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher * The transaction object
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek */
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozekstruct py_sss_transaction {
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek PySssLocalObject *self;
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek struct ops_ctx *ops;
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool transaction_done;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int error;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Error reporting
054b5d4bb98973698f74d66b14ccd14394b53f10Lukas Slebodnik */
054b5d4bb98973698f74d66b14ccd14394b53f10Lukas Slebodnikstatic void PyErr_SetSssErrorWithMessage(int ret, const char *message)
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek{
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek PyObject *exc = Py_BuildValue(discard_const_p(char, "(is)"),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret, message);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik PyErr_SetObject(PyExc_IOError, exc);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher Py_XDECREF(exc);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
558998ce664055a75595371118f818084d8f2b23Jan Cholastastatic void PyErr_SetSssError(int ret)
558998ce664055a75595371118f818084d8f2b23Jan Cholasta{
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta PyErr_SetSssErrorWithMessage(ret, strerror(ret));
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta}
558998ce664055a75595371118f818084d8f2b23Jan Cholasta
558998ce664055a75595371118f818084d8f2b23Jan Cholasta/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Common init of all methods
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic struct tools_ctx *init_ctx(PySssLocalObject *self)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct ops_ctx *octx = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct tools_ctx *tctx = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx = talloc_zero(self->mem_ctx, struct tools_ctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (tctx == NULL) {
f1828234a850dd28465425248a83a993f262918fPavel Březina return NULL;
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay }
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->confdb = self->confdb;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->sysdb = self->sysdb;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->local = self->local;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* tctx->nctx is NULL here, which is OK since we don't parse domains
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * in the python bindings (yet?) */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher octx = talloc_zero(tctx, struct ops_ctx);
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek if (octx == NULL) {
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek PyErr_NoMemory();
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek return NULL;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina octx->domain = self->local;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek tctx->octx = octx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return tctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta/*
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta * Add a user
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek */
cb4d5b588e704114b7090678752d33512baa718eJakub HrozekPyDoc_STRVAR(py_sss_useradd__doc__,
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek "Add a user named ``username``.\n\n"
19d3aba12c70528708be9440aca66038a291f29eYassir Elley ":param username: name of the user\n\n"
19d3aba12c70528708be9440aca66038a291f29eYassir Elley ":param kwargs: Keyword arguments that customize the operation\n\n"
19d3aba12c70528708be9440aca66038a291f29eYassir Elley "* useradd can be customized further with keyword arguments:\n"
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek " * ``uid``: The UID of the user\n"
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek " * ``gid``: The GID of the user\n"
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek " * ``gecos``: The comment string\n"
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek " * ``homedir``: Home directory\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``shell``: Login shell\n"
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose " * ``skel``: Specify an alternative skeleton directory\n"
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose " * ``create_home``: (bool) Force creation of home directory on or off\n"
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose " * ``groups``: List of groups the user is member of\n");
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic PyObject *py_sss_useradd(PySssLocalObject *self,
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce PyObject *args,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject *kwds)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct tools_ctx *tctx = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned long uid = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned long gid = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *gecos = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *home = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *shell = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *skel = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *username = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher const char * const kwlist[] = { "username", "uid", "gid", "gecos",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "homedir", "shell", "skel",
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek "create_home", "groups", NULL };
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher PyObject *py_groups = Py_None;
fe60346714a73ac3987f786731389320633dd245Pavel Březina PyObject *py_create_home = Py_None;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose int create_home = 0;
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose bool in_transaction = false;
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek /* parse arguments */
e5e8252ec48bfdd4e7529debc705c8e090264b9aSumit Bose if (!PyArg_ParseTupleAndKeywords(args, kwds,
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina discard_const_p(char, "s|kkssssO!O!"),
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher discard_const_p(char *, kwlist),
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina &username,
71e7918be3ca5d38794a16a17f6b4f19a24d51fcPavel Březina &uid,
bbaba8b3ef9bc101863b8687f234f4ee956caacdPavel Březina &gid,
80314a6f3ea8d81abe73d501d5b953a256cb2167Pavel Březina &gecos,
80314a6f3ea8d81abe73d501d5b953a256cb2167Pavel Březina &home,
bbaba8b3ef9bc101863b8687f234f4ee956caacdPavel Březina &shell,
bbaba8b3ef9bc101863b8687f234f4ee956caacdPavel Březina &skel,
80314a6f3ea8d81abe73d501d5b953a256cb2167Pavel Březina &PyBool_Type,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek &py_create_home,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek &PyList_Type,
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek &py_groups)) {
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek goto fail;
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek }
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek
4bd20c075f0f187db0181dc53d00ab6cd47fdb4dJakub Hrozek tctx = init_ctx(self);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tctx) {
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek PyErr_NoMemory();
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek return NULL;
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh }
ae6c1596225c65bec2a2dabff9eee4e3e0691181Abhishek Singh
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (py_groups != Py_None) {
d00ffd2cb4e2f17c75b466178bb645b5c9317909Pallavi Jha tctx->octx->addgroups = PyList_AsStringList(tctx, py_groups, "groups");
461da2984c747708e8badd27fa55ef879f40e712Pallavi Jha if (!tctx->octx->addgroups) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek PyErr_NoMemory();
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek return NULL;
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose }
e046ae03d0f55b1c8b0ec2fa6139bf86a3449adfPavel Březina }
939246537b0b9a4af6862c513d3919501ad57d92Sumit Bose
f69f3581658351003a6d9245045e41d0efb85022Sumit Bose /* user-wise the parameter is only bool - do or don't,
1ce58f139699dd26b8888f4131c996263b6a80a5Jakub Hrozek * however we must have a third state - undecided, pick default */
72ae534f5aef6d2e5d3f2f51299aede5abf9687eJakub Hrozek if (py_create_home == Py_True) {
90afedb00608547ae1f32aa7aafd552c4b306909Jakub Hrozek create_home = DO_CREATE_HOME;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek } else if (py_create_home == Py_False) {
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek create_home = DO_NOT_CREATE_HOME;
f43c6a9ae2aea13b7a83fd932139f9352efbfcadPavel Březina }
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek tctx->octx->name = username;
a524965fbe0551f1b3a68f1e5c7a5689a652998fSumit Bose tctx->octx->uid = uid;
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose /* fill in defaults */
a0ab15ceb80290db80c2052520830a95390de385Sumit Bose ret = useradd_defaults(tctx,
e00c2b5ac4963de9521599c88597b7fb97339d0eJakub Hrozek self->confdb,
e592d5f157be869151983bd1b46d6f4f7a29daafJakub Hrozek tctx->octx, gecos,
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek home, shell,
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek create_home,
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek skel);
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek if (ret != EOK) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek PyErr_SetSssError(ret);
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik goto fail;
99f8be128274eba264ea1434a7eb2800bced5902Lukas Slebodnik }
99f8be128274eba264ea1434a7eb2800bced5902Lukas Slebodnik
99f8be128274eba264ea1434a7eb2800bced5902Lukas Slebodnik /* Add the user within a transaction */
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik tctx->error = sysdb_transaction_start(tctx->sysdb);
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik if (tctx->error != EOK) {
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek PyErr_SetSssError(tctx->error);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher in_transaction = true;
f232789430a080384188d5da89b19d874cf17513Jakub Hrozek
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek /* useradd */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->error = useradd(tctx, tctx->sysdb, tctx->octx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (tctx->error) {
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek PyErr_SetSssError(tctx->error);
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek goto fail;
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek }
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher tctx->error = sysdb_transaction_commit(tctx->sysdb);
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher if (tctx->error) {
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher PyErr_SetSssError(tctx->error);
fa551077410019fb34460dc730950e93b62b2963Jakub Hrozek goto fail;
fa551077410019fb34460dc730950e93b62b2963Jakub Hrozek }
fa551077410019fb34460dc730950e93b62b2963Jakub Hrozek in_transaction = false;
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher /* Create user's home directory and/or mail spool */
03a071399ab5fb58d4bb4fa38928413a21ae4d61Nikolai Kondrashov if (tctx->octx->create_homedir) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* We need to know the UID and GID of the user, if
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher * sysdb did assign it automatically, do a lookup */
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek if (tctx->octx->uid == 0 || tctx->octx->gid == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_getpwnam_sync(tctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik }
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik ret = create_homedir(tctx->octx->skeldir,
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik tctx->octx->home,
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik tctx->octx->uid,
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik tctx->octx->gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->umask);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* failure here should not be fatal */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher create_mail_spool(tctx,
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose tctx->octx->name,
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose tctx->octx->maildir,
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose tctx->octx->uid,
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose tctx->octx->gid);
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose }
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose talloc_zfree(tctx);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose Py_RETURN_NONE;
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bosefail:
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (in_transaction) {
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke /* We do not handle return value of sysdb_transaction_cancel()
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke * because we don't want to overwrite previous error code.
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke */
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke sysdb_transaction_cancel(tctx->sysdb);
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher }
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher talloc_zfree(tctx);
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher return NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan Cholasta * Delete a user
b35f20cd8ecdc8308a3201e55752fb0443ec6ae4Jan Cholasta */
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan CholastaPyDoc_STRVAR(py_sss_userdel__doc__,
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek "Remove the user named ``username``.\n\n"
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek ":param username: Name of user being removed\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ":param kwargs: Keyword arguments that customize the operation\n\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "* userdel can be customized further with keyword arguments:\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``force``: (bool) Force removal of files not owned by the user\n"
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan Cholasta " * ``remove``: (bool) Toggle removing home directory and mail spool\n");
b35f20cd8ecdc8308a3201e55752fb0443ec6ae4Jan Cholasta
c7919a4fe41133cc466aa3d9431bfceee5784e7bJan Cholastastatic PyObject *py_sss_userdel(PySssLocalObject *self,
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek PyObject *args,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject *kwds)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct tools_ctx *tctx = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *username = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject *py_remove = Py_None;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int remove_home = 0;
3b1df539835367cb81cd5ff0f9959947d5642e55Stephen Gallagher PyObject *py_force = Py_None;
3b1df539835367cb81cd5ff0f9959947d5642e55Stephen Gallagher const char * const kwlist[] = { "username", "remove", "force", NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if(!PyArg_ParseTupleAndKeywords(args, kwds,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher discard_const_p(char, "s|O!O!"),
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher discard_const_p(char *, kwlist),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &username,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &PyBool_Type,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &py_remove,
667db40da4db362d7ca0a1f7f1c4ba40fb71795aJakub Hrozek &PyBool_Type,
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose &py_force)) {
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose goto fail;
c080a11e9e88f35e40aff4e476cabbd971833019Sumit Bose }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx = init_ctx(self);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_NoMemory();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return NULL;
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher }
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher
15b266d9f14dad26da8678a79019749d0f69532eStephen Gallagher tctx->octx->name = username;
1467daed400d6c186bd0c99c057c42e764309ff3Stephen Gallagher
b97595ae059c69b1960a6e7e56d74660388a683bJan Zeleny if (py_remove == Py_True) {
6a6a821866091e0f722808566c25b951aa346d7cStephen Gallagher remove_home = DO_REMOVE_HOME;
48d7840cae22c5ff4d786149b0d8ecee7efb8306Lukas Slebodnik } else if (py_remove == Py_False) {
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov remove_home = DO_NOT_REMOVE_HOME;
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov }
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov /*
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov * Fills in defaults for ops_ctx user did not specify.
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose */
60e51fd2764291df2332f36ff478777627d92b57Sumit Bose ret = userdel_defaults(tctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->confdb,
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher tctx->octx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher remove_home);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
17f08cbd0f909181536b93d6c12c7cd69995f09eSumit Bose
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov ret = run_userdel_cmd(tctx);
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov if (ret != EOK) {
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov PyErr_SetSssError(ret);
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov goto fail;
3ce85a5f5264e7118beb6524e120fd8b53a13da4Nikolai Kondrashov }
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov if (tctx->octx->remove_homedir) {
6398f22526303343193a18e514602f1af6fb29cbNikolai Kondrashov ret = sysdb_getpwnam_sync(tctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->sysdb,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Delete the user */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = userdel(tctx, self->sysdb, tctx->octx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (tctx->octx->remove_homedir) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = remove_homedir(tctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->home,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->maildir,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->uid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (py_force == Py_True));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(ret);
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Bose goto fail;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher }
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tctx);
eaaeaa7e00c3d4bfa792cc4d3c6770dc1e28ef0cSumit Bose Py_RETURN_NONE;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherfail:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tctx);
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce return NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Modify a user
0ef783e186ef1c9f60e61a4e8e54c44cb366fdfePavel Březina */
2cbdd12983eb85eddb90f64cfafb24eae5b448f4Jakub HrozekPyDoc_STRVAR(py_sss_usermod__doc__,
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta "Modify a user.\n\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ":param username: Name of user being modified\n\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ":param kwargs: Keyword arguments that customize the operation\n\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "* usermod can be customized further with keyword arguments:\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``uid``: The UID of the user\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``gid``: The GID of the user\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``gecos``: The comment string\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``homedir``: Home directory\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``shell``: Login shell\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``addgroups``: List of groups to add the user to\n"
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny " * ``rmgroups``: List of groups to remove the user from\n"
769347ad4d35d43488eb98f980143495b0db415dStef Walter " * ``lock``: Lock or unlock the account\n");
115de6d50f0d0bdd5745a5d8eb0d067be9128528Sumit Bose
769347ad4d35d43488eb98f980143495b0db415dStef Walterstatic PyObject *py_sss_usermod(PySssLocalObject *self,
769347ad4d35d43488eb98f980143495b0db415dStef Walter PyObject *args,
769347ad4d35d43488eb98f980143495b0db415dStef Walter PyObject *kwds)
769347ad4d35d43488eb98f980143495b0db415dStef Walter{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct tools_ctx *tctx = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject *py_addgroups = Py_None;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject *py_rmgroups = Py_None;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned long uid = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned long gid = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *gecos = NULL;
db78f4c750943fcd4b60bca5f3fdfd6cc5d3d4f8Ondrej Kos char *home = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *shell = NULL;
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek char *username = NULL;
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek unsigned long lock = 0;
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek const char * const kwlist[] = { "username", "uid", "gid", "lock",
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek "gecos", "homedir", "shell",
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek "addgroups", "rmgroups", NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool in_transaction = false;
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březina
ca261795ce61c41d7e62217ccb2ee913923040ffPavel Březina /* parse arguments */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!PyArg_ParseTupleAndKeywords(args, kwds,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher discard_const_p(char, "s|kkksssO!O!"),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher discard_const_p(char *, kwlist),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &username,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &uid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &gid,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &lock,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &gecos,
77d165f0629966db65753a3aee84a8b4971673afPavel Březina &home,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &shell,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &PyList_Type,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &py_addgroups,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &PyList_Type,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &py_rmgroups)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx = init_ctx(self);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_NoMemory();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (lock && lock != DO_LOCK && lock != DO_UNLOCK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetString(PyExc_ValueError,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Unkown value for lock parameter");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (py_addgroups != Py_None) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->addgroups = PyList_AsStringList(tctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher py_addgroups,
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek "addgroups");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tctx->octx->addgroups) {
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim return NULL;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik if (py_rmgroups != Py_None) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->rmgroups = PyList_AsStringList(tctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher py_rmgroups,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "rmgroups");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tctx->octx->rmgroups) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->name = username;
bfbf5cb0f00c60c0f000f56c282377b13b9a89abSumit Bose tctx->octx->uid = uid;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher tctx->octx->gid = gid;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->gecos = gecos;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->home = home;
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek tctx->octx->shell = shell;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->lock = lock;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Modify the user within a transaction */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->error = sysdb_transaction_start(tctx->sysdb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (tctx->error != EOK) {
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek PyErr_SetSssError(tctx->error);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
3a4186ae40d0c3b7be46a4c973166f6048fcfe38Lukas Slebodnik in_transaction = true;
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter /* usermod */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->error = usermod(tctx, tctx->sysdb, tctx->octx);
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik if (tctx->error) {
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny PyErr_SetSssError(tctx->error);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny tctx->error = sysdb_transaction_commit(tctx->sysdb);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (tctx->error) {
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta PyErr_SetSssError(tctx->error);
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos goto fail;
701f13b5c8e27bcbfc79e77ce7c76d9f768a448cLukas Slebodnik }
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina in_transaction = false;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher Py_RETURN_NONE;
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce
5f90993426fa2bdc3b3d994c9e85e0805bb92bbcSimo Sorcefail:
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek if (in_transaction) {
7452f1b637276ce582b120f8f5482ae7f3b6bd47Jakub Hrozek /* We do not handle return value of sysdb_transaction_cancel()
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce * because we don't want to overwrite previous error code.
2fa8d6655ac37f9bdeb34420000052d921f4a543Michal Zidek */
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina sysdb_transaction_cancel(tctx->sysdb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher talloc_zfree(tctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
e850be1ff2e13bba9812c94c3d102c0a0b570820Jakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher * Add a group
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen GallagherPyDoc_STRVAR(py_sss_groupadd__doc__,
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher "Add a group.\n\n"
8c3a4809b3420657289b42f028a1c9019b112991Stephen Gallagher ":param groupname: Name of group being added\n\n"
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce ":param kwargs: Keyword arguments ro customize the operation\n\n"
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose "* groupmod can be customized further with keyword arguments:\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher " * ``gid``: The GID of the group\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic PyObject *py_sss_groupadd(PySssLocalObject *self,
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta PyObject *args,
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek PyObject *kwds)
590582be38cdbfde387fcc57df92903d48c5a083Jakub Hrozek{
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina struct tools_ctx *tctx = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *groupname;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned long gid = 0;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char * const kwlist[] = { "groupname", "gid", NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher bool in_transaction = false;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* parse arguments */
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek if (!PyArg_ParseTupleAndKeywords(args, kwds,
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny discard_const_p(char, "s|k"),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher discard_const_p(char *, kwlist),
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher &groupname,
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta &gid)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx = init_ctx(self);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tctx) {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek PyErr_NoMemory();
fa70db6004a099afb7cb55031cd7bacb9e78202ePavel Březina return NULL;
ac47e8854f3bc404f2a35c6682faf621673d6b32Pavel Březina }
b79e0e50a935d108173ca3062f2afe16103fcb1dPavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->octx->name = groupname;
f9961e5f82e0ef474d6492371bfdf9e74e208a99Pavel Březina tctx->octx->gid = gid;
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Add the group within a transaction */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->error = sysdb_transaction_start(tctx->sysdb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (tctx->error != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(tctx->error);
3441d0c2d11aea0c39b009751a1898333c009674Stephen Gallagher goto fail;
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher }
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek in_transaction = true;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* groupadd */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->error = groupadd(tctx->sysdb, tctx->octx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (tctx->error) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(tctx->error);
4af1d1869d659fec84c518c26844132fa1df8f64Jakub Hrozek goto fail;
e9eeb4302e0e426c6cc1a4e65b95a6f7066e80b9Pavel Březina }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tctx->error = sysdb_transaction_commit(tctx->sysdb);
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher if (tctx->error) {
ae8d047122c7ba8123f72b2eac68944868ac37d4Stephen Gallagher PyErr_SetSssError(tctx->error);
fae99bfe4bfc8b4a12e9c2a0ad01b3684c22f934Simo Sorce goto fail;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek in_transaction = false;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
213ce2a78b1abe3921d8dc13c949a28130d00aecJan Zeleny talloc_zfree(tctx);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher Py_RETURN_NONE;
38e2ec1c757955ab557fd95807afa58042d09482Jan Zeleny
ad07ed37b6b51ef134d4524edaf2259e19ac984fJan Zelenyfail:
1a853121ca2ba8ede6df429ee76942131ffb0f65Jan Zeleny if (in_transaction) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* We do not handle return value of sysdb_transaction_cancel()
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * because we don't want to overwrite previous error code.
81165faf5d951aca69f410713730c26ff048ec44Sumit Bose */
3a62a99faf8e12965100d0b26fc9e07752bd3e2dStephen Gallagher sysdb_transaction_cancel(tctx->sysdb);
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta }
65e8f538ad35ba7d86cd9e60a3d86aec34537027Stephen Gallagher talloc_zfree(tctx);
88275cccddf39892e01682b39b02292eb74729bdPavel Březina return NULL;
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Delete a group
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherPyDoc_STRVAR(py_sss_groupdel__doc__,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Remove a group.\n\n"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ":param groupname: Name of group being removed\n");
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozekstatic PyObject *py_sss_groupdel(PySssLocalObject *self,
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher PyObject *args,
50fe3d79ab12b795a687b676761bef265701626aStephen Gallagher PyObject *kwds)
3f32406640d89face5e79244b4d8dab34adb6c7cPavel Březina{
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina struct tools_ctx *tctx = NULL;
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose char *groupname = NULL;
e293fba4f5459f3c2dad254dcc966407d8fc3312Jakub Hrozek int ret;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if(!PyArg_ParseTuple(args, discard_const_p(char, "s"), &groupname)) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose goto fail;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina tctx = init_ctx(self);
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik if (!tctx) {
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik PyErr_NoMemory();
462db32918a05097652f8232cd6c8d78a826e63cLukas Slebodnik return NULL;
347f7c4d1e8e83fc7ffcaf9524a67e8b3ad5d7c5Jan Cholasta }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek tctx->octx->name = groupname;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek /* Remove the group */
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek ret = groupdel(tctx, self->sysdb, tctx->octx);
374bf54785365273b20690bd3792c25a44738041Pavel Březina if (ret != EOK) {
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher PyErr_SetSssError(ret);
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher goto fail;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher talloc_zfree(tctx);
374bf54785365273b20690bd3792c25a44738041Pavel Březina Py_RETURN_NONE;
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher
374bf54785365273b20690bd3792c25a44738041Pavel Březinafail:
374bf54785365273b20690bd3792c25a44738041Pavel Březina talloc_zfree(tctx);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina return NULL;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina}
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina/*
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik * Modify a group
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik */
86b61156743b7ebdc049450a6f88452890fd9a61Jakub HrozekPyDoc_STRVAR(py_sss_groupmod__doc__,
eaa723b4d06b4c1e588df67bef44a84bbfaebf1aLukas Slebodnik"Modify a group.\n\n"
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek":param groupname: Name of group being modified\n\n"
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek":param kwargs: Keyword arguments ro customize the operation\n\n"
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek"* groupmod can be customized further with keyword arguments:\n"
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek" * ``gid``: The GID of the group\n\n"
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek" * ``addgroups``: Groups to add the group to\n\n"
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek" * ``rmgroups``: Groups to remove the group from\n\n");
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagherstatic PyObject *py_sss_groupmod(PySssLocalObject *self,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher PyObject *args,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher PyObject *kwds)
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher{
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher struct tools_ctx *tctx = NULL;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher PyObject *py_addgroups = Py_None;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt PyObject *py_rmgroups = Py_None;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt unsigned long gid = 0;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher char *groupname = NULL;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher const char * const kwlist[] = { "groupname", "gid", "addgroups",
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher "rmgroups", NULL };
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher bool in_transaction = false;
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher /* parse arguments */
87c07559af5cfcd2752295ef7c425bd3205f426fStephen Gallagher if (!PyArg_ParseTupleAndKeywords(args, kwds,
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher discard_const_p(char, "s|kO!O!"),
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher discard_const_p(char *, kwlist),
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher &groupname,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher &gid,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher &PyList_Type,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher &py_addgroups,
4c11f752e1f10cf5740d53a3206bb795e9e34fe8Jan Zeleny &PyList_Type,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher &py_rmgroups)) {
4c1bf6607060cea867fccf667063c028dfd51e96Stephen Gallagher goto fail;
1f1e6cbc59868f06dee3ab4b3df660fcb77ce1c8Jakub Hrozek }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
2ef62c64e7f07c8aced3f72850008ecb72860162Sumit Bose tctx = init_ctx(self);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose if (!tctx) {
817b1bcafff27cc67630dd0cbd36df708c05fcccStephen Gallagher PyErr_NoMemory();
64074e584a56611d7563667e0fcdadd215b0c922Yassir Elley return NULL;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (py_addgroups != Py_None) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher tctx->octx->addgroups = PyList_AsStringList(tctx,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher py_addgroups,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher "addgroups");
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!tctx->octx->addgroups) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return NULL;
42c28b9424b6ef8a0021b124773e171dd5defaddJakub Hrozek }
1319e71fd1680ca4864afe0b1aca2b8c8e4a1ee4Stef Walter }
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (py_rmgroups != Py_None) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher tctx->octx->rmgroups = PyList_AsStringList(tctx,
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher py_rmgroups,
b9d8c6172e48a2633ebe196b2e88bebdf9523c20Stef Walter "rmgroups");
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher if (!tctx->octx->rmgroups) {
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher return NULL;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher tctx->octx->name = groupname;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher tctx->octx->gid = gid;
29be7d76c949b82350c7603cfd362a1fcb47eb1bJan Zeleny
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek /* Modify the group within a transaction */
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce tctx->error = sysdb_transaction_start(tctx->sysdb);
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny if (tctx->error != EOK) {
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek PyErr_SetSssError(tctx->error);
918b2a5a91f1c551d48f4bffed2a28c36fdb4be1Simo Sorce goto fail;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
0a55f903a1da319338fdcf147efa01ed22f9710dMichal Zidek in_transaction = true;
8bcabb97d988d1602882a1f036aac2eaf5e09234Simo Sorce
22d381367c27910fe82f476a76b9f4ede555e35aLukas Slebodnik /* groupmod */
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik tctx->error = groupmod(tctx, tctx->sysdb, tctx->octx);
7de6e3534fd61c7619ed34a6b1afe7230b5e6504Ondrej Kos if (tctx->error) {
a473fb88e6015cf0ccbd2e9005c7e6acca18f452Pavel Březina PyErr_SetSssError(tctx->error);
de38d860e39585486e3ccbb42555196e319c7efdSumit Bose goto fail;
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik }
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek tctx->error = sysdb_transaction_commit(tctx->sysdb);
022c6b90bb37851c0e8704c0e5388ebc113c6470Lukas Slebodnik if (tctx->error) {
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik PyErr_SetSssError(tctx->error);
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik goto fail;
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek }
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek in_transaction = false;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher talloc_zfree(tctx);
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik Py_RETURN_NONE;
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozekfail:
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (in_transaction) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* We do not handle return value of sysdb_transaction_cancel()
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek * because we don't want to overwrite previous error code.
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta */
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta sysdb_transaction_cancel(tctx->sysdb);
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta }
748ba184db97b7534254f97018fa04e8aa458faeJan Cholasta talloc_zfree(tctx);
1a7d1977037864e52858058777af8ff8401547ddJan Cholasta return NULL;
96453f402831275a39d5fb89c33c9776e148d03fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek/*
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek * Get list of groups user belongs to
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek */
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal ZidekPyDoc_STRVAR(py_sss_getgrouplist__doc__,
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek "Get list of groups user belongs to.\n\n"
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek "NOTE: The interface uses the system NSS calls and is not limited to "
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek "users served by the SSSD!\n"
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek ":param username: name of user to get list for\n");
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidekstatic PyObject *py_sss_getgrouplist(PyObject *self, PyObject *args)
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek{
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek char *username = NULL;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek gid_t *groups = NULL;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek struct passwd *pw;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik struct group *gr;
fd98a28d6e94080e52bbedc789b06606a6019b10Lukas Slebodnik int ngroups;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik int ret;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik Py_ssize_t i;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek PyObject *groups_tuple;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik if(!PyArg_ParseTuple(args, discard_const_p(char, "s"), &username)) {
bbaba8b3ef9bc101863b8687f234f4ee956caacdPavel Březina goto fail;
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina }
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina pw = getpwnam(username);
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina if (pw == NULL) {
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina goto fail;
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina }
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina ngroups = 32;
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina groups = malloc(sizeof(gid_t) * ngroups);
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina if (groups == NULL) {
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina goto fail;
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina }
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina do {
bbaba8b3ef9bc101863b8687f234f4ee956caacdPavel Březina ret = getgrouplist(username, pw->pw_gid, groups, &ngroups);
bbaba8b3ef9bc101863b8687f234f4ee956caacdPavel Březina if (ret < ngroups) {
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina groups = realloc(groups, ngroups * sizeof(gid_t));
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose } while (ret != ngroups);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose groups_tuple = PyTuple_New((Py_ssize_t) ngroups);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (groups_tuple == NULL) {
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik goto fail;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik }
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher for (i = 0; i < ngroups; i++) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher gr = getgrgid(groups[i]);
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt PyTuple_SetItem(groups_tuple, i, PyString_FromString(gr->gr_name));
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher }
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik return groups_tuple;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagherfail:
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik free(groups);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik return NULL;
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik}
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose/*** python plumbing begins here ***/
b6dfbf81c61d4431aaa81687ec53e892f8b71edbSumit Bose
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek/*
46222e5191473f9a46aec581273eb2eef22e23beMichal Zidek * The sss.local destructor
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose */
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnikstatic void PySssLocalObject_dealloc(PySssLocalObject *self)
034ffb3c69cd04f03b36b89766c47a7c9bd9b831Sumit Bose{
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose talloc_free(self->mem_ctx);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik self->ob_type->tp_free((PyObject*) self);
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik}
4f6931e854c698dcb1c09f99eb330ce2fb97e7c6Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik/*
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose * The sss.local constructor
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose */
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bosestatic PyObject *PySssLocalObject_new(PyTypeObject *type,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose PyObject *args,
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt PyObject *kwds)
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt{
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose TALLOC_CTX *mem_ctx;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik PySssLocalObject *self;
0d01e4f6cc21d8ca0e4fafe59c7cbfa1459fa47eSumit Bose char *confdb_path;
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose int ret;
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik
f28b09f887870c10c8c611beee3c17eaa9ef74f3Lukas Slebodnik mem_ctx = talloc_new(NULL);
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose if (mem_ctx == NULL) {
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose PyErr_NoMemory();
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose return NULL;
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose }
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose self = (PySssLocalObject *) type->tp_alloc(type, 0);
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose if (self == NULL) {
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose talloc_free(mem_ctx);
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose PyErr_NoMemory();
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose return NULL;
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose }
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose self->mem_ctx = mem_ctx;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose confdb_path = talloc_asprintf(self->mem_ctx, "%s/%s", DB_PATH, CONFDB_FILE);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (confdb_path == NULL) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose talloc_free(mem_ctx);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose PyErr_NoMemory();
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return NULL;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose /* Connect to the conf db */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = confdb_init(self->mem_ctx, &self->confdb, confdb_path);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret != EOK) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose talloc_free(mem_ctx);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose PyErr_SetSssErrorWithMessage(ret,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose "Could not initialize connection to the confdb\n");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return NULL;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose }
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ret = sssd_domain_init(self->mem_ctx, self->confdb, "local",
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose DB_PATH, &self->local);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if (ret != EOK) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose talloc_free(mem_ctx);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose PyErr_SetSssErrorWithMessage(ret,
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose "Could not initialize connection to the sysdb\n");
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose return NULL;
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher }
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina self->sysdb = self->local->sysdb;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina self->lock = DO_LOCK;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina self->unlock = DO_UNLOCK;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina return (PyObject *) self;
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina}
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina
0bb98b7700b1b61f5b0a20b93279d5c2c391007fPavel Březina/*
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina * sss.local object methods
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina */
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březinastatic PyMethodDef sss_local_methods[] = {
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina { sss_py_const_p(char, "useradd"), (PyCFunction) py_sss_useradd,
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina METH_KEYWORDS, py_sss_useradd__doc__
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina },
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina { sss_py_const_p(char, "userdel"), (PyCFunction) py_sss_userdel,
efa6c1f75c4c18bcc148d6e7efd429c2d56499adPavel Březina METH_KEYWORDS, py_sss_userdel__doc__
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina },
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina { sss_py_const_p(char, "usermod"), (PyCFunction) py_sss_usermod,
706d211b5d6e32d11a1c6ffc8065ca8be4d4d8c5Pavel Březina METH_KEYWORDS, py_sss_usermod__doc__
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina },
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina { sss_py_const_p(char, "groupadd"), (PyCFunction) py_sss_groupadd,
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina METH_KEYWORDS, py_sss_groupadd__doc__
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina },
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina { sss_py_const_p(char, "groupdel"), (PyCFunction) py_sss_groupdel,
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina METH_KEYWORDS, py_sss_groupdel__doc__
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina },
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina { sss_py_const_p(char, "groupmod"), (PyCFunction) py_sss_groupmod,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter METH_KEYWORDS, py_sss_groupmod__doc__
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter },
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter {NULL, NULL, 0, NULL} /* Sentinel */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter};
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic PyMemberDef sss_local_members[] = {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter { discard_const_p(char, "lock"), T_INT,
769347ad4d35d43488eb98f980143495b0db415dStef Walter offsetof(PySssLocalObject, lock), RO, NULL},
769347ad4d35d43488eb98f980143495b0db415dStef Walter { discard_const_p(char, "unlock"), T_INT,
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek offsetof(PySssLocalObject, unlock), RO, NULL},
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek {NULL, 0, 0, 0, NULL} /* Sentinel */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter};
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/*
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter * sss.local object properties
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic PyTypeObject pysss_local_type = {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter PyObject_HEAD_INIT(NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter .tp_name = sss_py_const_p(char, "sss.local"),
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter .tp_basicsize = sizeof(PySssLocalObject),
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter .tp_new = PySssLocalObject_new,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter .tp_dealloc = (destructor) PySssLocalObject_dealloc,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter .tp_methods = sss_local_methods,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter .tp_members = sss_local_members,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter .tp_doc = sss_py_const_p(char, "SSS DB manipulation"),
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter};
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* ==================== obfuscation python wrappers ========================*/
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/*
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter * The sss.local object
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltertypedef struct {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject_HEAD
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int aes_256;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher} PySssPasswordObject;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherPyDoc_STRVAR(py_sss_encrypt__doc__,
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos"Obfuscate a password\n\n"
769347ad4d35d43488eb98f980143495b0db415dStef Walter":param password: The password to obfuscate\n\n"
769347ad4d35d43488eb98f980143495b0db415dStef Walter":param method: The obfuscation method\n\n");
769347ad4d35d43488eb98f980143495b0db415dStef Walter
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic PyObject *py_sss_encrypt(PySssPasswordObject *self,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyObject *args,
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik PyObject *kwds)
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher{
e369fc08906383e6d5c39832f31bb6600a33f887Simo Sorce char *password = NULL;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik int plen; /* may contain NULL bytes */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher char *obfpwd = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher TALLOC_CTX *tctx = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int mode;
ef39c0adcb61b16f9edc7beb4cdc8f3b0d5a8f15Stephen Gallagher PyObject *retval = NULL;
8c3a4809b3420657289b42f028a1c9019b112991Stephen Gallagher
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce /* parse arguments */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!PyArg_ParseTuple(args, discard_const_p(char, "s#i"),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &password, &plen, &mode)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return NULL;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
f427b36b0cecc426856ab3f77a9c684ac355659dSumit Bose
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik tctx = talloc_new(NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!tctx) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_NoMemory();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sss_password_encrypt(tctx, password, plen+1,
d844aab866ae237844360cea70e2dccdc90c783dStephen Gallagher mode, &obfpwd);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret != EOK) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyErr_SetSssError(ret);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher goto fail;
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher }
300c772767c1b12077cac1d148ac89738b058f97Jan Zeleny
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik retval = Py_BuildValue(sss_py_const_p(char, "s"), obfpwd);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (retval == NULL) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina goto fail;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinafail:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina talloc_zfree(tctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return retval;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#if 0
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel BřezinaPyDoc_STRVAR(py_sss_decrypt__doc__,
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik"Deobfuscate a password\n\n"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina":param obfpwd: The password to convert back to clear text\n\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic PyObject *py_sss_decrypt(PySssPasswordObject *self,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek PyObject *args,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek PyObject *kwds)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek char *password = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek char *obfpwd = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TALLOC_CTX *tctx = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik PyObject *retval = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* parse arguments */
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (!PyArg_ParseTuple(args, discard_const_p(char, "s"),
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta &obfpwd)) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta return NULL;
b42b5d5aaf4da165582e73ad985fdff6e34e61e4Jakub Hrozek }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
bd03e67c9d2fc4ad0275e7a573385ee5b7b9307aJan Cholasta tctx = talloc_new(NULL);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (!tctx) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta PyErr_NoMemory();
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik return NULL;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose ret = sss_password_decrypt(tctx, obfpwd, &password);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (ret != EOK) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose PyErr_SetSssError(ret);
e3f0014bb64b7e93979948936cf93cf869d3dc44Jan Zeleny goto fail;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose retval = Py_BuildValue("s", password);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose if (retval == NULL) {
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose goto fail;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose }
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bosefail:
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose talloc_zfree(tctx);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose return retval;
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik}
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose#endif
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek/*
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek * The sss.password destructor
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek */
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozekstatic void PySssPasswordObject_dealloc(PySssPasswordObject *self)
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek{
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek self->ob_type->tp_free((PyObject*) self);
590582be38cdbfde387fcc57df92903d48c5a083Jakub Hrozek}
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek/*
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek * The sss.password constructor
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek */
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozekstatic PyObject *PySssPasswordObject_new(PyTypeObject *type,
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek PyObject *args,
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek PyObject *kwds)
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek{
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek PySssPasswordObject *self;
8214510f125879c3b1d247f2ce981ee20b5375d1Jakub Hrozek
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek self = (PySssPasswordObject *) type->tp_alloc(type, 0);
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek if (self == NULL) {
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina PyErr_NoMemory();
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina return NULL;
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina }
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina
8a1fd0633e85221da1fb63451516a70d66c0af31Pavel Březina self->aes_256 = AES_256;
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek return (PyObject *) self;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * sss.password object methods
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstatic PyMethodDef sss_password_methods[] = {
ac47e8854f3bc404f2a35c6682faf621673d6b32Pavel Březina { sss_py_const_p(char, "encrypt"), (PyCFunction) py_sss_encrypt,
b79e0e50a935d108173ca3062f2afe16103fcb1dPavel Březina METH_VARARGS | METH_STATIC, py_sss_encrypt__doc__
769347ad4d35d43488eb98f980143495b0db415dStef Walter },
769347ad4d35d43488eb98f980143495b0db415dStef Walter#if 0
769347ad4d35d43488eb98f980143495b0db415dStef Walter { "decrypt", (PyCFunction) py_sss_decrypt,
769347ad4d35d43488eb98f980143495b0db415dStef Walter METH_VARARGS | METH_STATIC, py_sss_decrypt__doc__
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher },
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher#endif
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik {NULL, NULL, 0, NULL} /* Sentinel */
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher};
fe2091327ff44f80d6681c261494e4432404e9baStephen Gallagher
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce/*
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik * sss.password object members
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic PyMemberDef sss_password_members[] = {
2db6afe70eee2bbc22aa657a6b6609a9f3eb5d4cSimo Sorce { discard_const_p(char, "AES_256"), T_INT,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher offsetof(PySssPasswordObject, aes_256), RO, NULL},
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek {NULL, 0, 0, 0, NULL} /* Sentinel */
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek};
52e0894fd65bff4715c88330eb62b28e1635228fStephen Gallagher
8359bf07a2e6c0181251ce8d5d9160dc57546c55Stephen Gallagher/*
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek * sss.password object properties
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek */
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozekstatic PyTypeObject pysss_password_type = {
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek PyObject_HEAD_INIT(NULL)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher .tp_name = sss_py_const_p(char, "sss.password"),
8a07521b413a3b5879f824e1872c5770c92ee5c0Stephen Gallagher .tp_basicsize = sizeof(PySssPasswordObject),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher .tp_new = PySssPasswordObject_new,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher .tp_dealloc = (destructor) PySssPasswordObject_dealloc,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher .tp_methods = sss_password_methods,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher .tp_members = sss_password_members,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher .tp_doc = sss_py_const_p(char, "SSS password obfuscation"),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* ==================== the sss module initialization =======================*/
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Module methods
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic PyMethodDef module_methods[] = {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher {"getgrouplist", py_sss_getgrouplist, METH_VARARGS, py_sss_getgrouplist__doc__},
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik {NULL, NULL, 0, NULL} /* Sentinel */
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek};
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek/*
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher * Module initialization
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherPyMODINIT_FUNC
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozekinitpysss(void)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik PyObject *m;
654757bcead49427baaeb1b368c0e3433b67c51aJan Engelhardt
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (PyType_Ready(&pysss_local_type) < 0)
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek return;
42ec8af02ecf1937e4db9b1ecc6216022634f0f9Michal Zidek if (PyType_Ready(&pysss_password_type) < 0)
b49a7d90708e816120ff88ce5a88fa62b35ff795Simo Sorce return;
12805da52a93c268290cec7b8fbbdbd4ea8abc3eLukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher m = Py_InitModule(discard_const_p(char, "pysss"), module_methods);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (m == NULL)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher Py_INCREF(&pysss_local_type);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik PyModule_AddObject(m, discard_const_p(char, "local"), (PyObject *)&pysss_local_type);
577ba99b3150404533bd3d859522a2c994b17e76Lukas Slebodnik Py_INCREF(&pysss_password_type);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher PyModule_AddObject(m, discard_const_p(char, "password"), (PyObject *)&pysss_password_type);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
543676afec3c08fdc0a5a794976adc8dfdca974bJakub Hrozek