mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
s3-passdb: Added python wrapper for passdb methods
Added following methods - uid_to_sid, gid_to_sid, sid_to_id, new_rid - get_trusteddom_pw, set_trusteddom_pw, del_trusteddom_pw, enum_trusteddoms - get_trusted_domain, get_trusted_domain_by_sid, set_trusted_domain, del_trusted_domain, enum_trusted_domains - get_secret, set_secret, delete_secret Updated documentation for all methods Signed-off-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
parent
5b444916bf
commit
f4c7a448d4
@ -43,6 +43,7 @@
|
||||
|
||||
|
||||
static PyTypeObject *dom_sid_Type = NULL;
|
||||
static PyTypeObject *security_Type = NULL;
|
||||
static PyTypeObject *guid_Type = NULL;
|
||||
|
||||
staticforward PyTypeObject PySamu;
|
||||
@ -2544,6 +2545,777 @@ static PyObject *py_pdb_search_aliases(pytalloc_Object *self, PyObject *args)
|
||||
return py_aliaslist;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_uid_to_sid(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
unsigned int uid;
|
||||
struct dom_sid user_sid, *copy_user_sid;
|
||||
PyObject *py_user_sid;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "I:uid_to_sid", &uid)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!methods->uid_to_sid(methods, uid, &user_sid)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get sid for uid=%d", uid);
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
copy_user_sid = dom_sid_dup(tframe, &user_sid);
|
||||
if (copy_user_sid == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_user_sid = pytalloc_steal(dom_sid_Type, copy_user_sid);
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return py_user_sid;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_gid_to_sid(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
unsigned int gid;
|
||||
struct dom_sid group_sid, *copy_group_sid;
|
||||
PyObject *py_group_sid;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "I:gid_to_sid", &gid)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!methods->gid_to_sid(methods, gid, &group_sid)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get sid for gid=%d", gid);
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
copy_group_sid = dom_sid_dup(tframe, &group_sid);
|
||||
if (copy_group_sid == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_group_sid = pytalloc_steal(dom_sid_Type, copy_group_sid);
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return py_group_sid;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_sid_to_id(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
PyObject *py_sid;
|
||||
struct dom_sid *sid;
|
||||
union unid_t id;
|
||||
enum lsa_SidType type;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O!:sid_to_id", dom_sid_Type, &py_sid)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sid = pytalloc_get_ptr(py_sid);
|
||||
|
||||
if (!methods->sid_to_id(methods, sid, &id, &type)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get id for sid");
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return Py_BuildValue("(II)", id.uid, type);
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_new_rid(pytalloc_Object *self)
|
||||
{
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
uint32_t rid;
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!methods->new_rid(methods, &rid)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get new rid");
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return PyInt_FromLong(rid);
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_get_trusteddom_pw(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *domain;
|
||||
char *pwd;
|
||||
struct dom_sid sid, *copy_sid;
|
||||
PyObject *py_sid;
|
||||
time_t last_set_time;
|
||||
PyObject *py_value;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s:get_trusteddom_pw", &domain)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!methods->get_trusteddom_pw(methods, domain, &pwd, &sid, &last_set_time)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get trusted domain password");
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
copy_sid = dom_sid_dup(tframe, &sid);
|
||||
if (copy_sid == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_sid = pytalloc_steal(dom_sid_Type, copy_sid);
|
||||
if (py_sid == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
py_value = PyDict_New();
|
||||
if (py_value == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyDict_SetItemString(py_value, "pwd", PyString_FromString(pwd));
|
||||
PyDict_SetItemString(py_value, "sid", py_sid);
|
||||
PyDict_SetItemString(py_value, "last_set_tim", PyInt_FromLong(last_set_time));
|
||||
|
||||
return py_value;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_set_trusteddom_pw(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *domain;
|
||||
const char *pwd;
|
||||
const struct dom_sid *domain_sid;
|
||||
PyObject *py_domain_sid;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ssO!:set_trusteddom_pw", &domain, &pwd,
|
||||
dom_sid_Type, &py_domain_sid)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
domain_sid = pytalloc_get_ptr(py_domain_sid);
|
||||
|
||||
if (!methods->set_trusteddom_pw(methods, domain, pwd, domain_sid)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to set trusted domain password");
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_del_trusteddom_pw(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *domain;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s:del_trusteddom_pw", &domain)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!methods->del_trusteddom_pw(methods, domain)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to delete trusted domain password");
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_enum_trusteddoms(pytalloc_Object *self)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
uint32_t num_domains;
|
||||
struct trustdom_info **domains;
|
||||
PyObject *py_domain_list, *py_dict;
|
||||
int i;
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = methods->enum_trusteddoms(methods, tframe, &num_domains, &domains);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to enumerate trusted domains, (%d,%s)",
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_domain_list = PyList_New(0);
|
||||
if (py_domain_list == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for(i=0; i<num_domains; i++) {
|
||||
py_dict = PyDict_New();
|
||||
if (py_dict) {
|
||||
PyDict_SetItemString(py_dict, "name",
|
||||
PyString_FromString(domains[i]->name));
|
||||
PyDict_SetItemString(py_dict, "sid",
|
||||
pytalloc_steal(dom_sid_Type, &domains[i]->sid));
|
||||
}
|
||||
|
||||
PyList_Append(py_domain_list, py_dict);
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return py_domain_list;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_get_trusted_domain(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *domain;
|
||||
struct pdb_trusted_domain *td;
|
||||
PyObject *py_domain_info;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s:get_trusted_domain", &domain)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = methods->get_trusted_domain(methods, tframe, domain, &td);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get trusted domain information, (%d,%s)",
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_domain_info = PyDict_New();
|
||||
if (py_domain_info == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyDict_SetItemString(py_domain_info, "domain_name",
|
||||
PyString_FromString(td->domain_name));
|
||||
PyDict_SetItemString(py_domain_info, "netbios_name",
|
||||
PyString_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,
|
||||
td->trust_auth_incoming.length));
|
||||
PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
|
||||
PyString_FromStringAndSize((char *)td->trust_auth_outgoing.data,
|
||||
td->trust_auth_outgoing.length));
|
||||
PyDict_SetItemString(py_domain_info, "trust_direction",
|
||||
PyInt_FromLong(td->trust_direction));
|
||||
PyDict_SetItemString(py_domain_info, "trust_type",
|
||||
PyInt_FromLong(td->trust_type));
|
||||
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,
|
||||
td->trust_forest_trust_info.length));
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return py_domain_info;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_get_trusted_domain_by_sid(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
PyObject *py_domain_sid;
|
||||
struct dom_sid *domain_sid;
|
||||
struct pdb_trusted_domain *td;
|
||||
PyObject *py_domain_info;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O!:get_trusted_domain_by_sid", dom_sid_Type, &py_domain_sid)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
domain_sid = pytalloc_get_ptr(py_domain_sid);
|
||||
|
||||
status = methods->get_trusted_domain_by_sid(methods, tframe, domain_sid, &td);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get trusted domain information, (%d,%s)",
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_domain_info = PyDict_New();
|
||||
if (py_domain_info == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyDict_SetItemString(py_domain_info, "domain_name",
|
||||
PyString_FromString(td->domain_name));
|
||||
PyDict_SetItemString(py_domain_info, "netbios_name",
|
||||
PyString_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,
|
||||
td->trust_auth_incoming.length));
|
||||
PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
|
||||
PyString_FromStringAndSize((char *)td->trust_auth_outgoing.data,
|
||||
td->trust_auth_outgoing.length));
|
||||
PyDict_SetItemString(py_domain_info, "trust_direction",
|
||||
PyInt_FromLong(td->trust_direction));
|
||||
PyDict_SetItemString(py_domain_info, "trust_type",
|
||||
PyInt_FromLong(td->trust_type));
|
||||
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,
|
||||
td->trust_forest_trust_info.length));
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return py_domain_info;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_set_trusted_domain(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *domain;
|
||||
PyObject *py_td_info;
|
||||
struct pdb_trusted_domain td_info;
|
||||
PyObject *py_tmp;
|
||||
Py_ssize_t len;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "sO!:set_trusted_domain", &domain, &PyDict_Type, &py_td_info)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_tmp = PyDict_GetItemString(py_td_info, "domain_name");
|
||||
td_info.domain_name = PyString_AsString(py_tmp);
|
||||
|
||||
py_tmp = PyDict_GetItemString(py_td_info, "netbios_name");
|
||||
td_info.netbios_name = PyString_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);
|
||||
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);
|
||||
td_info.trust_auth_outgoing.length = len;
|
||||
|
||||
py_tmp = PyDict_GetItemString(py_td_info, "trust_direction");
|
||||
td_info.trust_direction = PyInt_AsLong(py_tmp);
|
||||
|
||||
py_tmp = PyDict_GetItemString(py_td_info, "trust_type");
|
||||
td_info.trust_type = PyInt_AsLong(py_tmp);
|
||||
|
||||
py_tmp = PyDict_GetItemString(py_td_info, "trust_attributes");
|
||||
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);
|
||||
td_info.trust_forest_trust_info.length = len;
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = methods->set_trusted_domain(methods, domain, &td_info);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to set trusted domain information, (%d,%s)",
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_del_trusted_domain(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *domain;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s:del_trusted_domain", &domain)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = methods->del_trusted_domain(methods, domain);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to delete trusted domain, (%d,%s)",
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_enum_trusted_domains(pytalloc_Object *self)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
uint32_t num_domains;
|
||||
struct pdb_trusted_domain **td_info, *td;
|
||||
PyObject *py_td_info, *py_domain_info;
|
||||
int i;
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = methods->enum_trusted_domains(methods, tframe, &num_domains, &td_info);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to delete trusted domain, (%d,%s)",
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_td_info = PyList_New(0);
|
||||
if (py_td_info == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i=0; i<num_domains; i++) {
|
||||
|
||||
py_domain_info = PyDict_New();
|
||||
if (py_domain_info == NULL) {
|
||||
PyErr_NoMemory();
|
||||
Py_DECREF(py_td_info);
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
td = td_info[i];
|
||||
|
||||
PyDict_SetItemString(py_domain_info, "domain_name",
|
||||
PyString_FromString(td->domain_name));
|
||||
PyDict_SetItemString(py_domain_info, "netbios_name",
|
||||
PyString_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,
|
||||
td->trust_auth_incoming.length));
|
||||
PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
|
||||
PyString_FromStringAndSize((char *)td->trust_auth_outgoing.data,
|
||||
td->trust_auth_outgoing.length));
|
||||
PyDict_SetItemString(py_domain_info, "trust_direction",
|
||||
PyInt_FromLong(td->trust_direction));
|
||||
PyDict_SetItemString(py_domain_info, "trust_type",
|
||||
PyInt_FromLong(td->trust_type));
|
||||
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,
|
||||
td->trust_forest_trust_info.length));
|
||||
PyList_Append(py_td_info, py_domain_info);
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return py_td_info;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_get_secret(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *secret_name;
|
||||
DATA_BLOB secret_current, secret_old;
|
||||
NTTIME secret_current_lastchange, secret_old_lastchange;
|
||||
PyObject *py_sd;
|
||||
struct security_descriptor *sd;
|
||||
PyObject *py_secret;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s:get_secret_name", &secret_name)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_sd = pytalloc_new(struct security_descriptor, security_Type);
|
||||
if (py_sd == NULL) {
|
||||
PyErr_NoMemory();
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
sd = pytalloc_get_ptr(py_sd);
|
||||
|
||||
status = methods->get_secret(methods, tframe, secret_name,
|
||||
&secret_current,
|
||||
&secret_current_lastchange,
|
||||
&secret_old,
|
||||
&secret_old_lastchange,
|
||||
&sd);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to get information for secret (%s), (%d,%s)",
|
||||
secret_name,
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_secret = PyDict_New();
|
||||
if (py_secret == NULL) {
|
||||
PyErr_NoMemory();
|
||||
Py_DECREF(py_sd);
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyDict_SetItemString(py_secret, "secret_current",
|
||||
PyString_FromStringAndSize((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));
|
||||
PyDict_SetItemString(py_secret, "secret_old_lastchange",
|
||||
PyLong_FromUnsignedLongLong(secret_old_lastchange));
|
||||
PyDict_SetItemString(py_secret, "sd", py_sd);
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
return py_secret;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_set_secret(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *secret_name;
|
||||
PyObject *py_secret;
|
||||
PyObject *py_secret_cur, *py_secret_old, *py_sd;
|
||||
DATA_BLOB secret_current, secret_old;
|
||||
struct security_descriptor *sd;
|
||||
Py_ssize_t len;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "sO!:set_secret_name", &secret_name, PyDict_Type, &py_secret)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_secret_cur = PyDict_GetItemString(py_secret, "secret_current");
|
||||
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(security_Type, py_sd, return NULL;);
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyString_AsStringAndSize(py_secret_cur, (char **)&secret_current.data, &len);
|
||||
secret_current.length = len;
|
||||
PyString_AsStringAndSize(py_secret_old, (char **)&secret_old.data, &len);
|
||||
secret_current.length = len;
|
||||
sd = pytalloc_get_ptr(py_sd);
|
||||
|
||||
status = methods->set_secret(methods, secret_name, &secret_current, &secret_old, sd);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to set information for secret (%s), (%d,%s)",
|
||||
secret_name,
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *py_pdb_delete_secret(pytalloc_Object *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct pdb_methods *methods;
|
||||
TALLOC_CTX *tframe;
|
||||
const char *secret_name;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s:delete_secret", &secret_name)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
methods = pytalloc_get_ptr(self);
|
||||
|
||||
if ((tframe = talloc_stackframe()) == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = methods->delete_secret(methods, secret_name);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_Format(py_pdb_error, "Unable to delete secret (%s), (%d,%s)",
|
||||
secret_name,
|
||||
NT_STATUS_V(status),
|
||||
get_friendly_nt_error_msg(status));
|
||||
talloc_free(tframe);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_free(tframe);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyMethodDef py_pdb_methods[] = {
|
||||
{ "domain_info", (PyCFunction)py_pdb_domain_info, METH_NOARGS,
|
||||
"domain_info() -> str\n\n \
|
||||
@ -2598,11 +3370,11 @@ static PyMethodDef py_pdb_methods[] = {
|
||||
"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(domain_sid) -> List\n\n \
|
||||
Return list of group mappings as groupmap objects." },
|
||||
"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(group_sid) -> List\n\n \
|
||||
Return list of group members." },
|
||||
Return list of users (dom_sid object) in group." },
|
||||
/* enum_group_memberships */
|
||||
/* set_unix_primary_group */
|
||||
{ "add_groupmem", (PyCFunction)py_pdb_add_groupmem, METH_VARARGS,
|
||||
@ -2631,7 +3403,7 @@ static PyMethodDef py_pdb_methods[] = {
|
||||
Remove a user from alias entry." },
|
||||
{ "enum_aliasmem", (PyCFunction)py_pdb_enum_aliasmem, METH_VARARGS,
|
||||
"enum_aliasmem(alias_sid) -> List\n\n \
|
||||
Return a list of users for alias entry." },
|
||||
Return a list of members (dom_sid object) for alias entry." },
|
||||
/* enum_alias_memberships */
|
||||
/* lookup_rids */
|
||||
/* lookup_names */
|
||||
@ -2654,23 +3426,55 @@ static PyMethodDef py_pdb_methods[] = {
|
||||
"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 */
|
||||
/* gid_to_sid */
|
||||
/* sid_to_id */
|
||||
{ "uid_to_sid", (PyCFunction)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(gid) -> sid\n\n \
|
||||
Return sid for given group id." },
|
||||
{ "sid_to_id", (PyCFunction)py_pdb_sid_to_id, METH_VARARGS,
|
||||
"sid_to_id(sid) -> Tuple\n\n \
|
||||
Return id and type for given sid." },
|
||||
/* capabilities */
|
||||
/* new_rid */
|
||||
/* get_trusteddom_pw */
|
||||
/* set_trusteddom_pw */
|
||||
/* del_trusteddom_pw */
|
||||
/* enum_trusteddoms */
|
||||
/* get_trusted_domain */
|
||||
/* get_trusted_domain_by_sid */
|
||||
/* set_trusted_domain */
|
||||
/* del_trusted_domain */
|
||||
/* enum_trusted_domains */
|
||||
/* get_secret */
|
||||
/* set_secret */
|
||||
/* delete_secret */
|
||||
{ "new_rid", (PyCFunction)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(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(domain, pwd, sid) -> None\n\n \
|
||||
Set trusted domain password." },
|
||||
{ "del_trusteddom_pw", (PyCFunction)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() -> 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(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(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(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(domain) -> None\n\n \
|
||||
Delete trusted domain." },
|
||||
{ "enum_trusted_domains", (PyCFunction)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(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(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(secret_name) -> None\n\n \
|
||||
Delete secret information for secret_name." },
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
@ -2898,11 +3702,17 @@ void initpassdb(void)
|
||||
}
|
||||
|
||||
dom_sid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "dom_sid");
|
||||
Py_DECREF(mod);
|
||||
if (dom_sid_Type == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Import security_descriptor type from dcerpc.security */
|
||||
security_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "descriptor");
|
||||
Py_DECREF(mod);
|
||||
if (security_Type == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Import GUID type from dcerpc.misc */
|
||||
mod = PyImport_ImportModule("samba.dcerpc.misc");
|
||||
if (mod == NULL) {
|
||||
|
Loading…
Reference in New Issue
Block a user