pyglue: add generate_random_machine_password() wrapper
[sfrench/samba-autobuild/.git] / python / pyglue.c
index 02fb005071a01ee0f593b07db6c0cf33cc871823..0e80ba6260959b1d3970f299722a1215293e8dc1 100644 (file)
 #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)
 {
@@ -60,6 +60,23 @@ static PyObject *py_generate_random_password(PyObject *self, PyObject *args)
        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_unix2nttime(PyObject *self, PyObject *args)
 {
        time_t t;
@@ -125,6 +142,15 @@ 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
+}
+
 /*
   return the list of interface IPs we have configured
   takes an loadparm context, returns a list of IPs in string form
@@ -252,7 +278,14 @@ static PyMethodDef py_misc_methods[] = {
                "Generate random string with specified length." },
        { "generate_random_password", (PyCFunction)py_generate_random_password,
                METH_VARARGS, "generate_random_password(min, max) -> 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)." },
        { "unix2nttime", (PyCFunction)py_unix2nttime, METH_VARARGS,
                "unix2nttime(timestamp) -> nttime" },
        { "nttime2unix", (PyCFunction)py_nttime2unix, METH_VARARGS,
@@ -271,6 +304,8 @@ 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?" },
        { NULL }
 };
 
@@ -287,5 +322,29 @@ void init_glue(void)
 
        PyModule_AddObject(m, "version",
                                           PyString_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);
+       }
+
 }