===== Python bindings example ===== Thoses are example of making python bindings for RSBAC, with just a sample binding. NOTE: there is a more complex pyrex version in SVN Copy all and ''make'' :) file: rsbac.c #include #include #include #include #include #include #include union rsbac_attribute_value_t value; enum rsbac_switch_target_t module; enum rsbac_target_t target; enum rsbac_attribute_t attr; char * progname; char * target_n; rsbac_list_ta_number_t ta_number = 0; rsbac_version_t version=RSBAC_VERSION_NR; /* AUTH module * caps * may_setcaps * may_setuid * learn */ /* TODO static PyObject * py_auth_caps(PyObject *self, PyObject *args) { const char *path; const int *pvalue; struct rsbac_auth_cap_range_t cap_range; if (!PyArg_ParseTuple(args, "si", &path, &pvalue)) return NULL; reply = rsbac_auth_add_f_cap(0, path, ACT_real, cap_range, 0); }*/ static PyObject * py_auth_may_set_cap(PyObject *self, PyObject *args) { const char *path; const int *pvalue; int reply = 0; if (!PyArg_ParseTuple(args, "si", &path, &pvalue)) return NULL; value.auth_may_set_cap = (int)pvalue; reply = rsbac_set_attr_n(0, AUTH, T_FD, (char*)path, A_auth_may_set_cap, &pvalue); return Py_BuildValue("i", reply); } static PyObject * py_auth_may_setuid(PyObject *self, PyObject *args) { const char *path; const int *pvalue; int reply = 0; if (!PyArg_ParseTuple(args, "si", &path, &pvalue)) return NULL; value.auth_may_setuid = (int) pvalue; reply = rsbac_set_attr_n(0, AUTH, T_FD, (char*) path, A_auth_may_setuid, &value); return Py_BuildValue("i", reply); } static PyObject * py_auth_learn(PyObject *self, PyObject *args) { const char *path; const int *pvalue; int reply = 0; if (!PyArg_ParseTuple(args, "si", &path, &pvalue)) return NULL; value.auth_learn = (int) pvalue; reply = rsbac_set_attr_n(0, AUTH, T_FD, (char*) path, A_auth_learn, &value); return Py_BuildValue("i", reply); } static PyMethodDef RSBACMethods[] = { { "auth_may_set_cap", py_auth_may_set_cap, METH_VARARGS, "Allow AUTH to set caps on FD\n" }, { "auth_may_setuid", py_auth_may_setuid, METH_VARARGS, "Allow AUTH setuid on FD\n" }, { "auth_learn", py_auth_learn, METH_VARARGS, "Allow AUTH learning on FD\n" }, {NULL, NULL, 0, NULL} }; PyMODINIT_FUNC initrsbac(void){ (void) Py_InitModule("rsbac", RSBACMethods); } file: setup.py #!/usr/bin/python from distutils.core import setup, Extension module1 = Extension('rsbac', include_dirs = ['/usr/src/linux/include'], libraries = ['rsbac'], sources = ['rsbac.c']) setup (name = 'RSBAC', version = '1.0', description = 'RSBAC API for python', ext_modules = [module1]) file: Makefile all: python setup.py build install: python setup.py install clean: rm -r build file: test.py #!/usr/bin/python import rsbac import sys print "Ok, what file to operate on ?" print "(^D validates)" path = sys.stdin.read() path = path.replace('\n', '') print path+": 1 or 0 to enable/disable may setuid" attrval = sys.stdin.read() attrval = attrval.replace('\n', '') rsbac.attr_set_fd(path, int(attrval))