X-Git-Url: http://git.samba.org/samba.git/?p=bbaumbach%2Fsamba-autobuild%2F.git;a=blobdiff_plain;f=python%2Fpyglue.c;h=68b14a072e45d9d31795dd4eb7db2a295f21a222;hp=735f03a1e16339cb4da3129d8fe1319963cea0ba;hb=939592c660263b6f9969c30e4c6a1903fcc75831;hpb=87afc3aee1ea593069322a49355dd8780d99e123 diff --git a/python/pyglue.c b/python/pyglue.c index 735f03a1e16..68b14a072e4 100644 --- a/python/pyglue.c +++ b/python/pyglue.c @@ -18,16 +18,17 @@ */ #include +#include "python/py3compat.h" #include "includes.h" #include "version.h" #include "param/pyparam.h" #include "lib/socket/netif.h" void init_glue(void); - -#ifndef Py_RETURN_NONE -#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None -#endif +static PyObject *PyExc_NTSTATUSError; +static PyObject *PyExc_WERRORError; +static PyObject *PyExc_HRESULTError; +static PyObject *PyExc_DsExtendedError; static PyObject *py_generate_random_str(PyObject *self, PyObject *args) { @@ -38,7 +39,7 @@ static PyObject *py_generate_random_str(PyObject *self, PyObject *args) return NULL; retstr = generate_random_str(NULL, len); - ret = PyString_FromString(retstr); + ret = PyStr_FromString(retstr); talloc_free(retstr); return ret; } @@ -55,11 +56,55 @@ static PyObject *py_generate_random_password(PyObject *self, PyObject *args) if (retstr == NULL) { return NULL; } - ret = PyString_FromString(retstr); + ret = PyStr_FromString(retstr); + talloc_free(retstr); + return ret; +} + +static PyObject *py_generate_random_machine_password(PyObject *self, PyObject *args) +{ + int min, max; + PyObject *ret; + char *retstr; + if (!PyArg_ParseTuple(args, "ii", &min, &max)) + return NULL; + + retstr = generate_random_machine_password(NULL, min, max); + if (retstr == NULL) { + return NULL; + } + ret = PyUnicode_FromString(retstr); talloc_free(retstr); return ret; } +static PyObject *py_check_password_quality(PyObject *self, PyObject *args) +{ + char *pass; + + if (!PyArg_ParseTuple(args, "s", &pass)) { + return NULL; + } + + return PyBool_FromLong(check_password_quality(pass)); +} + +static PyObject *py_generate_random_bytes(PyObject *self, PyObject *args) +{ + int len; + PyObject *ret; + uint8_t *bytes = NULL; + + if (!PyArg_ParseTuple(args, "i", &len)) + return NULL; + + bytes = talloc_zero_size(NULL, len); + generate_random_buffer(bytes, len); + ret = PyBytes_FromStringAndSize((const char *)bytes, len); + talloc_free(bytes); + return ret; +} + static PyObject *py_unix2nttime(PyObject *self, PyObject *args) { time_t t; @@ -104,7 +149,7 @@ static PyObject *py_nttime2string(PyObject *self, PyObject *args) } string = nt_time_string(tmp_ctx, nt); - ret = PyString_FromString(string); + ret = PyStr_FromString(string); talloc_free(tmp_ctx); @@ -125,6 +170,24 @@ static PyObject *py_get_debug_level(PyObject *self) return PyInt_FromLong(DEBUGLEVEL); } +static PyObject *py_is_ntvfs_fileserver_built(PyObject *self) +{ +#ifdef WITH_NTVFS_FILESERVER + Py_RETURN_TRUE; +#else + Py_RETURN_FALSE; +#endif +} + +static PyObject *py_is_heimdal_built(PyObject *self) +{ +#ifdef SAMBA4_USES_HEIMDAL + Py_RETURN_TRUE; +#else + Py_RETURN_FALSE; +#endif +} + /* return the list of interface IPs we have configured takes an loadparm context, returns a list of IPs in string form @@ -164,18 +227,59 @@ static PyObject *py_interface_ips(PyObject *self, PyObject *args) /* first count how many are not loopback addresses */ for (ifcount = i = 0; i string\n" - "Generate random password with a length >= min and <= max." }, + "Generate random password (based on printable ascii characters) " + "with a length >= min and <= max." }, + { "generate_random_machine_password", (PyCFunction)py_generate_random_machine_password, + METH_VARARGS, "generate_random_machine_password(min, max) -> string\n" + "Generate random password " + "(based on random utf16 characters converted to utf8 or " + "random ascii characters if 'unix charset' is not 'utf8')" + "with a length >= min (at least 14) and <= max (at most 255)." }, + { "check_password_quality", (PyCFunction)py_check_password_quality, + METH_VARARGS, "check_password_quality(pass) -> bool\n" + "Check password quality against Samba's check_password_quality," + "the implementation of Microsoft's rules:" + "http://msdn.microsoft.com/en-us/subscriptions/cc786468%28v=ws.10%29.aspx" + }, { "unix2nttime", (PyCFunction)py_unix2nttime, METH_VARARGS, "unix2nttime(timestamp) -> nttime" }, { "nttime2unix", (PyCFunction)py_nttime2unix, METH_VARARGS, @@ -230,21 +347,62 @@ static PyMethodDef py_misc_methods[] = { "(for testing) compare two strings using Samba's strcasecmp_m()"}, { "strstr_m", (PyCFunction)py_strstr_m, METH_VARARGS, "(for testing) find one string in another with Samba's strstr_m()"}, + { "is_ntvfs_fileserver_built", (PyCFunction)py_is_ntvfs_fileserver_built, METH_NOARGS, + "is the NTVFS file server built in this installation?" }, + { "is_heimdal_built", (PyCFunction)py_is_heimdal_built, METH_NOARGS, + "is Samba built with Heimdal Kerberbos?" }, + { "generate_random_bytes", + (PyCFunction)py_generate_random_bytes, + METH_VARARGS, + "generate_random_bytes(len) -> bytes\n" + "Generate random bytes with specified length." }, { NULL } }; -void init_glue(void) +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + .m_name = "_glue", + .m_doc = "Python bindings for miscellaneous Samba functions.", + .m_size = -1, + .m_methods = py_misc_methods, +}; + +MODULE_INIT_FUNC(_glue) { PyObject *m; debug_setup_talloc_log(); - m = Py_InitModule3("_glue", py_misc_methods, - "Python bindings for miscellaneous Samba functions."); + m = PyModule_Create(&moduledef); if (m == NULL) - return; + return NULL; PyModule_AddObject(m, "version", - PyString_FromString(SAMBA_VERSION_STRING)); + PyStr_FromString(SAMBA_VERSION_STRING)); + PyExc_NTSTATUSError = PyErr_NewException(discard_const_p(char, "samba.NTSTATUSError"), PyExc_RuntimeError, NULL); + if (PyExc_NTSTATUSError != NULL) { + Py_INCREF(PyExc_NTSTATUSError); + PyModule_AddObject(m, "NTSTATUSError", PyExc_NTSTATUSError); + } + + PyExc_WERRORError = PyErr_NewException(discard_const_p(char, "samba.WERRORError"), PyExc_RuntimeError, NULL); + if (PyExc_WERRORError != NULL) { + Py_INCREF(PyExc_WERRORError); + PyModule_AddObject(m, "WERRORError", PyExc_WERRORError); + } + + PyExc_HRESULTError = PyErr_NewException(discard_const_p(char, "samba.HRESULTError"), PyExc_RuntimeError, NULL); + if (PyExc_HRESULTError != NULL) { + Py_INCREF(PyExc_HRESULTError); + PyModule_AddObject(m, "HRESULTError", PyExc_HRESULTError); + } + + PyExc_DsExtendedError = PyErr_NewException(discard_const_p(char, "samba.DsExtendedError"), PyExc_RuntimeError, NULL); + if (PyExc_DsExtendedError != NULL) { + Py_INCREF(PyExc_DsExtendedError); + PyModule_AddObject(m, "DsExtendedError", PyExc_DsExtendedError); + } + + return m; }