python3 port for passdb module
[nivanova/samba-autobuild/.git] / source3 / passdb / py_passdb.c
index dec45c3a5c44b428372a9c154320e0cf677c940f..bb0952fd1ea54c3d45b5382cf8a233a14451f64c 100644 (file)
 #include <Python.h>
 #include <pytalloc.h>
 #include "includes.h"
+#include "python/py3compat.h"
 #include "lib/util/talloc_stack.h"
 #include "libcli/security/security.h"
 #include "librpc/gen_ndr/idmap.h"
 #include "passdb.h"
 #include "secrets.h"
-
-/* There's no Py_ssize_t in 2.4, apparently */
-#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5
-typedef int Py_ssize_t;
-typedef inquiry lenfunc;
-typedef intargfunc ssizeargfunc;
-#endif
+#include "idmap.h"
 
 #ifndef Py_TYPE /* Py_TYPE is only available on Python > 2.6 */
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
@@ -50,9 +45,9 @@ static PyTypeObject *dom_sid_Type = NULL;
 static PyTypeObject *security_Type = NULL;
 static PyTypeObject *guid_Type = NULL;
 
-staticforward PyTypeObject PySamu;
-staticforward PyTypeObject PyGroupmap;
-staticforward PyTypeObject PyPDB;
+static PyTypeObject PySamu;
+static PyTypeObject PyGroupmap;
+static PyTypeObject PyPDB;
 
 static PyObject *py_pdb_error;
 
@@ -244,7 +239,7 @@ static PyObject *py_samu_get_username(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_username = PyString_FromString(username);
+       py_username = PyStr_FromString(username);
        talloc_free(frame);
        return py_username;
 }
