1 /*
2 Python interface to passdb
3
4 Copyright (C) Amitay Isaacs 2011
5
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.
10
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.
15
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/>.
18 */
19
20 #include <Python.h>
21 #include <pytalloc.h>
22 #include "includes.h"
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"
27 #include "passdb.h"
28 #include "secrets.h"
29 #include "idmap.h"
30
31 #ifndef Py_TYPE /* Py_TYPE is only available on Python > 2.6 */
32 #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
33 #endif
34
35 #ifndef PY_CHECK_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); \
39 fail; \
40 }
41 #endif
42
43
44 static PyTypeObject *dom_sid_Type = NULL;
45 static PyTypeObject *security_Type = NULL;
46 static PyTypeObject *guid_Type = NULL;
47
48 static PyTypeObject PySamu;
49 static PyTypeObject PyGroupmap;
50 static PyTypeObject PyPDB;
51
52 static PyObject *py_pdb_error;
53
54 void initpassdb(void);
55
56
57 /************************** PIDL Autogeneratd ******************************/
58
py_samu_get_logon_time(PyObject * obj,void * closure)59 static PyObject *py_samu_get_logon_time(PyObject *obj, void *closure)
60 {
61 TALLOC_CTX *frame = talloc_stackframe();
62 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
63 PyObject *py_logon_time;
64
65 py_logon_time = PyInt_FromLong(pdb_get_logon_time(sam_acct));
66 talloc_free(frame);
67 return py_logon_time;
68 }
69
py_samu_set_logon_time(PyObject * obj,PyObject * value,void * closure)70 static int py_samu_set_logon_time(PyObject *obj, PyObject *value, void *closure)
71 {
72 TALLOC_CTX *frame = talloc_stackframe();
73 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
74
75 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
76 if (!pdb_set_logon_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
77 talloc_free(frame);
78 return -1;
79 }
80 talloc_free(frame);
81 return 0;
82 }
83
py_samu_get_logoff_time(PyObject * obj,void * closure)84 static PyObject *py_samu_get_logoff_time(PyObject *obj, void *closure)
85 {
86 TALLOC_CTX *frame = talloc_stackframe();
87 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
88 PyObject *py_logoff_time;
89
90 py_logoff_time = PyInt_FromLong(pdb_get_logoff_time(sam_acct));
91 talloc_free(frame);
92 return py_logoff_time;
93 }
94
py_samu_set_logoff_time(PyObject * obj,PyObject * value,void * closure)95 static int py_samu_set_logoff_time(PyObject *obj, PyObject *value, void *closure)
96 {
97 TALLOC_CTX *frame = talloc_stackframe();
98 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
99
100 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
101 if (!pdb_set_logoff_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
102 talloc_free(frame);
103 return -1;
104 }
105 talloc_free(frame);
106 return 0;
107 }
108
py_samu_get_kickoff_time(PyObject * obj,void * closure)109 static PyObject *py_samu_get_kickoff_time(PyObject *obj, void *closure)
110 {
111 TALLOC_CTX *frame = talloc_stackframe();
112 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
113 PyObject *py_kickoff_time;
114
115 py_kickoff_time = PyInt_FromLong(pdb_get_kickoff_time(sam_acct));
116 talloc_free(frame);
117 return py_kickoff_time;
118 }
119
py_samu_set_kickoff_time(PyObject * obj,PyObject * value,void * closure)120 static int py_samu_set_kickoff_time(PyObject *obj, PyObject *value, void *closure)
121 {
122 TALLOC_CTX *frame = talloc_stackframe();
123 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
124
125 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
126 if (!pdb_set_kickoff_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
127 talloc_free(frame);
128 return -1;
129 }
130 talloc_free(frame);
131 return 0;
132 }
133
py_samu_get_bad_password_time(PyObject * obj,void * closure)134 static PyObject *py_samu_get_bad_password_time(PyObject *obj, void *closure)
135 {
136 TALLOC_CTX *frame = talloc_stackframe();
137 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
138 PyObject *py_bad_password_time;
139
140 py_bad_password_time = PyInt_FromLong(pdb_get_bad_password_time(sam_acct));
141 talloc_free(frame);
142 return py_bad_password_time;
143 }
144
py_samu_set_bad_password_time(PyObject * obj,PyObject * value,void * closure)145 static int py_samu_set_bad_password_time(PyObject *obj, PyObject *value, void *closure)
146 {
147 TALLOC_CTX *frame = talloc_stackframe();
148 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
149
150 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
151 if (!pdb_set_bad_password_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
152 talloc_free(frame);
153 return -1;
154 }
155 talloc_free(frame);
156 return 0;
157 }
158
py_samu_get_pass_last_set_time(PyObject * obj,void * closure)159 static PyObject *py_samu_get_pass_last_set_time(PyObject *obj, void *closure)
160 {
161 TALLOC_CTX *frame = talloc_stackframe();
162 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
163 PyObject *py_pass_last_set_time;
164
165 py_pass_last_set_time = PyInt_FromLong(pdb_get_pass_last_set_time(sam_acct));
166 talloc_free(frame);
167 return py_pass_last_set_time;
168 }
169
py_samu_set_pass_last_set_time(PyObject * obj,PyObject * value,void * closure)170 static int py_samu_set_pass_last_set_time(PyObject *obj, PyObject *value, void *closure)
171 {
172 TALLOC_CTX *frame = talloc_stackframe();
173 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
174
175 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
176 if (!pdb_set_pass_last_set_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
177 talloc_free(frame);
178 return -1;
179 }
180 talloc_free(frame);
181 return 0;
182 }
183
py_samu_get_pass_can_change_time(PyObject * obj,void * closure)184 static PyObject *py_samu_get_pass_can_change_time(PyObject *obj, void *closure)
185 {
186 TALLOC_CTX *frame = talloc_stackframe();
187 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
188 PyObject *py_pass_can_change_time;
189
190 py_pass_can_change_time = PyInt_FromLong(pdb_get_pass_can_change_time(sam_acct));
191 talloc_free(frame);
192 return py_pass_can_change_time;
193 }
194
py_samu_set_pass_can_change_time(PyObject * obj,PyObject * value,void * closure)195 static int py_samu_set_pass_can_change_time(PyObject *obj, PyObject *value, void *closure)
196 {
197 TALLOC_CTX *frame = talloc_stackframe();
198 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
199
200 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
201 if (!pdb_set_pass_can_change_time(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
202 talloc_free(frame);
203 return -1;
204 }
205 talloc_free(frame);
206 return 0;
207 }
208
py_samu_get_pass_must_change_time(PyObject * obj,void * closure)209 static PyObject *py_samu_get_pass_must_change_time(PyObject *obj, void *closure)
210 {
211 TALLOC_CTX *frame = talloc_stackframe();
212 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
213 PyObject *py_pass_must_change_time;
214
215 py_pass_must_change_time = PyInt_FromLong(pdb_get_pass_must_change_time(sam_acct));
216 talloc_free(frame);
217 return py_pass_must_change_time;
218 }
219
py_samu_set_pass_must_change_time(PyObject * obj,PyObject * value,void * closure)220 static int py_samu_set_pass_must_change_time(PyObject *obj, PyObject *value, void *closure)
221 {
222 TALLOC_CTX *frame = talloc_stackframe();
223 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
224
225 /* TODO: make this not a get/set or give a better exception */
226 talloc_free(frame);
227 return -1;
228 }
229
py_samu_get_username(PyObject * obj,void * closure)230 static PyObject *py_samu_get_username(PyObject *obj, void *closure)
231 {
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;
236
237 username = pdb_get_username(sam_acct);
238 if (username == NULL) {
239 Py_RETURN_NONE;
240 }
241
242 py_username = PyUnicode_FromString(username);
243 talloc_free(frame);
244 return py_username;
245 }
246
py_samu_set_username(PyObject * obj,PyObject * value,void * closure)247 static int py_samu_set_username(PyObject *obj, PyObject *value, void *closure)
248 {
249 TALLOC_CTX *frame = talloc_stackframe();
250 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
251
252 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
253 if (!pdb_set_username(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
254 talloc_free(frame);
255 return -1;
256 }
257 talloc_free(frame);
258 return 0;
259 }
260
py_samu_get_domain(PyObject * obj,void * closure)261 static PyObject *py_samu_get_domain(PyObject *obj, void *closure)
262 {
263 TALLOC_CTX *frame = talloc_stackframe();
264 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
265 PyObject *py_domain;
266 const char *domain;
267
268 domain = pdb_get_domain(sam_acct);
269 if (domain == NULL) {
270 Py_RETURN_NONE;
271 }
272
273 py_domain = PyUnicode_FromString(domain);
274 talloc_free(frame);
275 return py_domain;
276 }
277
py_samu_set_domain(PyObject * obj,PyObject * value,void * closure)278 static int py_samu_set_domain(PyObject *obj, PyObject *value, void *closure)
279 {
280 TALLOC_CTX *frame = talloc_stackframe();
281 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
282
283 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
284 if (!pdb_set_domain(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
285 talloc_free(frame);
286 return -1;
287 }
288 talloc_free(frame);
289 return 0;
290 }
291
py_samu_get_nt_username(PyObject * obj,void * closure)292 static PyObject *py_samu_get_nt_username(PyObject *obj, void *closure)
293 {
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;
298
299 nt_username = pdb_get_nt_username(sam_acct);
300 if (nt_username == NULL) {
301 Py_RETURN_NONE;
302 }
303
304 py_nt_username = PyUnicode_FromString(nt_username);
305 talloc_free(frame);
306 return py_nt_username;
307 }
308
py_samu_set_nt_username(PyObject * obj,PyObject * value,void * closure)309 static int py_samu_set_nt_username(PyObject *obj, PyObject *value, void *closure)
310 {
311 TALLOC_CTX *frame = talloc_stackframe();
312 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
313
314 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
315 if (!pdb_set_nt_username(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
316 talloc_free(frame);
317 return -1;
318 }
319 talloc_free(frame);
320 return 0;
321 }
322
py_samu_get_full_name(PyObject * obj,void * closure)323 static PyObject *py_samu_get_full_name(PyObject *obj, void *closure)
324 {
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;
329
330 full_name = pdb_get_fullname(sam_acct);
331 if (full_name == NULL) {
332 Py_RETURN_NONE;
333 }
334
335 py_full_name = PyUnicode_FromString(full_name);
336 talloc_free(frame);
337 return py_full_name;
338 }
339
py_samu_set_full_name(PyObject * obj,PyObject * value,void * closure)340 static int py_samu_set_full_name(PyObject *obj, PyObject *value, void *closure)
341 {
342 TALLOC_CTX *frame = talloc_stackframe();
343 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
344
345 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
346 if (!pdb_set_fullname(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
347 talloc_free(frame);
348 return -1;
349 }
350 talloc_free(frame);
351 return 0;
352 }
353
py_samu_get_home_dir(PyObject * obj,void * closure)354 static PyObject *py_samu_get_home_dir(PyObject *obj, void *closure)
355 {
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;
360
361 home_dir = pdb_get_homedir(sam_acct);
362 if (home_dir == NULL) {
363 Py_RETURN_NONE;
364 }
365
366 py_home_dir = PyUnicode_FromString(home_dir);
367 talloc_free(frame);
368 return py_home_dir;
369 }
370
py_samu_set_home_dir(PyObject * obj,PyObject * value,void * closure)371 static int py_samu_set_home_dir(PyObject *obj, PyObject *value, void *closure)
372 {
373 TALLOC_CTX *frame = talloc_stackframe();
374 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
375
376 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
377 if (!pdb_set_homedir(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
378 talloc_free(frame);
379 return -1;
380 }
381 talloc_free(frame);
382 return 0;
383 }
384
py_samu_get_dir_drive(PyObject * obj,void * closure)385 static PyObject *py_samu_get_dir_drive(PyObject *obj, void *closure)
386 {
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;
391
392 dir_drive = pdb_get_dir_drive(sam_acct);
393 if (dir_drive == NULL) {
394 Py_RETURN_NONE;
395 }
396
397 py_dir_drive = PyUnicode_FromString(dir_drive);
398 talloc_free(frame);
399 return py_dir_drive;
400 }
401
py_samu_set_dir_drive(PyObject * obj,PyObject * value,void * closure)402 static int py_samu_set_dir_drive(PyObject *obj, PyObject *value, void *closure)
403 {
404 TALLOC_CTX *frame = talloc_stackframe();
405 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
406
407 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
408 if (!pdb_set_dir_drive(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
409 talloc_free(frame);
410 return -1;
411 }
412 talloc_free(frame);
413 return 0;
414 }
415
py_samu_get_logon_script(PyObject * obj,void * closure)416 static PyObject *py_samu_get_logon_script(PyObject *obj, void *closure)
417 {
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;
422
423 logon_script = pdb_get_logon_script(sam_acct);
424 if (logon_script == NULL) {
425 Py_RETURN_NONE;
426 }
427
428 py_logon_script = PyUnicode_FromString(logon_script);
429 talloc_free(frame);
430 return py_logon_script;
431 }
432
py_samu_set_logon_script(PyObject * obj,PyObject * value,void * closure)433 static int py_samu_set_logon_script(PyObject *obj, PyObject *value, void *closure)
434 {
435 TALLOC_CTX *frame = talloc_stackframe();
436 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
437
438 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
439 if (!pdb_set_logon_script(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
440 talloc_free(frame);
441 return -1;
442 }
443 talloc_free(frame);
444 return 0;
445 }
446
py_samu_get_profile_path(PyObject * obj,void * closure)447 static PyObject *py_samu_get_profile_path(PyObject *obj, void *closure)
448 {
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;
453
454 profile_path = pdb_get_profile_path(sam_acct);
455 if (profile_path == NULL) {
456 Py_RETURN_NONE;
457 }
458
459 py_profile_path = PyUnicode_FromString(profile_path);
460 talloc_free(frame);
461 return py_profile_path;
462 }
463
py_samu_set_profile_path(PyObject * obj,PyObject * value,void * closure)464 static int py_samu_set_profile_path(PyObject *obj, PyObject *value, void *closure)
465 {
466 TALLOC_CTX *frame = talloc_stackframe();
467 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
468
469 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
470 if (!pdb_set_profile_path(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
471 talloc_free(frame);
472 return -1;
473 }
474 talloc_free(frame);
475 return 0;
476 }
477
py_samu_get_acct_desc(PyObject * obj,void * closure)478 static PyObject *py_samu_get_acct_desc(PyObject *obj, void *closure)
479 {
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;
484
485 acct_desc = pdb_get_acct_desc(sam_acct);
486 if (acct_desc == NULL) {
487 Py_RETURN_NONE;
488 }
489
490 py_acct_desc = PyUnicode_FromString(acct_desc);
491 talloc_free(frame);
492 return py_acct_desc;
493 }
494
py_samu_set_acct_desc(PyObject * obj,PyObject * value,void * closure)495 static int py_samu_set_acct_desc(PyObject *obj, PyObject *value, void *closure)
496 {
497 TALLOC_CTX *frame = talloc_stackframe();
498 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
499
500 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
501 if (!pdb_set_acct_desc(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
502 talloc_free(frame);
503 return -1;
504 }
505 talloc_free(frame);
506 return 0;
507 }
508
py_samu_get_workstations(PyObject * obj,void * closure)509 static PyObject *py_samu_get_workstations(PyObject *obj, void *closure)
510 {
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;
515
516 workstations = pdb_get_workstations(sam_acct);
517 if (workstations == NULL) {
518 Py_RETURN_NONE;
519 }
520
521 py_workstations = PyUnicode_FromString(workstations);
522 talloc_free(frame);
523 return py_workstations;
524 }
525
py_samu_set_workstations(PyObject * obj,PyObject * value,void * closure)526 static int py_samu_set_workstations(PyObject *obj, PyObject *value, void *closure)
527 {
528 TALLOC_CTX *frame = talloc_stackframe();
529 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
530
531 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
532 if (!pdb_set_workstations(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
533 talloc_free(frame);
534 return -1;
535 }
536 talloc_free(frame);
537 return 0;
538 }
539
py_samu_get_comment(PyObject * obj,void * closure)540 static PyObject *py_samu_get_comment(PyObject *obj, void *closure)
541 {
542 TALLOC_CTX *frame = talloc_stackframe();
543 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
544 PyObject *py_comment;
545 const char *comment;
546
547 comment = pdb_get_comment(sam_acct);
548 if (comment == NULL) {
549 Py_RETURN_NONE;
550 }
551
552 py_comment = PyUnicode_FromString(comment);
553 talloc_free(frame);
554 return py_comment;
555 }
556
py_samu_set_comment(PyObject * obj,PyObject * value,void * closure)557 static int py_samu_set_comment(PyObject *obj, PyObject *value, void *closure)
558 {
559 TALLOC_CTX *frame = talloc_stackframe();
560 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
561
562 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
563 if (!pdb_set_comment(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
564 talloc_free(frame);
565 return -1;
566 }
567 talloc_free(frame);
568 return 0;
569 }
570
py_samu_get_munged_dial(PyObject * obj,void * closure)571 static PyObject *py_samu_get_munged_dial(PyObject *obj, void *closure)
572 {
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;
577
578 munged_dial = pdb_get_munged_dial(sam_acct);
579 if (munged_dial == NULL) {
580 Py_RETURN_NONE;
581 }
582
583 py_munged_dial = PyUnicode_FromString(munged_dial);
584 talloc_free(frame);
585 return py_munged_dial;
586 }
587
py_samu_set_munged_dial(PyObject * obj,PyObject * value,void * closure)588 static int py_samu_set_munged_dial(PyObject *obj, PyObject *value, void *closure)
589 {
590 TALLOC_CTX *frame = talloc_stackframe();
591 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
592
593 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
594 if (!pdb_set_munged_dial(sam_acct, PyUnicode_AsUTF8(value), PDB_CHANGED)) {
595 talloc_free(frame);
596 return -1;
597 }
598 talloc_free(frame);
599 return 0;
600 }
601
py_samu_get_user_sid(PyObject * obj,void * closure)602 static PyObject *py_samu_get_user_sid(PyObject *obj, void *closure)
603 {
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;
609 TALLOC_CTX *mem_ctx;
610
611 user_sid = pdb_get_user_sid(sam_acct);
612 if(user_sid == NULL) {
613 Py_RETURN_NONE;
614 }
615
616 mem_ctx = talloc_new(NULL);
617 if (mem_ctx == NULL) {
618 PyErr_NoMemory();
619 talloc_free(frame);
620 return NULL;
621 }
622 copy_user_sid = dom_sid_dup(mem_ctx, user_sid);
623 if (copy_user_sid == NULL) {
624 PyErr_NoMemory();
625 talloc_free(mem_ctx);
626 talloc_free(frame);
627 return NULL;
628 }
629
630 py_user_sid = pytalloc_steal(dom_sid_Type, copy_user_sid);
631
632 talloc_free(mem_ctx);
633
634 talloc_free(frame);
635 return py_user_sid;
636 }
637
py_samu_set_user_sid(PyObject * obj,PyObject * value,void * closure)638 static int py_samu_set_user_sid(PyObject *obj, PyObject *value, void *closure)
639 {
640 TALLOC_CTX *frame = talloc_stackframe();
641 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
642
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)) {
645 talloc_free(frame);
646 return -1;
647 }
648 talloc_free(frame);
649 return 0;
650 }
651
py_samu_get_group_sid(PyObject * obj,void * closure)652 static PyObject *py_samu_get_group_sid(PyObject *obj, void *closure)
653 {
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;
658
659 group_sid = pdb_get_group_sid(sam_acct);
660 if (group_sid == NULL) {
661 Py_RETURN_NONE;
662 }
663
664 copy_group_sid = dom_sid_dup(NULL, group_sid);
665 if (copy_group_sid == NULL) {
666 PyErr_NoMemory();
667 talloc_free(frame);
668 return NULL;
669 }
670
671 talloc_free(frame);
672 return pytalloc_steal(dom_sid_Type, copy_group_sid);
673 }
674
py_samu_set_group_sid(PyObject * obj,PyObject * value,void * closure)675 static int py_samu_set_group_sid(PyObject *obj, PyObject *value, void *closure)
676 {
677 TALLOC_CTX *frame = talloc_stackframe();
678 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
679
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)) {
682 talloc_free(frame);
683 return -1;
684 }
685 talloc_free(frame);
686 return 0;
687 }
688
py_samu_get_lanman_passwd(PyObject * obj,void * closure)689 static PyObject *py_samu_get_lanman_passwd(PyObject *obj, void *closure)
690 {
691 TALLOC_CTX *frame = talloc_stackframe();
692 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
693 PyObject *py_lm_pw;
694 const char *lm_pw;
695
696 lm_pw = (const char *)pdb_get_lanman_passwd(sam_acct);
697 if (lm_pw == NULL) {
698 Py_RETURN_NONE;
699 }
700
701 py_lm_pw = PyBytes_FromStringAndSize(lm_pw, LM_HASH_LEN);
702 talloc_free(frame);
703 return py_lm_pw;
704 }
705
py_samu_set_lanman_passwd(PyObject * obj,PyObject * value,void * closure)706 static int py_samu_set_lanman_passwd(PyObject *obj, PyObject *value, void *closure)
707 {
708 TALLOC_CTX *frame = talloc_stackframe();
709 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
710
711 PY_CHECK_TYPE(&PyBytes_Type, value, return -1;);
712 if (!pdb_set_lanman_passwd(sam_acct, (uint8_t *)PyBytes_AsString(value), PDB_CHANGED)) {
713 talloc_free(frame);
714 return -1;
715 }
716 talloc_free(frame);
717 return 0;
718 }
719
py_samu_get_nt_passwd(PyObject * obj,void * closure)720 static PyObject *py_samu_get_nt_passwd(PyObject *obj, void *closure)
721 {
722 TALLOC_CTX *frame = talloc_stackframe();
723 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
724 PyObject *py_nt_pw;
725 const char *nt_pw;
726
727 nt_pw = (const char *)pdb_get_nt_passwd(sam_acct);
728 if (nt_pw == NULL) {
729 Py_RETURN_NONE;
730 }
731
732 py_nt_pw = PyBytes_FromStringAndSize(nt_pw, NT_HASH_LEN);
733 talloc_free(frame);
734 return py_nt_pw;
735 }
736
py_samu_set_nt_passwd(PyObject * obj,PyObject * value,void * closure)737 static int py_samu_set_nt_passwd(PyObject *obj, PyObject *value, void *closure)
738 {
739 TALLOC_CTX *frame = talloc_stackframe();
740 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
741
742 if (!pdb_set_nt_passwd(sam_acct, (uint8_t *)PyBytes_AsString(value), PDB_CHANGED)) {
743 talloc_free(frame);
744 return -1;
745 }
746 talloc_free(frame);
747 return 0;
748 }
749
py_samu_get_pw_history(PyObject * obj,void * closure)750 static PyObject *py_samu_get_pw_history(PyObject *obj, void *closure)
751 {
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;
756 uint32_t hist_len;
757
758 nt_pw_his = (const char *)pdb_get_pw_history(sam_acct, &hist_len);
759 if (nt_pw_his == NULL) {
760 Py_RETURN_NONE;
761 }
762
763 py_nt_pw_his = PyBytes_FromStringAndSize(nt_pw_his, hist_len*PW_HISTORY_ENTRY_LEN);
764 talloc_free(frame);
765 return py_nt_pw_his;
766 }
767
py_samu_set_pw_history(PyObject * obj,PyObject * value,void * closure)768 static int py_samu_set_pw_history(PyObject *obj, PyObject *value, void *closure)
769 {
770 TALLOC_CTX *frame = talloc_stackframe();
771 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
772 char *nt_pw_his;
773 Py_ssize_t len;
774 uint32_t hist_len;
775
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)) {
779 talloc_free(frame);
780 return -1;
781 }
782 talloc_free(frame);
783 return 0;
784 }
785
py_samu_get_plaintext_passwd(PyObject * obj,void * closure)786 static PyObject *py_samu_get_plaintext_passwd(PyObject *obj, void *closure)
787 {
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;
792
793 plaintext_pw = pdb_get_plaintext_passwd(sam_acct);
794 if (plaintext_pw == NULL) {
795 Py_RETURN_NONE;
796 }
797
798 py_plaintext_pw = PyUnicode_FromString(plaintext_pw);
799 talloc_free(frame);
800 return py_plaintext_pw;
801 }
802
py_samu_set_plaintext_passwd(PyObject * obj,PyObject * value,void * closure)803 static int py_samu_set_plaintext_passwd(PyObject *obj, PyObject *value, void *closure)
804 {
805 TALLOC_CTX *frame = talloc_stackframe();
806 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
807
808 if (!pdb_set_plaintext_passwd(sam_acct, PyUnicode_AsUTF8(value))) {
809 talloc_free(frame);
810 return -1;
811 }
812 talloc_free(frame);
813 return 0;
814 }
815
py_samu_get_acct_ctrl(PyObject * obj,void * closure)816 static PyObject *py_samu_get_acct_ctrl(PyObject *obj, void *closure)
817 {
818 TALLOC_CTX *frame = talloc_stackframe();
819 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
820 PyObject *py_acct_ctrl;
821
822 py_acct_ctrl = PyInt_FromLong(pdb_get_acct_ctrl(sam_acct));
823 talloc_free(frame);
824 return py_acct_ctrl;
825 }
826
py_samu_set_acct_ctrl(PyObject * obj,PyObject * value,void * closure)827 static int py_samu_set_acct_ctrl(PyObject *obj, PyObject *value, void *closure)
828 {
829 TALLOC_CTX *frame = talloc_stackframe();
830 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
831
832 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
833 if (!pdb_set_acct_ctrl(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
834 talloc_free(frame);
835 return -1;
836 }
837 talloc_free(frame);
838 return 0;
839 }
840
py_samu_get_logon_divs(PyObject * obj,void * closure)841 static PyObject *py_samu_get_logon_divs(PyObject *obj, void *closure)
842 {
843 TALLOC_CTX *frame = talloc_stackframe();
844 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
845 PyObject *py_logon_divs;
846
847 py_logon_divs = PyInt_FromLong(pdb_get_logon_divs(sam_acct));
848 talloc_free(frame);
849 return py_logon_divs;
850 }
851
py_samu_set_logon_divs(PyObject * obj,PyObject * value,void * closure)852 static int py_samu_set_logon_divs(PyObject *obj, PyObject *value, void *closure)
853 {
854 TALLOC_CTX *frame = talloc_stackframe();
855 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
856
857 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
858 if (!pdb_set_logon_divs(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
859 talloc_free(frame);
860 return -1;
861 }
862 talloc_free(frame);
863 return 0;
864 }
865
py_samu_get_hours_len(PyObject * obj,void * closure)866 static PyObject *py_samu_get_hours_len(PyObject *obj, void *closure)
867 {
868 TALLOC_CTX *frame = talloc_stackframe();
869 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
870 PyObject *py_hours_len;
871
872 py_hours_len = PyInt_FromLong(pdb_get_hours_len(sam_acct));
873 talloc_free(frame);
874 return py_hours_len;
875 }
876
py_samu_set_hours_len(PyObject * obj,PyObject * value,void * closure)877 static int py_samu_set_hours_len(PyObject *obj, PyObject *value, void *closure)
878 {
879 TALLOC_CTX *frame = talloc_stackframe();
880 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
881
882 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
883 if (!pdb_set_hours_len(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
884 talloc_free(frame);
885 return -1;
886 }
887 talloc_free(frame);
888 return 0;
889 }
890
py_samu_get_hours(PyObject * obj,void * closure)891 static PyObject *py_samu_get_hours(PyObject *obj, void *closure)
892 {
893 TALLOC_CTX *frame = talloc_stackframe();
894 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
895 PyObject *py_hours;
896 const char *hours;
897 int hours_len, i;
898
899 hours = (const char *)pdb_get_hours(sam_acct);
900 if(! hours) {
901 Py_RETURN_NONE;
902 }
903
904 hours_len = pdb_get_hours_len(sam_acct);
905 if ((py_hours = PyList_New(hours_len)) == NULL) {
906 PyErr_NoMemory();
907 talloc_free(frame);
908 return NULL;
909 }
910
911 for (i=0; i<hours_len; i++) {
912 PyList_SetItem(py_hours, i, PyInt_FromLong(hours[i]));
913 }
914 talloc_free(frame);
915 return py_hours;
916 }
917
py_samu_set_hours(PyObject * obj,PyObject * value,void * closure)918 static int py_samu_set_hours(PyObject *obj, PyObject *value, void *closure)
919 {
920 TALLOC_CTX *frame = talloc_stackframe();
921 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
922 int i;
923 uint8_t *hours;
924 int hours_len;
925 bool status;
926
927 PY_CHECK_TYPE(&PyList_Type, value, return -1;);
928
929 hours_len = PyList_GET_SIZE(value);
930
931 hours = talloc_array(pytalloc_get_mem_ctx(obj), uint8_t, hours_len);
932 if (!hours) {
933 PyErr_NoMemory();
934 talloc_free(frame);
935 return -1;
936 }
937
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));
941 }
942
943 status = pdb_set_hours(sam_acct, hours, hours_len, PDB_CHANGED);
944 talloc_free(hours);
945
946 if(! status) {
947 talloc_free(frame);
948 return -1;
949 }
950 talloc_free(frame);
951 return 0;
952 }
953
py_samu_get_bad_password_count(PyObject * obj,void * closure)954 static PyObject *py_samu_get_bad_password_count(PyObject *obj, void *closure)
955 {
956 TALLOC_CTX *frame = talloc_stackframe();
957 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
958 PyObject *py_bad_password_count;
959
960 py_bad_password_count = PyInt_FromLong(pdb_get_bad_password_count(sam_acct));
961 talloc_free(frame);
962 return py_bad_password_count;
963 }
964
py_samu_set_bad_password_count(PyObject * obj,PyObject * value,void * closure)965 static int py_samu_set_bad_password_count(PyObject *obj, PyObject *value, void *closure)
966 {
967 TALLOC_CTX *frame = talloc_stackframe();
968 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
969
970 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
971 if (!pdb_set_bad_password_count(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
972 talloc_free(frame);
973 return -1;
974 }
975 talloc_free(frame);
976 return 0;
977 }
978
py_samu_get_logon_count(PyObject * obj,void * closure)979 static PyObject *py_samu_get_logon_count(PyObject *obj, void *closure)
980 {
981 TALLOC_CTX *frame = talloc_stackframe();
982 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
983 PyObject *py_logon_count;
984
985 py_logon_count = PyInt_FromLong(pdb_get_logon_count(sam_acct));
986 talloc_free(frame);
987 return py_logon_count;
988 }
989
py_samu_set_logon_count(PyObject * obj,PyObject * value,void * closure)990 static int py_samu_set_logon_count(PyObject *obj, PyObject *value, void *closure)
991 {
992 TALLOC_CTX *frame = talloc_stackframe();
993 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
994
995 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
996 if (!pdb_set_logon_count(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
997 talloc_free(frame);
998 return -1;
999 }
1000 talloc_free(frame);
1001 return 0;
1002 }
1003
py_samu_get_country_code(PyObject * obj,void * closure)1004 static PyObject *py_samu_get_country_code(PyObject *obj, void *closure)
1005 {
1006 TALLOC_CTX *frame = talloc_stackframe();
1007 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1008 PyObject *py_country_code;
1009
1010 py_country_code = PyInt_FromLong(pdb_get_country_code(sam_acct));
1011 talloc_free(frame);
1012 return py_country_code;
1013 }
1014
py_samu_set_country_code(PyObject * obj,PyObject * value,void * closure)1015 static int py_samu_set_country_code(PyObject *obj, PyObject *value, void *closure)
1016 {
1017 TALLOC_CTX *frame = talloc_stackframe();
1018 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1019
1020 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1021 if (!pdb_set_country_code(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
1022 talloc_free(frame);
1023 return -1;
1024 }
1025 talloc_free(frame);
1026 return 0;
1027 }
1028
py_samu_get_code_page(PyObject * obj,void * closure)1029 static PyObject *py_samu_get_code_page(PyObject *obj, void *closure)
1030 {
1031 TALLOC_CTX *frame = talloc_stackframe();
1032 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1033 PyObject *py_code_page;
1034
1035 py_code_page = PyInt_FromLong(pdb_get_code_page(sam_acct));
1036 talloc_free(frame);
1037 return py_code_page;
1038 }
1039
py_samu_set_code_page(PyObject * obj,PyObject * value,void * closure)1040 static int py_samu_set_code_page(PyObject *obj, PyObject *value, void *closure)
1041 {
1042 TALLOC_CTX *frame = talloc_stackframe();
1043 struct samu *sam_acct = (struct samu *)pytalloc_get_ptr(obj);
1044
1045 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1046 if (!pdb_set_code_page(sam_acct, PyInt_AsLong(value), PDB_CHANGED)) {
1047 talloc_free(frame);
1048 return -1;
1049 }
1050 talloc_free(frame);
1051 return 0;
1052 }
1053
1054 static PyGetSetDef py_samu_getsetters[] = {
1055 {
1056 .name = discard_const_p(char, "logon_time"),
1057 .get = py_samu_get_logon_time,
1058 .set = py_samu_set_logon_time,
1059 },
1060 {
1061 .name = discard_const_p(char, "logoff_time"),
1062 .get = py_samu_get_logoff_time,
1063 .set = py_samu_set_logoff_time,
1064 },
1065 {
1066 .name = discard_const_p(char, "kickoff_time"),
1067 .get = py_samu_get_kickoff_time,
1068 .set = py_samu_set_kickoff_time,
1069 },
1070 {
1071 .name = discard_const_p(char, "bad_password_time"),
1072 .get = py_samu_get_bad_password_time,
1073 .set = py_samu_set_bad_password_time,
1074 },
1075 {
1076 .name = discard_const_p(char, "pass_last_set_time"),
1077 .get = py_samu_get_pass_last_set_time,
1078 .set = py_samu_set_pass_last_set_time,
1079 },
1080 {
1081 .name = discard_const_p(char, "pass_can_change_time"),
1082 .get = py_samu_get_pass_can_change_time,
1083 .set = py_samu_set_pass_can_change_time,
1084 },
1085 {
1086 .name = discard_const_p(char, "pass_must_change_time"),
1087 .get = py_samu_get_pass_must_change_time,
1088 .set = py_samu_set_pass_must_change_time,
1089 },
1090 {
1091 .name = discard_const_p(char, "username"),
1092 .get = py_samu_get_username,
1093 .set = py_samu_set_username,
1094 },
1095 {
1096 .name = discard_const_p(char, "domain"),
1097 .get = py_samu_get_domain,
1098 .set = py_samu_set_domain,
1099 },
1100 {
1101 .name = discard_const_p(char, "nt_username"),
1102 .get = py_samu_get_nt_username,
1103 .set = py_samu_set_nt_username,
1104 },
1105 {
1106 .name = discard_const_p(char, "full_name"),
1107 .get = py_samu_get_full_name,
1108 .set = py_samu_set_full_name,
1109 },
1110 {
1111 .name = discard_const_p(char, "home_dir"),
1112 .get = py_samu_get_home_dir,
1113 .set = py_samu_set_home_dir,
1114 },
1115 {
1116 .name = discard_const_p(char, "dir_drive"),
1117 .get = py_samu_get_dir_drive,
1118 .set = py_samu_set_dir_drive,
1119 },
1120 {
1121 .name = discard_const_p(char, "logon_script"),
1122 .get = py_samu_get_logon_script,
1123 .set = py_samu_set_logon_script,
1124 },
1125 {
1126 .name = discard_const_p(char, "profile_path"),
1127 .get = py_samu_get_profile_path,
1128 .set = py_samu_set_profile_path,
1129 },
1130 {
1131 .name = discard_const_p(char, "acct_desc"),
1132 .get = py_samu_get_acct_desc,
1133 .set = py_samu_set_acct_desc,
1134 },
1135 {
1136 .name = discard_const_p(char, "workstations"),
1137 .get = py_samu_get_workstations,
1138 .set = py_samu_set_workstations,
1139 },
1140 {
1141 .name = discard_const_p(char, "comment"),
1142 .get = py_samu_get_comment,
1143 .set = py_samu_set_comment,
1144 },
1145 {
1146 .name = discard_const_p(char, "munged_dial"),
1147 .get = py_samu_get_munged_dial,
1148 .set = py_samu_set_munged_dial,
1149 },
1150 {
1151 .name = discard_const_p(char, "user_sid"),
1152 .get = py_samu_get_user_sid,
1153 .set = py_samu_set_user_sid,
1154 },
1155 {
1156 .name = discard_const_p(char, "group_sid"),
1157 .get = py_samu_get_group_sid,
1158 .set = py_samu_set_group_sid,
1159 },
1160 {
1161 .name = discard_const_p(char, "lanman_passwd"),
1162 .get = py_samu_get_lanman_passwd,
1163 .set = py_samu_set_lanman_passwd,
1164 },
1165 {
1166 .name = discard_const_p(char, "nt_passwd"),
1167 .get = py_samu_get_nt_passwd,
1168 .set = py_samu_set_nt_passwd,
1169 },
1170 {
1171 .name = discard_const_p(char, "pw_history"),
1172 .get = py_samu_get_pw_history,
1173 .set = py_samu_set_pw_history,
1174 },
1175 {
1176 .name = discard_const_p(char, "plaintext_passwd"),
1177 .get = py_samu_get_plaintext_passwd,
1178 .set = py_samu_set_plaintext_passwd,
1179 },
1180 {
1181 .name = discard_const_p(char, "acct_ctrl"),
1182 .get = py_samu_get_acct_ctrl,
1183 .set = py_samu_set_acct_ctrl,
1184 },
1185 {
1186 .name = discard_const_p(char, "logon_divs"),
1187 .get = py_samu_get_logon_divs,
1188 .set = py_samu_set_logon_divs,
1189 },
1190 {
1191 .name = discard_const_p(char, "hours_len"),
1192 .get = py_samu_get_hours_len,
1193 .set = py_samu_set_hours_len,
1194 },
1195 {
1196 .name = discard_const_p(char, "hours"),
1197 .get = py_samu_get_hours,
1198 .set = py_samu_set_hours,
1199 },
1200 {
1201 .name = discard_const_p(char, "bad_password_count"),
1202 .get = py_samu_get_bad_password_count,
1203 .set = py_samu_set_bad_password_count,
1204 },
1205 {
1206 .name = discard_const_p(char, "logon_count"),
1207 .get = py_samu_get_logon_count,
1208 .set = py_samu_set_logon_count,
1209 },
1210 {
1211 .name = discard_const_p(char, "country_code"),
1212 .get = py_samu_get_country_code,
1213 .set = py_samu_set_country_code,
1214 },
1215 {
1216 .name = discard_const_p(char, "code_page"),
1217 .get = py_samu_get_code_page,
1218 .set = py_samu_set_code_page,
1219 },
1220 {
1221 .name = NULL,
1222 }
1223 };
1224
1225
1226 /************************** PIDL Autogeneratd ******************************/
1227
py_samu_new(PyTypeObject * type,PyObject * args,PyObject * kwargs)1228 static PyObject *py_samu_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1229 {
1230 TALLOC_CTX *frame = talloc_stackframe();
1231 struct samu *sam_acct;
1232
1233 sam_acct = samu_new(NULL);
1234 if (!sam_acct) {
1235 PyErr_NoMemory();
1236 talloc_free(frame);
1237 return NULL;
1238 }
1239
1240 talloc_free(frame);
1241 return pytalloc_steal(type, sam_acct);
1242 }
1243
1244 static PyTypeObject PySamu = {
1245 .tp_name = "passdb.Samu",
1246 .tp_getset = py_samu_getsetters,
1247 .tp_methods = NULL,
1248 .tp_new = py_samu_new,
1249 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
1250 .tp_doc = "Samu() -> samu object\n",
1251 };
1252
1253
py_groupmap_get_gid(PyObject * obj,void * closure)1254 static PyObject *py_groupmap_get_gid(PyObject *obj, void *closure)
1255 {
1256 TALLOC_CTX *frame = talloc_stackframe();
1257 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1258 PyObject *py_gid;
1259
1260 py_gid = Py_BuildValue("i", group_map->gid);
1261 talloc_free(frame);
1262 return py_gid;
1263 }
1264
py_groupmap_set_gid(PyObject * obj,PyObject * value,void * closure)1265 static int py_groupmap_set_gid(PyObject *obj, PyObject *value, void *closure)
1266 {
1267 TALLOC_CTX *frame = talloc_stackframe();
1268 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1269
1270 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1271 group_map->gid = PyInt_AsLong(value);
1272 talloc_free(frame);
1273 return 0;
1274 }
1275
py_groupmap_get_sid(PyObject * obj,void * closure)1276 static PyObject *py_groupmap_get_sid(PyObject *obj, void *closure)
1277 {
1278 TALLOC_CTX *frame = talloc_stackframe();
1279 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1280 PyObject *py_sid;
1281 struct dom_sid *group_sid;
1282 TALLOC_CTX *mem_ctx;
1283
1284 mem_ctx = talloc_new(NULL);
1285 if (mem_ctx == NULL) {
1286 PyErr_NoMemory();
1287 talloc_free(frame);
1288 return NULL;
1289 }
1290
1291 group_sid = dom_sid_dup(mem_ctx, &group_map->sid);
1292 if (group_sid == NULL) {
1293 PyErr_NoMemory();
1294 talloc_free(mem_ctx);
1295 talloc_free(frame);
1296 return NULL;
1297 }
1298
1299 py_sid = pytalloc_steal(dom_sid_Type, group_sid);
1300
1301 talloc_free(mem_ctx);
1302
1303 talloc_free(frame);
1304 return py_sid;
1305 }
1306
py_groupmap_set_sid(PyObject * obj,PyObject * value,void * closure)1307 static int py_groupmap_set_sid(PyObject *obj, PyObject *value, void *closure)
1308 {
1309 TALLOC_CTX *frame = talloc_stackframe();
1310 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1311
1312 PY_CHECK_TYPE(dom_sid_Type, value, return -1;);
1313 group_map->sid = *pytalloc_get_type(value, struct dom_sid);
1314 talloc_free(frame);
1315 return 0;
1316 }
1317
py_groupmap_get_sid_name_use(PyObject * obj,void * closure)1318 static PyObject *py_groupmap_get_sid_name_use(PyObject *obj, void *closure)
1319 {
1320 TALLOC_CTX *frame = talloc_stackframe();
1321 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1322 PyObject *py_sid_name_use;
1323
1324 py_sid_name_use = PyInt_FromLong(group_map->sid_name_use);
1325 talloc_free(frame);
1326 return py_sid_name_use;
1327 }
1328
py_groupmap_set_sid_name_use(PyObject * obj,PyObject * value,void * closure)1329 static int py_groupmap_set_sid_name_use(PyObject *obj, PyObject *value, void *closure)
1330 {
1331 TALLOC_CTX *frame = talloc_stackframe();
1332 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1333
1334 PY_CHECK_TYPE(&PyInt_Type, value, return -1;);
1335 group_map->sid_name_use = PyInt_AsLong(value);
1336 talloc_free(frame);
1337 return 0;
1338 }
1339
py_groupmap_get_nt_name(PyObject * obj,void * closure)1340 static PyObject *py_groupmap_get_nt_name(PyObject *obj, void *closure)
1341 {
1342 TALLOC_CTX *frame = talloc_stackframe();
1343 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1344 PyObject *py_nt_name;
1345 if (group_map->nt_name == NULL) {
1346 py_nt_name = Py_None;
1347 Py_INCREF(py_nt_name);
1348 } else {
1349 py_nt_name = PyUnicode_FromString(group_map->nt_name);
1350 }
1351 talloc_free(frame);
1352 return py_nt_name;
1353 }
1354
py_groupmap_set_nt_name(PyObject * obj,PyObject * value,void * closure)1355 static int py_groupmap_set_nt_name(PyObject *obj, PyObject *value, void *closure)
1356 {
1357 TALLOC_CTX *frame = talloc_stackframe();
1358 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1359
1360 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
1361 if (value == Py_None) {
1362 fstrcpy(group_map->nt_name, NULL);
1363 } else {
1364 fstrcpy(group_map->nt_name, PyUnicode_AsUTF8(value));
1365 }
1366 talloc_free(frame);
1367 return 0;
1368 }
1369
py_groupmap_get_comment(PyObject * obj,void * closure)1370 static PyObject *py_groupmap_get_comment(PyObject *obj, void *closure)
1371 {
1372 TALLOC_CTX *frame = talloc_stackframe();
1373 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1374 PyObject *py_comment;
1375 if (group_map->comment == NULL) {
1376 py_comment = Py_None;
1377 Py_INCREF(py_comment);
1378 } else {
1379 py_comment = PyUnicode_FromString(group_map->comment);
1380 }
1381 talloc_free(frame);
1382 return py_comment;
1383 }
1384
py_groupmap_set_comment(PyObject * obj,PyObject * value,void * closure)1385 static int py_groupmap_set_comment(PyObject *obj, PyObject *value, void *closure)
1386 {
1387 TALLOC_CTX *frame = talloc_stackframe();
1388 GROUP_MAP *group_map = (GROUP_MAP *)pytalloc_get_ptr(obj);
1389
1390 PY_CHECK_TYPE(&PyUnicode_Type, value, return -1;);
1391 if (value == Py_None) {
1392 fstrcpy(group_map->comment, NULL);
1393 } else {
1394 fstrcpy(group_map->comment, PyUnicode_AsUTF8(value));
1395 }
1396 talloc_free(frame);
1397 return 0;
1398 }
1399
1400 static PyGetSetDef py_groupmap_getsetters[] = {
1401 {
1402 .name = discard_const_p(char, "gid"),
1403 .get = py_groupmap_get_gid,
1404 .set = py_groupmap_set_gid,
1405 },
1406 {
1407 .name = discard_const_p(char, "sid"),
1408 .get = py_groupmap_get_sid,
1409 .set = py_groupmap_set_sid,
1410 },
1411 {
1412 .name = discard_const_p(char, "sid_name_use"),
1413 .get = py_groupmap_get_sid_name_use,
1414 .set = py_groupmap_set_sid_name_use,
1415 },
1416 {
1417 .name = discard_const_p(char, "nt_name"),
1418 .get = py_groupmap_get_nt_name,
1419 .set = py_groupmap_set_nt_name,
1420 },
1421 {
1422 .name = discard_const_p(char, "comment"),
1423 .get = py_groupmap_get_comment,
1424 .set = py_groupmap_set_comment,
1425 },
1426 {
1427 .name = NULL,
1428 },
1429 };
1430
py_groupmap_new(PyTypeObject * type,PyObject * args,PyObject * kwargs)1431 static PyObject *py_groupmap_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1432 {
1433 TALLOC_CTX *frame = talloc_stackframe();
1434 GROUP_MAP *group_map;
1435 TALLOC_CTX *mem_ctx;
1436 PyObject *py_group_map;
1437
1438 mem_ctx = talloc_new(NULL);
1439 if (mem_ctx == NULL) {
1440 PyErr_NoMemory();
1441 talloc_free(frame);
1442 return NULL;
1443 }
1444
1445 group_map = talloc_zero(mem_ctx, GROUP_MAP);
1446 if (group_map == NULL) {
1447 PyErr_NoMemory();
1448 talloc_free(mem_ctx);
1449 talloc_free(frame);
1450 return NULL;
1451 }
1452
1453 py_group_map = pytalloc_steal(type, group_map);
1454 if (py_group_map == NULL) {
1455 PyErr_NoMemory();
1456 talloc_free(mem_ctx);
1457 talloc_free(frame);
1458 return NULL;
1459 }
1460
1461 talloc_free(mem_ctx);
1462
1463 talloc_free(frame);
1464 return py_group_map;
1465 }
1466
1467
1468 static PyTypeObject PyGroupmap = {
1469 .tp_name = "passdb.Groupmap",
1470 .tp_getset = py_groupmap_getsetters,
1471 .tp_methods = NULL,
1472 .tp_new = py_groupmap_new,
1473 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
1474 .tp_doc = "Groupmap() -> group map object\n",
1475 };
1476
1477
py_pdb_domain_info(PyObject * self,PyObject * args)1478 static PyObject *py_pdb_domain_info(PyObject *self, PyObject *args)
1479 {
1480 TALLOC_CTX *frame = talloc_stackframe();
1481 struct pdb_methods *methods;
1482 struct pdb_domain_info *domain_info;
1483 PyObject *py_domain_info;
1484 struct dom_sid *sid;
1485 struct GUID *guid;
1486 PyObject *py_dom_sid = NULL;
1487 PyObject *py_guid = NULL;
1488
1489 methods = pytalloc_get_ptr(self);
1490
1491 domain_info = methods->get_domain_info(methods, frame);
1492 if (! domain_info) {
1493 Py_RETURN_NONE;
1494 }
1495
1496 sid = dom_sid_dup(frame, &domain_info->sid);
1497 if (sid == NULL) {
1498 PyErr_NoMemory();
1499 talloc_free(frame);
1500 return NULL;
1501 }
1502
1503 guid = talloc(frame, struct GUID);
1504 if (guid == NULL) {
1505 PyErr_NoMemory();
1506 talloc_free(frame);
1507 return NULL;
1508 }
1509 *guid = domain_info->guid;
1510
1511 py_dom_sid = pytalloc_steal(dom_sid_Type, sid);
1512 py_guid = pytalloc_steal(guid_Type, guid);
1513
1514 py_domain_info = Py_BuildValue(
1515 "{s:s, s:s, s:s, s:O, s:O}",
1516 "name", domain_info->name,
1517 "dns_domain", domain_info->dns_domain,
1518 "dns_forest", domain_info->dns_forest,
1519 "dom_sid", py_dom_sid,
1520 "guid", py_guid);
1521
1522
1523 Py_CLEAR(py_dom_sid);
1524 Py_CLEAR(py_guid);
1525 talloc_free(frame);
1526 return py_domain_info;
1527 }
1528
1529
py_pdb_getsampwnam(PyObject * self,PyObject * args)1530 static PyObject *py_pdb_getsampwnam(PyObject *self, PyObject *args)
1531 {
1532 TALLOC_CTX *frame = talloc_stackframe();
1533 NTSTATUS status;
1534 const char *username;
1535 struct pdb_methods *methods;
1536 struct samu *sam_acct;
1537 PyObject *py_sam_acct;
1538
1539 if (!PyArg_ParseTuple(args, "s:getsampwnam", &username)) {
1540 talloc_free(frame);
1541 return NULL;
1542 }
1543
1544 methods = pytalloc_get_ptr(self);
1545
1546 py_sam_acct = py_samu_new(&PySamu, NULL, NULL);
1547 if (py_sam_acct == NULL) {
1548 PyErr_NoMemory();
1549 talloc_free(frame);
1550 return NULL;
1551 }
1552 sam_acct = (struct samu *)pytalloc_get_ptr(py_sam_acct);
1553
1554 status = methods->getsampwnam(methods, sam_acct, username);
1555 if (!NT_STATUS_IS_OK(status)) {
1556 PyErr_Format(py_pdb_error, "Unable to get user information for '%s', (%d,%s)",
1557 username,
1558 NT_STATUS_V(status),
1559 get_friendly_nt_error_msg(status));
1560 Py_DECREF(py_sam_acct);
1561 talloc_free(frame);
1562 return NULL;
1563 }
1564
1565 talloc_free(frame);
1566 return py_sam_acct;
1567 }
1568
py_pdb_getsampwsid(PyObject * self,PyObject * args)1569 static PyObject *py_pdb_getsampwsid(PyObject *self, PyObject *args)
1570 {
1571 TALLOC_CTX *frame = talloc_stackframe();
1572 NTSTATUS status;
1573 struct pdb_methods *methods;
1574 struct samu *sam_acct;
1575 PyObject *py_sam_acct;
1576 PyObject *py_user_sid;
1577
1578 if (!PyArg_ParseTuple(args, "O:getsampwsid", &py_user_sid)) {
1579 talloc_free(frame);
1580 return NULL;
1581 }
1582
1583 methods = pytalloc_get_ptr(self);
1584
1585 py_sam_acct = py_samu_new(&PySamu, NULL, NULL);
1586 if (py_sam_acct == NULL) {
1587 PyErr_NoMemory();
1588 talloc_free(frame);
1589 return NULL;
1590 }
1591 sam_acct = (struct samu *)pytalloc_get_ptr(py_sam_acct);
1592
1593 status = methods->getsampwsid(methods, sam_acct, pytalloc_get_ptr(py_user_sid));
1594 if (!NT_STATUS_IS_OK(status)) {
1595 PyErr_Format(py_pdb_error, "Unable to get user information from SID, (%d,%s)",
1596 NT_STATUS_V(status),
1597 get_friendly_nt_error_msg(status));
1598 Py_DECREF(py_sam_acct);
1599 talloc_free(frame);
1600 return NULL;
1601 }
1602
1603 talloc_free(frame);
1604 return py_sam_acct;
1605 }
1606
py_pdb_create_user(PyObject * self,PyObject * args)1607 static PyObject *py_pdb_create_user(PyObject *self, PyObject *args)
1608 {
1609 TALLOC_CTX *frame = talloc_stackframe();
1610 NTSTATUS status;
1611 struct pdb_methods *methods;
1612 const char *username;
1613 unsigned int acct_flags;
1614 unsigned int rid;
1615
1616 if (!PyArg_ParseTuple(args, "sI:create_user", &username, &acct_flags)) {
1617 talloc_free(frame);
1618 return NULL;
1619 }
1620
1621 methods = pytalloc_get_ptr(self);
1622
1623 status = methods->create_user(methods, frame, username, acct_flags, &rid);
1624 if (!NT_STATUS_IS_OK(status)) {
1625 PyErr_Format(py_pdb_error, "Unable to create user (%s), (%d,%s)",
1626 username,
1627 NT_STATUS_V(status),
1628 get_friendly_nt_error_msg(status));
1629 talloc_free(frame);
1630 return NULL;
1631 }
1632
1633 talloc_free(frame);
1634 return PyInt_FromLong(rid);
1635 }
1636
py_pdb_delete_user(PyObject * self,PyObject * args)1637 static PyObject *py_pdb_delete_user(PyObject *self, PyObject *args)
1638 {
1639 TALLOC_CTX *frame = talloc_stackframe();
1640 NTSTATUS status;
1641 struct pdb_methods *methods;
1642 struct samu *sam_acct;
1643 PyObject *py_sam_acct;
1644
1645 if (!PyArg_ParseTuple(args, "O!:delete_user", &PySamu, &py_sam_acct)) {
1646 talloc_free(frame);
1647 return NULL;
1648 }
1649
1650 methods = pytalloc_get_ptr(self);
1651
1652 sam_acct = pytalloc_get_ptr(py_sam_acct);
1653
1654 status = methods->delete_user(methods, frame, sam_acct);
1655 if (!NT_STATUS_IS_OK(status)) {
1656 PyErr_Format(py_pdb_error, "Unable to delete user, (%d,%s)",
1657 NT_STATUS_V(status),
1658 get_friendly_nt_error_msg(status));
1659 talloc_free(frame);
1660 return NULL;
1661 }
1662
1663 talloc_free(frame);
1664 Py_RETURN_NONE;
1665 }
1666
py_pdb_add_sam_account(PyObject * self,PyObject * args)1667 static PyObject *py_pdb_add_sam_account(PyObject *self, PyObject *args)
1668 {
1669 TALLOC_CTX *frame = talloc_stackframe();
1670 NTSTATUS status;
1671 struct pdb_methods *methods;
1672 struct samu *sam_acct;
1673 PyObject *py_sam_acct;
1674
1675 if (!PyArg_ParseTuple(args, "O!:add_sam_account", &PySamu, &py_sam_acct)) {
1676 talloc_free(frame);
1677 return NULL;
1678 }
1679
1680 methods = pytalloc_get_ptr(self);
1681
1682 sam_acct = pytalloc_get_ptr(py_sam_acct);
1683
1684 status = methods->add_sam_account(methods, sam_acct);
1685 if (!NT_STATUS_IS_OK(status)) {
1686 PyErr_Format(py_pdb_error, "Unable to add sam account '%s', (%d,%s)",
1687 sam_acct->username,
1688 NT_STATUS_V(status),
1689 get_friendly_nt_error_msg(status));
1690 talloc_free(frame);
1691 return NULL;
1692 }
1693
1694 talloc_free(frame);
1695 Py_RETURN_NONE;
1696 }
1697
py_pdb_update_sam_account(PyObject * self,PyObject * args)1698 static PyObject *py_pdb_update_sam_account(PyObject *self, PyObject *args)
1699 {
1700 TALLOC_CTX *frame = talloc_stackframe();
1701 NTSTATUS status;
1702 struct pdb_methods *methods;
1703 struct samu *sam_acct;
1704 PyObject *py_sam_acct;
1705
1706 if (!PyArg_ParseTuple(args, "O!:update_sam_account", &PySamu, &py_sam_acct)) {
1707 talloc_free(frame);
1708 return NULL;
1709 }
1710
1711 methods = pytalloc_get_ptr(self);
1712
1713 sam_acct = pytalloc_get_ptr(py_sam_acct);
1714
1715 status = methods->update_sam_account(methods, sam_acct);
1716 if (!NT_STATUS_IS_OK(status)) {
1717 PyErr_Format(py_pdb_error, "Unable to update sam account, (%d,%s)",
1718 NT_STATUS_V(status),
1719 get_friendly_nt_error_msg(status));
1720 talloc_free(frame);
1721 return NULL;
1722 }
1723
1724 talloc_free(frame);
1725 Py_RETURN_NONE;
1726 }
1727
py_pdb_delete_sam_account(PyObject * self,PyObject * args)1728 static PyObject *py_pdb_delete_sam_account(PyObject *self, PyObject *args)
1729 {
1730 TALLOC_CTX *frame = talloc_stackframe();
1731 NTSTATUS status;
1732 struct pdb_methods *methods;
1733 struct samu *sam_acct;
1734 PyObject *py_sam_acct;
1735
1736 if (!PyArg_ParseTuple(args, "O!:delete_sam_account", &PySamu, &py_sam_acct)) {
1737 talloc_free(frame);
1738 return NULL;
1739 }
1740
1741 methods = pytalloc_get_ptr(self);
1742
1743 sam_acct = pytalloc_get_ptr(py_sam_acct);
1744
1745 status = methods->delete_sam_account(methods, sam_acct);
1746 if (!NT_STATUS_IS_OK(status)) {
1747 PyErr_Format(py_pdb_error, "Unable to delete sam account, (%d,%s)",
1748 NT_STATUS_V(status),
1749 get_friendly_nt_error_msg(status));
1750 talloc_free(frame);
1751 return NULL;
1752 }
1753
1754 talloc_free(frame);
1755 Py_RETURN_NONE;
1756 }
1757
py_pdb_rename_sam_account(PyObject * self,PyObject * args)1758 static PyObject *py_pdb_rename_sam_account(PyObject *self, PyObject *args)
1759 {
1760 TALLOC_CTX *frame = talloc_stackframe();
1761 NTSTATUS status;
1762 struct pdb_methods *methods;
1763 struct samu *sam_acct;
1764 const char *new_username;
1765 PyObject *py_sam_acct;
1766
1767 if (!PyArg_ParseTuple(args, "O!s:rename_sam_account", &PySamu, &py_sam_acct,
1768 &new_username)) {
1769 talloc_free(frame);
1770 return NULL;
1771 }
1772
1773 methods = pytalloc_get_ptr(self);
1774
1775 sam_acct = pytalloc_get_ptr(py_sam_acct);
1776
1777 status = methods->rename_sam_account(methods, sam_acct, new_username);
1778 if (!NT_STATUS_IS_OK(status)) {
1779 PyErr_Format(py_pdb_error, "Unable to rename sam account, (%d,%s)",
1780 NT_STATUS_V(status),
1781 get_friendly_nt_error_msg(status));
1782 talloc_free(frame);
1783 return NULL;
1784 }
1785
1786 talloc_free(frame);
1787 Py_RETURN_NONE;
1788 }
1789
1790
py_pdb_getgrsid(PyObject * self,PyObject * args)1791 static PyObject *py_pdb_getgrsid(PyObject *self, PyObject *args)
1792 {
1793 TALLOC_CTX *frame = talloc_stackframe();
1794 NTSTATUS status;
1795 struct pdb_methods *methods;
1796 GROUP_MAP *group_map;
1797 struct dom_sid *domain_sid;
1798 PyObject *py_domain_sid, *py_group_map;
1799
1800 if (!PyArg_ParseTuple(args, "O!:getgrsid", dom_sid_Type, &py_domain_sid)) {
1801 talloc_free(frame);
1802 return NULL;
1803 }
1804
1805 methods = pytalloc_get_ptr(self);
1806
1807 domain_sid = pytalloc_get_ptr(py_domain_sid);
1808
1809 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
1810 if (py_group_map == NULL) {
1811 PyErr_NoMemory();
1812 talloc_free(frame);
1813 return NULL;
1814 }
1815
1816 group_map = pytalloc_get_ptr(py_group_map);
1817
1818 status = methods->getgrsid(methods, group_map, *domain_sid);
1819 if (!NT_STATUS_IS_OK(status)) {
1820 PyErr_Format(py_pdb_error, "Unable to get group information by sid, (%d,%s)",
1821 NT_STATUS_V(status),
1822 get_friendly_nt_error_msg(status));
1823 talloc_free(frame);
1824 return NULL;
1825 }
1826
1827 talloc_free(frame);
1828 return py_group_map;
1829 }
1830
1831
py_pdb_getgrgid(PyObject * self,PyObject * args)1832 static PyObject *py_pdb_getgrgid(PyObject *self, PyObject *args)
1833 {
1834 TALLOC_CTX *frame = talloc_stackframe();
1835 NTSTATUS status;
1836 struct pdb_methods *methods;
1837 GROUP_MAP *group_map;
1838 PyObject *py_group_map;
1839 unsigned int gid_value;
1840
1841 if (!PyArg_ParseTuple(args, "I:getgrgid", &gid_value)) {
1842 talloc_free(frame);
1843 return NULL;
1844 }
1845
1846 methods = pytalloc_get_ptr(self);
1847
1848 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
1849 if (py_group_map == NULL) {
1850 PyErr_NoMemory();
1851 talloc_free(frame);
1852 return NULL;
1853 }
1854
1855 group_map = pytalloc_get_ptr(py_group_map);
1856
1857 status = methods->getgrgid(methods, group_map, gid_value);
1858 if (!NT_STATUS_IS_OK(status)) {
1859 PyErr_Format(py_pdb_error, "Unable to get group information by gid, (%d,%s)",
1860 NT_STATUS_V(status),
1861 get_friendly_nt_error_msg(status));
1862 talloc_free(frame);
1863 return NULL;
1864 }
1865
1866 talloc_free(frame);
1867 return py_group_map;
1868 }
1869
1870
py_pdb_getgrnam(PyObject * self,PyObject * args)1871 static PyObject *py_pdb_getgrnam(PyObject *self, PyObject *args)
1872 {
1873 TALLOC_CTX *frame = talloc_stackframe();
1874 NTSTATUS status;
1875 struct pdb_methods *methods;
1876 GROUP_MAP *group_map;
1877 PyObject *py_group_map;
1878 const char *groupname;
1879
1880 if (!PyArg_ParseTuple(args, "s:getgrnam", &groupname)) {
1881 talloc_free(frame);
1882 return NULL;
1883 }
1884
1885 methods = pytalloc_get_ptr(self);
1886
1887 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
1888 if (py_group_map == NULL) {
1889 PyErr_NoMemory();
1890 talloc_free(frame);
1891 return NULL;
1892 }
1893
1894 group_map = pytalloc_get_ptr(py_group_map);
1895
1896 status = methods->getgrnam(methods, group_map, groupname);
1897 if (!NT_STATUS_IS_OK(status)) {
1898 PyErr_Format(py_pdb_error, "Unable to get group information by name, (%d,%s)",
1899 NT_STATUS_V(status),
1900 get_friendly_nt_error_msg(status));
1901 talloc_free(frame);
1902 return NULL;
1903 }
1904
1905 talloc_free(frame);
1906 return py_group_map;
1907 }
1908
1909
py_pdb_create_dom_group(PyObject * self,PyObject * args)1910 static PyObject *py_pdb_create_dom_group(PyObject *self, PyObject *args)
1911 {
1912 TALLOC_CTX *frame = talloc_stackframe();
1913 NTSTATUS status;
1914 struct pdb_methods *methods;
1915 const char *groupname;
1916 uint32_t group_rid;
1917
1918 if (!PyArg_ParseTuple(args, "s:create_dom_group", &groupname)) {
1919 talloc_free(frame);
1920 return NULL;
1921 }
1922
1923 methods = pytalloc_get_ptr(self);
1924
1925 status = methods->create_dom_group(methods, frame, groupname, &group_rid);
1926 if (!NT_STATUS_IS_OK(status)) {
1927 PyErr_Format(py_pdb_error, "Unable to create domain group (%s), (%d,%s)",
1928 groupname,
1929 NT_STATUS_V(status),
1930 get_friendly_nt_error_msg(status));
1931 talloc_free(frame);
1932 return NULL;
1933 }
1934
1935 talloc_free(frame);
1936 return PyInt_FromLong(group_rid);
1937 }
1938
1939
py_pdb_delete_dom_group(PyObject * self,PyObject * args)1940 static PyObject *py_pdb_delete_dom_group(PyObject *self, PyObject *args)
1941 {
1942 TALLOC_CTX *frame = talloc_stackframe();
1943 NTSTATUS status;
1944 struct pdb_methods *methods;
1945 unsigned int group_rid;
1946
1947 if (!PyArg_ParseTuple(args, "I:delete_dom_group", &group_rid)) {
1948 talloc_free(frame);
1949 return NULL;
1950 }
1951
1952 methods = pytalloc_get_ptr(self);
1953
1954 status = methods->delete_dom_group(methods, frame, group_rid);
1955 if (!NT_STATUS_IS_OK(status)) {
1956 PyErr_Format(py_pdb_error, "Unable to delete domain group (rid=%d), (%d,%s)",
1957 group_rid,
1958 NT_STATUS_V(status),
1959 get_friendly_nt_error_msg(status));
1960 talloc_free(frame);
1961 return NULL;
1962 }
1963
1964 talloc_free(frame);
1965 Py_RETURN_NONE;
1966 }
1967
1968
py_pdb_add_group_mapping_entry(PyObject * self,PyObject * args)1969 static PyObject *py_pdb_add_group_mapping_entry(PyObject *self, PyObject *args)
1970 {
1971 TALLOC_CTX *frame = talloc_stackframe();
1972 NTSTATUS status;
1973 struct pdb_methods *methods;
1974 PyObject *py_group_map;
1975 GROUP_MAP *group_map;
1976
1977 if (!PyArg_ParseTuple(args, "O!:add_group_mapping_entry", &PyGroupmap, &py_group_map)) {
1978 talloc_free(frame);
1979 return NULL;
1980 }
1981
1982 methods = pytalloc_get_ptr(self);
1983
1984 group_map = pytalloc_get_ptr(py_group_map);
1985
1986 status = methods->add_group_mapping_entry(methods, group_map);
1987 if (!NT_STATUS_IS_OK(status)) {
1988 PyErr_Format(py_pdb_error, "Unable to add group mapping entry, (%d,%s)",
1989 NT_STATUS_V(status),
1990 get_friendly_nt_error_msg(status));
1991 talloc_free(frame);
1992 return NULL;
1993 }
1994
1995 talloc_free(frame);
1996 Py_RETURN_NONE;
1997 }
1998
1999
py_pdb_update_group_mapping_entry(PyObject * self,PyObject * args)2000 static PyObject *py_pdb_update_group_mapping_entry(PyObject *self, PyObject *args)
2001 {
2002 TALLOC_CTX *frame = talloc_stackframe();
2003 NTSTATUS status;
2004 struct pdb_methods *methods;
2005 PyObject *py_group_map;
2006 GROUP_MAP *group_map;
2007
2008 if (!PyArg_ParseTuple(args, "O!:update_group_mapping_entry", &PyGroupmap, &py_group_map)) {
2009 talloc_free(frame);
2010 return NULL;
2011 }
2012
2013 methods = pytalloc_get_ptr(self);
2014
2015 group_map = pytalloc_get_ptr(py_group_map);
2016
2017 status = methods->update_group_mapping_entry(methods, group_map);
2018 if (!NT_STATUS_IS_OK(status)) {
2019 PyErr_Format(py_pdb_error, "Unable to update group mapping entry, (%d,%s)",
2020 NT_STATUS_V(status),
2021 get_friendly_nt_error_msg(status));
2022 talloc_free(frame);
2023 return NULL;
2024 }
2025
2026 talloc_free(frame);
2027 Py_RETURN_NONE;
2028 }
2029
2030
py_pdb_delete_group_mapping_entry(PyObject * self,PyObject * args)2031 static PyObject *py_pdb_delete_group_mapping_entry(PyObject *self, PyObject *args)
2032 {
2033 TALLOC_CTX *frame = talloc_stackframe();
2034 NTSTATUS status;
2035 struct pdb_methods *methods;
2036 PyObject *py_group_sid;
2037 struct dom_sid *group_sid;
2038
2039 if (!PyArg_ParseTuple(args, "O!:delete_group_mapping_entry", dom_sid_Type, &py_group_sid)) {
2040 talloc_free(frame);
2041 return NULL;
2042 }
2043
2044 methods = pytalloc_get_ptr(self);
2045
2046 group_sid = pytalloc_get_ptr(py_group_sid);
2047
2048 status = methods->delete_group_mapping_entry(methods, *group_sid);
2049 if (!NT_STATUS_IS_OK(status)) {
2050 PyErr_Format(py_pdb_error, "Unable to delete group mapping entry, (%d,%s)",
2051 NT_STATUS_V(status),
2052 get_friendly_nt_error_msg(status));
2053 talloc_free(frame);
2054 return NULL;
2055 }
2056
2057 talloc_free(frame);
2058 Py_RETURN_NONE;
2059 }
2060
2061
py_pdb_enum_group_mapping(PyObject * self,PyObject * args)2062 static PyObject *py_pdb_enum_group_mapping(PyObject *self, PyObject *args)
2063 {
2064 TALLOC_CTX *frame = talloc_stackframe();
2065 NTSTATUS status;
2066 struct pdb_methods *methods;
2067 enum lsa_SidType sid_name_use;
2068 int lsa_sidtype_value = SID_NAME_UNKNOWN;
2069 int unix_only = 0;
2070 PyObject *py_domain_sid = Py_None;
2071 struct dom_sid *domain_sid = NULL;
2072 GROUP_MAP **gmap = NULL;
2073 GROUP_MAP *group_map;
2074 size_t num_entries;
2075 PyObject *py_gmap_list, *py_group_map;
2076 int i;
2077
2078 Py_INCREF(Py_None);
2079
2080 if (!PyArg_ParseTuple(args, "|O!ii:enum_group_mapping", dom_sid_Type, &py_domain_sid,
2081 &lsa_sidtype_value, &unix_only)) {
2082 talloc_free(frame);
2083 return NULL;
2084 }
2085
2086 methods = pytalloc_get_ptr(self);
2087
2088 sid_name_use = lsa_sidtype_value;
2089
2090 if (py_domain_sid != Py_None) {
2091 domain_sid = pytalloc_get_ptr(py_domain_sid);
2092 }
2093
2094 status = methods->enum_group_mapping(methods, domain_sid, sid_name_use,
2095 &gmap, &num_entries, unix_only);
2096 if (!NT_STATUS_IS_OK(status)) {
2097 PyErr_Format(py_pdb_error, "Unable to enumerate group mappings, (%d,%s)",
2098 NT_STATUS_V(status),
2099 get_friendly_nt_error_msg(status));
2100 talloc_free(frame);
2101 return NULL;
2102 }
2103
2104 py_gmap_list = PyList_New(0);
2105 if (py_gmap_list == NULL) {
2106 PyErr_NoMemory();
2107 talloc_free(frame);
2108 return NULL;
2109 }
2110
2111 for(i=0; i<num_entries; i++) {
2112 py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
2113 if (py_group_map) {
2114 int res = 0;
2115 group_map = pytalloc_get_ptr(py_group_map);
2116 *group_map = *gmap[i];
2117 talloc_steal(group_map, gmap[i]->nt_name);
2118 talloc_steal(group_map, gmap[i]->comment);
2119
2120 res = PyList_Append(py_gmap_list, py_group_map);
2121 Py_CLEAR(py_group_map);
2122 if (res == -1) {
2123 Py_CLEAR(py_gmap_list);
2124 talloc_free(frame);
2125 return NULL;
2126 }
2127 }
2128 }
2129
2130 talloc_free(gmap);
2131
2132 talloc_free(frame);
2133 return py_gmap_list;
2134 }
2135
2136
py_pdb_enum_group_members(PyObject * self,PyObject * args)2137 static PyObject *py_pdb_enum_group_members(PyObject *self, PyObject *args)
2138 {
2139 TALLOC_CTX *frame = talloc_stackframe();
2140 NTSTATUS status;
2141 struct pdb_methods *methods;
2142 PyObject *py_group_sid;
2143 struct dom_sid *group_sid;
2144 uint32_t *member_rids;
2145 size_t num_members;
2146 PyObject *py_sid_list;
2147 struct dom_sid *domain_sid, *member_sid;
2148 int i;
2149
2150 if (!PyArg_ParseTuple(args, "O!:enum_group_members", dom_sid_Type, &py_group_sid)) {
2151 talloc_free(frame);
2152 return NULL;
2153 }
2154
2155 methods = pytalloc_get_ptr(self);
2156
2157 group_sid = pytalloc_get_ptr(py_group_sid);
2158
2159 status = methods->enum_group_members(methods, frame, group_sid,
2160 &member_rids, &num_members);
2161 if (!NT_STATUS_IS_OK(status)) {
2162 PyErr_Format(py_pdb_error, "Unable to enumerate group members, (%d,%s)",
2163 NT_STATUS_V(status),
2164 get_friendly_nt_error_msg(status));
2165 talloc_free(frame);
2166 return NULL;
2167 }
2168
2169 py_sid_list = PyList_New(0);
2170 if (py_sid_list == NULL) {
2171 PyErr_NoMemory();
2172 talloc_free(frame);
2173 return NULL;
2174 }
2175
2176 domain_sid = get_global_sam_sid();
2177
2178 for(i=0; i<num_members; i++) {
2179 int res = 0;
2180 PyObject *py_member_sid = NULL;
2181 member_sid = dom_sid_add_rid(frame, domain_sid, member_rids[i]);
2182 py_member_sid = pytalloc_steal(dom_sid_Type, member_sid);
2183 res = PyList_Append(py_sid_list,
2184 py_member_sid);
2185 Py_CLEAR(py_member_sid);
2186 if (res == -1) {
2187 talloc_free(frame);
2188 Py_CLEAR(py_sid_list);
2189 return NULL;
2190 }
2191 }
2192
2193 talloc_free(frame);
2194 return py_sid_list;
2195 }
2196
2197
py_pdb_enum_group_memberships(PyObject * self,PyObject * args)2198 static PyObject *py_pdb_enum_group_memberships(PyObject *self, PyObject *args)
2199 {
2200 TALLOC_CTX *frame = talloc_stackframe();
2201 NTSTATUS status;
2202 struct pdb_methods *methods;
2203 int i;
2204
2205 struct samu *sam_acct;
2206 PyObject *py_sam_acct;
2207 PyObject *py_sid_list;
2208 struct dom_sid *user_group_sids = NULL;
2209 gid_t *user_group_ids = NULL;
2210 uint32_t num_groups = 0;
2211
2212 if (!PyArg_ParseTuple(args, "O!:enum_group_memberships", &PySamu, &py_sam_acct)) {
2213 talloc_free(frame);
2214 return NULL;
2215 }
2216
2217 methods = pytalloc_get_ptr(self);
2218
2219 sam_acct = pytalloc_get_ptr(py_sam_acct);
2220
2221 status = methods->enum_group_memberships(methods, frame, sam_acct,
2222 &user_group_sids, &user_group_ids, &num_groups);
2223 if (!NT_STATUS_IS_OK(status)) {
2224 PyErr_Format(py_pdb_error, "Unable to enumerate group memberships, (%d,%s)",
2225 NT_STATUS_V(status),
2226 get_friendly_nt_error_msg(status));
2227 talloc_free(frame);
2228 return NULL;
2229 }
2230
2231 py_sid_list = PyList_New(0);
2232 if (py_sid_list == NULL) {
2233 PyErr_NoMemory();
2234 talloc_free(frame);
2235 return NULL;
2236 }
2237
2238 for(i=0; i<num_groups; i++) {
2239 PyObject *py_sid =
2240 pytalloc_steal(dom_sid_Type,
2241 dom_sid_dup(NULL, &user_group_sids[i]));
2242 PyList_Append(py_sid_list, py_sid);
2243 Py_CLEAR(py_sid);
2244 }
2245
2246 talloc_free(frame);
2247 return py_sid_list;
2248 }
2249
2250
py_pdb_add_groupmem(PyObject * self,PyObject * args)2251 static PyObject *py_pdb_add_groupmem(PyObject *self, PyObject *args)
2252 {
2253 TALLOC_CTX *frame = talloc_stackframe();
2254 NTSTATUS status;
2255 struct pdb_methods *methods;
2256 uint32_t group_rid, member_rid;
2257
2258 if (!PyArg_ParseTuple(args, "II:add_groupmem", &group_rid, &member_rid)) {
2259 talloc_free(frame);
2260 return NULL;
2261 }
2262
2263 methods = pytalloc_get_ptr(self);
2264
2265 status = methods->add_groupmem(methods, frame, group_rid, member_rid);
2266 if (!NT_STATUS_IS_OK(status)) {
2267 PyErr_Format(py_pdb_error, "Unable to add group member, (%d,%s)",
2268 NT_STATUS_V(status),
2269 get_friendly_nt_error_msg(status));
2270 talloc_free(frame);
2271 return NULL;
2272 }
2273
2274 talloc_free(frame);
2275 Py_RETURN_NONE;
2276 }
2277
2278
py_pdb_del_groupmem(PyObject * self,PyObject * args)2279 static PyObject *py_pdb_del_groupmem(PyObject *self, PyObject *args)
2280 {
2281 TALLOC_CTX *frame = talloc_stackframe();
2282 NTSTATUS status;
2283 struct pdb_methods *methods;
2284 uint32_t group_rid, member_rid;
2285
2286 if (!PyArg_ParseTuple(args, "II:del_groupmem", &group_rid, &member_rid)) {
2287 talloc_free(frame);
2288 return NULL;
2289 }
2290
2291 methods = pytalloc_get_ptr(self);
2292
2293 status = methods->del_groupmem(methods, frame, group_rid, member_rid);
2294 if (!NT_STATUS_IS_OK(status)) {
2295 PyErr_Format(py_pdb_error, "Unable to rename sam account, (%d,%s)",
2296 NT_STATUS_V(status),
2297 get_friendly_nt_error_msg(status));
2298 talloc_free(frame);
2299 return NULL;
2300 }
2301
2302 talloc_free(frame);
2303 Py_RETURN_NONE;
2304 }
2305
2306
py_pdb_create_alias(PyObject * self,PyObject * args)2307 static PyObject *py_pdb_create_alias(PyObject *self, PyObject *args)
2308 {
2309 TALLOC_CTX *frame = talloc_stackframe();
2310 NTSTATUS status;
2311 struct pdb_methods *methods;
2312 const char *alias_name;
2313 uint32_t rid;
2314
2315 if (!PyArg_ParseTuple(args, "s:create_alias", &alias_name)) {
2316 talloc_free(frame);
2317 return NULL;
2318 }
2319
2320 methods = pytalloc_get_ptr(self);
2321
2322 status = methods->create_alias(methods, alias_name, &rid);
2323 if (!NT_STATUS_IS_OK(status)) {
2324 PyErr_Format(py_pdb_error, "Unable to create alias (%s), (%d,%s)",
2325 alias_name,
2326 NT_STATUS_V(status),
2327 get_friendly_nt_error_msg(status));
2328 talloc_free(frame);
2329 return NULL;
2330 }
2331
2332 talloc_free(frame);
2333 return PyInt_FromLong(rid);
2334 }
2335
2336
py_pdb_delete_alias(PyObject * self,PyObject * args)2337 static PyObject *py_pdb_delete_alias(PyObject *self, PyObject *args)
2338 {
2339 TALLOC_CTX *frame = talloc_stackframe();
2340 NTSTATUS status;
2341 struct pdb_methods *methods;
2342 PyObject *py_alias_sid;
2343 struct dom_sid *alias_sid;
2344
2345 if (!PyArg_ParseTuple(args, "O!:delete_alias", dom_sid_Type, &py_alias_sid)) {
2346 talloc_free(frame);
2347 return NULL;
2348 }
2349
2350 methods = pytalloc_get_ptr(self);
2351
2352 alias_sid = pytalloc_get_ptr(py_alias_sid);
2353
2354 status = methods->delete_alias(methods, alias_sid);
2355 if (!NT_STATUS_IS_OK(status)) {
2356 PyErr_Format(py_pdb_error, "Unable to delete alias, (%d,%s)",
2357 NT_STATUS_V(status),
2358 get_friendly_nt_error_msg(status));
2359 talloc_free(frame);
2360 return NULL;
2361 }
2362
2363 talloc_free(frame);
2364 Py_RETURN_NONE;
2365 }
2366
2367
py_pdb_get_aliasinfo(PyObject * self,PyObject * args)2368 static PyObject *py_pdb_get_aliasinfo(PyObject *self, PyObject *args)
2369 {
2370 TALLOC_CTX *frame = talloc_stackframe();
2371 NTSTATUS status;
2372 struct pdb_methods *methods;
2373 PyObject *py_alias_sid;
2374 struct dom_sid *alias_sid;
2375 struct acct_info *alias_info;
2376 PyObject *py_alias_info;
2377
2378 if (!PyArg_ParseTuple(args, "O!:get_aliasinfo", dom_sid_Type, &py_alias_sid)) {
2379 talloc_free(frame);
2380 return NULL;
2381 }
2382
2383 methods = pytalloc_get_ptr(self);
2384
2385 alias_sid = pytalloc_get_ptr(py_alias_sid);
2386
2387 alias_info = talloc_zero(frame, struct acct_info);
2388 if (!alias_info) {
2389 PyErr_NoMemory();
2390 talloc_free(frame);
2391 return NULL;
2392 }
2393
2394 status = methods->get_aliasinfo(methods, alias_sid, alias_info);
2395 if (!NT_STATUS_IS_OK(status)) {
2396 PyErr_Format(py_pdb_error, "Unable to get alias information, (%d,%s)",
2397 NT_STATUS_V(status),
2398 get_friendly_nt_error_msg(status));
2399 talloc_free(frame);
2400 return NULL;
2401 }
2402
2403 py_alias_info = Py_BuildValue(
2404 "{s:s, s:s, s:l}",
2405 "acct_name", alias_info->acct_name,
2406 "acct_desc", alias_info->acct_desc,
2407 "rid", alias_info->rid);
2408
2409 talloc_free(frame);
2410 return py_alias_info;
2411 }
2412
2413
py_pdb_set_aliasinfo(PyObject * self,PyObject * args)2414 static PyObject *py_pdb_set_aliasinfo(PyObject *self, PyObject *args)
2415 {
2416 TALLOC_CTX *frame = talloc_stackframe();
2417 NTSTATUS status;
2418 struct pdb_methods *methods;
2419 PyObject *py_alias_sid, *py_alias_info;
2420 struct dom_sid *alias_sid;
2421 struct acct_info alias_info;
2422
2423 if (!PyArg_ParseTuple(args, "O!O:set_alias_info", dom_sid_Type, &py_alias_sid,
2424 &py_alias_info)) {
2425 talloc_free(frame);
2426 return NULL;
2427 }
2428
2429 methods = pytalloc_get_ptr(self);
2430
2431 alias_sid = pytalloc_get_ptr(py_alias_sid);
2432
2433 alias_info.acct_name = talloc_strdup(frame, PyUnicode_AsUTF8(PyDict_GetItemString(py_alias_info, "acct_name")));
2434 if (alias_info.acct_name == NULL) {
2435 PyErr_Format(py_pdb_error, "Unable to allocate memory");
2436 talloc_free(frame);
2437 return NULL;
2438 }
2439 alias_info.acct_desc = talloc_strdup(frame, PyUnicode_AsUTF8(PyDict_GetItemString(py_alias_info, "acct_desc")));
2440 if (alias_info.acct_desc == NULL) {
2441 PyErr_Format(py_pdb_error, "Unable to allocate memory");
2442 talloc_free(frame);
2443 return NULL;
2444 }
2445
2446 status = methods->set_aliasinfo(methods, alias_sid, &alias_info);
2447 if (!NT_STATUS_IS_OK(status)) {
2448 PyErr_Format(py_pdb_error, "Unable to set alias information, (%d,%s)",
2449 NT_STATUS_V(status),
2450 get_friendly_nt_error_msg(status));
2451 talloc_free(frame);
2452 return NULL;
2453 }
2454
2455 talloc_free(frame);
2456 Py_RETURN_NONE;
2457 }
2458
2459
py_pdb_add_aliasmem(PyObject * self,PyObject * args)2460 static PyObject *py_pdb_add_aliasmem(PyObject *self, PyObject *args)
2461 {
2462 TALLOC_CTX *frame = talloc_stackframe();
2463 NTSTATUS status;
2464 struct pdb_methods *methods;
2465 PyObject *py_alias_sid, *py_member_sid;
2466 struct dom_sid *alias_sid, *member_sid;
2467
2468 if (!PyArg_ParseTuple(args, "O!O!:add_aliasmem", dom_sid_Type, &py_alias_sid,
2469 dom_sid_Type, &py_member_sid)) {
2470 talloc_free(frame);
2471 return NULL;
2472 }
2473
2474 methods = pytalloc_get_ptr(self);
2475
2476 alias_sid = pytalloc_get_ptr(py_alias_sid);
2477 member_sid = pytalloc_get_ptr(py_member_sid);
2478
2479 status = methods->add_aliasmem(methods, alias_sid, member_sid);
2480 if (!NT_STATUS_IS_OK(status)) {
2481 PyErr_Format(py_pdb_error, "Unable to add member to alias, (%d,%s)",
2482 NT_STATUS_V(status),
2483 get_friendly_nt_error_msg(status));
2484 talloc_free(frame);
2485 return NULL;
2486 }
2487
2488 talloc_free(frame);
2489 Py_RETURN_NONE;
2490 }
2491
2492
py_pdb_del_aliasmem(PyObject * self,PyObject * args)2493 static PyObject *py_pdb_del_aliasmem(PyObject *self, PyObject *args)
2494 {
2495 TALLOC_CTX *frame = talloc_stackframe();
2496 NTSTATUS status;
2497 struct pdb_methods *methods;
2498 PyObject *py_alias_sid, *py_member_sid;
2499 const struct dom_sid *alias_sid, *member_sid;
2500
2501 if (!PyArg_ParseTuple(args, "O!O!:del_aliasmem", dom_sid_Type, &py_alias_sid,
2502 dom_sid_Type, &py_member_sid)) {
2503 talloc_free(frame);
2504 return NULL;
2505 }
2506
2507 methods = pytalloc_get_ptr(self);
2508
2509 alias_sid = pytalloc_get_ptr(py_alias_sid);
2510 member_sid = pytalloc_get_ptr(py_member_sid);
2511
2512 status = methods->del_aliasmem(methods, alias_sid, member_sid);
2513 if (!NT_STATUS_IS_OK(status)) {
2514 PyErr_Format(py_pdb_error, "Unable to delete member from alias, (%d,%s)",
2515 NT_STATUS_V(status),
2516 get_friendly_nt_error_msg(status));
2517 talloc_free(frame);
2518 return NULL;
2519 }
2520
2521 talloc_free(frame);
2522 Py_RETURN_NONE;
2523 }
2524
2525
py_pdb_enum_aliasmem(PyObject * self,PyObject * args)2526 static PyObject *py_pdb_enum_aliasmem(PyObject *self, PyObject *args)
2527 {
2528 TALLOC_CTX *frame = talloc_stackframe();
2529 NTSTATUS status;
2530 struct pdb_methods *methods;
2531 PyObject *py_alias_sid;
2532 struct dom_sid *alias_sid, *member_sid, *tmp_sid;
2533 PyObject *py_member_list, *py_member_sid;
2534 size_t num_members;
2535 int i;
2536
2537 if (!PyArg_ParseTuple(args, "O!:enum_aliasmem", dom_sid_Type, &py_alias_sid)) {
2538 talloc_free(frame);
2539 return NULL;
2540 }
2541
2542 methods = pytalloc_get_ptr(self);
2543
2544 alias_sid = pytalloc_get_ptr(py_alias_sid);
2545
2546 status = methods->enum_aliasmem(methods, alias_sid, frame, &member_sid, &num_members);
2547 if (!NT_STATUS_IS_OK(status)) {
2548 PyErr_Format(py_pdb_error, "Unable to enumerate members for alias, (%d,%s)",
2549 NT_STATUS_V(status),
2550 get_friendly_nt_error_msg(status));
2551 talloc_free(frame);
2552 return NULL;
2553 }
2554
2555 py_member_list = PyList_New(0);
2556 if (py_member_list == NULL) {
2557 PyErr_NoMemory();
2558 talloc_free(frame);
2559 return NULL;
2560 }
2561
2562 for(i=0; i<num_members; i++) {
2563 int res = 0;
2564 py_member_sid = pytalloc_new(struct dom_sid, dom_sid_Type);
2565 if (py_member_sid == NULL) {
2566 PyErr_NoMemory();
2567 Py_CLEAR(py_member_list);
2568 talloc_free(frame);
2569 return NULL;
2570 }
2571 tmp_sid = pytalloc_get_ptr(py_member_sid);
2572 *tmp_sid = member_sid[i];
2573 res = PyList_Append(py_member_list, py_member_sid);
2574 Py_CLEAR(py_member_sid);
2575 if (res == -1) {
2576 Py_CLEAR(py_member_list);
2577 talloc_free(frame);
2578 return NULL;
2579 }
2580 }
2581
2582 talloc_free(frame);
2583 return py_member_list;
2584 }
2585
2586
py_pdb_get_account_policy(PyObject * self,PyObject * unused)2587 static PyObject *py_pdb_get_account_policy(PyObject *self, PyObject *unused)
2588 {
2589 TALLOC_CTX *frame = talloc_stackframe();
2590 NTSTATUS status;
2591 struct pdb_methods *methods;
2592 PyObject *py_acct_policy;
2593 uint32_t value;
2594 const char **names;
2595 int count, i;
2596 enum pdb_policy_type type;
2597
2598 methods = pytalloc_get_ptr(self);
2599
2600 py_acct_policy = PyDict_New();
2601 if (py_acct_policy == NULL) {
2602 PyErr_NoMemory();
2603 talloc_free(frame);
2604 return NULL;
2605 }
2606
2607 account_policy_names_list(frame, &names, &count);
2608 for (i=0; i<count; i++) {
2609 type = account_policy_name_to_typenum(names[i]);
2610 status = methods->get_account_policy(methods, type, &value);
2611 if (NT_STATUS_IS_OK(status)) {
2612 int res = 0;
2613 PyObject *py_value = Py_BuildValue("i", value);
2614 if (py_value == NULL) {
2615 Py_CLEAR(py_acct_policy);
2616 break;
2617 }
2618 res = PyDict_SetItemString(py_acct_policy,
2619 names[i],
2620 py_value);
2621 Py_CLEAR(py_value);
2622 if (res == -1) {
2623 Py_CLEAR(py_acct_policy);
2624 break;
2625 }
2626 }
2627 }
2628
2629 talloc_free(frame);
2630 return py_acct_policy;
2631 }
2632
2633
py_pdb_set_account_policy(PyObject * self,PyObject * args)2634 static PyObject *py_pdb_set_account_policy(PyObject *self, PyObject *args)
2635 {
2636 TALLOC_CTX *frame = talloc_stackframe();
2637 NTSTATUS status;
2638 struct pdb_methods *methods;
2639 PyObject *py_acct_policy, *py_value;
2640 const char **names;
2641 int count, i;
2642 enum pdb_policy_type type;
2643
2644 if (!PyArg_ParseTuple(args, "O!:set_account_policy", PyDict_Type, &py_acct_policy)) {
2645 talloc_free(frame);
2646 return NULL;
2647 }
2648
2649 methods = pytalloc_get_ptr(self);
2650
2651 account_policy_names_list(frame, &names, &count);
2652 for (i=0; i<count; i++) {
2653 if ((py_value = PyDict_GetItemString(py_acct_policy, names[i])) != NULL) {
2654 type = account_policy_name_to_typenum(names[i]);
2655 status = methods->set_account_policy(methods, type, PyInt_AsLong(py_value));
2656 if (!NT_STATUS_IS_OK(status)) {
2657 PyErr_Format(py_pdb_error, "Error setting account policy (%s), (%d,%s)",
2658 names[i],
2659 NT_STATUS_V(status),
2660 get_friendly_nt_error_msg(status));
2661 }
2662 }
2663 }
2664
2665 talloc_free(frame);
2666 Py_RETURN_NONE;
2667 }
2668
py_pdb_search_users(PyObject * self,PyObject * args)2669 static PyObject *py_pdb_search_users(PyObject *self, PyObject *args)
2670 {
2671 TALLOC_CTX *frame = talloc_stackframe();
2672 struct pdb_methods *methods;
2673 unsigned int acct_flags;
2674 struct pdb_search *search;
2675 struct samr_displayentry *entry;
2676 PyObject *py_userlist, *py_dict;
2677
2678 if (!PyArg_ParseTuple(args, "I:search_users", &acct_flags)) {
2679 talloc_free(frame);
2680 return NULL;
2681 }
2682
2683 methods = pytalloc_get_ptr(self);
2684
2685 search = talloc_zero(frame, struct pdb_search);
2686 if (search == NULL) {
2687 PyErr_NoMemory();
2688 talloc_free(frame);
2689 return NULL;
2690 }
2691
2692 if (!methods->search_users(methods, search, acct_flags)) {
2693 PyErr_Format(py_pdb_error, "Unable to search users");
2694 talloc_free(frame);
2695 return NULL;
2696 }
2697
2698 entry = talloc_zero(frame, struct samr_displayentry);
2699 if (entry == NULL) {
2700 PyErr_NoMemory();
2701 talloc_free(frame);
2702 return NULL;
2703 }
2704
2705 py_userlist = PyList_New(0);
2706 if (py_userlist == NULL) {
2707 PyErr_NoMemory();
2708 talloc_free(frame);
2709 return NULL;
2710 }
2711
2712 while (search->next_entry(search, entry)) {
2713 int res = 1;
2714 py_dict = Py_BuildValue(
2715 "{s:l, s:l, s:l, s:s, s:s, s:s}",
2716 "idx", entry->idx,
2717 "rid", entry->rid,
2718 "acct_flags", entry->acct_flags,
2719 "account_name", entry->account_name,
2720 "fullname", entry->fullname,
2721 "description", entry->description);
2722 if (py_dict == NULL) {
2723 Py_CLEAR(py_userlist);
2724 goto out;
2725 }
2726
2727 res = PyList_Append(py_userlist, py_dict);
2728 Py_CLEAR(py_dict);
2729 if (res == -1) {
2730 Py_CLEAR(py_userlist);
2731 goto out;
2732 }
2733 }
2734 search->search_end(search);
2735
2736 out:
2737 talloc_free(frame);
2738 return py_userlist;
2739 }
2740
2741
py_pdb_search_groups(PyObject * self,PyObject * unused)2742 static PyObject *py_pdb_search_groups(PyObject *self, PyObject *unused)
2743 {
2744 TALLOC_CTX *frame = talloc_stackframe();
2745 struct pdb_methods *methods;
2746 struct pdb_search *search;
2747 struct samr_displayentry *entry;
2748 PyObject *py_grouplist, *py_dict;
2749
2750 methods = pytalloc_get_ptr(self);
2751
2752 search = talloc_zero(frame, struct pdb_search);
2753 if (search == NULL) {
2754 PyErr_NoMemory();
2755 talloc_free(frame);
2756 return NULL;
2757 }
2758
2759 if (!methods->search_groups(methods, search)) {
2760 PyErr_Format(py_pdb_error, "Unable to search groups");
2761 talloc_free(frame);
2762 return NULL;
2763 }
2764
2765 entry = talloc_zero(frame, struct samr_displayentry);
2766 if (entry == NULL) {
2767 PyErr_NoMemory();
2768 talloc_free(frame);
2769 return NULL;
2770 }
2771
2772 py_grouplist = PyList_New(0);
2773 if (py_grouplist == NULL) {
2774 PyErr_NoMemory();
2775 talloc_free(frame);
2776 return NULL;
2777 }
2778
2779 while (search->next_entry(search, entry)) {
2780 int res = 0;
2781 py_dict = Py_BuildValue(
2782 "{s:l, s:l, s:l, s:s, s:s, s:s}",
2783 "idx", entry->idx,
2784 "rid", entry->rid,
2785 "acct_flags", entry->acct_flags,
2786 "account_name", entry->account_name,
2787 "fullname", entry->fullname,
2788 "description", entry->description);
2789
2790 if (py_dict == NULL) {
2791 Py_CLEAR(py_grouplist);
2792 goto out;
2793 }
2794
2795 res = PyList_Append(py_grouplist, py_dict);
2796 Py_CLEAR(py_dict);
2797 if (res == -1) {
2798 Py_CLEAR(py_grouplist);
2799 goto out;
2800 }
2801 }
2802 search->search_end(search);
2803 out:
2804 talloc_free(frame);
2805 return py_grouplist;
2806 }
2807
2808
py_pdb_search_aliases(PyObject * self,PyObject * args)2809 static PyObject *py_pdb_search_aliases(PyObject *self, PyObject *args)
2810 {
2811 TALLOC_CTX *frame = talloc_stackframe();
2812 struct pdb_methods *methods;
2813 struct pdb_search *search;
2814 struct samr_displayentry *entry;
2815 PyObject *py_aliaslist, *py_dict;
2816 PyObject *py_domain_sid = Py_None;
2817 struct dom_sid *domain_sid = NULL;
2818
2819 Py_INCREF(Py_None);
2820
2821 if (!PyArg_ParseTuple(args, "|O!:search_aliases", dom_sid_Type, &py_domain_sid)) {
2822 talloc_free(frame);
2823 return NULL;
2824 }
2825
2826 methods = pytalloc_get_ptr(self);
2827
2828 if (py_domain_sid != Py_None) {
2829 domain_sid = pytalloc_get_ptr(py_domain_sid);
2830 }
2831
2832 search = talloc_zero(frame, struct pdb_search);
2833 if (search == NULL) {
2834 PyErr_NoMemory();
2835 talloc_free(frame);
2836 return NULL;
2837 }
2838
2839 if (!methods->search_aliases(methods, search, domain_sid)) {
2840 PyErr_Format(py_pdb_error, "Unable to search aliases");
2841 talloc_free(frame);
2842 return NULL;
2843 }
2844
2845 entry = talloc_zero(frame, struct samr_displayentry);
2846 if (entry == NULL) {
2847 PyErr_NoMemory();
2848 talloc_free(frame);
2849 return NULL;
2850 }
2851
2852 py_aliaslist = PyList_New(0);
2853 if (py_aliaslist == NULL) {
2854 PyErr_NoMemory();
2855 talloc_free(frame);
2856 return NULL;
2857 }
2858
2859 while (search->next_entry(search, entry)) {
2860 int res = 0;
2861
2862 py_dict = Py_BuildValue(
2863 "{s:l, s:l, s:l, s:s, s:s, s:s}",
2864 "idx", entry->idx,
2865 "rid", entry->rid,
2866 "acct_flags", entry->acct_flags,
2867 "account_name", entry->account_name,
2868 "fullname", entry->fullname,
2869 "description", entry->description);
2870
2871 if (py_dict == NULL) {
2872 Py_CLEAR(py_aliaslist);
2873 goto out;
2874 }
2875 res = PyList_Append(py_aliaslist, py_dict);
2876 Py_CLEAR(py_dict);
2877 if (res == -1) {
2878 Py_CLEAR(py_aliaslist);
2879 goto out;
2880 }
2881 }
2882 search->search_end(search);
2883 out:
2884 talloc_free(frame);
2885 return py_aliaslist;
2886 }
2887
2888
py_pdb_uid_to_sid(PyObject * self,PyObject * args)2889 static PyObject *py_pdb_uid_to_sid(PyObject *self, PyObject *args)
2890 {
2891 TALLOC_CTX *frame = talloc_stackframe();
2892 struct pdb_methods *methods;
2893 struct unixid id;
2894 unsigned int uid;
2895 struct dom_sid user_sid, *copy_user_sid;
2896 PyObject *py_user_sid;
2897
2898 if (!PyArg_ParseTuple(args, "I:uid_to_sid", &uid)) {
2899 talloc_free(frame);
2900 return NULL;
2901 }
2902
2903 methods = pytalloc_get_ptr(self);
2904
2905 id.id = uid;
2906 id.type = ID_TYPE_UID;
2907
2908 if (!methods->id_to_sid(methods, &id, &user_sid)) {
2909 PyErr_Format(py_pdb_error, "Unable to get sid for uid=%d", uid);
2910 talloc_free(frame);
2911 return NULL;
2912 }
2913
2914 copy_user_sid = dom_sid_dup(frame, &user_sid);
2915 if (copy_user_sid == NULL) {
2916 PyErr_NoMemory();
2917 talloc_free(frame);
2918 return NULL;
2919 }
2920
2921 py_user_sid = pytalloc_steal(dom_sid_Type, copy_user_sid);
2922
2923 talloc_free(frame);
2924 return py_user_sid;
2925 }
2926
2927
py_pdb_gid_to_sid(PyObject * self,PyObject * args)2928 static PyObject *py_pdb_gid_to_sid(PyObject *self, PyObject *args)
2929 {
2930 TALLOC_CTX *frame = talloc_stackframe();
2931 struct pdb_methods *methods;
2932 struct unixid id;
2933 unsigned int gid;
2934 struct dom_sid group_sid, *copy_group_sid;
2935 PyObject *py_group_sid;
2936
2937 if (!PyArg_ParseTuple(args, "I:gid_to_sid", &gid)) {
2938 talloc_free(frame);
2939 return NULL;
2940 }
2941
2942 id.id = gid;
2943 id.type = ID_TYPE_GID;
2944
2945 methods = pytalloc_get_ptr(self);
2946
2947 if (!methods->id_to_sid(methods, &id, &group_sid)) {
2948 PyErr_Format(py_pdb_error, "Unable to get sid for gid=%d", gid);
2949 talloc_free(frame);
2950 return NULL;
2951 }
2952
2953 copy_group_sid = dom_sid_dup(frame, &group_sid);
2954 if (copy_group_sid == NULL) {
2955 PyErr_NoMemory();
2956 talloc_free(frame);
2957 return NULL;
2958 }
2959
2960 py_group_sid = pytalloc_steal(dom_sid_Type, copy_group_sid);
2961
2962 talloc_free(frame);
2963 return py_group_sid;
2964 }
2965
2966
py_pdb_sid_to_id(PyObject * self,PyObject * args)2967 static PyObject *py_pdb_sid_to_id(PyObject *self, PyObject *args)
2968 {
2969 TALLOC_CTX *frame = talloc_stackframe();
2970 struct pdb_methods *methods;
2971 PyObject *py_sid;
2972 struct dom_sid *sid;
2973 struct unixid id;
2974
2975 if (!PyArg_ParseTuple(args, "O!:sid_to_id", dom_sid_Type, &py_sid)) {
2976 talloc_free(frame);
2977 return NULL;
2978 }
2979
2980 methods = pytalloc_get_ptr(self);
2981
2982 sid = pytalloc_get_ptr(py_sid);
2983
2984 if (!methods->sid_to_id(methods, sid, &id)) {
2985 PyErr_Format(py_pdb_error, "Unable to get id for sid");
2986 talloc_free(frame);
2987 return NULL;
2988 }
2989
2990 talloc_free(frame);
2991 return Py_BuildValue("(II)", id.id, id.type);
2992 }
2993
2994
py_pdb_new_rid(PyObject * self,PyObject * unused)2995 static PyObject *py_pdb_new_rid(PyObject *self, PyObject *unused)
2996 {
2997 TALLOC_CTX *frame = talloc_stackframe();
2998 struct pdb_methods *methods;
2999 uint32_t rid;
3000
3001 methods = pytalloc_get_ptr(self);
3002
3003 if (!methods->new_rid(methods, &rid)) {
3004 PyErr_Format(py_pdb_error, "Unable to get new rid");
3005 talloc_free(frame);
3006 return NULL;
3007 }
3008
3009 talloc_free(frame);
3010 return PyInt_FromLong(rid);
3011 }
3012
3013
py_pdb_get_trusteddom_pw(PyObject * self,PyObject * args)3014 static PyObject *py_pdb_get_trusteddom_pw(PyObject *self, PyObject *args)
3015 {
3016 TALLOC_CTX *frame = talloc_stackframe();
3017 struct pdb_methods *methods;
3018 const char *domain;
3019 char *pwd;
3020 struct dom_sid sid, *copy_sid;
3021 PyObject *py_sid;
3022 time_t last_set_time;
3023 PyObject *py_value;
3024
3025 if (!PyArg_ParseTuple(args, "s:get_trusteddom_pw", &domain)) {
3026 talloc_free(frame);
3027 return NULL;
3028 }
3029
3030 methods = pytalloc_get_ptr(self);
3031
3032 if (!methods->get_trusteddom_pw(methods, domain, &pwd, &sid, &last_set_time)) {
3033 PyErr_Format(py_pdb_error, "Unable to get trusted domain password");
3034 talloc_free(frame);
3035 return NULL;
3036 }
3037
3038 copy_sid = dom_sid_dup(frame, &sid);
3039 if (copy_sid == NULL) {
3040 PyErr_NoMemory();
3041 talloc_free(frame);
3042 return NULL;
3043 }
3044
3045 py_sid = pytalloc_steal(dom_sid_Type, copy_sid);
3046 if (py_sid == NULL) {
3047 PyErr_NoMemory();
3048 talloc_free(frame);
3049 return NULL;
3050 }
3051
3052 py_value = Py_BuildValue(
3053 "{s:s, s:O, s:l}",
3054 "pwd", pwd,
3055 "sid", py_sid,
3056 "last_set_tim", last_set_time);
3057
3058 Py_CLEAR(py_sid);
3059 talloc_free(frame);
3060 return py_value;
3061 }
3062
3063
py_pdb_set_trusteddom_pw(PyObject * self,PyObject * args)3064 static PyObject *py_pdb_set_trusteddom_pw(PyObject *self, PyObject *args)
3065 {
3066 TALLOC_CTX *frame = talloc_stackframe();
3067 struct pdb_methods *methods;
3068 const char *domain;
3069 const char *pwd;
3070 const struct dom_sid *domain_sid;
3071 PyObject *py_domain_sid;
3072
3073 if (!PyArg_ParseTuple(args, "ssO!:set_trusteddom_pw", &domain, &pwd,
3074 dom_sid_Type, &py_domain_sid)) {
3075 talloc_free(frame);
3076 return NULL;
3077 }
3078
3079 methods = pytalloc_get_ptr(self);
3080
3081 domain_sid = pytalloc_get_ptr(py_domain_sid);
3082
3083 if (!methods->set_trusteddom_pw(methods, domain, pwd, domain_sid)) {
3084 PyErr_Format(py_pdb_error, "Unable to set trusted domain password");
3085 talloc_free(frame);
3086 return NULL;
3087 }
3088
3089 talloc_free(frame);
3090 Py_RETURN_NONE;
3091 }
3092
3093
py_pdb_del_trusteddom_pw(PyObject * self,PyObject * args)3094 static PyObject *py_pdb_del_trusteddom_pw(PyObject *self, PyObject *args)
3095 {
3096 TALLOC_CTX *frame = talloc_stackframe();
3097 struct pdb_methods *methods;
3098 const char *domain;
3099
3100 if (!PyArg_ParseTuple(args, "s:del_trusteddom_pw", &domain)) {
3101 talloc_free(frame);
3102 return NULL;
3103 }
3104
3105 methods = pytalloc_get_ptr(self);
3106
3107 if (!methods->del_trusteddom_pw(methods, domain)) {
3108 PyErr_Format(py_pdb_error, "Unable to delete trusted domain password");
3109 talloc_free(frame);
3110 return NULL;
3111 }
3112
3113 talloc_free(frame);
3114 Py_RETURN_NONE;
3115 }
3116
3117
py_pdb_enum_trusteddoms(PyObject * self,PyObject * unused)3118 static PyObject *py_pdb_enum_trusteddoms(PyObject *self, PyObject *unused)
3119 {
3120 TALLOC_CTX *frame = talloc_stackframe();
3121 NTSTATUS status;
3122 struct pdb_methods *methods;
3123 uint32_t num_domains;
3124 struct trustdom_info **domains;
3125 PyObject *py_domain_list, *py_dict;
3126 int i;
3127
3128 methods = pytalloc_get_ptr(self);
3129
3130 status = methods->enum_trusteddoms(methods, frame, &num_domains, &domains);
3131 if (!NT_STATUS_IS_OK(status)) {
3132 PyErr_Format(py_pdb_error, "Unable to enumerate trusted domains, (%d,%s)",
3133 NT_STATUS_V(status),
3134 get_friendly_nt_error_msg(status));
3135 talloc_free(frame);
3136 return NULL;
3137 }
3138
3139 py_domain_list = PyList_New(0);
3140 if (py_domain_list == NULL) {
3141 PyErr_NoMemory();
3142 talloc_free(frame);
3143 return NULL;
3144 }
3145
3146 for(i=0; i<num_domains; i++) {
3147 int res = 0;
3148 PyObject *py_sid =
3149 pytalloc_steal(dom_sid_Type, &domains[i]->sid);
3150 py_dict = Py_BuildValue(
3151 "{s:s, s:O}",
3152 "name", domains[i]->name,
3153 "sid", py_sid);
3154 Py_CLEAR(py_sid);
3155 if (py_dict == NULL) {
3156 DBG_ERR("Failed to insert entry to dict\n");
3157 Py_CLEAR(py_domain_list);
3158 break;
3159 }
3160
3161 res = PyList_Append(py_domain_list, py_dict);
3162 Py_CLEAR(py_dict);
3163 if (res == -1) {
3164 Py_CLEAR(py_domain_list);
3165 break;
3166 }
3167 }
3168
3169 talloc_free(frame);
3170 return py_domain_list;
3171 }
3172
3173
py_pdb_get_trusted_domain(PyObject * self,PyObject * args)3174 static PyObject *py_pdb_get_trusted_domain(PyObject *self, PyObject *args)
3175 {
3176 TALLOC_CTX *frame = talloc_stackframe();
3177 NTSTATUS status;
3178 struct pdb_methods *methods;
3179 const char *domain;
3180 struct pdb_trusted_domain *td;
3181 PyObject *py_domain_info;
3182 PyObject *py_sid = NULL;
3183
3184 if (!PyArg_ParseTuple(args, "s:get_trusted_domain", &domain)) {
3185 talloc_free(frame);
3186 return NULL;
3187 }
3188
3189 methods = pytalloc_get_ptr(self);
3190
3191 status = methods->get_trusted_domain(methods, frame, domain, &td);
3192 if (!NT_STATUS_IS_OK(status)) {
3193 PyErr_Format(py_pdb_error, "Unable to get trusted domain information, (%d,%s)",
3194 NT_STATUS_V(status),
3195 get_friendly_nt_error_msg(status));
3196 talloc_free(frame);
3197 return NULL;
3198 }
3199
3200 py_sid = pytalloc_steal(dom_sid_Type, &td->security_identifier);
3201
3202 py_domain_info = Py_BuildValue(
3203 "{s:s, s:s, s:O,"
3204 " s:"PYARG_BYTES_LEN","
3205 " s:"PYARG_BYTES_LEN","
3206 " s:l, s:l, s:l,"
3207 " s:"PYARG_BYTES_LEN"}",
3208 "domain_name", td->domain_name,
3209 "netbios_name", td->netbios_name,
3210 "security_identifier", py_sid,
3211 "trust_auth_incoming",
3212 (const char *)td->trust_auth_incoming.data,
3213 td->trust_auth_incoming.length,
3214 "trust_auth_outgoing",
3215 (const char *)td->trust_auth_outgoing.data,
3216 td->trust_auth_outgoing.length,
3217 "trust_direction", td->trust_direction,
3218 "trust_type", td->trust_type,
3219 "trust_attributes", td->trust_attributes,
3220 "trust_forest_trust_info",
3221 (const char *)td->trust_forest_trust_info.data,
3222 td->trust_forest_trust_info.length);
3223 Py_CLEAR(py_sid);
3224
3225 talloc_free(frame);
3226 return py_domain_info;
3227 }
3228
3229
py_pdb_get_trusted_domain_by_sid(PyObject * self,PyObject * args)3230 static PyObject *py_pdb_get_trusted_domain_by_sid(PyObject *self, PyObject *args)
3231 {
3232 TALLOC_CTX *frame = talloc_stackframe();
3233 NTSTATUS status;
3234 struct pdb_methods *methods;
3235 PyObject *py_domain_sid;
3236 struct dom_sid *domain_sid;
3237 struct pdb_trusted_domain *td;
3238 PyObject *py_domain_info;
3239 PyObject *py_sid = NULL;
3240
3241 if (!PyArg_ParseTuple(args, "O!:get_trusted_domain_by_sid", dom_sid_Type, &py_domain_sid)) {
3242 talloc_free(frame);
3243 return NULL;
3244 }
3245
3246 methods = pytalloc_get_ptr(self);
3247
3248 domain_sid = pytalloc_get_ptr(py_domain_sid);
3249
3250 status = methods->get_trusted_domain_by_sid(methods, frame, domain_sid, &td);
3251 if (!NT_STATUS_IS_OK(status)) {
3252 PyErr_Format(py_pdb_error, "Unable to get trusted domain information, (%d,%s)",
3253 NT_STATUS_V(status),
3254 get_friendly_nt_error_msg(status));
3255 talloc_free(frame);
3256 return NULL;
3257 }
3258
3259 py_sid = pytalloc_steal(dom_sid_Type, &td->security_identifier);
3260
3261 py_domain_info = Py_BuildValue(
3262 "{s:s, s:s, s:O,"
3263 " s:"PYARG_BYTES_LEN","
3264 " s:"PYARG_BYTES_LEN","
3265 " s:l, s:l, s:l,"
3266 " s:"PYARG_BYTES_LEN"}",
3267 "domain_name", td->domain_name,
3268 "netbios_name", td->netbios_name,
3269 "security_identifier", py_sid,
3270 "trust_auth_incoming",
3271 (const char *)td->trust_auth_incoming.data,
3272 td->trust_auth_incoming.length,
3273 "trust_auth_outgoing",
3274 (const char *)td->trust_auth_outgoing.data,
3275 td->trust_auth_outgoing.length,
3276 "trust_direction", td->trust_direction,
3277 "trust_type", td->trust_type,
3278 "trust_attributes", td->trust_attributes,
3279 "trust_forest_trust_info",
3280 (const char *)td->trust_forest_trust_info.data,
3281 td->trust_forest_trust_info.length);
3282 Py_CLEAR(py_sid);
3283
3284 talloc_free(frame);
3285 return py_domain_info;
3286 }
3287
3288
py_pdb_set_trusted_domain(PyObject * self,PyObject * args)3289 static PyObject *py_pdb_set_trusted_domain(PyObject *self, PyObject *args)
3290 {
3291 TALLOC_CTX *frame = talloc_stackframe();
3292 NTSTATUS status;
3293 struct pdb_methods *methods;
3294 const char *domain;
3295 PyObject *py_td_info;
3296 struct pdb_trusted_domain td_info;
3297 PyObject *py_tmp;
3298 Py_ssize_t len;
3299
3300 if (!PyArg_ParseTuple(args, "sO!:set_trusted_domain", &domain, &PyDict_Type, &py_td_info)) {
3301 talloc_free(frame);
3302 return NULL;
3303 }
3304
3305 py_tmp = PyDict_GetItemString(py_td_info, "domain_name");
3306 td_info.domain_name = discard_const_p(char, PyUnicode_AsUTF8(py_tmp));
3307
3308 py_tmp = PyDict_GetItemString(py_td_info, "netbios_name");
3309 td_info.netbios_name = discard_const_p(char, PyUnicode_AsUTF8(py_tmp));
3310
3311 py_tmp = PyDict_GetItemString(py_td_info, "security_identifier");
3312 td_info.security_identifier = *pytalloc_get_type(py_tmp, struct dom_sid);
3313
3314 py_tmp = PyDict_GetItemString(py_td_info, "trust_auth_incoming");
3315 PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_incoming.data, &len);
3316 td_info.trust_auth_incoming.length = len;
3317
3318 py_tmp = PyDict_GetItemString(py_td_info, "trust_auth_outgoing");
3319 PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_auth_outgoing.data, &len);
3320 td_info.trust_auth_outgoing.length = len;
3321
3322 py_tmp = PyDict_GetItemString(py_td_info, "trust_direction");
3323 td_info.trust_direction = PyInt_AsLong(py_tmp);
3324
3325 py_tmp = PyDict_GetItemString(py_td_info, "trust_type");
3326 td_info.trust_type = PyInt_AsLong(py_tmp);
3327
3328 py_tmp = PyDict_GetItemString(py_td_info, "trust_attributes");
3329 td_info.trust_attributes = PyInt_AsLong(py_tmp);
3330
3331 py_tmp = PyDict_GetItemString(py_td_info, "trust_forest_trust_info");
3332 PyBytes_AsStringAndSize(py_tmp, (char **)&td_info.trust_forest_trust_info.data, &len);
3333 td_info.trust_forest_trust_info.length = len;
3334
3335 methods = pytalloc_get_ptr(self);
3336
3337 status = methods->set_trusted_domain(methods, domain, &td_info);
3338 if (!NT_STATUS_IS_OK(status)) {
3339 PyErr_Format(py_pdb_error, "Unable to set trusted domain information, (%d,%s)",
3340 NT_STATUS_V(status),
3341 get_friendly_nt_error_msg(status));
3342 talloc_free(frame);
3343 return NULL;
3344 }
3345
3346 talloc_free(frame);
3347 Py_RETURN_NONE;
3348 }
3349
3350
py_pdb_del_trusted_domain(PyObject * self,PyObject * args)3351 static PyObject *py_pdb_del_trusted_domain(PyObject *self, PyObject *args)
3352 {
3353 TALLOC_CTX *frame = talloc_stackframe();
3354 NTSTATUS status;
3355 struct pdb_methods *methods;
3356 const char *domain;
3357
3358 if (!PyArg_ParseTuple(args, "s:del_trusted_domain", &domain)) {
3359 talloc_free(frame);
3360 return NULL;
3361 }
3362
3363 methods = pytalloc_get_ptr(self);
3364
3365 status = methods->del_trusted_domain(methods, domain);
3366 if (!NT_STATUS_IS_OK(status)) {
3367 PyErr_Format(py_pdb_error, "Unable to delete trusted domain, (%d,%s)",
3368 NT_STATUS_V(status),
3369 get_friendly_nt_error_msg(status));
3370 talloc_free(frame);
3371 return NULL;
3372 }
3373
3374 talloc_free(frame);
3375 Py_RETURN_NONE;
3376 }
3377
3378
py_pdb_enum_trusted_domains(PyObject * self,PyObject * args)3379 static PyObject *py_pdb_enum_trusted_domains(PyObject *self, PyObject *args)
3380 {
3381 TALLOC_CTX *frame = talloc_stackframe();
3382 NTSTATUS status;
3383 struct pdb_methods *methods;
3384 uint32_t num_domains;
3385 struct pdb_trusted_domain **td_info;
3386 PyObject *py_td_info, *py_domain_info;
3387 int i;
3388
3389 methods = pytalloc_get_ptr(self);
3390
3391 status = methods->enum_trusted_domains(methods, frame, &num_domains, &td_info);
3392 if (!NT_STATUS_IS_OK(status)) {
3393 PyErr_Format(py_pdb_error, "Unable to delete trusted domain, (%d,%s)",
3394 NT_STATUS_V(status),
3395 get_friendly_nt_error_msg(status));
3396 talloc_free(frame);
3397 return NULL;
3398 }
3399
3400 py_td_info = PyList_New(0);
3401 if (py_td_info == NULL) {
3402 PyErr_NoMemory();
3403 talloc_free(frame);
3404 return NULL;
3405 }
3406
3407 for (i=0; i<num_domains; i++) {
3408 int res = 0;
3409 struct pdb_trusted_domain *td = td_info[i];
3410 PyObject *py_sid =
3411 pytalloc_steal(dom_sid_Type, &td->security_identifier);
3412
3413 py_domain_info = Py_BuildValue(
3414 "{s:s, s:s, s:O,"
3415 " s:"PYARG_BYTES_LEN","
3416 " s:"PYARG_BYTES_LEN","
3417 " s:l, s:l, s:l,"
3418 " s:"PYARG_BYTES_LEN"}",
3419 "domain_name", td->domain_name,
3420 "netbios_name", td->netbios_name,
3421 "security_identifier", py_sid,
3422 "trust_auth_incoming",
3423 (const char *)td->trust_auth_incoming.data,
3424 td->trust_auth_incoming.length,
3425 "trust_auth_outgoing",
3426 (const char *)td->trust_auth_outgoing.data,
3427 td->trust_auth_outgoing.length,
3428 "trust_direction", td->trust_direction,
3429 "trust_type", td->trust_type,
3430 "trust_attributes", td->trust_attributes,
3431 "trust_forest_trust_info",
3432 (const char *)td->trust_forest_trust_info.data,
3433 td->trust_forest_trust_info.length);
3434 Py_CLEAR(py_sid);
3435
3436 if (py_domain_info == NULL) {
3437 Py_CLEAR(py_td_info);
3438 break;
3439 }
3440 res = PyList_Append(py_td_info, py_domain_info);
3441 Py_CLEAR(py_domain_info);
3442 if (res == -1) {
3443 Py_CLEAR(py_td_info);
3444 break;
3445 }
3446 }
3447
3448 talloc_free(frame);
3449 return py_td_info;
3450 }
3451
3452
py_pdb_get_secret(PyObject * self,PyObject * args)3453 static PyObject *py_pdb_get_secret(PyObject *self, PyObject *args)
3454 {
3455 TALLOC_CTX *frame = talloc_stackframe();
3456 NTSTATUS status;
3457 struct pdb_methods *methods;
3458 const char *secret_name;
3459 DATA_BLOB secret_current, secret_old;
3460 NTTIME secret_current_lastchange, secret_old_lastchange;
3461 PyObject *py_sd;
3462 struct security_descriptor *sd;
3463 PyObject *py_secret;
3464
3465 if (!PyArg_ParseTuple(args, "s:get_secret_name", &secret_name)) {
3466 talloc_free(frame);
3467 return NULL;
3468 }
3469
3470 methods = pytalloc_get_ptr(self);
3471
3472 py_sd = pytalloc_new(struct security_descriptor, security_Type);
3473 if (py_sd == NULL) {
3474 PyErr_NoMemory();
3475 talloc_free(frame);
3476 return NULL;
3477 }
3478 sd = pytalloc_get_ptr(py_sd);
3479
3480 status = methods->get_secret(methods, frame, secret_name,
3481 &secret_current,
3482 &secret_current_lastchange,
3483 &secret_old,
3484 &secret_old_lastchange,
3485 &sd);
3486 if (!NT_STATUS_IS_OK(status)) {
3487 PyErr_Format(py_pdb_error, "Unable to get information for secret (%s), (%d,%s)",
3488 secret_name,
3489 NT_STATUS_V(status),
3490 get_friendly_nt_error_msg(status));
3491 talloc_free(frame);
3492 return NULL;
3493 }
3494
3495 py_secret = Py_BuildValue(
3496 "{s:"PYARG_BYTES_LEN","
3497 " s:K"
3498 " s:"PYARG_BYTES_LEN","
3499 " s:K, s:O}",
3500 "secret_current", (const char*)secret_current.data,
3501 secret_current.length,
3502 "secret_current_lastchange", secret_current_lastchange,
3503 "secret_old", (const char*)secret_old.data,
3504 secret_old.length,
3505 "secret_old_lastchange", secret_old_lastchange,
3506 "sd", py_sd);
3507
3508 Py_CLEAR(py_sd);
3509 if (py_secret == NULL) {
3510 talloc_free(frame);
3511 return NULL;
3512 }
3513
3514 talloc_free(frame);
3515 return py_secret;
3516 }
3517
3518
py_pdb_set_secret(PyObject * self,PyObject * args)3519 static PyObject *py_pdb_set_secret(PyObject *self, PyObject *args)
3520 {
3521 TALLOC_CTX *frame = talloc_stackframe();
3522 NTSTATUS status;
3523 struct pdb_methods *methods;
3524 const char *secret_name;
3525 PyObject *py_secret;
3526 PyObject *py_secret_cur, *py_secret_old, *py_sd;
3527 DATA_BLOB secret_current, secret_old;
3528 struct security_descriptor *sd;
3529 Py_ssize_t len;
3530
3531 if (!PyArg_ParseTuple(args, "sO!:set_secret_name", &secret_name, PyDict_Type, &py_secret)) {
3532 talloc_free(frame);
3533 return NULL;
3534 }
3535
3536 py_secret_cur = PyDict_GetItemString(py_secret, "secret_current");
3537 py_secret_old = PyDict_GetItemString(py_secret, "secret_old");
3538 py_sd = PyDict_GetItemString(py_secret, "sd");
3539
3540 PY_CHECK_TYPE(&PyBytes_Type, py_secret_cur, return NULL;);
3541 PY_CHECK_TYPE(&PyBytes_Type, py_secret_old, return NULL;);
3542 PY_CHECK_TYPE(security_Type, py_sd, return NULL;);
3543
3544 methods = pytalloc_get_ptr(self);
3545
3546 PyBytes_AsStringAndSize(py_secret_cur, (char **)&secret_current.data, &len);
3547 secret_current.length = len;
3548 PyBytes_AsStringAndSize(py_secret_old, (char **)&secret_old.data, &len);
3549 secret_current.length = len;
3550 sd = pytalloc_get_ptr(py_sd);
3551
3552 status = methods->set_secret(methods, secret_name, &secret_current, &secret_old, sd);
3553 if (!NT_STATUS_IS_OK(status)) {
3554 PyErr_Format(py_pdb_error, "Unable to set information for secret (%s), (%d,%s)",
3555 secret_name,
3556 NT_STATUS_V(status),
3557 get_friendly_nt_error_msg(status));
3558 talloc_free(frame);
3559 return NULL;
3560 }
3561
3562 talloc_free(frame);
3563 Py_RETURN_NONE;
3564 }
3565
3566
py_pdb_delete_secret(PyObject * self,PyObject * args)3567 static PyObject *py_pdb_delete_secret(PyObject *self, PyObject *args)
3568 {
3569 TALLOC_CTX *frame = talloc_stackframe();
3570 NTSTATUS status;
3571 struct pdb_methods *methods;
3572 const char *secret_name;
3573
3574 if (!PyArg_ParseTuple(args, "s:delete_secret", &secret_name)) {
3575 talloc_free(frame);
3576 return NULL;
3577 }
3578
3579 methods = pytalloc_get_ptr(self);
3580
3581 status = methods->delete_secret(methods, secret_name);
3582 if (!NT_STATUS_IS_OK(status)) {
3583 PyErr_Format(py_pdb_error, "Unable to delete secret (%s), (%d,%s)",
3584 secret_name,
3585 NT_STATUS_V(status),
3586 get_friendly_nt_error_msg(status));
3587 talloc_free(frame);
3588 return NULL;
3589 }
3590
3591 talloc_free(frame);
3592 Py_RETURN_NONE;
3593 }
3594
3595 static PyMethodDef py_pdb_methods[] = {
3596 { "domain_info", py_pdb_domain_info, METH_NOARGS,
3597 "domain_info() -> str\n\n \
3598 Get domain information for the database." },
3599 { "getsampwnam", py_pdb_getsampwnam, METH_VARARGS,
3600 "getsampwnam(username) -> samu object\n\n \
3601 Get user information by name." },
3602 { "getsampwsid", py_pdb_getsampwsid, METH_VARARGS,
3603 "getsampwsid(user_sid) -> samu object\n\n \
3604 Get user information by sid (dcerpc.security.dom_sid object)." },
3605 { "create_user", py_pdb_create_user, METH_VARARGS,
3606 "create_user(username, acct_flags) -> rid\n\n \
3607 Create user. acct_flags are samr account control flags." },
3608 { "delete_user", py_pdb_delete_user, METH_VARARGS,
3609 "delete_user(samu object) -> None\n\n \
3610 Delete user." },
3611 { "add_sam_account", py_pdb_add_sam_account, METH_VARARGS,
3612 "add_sam_account(samu object) -> None\n\n \
3613 Add SAM account." },
3614 { "update_sam_account", py_pdb_update_sam_account, METH_VARARGS,
3615 "update_sam_account(samu object) -> None\n\n \
3616 Update SAM account." },
3617 { "delete_sam_account", py_pdb_delete_sam_account, METH_VARARGS,
3618 "delete_sam_account(samu object) -> None\n\n \
3619 Delete SAM account." },
3620 { "rename_sam_account", py_pdb_rename_sam_account, METH_VARARGS,
3621 "rename_sam_account(samu object1, new_username) -> None\n\n \
3622 Rename SAM account." },
3623 /* update_login_attempts */
3624 { "getgrsid", py_pdb_getgrsid, METH_VARARGS,
3625 "getgrsid(group_sid) -> groupmap object\n\n \
3626 Get group information by sid (dcerpc.security.dom_sid object)." },
3627 { "getgrgid", py_pdb_getgrgid, METH_VARARGS,
3628 "getgrsid(gid) -> groupmap object\n\n \
3629 Get group information by gid." },
3630 { "getgrnam", py_pdb_getgrnam, METH_VARARGS,
3631 "getgrsid(groupname) -> groupmap object\n\n \
3632 Get group information by name." },
3633 { "create_dom_group", py_pdb_create_dom_group, METH_VARARGS,
3634 "create_dom_group(groupname) -> group_rid\n\n \
3635 Create new domain group by name." },
3636 { "delete_dom_group", py_pdb_delete_dom_group, METH_VARARGS,
3637 "delete_dom_group(group_rid) -> None\n\n \
3638 Delete domain group identified by rid" },
3639 { "add_group_mapping_entry", py_pdb_add_group_mapping_entry, METH_VARARGS,
3640 "add_group_mapping_entry(groupmap) -> None\n \
3641 Add group mapping entry for groupmap object." },
3642 { "update_group_mapping_entry", py_pdb_update_group_mapping_entry, METH_VARARGS,
3643 "update_group_mapping_entry(groupmap) -> None\n\n \
3644 Update group mapping entry for groupmap object." },
3645 { "delete_group_mapping_entry", py_pdb_delete_group_mapping_entry, METH_VARARGS,
3646 "delete_group_mapping_entry(groupmap) -> None\n\n \
3647 Delete group mapping entry for groupmap object." },
3648 { "enum_group_mapping", py_pdb_enum_group_mapping, METH_VARARGS,
3649 "enum_group_mapping([domain_sid, [type, [unix_only]]]) -> List\n\n \
3650 Return list of group mappings as groupmap objects. Optional arguments are domain_sid object, type of group, unix only flag." },
3651 { "enum_group_members", py_pdb_enum_group_members, METH_VARARGS,
3652 "enum_group_members(group_sid) -> List\n\n \
3653 Return list of users (dom_sid object) in group." },
3654 { "enum_group_memberships", py_pdb_enum_group_memberships, METH_VARARGS,
3655 "enum_group_memberships(samu object) -> List\n\n \
3656 Return list of groups (dom_sid object) this user is part of." },
3657 /* set_unix_primary_group */
3658 { "add_groupmem", py_pdb_add_groupmem, METH_VARARGS,
3659 "add_groupmem(group_rid, member_rid) -> None\n\n \
3660 Add user to group." },
3661 { "del_groupmem", py_pdb_del_groupmem, METH_VARARGS,
3662 "del_groupmem(group_rid, member_rid) -> None\n\n \
3663 Remove user from from group." },
3664 { "create_alias", py_pdb_create_alias, METH_VARARGS,
3665 "create_alias(alias_name) -> alias_rid\n\n \
3666 Create alias entry." },
3667 { "delete_alias", py_pdb_delete_alias, METH_VARARGS,
3668 "delete_alias(alias_sid) -> None\n\n \
3669 Delete alias entry." },
3670 { "get_aliasinfo", py_pdb_get_aliasinfo, METH_VARARGS,
3671 "get_aliasinfo(alias_sid) -> Mapping\n\n \
3672 Get alias information as a dictionary with keys - acct_name, acct_desc, rid." },
3673 { "set_aliasinfo", py_pdb_set_aliasinfo, METH_VARARGS,
3674 "set_alias_info(alias_sid, Mapping) -> None\n\n \
3675 Set alias information from a dictionary with keys - acct_name, acct_desc." },
3676 { "add_aliasmem", py_pdb_add_aliasmem, METH_VARARGS,
3677 "add_aliasmem(alias_sid, member_sid) -> None\n\n \
3678 Add user to alias entry." },
3679 { "del_aliasmem", py_pdb_del_aliasmem, METH_VARARGS,
3680 "del_aliasmem(alias_sid, member_sid) -> None\n\n \
3681 Remove a user from alias entry." },
3682 { "enum_aliasmem", py_pdb_enum_aliasmem, METH_VARARGS,
3683 "enum_aliasmem(alias_sid) -> List\n\n \
3684 Return a list of members (dom_sid object) for alias entry." },
3685 /* enum_alias_memberships */
3686 /* lookup_rids */
3687 /* lookup_names */
3688 { "get_account_policy", py_pdb_get_account_policy, METH_NOARGS,
3689 "get_account_policy() -> Mapping\n\n \
3690 Get account policy information as a dictionary." },
3691 { "set_account_policy", py_pdb_set_account_policy, METH_VARARGS,
3692 "get_account_policy(Mapping) -> None\n\n \
3693 Set account policy settings from a dicionary." },
3694 /* get_seq_num */
3695 { "search_users", py_pdb_search_users, METH_VARARGS,
3696 "search_users(acct_flags) -> List\n\n \
3697 Search users. acct_flags are samr account control flags.\n \
3698 Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
3699 { "search_groups", py_pdb_search_groups, METH_NOARGS,
3700 "search_groups() -> List\n\n \
3701 Search unix only groups. \n \
3702 Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
3703 { "search_aliases", py_pdb_search_aliases, METH_VARARGS,
3704 "search_aliases([domain_sid]) -> List\n\n \
3705 Search aliases. domain_sid is dcerpc.security.dom_sid object.\n \
3706 Each list entry is dictionary with keys - idx, rid, acct_flags, account_name, fullname, description." },
3707 { "uid_to_sid", py_pdb_uid_to_sid, METH_VARARGS,
3708 "uid_to_sid(uid) -> sid\n\n \
3709 Return sid for given user id." },
3710 { "gid_to_sid", py_pdb_gid_to_sid, METH_VARARGS,
3711 "gid_to_sid(gid) -> sid\n\n \
3712 Return sid for given group id." },
3713 { "sid_to_id", py_pdb_sid_to_id, METH_VARARGS,
3714 "sid_to_id(sid) -> Tuple\n\n \
3715 Return id and type for given sid." },
3716 /* capabilities */
3717 { "new_rid", py_pdb_new_rid, METH_NOARGS,
3718 "new_rid() -> rid\n\n \
3719 Get a new rid." },
3720 { "get_trusteddom_pw", py_pdb_get_trusteddom_pw, METH_VARARGS,
3721 "get_trusteddom_pw(domain) -> Mapping\n\n \
3722 Get trusted domain password, sid and last set time in a dictionary." },
3723 { "set_trusteddom_pw", py_pdb_set_trusteddom_pw, METH_VARARGS,
3724 "set_trusteddom_pw(domain, pwd, sid) -> None\n\n \
3725 Set trusted domain password." },
3726 { "del_trusteddom_pw", py_pdb_del_trusteddom_pw, METH_VARARGS,
3727 "del_trusteddom_pw(domain) -> None\n\n \
3728 Delete trusted domain password." },
3729 { "enum_trusteddoms", py_pdb_enum_trusteddoms, METH_NOARGS,
3730 "enum_trusteddoms() -> List\n\n \
3731 Get list of trusted domains. Each item is a dictionary with name and sid keys" },
3732 { "get_trusted_domain", py_pdb_get_trusted_domain, METH_VARARGS,
3733 "get_trusted_domain(domain) -> Mapping\n\n \
3734 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." },
3735 { "get_trusted_domain_by_sid", py_pdb_get_trusted_domain_by_sid, METH_VARARGS,
3736 "get_trusted_domain_by_sid(domain_sid) -> Mapping\n\n \
3737 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" },
3738 { "set_trusted_domain", py_pdb_set_trusted_domain, METH_VARARGS,
3739 "set_trusted_domain(domain, Mapping) -> None\n\n \
3740 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." },
3741 { "del_trusted_domain", py_pdb_del_trusted_domain, METH_VARARGS,
3742 "del_trusted_domain(domain) -> None\n\n \
3743 Delete trusted domain." },
3744 { "enum_trusted_domains", py_pdb_enum_trusted_domains, METH_VARARGS,
3745 "enum_trusted_domains() -> List\n\n \
3746 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." },
3747 { "get_secret", py_pdb_get_secret, METH_VARARGS,
3748 "get_secret(secret_name) -> Mapping\n\n \
3749 Get secret information for secret_name. Information is a dictionary with keys - secret_current, secret_current_lastchange, secret_old, secret_old_lastchange, sd." },
3750 { "set_secret", py_pdb_set_secret, METH_VARARGS,
3751 "set_secret(secret_name, Mapping) -> None\n\n \
3752 Set secret information for secret_name using dictionary with keys - secret_current, sd." },
3753 { "delete_secret", py_pdb_delete_secret, METH_VARARGS,
3754 "delete_secret(secret_name) -> None\n\n \
3755 Delete secret information for secret_name." },
3756 { NULL },
3757 };
3758
3759
py_pdb_new(PyTypeObject * type,PyObject * args,PyObject * kwargs)3760 static PyObject *py_pdb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3761 {
3762 TALLOC_CTX *frame = talloc_stackframe();
3763 const char *url = NULL;
3764 PyObject *pypdb;
3765 NTSTATUS status;
3766 struct pdb_methods *methods;
3767
3768 if (!PyArg_ParseTuple(args, "s", &url)) {
3769 talloc_free(frame);
3770 return NULL;
3771 }
3772
3773 /* Initialize list of methods */
3774 status = make_pdb_method_name(&methods, url);
3775 if (!NT_STATUS_IS_OK(status)) {
3776 PyErr_Format(py_pdb_error, "Cannot load backend methods for '%s' backend (%d,%s)",
3777 url,
3778 NT_STATUS_V(status),
3779 get_friendly_nt_error_msg(status));
3780 talloc_free(frame);
3781 return NULL;
3782 }
3783
3784 if ((pypdb = pytalloc_steal(type, methods)) == NULL) {
3785 PyErr_NoMemory();
3786 talloc_free(frame);
3787 return NULL;
3788 }
3789
3790 talloc_free(frame);
3791 return pypdb;
3792 }
3793
3794
3795 static PyTypeObject PyPDB = {
3796 .tp_name = "passdb.PDB",
3797 .tp_new = py_pdb_new,
3798 .tp_flags = Py_TPFLAGS_DEFAULT,
3799 .tp_methods = py_pdb_methods,
3800 .tp_doc = "PDB(url[, read_write_flags]) -> Password DB object\n",
3801 };
3802
3803
3804 /*
3805 * Return a list of passdb backends
3806 */
py_passdb_backends(PyObject * self,PyObject * unused)3807 static PyObject *py_passdb_backends(PyObject *self, PyObject *unused)
3808 {
3809 TALLOC_CTX *frame = talloc_stackframe();
3810 PyObject *py_blist;
3811 const struct pdb_init_function_entry *entry;
3812
3813 entry = pdb_get_backends();
3814 if(! entry) {
3815 Py_RETURN_NONE;
3816 }
3817
3818 if((py_blist = PyList_New(0)) == NULL) {
3819 PyErr_NoMemory();
3820 talloc_free(frame);
3821 return NULL;
3822 }
3823
3824 while(entry) {
3825 int res = 0;
3826 PyObject *entry_name = PyUnicode_FromString(entry->name);
3827 if (entry_name) {
3828 res = PyList_Append(py_blist, entry_name);
3829 } else {
3830 Py_CLEAR(entry_name);
3831 Py_CLEAR(py_blist);
3832 break;
3833 }
3834 Py_CLEAR(entry_name);
3835 if (res == -1) {
3836 Py_CLEAR(py_blist);
3837 break;
3838 }
3839 entry = entry->next;
3840 }
3841
3842 talloc_free(frame);
3843 return py_blist;
3844 }
3845
3846
py_set_smb_config(PyObject * self,PyObject * args)3847 static PyObject *py_set_smb_config(PyObject *self, PyObject *args)
3848 {
3849 TALLOC_CTX *frame = talloc_stackframe();
3850 const char *smb_config;
3851
3852 if (!PyArg_ParseTuple(args, "s", &smb_config)) {
3853 talloc_free(frame);
3854 return NULL;
3855 }
3856
3857 /* Load smbconf parameters */
3858 if (!lp_load_global(smb_config)) {
3859 PyErr_Format(py_pdb_error, "Cannot open '%s'", smb_config);
3860 talloc_free(frame);
3861 return NULL;
3862 }
3863
3864 talloc_free(frame);
3865 Py_RETURN_NONE;
3866 }
3867
3868
py_set_secrets_dir(PyObject * self,PyObject * args)3869 static PyObject *py_set_secrets_dir(PyObject *self, PyObject *args)
3870 {
3871 TALLOC_CTX *frame = talloc_stackframe();
3872 const char *private_dir;
3873
3874 if (!PyArg_ParseTuple(args, "s", &private_dir)) {
3875 talloc_free(frame);
3876 return NULL;
3877 }
3878
3879 /* Initialize secrets database */
3880 if (!secrets_init_path(private_dir)) {
3881 PyErr_Format(py_pdb_error, "Cannot open secrets file database in '%s'",
3882 private_dir);
3883 talloc_free(frame);
3884 return NULL;
3885 }
3886
3887 talloc_free(frame);
3888 Py_RETURN_NONE;
3889 }
3890
py_reload_static_pdb(PyObject * self,PyObject * args)3891 static PyObject *py_reload_static_pdb(PyObject *self, PyObject *args)
3892 {
3893 TALLOC_CTX *frame = talloc_stackframe();
3894
3895 /* Initialize secrets database */
3896 if (!initialize_password_db(true, NULL)) {
3897 PyErr_Format(py_pdb_error, "Cannot re-open passdb backend %s", lp_passdb_backend());
3898 talloc_free(frame);
3899 return NULL;
3900 }
3901
3902 talloc_free(frame);
3903 Py_RETURN_NONE;
3904 }
3905
py_get_domain_sid(PyObject * self,PyObject * unused)3906 static PyObject *py_get_domain_sid(PyObject *self, PyObject *unused)
3907 {
3908 TALLOC_CTX *frame = talloc_stackframe();
3909 struct dom_sid domain_sid, *domain_sid_copy;
3910 PyObject *py_dom_sid = Py_None;
3911 bool ret = false;
3912
3913 ret = secrets_fetch_domain_sid(lp_workgroup(), &domain_sid);
3914 if (!ret) {
3915 talloc_free(frame);
3916 return PyErr_NoMemory();
3917 }
3918
3919 domain_sid_copy = dom_sid_dup(frame, &domain_sid);
3920 if (domain_sid_copy == NULL) {
3921 talloc_free(frame);
3922 return PyErr_NoMemory();
3923 }
3924
3925 py_dom_sid = pytalloc_steal(dom_sid_Type, domain_sid_copy);
3926
3927 talloc_free(frame);
3928 return py_dom_sid;
3929 }
3930
py_get_global_sam_sid(PyObject * self,PyObject * unused)3931 static PyObject *py_get_global_sam_sid(PyObject *self, PyObject *unused)
3932 {
3933 TALLOC_CTX *frame = talloc_stackframe();
3934 struct dom_sid *domain_sid, *domain_sid_copy;
3935 PyObject *py_dom_sid;
3936
3937 domain_sid = get_global_sam_sid();
3938
3939 domain_sid_copy = dom_sid_dup(frame, domain_sid);
3940 if (domain_sid_copy == NULL) {
3941 PyErr_NoMemory();
3942 talloc_free(frame);
3943 return NULL;
3944 }
3945
3946 py_dom_sid = pytalloc_steal(dom_sid_Type, domain_sid_copy);
3947
3948 talloc_free(frame);
3949 return py_dom_sid;
3950 }
3951
3952
3953 static PyMethodDef py_passdb_methods[] = {
3954 { "get_backends", py_passdb_backends, METH_NOARGS,
3955 "get_backends() -> list\n\n \
3956 Get a list of password database backends supported." },
3957 { "set_smb_config", py_set_smb_config, METH_VARARGS,
3958 "set_smb_config(path) -> None\n\n \
3959 Set path to smb.conf file to load configuration parameters." },
3960 { "set_secrets_dir", py_set_secrets_dir, METH_VARARGS,
3961 "set_secrets_dir(private_dir) -> None\n\n \
3962 Set path to private directory to load secrets database from non-default location." },
3963 { "get_global_sam_sid", py_get_global_sam_sid, METH_NOARGS,
3964 "get_global_sam_sid() -> dom_sid\n\n \
3965 Return domain SID." },
3966 { "get_domain_sid", py_get_domain_sid, METH_NOARGS,
3967 "get_domain_sid() -> dom_sid\n\n \
3968 Return domain SID from secrets database." },
3969 { "reload_static_pdb", py_reload_static_pdb, METH_NOARGS,
3970 "reload_static_pdb() -> None\n\n \
3971 Re-initialise the static pdb used internally. Needed if 'passdb backend' is changed." },
3972 { NULL },
3973 };
3974
3975 static struct PyModuleDef moduledef = {
3976 PyModuleDef_HEAD_INIT,
3977 .m_name = "passdb",
3978 .m_doc = "SAMBA Password Database",
3979 .m_size = -1,
3980 .m_methods = py_passdb_methods,
3981 };
3982
MODULE_INIT_FUNC(passdb)3983 MODULE_INIT_FUNC(passdb)
3984 {
3985 TALLOC_CTX *frame = talloc_stackframe();
3986 PyObject *m = NULL, *mod = NULL;
3987 char exception_name[] = "passdb.error";
3988
3989 if (pytalloc_BaseObject_PyType_Ready(&PyPDB) < 0) {
3990 talloc_free(frame);
3991 return NULL;
3992 }
3993
3994 if (pytalloc_BaseObject_PyType_Ready(&PySamu) < 0) {
3995 talloc_free(frame);
3996 return NULL;
3997 }
3998
3999 if (pytalloc_BaseObject_PyType_Ready(&PyGroupmap) < 0) {
4000 talloc_free(frame);
4001 return NULL;
4002 }
4003
4004 m = PyModule_Create(&moduledef);
4005 if (m == NULL) {
4006 talloc_free(frame);
4007 return NULL;
4008 }
4009
4010 /* Create new exception for passdb module */
4011 py_pdb_error = PyErr_NewException(exception_name, NULL, NULL);
4012 Py_INCREF(py_pdb_error);
4013 PyModule_AddObject(m, "error", py_pdb_error);
4014
4015 Py_INCREF(&PyPDB);
4016 PyModule_AddObject(m, "PDB", (PyObject *)&PyPDB);
4017
4018 Py_INCREF(&PySamu);
4019 PyModule_AddObject(m, "Samu", (PyObject *)&PySamu);
4020
4021 Py_INCREF(&PyGroupmap);
4022 PyModule_AddObject(m, "Groupmap", (PyObject *)&PyGroupmap);
4023
4024 /* Import dom_sid type from dcerpc.security */
4025 mod = PyImport_ImportModule("samba.dcerpc.security");
4026 if (mod == NULL) {
4027 talloc_free(frame);
4028 return NULL;
4029 }
4030
4031 dom_sid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "dom_sid");
4032 if (dom_sid_Type == NULL) {
4033 Py_DECREF(mod);
4034 talloc_free(frame);
4035 return NULL;
4036 }
4037
4038 /* Import security_descriptor type from dcerpc.security */
4039 security_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "descriptor");
4040 Py_DECREF(mod);
4041 if (security_Type == NULL) {
4042 Py_DECREF(dom_sid_Type);
4043 talloc_free(frame);
4044 return NULL;
4045 }
4046
4047 /* Import GUID type from dcerpc.misc */
4048 mod = PyImport_ImportModule("samba.dcerpc.misc");
4049 if (mod == NULL) {
4050 Py_DECREF(security_Type);
4051 Py_DECREF(dom_sid_Type);
4052 talloc_free(frame);
4053 return NULL;
4054 }
4055
4056 guid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "GUID");
4057 Py_DECREF(mod);
4058 if (guid_Type == NULL) {
4059 Py_DECREF(security_Type);
4060 Py_DECREF(dom_sid_Type);
4061 talloc_free(frame);
4062 return NULL;
4063 }
4064 talloc_free(frame);
4065 return m;
4066 }
4067