LCOV - code coverage report
Current view: top level - source4/lib/policy - pypolicy.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 53 86 61.6 %
Date: 2024-04-21 15:09:00 Functions: 3 4 75.0 %

          Line data    Source code
       1             : /*
       2             :  *  Unix SMB/CIFS implementation.
       3             :  *  Python bindings for libpolicy
       4             :  *  Copyright (C) Jelmer Vernooij 2010
       5             :  *
       6             :  *  This program is free software; you can redistribute it and/or modify
       7             :  *  it under the terms of the GNU General Public License as published by
       8             :  *  the Free Software Foundation; either version 3 of the License, or
       9             :  *  (at your option) any later version.
      10             :  *
      11             :  *  This program is distributed in the hope that it will be useful,
      12             :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             :  *  GNU General Public License for more details.
      15             :  *
      16             :  *  You should have received a copy of the GNU General Public License
      17             :  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
      18             :  */
      19             : 
      20             : #include "lib/replace/system/python.h"
      21             : #include "includes.h"
      22             : #include "python/py3compat.h"
      23             : #include "policy.h"
      24             : #include "libcli/util/pyerrors.h"
      25             : 
      26             : void initpolicy(void);
      27             : 
      28          43 : static PyObject *py_get_gpo_flags(PyObject *self, PyObject *args)
      29             : {
      30           1 :         int flags;
      31           1 :         PyObject *py_ret;
      32           1 :         const char **ret;
      33           1 :         TALLOC_CTX *mem_ctx;
      34           1 :         int i;
      35           1 :         NTSTATUS status;
      36             : 
      37          43 :         if (!PyArg_ParseTuple(args, "i", &flags))
      38           0 :                 return NULL;
      39             : 
      40          43 :         mem_ctx = talloc_new(NULL);
      41          43 :         if (mem_ctx == NULL) {
      42           0 :                 PyErr_NoMemory();
      43           0 :                 return NULL;
      44             :         }
      45             : 
      46          43 :         status = gp_get_gpo_flags(mem_ctx, flags, &ret);
      47          43 :         if (!NT_STATUS_IS_OK(status)) {
      48           0 :                 PyErr_SetNTSTATUS(status);
      49           0 :                 talloc_free(mem_ctx);
      50           0 :                 return NULL;
      51             :         }
      52             : 
      53          43 :         py_ret = PyList_New(0);
      54          45 :         for (i = 0; ret[i]; i++) {
      55           1 :                 int res = 0;
      56           1 :                 PyObject *item = PyUnicode_FromString(ret[i]);
      57           1 :                 if (item == NULL) {
      58           0 :                         talloc_free(mem_ctx);
      59           0 :                         Py_DECREF(py_ret);
      60           0 :                         PyErr_NoMemory();
      61           0 :                         return NULL;
      62             :                 }
      63           1 :                 res = PyList_Append(py_ret, item);
      64           1 :                 Py_CLEAR(item);
      65           1 :                 if (res == -1) {
      66           0 :                         Py_DECREF(py_ret);
      67           0 :                         talloc_free(mem_ctx);
      68           0 :                         return NULL;
      69             :                 }
      70             :         }
      71             : 
      72          43 :         talloc_free(mem_ctx);
      73             : 
      74          43 :         return py_ret;
      75             : }
      76             : 
      77           1 : static PyObject *py_get_gplink_options(PyObject *self, PyObject *args)
      78             : {
      79           1 :         int flags;
      80           1 :         PyObject *py_ret;
      81           1 :         const char **ret;
      82           1 :         TALLOC_CTX *mem_ctx;
      83           1 :         int i;
      84           1 :         NTSTATUS status;
      85             : 
      86           1 :         if (!PyArg_ParseTuple(args, "i", &flags))
      87           0 :                 return NULL;
      88             : 
      89           1 :         mem_ctx = talloc_new(NULL);
      90           1 :         if (mem_ctx == NULL) {
      91           0 :                 PyErr_NoMemory();
      92           0 :                 return NULL;
      93             :         }
      94             : 
      95           1 :         status = gp_get_gplink_options(mem_ctx, flags, &ret);
      96           1 :         if (!NT_STATUS_IS_OK(status)) {
      97           0 :                 PyErr_SetNTSTATUS(status);
      98           0 :                 talloc_free(mem_ctx);
      99           0 :                 return NULL;
     100             :         }
     101             : 
     102           1 :         py_ret = PyList_New(0);
     103           3 :         for (i = 0; ret[i]; i++) {
     104           1 :                 int res = 0;
     105           1 :                 PyObject *item = PyUnicode_FromString(ret[i]);
     106           1 :                 if (item == NULL) {
     107           0 :                         talloc_free(mem_ctx);
     108           0 :                         Py_DECREF(py_ret);
     109           0 :                         PyErr_NoMemory();
     110           0 :                         return NULL;
     111             :                 }
     112           1 :                 res = PyList_Append(py_ret, item);
     113           1 :                 Py_CLEAR(item);
     114           1 :                 if (res == -1) {
     115           0 :                         Py_DECREF(py_ret);
     116           0 :                         talloc_free(mem_ctx);
     117           0 :                         return NULL;
     118             :                 }
     119             :         }
     120             : 
     121           1 :         talloc_free(mem_ctx);
     122             : 
     123           1 :         return py_ret;
     124             : }
     125             : 
     126           0 : static PyObject *py_ads_to_dir_access_mask(PyObject *self, PyObject *args)
     127             : {
     128           0 :         uint32_t access_mask, dir_mask;
     129             : 
     130           0 :         if (! PyArg_ParseTuple(args, "I", &access_mask))
     131           0 :                 return NULL;
     132             : 
     133           0 :         dir_mask = gp_ads_to_dir_access_mask(access_mask);
     134             : 
     135           0 :         return Py_BuildValue("I", dir_mask);
     136             : }
     137             : 
     138             : 
     139             : static PyMethodDef py_policy_methods[] = {
     140             :         { "get_gpo_flags", (PyCFunction)py_get_gpo_flags, METH_VARARGS,
     141             :                 "get_gpo_flags(flags) -> list" },
     142             :         { "get_gplink_options", (PyCFunction)py_get_gplink_options, METH_VARARGS,
     143             :                 "get_gplink_options(options) -> list" },
     144             :         { "ads_to_dir_access_mask", (PyCFunction)py_ads_to_dir_access_mask, METH_VARARGS,
     145             :                 "ads_to_dir_access_mask(access_mask) -> dir_mask" },
     146             :         {0}
     147             : };
     148             : 
     149             : static struct PyModuleDef moduledef = {
     150             :     PyModuleDef_HEAD_INIT,
     151             :     .m_name = "policy",
     152             :     .m_doc = "(Group) Policy manipulation",
     153             :     .m_size = -1,
     154             :     .m_methods = py_policy_methods,
     155             : };
     156             : 
     157         227 : MODULE_INIT_FUNC(policy)
     158             : {
     159         227 :         PyObject *m = NULL;
     160             : 
     161         227 :         m = PyModule_Create(&moduledef);
     162         227 :         if (!m)
     163           0 :                 return m;
     164             : 
     165         227 :         PyModule_AddObject(m, "GPO_FLAG_USER_DISABLE",
     166             :                                            PyLong_FromLong(GPO_FLAG_USER_DISABLE));
     167         227 :         PyModule_AddObject(m, "GPO_MACHINE_USER_DISABLE",
     168             :                                            PyLong_FromLong(GPO_FLAG_MACHINE_DISABLE));
     169         227 :         PyModule_AddObject(m, "GPLINK_OPT_DISABLE",
     170             :                                            PyLong_FromLong(GPLINK_OPT_DISABLE ));
     171         227 :         PyModule_AddObject(m, "GPLINK_OPT_ENFORCE ",
     172             :                                            PyLong_FromLong(GPLINK_OPT_ENFORCE ));
     173         227 :         return m;
     174             : }

Generated by: LCOV version 1.14