2 Python interface to passdb
4 Copyright (C) Amitay Isaacs 2011
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "python/py3compat.h"
24 #include "lib/util/talloc_stack.h"
25 #include "libcli/security/security.h"
26 #include "librpc/gen_ndr/idmap.h"
31 #ifndef Py_TYPE /* Py_TYPE is only available on Python > 2.6 */
32 #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
36 #define PY_CHECK_TYPE(type, var, fail) \
37 if (!PyObject_TypeCheck(var, type)) {\
38 PyErr_Format(PyExc_TypeError, __location__ ": Expected type '%s' for '%s' of type '%s'", (type)->tp_name, #var, Py_TYPE(var)->tp_name); \
44 static PyTypeObject *dom_sid_Type = NULL;
45 static PyTypeObject *security_Type = NULL;
46 static PyTypeObject *guid_Type = NULL;
48 static PyTypeObject PySamu;
49 static PyTypeObject PyGroupmap;
50 static PyTypeObject PyPDB;
52 static PyObject *py_pdb_error;
54 void initpassdb(void);
57 /************************** PIDL Autogeneratd ******************************/
59 static PyObject *py_samu_get_logon_time(PyObject *obj, void *closure)
61 TALLOC_CTX *frame = talloc_stackframe();
62 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
63 PyObject *py_logon_time;
65 py_logon_time = PyInt_FromLong(pdb_get_logon_time(sam_acct));
70 static int py_samu_set_logon_time(PyObject *obj, PyObject *value, void *closure)
72 TALLOC_CTX *frame = talloc_stackframe();
73 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
75 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
76 if (!pdb_set_logon_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
84 static PyObject *py_samu_get_logoff_time(PyObject *obj, void *closure)
86 TALLOC_CTX *frame = talloc_stackframe();
87 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
88 PyObject *py_logoff_time;
90 py_logoff_time = PyInt_FromLong(pdb_get_logoff_time(sam_acct));
92 return py_logoff_time;
95 static int py_samu_set_logoff_time(PyObject *obj, PyObject *value, void *closure)
97 TALLOC_CTX *frame = talloc_stackframe();
98 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
100 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
101 if (!pdb_set_logoff_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
109 static PyObject *py_samu_get_kickoff_time(PyObject *obj, void *closure)
111 TALLOC_CTX *frame = talloc_stackframe();
112 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
113 PyObject *py_kickoff_time;
115 py_kickoff_time = PyInt_FromLong(pdb_get_kickoff_time(sam_acct));
117 return py_kickoff_time;
120 static int py_samu_set_kickoff_time(PyObject *obj, PyObject *value, void *closure)
122 TALLOC_CTX *frame = talloc_stackframe();
123 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
125 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
126 if (!pdb_set_kickoff_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
134 static PyObject *py_samu_get_bad_password_time(PyObject *obj, void *closure)
136 TALLOC_CTX *frame = talloc_stackframe();
137 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
138 PyObject *py_bad_password_time;
140 py_bad_password_time = PyInt_FromLong(pdb_get_bad_password_time(sam_acct));
142 return py_bad_password_time;
145 static int py_samu_set_bad_password_time(PyObject *obj, PyObject *value, void *closure)
147 TALLOC_CTX *frame = talloc_stackframe();
148 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
150 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
151 if (!pdb_set_bad_password_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
159 static PyObject *py_samu_get_pass_last_set_time(PyObject *obj, void *closure)
161 TALLOC_CTX *frame = talloc_stackframe();
162 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
163 PyObject *py_pass_last_set_time;
165 py_pass_last_set_time = PyInt_FromLong(pdb_get_pass_last_set_time(sam_acct));
167 return py_pass_last_set_time;
170 static int py_samu_set_pass_last_set_time(PyObject *obj, PyObject *value, void *closure)
172 TALLOC_CTX *frame = talloc_stackframe();
173 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
175 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
176 if (!pdb_set_pass_last_set_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
184 static PyObject *py_samu_get_pass_can_change_time(PyObject *obj, void *closure)
186 TALLOC_CTX *frame = talloc_stackframe();
187 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
188 PyObject *py_pass_can_change_time;
190 py_pass_can_change_time = PyInt_FromLong(pdb_get_pass_can_change_time(sam_acct));
192 return py_pass_can_change_time;
195 static int py_samu_set_pass_can_change_time(PyObject *obj, PyObject *value, void *closure)
197 TALLOC_CTX *frame = talloc_stackframe();
198 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
200 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
201 if (!pdb_set_pass_can_change_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
209 static PyObject *py_samu_get_pass_must_change_time(PyObject *obj, void *closure)
211 TALLOC_CTX *frame = talloc_stackframe();
212 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
213 PyObject *py_pass_must_change_time;
215 py_pass_must_change_time = PyInt_FromLong(pdb_get_pass_must_change_time(sam_acct));
217 return py_pass_must_change_time;
220 static int py_samu_set_pass_must_change_time(PyObject *obj, PyObject *value, void *closure)
222 TALLOC_CTX *frame = talloc_stackframe();
223 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
225 /* TODO: make this not a get/set or give a better exception */
230 static PyObject *py_samu_get_username(PyObject *obj, void *closure)
232 TALLOC_CTX *frame = talloc_stackframe();
233 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
234 PyObject *py_username;
235 const char *username;
237 username = pdb_get_username(sam_acct);
238 if (username == NULL) {
242 py_username = PyStr_FromString(username);
247 static int py_samu_set_username(PyObject *obj, PyObject *value, void *closure)
249 TALLOC_CTX *frame = talloc_stackframe();
250 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
252 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
253 if (!pdb_set_username(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
261 static PyObject *py_samu_get_domain(PyObject *obj, void *closure)
263 TALLOC_CTX *frame = talloc_stackframe();
264 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
268 domain = pdb_get_domain(sam_acct);
269 if (domain == NULL) {
273 py_domain = PyStr_FromString(domain);
278 static int py_samu_set_domain(PyObject *obj, PyObject *value, void *closure)
280 TALLOC_CTX *frame = talloc_stackframe();
281 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
283 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
284 if (!pdb_set_domain(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
292 static PyObject *py_samu_get_nt_username(PyObject *obj, void *closure)
294 TALLOC_CTX *frame = talloc_stackframe();
295 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
296 PyObject *py_nt_username;
297 const char *nt_username;
299 nt_username = pdb_get_nt_username(sam_acct);
300 if (nt_username == NULL) {
304 py_nt_username = PyStr_FromString(nt_username);
306 return py_nt_username;
309 static int py_samu_set_nt_username(PyObject *obj, PyObject *value, void *closure)
311 TALLOC_CTX *frame = talloc_stackframe();
312 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
314 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
315 if (!pdb_set_nt_username(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
323 static PyObject *py_samu_get_full_name(PyObject *obj, void *closure)
325 TALLOC_CTX *frame = talloc_stackframe();
326 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
327 PyObject *py_full_name;
328 const char *full_name;
330 full_name = pdb_get_fullname(sam_acct);
331 if (full_name == NULL) {
335 py_full_name = PyStr_FromString(full_name);
340 static int py_samu_set_full_name(PyObject *obj, PyObject *value, void *closure)
342 TALLOC_CTX *frame = talloc_stackframe();
343 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
345 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
346 if (!pdb_set_fullname(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
354 static PyObject *py_samu_get_home_dir(PyObject *obj, void *closure)
356 TALLOC_CTX *frame = talloc_stackframe();
357 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
358 PyObject *py_home_dir;
359 const char *home_dir;
361 home_dir = pdb_get_homedir(sam_acct);
362 if (home_dir == NULL) {
366 py_home_dir = PyStr_FromString(home_dir);
371 static int py_samu_set_home_dir(PyObject *obj, PyObject *value, void *closure)
373 TALLOC_CTX *frame = talloc_stackframe();
374 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
376 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
377 if (!pdb_set_homedir(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
385 static PyObject *py_samu_get_dir_drive(PyObject *obj, void *closure)
387 TALLOC_CTX *frame = talloc_stackframe();
388 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
389 PyObject *py_dir_drive;
390 const char *dir_drive;
392 dir_drive = pdb_get_dir_drive(sam_acct);
393 if (dir_drive == NULL) {
397 py_dir_drive = PyStr_FromString(dir_drive);
402 static int py_samu_set_dir_drive(PyObject *obj, PyObject *value, void *closure)
404 TALLOC_CTX *frame = talloc_stackframe();
405 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
407 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
408 if (!pdb_set_dir_drive(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
416 static PyObject *py_samu_get_logon_script(PyObject *obj, void *closure)
418 TALLOC_CTX *frame = talloc_stackframe();
419 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
420 PyObject *py_logon_script;
421 const char *logon_script;
423 logon_script = pdb_get_logon_script(sam_acct);
424 if (logon_script == NULL) {
428 py_logon_script = PyStr_FromString(logon_script);
430 return py_logon_script;
433 static int py_samu_set_logon_script(PyObject *obj, PyObject *value, void *closure)
435 TALLOC_CTX *frame = talloc_stackframe();
436 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
438 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
439 if (!pdb_set_logon_script(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
447 static PyObject *py_samu_get_profile_path(PyObject *obj, void *closure)
449 TALLOC_CTX *frame = talloc_stackframe();
450 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
451 PyObject *py_profile_path;
452 const char *profile_path;
454 profile_path = pdb_get_profile_path(sam_acct);
455 if (profile_path == NULL) {
459 py_profile_path = PyStr_FromString(profile_path);
461 return py_profile_path;
464 static int py_samu_set_profile_path(PyObject *obj, PyObject *value, void *closure)
466 TALLOC_CTX *frame = talloc_stackframe();
467 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
469 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
470 if (!pdb_set_profile_path(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
478 static PyObject *py_samu_get_acct_desc(PyObject *obj, void *closure)
480 TALLOC_CTX *frame = talloc_stackframe();
481 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
482 PyObject *py_acct_desc;
483 const char *acct_desc;
485 acct_desc = pdb_get_acct_desc(sam_acct);
486 if (acct_desc == NULL) {
490 py_acct_desc = PyStr_FromString(acct_desc);
495 static int py_samu_set_acct_desc(PyObject *obj, PyObject *value, void *closure)
497 TALLOC_CTX *frame = talloc_stackframe();
498 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
500 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
501 if (!pdb_set_acct_desc(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
509 static PyObject *py_samu_get_workstations(PyObject *obj, void *closure)
511 TALLOC_CTX *frame = talloc_stackframe();
512 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
513 PyObject *py_workstations;
514 const char *workstations;
516 workstations = pdb_get_workstations(sam_acct);
517 if (workstations == NULL) {
521 py_workstations = PyStr_FromString(workstations);
523 return py_workstations;
526 static int py_samu_set_workstations(PyObject *obj, PyObject *value, void *closure)
528 TALLOC_CTX *frame = talloc_stackframe();
529 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
531 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
532 if (!pdb_set_workstations(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
540 static PyObject *py_samu_get_comment(PyObject *obj, void *closure)
542 TALLOC_CTX *frame = talloc_stackframe();
543 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
544 PyObject *py_comment;
547 comment = pdb_get_comment(sam_acct);
548 if (comment == NULL) {
552 py_comment = PyStr_FromString(comment);
557 static int py_samu_set_comment(PyObject *obj, PyObject *value, void *closure)
559 TALLOC_CTX *frame = talloc_stackframe();
560 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
562 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
563 if (!pdb_set_comment(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
571 static PyObject *py_samu_get_munged_dial(PyObject *obj, void *closure)
573 TALLOC_CTX *frame = talloc_stackframe();
574 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
575 PyObject *py_munged_dial;
576 const char *munged_dial;
578 munged_dial = pdb_get_munged_dial(sam_acct);
579 if (munged_dial == NULL) {
583 py_munged_dial = PyStr_FromString(munged_dial);
585 return py_munged_dial;
588 static int py_samu_set_munged_dial(PyObject *obj, PyObject *value, void *closure)
590 TALLOC_CTX *frame = talloc_stackframe();
591 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
593 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
594 if (!pdb_set_munged_dial(sam_acct, PyStr_AsString(value), PDB_CHANGED)) {
602 static PyObject *py_samu_get_user_sid(PyObject *obj, void *closure)
604 TALLOC_CTX *frame = talloc_stackframe();
605 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
606 PyObject *py_user_sid;
607 const struct dom_sid *user_sid;
608 struct dom_sid *copy_user_sid;
611 user_sid = pdb_get_user_sid(sam_acct);
612 if(user_sid == NULL) {
616 mem_ctx = talloc_new(NULL);
617 if (mem_ctx == NULL) {
622 copy_user_sid = dom_sid_dup(mem_ctx, user_sid);
623 if (copy_user_sid == NULL) {
625 talloc_free(mem_ctx);
630 py_user_sid = pytalloc_steal(dom_sid_Type, copy_user_sid);
632 talloc_free(mem_ctx);
638 static int py_samu_set_user_sid(PyObject *obj, PyObject *value, void *closure)
640 TALLOC_CTX *frame = talloc_stackframe();
641 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
643 PY_CHECK_TYPE(dom_sid_Type, value, return -1;);
644 if (!pdb_set_user_sid(sam_acct, (struct dom_sid *)pytalloc_get_ptr(value), PDB_CHANGED)) {
652 static PyObject *py_samu_get_group_sid(PyObject *obj, void *closure)
654 TALLOC_CTX *frame = talloc_stackframe();
655 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
656 const struct dom_sid *group_sid;
657 struct dom_sid *copy_group_sid;
659 group_sid = pdb_get_group_sid(sam_acct);
660 if (group_sid == NULL) {
664 copy_group_sid = dom_sid_dup(NULL, group_sid);
665 if (copy_group_sid == NULL) {
672 return pytalloc_steal(dom_sid_Type, copy_group_sid);
675 static int py_samu_set_group_sid(PyObject *obj, PyObject *value, void *closure)
677 TALLOC_CTX *frame = talloc_stackframe();
678 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
680 PY_CHECK_TYPE(dom_sid_Type, value, return -1;);
681 if (!pdb_set_group_sid(sam_acct, (struct dom_sid *)pytalloc_get_ptr(value), PDB_CHANGED)) {
689 static PyObject *py_samu_get_lanman_passwd(PyObject *obj, void *closure)
691 TALLOC_CTX *frame = talloc_stackframe();
692 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
696 lm_pw = (const char *)pdb_get_lanman_passwd(sam_acct);
701 py_lm_pw = PyBytes_FromStringAndSize(lm_pw, LM_HASH_LEN);
706 static int py_samu_set_lanman_passwd(PyObject *obj, PyObject *value, void *closure)
708 TALLOC_CTX *frame = talloc_stackframe();
709 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
711 PY_CHECK_TYPE(&PyBytes_Type, value, return -1;);
712 if (!pdb_set_lanman_passwd(sam_acct, (uint8_t *)PyBytes_AsString(value), PDB_CHANGED)) {
720 static PyObject *py_samu_get_nt_passwd(PyObject *obj, void *closure)
722 TALLOC_CTX *frame = talloc_stackframe();
723 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
727 nt_pw = (const char *)pdb_get_nt_passwd(sam_acct);
732 py_nt_pw = PyBytes_FromStringAndSize(nt_pw, NT_HASH_LEN);
737 static int py_samu_set_nt_passwd(PyObject *obj, PyObject *value, void *closure)
739 TALLOC_CTX *frame = talloc_stackframe();
740 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
742 if (!pdb_set_nt_passwd(sam_acct, (uint8_t *)PyBytes_AsString(value), PDB_CHANGED)) {
750 static PyObject *py_samu_get_pw_history(PyObject *obj, void *closure)
752 TALLOC_CTX *frame = talloc_stackframe();
753 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
754 PyObject *py_nt_pw_his;
755 const char *nt_pw_his;
758 nt_pw_his = (const char *)pdb_get_pw_history(sam_acct, &hist_len);
759 if (nt_pw_his == NULL) {
763 py_nt_pw_his = PyBytes_FromStringAndSize(nt_pw_his, hist_len*PW_HISTORY_ENTRY_LEN);
768 static int py_samu_set_pw_history(PyObject *obj, PyObject *value, void *closure)
770 TALLOC_CTX *frame = talloc_stackframe();
771 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
776 PyBytes_AsStringAndSize(value, &nt_pw_his, &len);
777 hist_len = len / PW_HISTORY_ENTRY_LEN;
778 if (!pdb_set_pw_history(sam_acct, (uint8_t *)nt_pw_his, hist_len, PDB_CHANGED)) {
786 static PyObject *py_samu_get_plaintext_passwd(PyObject *obj, void *closure)
788 TALLOC_CTX *frame = talloc_stackframe();
789 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
790 PyObject *py_plaintext_pw;
791 const char *plaintext_pw;
793 plaintext_pw = pdb_get_plaintext_passwd(sam_acct);
794 if (plaintext_pw == NULL) {
798 py_plaintext_pw = PyStr_FromString(plaintext_pw);
800 return py_plaintext_pw;
803 static int py_samu_set_plaintext_passwd(PyObject *obj, PyObject *value, void *closure)
805 TALLOC_CTX *frame = talloc_stackframe();
806 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
808 if (!pdb_set_plaintext_passwd(sam_acct, PyStr_AsString(value))) {
816 static PyObject *py_samu_get_acct_ctrl(PyObject *obj, void *closure)
818 TALLOC_CTX *frame = talloc_stackframe();
819 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
820 PyObject *py_acct_ctrl;
822 py_acct_ctrl = PyInt_FromLong(pdb_get_acct_ctrl(sam_acct));
827 static int py_samu_set_acct_ctrl(PyObject *obj, PyObject *value, void *closure)
829 TALLOC_CTX *frame = talloc_stackframe();
830 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
832 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
833 if (!pdb_set_acct_ctrl(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
841 static PyObject *py_samu_get_logon_divs(PyObject *obj, void *closure)
843 TALLOC_CTX *frame = talloc_stackframe();
844 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
845 PyObject *py_logon_divs;
847 py_logon_divs = PyInt_FromLong(pdb_get_logon_divs(sam_acct));
849 return py_logon_divs;
852 static int py_samu_set_logon_divs(PyObject *obj, PyObject *value, void *closure)
854 TALLOC_CTX *frame = talloc_stackframe();
855 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
857 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
858 if (!pdb_set_logon_divs(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
866 static PyObject *py_samu_get_hours_len(PyObject *obj, void *closure)
868 TALLOC_CTX *frame = talloc_stackframe();
869 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
870 PyObject *py_hours_len;
872 py_hours_len = PyInt_FromLong(pdb_get_hours_len(sam_acct));
877 static int py_samu_set_hours_len(PyObject *obj, PyObject *value, void *closure)
879 TALLOC_CTX *frame = talloc_stackframe();
880 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
882 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
883 if (!pdb_set_hours_len(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
891 static PyObject *py_samu_get_hours(PyObject *obj, void *closure)
893 TALLOC_CTX *frame = talloc_stackframe();
894 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
899 hours = (const char *)pdb_get_hours(sam_acct);
904 hours_len = pdb_get_hours_len(sam_acct);
905 if ((py_hours = PyList_New(hours_len)) == NULL) {
911 for (i=0; i<hours_len; i++) {
912 PyList_SetItem(py_hours, i, PyInt_FromLong(hours[i]));
918 static int py_samu_set_hours(PyObject *obj, PyObject *value, void *closure)
920 TALLOC_CTX *frame = talloc_stackframe();
921 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
927 PY_CHECK_TYPE(&PyList_Type, value, return -1;);
929 hours_len = PyList_GET_SIZE(value);
931 hours = talloc_array(pytalloc_get_mem_ctx(obj), uint8_t, hours_len);
938 for (i=0; i < hours_len; i++) {
939 PY_CHECK_TYPE(&PyInt_Type, PyList_GET_ITEM(value,i), return -1;);
940 hours[i] = PyInt_AsLong(PyList_GET_ITEM(value, i));
943 status = pdb_set_hours(sam_acct, hours, hours_len, PDB_CHANGED);
954 static PyObject *py_samu_get_bad_password_count(PyObject *obj, void *closure)
956 TALLOC_CTX *frame = talloc_stackframe();
957 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
958 PyObject *py_bad_password_count;
960 py_bad_password_count = PyInt_FromLong(pdb_get_bad_password_count(sam_acct));
962 return py_bad_password_count;
965 static int py_samu_set_bad_password_count(PyObject *obj, PyObject *value, void *closure)
967 TALLOC_CTX *frame = talloc_stackframe();
968 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
970 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
971 if (!pdb_set_bad_password_count(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
979 static PyObject *py_samu_get_logon_count(PyObject *obj, void *closure)
981 TALLOC_CTX *frame = talloc_stackframe();
982 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
983 PyObject *py_logon_count;
985 py_logon_count = PyInt_FromLong(pdb_get_logon_count(sam_acct));
987 return py_logon_count;
990 static int py_samu_set_logon_count(PyObject *obj, PyObject *value, void *closure)
992 TALLOC_CTX *frame = talloc_stackframe();
993 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
995 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
996 if (!pdb_set_logon_count(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
1004 static PyObject *py_samu_get_country_code(PyObject *obj, void *closure)
1006 TALLOC_CTX *frame = talloc_stackframe();
1007 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1008 PyObject *py_country_code;
1010 py_country_code = PyInt_FromLong(pdb_get_country_code(sam_acct));
1012 return py_country_code;
1015 static int py_samu_set_country_code(PyObject *obj, PyObject *value, void *closure)
1017 TALLOC_CTX *frame = talloc_stackframe();
1018 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1020 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1021 if (!pdb_set_country_code(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
1029 static PyObject *py_samu_get_code_page(PyObject *obj, void *closure)
1031 TALLOC_CTX *frame = talloc_stackframe();
1032 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1033 PyObject *py_code_page;
1035 py_code_page = PyInt_FromLong(pdb_get_code_page(sam_acct));
1037 return py_code_page;
1040 static int py_samu_set_code_page(PyObject *obj, PyObject *value, void *closure)
1042 TALLOC_CTX *frame = talloc_stackframe();
1043 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1045 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1046 if (!pdb_set_code_page(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
1054 static PyGetSetDef py_samu_getsetters[] = {
1055 { discard_const_p(char, "logon_time"), py_samu_get_logon_time, py_samu_set_logon_time },
1056 { discard_const_p(char, "logoff_time"), py_samu_get_logoff_time, py_samu_set_logoff_time },
1057 { discard_const_p(char, "kickoff_time"), py_samu_get_kickoff_time, py_samu_set_kickoff_time },
1058 { discard_const_p(char, "bad_password_time"), py_samu_get_bad_password_time, py_samu_set_bad_password_time },
1059 { discard_const_p(char, "pass_last_set_time"), py_samu_get_pass_last_set_time, py_samu_set_pass_last_set_time },
1060 { discard_const_p(char, "pass_can_change_time"), py_samu_get_pass_can_change_time, py_samu_set_pass_can_change_time },
1061 { discard_const_p(char, "pass_must_change_time"), py_samu_get_pass_must_change_time, py_samu_set_pass_must_change_time },
1062 { discard_const_p(char, "username"), py_samu_get_username, py_samu_set_username },
1063 { discard_const_p(char, "domain"), py_samu_get_domain, py_samu_set_domain },
1064 { discard_const_p(char, "nt_username"), py_samu_get_nt_username, py_samu_set_nt_username },
1065 { discard_const_p(char, "full_name"), py_samu_get_full_name, py_samu_set_full_name },
1066 { discard_const_p(char, "home_dir"), py_samu_get_home_dir, py_samu_set_home_dir },
1067 { discard_const_p(char, "dir_drive"), py_samu_get_dir_drive, py_samu_set_dir_drive },
1068 { discard_const_p(char, "logon_script"), py_samu_get_logon_script, py_samu_set_logon_script },
1069 { discard_const_p(char, "profile_path"), py_samu_get_profile_path, py_samu_set_profile_path },
1070 { discard_const_p(char, "acct_desc"), py_samu_get_acct_desc, py_samu_set_acct_desc },
1071 { discard_const_p(char, "workstations"), py_samu_get_workstations, py_samu_set_workstations },
1072 { discard_const_p(char, "comment"), py_samu_get_comment, py_samu_set_comment },
1073 { discard_const_p(char, "munged_dial"), py_samu_get_munged_dial, py_samu_set_munged_dial },
1074 { discard_const_p(char, "user_sid"), py_samu_get_user_sid, py_samu_set_user_sid },
1075 { discard_const_p(char, "group_sid"), py_samu_get_group_sid, py_samu_set_group_sid },
1076 { discard_const_p(char, "lanman_passwd"), py_samu_get_lanman_passwd, py_samu_set_lanman_passwd },
1077 { discard_const_p(char, "nt_passwd"), py_samu_get_nt_passwd, py_samu_set_nt_passwd },
1078 { discard_const_p(char, "pw_history"), py_samu_get_pw_history, py_samu_set_pw_history },
1079 { discard_const_p(char, "plaintext_passwd"), py_samu_get_plaintext_passwd, py_samu_set_plaintext_passwd },
1080 { discard_const_p(char, "acct_ctrl"), py_samu_get_acct_ctrl, py_samu_set_acct_ctrl },
1081 { discard_const_p(char, "logon_divs"), py_samu_get_logon_divs, py_samu_set_logon_divs },
1082 { discard_const_p(char, "hours_len"), py_samu_get_hours_len, py_samu_set_hours_len },
1083 { discard_const_p(char, "hours"), py_samu_get_hours, py_samu_set_hours },
1084 { discard_const_p(char, "bad_password_count"), py_samu_get_bad_password_count, py_samu_set_bad_password_count },
1085 { discard_const_p(char, "logon_count"), py_samu_get_logon_count, py_samu_set_logon_count },
1086 { discard_const_p(char, "country_code"), py_samu_get_country_code, py_samu_set_country_code },
1087 { discard_const_p(char, "code_page"), py_samu_get_code_page, py_samu_set_code_page },
1092 /************************** PIDL Autogeneratd ******************************/
1094 static PyObject *py_samu_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1096 TALLOC_CTX *frame = talloc_stackframe();
1097 struct samu *sam_acct;
1099 sam_acct = samu_new(NULL);
1107 return pytalloc_steal(type, sam_acct);
1110 static PyTypeObject PySamu = {
1111 .tp_name = "passdb.Samu",
1112 .tp_getset = py_samu_getsetters,
1114 .tp_new = py_samu_new,
1115 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
1116 .tp_doc = "Samu() -> samu object\n",
1120 static PyObject *py_groupmap_get_gid(PyObject *obj, void *closure)
1122 TALLOC_CTX *frame = talloc_stackframe();
1123 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1126 py_gid = Py_BuildValue("i", group_map->gid);
1131 static int py_groupmap_set_gid(PyObject *obj, PyObject *value, void *closure)
1133 TALLOC_CTX *frame = talloc_stackframe();
1134 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1136 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1137 group_map->gid = PyInt_AsLong(value);
1142 static PyObject *py_groupmap_get_sid(PyObject *obj, void *closure)
1144 TALLOC_CTX *frame = talloc_stackframe();
1145 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1147 struct dom_sid *group_sid;
1148 TALLOC_CTX *mem_ctx;
1150 mem_ctx = talloc_new(NULL);
1151 if (mem_ctx == NULL) {
1157 group_sid = dom_sid_dup(mem_ctx, &group_map->sid);
1158 if (group_sid == NULL) {
1160 talloc_free(mem_ctx);
1165 py_sid = pytalloc_steal(dom_sid_Type, group_sid);
1167 talloc_free(mem_ctx);
1173 static int py_groupmap_set_sid(PyObject *obj, PyObject *value, void *closure)
1175 TALLOC_CTX *frame = talloc_stackframe();
1176 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1178 PY_CHECK_TYPE(dom_sid_Type, value, return -1;);
1179 group_map->sid = *pytalloc_get_type(value, struct dom_sid);
1184 static PyObject *py_groupmap_get_sid_name_use(PyObject *obj, void *closure)
1186 TALLOC_CTX *frame = talloc_stackframe();
1187 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1188 PyObject *py_sid_name_use;
1190 py_sid_name_use = PyInt_FromLong(group_map->sid_name_use);
1192 return py_sid_name_use;
1195 static int py_groupmap_set_sid_name_use(PyObject *obj, PyObject *value, void *closure)
1197 TALLOC_CTX *frame = talloc_stackframe();
1198 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1200 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1201 group_map->sid_name_use = PyInt_AsLong(value);
1206 static PyObject *py_groupmap_get_nt_name(PyObject *obj, void *closure)
1208 TALLOC_CTX *frame = talloc_stackframe();
1209 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1210 PyObject *py_nt_name;
1211 if (group_map->nt_name == NULL) {
1212 py_nt_name = Py_None;
1213 Py_INCREF(py_nt_name);
1215 py_nt_name = PyStr_FromString(group_map->nt_name);
1221 static int py_groupmap_set_nt_name(PyObject *obj, PyObject *value, void *closure)
1223 TALLOC_CTX *frame = talloc_stackframe();
1224 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1226 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
1227 if (value == Py_None) {
1228 fstrcpy(group_map->nt_name, NULL);
1230 fstrcpy(group_map->nt_name, PyStr_AsString(value));
1236 static PyObject *py_groupmap_get_comment(PyObject *obj, void *closure)
1238 TALLOC_CTX *frame = talloc_stackframe();
1239 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1240 PyObject *py_comment;
1241 if (group_map->comment == NULL) {
1242 py_comment = Py_None;
1243 Py_INCREF(py_comment);
1245 py_comment = PyStr_FromString(group_map->comment);
1251 static int py_groupmap_set_comment(PyObject *obj, PyObject *value, void *closure)
1253 TALLOC_CTX *frame = talloc_stackframe();
1254 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1256 PY_CHECK_TYPE(&PyStr_Type, value, return -1;);
1257 if (value == Py_None) {
1258 fstrcpy(group_map->comment, NULL);
1260 fstrcpy(group_map->comment, PyStr_AsString(value));
1266 static PyGetSetDef py_groupmap_getsetters[] = {
1267 { discard_const_p(char, "gid"), py_groupmap_get_gid, py_groupmap_set_gid },
1268 { discard_const_p(char, "sid"), py_groupmap_get_sid, py_groupmap_set_sid },
1269 { discard_const_p(char, "sid_name_use"), py_groupmap_get_sid_name_use, py_groupmap_set_sid_name_use },
1270 { discard_const_p(char, "nt_name"), py_groupmap_get_nt_name, py_groupmap_set_nt_name },
1271 { discard_const_p(char, "comment"), py_groupmap_get_comment, py_groupmap_set_comment },
1275 static PyObject *py_groupmap_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1277 TALLOC_CTX *frame = talloc_stackframe();
1278 GROUP_MAP *group_map;
1279 TALLOC_CTX *mem_ctx;
1280 PyObject *py_group_map;
1282 mem_ctx = talloc_new(NULL);
1283 if (mem_ctx == NULL) {
1289 group_map = talloc_zero(mem_ctx, GROUP_MAP);
1290 if (group_map == NULL) {
1292 talloc_free(mem_ctx);
1297 py_group_map = pytalloc_steal(type, group_map);
1298 if (py_group_map == NULL) {
1300 talloc_free(mem_ctx);
1305 talloc_free(mem_ctx);
1308 return py_group_map;
1312 static PyTypeObject PyGroupmap = {
1313 .tp_name = "passdb.Groupmap",
1314 .tp_getset = py_groupmap_getsetters,
1316 .tp_new = py_groupmap_new,
1317 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
1318 .tp_doc = "Groupmap() -> group map object\n",
1322 static PyObject *py_pdb_domain_info(PyObject *self, PyObject *args)
1324 TALLOC_CTX *frame = talloc_stackframe();
1325 struct pdb_methods *methods;
1326 struct pdb_domain_info *domain_info;
1327 PyObject *py_domain_info;
1328 struct dom_sid *sid;
1331 methods = pytalloc_get_ptr(self);
1333 domain_info = methods->get_domain_info(methods, frame);
1334 if (! domain_info) {
1338 sid = dom_sid_dup(frame, &domain_info->sid);
1345 guid = talloc(frame, struct GUID);
1351 *guid = domain_info->guid;
1353 if ((py_domain_info = PyDict_New()) == NULL) {
1359 PyDict_SetItemString(py_domain_info, "name", PyStr_FromString(domain_info->name));
1360 PyDict_SetItemString(py_domain_info, "dns_domain", PyStr_FromString(domain_info->dns_domain));
1361 PyDict_SetItemString(py_domain_info, "dns_forest", PyStr_FromString(domain_info->dns_forest));
1362 PyDict_SetItemString(py_domain_info, "dom_sid", pytalloc_steal(dom_sid_Type, sid));
1363 PyDict_SetItemString(py_domain_info, "guid", pytalloc_steal(guid_Type, guid));
1366 return py_domain_info;
1370 static PyObject *py_pdb_getsampwnam(PyObject *self, PyObject *args)
1372 TALLOC_CTX *frame = talloc_stackframe();
1374 const char *username;
1375 struct pdb_methods *methods;
1376 struct samu *sam_acct;
1377 PyObject *py_sam_acct;
1379 if (!PyArg_ParseTuple(args, "s:getsampwnam", &username)) {
1384 methods = pytalloc_get_ptr(self);
1386 py_sam_acct = py_samu_new(&PySamu, NULL, NULL);
1387 if (py_sam_acct == NULL) {
1392 sam_acct = (struct samu *)pytalloc_get_ptr(py_sam_acct);
1394 status = methods->getsampwnam(methods, sam_acct, username);
1395 if (!NT_STATUS_IS_OK(status)) {
1396 PyErr_Format(py_pdb_error, "Unable to get user information for '%s', (%d,%s)",
1398 NT_STATUS_V(status),
1399 get_friendly_nt_error_msg(status));
1400 Py_DECREF(py_sam_acct);
1409 static PyObject *py_pdb_getsampwsid(PyObject *self, PyObject *args)
1411 TALLOC_CTX *frame = talloc_stackframe();
1413 struct pdb_methods *methods;
1414 struct samu *sam_acct;
1415 PyObject *py_sam_acct;
1416 PyObject *py_user_sid;
1418 if (!PyArg_ParseTuple(args, "O:getsampwsid", &py_user_sid)) {
1423 methods = pytalloc_get_ptr(self);
1425 py_sam_acct = py_samu_new(&PySamu, NULL, NULL);
1426 if (py_sam_acct == NULL) {
1431 sam_acct = (struct samu *)pytalloc_get_ptr(py_sam_acct);
1433 status = methods->getsampwsid(methods, sam_acct, pytalloc_get_ptr(py_user_sid));
1434 if (!NT_STATUS_IS_OK(status)) {
1435 PyErr_Format(py_pdb_error, "Unable to get user information from SID, (%d,%s)",
1436 NT_STATUS_V(status),
1437 get_friendly_nt_error_msg(status));
1438 Py_DECREF(py_sam_acct);
1447 static PyObject *py_pdb_create_user(PyObject *self, PyObject *args)
1449 TALLOC_CTX *frame = talloc_stackframe();
1451 struct pdb_methods *methods;
1452 const char *username;
1453 unsigned int acct_flags;
1456 if (!PyArg_ParseTuple(args, "sI:create_user", &username, &acct_flags)) {
1461 methods = pytalloc_get_ptr(self);
1463 status = methods->create_user(methods, frame, username, acct_flags, &rid);
1464 if (!NT_STATUS_IS_OK(status)) {
1465 PyErr_Format(py_pdb_error, "Unable to create user (%s), (%d,%s)",
1467 NT_STATUS_V(status),
1468 get_friendly_nt_error_msg(status));
1474 return PyInt_FromLong(rid);
1477 static PyObject *py_pdb_delete_user(PyObject *self, PyObject *args)
1479 TALLOC_CTX *frame = talloc_stackframe();
1481 struct pdb_methods *methods;
1482 struct samu *sam_acct;
1483 PyObject *py_sam_acct;
1485 if (!PyArg_ParseTuple(args, "O!:delete_user", &PySamu, &py_sam_acct)) {
1490 methods = pytalloc_get_ptr(self);
1492 sam_acct = pytalloc_get_ptr(py_sam_acct);
1494 status = methods->delete_user(methods, frame, sam_acct);
1495 if (!NT_STATUS_IS_OK(status)) {
1496 PyErr_Format(py_pdb_error, "Unable to delete user, (%d,%s)",
1497 NT_STATUS_V(status),
1498 get_friendly_nt_error_msg(status));
1507 static PyObject *py_pdb_add_sam_account(PyObject *self, PyObject *args)
1509 TALLOC_CTX *frame = talloc_stackframe();
1511 struct pdb_methods *methods;
1512 struct samu *sam_acct;
1513 PyObject *py_sam_acct;
1515 if (!PyArg_ParseTuple(args, "O!:add_sam_account", &PySamu, &py_sam_acct)) {
1520 methods = pytalloc_get_ptr(self);
1522 sam_acct = pytalloc_get_ptr(py_sam_acct);
1524 status = methods->add_sam_account(methods, sam_acct);
1525 if (!NT_STATUS_IS_OK(status)) {
1526 PyErr_Format(py_pdb_error, "Unable to add sam account '%s', (%d,%s)",
1528 NT_STATUS_V(status),
1529 get_friendly_nt_error_msg(status));
1538 static PyObject *py_pdb_update_sam_account(PyObject *self, PyObject *args)
1540 TALLOC_CTX *frame = talloc_stackframe();
1542 struct pdb_methods *methods;
1543 struct samu *sam_acct;
1544 PyObject *py_sam_acct;
1546 if (!PyArg_ParseTuple(args, "O!:update_sam_account", &PySamu, &py_sam_acct)) {
1551 methods = pytalloc_get_ptr(self);
1553 sam_acct = pytalloc_get_ptr(py_sam_acct);
1555 status = methods->update_sam_account(methods, sam_acct);
1556 if (!NT_STATUS_IS_OK(status)) {
1557 PyErr_Format(py_pdb_error, "Unable to update sam account, (%d,%s)",
1558 NT_STATUS_V(status),
1559 get_friendly_nt_error_msg(status));
1568 static PyObject *py_pdb_delete_sam_account(PyObject *self, PyObject *args)
1570 TALLOC_CTX *frame = talloc_stackframe();
1572 struct pdb_methods *methods;
1573 struct samu *sam_acct;
1574 PyObject *py_sam_acct;
1576 if (!PyArg_ParseTuple(args, "O!:delete_sam_account", &PySamu, &py_sam_acct)) {
1581 methods = pytalloc_get_ptr(self);
1583 sam_acct = pytalloc_get_ptr(py_sam_acct);
1585 status = methods->delete_sam_account(methods, sam_acct);
1586 if (!NT_STATUS_IS_OK(status)) {
1587 PyErr_Format(py_pdb_error, "Unable to delete sam account, (%d,%s)",
1588 NT_STATUS_V(status),
1589 get_friendly_nt_error_msg(status));
1598 static PyObject *py_pdb_rename_sam_account(PyObject *self, PyObject *args)
1600 TALLOC_CTX *frame = talloc_stackframe();
1602 struct pdb_methods *methods;
1603 struct samu *sam_acct;
1604 const char *new_username;
1605 PyObject *py_sam_acct;
1607 if (!PyArg_ParseTuple(args, "O!s:rename_sam_account", &PySamu, &py_sam_acct,
1613 methods = pytalloc_get_ptr(self);
1615 sam_acct = pytalloc_get_ptr(py_sam_acct);
1617 status = methods->rename_sam_account(methods, sam_acct, new_username);
1618 if (!NT_STATUS_IS_OK(status)) {
1619 PyErr_Format(py_pdb_error, "Unable to rename sam account, (%d,%s)",
1620 NT_STATUS_V(status),
1621 get_friendly_nt_error_msg(status));
1631 static PyObject *py_pdb_getgrsid(PyObject *self, PyObject *args)
1633 TALLOC_CTX *frame = talloc_stackframe();
1635 struct pdb_methods *methods;
1636 GROUP_MAP *group_map;
1637 struct dom_sid *domain_sid;
1638 PyObject *py_domain_sid, *py_group_map;
1640 if (!PyArg_ParseTuple(args, "O!:getgrsid", dom_sid_Type, &py_domain_sid)) {
1645 methods = pytalloc_get_ptr(self);
1647 domain_sid = pytalloc_get_ptr(py_domain_sid);
1649 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
1650 if (py_group_map == NULL) {
1656 group_map = pytalloc_get_ptr(py_group_map);
1658 status = methods->getgrsid(methods, group_map, *domain_sid);
1659 if (!NT_STATUS_IS_OK(status)) {
1660 PyErr_Format(py_pdb_error, "Unable to get group information by sid, (%d,%s)",
1661 NT_STATUS_V(status),
1662 get_friendly_nt_error_msg(status));
1668 return py_group_map;
1672 static PyObject *py_pdb_getgrgid(PyObject *self, PyObject *args)
1674 TALLOC_CTX *frame = talloc_stackframe();
1676 struct pdb_methods *methods;
1677 GROUP_MAP *group_map;
1678 PyObject *py_group_map;
1679 unsigned int gid_value;
1681 if (!PyArg_ParseTuple(args, "I:getgrgid", &gid_value)) {
1686 methods = pytalloc_get_ptr(self);
1688 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
1689 if (py_group_map == NULL) {
1695 group_map = pytalloc_get_ptr(py_group_map);
1697 status = methods->getgrgid(methods, group_map, gid_value);
1698 if (!NT_STATUS_IS_OK(status)) {
1699 PyErr_Format(py_pdb_error, "Unable to get group information by gid, (%d,%s)",
1700 NT_STATUS_V(status),
1701 get_friendly_nt_error_msg(status));
1707 return py_group_map;
1711 static PyObject *py_pdb_getgrnam(PyObject *self, PyObject *args)
1713 TALLOC_CTX *frame = talloc_stackframe();
1715 struct pdb_methods *methods;
1716 GROUP_MAP *group_map;
1717 PyObject *py_group_map;
1718 const char *groupname;
1720 if (!PyArg_ParseTuple(args, "s:getgrnam", &groupname)) {
1725 methods = pytalloc_get_ptr(self);
1727 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
1728 if (py_group_map == NULL) {
1734 group_map = pytalloc_get_ptr(py_group_map);
1736 status = methods->getgrnam(methods, group_map, groupname);
1737 if (!NT_STATUS_IS_OK(status)) {
1738 PyErr_Format(py_pdb_error, "Unable to get group information by name, (%d,%s)",
1739 NT_STATUS_V(status),
1740 get_friendly_nt_error_msg(status));
1746 return py_group_map;
1750 static PyObject *py_pdb_create_dom_group(PyObject *self, PyObject *args)
1752 TALLOC_CTX *frame = talloc_stackframe();
1754 struct pdb_methods *methods;
1755 const char *groupname;
1758 if (!PyArg_ParseTuple(args, "s:create_dom_group", &groupname)) {
1763 methods = pytalloc_get_ptr(self);
1765 status = methods->create_dom_group(methods, frame, groupname, &group_rid);
1766 if (!NT_STATUS_IS_OK(status)) {
1767 PyErr_Format(py_pdb_error, "Unable to create domain group (%s), (%d,%s)",
1769 NT_STATUS_V(status),
1770 get_friendly_nt_error_msg(status));
1776 return PyInt_FromLong(group_rid);
1780 static PyObject *py_pdb_delete_dom_group(PyObject *self, PyObject *args)
1782 TALLOC_CTX *frame = talloc_stackframe();
1784 struct pdb_methods *methods;
1785 unsigned int group_rid;
1787 if (!PyArg_ParseTuple(args, "I:delete_dom_group", &group_rid)) {
1792 methods = pytalloc_get_ptr(self);
1794 status = methods->delete_dom_group(methods, frame, group_rid);
1795 if (!NT_STATUS_IS_OK(status)) {
1796 PyErr_Format(py_pdb_error, "Unable to delete domain group (rid=%d), (%d,%s)",
1798 NT_STATUS_V(status),
1799 get_friendly_nt_error_msg(status));
1809 static PyObject *py_pdb_add_group_mapping_entry(PyObject *self, PyObject *args)
1811 TALLOC_CTX *frame = talloc_stackframe();
1813 struct pdb_methods *methods;
1814 PyObject *py_group_map;
1815 GROUP_MAP *group_map;
1817 if (!PyArg_ParseTuple(args, "O!:add_group_mapping_entry", &PyGroupmap, &py_group_map)) {
1822 methods = pytalloc_get_ptr(self);
1824 group_map = pytalloc_get_ptr(py_group_map);
1826 status = methods->add_group_mapping_entry(methods, group_map);
1827 if (!NT_STATUS_IS_OK(status)) {
1828 PyErr_Format(py_pdb_error, "Unable to add group mapping entry, (%d,%s)",
1829 NT_STATUS_V(status),
1830 get_friendly_nt_error_msg(status));
1840 static PyObject *py_pdb_update_group_mapping_entry(PyObject *self, PyObject *args)
1842 TALLOC_CTX *frame = talloc_stackframe();
1844 struct pdb_methods *methods;
1845 PyObject *py_group_map;
1846 GROUP_MAP *group_map;
1848 if (!PyArg_ParseTuple(args, "O!:update_group_mapping_entry", &PyGroupmap, &py_group_map)) {
1853 methods = pytalloc_get_ptr(self);
1855 group_map = pytalloc_get_ptr(py_group_map);
1857 status = methods->update_group_mapping_entry(methods, group_map);
1858 if (!NT_STATUS_IS_OK(status)) {
1859 PyErr_Format(py_pdb_error, "Unable to update group mapping entry, (%d,%s)",
1860 NT_STATUS_V(status),
1861 get_friendly_nt_error_msg(status));
1871 static PyObject *py_pdb_delete_group_mapping_entry(PyObject *self, PyObject *args)
1873 TALLOC_CTX *frame = talloc_stackframe();
1875 struct pdb_methods *methods;
1876 PyObject *py_group_sid;
1877 struct dom_sid *group_sid;
1879 if (!PyArg_ParseTuple(args, "O!:delete_group_mapping_entry", dom_sid_Type, &py_group_sid)) {
1884 methods = pytalloc_get_ptr(self);
1886 group_sid = pytalloc_get_ptr(py_group_sid);
1888 status = methods->delete_group_mapping_entry(methods, *group_sid);
1889 if (!NT_STATUS_IS_OK(status)) {
1890 PyErr_Format(py_pdb_error, "Unable to delete group mapping entry, (%d,%s)",
1891 NT_STATUS_V(status),
1892 get_friendly_nt_error_msg(status));
1902 static PyObject *py_pdb_enum_group_mapping(PyObject *self, PyObject *args)
1904 TALLOC_CTX *frame = talloc_stackframe();
1906 struct pdb_methods *methods;
1907 enum lsa_SidType sid_name_use;
1908 int lsa_sidtype_value = SID_NAME_UNKNOWN;
1910 PyObject *py_domain_sid;
1911 struct dom_sid *domain_sid = NULL;
1912 GROUP_MAP **gmap = NULL;
1913 GROUP_MAP *group_map;
1915 PyObject *py_gmap_list, *py_group_map;
1918 py_domain_sid = Py_None;
1921 if (!PyArg_ParseTuple(args, "|O!ii:enum_group_mapping", dom_sid_Type, &py_domain_sid,
1922 &lsa_sidtype_value, &unix_only)) {
1927 methods = pytalloc_get_ptr(self);
1929 sid_name_use = lsa_sidtype_value;
1931 if (py_domain_sid != Py_None) {
1932 domain_sid = pytalloc_get_ptr(py_domain_sid);
1935 status = methods->enum_group_mapping(methods, domain_sid, sid_name_use,
1936 &gmap, &num_entries, unix_only);
1937 if (!NT_STATUS_IS_OK(status)) {
1938 PyErr_Format(py_pdb_error, "Unable to enumerate group mappings, (%d,%s)",
1939 NT_STATUS_V(status),
1940 get_friendly_nt_error_msg(status));
1945 py_gmap_list = PyList_New(0);
1946 if (py_gmap_list == NULL) {
1952 for(i=0; i<num_entries; i++) {
1953 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
1955 group_map = pytalloc_get_ptr(py_group_map);
1956 *group_map = *gmap[i];
1957 talloc_steal(group_map, gmap[i]->nt_name);
1958 talloc_steal(group_map, gmap[i]->comment);
1960 PyList_Append(py_gmap_list, py_group_map);
1967 return py_gmap_list;
1971 static PyObject *py_pdb_enum_group_members(PyObject *self, PyObject *args)
1973 TALLOC_CTX *frame = talloc_stackframe();
1975 struct pdb_methods *methods;
1976 PyObject *py_group_sid;
1977 struct dom_sid *group_sid;
1978 uint32_t *member_rids;
1980 PyObject *py_sid_list;
1981 struct dom_sid *domain_sid, *member_sid;
1984 if (!PyArg_ParseTuple(args, "O!:enum_group_members", dom_sid_Type, &py_group_sid)) {
1989 methods = pytalloc_get_ptr(self);
1991 group_sid = pytalloc_get_ptr(py_group_sid);
1993 status = methods->enum_group_members(methods, frame, group_sid,
1994 &member_rids, &num_members);
1995 if (!NT_STATUS_IS_OK(status)) {
1996 PyErr_Format(py_pdb_error, "Unable to enumerate group members, (%d,%s)",
1997 NT_STATUS_V(status),
1998 get_friendly_nt_error_msg(status));
2003 py_sid_list = PyList_New(0);
2004 if (py_sid_list == NULL) {
2010 domain_sid = get_global_sam_sid();
2012 for(i=0; i<num_members; i++) {
2013 member_sid = dom_sid_add_rid(frame, domain_sid, member_rids[i]);
2014 PyList_Append(py_sid_list, pytalloc_steal(dom_sid_Type, member_sid));
2022 static PyObject *py_pdb_enum_group_memberships(PyObject *self, PyObject *args)
2024 TALLOC_CTX *frame = talloc_stackframe();
2026 struct pdb_methods *methods;
2029 struct samu *sam_acct;
2030 PyObject *py_sam_acct;
2031 PyObject *py_sid_list;
2032 struct dom_sid *user_group_sids = NULL;
2033 gid_t *user_group_ids = NULL;
2034 uint32_t num_groups = 0;
2036 if (!PyArg_ParseTuple(args, "O!:enum_group_memberships", &PySamu, &py_sam_acct)) {
2041 methods = pytalloc_get_ptr(self);
2043 sam_acct = pytalloc_get_ptr(py_sam_acct);
2045 status = methods->enum_group_memberships(methods, frame, sam_acct,
2046 &user_group_sids, &user_group_ids, &num_groups);
2047 if (!NT_STATUS_IS_OK(status)) {
2048 PyErr_Format(py_pdb_error, "Unable to enumerate group memberships, (%d,%s)",
2049 NT_STATUS_V(status),
2050 get_friendly_nt_error_msg(status));
2055 py_sid_list = PyList_New(0);
2056 if (py_sid_list == NULL) {
2062 for(i=0; i<num_groups; i++) {
2063 PyList_Append(py_sid_list, pytalloc_steal(dom_sid_Type, dom_sid_dup(NULL, &user_group_sids[i])));
2071 static PyObject *py_pdb_add_groupmem(PyObject *self, PyObject *args)
2073 TALLOC_CTX *frame = talloc_stackframe();
2075 struct pdb_methods *methods;
2076 uint32_t group_rid, member_rid;
2078 if (!PyArg_ParseTuple(args, "II:add_groupmem", &group_rid, &member_rid)) {
2083 methods = pytalloc_get_ptr(self);
2085 status = methods->add_groupmem(methods, frame, group_rid, member_rid);
2086 if (!NT_STATUS_IS_OK(status)) {
2087 PyErr_Format(py_pdb_error, "Unable to add group member, (%d,%s)",
2088 NT_STATUS_V(status),
2089 get_friendly_nt_error_msg(status));
2099 static PyObject *py_pdb_del_groupmem(PyObject *self, PyObject *args)
2101 TALLOC_CTX *frame = talloc_stackframe();
2103 struct pdb_methods *methods;
2104 uint32_t group_rid, member_rid;
2106 if (!PyArg_ParseTuple(args, "II:del_groupmem", &group_rid, &member_rid)) {
2111 methods = pytalloc_get_ptr(self);
2113 status = methods->del_groupmem(methods, frame, group_rid, member_rid);
2114 if (!NT_STATUS_IS_OK(status)) {
2115 PyErr_Format(py_pdb_error, "Unable to rename sam account, (%d,%s)",
2116 NT_STATUS_V(status),
2117 get_friendly_nt_error_msg(status));
2127 static PyObject *py_pdb_create_alias(PyObject *self, PyObject *args)
2129 TALLOC_CTX *frame = talloc_stackframe();
2131 struct pdb_methods *methods;
2132 const char *alias_name;
2135 if (!PyArg_ParseTuple(args, "s:create_alias", &alias_name)) {
2140 methods = pytalloc_get_ptr(self);
2142 status = methods->create_alias(methods, alias_name, &rid);
2143 if (!NT_STATUS_IS_OK(status)) {
2144 PyErr_Format(py_pdb_error, "Unable to create alias (%s), (%d,%s)",
2146 NT_STATUS_V(status),
2147 get_friendly_nt_error_msg(status));
2153 return PyInt_FromLong(rid);
2157 static PyObject *py_pdb_delete_alias(PyObject *self, PyObject *args)
2159 TALLOC_CTX *frame = talloc_stackframe();
2161 struct pdb_methods *methods;
2162 PyObject *py_alias_sid;
2163 struct dom_sid *alias_sid;
2165 if (!PyArg_ParseTuple(args, "O!:delete_alias", dom_sid_Type, &py_alias_sid)) {
2170 methods = pytalloc_get_ptr(self);
2172 alias_sid = pytalloc_get_ptr(py_alias_sid);
2174 status = methods->delete_alias(methods, alias_sid);
2175 if (!NT_STATUS_IS_OK(status)) {
2176 PyErr_Format(py_pdb_error, "Unable to delete alias, (%d,%s)",
2177 NT_STATUS_V(status),
2178 get_friendly_nt_error_msg(status));
2188 static PyObject *py_pdb_get_aliasinfo(PyObject *self, PyObject *args)
2190 TALLOC_CTX *frame = talloc_stackframe();
2192 struct pdb_methods *methods;
2193 PyObject *py_alias_sid;
2194 struct dom_sid *alias_sid;
2195 struct acct_info *alias_info;
2196 PyObject *py_alias_info;
2198 if (!PyArg_ParseTuple(args, "O!:get_aliasinfo", dom_sid_Type, &py_alias_sid)) {
2203 methods = pytalloc_get_ptr(self);
2205 alias_sid = pytalloc_get_ptr(py_alias_sid);
2207 alias_info = talloc_zero(frame, struct acct_info);
2214 status = methods->get_aliasinfo(methods, alias_sid, alias_info);
2215 if (!NT_STATUS_IS_OK(status)) {
2216 PyErr_Format(py_pdb_error, "Unable to get alias information, (%d,%s)",
2217 NT_STATUS_V(status),
2218 get_friendly_nt_error_msg(status));
2223 py_alias_info = PyDict_New();
2224 if (py_alias_info == NULL) {
2230 PyDict_SetItemString(py_alias_info, "acct_name",
2231 PyStr_FromString(alias_info->acct_name));
2232 PyDict_SetItemString(py_alias_info, "acct_desc",
2233 PyStr_FromString(alias_info->acct_desc));
2234 PyDict_SetItemString(py_alias_info, "rid",
2235 PyInt_FromLong(alias_info->rid));
2238 return py_alias_info;
2242 static PyObject *py_pdb_set_aliasinfo(PyObject *self, PyObject *args)
2244 TALLOC_CTX *frame = talloc_stackframe();
2246 struct pdb_methods *methods;
2247 PyObject *py_alias_sid, *py_alias_info;
2248 struct dom_sid *alias_sid;
2249 struct acct_info alias_info;
2251 if (!PyArg_ParseTuple(args, "O!O:set_alias_info", dom_sid_Type, &py_alias_sid,
2257 methods = pytalloc_get_ptr(self);
2259 alias_sid = pytalloc_get_ptr(py_alias_sid);
2261 alias_info.acct_name = talloc_strdup(frame, PyStr_AsString(PyDict_GetItemString(py_alias_info, "acct_name")));
2262 if (alias_info.acct_name == NULL) {
2263 PyErr_Format(py_pdb_error, "Unable to allocate memory");
2267 alias_info.acct_desc = talloc_strdup(frame, PyStr_AsString(PyDict_GetItemString(py_alias_info, "acct_desc")));
2268 if (alias_info.acct_desc == NULL) {
2269 PyErr_Format(py_pdb_error, "Unable to allocate memory");
2274 status = methods->set_aliasinfo(methods, alias_sid, &alias_info);
2275 if (!NT_STATUS_IS_OK(status)) {
2276 PyErr_Format(py_pdb_error, "Unable to set alias information, (%d,%s)",
2277 NT_STATUS_V(status),
2278 get_friendly_nt_error_msg(status));
2288 static PyObject *py_pdb_add_aliasmem(PyObject *self, PyObject *args)
2290 TALLOC_CTX *frame = talloc_stackframe();
2292 struct pdb_methods *methods;
2293 PyObject *py_alias_sid, *py_member_sid;
2294 struct dom_sid *alias_sid, *member_sid;
2296 if (!PyArg_ParseTuple(args, "O!O!:add_aliasmem", dom_sid_Type, &py_alias_sid,
2297 dom_sid_Type, &py_member_sid)) {
2302 methods = pytalloc_get_ptr(self);
2304 alias_sid = pytalloc_get_ptr(py_alias_sid);
2305 member_sid = pytalloc_get_ptr(py_member_sid);
2307 status = methods->add_aliasmem(methods, alias_sid, member_sid);
2308 if (!NT_STATUS_IS_OK(status)) {
2309 PyErr_Format(py_pdb_error, "Unable to add member to alias, (%d,%s)",
2310 NT_STATUS_V(status),
2311 get_friendly_nt_error_msg(status));
2321 static PyObject *py_pdb_del_aliasmem(PyObject *self, PyObject *args)
2323 TALLOC_CTX *frame = talloc_stackframe();
2325 struct pdb_methods *methods;
2326 PyObject *py_alias_sid, *py_member_sid;
2327 const struct dom_sid *alias_sid, *member_sid;
2329 if (!PyArg_ParseTuple(args, "O!O!:del_aliasmem", dom_sid_Type, &py_alias_sid,
2330 dom_sid_Type, &py_member_sid)) {
2335 methods = pytalloc_get_ptr(self);
2337 alias_sid = pytalloc_get_ptr(py_alias_sid);
2338 member_sid = pytalloc_get_ptr(py_member_sid);
2340 status = methods->del_aliasmem(methods, alias_sid, member_sid);
2341 if (!NT_STATUS_IS_OK(status)) {
2342 PyErr_Format(py_pdb_error, "Unable to delete member from alias, (%d,%s)",
2343 NT_STATUS_V(status),
2344 get_friendly_nt_error_msg(status));
2354 static PyObject *py_pdb_enum_aliasmem(PyObject *self, PyObject *args)
2356 TALLOC_CTX *frame = talloc_stackframe();
2358 struct pdb_methods *methods;
2359 PyObject *py_alias_sid;
2360 struct dom_sid *alias_sid, *member_sid, *tmp_sid;
2361 PyObject *py_member_list, *py_member_sid;
2365 if (!PyArg_ParseTuple(args, "O!:enum_aliasmem", dom_sid_Type, &py_alias_sid)) {
2370 methods = pytalloc_get_ptr(self);
2372 alias_sid = pytalloc_get_ptr(py_alias_sid);
2374 status = methods->enum_aliasmem(methods, alias_sid, frame, &member_sid, &num_members);
2375 if (!NT_STATUS_IS_OK(status)) {
2376 PyErr_Format(py_pdb_error, "Unable to enumerate members for alias, (%d,%s)",
2377 NT_STATUS_V(status),
2378 get_friendly_nt_error_msg(status));
2383 py_member_list = PyList_New(0);
2384 if (py_member_list == NULL) {
2390 for(i=0; i<num_members; i++) {
2391 py_member_sid = pytalloc_new(struct dom_sid, dom_sid_Type);
2392 if (py_member_sid == NULL) {
2397 tmp_sid = pytalloc_get_ptr(py_member_sid);
2398 *tmp_sid = member_sid[i];
2399 PyList_Append(py_member_list, py_member_sid);
2403 return py_member_list;
2407 static PyObject *py_pdb_get_account_policy(PyObject *self, PyObject *unused)
2409 TALLOC_CTX *frame = talloc_stackframe();
2411 struct pdb_methods *methods;
2412 PyObject *py_acct_policy;
2416 enum pdb_policy_type type;
2418 methods = pytalloc_get_ptr(self);
2420 py_acct_policy = PyDict_New();
2421 if (py_acct_policy == NULL) {
2427 account_policy_names_list(frame, &names, &count);
2428 for (i=0; i<count; i++) {
2429 type = account_policy_name_to_typenum(names[i]);
2430 status = methods->get_account_policy(methods, type, &value);
2431 if (NT_STATUS_IS_OK(status)) {
2432 PyDict_SetItemString(py_acct_policy, names[i], Py_BuildValue("i", value));
2437 return py_acct_policy;
2441 static PyObject *py_pdb_set_account_policy(PyObject *self, PyObject *args)
2443 TALLOC_CTX *frame = talloc_stackframe();
2445 struct pdb_methods *methods;
2446 PyObject *py_acct_policy, *py_value;
2449 enum pdb_policy_type type;
2451 if (!PyArg_ParseTuple(args, "O!:set_account_policy", PyDict_Type, &py_acct_policy)) {
2456 methods = pytalloc_get_ptr(self);
2458 account_policy_names_list(frame, &names, &count);
2459 for (i=0; i<count; i++) {
2460 if ((py_value = PyDict_GetItemString(py_acct_policy, names[i])) != NULL) {
2461 type = account_policy_name_to_typenum(names[i]);
2462 status = methods->set_account_policy(methods, type, PyInt_AsLong(py_value));
2463 if (!NT_STATUS_IS_OK(status)) {
2464 PyErr_Format(py_pdb_error, "Error setting account policy (%s), (%d,%s)",
2466 NT_STATUS_V(status),
2467 get_friendly_nt_error_msg(status));
2476 static PyObject *py_pdb_search_users(PyObject *self, PyObject *args)
2478 TALLOC_CTX *frame = talloc_stackframe();
2479 struct pdb_methods *methods;
2480 unsigned int acct_flags;
2481 struct pdb_search *search;
2482 struct samr_displayentry *entry;
2483 PyObject *py_userlist, *py_dict;
2485 if (!PyArg_ParseTuple(args, "I:search_users", &acct_flags)) {
2490 methods = pytalloc_get_ptr(self);
2492 search = talloc_zero(frame, struct pdb_search);
2493 if (search == NULL) {
2499 if (!methods->search_users(methods, search, acct_flags)) {
2500 PyErr_Format(py_pdb_error, "Unable to search users");
2505 entry = talloc_zero(frame, struct samr_displayentry);
2506 if (entry == NULL) {
2512 py_userlist = PyList_New(0);
2513 if (py_userlist == NULL) {
2519 while (search->next_entry(search, entry)) {
2520 py_dict = PyDict_New();
2521 if (py_dict == NULL) {
2524 PyDict_SetItemString(py_dict, "idx", PyInt_FromLong(entry->idx));
2525 PyDict_SetItemString(py_dict, "rid", PyInt_FromLong(entry->rid));
2526 PyDict_SetItemString(py_dict, "acct_flags", PyInt_FromLong(entry->acct_flags));
2527 PyDict_SetItemString(py_dict, "account_name", PyStr_FromString(entry->account_name));
2528 PyDict_SetItemString(py_dict, "fullname", PyStr_FromString(entry->fullname));
2529 PyDict_SetItemString(py_dict, "description", PyStr_FromString(entry->description));
2530 PyList_Append(py_userlist, py_dict);
2533 search->search_end(search);
2540 static PyObject *py_pdb_search_groups(PyObject *self, PyObject *unused)
2542 TALLOC_CTX *frame = talloc_stackframe();
2543 struct pdb_methods *methods;
2544 struct pdb_search *search;
2545 struct samr_displayentry *entry;
2546 PyObject *py_grouplist, *py_dict;
2548 methods = pytalloc_get_ptr(self);
2550 search = talloc_zero(frame, struct pdb_search);
2551 if (search == NULL) {
2557 if (!methods->search_groups(methods, search)) {
2558 PyErr_Format(py_pdb_error, "Unable to search groups");
2563 entry = talloc_zero(frame, struct samr_displayentry);
2564 if (entry == NULL) {
2570 py_grouplist = PyList_New(0);
2571 if (py_grouplist == NULL) {
2577 while (search->next_entry(search, entry)) {
2578 py_dict = PyDict_New();
2579 if (py_dict == NULL) {
2582 PyDict_SetItemString(py_dict, "idx", PyInt_FromLong(entry->idx));
2583 PyDict_SetItemString(py_dict, "rid", PyInt_FromLong(entry->rid));
2584 PyDict_SetItemString(py_dict, "acct_flags", PyInt_FromLong(entry->acct_flags));
2585 PyDict_SetItemString(py_dict, "account_name", PyStr_FromString(entry->account_name));
2586 PyDict_SetItemString(py_dict, "fullname", PyStr_FromString(entry->fullname));
2587 PyDict_SetItemString(py_dict, "description", PyStr_FromString(entry->description));
2588 PyList_Append(py_grouplist, py_dict);
2591 search->search_end(search);
2594 return py_grouplist;
2598 static PyObject *py_pdb_search_aliases(PyObject *self, PyObject *args)
2600 TALLOC_CTX *frame = talloc_stackframe();
2601 struct pdb_methods *methods;
2602 struct pdb_search *search;
2603 struct samr_displayentry *entry;
2604 PyObject *py_aliaslist, *py_dict;
2605 PyObject *py_domain_sid;
2606 struct dom_sid *domain_sid = NULL;
2608 py_domain_sid = Py_None;
2611 if (!PyArg_ParseTuple(args, "|O!:search_aliases", dom_sid_Type, &py_domain_sid)) {
2616 methods = pytalloc_get_ptr(self);
2618 if (py_domain_sid != Py_None) {
2619 domain_sid = pytalloc_get_ptr(py_domain_sid);
2622 search = talloc_zero(frame, struct pdb_search);
2623 if (search == NULL) {
2629 if (!methods->search_aliases(methods, search, domain_sid)) {
2630 PyErr_Format(py_pdb_error, "Unable to search aliases");
2635 entry = talloc_zero(frame, struct samr_displayentry);
2636 if (entry == NULL) {
2642 py_aliaslist = PyList_New(0);
2643 if (py_aliaslist == NULL) {
2649 while (search->next_entry(search, entry)) {
2650 py_dict = PyDict_New();
2651 if (py_dict == NULL) {
2654 PyDict_SetItemString(py_dict, "idx", PyInt_FromLong(entry->idx));
2655 PyDict_SetItemString(py_dict, "rid", PyInt_FromLong(entry->rid));
2656 PyDict_SetItemString(py_dict, "acct_flags", PyInt_FromLong(entry->acct_flags));
2657 PyDict_SetItemString(py_dict, "account_name", PyStr_FromString(entry->account_name));
2658 PyDict_SetItemString(py_dict, "fullname", PyStr_FromString(entry->fullname));
2659 PyDict_SetItemString(py_dict, "description", PyStr_FromString(entry->description));
2660 PyList_Append(py_aliaslist, py_dict);
2663 search->search_end(search);
2666 return py_aliaslist;
2670 static PyObject *py_pdb_uid_to_sid(PyObject *self, PyObject *args)
2672 TALLOC_CTX *frame = talloc_stackframe();
2673 struct pdb_methods *methods;
2676 struct dom_sid user_sid, *copy_user_sid;
2677 PyObject *py_user_sid;
2679 if (!PyArg_ParseTuple(args, "I:uid_to_sid", &uid)) {
2684 methods = pytalloc_get_ptr(self);
2687 id.type = ID_TYPE_UID;
2689 if (!methods->id_to_sid(methods, &id, &user_sid)) {
2690 PyErr_Format(py_pdb_error, "Unable to get sid for uid=%d", uid);
2695 copy_user_sid = dom_sid_dup(frame, &user_sid);
2696 if (copy_user_sid == NULL) {
2702 py_user_sid = pytalloc_steal(dom_sid_Type, copy_user_sid);
2709 static PyObject *py_pdb_gid_to_sid(PyObject *self, PyObject *args)
2711 TALLOC_CTX *frame = talloc_stackframe();
2712 struct pdb_methods *methods;
2715 struct dom_sid group_sid, *copy_group_sid;
2716 PyObject *py_group_sid;
2718 if (!PyArg_ParseTuple(args, "I:gid_to_sid", &gid)) {
2724 id.type = ID_TYPE_GID;
2726 methods = pytalloc_get_ptr(self);
2728 if (!methods->id_to_sid(methods, &id, &group_sid)) {
2729 PyErr_Format(py_pdb_error, "Unable to get sid for gid=%d", gid);
2734 copy_group_sid = dom_sid_dup(frame, &group_sid);
2735 if (copy_group_sid == NULL) {
2741 py_group_sid = pytalloc_steal(dom_sid_Type, copy_group_sid);
2744 return py_group_sid;
2748 static PyObject *py_pdb_sid_to_id(PyObject *self, PyObject *args)
2750 TALLOC_CTX *frame = talloc_stackframe();
2751 struct pdb_methods *methods;
2753 struct dom_sid *sid;
2756 if (!PyArg_ParseTuple(args, "O!:sid_to_id", dom_sid_Type, &py_sid)) {
2761 methods = pytalloc_get_ptr(self);
2763 sid = pytalloc_get_ptr(py_sid);
2765 if (!methods->sid_to_id(methods, sid, &id)) {
2766 PyErr_Format(py_pdb_error, "Unable to get id for sid");
2772 return Py_BuildValue("(II)", id.id, id.type);
2776 static PyObject *py_pdb_new_rid(PyObject *self, PyObject *unused)
2778 TALLOC_CTX *frame = talloc_stackframe();
2779 struct pdb_methods *methods;
2782 methods = pytalloc_get_ptr(self);
2784 if (!methods->new_rid(methods, &rid)) {
2785 PyErr_Format(py_pdb_error, "Unable to get new rid");
2791 return PyInt_FromLong(rid);
2795 static PyObject *py_pdb_get_trusteddom_pw(PyObject *self, PyObject *args)
2797 TALLOC_CTX *frame = talloc_stackframe();
2798 struct pdb_methods *methods;
2801 struct dom_sid sid, *copy_sid;
2803 time_t last_set_time;
2806 if (!PyArg_ParseTuple(args, "s:get_trusteddom_pw", &domain)) {
2811 methods = pytalloc_get_ptr(self);
2813 if (!methods->get_trusteddom_pw(methods, domain, &pwd, &sid, &last_set_time)) {
2814 PyErr_Format(py_pdb_error, "Unable to get trusted domain password");
2819 copy_sid = dom_sid_dup(frame, &sid);
2820 if (copy_sid == NULL) {
2826 py_sid = pytalloc_steal(dom_sid_Type, copy_sid);
2827 if (py_sid == NULL) {
2833 py_value = PyDict_New();
2834 if (py_value == NULL) {
2840 PyDict_SetItemString(py_value, "pwd", PyStr_FromString(pwd));
2841 PyDict_SetItemString(py_value, "sid", py_sid);
2842 PyDict_SetItemString(py_value, "last_set_tim", PyInt_FromLong(last_set_time));
2849 static PyObject *py_pdb_set_trusteddom_pw(PyObject *self, PyObject *args)
2851 TALLOC_CTX *frame = talloc_stackframe();
2852 struct pdb_methods *methods;
2855 const struct dom_sid *domain_sid;
2856 PyObject *py_domain_sid;
2858 if (!PyArg_ParseTuple(args, "ssO!:set_trusteddom_pw", &domain, &pwd,
2859 dom_sid_Type, &py_domain_sid)) {
2864 methods = pytalloc_get_ptr(self);
2866 domain_sid = pytalloc_get_ptr(py_domain_sid);
2868 if (!methods->set_trusteddom_pw(methods, domain, pwd, domain_sid)) {
2869 PyErr_Format(py_pdb_error, "Unable to set trusted domain password");
2879 static PyObject *py_pdb_del_trusteddom_pw(PyObject *self, PyObject *args)
2881 TALLOC_CTX *frame = talloc_stackframe();
2882 struct pdb_methods *methods;
2885 if (!PyArg_ParseTuple(args, "s:del_trusteddom_pw", &domain)) {
2890 methods = pytalloc_get_ptr(self);
2892 if (!methods->del_trusteddom_pw(methods, domain)) {
2893 PyErr_Format(py_pdb_error, "Unable to delete trusted domain password");
2903 static PyObject *py_pdb_enum_trusteddoms(PyObject *self, PyObject *unused)
2905 TALLOC_CTX *frame = talloc_stackframe();
2907 struct pdb_methods *methods;
2908 uint32_t num_domains;
2909 struct trustdom_info **domains;
2910 PyObject *py_domain_list, *py_dict;
2913 methods = pytalloc_get_ptr(self);
2915 status = methods->enum_trusteddoms(methods, frame, &num_domains, &domains);
2916 if (!NT_STATUS_IS_OK(status)) {
2917 PyErr_Format(py_pdb_error, "Unable to enumerate trusted domains, (%d,%s)",
2918 NT_STATUS_V(status),
2919 get_friendly_nt_error_msg(status));
2924 py_domain_list = PyList_New(0);
2925 if (py_domain_list == NULL) {
2931 for(i=0; i<num_domains; i++) {
2932 py_dict = PyDict_New();
2934 PyDict_SetItemString(py_dict, "name",
2935 PyStr_FromString(domains[i]->name));
2936 PyDict_SetItemString(py_dict, "sid",
2937 pytalloc_steal(dom_sid_Type, &domains[i]->sid));
2940 PyList_Append(py_domain_list, py_dict);
2944 return py_domain_list;
2948 static PyObject *py_pdb_get_trusted_domain(PyObject *self, PyObject *args)
2950 TALLOC_CTX *frame = talloc_stackframe();
2952 struct pdb_methods *methods;
2954 struct pdb_trusted_domain *td;
2955 PyObject *py_domain_info;
2957 if (!PyArg_ParseTuple(args, "s:get_trusted_domain", &domain)) {
2962 methods = pytalloc_get_ptr(self);
2964 status = methods->get_trusted_domain(methods, frame, domain, &td);
2965 if (!NT_STATUS_IS_OK(status)) {
2966 PyErr_Format(py_pdb_error, "Unable to get trusted domain information, (%d,%s)",
2967 NT_STATUS_V(status),
2968 get_friendly_nt_error_msg(status));
2973 py_domain_info = PyDict_New();
2974 if (py_domain_info == NULL) {
2980 PyDict_SetItemString(py_domain_info, "domain_name",
2981 PyStr_FromString(td->domain_name));
2982 PyDict_SetItemString(py_domain_info, "netbios_name",
2983 PyStr_FromString(td->netbios_name));
2984 PyDict_SetItemString(py_domain_info, "security_identifier",
2985 pytalloc_steal(dom_sid_Type, &td->security_identifier));
2986 PyDict_SetItemString(py_domain_info, "trust_auth_incoming",
2987 PyBytes_FromStringAndSize((const char *)td->trust_auth_incoming.data,
2988 td->trust_auth_incoming.length));
2989 PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
2990 PyBytes_FromStringAndSize((const char *)td->trust_auth_outgoing.data,
2991 td->trust_auth_outgoing.length));
2992 PyDict_SetItemString(py_domain_info, "trust_direction",
2993 PyInt_FromLong(td->trust_direction));
2994 PyDict_SetItemString(py_domain_info, "trust_type",
2995 PyInt_FromLong(td->trust_type));
2996 PyDict_SetItemString(py_domain_info, "trust_attributes",
2997 PyInt_FromLong(td->trust_attributes));
2998 PyDict_SetItemString(py_domain_info, "trust_forest_trust_info",
2999 PyBytes_FromStringAndSize((const char *)td->trust_forest_trust_info.data,
3000 td->trust_forest_trust_info.length));
3003 return py_domain_info;
3007 static PyObject *py_pdb_get_trusted_domain_by_sid(PyObject *self, PyObject *args)
3009 TALLOC_CTX *frame = talloc_stackframe();
3011 struct pdb_methods *methods;
3012 PyObject *py_domain_sid;
3013 struct dom_sid *domain_sid;
3014 struct pdb_trusted_domain *td;
3015 PyObject *py_domain_info;
3017 if (!PyArg_ParseTuple(args, "O!:get_trusted_domain_by_sid", dom_sid_Type, &py_domain_sid)) {
3022 methods = pytalloc_get_ptr(self);
3024 domain_sid = pytalloc_get_ptr(py_domain_sid);
3026 status = methods->get_trusted_domain_by_sid(methods, frame, domain_sid, &td);
3027 if (!NT_STATUS_IS_OK(status)) {
3028 PyErr_Format(py_pdb_error, "Unable to get trusted domain information, (%d,%s)",
3029 NT_STATUS_V(status),
3030 get_friendly_nt_error_msg(status));
3035 py_domain_info = PyDict_New();
3036 if (py_domain_info == NULL) {
3042 PyDict_SetItemString(py_domain_info, "domain_name",
3043 PyStr_FromString(td->domain_name));
3044 PyDict_SetItemString(py_domain_info, "netbios_name",
3045 PyStr_FromString(td->netbios_name));
3046 PyDict_SetItemString(py_domain_info, "security_identifier",
3047 pytalloc_steal(dom_sid_Type, &td->security_identifier));
3048 PyDict_SetItemString(py_domain_info, "trust_auth_incoming",
3049 PyBytes_FromStringAndSize((char *)td->trust_auth_incoming.data,
3050 td->trust_auth_incoming.length));
3051 PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
3052 PyBytes_FromStringAndSize((char *)td->trust_auth_outgoing.data,
3053 td->trust_auth_outgoing.length));
3054 PyDict_SetItemString(py_domain_info, "trust_direction",
3055 PyInt_FromLong(td->trust_direction));
3056 PyDict_SetItemString(py_domain_info, "trust_type",
3057 PyInt_FromLong(td->trust_type));
3058 PyDict_SetItemString(py_domain_info, "trust_attributes",
3059 PyInt_FromLong(td->trust_attributes));
3060 PyDict_SetItemString(py_domain_info, "trust_forest_trust_info",
3061 PyBytes_FromStringAndSize((char *)td->trust_forest_trust_info.data,
3062 td->trust_forest_trust_info.length));
3065 return py_domain_info;
3069 static PyObject *py_pdb_set_trusted_domain(PyObject *self, PyObject *args)
3071 TALLOC_CTX *frame = talloc_stackframe();
3073 struct pdb_methods *methods;
3075 PyObject *py_td_info;
3076 struct pdb_trusted_domain td_info;
3080 if (!PyArg_ParseTuple(args, "sO!:set_trusted_domain", &domain, &PyDict_Type, &py_td_info)) {
3085 py_tmp = PyDict_GetItemString(py_td_info, "domain_name");
3086 td_info.domain_name = PyStr_AsString(py_tmp);
3088 py_tmp = PyDict_GetItemString(py_td_info, "netbios_name");
3089 td_info.netbios_name = PyStr_AsString(py_tmp);
3091 py_tmp = PyDict_GetItemString(py_td_info, "security_identifier");
3092 td_info.security_identifier = *pytalloc_get_type(py_tmp, struct dom_sid);
3094 py_tmp = PyDict_GetItemString(py_td_info, "trust_auth_incoming");
3095 PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_incoming.data, &len);
3096 td_info.trust_auth_incoming.length = len;
3098 py_tmp = PyDict_GetItemString(py_td_info, "trust_auth_outgoing");
3099 PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_outgoing.data, &len);
3100 td_info.trust_auth_outgoing.length = len;
3102 py_tmp = PyDict_GetItemString(py_td_info, "trust_direction");
3103 td_info.trust_direction = PyInt_AsLong(py_tmp);
3105 py_tmp = PyDict_GetItemString(py_td_info, "trust_type");
3106 td_info.trust_type = PyInt_AsLong(py_tmp);
3108 py_tmp = PyDict_GetItemString(py_td_info, "trust_attributes");
3109 td_info.trust_attributes = PyInt_AsLong(py_tmp);
3111 py_tmp = PyDict_GetItemString(py_td_info, "trust_forest_trust_info");
3112 PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_forest_trust_info.data, &len);
3113 td_info.trust_forest_trust_info.length = len;
3115 methods = pytalloc_get_ptr(self);
3117 status = methods->set_trusted_domain(methods, domain, &td_info);
3118 if (!NT_STATUS_IS_OK(status)) {
3119 PyErr_Format(py_pdb_error, "Unable to set trusted domain information, (%d,%s)",
3120 NT_STATUS_V(status),
3121 get_friendly_nt_error_msg(status));
3131 static PyObject *py_pdb_del_trusted_domain(PyObject *self, PyObject *args)
3133 TALLOC_CTX *frame = talloc_stackframe();
3135 struct pdb_methods *methods;
3138 if (!PyArg_ParseTuple(args, "s:del_trusted_domain", &domain)) {
3143 methods = pytalloc_get_ptr(self);
3145 status = methods->del_trusted_domain(methods, domain);
3146 if (!NT_STATUS_IS_OK(status)) {
3147 PyErr_Format(py_pdb_error, "Unable to delete trusted domain, (%d,%s)",
3148 NT_STATUS_V(status),
3149 get_friendly_nt_error_msg(status));
3159 static PyObject *py_pdb_enum_trusted_domains(PyObject *self, PyObject *args)
3161 TALLOC_CTX *frame = talloc_stackframe();
3163 struct pdb_methods *methods;
3164 uint32_t num_domains;
3165 struct pdb_trusted_domain **td_info, *td;
3166 PyObject *py_td_info, *py_domain_info;
3169 methods = pytalloc_get_ptr(self);
3171 status = methods->enum_trusted_domains(methods, frame, &num_domains, &td_info);
3172 if (!NT_STATUS_IS_OK(status)) {
3173 PyErr_Format(py_pdb_error, "Unable to delete trusted domain, (%d,%s)",
3174 NT_STATUS_V(status),
3175 get_friendly_nt_error_msg(status));
3180 py_td_info = PyList_New(0);
3181 if (py_td_info == NULL) {
3187 for (i=0; i<num_domains; i++) {
3189 py_domain_info = PyDict_New();
3190 if (py_domain_info == NULL) {
3192 Py_DECREF(py_td_info);
3199 PyDict_SetItemString(py_domain_info, "domain_name",
3200 PyStr_FromString(td->domain_name));
3201 PyDict_SetItemString(py_domain_info, "netbios_name",
3202 PyStr_FromString(td->netbios_name));
3203 PyDict_SetItemString(py_domain_info, "security_identifier",
3204 pytalloc_steal(dom_sid_Type, &td->security_identifier));
3205 PyDict_SetItemString(py_domain_info, "trust_auth_incoming",
3206 PyBytes_FromStringAndSize((const char *)td->trust_auth_incoming.data,
3207 td->trust_auth_incoming.length));
3208 PyDict_SetItemString(py_domain_info, "trust_auth_outgoing",
3209 PyBytes_FromStringAndSize((const char *)td->trust_auth_outgoing.data,
3210 td->trust_auth_outgoing.length));
3211 PyDict_SetItemString(py_domain_info, "trust_direction",
3212 PyInt_FromLong(td->trust_direction));
3213 PyDict_SetItemString(py_domain_info, "trust_type",
3214 PyInt_FromLong(td->trust_type));
3215 PyDict_SetItemString(py_domain_info, "trust_attributes",
3216 PyInt_FromLong(td->trust_attributes));
3217 PyDict_SetItemString(py_domain_info, "trust_forest_trust_info",
3218 PyBytes_FromStringAndSize((const char *)td->trust_forest_trust_info.data,
3219 td->trust_forest_trust_info.length));
3220 PyList_Append(py_td_info, py_domain_info);
3228 static PyObject *py_pdb_get_secret(PyObject *self, PyObject *args)
3230 TALLOC_CTX *frame = talloc_stackframe();
3232 struct pdb_methods *methods;
3233 const char *secret_name;
3234 DATA_BLOB secret_current, secret_old;
3235 NTTIME secret_current_lastchange, secret_old_lastchange;
3237 struct security_descriptor *sd;
3238 PyObject *py_secret;
3240 if (!PyArg_ParseTuple(args, "s:get_secret_name", &secret_name)) {
3245 methods = pytalloc_get_ptr(self);
3247 py_sd = pytalloc_new(struct security_descriptor, security_Type);
3248 if (py_sd == NULL) {
3253 sd = pytalloc_get_ptr(py_sd);
3255 status = methods->get_secret(methods, frame, secret_name,
3257 &secret_current_lastchange,
3259 &secret_old_lastchange,
3261 if (!NT_STATUS_IS_OK(status)) {
3262 PyErr_Format(py_pdb_error, "Unable to get information for secret (%s), (%d,%s)",
3264 NT_STATUS_V(status),
3265 get_friendly_nt_error_msg(status));
3270 py_secret = PyDict_New();
3271 if (py_secret == NULL) {
3278 PyDict_SetItemString(py_secret, "secret_current",
3279 PyBytes_FromStringAndSize((const char*)secret_current.data, secret_current.length));
3280 PyDict_SetItemString(py_secret, "secret_current_lastchange",
3281 PyLong_FromUnsignedLongLong(secret_current_lastchange));
3282 PyDict_SetItemString(py_secret, "secret_old",
3283 PyBytes_FromStringAndSize((const char*)secret_old.data, secret_old.length));
3284 PyDict_SetItemString(py_secret, "secret_old_lastchange",
3285 PyLong_FromUnsignedLongLong(secret_old_lastchange));
3286 PyDict_SetItemString(py_secret, "sd", py_sd);
3293 static PyObject *py_pdb_set_secret(PyObject *self, PyObject *args)
3295 TALLOC_CTX *frame = talloc_stackframe();
3297 struct pdb_methods *methods;
3298 const char *secret_name;
3299 PyObject *py_secret;
3300 PyObject *py_secret_cur, *py_secret_old, *py_sd;
3301 DATA_BLOB secret_current, secret_old;
3302 struct security_descriptor *sd;
3305 if (!PyArg_ParseTuple(args, "sO!:set_secret_name", &secret_name, PyDict_Type, &py_secret)) {
3310 py_secret_cur = PyDict_GetItemString(py_secret, "secret_current");
3311 py_secret_old = PyDict_GetItemString(py_secret, "secret_old");
3312 py_sd = PyDict_GetItemString(py_secret, "sd");
3314 PY_CHECK_TYPE(&PyBytes_Type, py_secret_cur, return NULL;);
3315 PY_CHECK_TYPE(&PyBytes_Type, py_secret_old, return NULL;);
3316 PY_CHECK_TYPE(security_Type, py_sd, return NULL;);
3318 methods = pytalloc_get_ptr(self);
3320 PyBytes_AsStringAndSize(py_secret_cur, (char **)&secret_current.data, &len);
3321 secret_current.length = len;
3322 PyBytes_AsStringAndSize(py_secret_old, (char **)&secret_old.data, &len);
3323 secret_current.length = len;
3324 sd = pytalloc_get_ptr(py_sd);
3326 status = methods->set_secret(methods, secret_name, &secret_current, &secret_old, sd);
3327 if (!NT_STATUS_IS_OK(status)) {
3328 PyErr_Format(py_pdb_error, "Unable to set information for secret (%s), (%d,%s)",
3330 NT_STATUS_V(status),
3331 get_friendly_nt_error_msg(status));
3341 static PyObject *py_pdb_delete_secret(PyObject *self, PyObject *args)
3343 TALLOC_CTX *frame = talloc_stackframe();
3345 struct pdb_methods *methods;
3346 const char *secret_name;
3348 if (!PyArg_ParseTuple(args, "s:delete_secret", &secret_name)) {
3353 methods = pytalloc_get_ptr(self);
3355 status = methods->delete_secret(methods, secret_name);
3356 if (!NT_STATUS_IS_OK(status)) {
3357 PyErr_Format(py_pdb_error, "Unable to delete secret (%s), (%d,%s)",
3359 NT_STATUS_V(status),
3360 get_friendly_nt_error_msg(status));
3369 static PyMethodDef py_pdb_methods[] = {
3370 { "domain_info", py_pdb_domain_info, METH_NOARGS,
3371 "domain_info() -> str\n\n \
3372 Get domain information for the database." },
3373 { "getsampwnam", py_pdb_getsampwnam, METH_VARARGS,
3374 "getsampwnam(username) -> samu object\n\n \
3375 Get user information by name." },
3376 { "getsampwsid", py_pdb_getsampwsid, METH_VARARGS,
3377 "getsampwsid(user_sid) -> samu object\n\n \
3378 Get user information by sid (dcerpc.security.dom_sid object)." },
3379 { "create_user", py_pdb_create_user, METH_VARARGS,
3380 "create_user(username, acct_flags) -> rid\n\n \
3381 Create user. acct_flags are samr account control flags." },
3382 { "delete_user", py_pdb_delete_user, METH_VARARGS,
3383 "delete_user(samu object) -> None\n\n \
3385 { "add_sam_account", py_pdb_add_sam_account, METH_VARARGS,
3386 "add_sam_account(samu object) -> None\n\n \
3387 Add SAM account." },
3388 { "update_sam_account", py_pdb_update_sam_account, METH_VARARGS,
3389 "update_sam_account(samu object) -> None\n\n \
3390 Update SAM account." },
3391 { "delete_sam_account", py_pdb_delete_sam_account, METH_VARARGS,
3392 "delete_sam_account(samu object) -> None\n\n \
3393 Delete SAM account." },
3394 { "rename_sam_account", py_pdb_rename_sam_account, METH_VARARGS,
3395 "rename_sam_account(samu object1, new_username) -> None\n\n \
3396 Rename SAM account." },
3397 /* update_login_attempts */
3398 { "getgrsid", py_pdb_getgrsid, METH_VARARGS,
3399 "getgrsid(group_sid) -> groupmap object\n\n \
3400 Get group information by sid (dcerpc.security.dom_sid object)." },
3401 { "getgrgid", py_pdb_getgrgid, METH_VARARGS,
3402 "getgrsid(gid) -> groupmap object\n\n \
3403 Get group information by gid." },
3404 { "getgrnam", py_pdb_getgrnam, METH_VARARGS,
3405 "getgrsid(groupname) -> groupmap object\n\n \
3406 Get group information by name." },
3407 { "create_dom_group", py_pdb_create_dom_group, METH_VARARGS,
3408 "create_dom_group(groupname) -> group_rid\n\n \
3409 Create new domain group by name." },
3410 { "delete_dom_group", py_pdb_delete_dom_group, METH_VARARGS,
3411 "delete_dom_group(group_rid) -> None\n\n \
3412 Delete domain group identified by rid" },
3413 { "add_group_mapping_entry", py_pdb_add_group_mapping_entry, METH_VARARGS,
3414 "add_group_mapping_entry(groupmap) -> None\n \
3415 Add group mapping entry for groupmap object." },
3416 { "update_group_mapping_entry", py_pdb_update_group_mapping_entry, METH_VARARGS,
3417 "update_group_mapping_entry(groupmap) -> None\n\n \
3418 Update group mapping entry for groupmap object." },
3419 { "delete_group_mapping_entry", py_pdb_delete_group_mapping_entry, METH_VARARGS,
3420 "delete_group_mapping_entry(groupmap) -> None\n\n \
3421 Delete group mapping entry for groupmap object." },
3422 { "enum_group_mapping", py_pdb_enum_group_mapping, METH_VARARGS,
3423 "enum_group_mapping([domain_sid, [type, [unix_only]]]) -> List\n\n \
3424 Return list of group mappings as groupmap objects. Optional arguments are domain_sid object, type of group, unix only flag." },
3425 { "enum_group_members", py_pdb_enum_group_members, METH_VARARGS,
3426 "enum_group_members(group_sid) -> List\n\n \
3427 Return list of users (dom_sid object) in group." },
3428 { "enum_group_memberships", py_pdb_enum_group_memberships, METH_VARARGS,
3429 "enum_group_memberships(samu object) -> List\n\n \
3430 Return list of groups (dom_sid object) this user is part of." },
3431 /* set_unix_primary_group */
3432 { "add_groupmem", py_pdb_add_groupmem, METH_VARARGS,
3433 "add_groupmem(group_rid, member_rid) -> None\n\n \
3434 Add user to group." },
3435 { "del_groupmem", py_pdb_del_groupmem, METH_VARARGS,
3436 "del_groupmem(group_rid, member_rid) -> None\n\n \
3437 Remove user from from group." },
3438 { "create_alias", py_pdb_create_alias, METH_VARARGS,
3439 "create_alias(alias_name) -> alias_rid\n\n \
3440 Create alias entry." },
3441 { "delete_alias", py_pdb_delete_alias, METH_VARARGS,
3442 "delete_alias(alias_sid) -> None\n\n \
3443 Delete alias entry." },
3444 { "get_aliasinfo", py_pdb_get_aliasinfo, METH_VARARGS,
3445 "get_aliasinfo(alias_sid) -> Mapping\n\n \
3446 Get alias information as a dictionary with keys - acct_name, acct_desc, rid." },
3447 { "set_aliasinfo", py_pdb_set_aliasinfo, METH_VARARGS,
3448 "set_alias_info(alias_sid, Mapping) -> None\n\n \
3449 Set alias information from a dictionary with keys - acct_name, acct_desc." },
3450 { "add_aliasmem", py_pdb_add_aliasmem, METH_VARARGS,
3451 "add_aliasmem(alias_sid, member_sid) -> None\n\n \
3452 Add user to alias entry." },
3453 { "del_aliasmem", py_pdb_del_aliasmem, METH_VARARGS,
3454 "del_aliasmem(alias_sid, member_sid) -> None\n\n \
3455 Remove a user from alias entry." },
3456 { "enum_aliasmem", py_pdb_enum_aliasmem, METH_VARARGS,
3457 "enum_aliasmem(alias_sid) -> List\n\n \
3458 Return a list of members (dom_sid object) for alias entry." },
3459 /* enum_alias_memberships */
3462 { "get_account_policy", py_pdb_get_account_policy, METH_NOARGS,
3463 "get_account_policy() -> Mapping\n\n \
3464 Get account policy information as a dictionary." },
3465 { "set_account_policy", py_pdb_set_account_policy, METH_VARARGS,
3466 "get_account_policy(Mapping) -> None\n\n \
3467 Set account policy settings from a dicionary." },
3469 { "search_users", py_pdb_search_users, METH_VARARGS,
3470 "search_users(acct_flags) -> List\n\n \
3471 Search users. acct_flags are samr account control flags.\n \
3472 Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
3473 { "search_groups", py_pdb_search_groups, METH_NOARGS,
3474 "search_groups() -> List\n\n \
3475 Search unix only groups. \n \
3476 Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
3477 { "search_aliases", py_pdb_search_aliases, METH_VARARGS,
3478 "search_aliases([domain_sid]) -> List\n\n \
3479 Search aliases. domain_sid is dcerpc.security.dom_sid object.\n \
3480 Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
3481 { "uid_to_sid", py_pdb_uid_to_sid, METH_VARARGS,
3482 "uid_to_sid(uid) -> sid\n\n \
3483 Return sid for given user id." },
3484 { "gid_to_sid", py_pdb_gid_to_sid, METH_VARARGS,
3485 "gid_to_sid(gid) -> sid\n\n \
3486 Return sid for given group id." },
3487 { "sid_to_id", py_pdb_sid_to_id, METH_VARARGS,
3488 "sid_to_id(sid) -> Tuple\n\n \
3489 Return id and type for given sid." },
3491 { "new_rid", py_pdb_new_rid, METH_NOARGS,
3492 "new_rid() -> rid\n\n \
3494 { "get_trusteddom_pw", py_pdb_get_trusteddom_pw, METH_VARARGS,
3495 "get_trusteddom_pw(domain) -> Mapping\n\n \
3496 Get trusted domain password, sid and last set time in a dictionary." },
3497 { "set_trusteddom_pw", py_pdb_set_trusteddom_pw, METH_VARARGS,
3498 "set_trusteddom_pw(domain, pwd, sid) -> None\n\n \
3499 Set trusted domain password." },
3500 { "del_trusteddom_pw", py_pdb_del_trusteddom_pw, METH_VARARGS,
3501 "del_trusteddom_pw(domain) -> None\n\n \
3502 Delete trusted domain password." },
3503 { "enum_trusteddoms", py_pdb_enum_trusteddoms, METH_NOARGS,
3504 "enum_trusteddoms() -> List\n\n \
3505 Get list of trusted domains. Each item is a dictionary with name and sid keys" },
3506 { "get_trusted_domain", py_pdb_get_trusted_domain, METH_VARARGS,
3507 "get_trusted_domain(domain) -> Mapping\n\n \
3508 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." },
3509 { "get_trusted_domain_by_sid", py_pdb_get_trusted_domain_by_sid, METH_VARARGS,
3510 "get_trusted_domain_by_sid(domain_sid) -> Mapping\n\n \
3511 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" },
3512 { "set_trusted_domain", py_pdb_set_trusted_domain, METH_VARARGS,
3513 "set_trusted_domain(domain, Mapping) -> None\n\n \
3514 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." },
3515 { "del_trusted_domain", py_pdb_del_trusted_domain, METH_VARARGS,
3516 "del_trusted_domain(domain) -> None\n\n \
3517 Delete trusted domain." },
3518 { "enum_trusted_domains", py_pdb_enum_trusted_domains, METH_VARARGS,
3519 "enum_trusted_domains() -> List\n\n \
3520 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." },
3521 { "get_secret", py_pdb_get_secret, METH_VARARGS,
3522 "get_secret(secret_name) -> Mapping\n\n \
3523 Get secret information for secret_name. Information is a dictionary with keys - secret_current, secret_current_lastchange, secret_old, secret_old_lastchange, sd." },
3524 { "set_secret", py_pdb_set_secret, METH_VARARGS,
3525 "set_secret(secret_name, Mapping) -> None\n\n \
3526 Set secret information for secret_name using dictionary with keys - secret_current, sd." },
3527 { "delete_secret", py_pdb_delete_secret, METH_VARARGS,
3528 "delete_secret(secret_name) -> None\n\n \
3529 Delete secret information for secret_name." },
3534 static PyObject *py_pdb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3536 TALLOC_CTX *frame = talloc_stackframe();
3537 const char *url = NULL;
3540 struct pdb_methods *methods;
3542 if (!PyArg_ParseTuple(args, "s", &url)) {
3547 /* Initalize list of methods */
3548 status = make_pdb_method_name(&methods, url);
3549 if (!NT_STATUS_IS_OK(status)) {
3550 PyErr_Format(py_pdb_error, "Cannot load backend methods for '%s' backend (%d,%s)",
3552 NT_STATUS_V(status),
3553 get_friendly_nt_error_msg(status));
3558 if ((pypdb = pytalloc_steal(type, methods)) == NULL) {
3569 static PyTypeObject PyPDB = {
3570 .tp_name = "passdb.PDB",
3571 .tp_new = py_pdb_new,
3572 .tp_flags = Py_TPFLAGS_DEFAULT,
3573 .tp_methods = py_pdb_methods,
3574 .tp_doc = "PDB(url[, read_write_flags]) -> Password DB object\n",
3579 * Return a list of passdb backends
3581 static PyObject *py_passdb_backends(PyObject *self, PyObject *unused)
3583 TALLOC_CTX *frame = talloc_stackframe();
3585 const struct pdb_init_function_entry *entry;
3587 entry = pdb_get_backends();
3592 if((py_blist = PyList_New(0)) == NULL) {
3599 PyList_Append(py_blist, PyStr_FromString(entry->name));
3600 entry = entry->next;
3608 static PyObject *py_set_smb_config(PyObject *self, PyObject *args)
3610 TALLOC_CTX *frame = talloc_stackframe();
3611 const char *smb_config;
3613 if (!PyArg_ParseTuple(args, "s", &smb_config)) {
3618 /* Load smbconf parameters */
3619 if (!lp_load_global(smb_config)) {
3620 PyErr_Format(py_pdb_error, "Cannot open '%s'", smb_config);
3630 static PyObject *py_set_secrets_dir(PyObject *self, PyObject *args)
3632 TALLOC_CTX *frame = talloc_stackframe();
3633 const char *private_dir;
3635 if (!PyArg_ParseTuple(args, "s", &private_dir)) {
3640 /* Initialize secrets database */
3641 if (!secrets_init_path(private_dir)) {
3642 PyErr_Format(py_pdb_error, "Cannot open secrets file database in '%s'",
3652 static PyObject *py_reload_static_pdb(PyObject *self, PyObject *args)
3654 TALLOC_CTX *frame = talloc_stackframe();
3656 /* Initialize secrets database */
3657 if (!initialize_password_db(true, NULL)) {
3658 PyErr_Format(py_pdb_error, "Cannot re-open passdb backend %s", lp_passdb_backend());
3667 static PyObject *py_get_global_sam_sid(PyObject *self, PyObject *unused)
3669 TALLOC_CTX *frame = talloc_stackframe();
3670 struct dom_sid *domain_sid, *domain_sid_copy;
3671 PyObject *py_dom_sid;
3673 domain_sid = get_global_sam_sid();
3675 domain_sid_copy = dom_sid_dup(frame, domain_sid);
3676 if (domain_sid_copy == NULL) {
3682 py_dom_sid = pytalloc_steal(dom_sid_Type, domain_sid_copy);
3689 static PyMethodDef py_passdb_methods[] = {
3690 { "get_backends", py_passdb_backends, METH_NOARGS,
3691 "get_backends() -> list\n\n \
3692 Get a list of password database backends supported." },
3693 { "set_smb_config", py_set_smb_config, METH_VARARGS,
3694 "set_smb_config(path) -> None\n\n \
3695 Set path to smb.conf file to load configuration parameters." },
3696 { "set_secrets_dir", py_set_secrets_dir, METH_VARARGS,
3697 "set_secrets_dir(private_dir) -> None\n\n \
3698 Set path to private directory to load secrets database from non-default location." },
3699 { "get_global_sam_sid", py_get_global_sam_sid, METH_NOARGS,
3700 "get_global_sam_sid() -> dom_sid\n\n \
3701 Return domain SID." },
3702 { "reload_static_pdb", py_reload_static_pdb, METH_NOARGS,
3703 "reload_static_pdb() -> None\n\n \
3704 Re-initalise the static pdb used internally. Needed if 'passdb backend' is changed." },
3708 static struct PyModuleDef moduledef = {
3709 PyModuleDef_HEAD_INIT,
3711 .m_doc = "SAMBA Password Database",
3713 .m_methods = py_passdb_methods,
3716 MODULE_INIT_FUNC(passdb)
3718 TALLOC_CTX *frame = talloc_stackframe();
3719 PyObject *m = NULL, *mod = NULL;
3720 char exception_name[] = "passdb.error";
3722 if (pytalloc_BaseObject_PyType_Ready(&PyPDB) < 0) {
3727 if (pytalloc_BaseObject_PyType_Ready(&PySamu) < 0) {
3732 if (pytalloc_BaseObject_PyType_Ready(&PyGroupmap) < 0) {
3737 m = PyModule_Create(&moduledef);
3743 /* Create new exception for passdb module */
3744 py_pdb_error = PyErr_NewException(exception_name, NULL, NULL);
3745 Py_INCREF(py_pdb_error);
3746 PyModule_AddObject(m, "error", py_pdb_error);
3749 PyModule_AddObject(m, "PDB", (PyObject *)&PyPDB);
3752 PyModule_AddObject(m, "Samu", (PyObject *)&PySamu);
3754 Py_INCREF(&PyGroupmap);
3755 PyModule_AddObject(m, "Groupmap", (PyObject *)&PyGroupmap);
3757 /* Import dom_sid type from dcerpc.security */
3758 mod = PyImport_ImportModule("samba.dcerpc.security");
3764 dom_sid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "dom_sid");
3765 if (dom_sid_Type == NULL) {
3770 /* Import security_descriptor type from dcerpc.security */
3771 security_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "descriptor");
3773 if (security_Type == NULL) {
3778 /* Import GUID type from dcerpc.misc */
3779 mod = PyImport_ImportModule("samba.dcerpc.misc");
3785 guid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "GUID");
3787 if (guid_Type == NULL) {