@@ -254,8 +249,8 @@ static int py_samu_set_username(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_username(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_username(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -275,7 +270,7 @@ static PyObject *py_samu_get_domain(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_domain = PyString_FromString(domain);
+       py_domain = PyStr_FromString(domain);
        talloc_free(frame);
        return py_domain;
 }
@@ -285,8 +280,8 @@ static int py_samu_set_domain(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_domain(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_domain(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -306,7 +301,7 @@ static PyObject *py_samu_get_nt_username(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_nt_username = PyString_FromString(nt_username);
+       py_nt_username = PyStr_FromString(nt_username);
        talloc_free(frame);
        return py_nt_username;
 }
@@ -316,8 +311,8 @@ static int py_samu_set_nt_username(PyObject *obj, PyObject *value, void *closure
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_nt_username(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_nt_username(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -337,7 +332,7 @@ static PyObject *py_samu_get_full_name(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_full_name = PyString_FromString(full_name);
+       py_full_name = PyStr_FromString(full_name);
        talloc_free(frame);
        return py_full_name;
 }
@@ -347,8 +342,8 @@ static int py_samu_set_full_name(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_fullname(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_fullname(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -368,7 +363,7 @@ static PyObject *py_samu_get_home_dir(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_home_dir = PyString_FromString(home_dir);
+       py_home_dir = PyStr_FromString(home_dir);
        talloc_free(frame);
        return py_home_dir;
 }
@@ -378,8 +373,8 @@ static int py_samu_set_home_dir(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_homedir(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_homedir(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -399,7 +394,7 @@ static PyObject *py_samu_get_dir_drive(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_dir_drive = PyString_FromString(dir_drive);
+       py_dir_drive = PyStr_FromString(dir_drive);
        talloc_free(frame);
        return py_dir_drive;
 }
@@ -409,8 +404,8 @@ static int py_samu_set_dir_drive(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_dir_drive(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_dir_drive(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -430,7 +425,7 @@ static PyObject *py_samu_get_logon_script(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_logon_script = PyString_FromString(logon_script);
+       py_logon_script = PyStr_FromString(logon_script);
        talloc_free(frame);
        return py_logon_script;
 }
@@ -440,8 +435,8 @@ static int py_samu_set_logon_script(PyObject *obj, PyObject *value, void *closur
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_logon_script(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_logon_script(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -461,7 +456,7 @@ static PyObject *py_samu_get_profile_path(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_profile_path = PyString_FromString(profile_path);
+       py_profile_path = PyStr_FromString(profile_path);
        talloc_free(frame);
        return py_profile_path;
 }
@@ -471,8 +466,8 @@ static int py_samu_set_profile_path(PyObject *obj, PyObject *value, void *closur
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_profile_path(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_profile_path(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -492,7 +487,7 @@ static PyObject *py_samu_get_acct_desc(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_acct_desc = PyString_FromString(acct_desc);
+       py_acct_desc = PyStr_FromString(acct_desc);
        talloc_free(frame);
        return py_acct_desc;
 }
@@ -502,8 +497,8 @@ static int py_samu_set_acct_desc(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_acct_desc(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_acct_desc(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -523,7 +518,7 @@ static PyObject *py_samu_get_workstations(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_workstations = PyString_FromString(workstations);
+       py_workstations = PyStr_FromString(workstations);
        talloc_free(frame);
        return py_workstations;
 }
@@ -533,8 +528,8 @@ static int py_samu_set_workstations(PyObject *obj, PyObject *value, void *closur
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_workstations(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_workstations(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -554,7 +549,7 @@ static PyObject *py_samu_get_comment(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_comment = PyString_FromString(comment);
+       py_comment = PyStr_FromString(comment);
        talloc_free(frame);
        return py_comment;
 }
@@ -564,8 +559,8 @@ static int py_samu_set_comment(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_comment(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_comment(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -585,7 +580,7 @@ static PyObject *py_samu_get_munged_dial(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_munged_dial = PyString_FromString(munged_dial);
+       py_munged_dial = PyStr_FromString(munged_dial);
        talloc_free(frame);
        return py_munged_dial;
 }
@@ -595,8 +590,8 @@ static int py_samu_set_munged_dial(PyObject *obj, PyObject *value, void *closure
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_munged_dial(sam_acct, PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
+       if (!pdb_set_munged_dial(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -703,7 +698,7 @@ static PyObject *py_samu_get_lanman_passwd(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_lm_pw = PyString_FromStringAndSize(lm_pw, LM_HASH_LEN);
+       py_lm_pw = PyBytes_FromStringAndSize(lm_pw, LM_HASH_LEN);
        talloc_free(frame);
        return py_lm_pw;
 }
@@ -713,8 +708,8 @@ static int py_samu_set_lanman_passwd(PyObject *obj, PyObject *value, void *closu
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
-       if (!pdb_set_lanman_passwd(sam_acct, (uint8_t *)PyString_AsString(value), PDB_CHANGED)) {
+       PY_CHECK_TYPE(&PyBytes_Type, value, return -1;);
+       if (!pdb_set_lanman_passwd(sam_acct, (uint8_t *)PyBytes_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -734,7 +729,7 @@ static PyObject *py_samu_get_nt_passwd(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_nt_pw = PyString_FromStringAndSize(nt_pw, NT_HASH_LEN);
+       py_nt_pw = PyBytes_FromStringAndSize(nt_pw, NT_HASH_LEN);
        talloc_free(frame);
        return py_nt_pw;
 }
@@ -744,7 +739,7 @@ static int py_samu_set_nt_passwd(PyObject *obj, PyObject *value, void *closure)
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       if (!pdb_set_nt_passwd(sam_acct, (uint8_t *)PyString_AsString(value), PDB_CHANGED)) {
+       if (!pdb_set_nt_passwd(sam_acct, (uint8_t *)PyBytes_AsString(value), PDB_CHANGED)) {
                talloc_free(frame);
                return -1;
        }
@@ -765,7 +760,7 @@ static PyObject *py_samu_get_pw_history(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_nt_pw_his = PyString_FromStringAndSize(nt_pw_his, hist_len*PW_HISTORY_ENTRY_LEN);
+       py_nt_pw_his = PyBytes_FromStringAndSize(nt_pw_his, hist_len*PW_HISTORY_ENTRY_LEN);
        talloc_free(frame);
        return py_nt_pw_his;
 }
@@ -778,7 +773,7 @@ static int py_samu_set_pw_history(PyObject *obj, PyObject *value, void *closure)
        Py_ssize_t len;
        uint32_t hist_len;
 
-       PyString_AsStringAndSize(value, &nt_pw_his, &len);
+       PyBytes_AsStringAndSize(value, &nt_pw_his, &len);
        hist_len = len / PW_HISTORY_ENTRY_LEN;
        if (!pdb_set_pw_history(sam_acct, (uint8_t *)nt_pw_his, hist_len, PDB_CHANGED)) {
                talloc_free(frame);
@@ -800,7 +795,7 @@ static PyObject *py_samu_get_plaintext_passwd(PyObject *obj, void *closure)
                Py_RETURN_NONE;
        }
 
-       py_plaintext_pw = PyString_FromString(plaintext_pw);
+       py_plaintext_pw = PyStr_FromString(plaintext_pw);
        talloc_free(frame);
        return py_plaintext_pw;
 }
@@ -810,7 +805,7 @@ static int py_samu_set_plaintext_passwd(PyObject *obj, PyObject *value, void *cl
        TALLOC_CTX *frame = talloc_stackframe();
        struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
 
-       if (!pdb_set_plaintext_passwd(sam_acct, PyString_AsString(value))) {
+       if (!pdb_set_plaintext_passwd(sam_acct, PyStr_AsString(value))) {
                talloc_free(frame);
                return -1;
        }
@@ -1114,7 +1109,6 @@ static PyObject *py_samu_new(PyTypeObject *type, PyObject *args, PyObject *kwarg
 
 static PyTypeObject PySamu = {
        .tp_name = "passdb.Samu",
-       .tp_basicsize = sizeof(pytalloc_Object),
        .tp_getset = py_samu_getsetters,
        .tp_methods = NULL,
        .tp_new = py_samu_new,
@@ -1218,7 +1212,7 @@ static PyObject *py_groupmap_get_nt_name(PyObject *obj, void *closure)
                py_nt_name = Py_None;
                Py_INCREF(py_nt_name);
        } else {
-               py_nt_name = PyString_FromString(group_map->nt_name);
+               py_nt_name = PyStr_FromString(group_map->nt_name);
        }
        talloc_free(frame);
        return py_nt_name;
@@ -1229,11 +1223,11 @@ static int py_groupmap_set_nt_name(PyObject *obj, PyObject *value, void *closure
        TALLOC_CTX *frame = talloc_stackframe();
        GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
        if (value == Py_None) {
                fstrcpy(group_map->nt_name, NULL);
        } else {
-               fstrcpy(group_map->nt_name, PyString_AsString(value));
+               fstrcpy(group_map->nt_name, PyStr_AsString(value));
        }
        talloc_free(frame);
        return 0;
@@ -1248,7 +1242,7 @@ static PyObject *py_groupmap_get_comment(PyObject *obj, void *closure)
                py_comment = Py_None;
                Py_INCREF(py_comment);
        } else {
-               py_comment = PyString_FromString(group_map->comment);
+               py_comment = PyStr_FromString(group_map->comment);
        }
        talloc_free(frame);
        return py_comment;
@@ -1259,11 +1253,11 @@ static int py_groupmap_set_comment(PyObject *obj, PyObject *value, void *closure
        TALLOC_CTX *frame = talloc_stackframe();
        GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
 
-       PY_CHECK_TYPE(&PyString_Type, value, return -1;);
+       PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
        if (value == Py_None) {
                fstrcpy(group_map->comment, NULL);
        } else {
-               fstrcpy(group_map->comment, PyString_AsString(value));
+               fstrcpy(group_map->comment, PyStr_AsString(value));
        }
        talloc_free(frame);
        return 0;
@@ -1317,7 +1311,6 @@ static PyObject *py_groupmap_new(PyTypeObject *type, PyObject *args, PyObject *k
 
 static PyTypeObject PyGroupmap = {
        .tp_name = "passdb.Groupmap",
-       .tp_basicsize = sizeof(pytalloc_Object),
        .tp_getset = py_groupmap_getsetters,
        .tp_methods = NULL,
        .tp_new = py_groupmap_new,
@@ -1326,7 +1319,7 @@ static PyTypeObject PyGroupmap = {
 };
 
 
-static PyObject *py_pdb_domain_info(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_domain_info(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -1363,9 +1356,9 @@ static PyObject *py_pdb_domain_info(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       PyDict_SetItemString(py_domain_info, "name", PyString_FromString(domain_info->name));
-       PyDict_SetItemString(py_domain_info, "dns_domain", PyString_FromString(domain_info->dns_domain));
-       PyDict_SetItemString(py_domain_info, "dns_forest", PyString_FromString(domain_info->dns_forest));
+       PyDict_SetItemString(py_domain_info, "name", PyStr_FromString(domain_info->name));
+       PyDict_SetItemString(py_domain_info, "dns_domain", PyStr_FromString(domain_info->dns_domain));
+       PyDict_SetItemString(py_domain_info, "dns_forest", PyStr_FromString(domain_info->dns_forest));
        PyDict_SetItemString(py_domain_info, "dom_sid", pytalloc_steal(dom_sid_Type, sid));
        PyDict_SetItemString(py_domain_info, "guid", pytalloc_steal(guid_Type, guid));
 
@@ -1374,7 +1367,7 @@ static PyObject *py_pdb_domain_info(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_getsampwnam(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_getsampwnam(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1413,7 +1406,7 @@ static PyObject *py_pdb_getsampwnam(pytalloc_Object *self, PyObject *args)
        return py_sam_acct;
 }
 
-static PyObject *py_pdb_getsampwsid(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_getsampwsid(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1451,7 +1444,7 @@ static PyObject *py_pdb_getsampwsid(pytalloc_Object *self, PyObject *args)
        return py_sam_acct;
 }
 
-static PyObject *py_pdb_create_user(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_create_user(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1481,7 +1474,7 @@ static PyObject *py_pdb_create_user(pytalloc_Object *self, PyObject *args)
        return PyInt_FromLong(rid);
 }
 
-static PyObject *py_pdb_delete_user(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_delete_user(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1507,11 +1500,11 @@ static PyObject *py_pdb_delete_user(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
-static PyObject *py_pdb_add_sam_account(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_add_sam_account(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1538,11 +1531,11 @@ static PyObject *py_pdb_add_sam_account(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
-static PyObject *py_pdb_update_sam_account(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_update_sam_account(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1568,11 +1561,11 @@ static PyObject *py_pdb_update_sam_account(pytalloc_Object *self, PyObject *args
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
-static PyObject *py_pdb_delete_sam_account(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_delete_sam_account(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1598,11 +1591,11 @@ static PyObject *py_pdb_delete_sam_account(pytalloc_Object *self, PyObject *args
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
-static PyObject *py_pdb_rename_sam_account(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_rename_sam_account(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1630,12 +1623,12 @@ static PyObject *py_pdb_rename_sam_account(pytalloc_Object *self, PyObject *args
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_getgrsid(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_getgrsid(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1676,7 +1669,7 @@ static PyObject *py_pdb_getgrsid(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_getgrgid(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_getgrgid(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1715,7 +1708,7 @@ static PyObject *py_pdb_getgrgid(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_getgrnam(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_getgrnam(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1754,7 +1747,7 @@ static PyObject *py_pdb_getgrnam(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_create_dom_group(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_create_dom_group(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1784,7 +1777,7 @@ static PyObject *py_pdb_create_dom_group(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_delete_dom_group(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_delete_dom_group(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1808,12 +1801,12 @@ static PyObject *py_pdb_delete_dom_group(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_add_group_mapping_entry(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_add_group_mapping_entry(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1839,12 +1832,12 @@ static PyObject *py_pdb_add_group_mapping_entry(pytalloc_Object *self, PyObject
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_update_group_mapping_entry(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_update_group_mapping_entry(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1870,12 +1863,12 @@ static PyObject *py_pdb_update_group_mapping_entry(pytalloc_Object *self, PyObje
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_delete_group_mapping_entry(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_delete_group_mapping_entry(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1901,12 +1894,12 @@ static PyObject *py_pdb_delete_group_mapping_entry(pytalloc_Object *self, PyObje
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_enum_group_mapping(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_enum_group_mapping(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -1975,7 +1968,7 @@ static PyObject *py_pdb_enum_group_mapping(pytalloc_Object *self, PyObject *args
 }
 
 
-static PyObject *py_pdb_enum_group_members(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_enum_group_members(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2026,7 +2019,7 @@ static PyObject *py_pdb_enum_group_members(pytalloc_Object *self, PyObject *args
 }
 
 
-static PyObject *py_pdb_enum_group_memberships(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_enum_group_memberships(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2075,7 +2068,7 @@ static PyObject *py_pdb_enum_group_memberships(pytalloc_Object *self, PyObject *
 }
 
 
-static PyObject *py_pdb_add_groupmem(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_add_groupmem(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2098,12 +2091,12 @@ static PyObject *py_pdb_add_groupmem(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_del_groupmem(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_del_groupmem(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2126,12 +2119,12 @@ static PyObject *py_pdb_del_groupmem(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_create_alias(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_create_alias(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2161,7 +2154,7 @@ static PyObject *py_pdb_create_alias(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_delete_alias(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_delete_alias(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2187,12 +2180,12 @@ static PyObject *py_pdb_delete_alias(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_get_aliasinfo(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_get_aliasinfo(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2235,9 +2228,9 @@ static PyObject *py_pdb_get_aliasinfo(pytalloc_Object *self, PyObject *args)
        }
 
        PyDict_SetItemString(py_alias_info, "acct_name",
-                            PyString_FromString(alias_info->acct_name));
+                            PyStr_FromString(alias_info->acct_name));
        PyDict_SetItemString(py_alias_info, "acct_desc",
-                            PyString_FromString(alias_info->acct_desc));
+                            PyStr_FromString(alias_info->acct_desc));
        PyDict_SetItemString(py_alias_info, "rid",
                             PyInt_FromLong(alias_info->rid));
 
@@ -2246,7 +2239,7 @@ static PyObject *py_pdb_get_aliasinfo(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_set_aliasinfo(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_set_aliasinfo(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2265,13 +2258,13 @@ static PyObject *py_pdb_set_aliasinfo(pytalloc_Object *self, PyObject *args)
 
        alias_sid = pytalloc_get_ptr(py_alias_sid);
 
-       alias_info.acct_name = talloc_strdup(frame, PyString_AsString(PyDict_GetItemString(py_alias_info, "acct_name")));
+       alias_info.acct_name = talloc_strdup(frame, PyStr_AsString(PyDict_GetItemString(py_alias_info, "acct_name")));
        if (alias_info.acct_name == NULL) {
                PyErr_Format(py_pdb_error, "Unable to allocate memory");
                talloc_free(frame);
                return NULL;
        }
-       alias_info.acct_desc = talloc_strdup(frame, PyString_AsString(PyDict_GetItemString(py_alias_info, "acct_desc")));
+       alias_info.acct_desc = talloc_strdup(frame, PyStr_AsString(PyDict_GetItemString(py_alias_info, "acct_desc")));
        if (alias_info.acct_desc == NULL) {
                PyErr_Format(py_pdb_error, "Unable to allocate memory");
                talloc_free(frame);
@@ -2287,12 +2280,12 @@ static PyObject *py_pdb_set_aliasinfo(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_add_aliasmem(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_add_aliasmem(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2320,12 +2313,12 @@ static PyObject *py_pdb_add_aliasmem(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_del_aliasmem(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_del_aliasmem(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2353,12 +2346,12 @@ static PyObject *py_pdb_del_aliasmem(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_enum_aliasmem(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_enum_aliasmem(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2411,7 +2404,7 @@ static PyObject *py_pdb_enum_aliasmem(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_get_account_policy(pytalloc_Object *self)
+static PyObject *py_pdb_get_account_policy(PyObject *self, PyObject *unused)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2445,7 +2438,7 @@ static PyObject *py_pdb_get_account_policy(pytalloc_Object *self)
 }
 
 
-static PyObject *py_pdb_set_account_policy(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_set_account_policy(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2476,11 +2469,11 @@ static PyObject *py_pdb_set_account_policy(pytalloc_Object *self, PyObject *args
                }
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
-static PyObject *py_pdb_search_users(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_search_users(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2531,9 +2524,9 @@ static PyObject *py_pdb_search_users(pytalloc_Object *self, PyObject *args)
                        PyDict_SetItemString(py_dict, "idx", PyInt_FromLong(entry->idx));
                        PyDict_SetItemString(py_dict, "rid", PyInt_FromLong(entry->rid));
                        PyDict_SetItemString(py_dict, "acct_flags", PyInt_FromLong(entry->acct_flags));
-                       PyDict_SetItemString(py_dict, "account_name", PyString_FromString(entry->account_name));
-                       PyDict_SetItemString(py_dict, "fullname", PyString_FromString(entry->fullname));
-                       PyDict_SetItemString(py_dict, "description", PyString_FromString(entry->description));
+                       PyDict_SetItemString(py_dict, "account_name", PyStr_FromString(entry->account_name));
+                       PyDict_SetItemString(py_dict, "fullname", PyStr_FromString(entry->fullname));
+                       PyDict_SetItemString(py_dict, "description", PyStr_FromString(entry->description));
                        PyList_Append(py_userlist, py_dict);
                }
        }
@@ -2544,7 +2537,7 @@ static PyObject *py_pdb_search_users(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_search_groups(pytalloc_Object *self)
+static PyObject *py_pdb_search_groups(PyObject *self, PyObject *unused)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2589,9 +2582,9 @@ static PyObject *py_pdb_search_groups(pytalloc_Object *self)
                        PyDict_SetItemString(py_dict, "idx", PyInt_FromLong(entry->idx));
                        PyDict_SetItemString(py_dict, "rid", PyInt_FromLong(entry->rid));
                        PyDict_SetItemString(py_dict, "acct_flags", PyInt_FromLong(entry->acct_flags));
-                       PyDict_SetItemString(py_dict, "account_name", PyString_FromString(entry->account_name));
-                       PyDict_SetItemString(py_dict, "fullname", PyString_FromString(entry->fullname));
-                       PyDict_SetItemString(py_dict, "description", PyString_FromString(entry->description));
+                       PyDict_SetItemString(py_dict, "account_name", PyStr_FromString(entry->account_name));
+                       PyDict_SetItemString(py_dict, "fullname", PyStr_FromString(entry->fullname));
+                       PyDict_SetItemString(py_dict, "description", PyStr_FromString(entry->description));
                        PyList_Append(py_grouplist, py_dict);
                }
        }
@@ -2602,7 +2595,7 @@ static PyObject *py_pdb_search_groups(pytalloc_Object *self)
 }
 
 
-static PyObject *py_pdb_search_aliases(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_search_aliases(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2661,9 +2654,9 @@ static PyObject *py_pdb_search_aliases(pytalloc_Object *self, PyObject *args)
                        PyDict_SetItemString(py_dict, "idx", PyInt_FromLong(entry->idx));
                        PyDict_SetItemString(py_dict, "rid", PyInt_FromLong(entry->rid));
                        PyDict_SetItemString(py_dict, "acct_flags", PyInt_FromLong(entry->acct_flags));
-                       PyDict_SetItemString(py_dict, "account_name", PyString_FromString(entry->account_name));
-                       PyDict_SetItemString(py_dict, "fullname", PyString_FromString(entry->fullname));
-                       PyDict_SetItemString(py_dict, "description", PyString_FromString(entry->description));
+                       PyDict_SetItemString(py_dict, "account_name", PyStr_FromString(entry->account_name));
+                       PyDict_SetItemString(py_dict, "fullname", PyStr_FromString(entry->fullname));
+                       PyDict_SetItemString(py_dict, "description", PyStr_FromString(entry->description));
                        PyList_Append(py_aliaslist, py_dict);
                }
        }
@@ -2674,10 +2667,11 @@ static PyObject *py_pdb_search_aliases(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_uid_to_sid(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_uid_to_sid(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
+       struct unixid id;
        unsigned int uid;
        struct dom_sid user_sid, *copy_user_sid;
        PyObject *py_user_sid;
@@ -2689,7 +2683,10 @@ static PyObject *py_pdb_uid_to_sid(pytalloc_Object *self, PyObject *args)
 
        methods = pytalloc_get_ptr(self);
 
-       if (!methods->uid_to_sid(methods, uid, &user_sid)) {
+       id.id = uid;
+       id.type = ID_TYPE_UID;
+
+       if (!methods->id_to_sid(methods, &id, &user_sid)) {
                PyErr_Format(py_pdb_error, "Unable to get sid for uid=%d", uid);
                talloc_free(frame);
                return NULL;
@@ -2709,10 +2706,11 @@ static PyObject *py_pdb_uid_to_sid(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_gid_to_sid(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_gid_to_sid(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
+       struct unixid id;
        unsigned int gid;
        struct dom_sid group_sid, *copy_group_sid;
        PyObject *py_group_sid;
@@ -2722,9 +2720,12 @@ static PyObject *py_pdb_gid_to_sid(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
+       id.id = gid;
+       id.type = ID_TYPE_GID;
+
        methods = pytalloc_get_ptr(self);
 
-       if (!methods->gid_to_sid(methods, gid, &group_sid)) {
+       if (!methods->id_to_sid(methods, &id, &group_sid)) {
                PyErr_Format(py_pdb_error, "Unable to get sid for gid=%d", gid);
                talloc_free(frame);
                return NULL;
@@ -2744,7 +2745,7 @@ static PyObject *py_pdb_gid_to_sid(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_sid_to_id(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_sid_to_id(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2772,7 +2773,7 @@ static PyObject *py_pdb_sid_to_id(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_new_rid(pytalloc_Object *self)
+static PyObject *py_pdb_new_rid(PyObject *self, PyObject *unused)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2791,7 +2792,7 @@ static PyObject *py_pdb_new_rid(pytalloc_Object *self)
 }
 
 
-static PyObject *py_pdb_get_trusteddom_pw(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_get_trusteddom_pw(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2836,7 +2837,7 @@ static PyObject *py_pdb_get_trusteddom_pw(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       PyDict_SetItemString(py_value, "pwd", PyString_FromString(pwd));
+       PyDict_SetItemString(py_value, "pwd", PyStr_FromString(pwd));
        PyDict_SetItemString(py_value, "sid", py_sid);
        PyDict_SetItemString(py_value, "last_set_tim", PyInt_FromLong(last_set_time));
 
@@ -2845,7 +2846,7 @@ static PyObject *py_pdb_get_trusteddom_pw(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_set_trusteddom_pw(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_set_trusteddom_pw(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2870,12 +2871,12 @@ static PyObject *py_pdb_set_trusteddom_pw(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_del_trusteddom_pw(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_del_trusteddom_pw(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct pdb_methods *methods;
@@ -2894,12 +2895,12 @@ static PyObject *py_pdb_del_trusteddom_pw(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_enum_trusteddoms(pytalloc_Object *self)
+static PyObject *py_pdb_enum_trusteddoms(PyObject *self, PyObject *unused)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2931,7 +2932,7 @@ static PyObject *py_pdb_enum_trusteddoms(pytalloc_Object *self)
                py_dict = PyDict_New();
                if (py_dict) {
                        PyDict_SetItemString(py_dict, "name",
-                                       PyString_FromString(domains[i]->name));
+                                       PyStr_FromString(domains[i]->name));
                        PyDict_SetItemString(py_dict, "sid",
                                        pytalloc_steal(dom_sid_Type, &domains[i]->sid));
                }
@@ -2944,7 +2945,7 @@ static PyObject *py_pdb_enum_trusteddoms(pytalloc_Object *self)
 }
 
 
-static PyObject *py_pdb_get_trusted_domain(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_get_trusted_domain(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -2977,16 +2978,16 @@ static PyObject *py_pdb_get_trusted_domain(pytalloc_Object *self, PyObject *args
        }
 
        PyDict_SetItemString(py_domain_info, "domain_name",
-                       PyString_FromString(td->domain_name));
+                       PyStr_FromString(td->domain_name));
        PyDict_SetItemString(py_domain_info, "netbios_name",
-                       PyString_FromString(td->netbios_name));
+                       PyStr_FromString(td->netbios_name));
        PyDict_SetItemString(py_domain_info, "security_identifier",
                        pytalloc_steal(dom_sid_Type, &td->security_identifier));
        PyDict_SetItemString(py_domain_info, "trust_auth_incoming",
-                       PyString_FromStringAndSize((char *)td->trust_auth_incoming.data,
+                       PyBytes_FromStringAndSize((const char *)td->trust_auth_incoming.data,
                                                td->trust_auth_incoming.length));
        PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
-                       PyString_FromStringAndSize((char *)td->trust_auth_outgoing.data,
+                       PyBytes_FromStringAndSize((const char *)td->trust_auth_outgoing.data,
                                                td->trust_auth_outgoing.length));
        PyDict_SetItemString(py_domain_info, "trust_direction",
                        PyInt_FromLong(td->trust_direction));
@@ -2995,7 +2996,7 @@ static PyObject *py_pdb_get_trusted_domain(pytalloc_Object *self, PyObject *args
        PyDict_SetItemString(py_domain_info, "trust_attributes",
                        PyInt_FromLong(td->trust_attributes));
        PyDict_SetItemString(py_domain_info, "trust_forest_trust_info",
-                       PyString_FromStringAndSize((char *)td->trust_forest_trust_info.data,
+                       PyBytes_FromStringAndSize((const char *)td->trust_forest_trust_info.data,
                                                td->trust_forest_trust_info.length));
 
        talloc_free(frame);
@@ -3003,7 +3004,7 @@ static PyObject *py_pdb_get_trusted_domain(pytalloc_Object *self, PyObject *args
 }
 
 
-static PyObject *py_pdb_get_trusted_domain_by_sid(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_get_trusted_domain_by_sid(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -3039,16 +3040,16 @@ static PyObject *py_pdb_get_trusted_domain_by_sid(pytalloc_Object *self, PyObjec
        }
 
        PyDict_SetItemString(py_domain_info, "domain_name",
-                       PyString_FromString(td->domain_name));
+                       PyStr_FromString(td->domain_name));
        PyDict_SetItemString(py_domain_info, "netbios_name",
-                       PyString_FromString(td->netbios_name));
+                       PyStr_FromString(td->netbios_name));
        PyDict_SetItemString(py_domain_info, "security_identifier",
                        pytalloc_steal(dom_sid_Type, &td->security_identifier));
        PyDict_SetItemString(py_domain_info, "trust_auth_incoming",
-                       PyString_FromStringAndSize((char *)td->trust_auth_incoming.data,
+                       PyBytes_FromStringAndSize((char *)td->trust_auth_incoming.data,
                                                td->trust_auth_incoming.length));
        PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
-                       PyString_FromStringAndSize((char *)td->trust_auth_outgoing.data,
+                       PyBytes_FromStringAndSize((char *)td->trust_auth_outgoing.data,
                                                td->trust_auth_outgoing.length));
        PyDict_SetItemString(py_domain_info, "trust_direction",
                        PyInt_FromLong(td->trust_direction));
@@ -3057,7 +3058,7 @@ static PyObject *py_pdb_get_trusted_domain_by_sid(pytalloc_Object *self, PyObjec
        PyDict_SetItemString(py_domain_info, "trust_attributes",
                        PyInt_FromLong(td->trust_attributes));
        PyDict_SetItemString(py_domain_info, "trust_forest_trust_info",
-                       PyString_FromStringAndSize((char *)td->trust_forest_trust_info.data,
+                       PyBytes_FromStringAndSize((char *)td->trust_forest_trust_info.data,
                                                td->trust_forest_trust_info.length));
 
        talloc_free(frame);
@@ -3065,7 +3066,7 @@ static PyObject *py_pdb_get_trusted_domain_by_sid(pytalloc_Object *self, PyObjec
 }
 
 
-static PyObject *py_pdb_set_trusted_domain(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_set_trusted_domain(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -3082,20 +3083,20 @@ static PyObject *py_pdb_set_trusted_domain(pytalloc_Object *self, PyObject *args
        }
 
        py_tmp = PyDict_GetItemString(py_td_info, "domain_name");
-       td_info.domain_name = PyString_AsString(py_tmp);
+       td_info.domain_name = PyStr_AsString(py_tmp);
 
        py_tmp = PyDict_GetItemString(py_td_info, "netbios_name");
-       td_info.netbios_name = PyString_AsString(py_tmp);
+       td_info.netbios_name = PyStr_AsString(py_tmp);
 
        py_tmp = PyDict_GetItemString(py_td_info, "security_identifier");
        td_info.security_identifier = *pytalloc_get_type(py_tmp, struct dom_sid);
 
        py_tmp = PyDict_GetItemString(py_td_info, "trust_auth_incoming");
-       PyString_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_incoming.data, &len);
+       PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_incoming.data, &len);
        td_info.trust_auth_incoming.length = len;
 
        py_tmp = PyDict_GetItemString(py_td_info, "trust_auth_outgoing");
-       PyString_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_outgoing.data, &len);
+       PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_outgoing.data, &len);
        td_info.trust_auth_outgoing.length = len;
 
        py_tmp = PyDict_GetItemString(py_td_info, "trust_direction");
@@ -3108,7 +3109,7 @@ static PyObject *py_pdb_set_trusted_domain(pytalloc_Object *self, PyObject *args
        td_info.trust_attributes = PyInt_AsLong(py_tmp);
 
        py_tmp = PyDict_GetItemString(py_td_info, "trust_forest_trust_info");
-       PyString_AsStringAndSize(py_tmp, (char **)&td_info.trust_forest_trust_info.data, &len);
+       PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_forest_trust_info.data, &len);
        td_info.trust_forest_trust_info.length = len;
 
        methods = pytalloc_get_ptr(self);
@@ -3122,12 +3123,12 @@ static PyObject *py_pdb_set_trusted_domain(pytalloc_Object *self, PyObject *args
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_del_trusted_domain(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_del_trusted_domain(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -3150,12 +3151,12 @@ static PyObject *py_pdb_del_trusted_domain(pytalloc_Object *self, PyObject *args
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_enum_trusted_domains(pytalloc_Object *self)
+static PyObject *py_pdb_enum_trusted_domains(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -3196,16 +3197,16 @@ static PyObject *py_pdb_enum_trusted_domains(pytalloc_Object *self)
                td = td_info[i];
 
                PyDict_SetItemString(py_domain_info, "domain_name",
-                               PyString_FromString(td->domain_name));
+                               PyStr_FromString(td->domain_name));
                PyDict_SetItemString(py_domain_info, "netbios_name",
-                               PyString_FromString(td->netbios_name));
+                               PyStr_FromString(td->netbios_name));
                PyDict_SetItemString(py_domain_info, "security_identifier",
                                pytalloc_steal(dom_sid_Type, &td->security_identifier));
                PyDict_SetItemString(py_domain_info, "trust_auth_incoming",
-                               PyString_FromStringAndSize((char *)td->trust_auth_incoming.data,
+                               PyBytes_FromStringAndSize((const char *)td->trust_auth_incoming.data,
                                                        td->trust_auth_incoming.length));
                PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
-                               PyString_FromStringAndSize((char *)td->trust_auth_outgoing.data,
+                               PyBytes_FromStringAndSize((const char *)td->trust_auth_outgoing.data,
                                                        td->trust_auth_outgoing.length));
                PyDict_SetItemString(py_domain_info, "trust_direction",
                                PyInt_FromLong(td->trust_direction));
@@ -3214,7 +3215,7 @@ static PyObject *py_pdb_enum_trusted_domains(pytalloc_Object *self)
                PyDict_SetItemString(py_domain_info, "trust_attributes",
                                PyInt_FromLong(td->trust_attributes));
                PyDict_SetItemString(py_domain_info, "trust_forest_trust_info",
-                               PyString_FromStringAndSize((char *)td->trust_forest_trust_info.data,
+                               PyBytes_FromStringAndSize((const char *)td->trust_forest_trust_info.data,
                                                        td->trust_forest_trust_info.length));
                PyList_Append(py_td_info, py_domain_info);
        }
@@ -3224,7 +3225,7 @@ static PyObject *py_pdb_enum_trusted_domains(pytalloc_Object *self)
 }
 
 
-static PyObject *py_pdb_get_secret(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_get_secret(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -3275,11 +3276,11 @@ static PyObject *py_pdb_get_secret(pytalloc_Object *self, PyObject *args)
        }
 
        PyDict_SetItemString(py_secret, "secret_current",
-                       PyString_FromStringAndSize((char *)secret_current.data, secret_current.length));
+                       PyBytes_FromStringAndSize((const char*)secret_current.data, secret_current.length));
        PyDict_SetItemString(py_secret, "secret_current_lastchange",
                        PyLong_FromUnsignedLongLong(secret_current_lastchange));
        PyDict_SetItemString(py_secret, "secret_old",
-                       PyString_FromStringAndSize((char *)secret_old.data, secret_old.length));
+                       PyBytes_FromStringAndSize((const char*)secret_old.data, secret_old.length));
        PyDict_SetItemString(py_secret, "secret_old_lastchange",
                        PyLong_FromUnsignedLongLong(secret_old_lastchange));
        PyDict_SetItemString(py_secret, "sd", py_sd);
@@ -3289,7 +3290,7 @@ static PyObject *py_pdb_get_secret(pytalloc_Object *self, PyObject *args)
 }
 
 
-static PyObject *py_pdb_set_secret(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_set_secret(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -3310,15 +3311,15 @@ static PyObject *py_pdb_set_secret(pytalloc_Object *self, PyObject *args)
        py_secret_old = PyDict_GetItemString(py_secret, "secret_old");
        py_sd = PyDict_GetItemString(py_secret, "sd");
 
-       PY_CHECK_TYPE(&PyString_Type, py_secret_cur, return NULL;);
-       PY_CHECK_TYPE(&PyString_Type, py_secret_old, return NULL;);
+       PY_CHECK_TYPE(&PyBytes_Type, py_secret_cur, return NULL;);
+       PY_CHECK_TYPE(&PyBytes_Type, py_secret_old, return NULL;);
        PY_CHECK_TYPE(security_Type, py_sd, return NULL;);
 
        methods = pytalloc_get_ptr(self);
 
-       PyString_AsStringAndSize(py_secret_cur, (char **)&secret_current.data, &len);
+       PyBytes_AsStringAndSize(py_secret_cur, (char **)&secret_current.data, &len);
        secret_current.length = len;
-       PyString_AsStringAndSize(py_secret_old, (char **)&secret_old.data, &len);
+       PyBytes_AsStringAndSize(py_secret_old, (char **)&secret_old.data, &len);
        secret_current.length = len;
        sd = pytalloc_get_ptr(py_sd);
 
@@ -3332,12 +3333,12 @@ static PyObject *py_pdb_set_secret(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
-static PyObject *py_pdb_delete_secret(pytalloc_Object *self, PyObject *args)
+static PyObject *py_pdb_delete_secret(PyObject *self, PyObject *args)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
@@ -3361,169 +3362,169 @@ static PyObject *py_pdb_delete_secret(pytalloc_Object *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 static PyMethodDef py_pdb_methods[] = {
-       { "domain_info", (PyCFunction)py_pdb_domain_info, METH_NOARGS,
+       { "domain_info", py_pdb_domain_info, METH_NOARGS,
                "domain_info() -> str\n\n \
                Get domain information for the database." },
-       { "getsampwnam", (PyCFunction)py_pdb_getsampwnam, METH_VARARGS,
+       { "getsampwnam", py_pdb_getsampwnam, METH_VARARGS,
                "getsampwnam(username) -> samu object\n\n \
                Get user information by name." },
-       { "getsampwsid", (PyCFunction)py_pdb_getsampwsid, METH_VARARGS,
+       { "getsampwsid", py_pdb_getsampwsid, METH_VARARGS,
                "getsampwsid(user_sid) -> samu object\n\n \
                Get user information by sid (dcerpc.security.dom_sid object)." },
-       { "create_user", (PyCFunction)py_pdb_create_user, METH_VARARGS,
+       { "create_user", py_pdb_create_user, METH_VARARGS,
                "create_user(username, acct_flags) -> rid\n\n \
                Create user. acct_flags are samr account control flags." },
-       { "delete_user", (PyCFunction)py_pdb_delete_user, METH_VARARGS,
+       { "delete_user", py_pdb_delete_user, METH_VARARGS,
                "delete_user(samu object) -> None\n\n \
                Delete user." },
-       { "add_sam_account", (PyCFunction)py_pdb_add_sam_account, METH_VARARGS,
+       { "add_sam_account", py_pdb_add_sam_account, METH_VARARGS,
                "add_sam_account(samu object) -> None\n\n \
                Add SAM account." },
-       { "update_sam_account", (PyCFunction)py_pdb_update_sam_account, METH_VARARGS,
+       { "update_sam_account", py_pdb_update_sam_account, METH_VARARGS,
                "update_sam_account(samu object) -> None\n\n \
                Update SAM account." },
-       { "delete_sam_account", (PyCFunction)py_pdb_delete_sam_account, METH_VARARGS,
+       { "delete_sam_account", py_pdb_delete_sam_account, METH_VARARGS,
                "delete_sam_account(samu object) -> None\n\n \
                Delete SAM account." },
-       { "rename_sam_account", (PyCFunction)py_pdb_rename_sam_account, METH_VARARGS,
+       { "rename_sam_account", py_pdb_rename_sam_account, METH_VARARGS,
                "rename_sam_account(samu object1, new_username) -> None\n\n \
                Rename SAM account." },
        /* update_login_attempts */
-       { "getgrsid", (PyCFunction)py_pdb_getgrsid, METH_VARARGS,
+       { "getgrsid", py_pdb_getgrsid, METH_VARARGS,
                "getgrsid(group_sid) -> groupmap object\n\n \
                Get group information by sid (dcerpc.security.dom_sid object)." },
-       { "getgrgid", (PyCFunction)py_pdb_getgrgid, METH_VARARGS,
+       { "getgrgid", py_pdb_getgrgid, METH_VARARGS,
                "getgrsid(gid) -> groupmap object\n\n \
                Get group information by gid." },
-       { "getgrnam", (PyCFunction)py_pdb_getgrnam, METH_VARARGS,
+       { "getgrnam", py_pdb_getgrnam, METH_VARARGS,
                "getgrsid(groupname) -> groupmap object\n\n \
                Get group information by name." },
-       { "create_dom_group", (PyCFunction)py_pdb_create_dom_group, METH_VARARGS,
+       { "create_dom_group", py_pdb_create_dom_group, METH_VARARGS,
                "create_dom_group(groupname) -> group_rid\n\n \
                Create new domain group by name." },
-       { "delete_dom_group", (PyCFunction)py_pdb_delete_dom_group, METH_VARARGS,
+       { "delete_dom_group", py_pdb_delete_dom_group, METH_VARARGS,
                "delete_dom_group(group_rid) -> None\n\n \
                Delete domain group identified by rid" },
-       { "add_group_mapping_entry", (PyCFunction)py_pdb_add_group_mapping_entry, METH_VARARGS,
+       { "add_group_mapping_entry", py_pdb_add_group_mapping_entry, METH_VARARGS,
                "add_group_mapping_entry(groupmap) -> None\n \
                Add group mapping entry for groupmap object." },
-       { "update_group_mapping_entry", (PyCFunction)py_pdb_update_group_mapping_entry, METH_VARARGS,
+       { "update_group_mapping_entry", py_pdb_update_group_mapping_entry, METH_VARARGS,
                "update_group_mapping_entry(groupmap) -> None\n\n \
                Update group mapping entry for groupmap object." },
-       { "delete_group_mapping_entry", (PyCFunction)py_pdb_delete_group_mapping_entry, METH_VARARGS,
+       { "delete_group_mapping_entry", py_pdb_delete_group_mapping_entry, METH_VARARGS,
                "delete_group_mapping_entry(groupmap) -> None\n\n \
                Delete group mapping entry for groupmap object." },
-       { "enum_group_mapping", (PyCFunction)py_pdb_enum_group_mapping, METH_VARARGS,
+       { "enum_group_mapping", py_pdb_enum_group_mapping, METH_VARARGS,
                "enum_group_mapping([domain_sid, [type, [unix_only]]]) -> List\n\n \
                Return list of group mappings as groupmap objects. Optional arguments are domain_sid object, type of group, unix only flag." },
-       { "enum_group_members", (PyCFunction)py_pdb_enum_group_members, METH_VARARGS,
+       { "enum_group_members", py_pdb_enum_group_members, METH_VARARGS,
                "enum_group_members(group_sid) -> List\n\n \
                Return list of users (dom_sid object) in group." },
-       { "enum_group_memberships", (PyCFunction)py_pdb_enum_group_memberships, METH_VARARGS,
+       { "enum_group_memberships", py_pdb_enum_group_memberships, METH_VARARGS,
                "enum_group_memberships(samu object) -> List\n\n \
                Return list of groups (dom_sid object) this user is part of." },
        /* set_unix_primary_group */
-       { "add_groupmem", (PyCFunction)py_pdb_add_groupmem, METH_VARARGS,
+       { "add_groupmem", py_pdb_add_groupmem, METH_VARARGS,
                "add_groupmem(group_rid, member_rid) -> None\n\n \
                Add user to group." },
-       { "del_groupmem", (PyCFunction)py_pdb_del_groupmem, METH_VARARGS,
+       { "del_groupmem", py_pdb_del_groupmem, METH_VARARGS,
                "del_groupmem(group_rid, member_rid) -> None\n\n \
                Remove user from from group." },
-       { "create_alias", (PyCFunction)py_pdb_create_alias, METH_VARARGS,
+       { "create_alias", py_pdb_create_alias, METH_VARARGS,
                "create_alias(alias_name) -> alias_rid\n\n \
                Create alias entry." },
-       { "delete_alias", (PyCFunction)py_pdb_delete_alias, METH_VARARGS,
+       { "delete_alias", py_pdb_delete_alias, METH_VARARGS,
                "delete_alias(alias_sid) -> None\n\n \
                Delete alias entry." },
-       { "get_aliasinfo", (PyCFunction)py_pdb_get_aliasinfo, METH_VARARGS,
+       { "get_aliasinfo", py_pdb_get_aliasinfo, METH_VARARGS,
                "get_aliasinfo(alias_sid) -> Mapping\n\n \
                Get alias information as a dictionary with keys - acct_name, acct_desc, rid." },
-       { "set_aliasinfo", (PyCFunction)py_pdb_set_aliasinfo, METH_VARARGS,
+       { "set_aliasinfo", py_pdb_set_aliasinfo, METH_VARARGS,
                "set_alias_info(alias_sid, Mapping) -> None\n\n \
                Set alias information from a dictionary with keys - acct_name, acct_desc." },
-       { "add_aliasmem", (PyCFunction)py_pdb_add_aliasmem, METH_VARARGS,
+       { "add_aliasmem", py_pdb_add_aliasmem, METH_VARARGS,
                "add_aliasmem(alias_sid, member_sid) -> None\n\n \
                Add user to alias entry." },
-       { "del_aliasmem", (PyCFunction)py_pdb_del_aliasmem, METH_VARARGS,
+       { "del_aliasmem", py_pdb_del_aliasmem, METH_VARARGS,
                "del_aliasmem(alias_sid, member_sid) -> None\n\n \
                Remove a user from alias entry." },
-       { "enum_aliasmem", (PyCFunction)py_pdb_enum_aliasmem, METH_VARARGS,
+       { "enum_aliasmem", py_pdb_enum_aliasmem, METH_VARARGS,
                "enum_aliasmem(alias_sid) -> List\n\n \
                Return a list of members (dom_sid object) for alias entry." },
        /* enum_alias_memberships */
        /* lookup_rids */
        /* lookup_names */
-       { "get_account_policy", (PyCFunction)py_pdb_get_account_policy, METH_NOARGS,
+       { "get_account_policy", py_pdb_get_account_policy, METH_NOARGS,
                "get_account_policy() -> Mapping\n\n \
                Get account policy information as a dictionary." },
-       { "set_account_policy", (PyCFunction)py_pdb_set_account_policy, METH_VARARGS,
+       { "set_account_policy", py_pdb_set_account_policy, METH_VARARGS,
                "get_account_policy(Mapping) -> None\n\n \
                Set account policy settings from a dicionary." },
        /* get_seq_num */
-       { "search_users", (PyCFunction)py_pdb_search_users, METH_VARARGS,
+       { "search_users", py_pdb_search_users, METH_VARARGS,
                "search_users(acct_flags) -> List\n\n \
                Search users. acct_flags are samr account control flags.\n \
                Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
-       { "search_groups", (PyCFunction)py_pdb_search_groups, METH_NOARGS,
+       { "search_groups", py_pdb_search_groups, METH_NOARGS,
                "search_groups() -> List\n\n \
                Search unix only groups. \n \
                Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
-       { "search_aliases", (PyCFunction)py_pdb_search_aliases, METH_VARARGS,
+       { "search_aliases", py_pdb_search_aliases, METH_VARARGS,
                "search_aliases([domain_sid]) -> List\n\n \
                Search aliases. domain_sid is dcerpc.security.dom_sid object.\n \
                Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
-       { "uid_to_sid", (PyCFunction)py_pdb_uid_to_sid, METH_VARARGS,
+       { "uid_to_sid", py_pdb_uid_to_sid, METH_VARARGS,
                "uid_to_sid(uid) -> sid\n\n \
                Return sid for given user id." },
-       { "gid_to_sid", (PyCFunction)py_pdb_gid_to_sid, METH_VARARGS,
+       { "gid_to_sid", py_pdb_gid_to_sid, METH_VARARGS,
                "gid_to_sid(gid) -> sid\n\n \
                Return sid for given group id." },
-       { "sid_to_id", (PyCFunction)py_pdb_sid_to_id, METH_VARARGS,
+       { "sid_to_id", py_pdb_sid_to_id, METH_VARARGS,
                "sid_to_id(sid) -> Tuple\n\n \
                Return id and type for given sid." },
        /* capabilities */
-       { "new_rid", (PyCFunction)py_pdb_new_rid, METH_NOARGS,
+       { "new_rid", py_pdb_new_rid, METH_NOARGS,
                "new_rid() -> rid\n\n \
                Get a new rid." },
-       { "get_trusteddom_pw", (PyCFunction)py_pdb_get_trusteddom_pw, METH_VARARGS,
+       { "get_trusteddom_pw", py_pdb_get_trusteddom_pw, METH_VARARGS,
                "get_trusteddom_pw(domain) -> Mapping\n\n \
                Get trusted domain password, sid and last set time in a dictionary." },
-       { "set_trusteddom_pw", (PyCFunction)py_pdb_set_trusteddom_pw, METH_VARARGS,
+       { "set_trusteddom_pw", py_pdb_set_trusteddom_pw, METH_VARARGS,
                "set_trusteddom_pw(domain, pwd, sid) -> None\n\n \
                Set trusted domain password." },
-       { "del_trusteddom_pw", (PyCFunction)py_pdb_del_trusteddom_pw, METH_VARARGS,
+       { "del_trusteddom_pw", py_pdb_del_trusteddom_pw, METH_VARARGS,
                "del_trusteddom_pw(domain) -> None\n\n \
                Delete trusted domain password." },
-       { "enum_trusteddoms", (PyCFunction)py_pdb_enum_trusteddoms, METH_NOARGS,
+       { "enum_trusteddoms", py_pdb_enum_trusteddoms, METH_NOARGS,
                "enum_trusteddoms() -> List\n\n \
                Get list of trusted domains. Each item is a dictionary with name and sid keys" },
-       { "get_trusted_domain", (PyCFunction)py_pdb_get_trusted_domain, METH_VARARGS,
+       { "get_trusted_domain", py_pdb_get_trusted_domain, METH_VARARGS,
                "get_trusted_domain(domain) -> Mapping\n\n \
                Get trusted domain information by name. Information is a dictionary with keys - domain_name, netbios_name, security_identifier, trust_auth_incoming, trust_auth_outgoing, trust_direction, trust_type, trust_attributes, trust_forest_trust_info." },
-       { "get_trusted_domain_by_sid", (PyCFunction)py_pdb_get_trusted_domain_by_sid, METH_VARARGS,
+       { "get_trusted_domain_by_sid", py_pdb_get_trusted_domain_by_sid, METH_VARARGS,
                "get_trusted_domain_by_sid(domain_sid) -> Mapping\n\n \
                Get trusted domain information by sid. Information is a dictionary with keys - domain_name, netbios_name, security_identifier, trust_auth_incoming, trust_auth_outgoing, trust_direction, trust_type, trust_attributes, trust_forest_trust_info" },
-       { "set_trusted_domain", (PyCFunction)py_pdb_set_trusted_domain, METH_VARARGS,
+       { "set_trusted_domain", py_pdb_set_trusted_domain, METH_VARARGS,
                "set_trusted_domain(domain, Mapping) -> None\n\n \
                Set trusted domain information for domain. Mapping is a dictionary with keys - domain_name, netbios_name, security_identifier, trust_auth_incoming, trust_auth_outgoing, trust_direction, trust_type, trust_attributes, trust_forest_trust_info." },
-       { "del_trusted_domain", (PyCFunction)py_pdb_del_trusted_domain, METH_VARARGS,
+       { "del_trusted_domain", py_pdb_del_trusted_domain, METH_VARARGS,
                "del_trusted_domain(domain) -> None\n\n \
                Delete trusted domain." },
-       { "enum_trusted_domains", (PyCFunction)py_pdb_enum_trusted_domains, METH_VARARGS,
+       { "enum_trusted_domains", py_pdb_enum_trusted_domains, METH_VARARGS,
                "enum_trusted_domains() -> List\n\n \
                Get list of trusted domains. Each entry is a dictionary with keys - domain_name, netbios_name, security_identifier, trust_auth_incoming, trust_auth_outgoing, trust_direction, trust_type, trust_attributes, trust_forest_trust_info." },
-       { "get_secret", (PyCFunction)py_pdb_get_secret, METH_VARARGS,
+       { "get_secret", py_pdb_get_secret, METH_VARARGS,
                "get_secret(secret_name) -> Mapping\n\n \
                Get secret information for secret_name. Information is a dictionary with keys - secret_current, secret_current_lastchange, secret_old, secret_old_lastchange, sd." },
-       { "set_secret", (PyCFunction)py_pdb_set_secret, METH_VARARGS,
+       { "set_secret", py_pdb_set_secret, METH_VARARGS,
                "set_secret(secret_name, Mapping) -> None\n\n \
                Set secret information for secret_name using dictionary with keys - secret_current, sd." },
-       { "delete_secret", (PyCFunction)py_pdb_delete_secret, METH_VARARGS,
+       { "delete_secret", py_pdb_delete_secret, METH_VARARGS,
                "delete_secret(secret_name) -> None\n\n \
                Delete secret information for secret_name." },
        { NULL },
@@ -3567,7 +3568,6 @@ static PyObject *py_pdb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs
 
 static PyTypeObject PyPDB = {
        .tp_name = "passdb.PDB",
-       .tp_basicsize = sizeof(pytalloc_Object),
        .tp_new = py_pdb_new,
        .tp_flags = Py_TPFLAGS_DEFAULT,
        .tp_methods = py_pdb_methods,
@@ -3578,7 +3578,7 @@ static PyTypeObject PyPDB = {
 /*
  * Return a list of passdb backends
  */
-static PyObject *py_passdb_backends(PyObject *self)
+static PyObject *py_passdb_backends(PyObject *self, PyObject *unused)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        PyObject *py_blist;
@@ -3596,7 +3596,7 @@ static PyObject *py_passdb_backends(PyObject *self)
        }
 
        while(entry) {
-               PyList_Append(py_blist, PyString_FromString(entry->name));
+               PyList_Append(py_blist, PyStr_FromString(entry->name));
                entry = entry->next;
        }
 
@@ -3622,8 +3622,8 @@ static PyObject *py_set_smb_config(PyObject *self, PyObject *args)
                return NULL;
        }
 
-       Py_RETURN_NONE;
        talloc_free(frame);
+       Py_RETURN_NONE;
 }
 
 
@@ -3638,7 +3638,7 @@ static PyObject *py_set_secrets_dir(PyObject *self, PyObject *args)
        }
 
        /* Initialize secrets database */
-       if (!secrets_init_path(private_dir, lp_use_ntdb())) {
+       if (!secrets_init_path(private_dir)) {
                PyErr_Format(py_pdb_error, "Cannot open secrets file database in '%s'",
                                private_dir);
                talloc_free(frame);
@@ -3664,7 +3664,7 @@ static PyObject *py_reload_static_pdb(PyObject *self, PyObject *args)
        Py_RETURN_NONE;
 }
 
-static PyObject *py_get_global_sam_sid(PyObject *self)
+static PyObject *py_get_global_sam_sid(PyObject *self, PyObject *unused)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct dom_sid *domain_sid, *domain_sid_copy;
@@ -3687,58 +3687,57 @@ static PyObject *py_get_global_sam_sid(PyObject *self)
 
 
 static PyMethodDef py_passdb_methods[] = {
-       { "get_backends", (PyCFunction)py_passdb_backends, METH_NOARGS,
+       { "get_backends", py_passdb_backends, METH_NOARGS,
                "get_backends() -> list\n\n \
                Get a list of password database backends supported." },
-       { "set_smb_config", (PyCFunction)py_set_smb_config, METH_VARARGS,
+       { "set_smb_config", py_set_smb_config, METH_VARARGS,
                "set_smb_config(path) -> None\n\n \
                Set path to smb.conf file to load configuration parameters." },
-       { "set_secrets_dir", (PyCFunction)py_set_secrets_dir, METH_VARARGS,
+       { "set_secrets_dir", py_set_secrets_dir, METH_VARARGS,
                "set_secrets_dir(private_dir) -> None\n\n \
                Set path to private directory to load secrets database from non-default location." },
-       { "get_global_sam_sid", (PyCFunction)py_get_global_sam_sid, METH_NOARGS,
+       { "get_global_sam_sid", py_get_global_sam_sid, METH_NOARGS,
                "get_global_sam_sid() -> dom_sid\n\n \
                Return domain SID." },
-       { "reload_static_pdb", (PyCFunction)py_reload_static_pdb, METH_NOARGS,
+       { "reload_static_pdb", py_reload_static_pdb, METH_NOARGS,
                "reload_static_pdb() -> None\n\n \
                Re-initalise the static pdb used internally.  Needed if 'passdb backend' is changed." },
        { NULL },
 };
 
-void initpassdb(void)
+static struct PyModuleDef moduledef = {
+    PyModuleDef_HEAD_INIT,
+    .m_name = "passdb",
+    .m_doc = "SAMBA Password Database",
+    .m_size = -1,
+    .m_methods = py_passdb_methods,
+};
+
+MODULE_INIT_FUNC(passdb)
 {
        TALLOC_CTX *frame = talloc_stackframe();
-       PyObject *m, *mod;
+       PyObject *m = NULL, *mod = NULL;
        char exception_name[] = "passdb.error";
 
-       PyTypeObject *talloc_type = pytalloc_GetObjectType();
-       if (talloc_type == NULL) {
-               talloc_free(frame);
-               return;
-       }
-
-       PyPDB.tp_base = talloc_type;
-       if (PyType_Ready(&PyPDB) < 0) {
+       if (pytalloc_BaseObject_PyType_Ready(&PyPDB) < 0) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
 
-       PySamu.tp_base = talloc_type;
-       if (PyType_Ready(&PySamu) < 0) {
+       if (pytalloc_BaseObject_PyType_Ready(&PySamu) < 0) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
 
-       PyGroupmap.tp_base = talloc_type;
-       if (PyType_Ready(&PyGroupmap) < 0) {
+       if (pytalloc_BaseObject_PyType_Ready(&PyGroupmap) < 0) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
 
-       m = Py_InitModule3("passdb", py_passdb_methods, "SAMBA Password Database");
+       m = PyModule_Create(&moduledef);
        if (m == NULL) {
            talloc_free(frame);
-           return;
+           return NULL;
        }
 
        /* Create new exception for passdb module */
@@ -3759,13 +3758,13 @@ void initpassdb(void)
        mod = PyImport_ImportModule("samba.dcerpc.security");
        if (mod == NULL) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
 
        dom_sid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "dom_sid");
        if (dom_sid_Type == NULL) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
 
        /* Import security_descriptor type from dcerpc.security */
@@ -3773,21 +3772,22 @@ void initpassdb(void)
        Py_DECREF(mod);
        if (security_Type == NULL) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
 
        /* Import GUID type from dcerpc.misc */
        mod = PyImport_ImportModule("samba.dcerpc.misc");
        if (mod == NULL) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
 
        guid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "GUID");
        Py_DECREF(mod);
        if (guid_Type == NULL) {
                talloc_free(frame);
-               return;
+               return NULL;
        }
        talloc_free(frame);
+       return m;
 }