2 Unix SMB/CIFS implementation.
4 Copyright (C) Simo Sorce 2002
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 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 extern GUMS_FUNCTIONS *gums_storage;
25 /* Functions to get/set info from a GUMS object */
27 NTSTATUS gums_get_object_type(uint32 *type, const GUMS_OBJECT *obj)
30 return NT_STATUS_INVALID_PARAMETER;
36 NTSTATUS gums_create_object(GUMS_OBJECT **obj, uint32 type)
38 TALLOC_CTX *mem_ctx = talloc_init("gums_create_object");
42 go = talloc_zero(mem_ctx, sizeof(GUMS_OBJECT));
43 go->mem_ctx = mem_ctx;
45 go->version = GUMS_OBJECT_VERSION;
52 case GUMS_OBJ_WORKSTATION_TRUST:
53 case GUMS_OBJ_SERVER_TRUST:
54 case GUMS_OBJ_DOMAIN_TRUST:
56 case GUMS_OBJ_NORMAL_USER:
57 go->data = (GUMS_USER *)talloc_zero(mem_ctx, sizeof(GUMS_USER));
62 go->data = (GUMS_GROUP *)talloc_zero(mem_ctx, sizeof(GUMS_GROUP));
66 /* TODO: throw error */
67 ret = NT_STATUS_OBJECT_TYPE_MISMATCH;
72 ret = NT_STATUS_NO_MEMORY;
73 DEBUG(0, ("gums_create_object: Out of memory!\n"));
81 talloc_destroy(go->mem_ctx);
86 NTSTATUS gums_get_object_seq_num(uint32 *version, const GUMS_OBJECT *obj)
89 return NT_STATUS_INVALID_PARAMETER;
91 *version = obj->version;
95 NTSTATUS gums_set_object_seq_num(GUMS_OBJECT *obj, uint32 version)
98 return NT_STATUS_INVALID_PARAMETER;
100 obj->version = version;
104 NTSTATUS gums_get_sec_desc(SEC_DESC **sec_desc, const GUMS_OBJECT *obj)
106 if (!sec_desc || !obj)
107 return NT_STATUS_INVALID_PARAMETER;
109 *sec_desc = obj->sec_desc;
113 NTSTATUS gums_set_sec_desc(GUMS_OBJECT *obj, const SEC_DESC *sec_desc)
115 if (!obj || !sec_desc)
116 return NT_STATUS_INVALID_PARAMETER;
118 obj->sec_desc = dup_sec_desc(obj->mem_ctx, sec_desc);
119 if (!(obj->sec_desc)) return NT_STATUS_UNSUCCESSFUL;
123 NTSTATUS gums_get_object_sid(DOM_SID **sid, const GUMS_OBJECT *obj)
126 return NT_STATUS_INVALID_PARAMETER;
132 NTSTATUS gums_set_object_sid(GUMS_OBJECT *obj, const DOM_SID *sid)
135 return NT_STATUS_INVALID_PARAMETER;
137 obj->sid = sid_dup_talloc(obj->mem_ctx, sid);
138 if (!(obj->sid)) return NT_STATUS_UNSUCCESSFUL;
142 NTSTATUS gums_get_object_name(char **name, const GUMS_OBJECT *obj)
145 return NT_STATUS_INVALID_PARAMETER;
151 NTSTATUS gums_set_object_name(GUMS_OBJECT *obj, const char *name)
154 return NT_STATUS_INVALID_PARAMETER;
156 obj->name = (char *)talloc_strdup(obj->mem_ctx, name);
157 if (!(obj->name)) return NT_STATUS_UNSUCCESSFUL;
161 NTSTATUS gums_get_object_description(char **description, const GUMS_OBJECT *obj)
163 if (!description || !obj)
164 return NT_STATUS_INVALID_PARAMETER;
166 *description = obj->description;
170 NTSTATUS gums_set_object_description(GUMS_OBJECT *obj, const char *description)
172 if (!obj || !description)
173 return NT_STATUS_INVALID_PARAMETER;
175 obj->description = (char *)talloc_strdup(obj->mem_ctx, description);
176 if (!(obj->description)) return NT_STATUS_UNSUCCESSFUL;
180 /* User specific functions */
183 NTSTATUS gums_get_object_privileges(PRIVILEGE_SET **priv_set, const GUMS_OBJECT *obj)
186 return NT_STATUS_INVALID_PARAMETER;
188 *priv_set = obj->priv_set;
193 NTSTATUS gums_get_user_pri_group(DOM_SID **sid, const GUMS_OBJECT *obj)
196 return NT_STATUS_INVALID_PARAMETER;
198 if (obj->type != GUMS_OBJ_NORMAL_USER)
199 return NT_STATUS_OBJECT_TYPE_MISMATCH;
201 *sid = obj->data.user->group_sid;
205 NTSTATUS gums_set_user_pri_group(GUMS_OBJECT *obj, const DOM_SID *sid)
208 return NT_STATUS_INVALID_PARAMETER;
210 if (obj->type != GUMS_OBJ_NORMAL_USER)
211 return NT_STATUS_OBJECT_TYPE_MISMATCH;
213 obj->data.user->group_sid = sid_dup_talloc(obj->mem_ctx, sid);
214 if (!(obj->data.user->group_sid)) return NT_STATUS_NO_MEMORY;
218 NTSTATUS gums_get_user_nt_pwd(DATA_BLOB **nt_pwd, const GUMS_OBJECT *obj)
221 return NT_STATUS_INVALID_PARAMETER;
223 if (obj->type != GUMS_OBJ_NORMAL_USER)
224 return NT_STATUS_OBJECT_TYPE_MISMATCH;
226 *nt_pwd = obj->data.user->nt_pw;
230 NTSTATUS gums_set_user_nt_pwd(GUMS_OBJECT *obj, const DATA_BLOB nt_pwd)
232 if (!obj || !nt_pwd || nt_pwd != NT_HASH_LEN)
233 return NT_STATUS_INVALID_PARAMETER;
235 if (obj->type != GUMS_OBJ_NORMAL_USER)
236 return NT_STATUS_OBJECT_TYPE_MISMATCH;
238 obj->data.user->nt_pwd = data_blob_talloc(obj->mem_ctx, nt_pwd.data, nt_pwd.lenght);
242 NTSTATUS gums_get_user_lm_pwd(DATA_BLOB **lm_pwd, const GUMS_OBJECT *obj)
245 return NT_STATUS_INVALID_PARAMETER;
247 if (obj->type != GUMS_OBJ_NORMAL_USER)
248 return NT_STATUS_OBJECT_TYPE_MISMATCH;
250 *lm_pwd = obj->data.user->lm_pw;
254 NTSTATUS gums_set_user_lm_pwd(GUMS_OBJECT *obj, const DATA_BLOB lm_pwd)
256 if (!obj || !lm_pwd || lm_pwd != LM_HASH_LEN)
257 return NT_STATUS_INVALID_PARAMETER;
259 if (obj->type != GUMS_OBJ_NORMAL_USER)
260 return NT_STATUS_OBJECT_TYPE_MISMATCH;
262 obj->data.user->lm_pwd = data_blob_talloc(obj->mem_ctx, lm_pwd.data, lm_pwd.lenght);
266 NTSTATUS gums_get_user_fullname(char **fullname, const GUMS_OBJECT *obj)
268 if (!fullname || !obj)
269 return NT_STATUS_INVALID_PARAMETER;
271 if (obj->type != GUMS_OBJ_NORMAL_USER)
272 return NT_STATUS_OBJECT_TYPE_MISMATCH;
274 *fullname = obj->data.user->full_name;
278 NTSTATUS gums_set_user_fullname(GUMS_OBJECT *obj, const char *fullname)
280 if (!obj || !fullname)
281 return NT_STATUS_INVALID_PARAMETER;
283 if (obj->type != GUMS_OBJ_NORMAL_USER)
284 return NT_STATUS_OBJECT_TYPE_MISMATCH;
286 obj->data.user->full_name = (char *)talloc_strdup(obj->mem_ctx, fullname);
287 if (!(obj->data.user->full_name)) return NT_STATUS_NO_MEMORY;
291 NTSTATUS gums_get_user_homedir(char **homedir, const GUMS_OBJECT *obj)
293 if (!homedir || !obj)
294 return NT_STATUS_INVALID_PARAMETER;
296 if (obj->type != GUMS_OBJ_NORMAL_USER)
297 return NT_STATUS_OBJECT_TYPE_MISMATCH;
299 *homedir = obj->data.user->home_dir;
303 NTSTATUS gums_set_user_homedir(GUMS_OBJECT *obj, const char *homedir)
305 if (!obj || !homedir)
306 return NT_STATUS_INVALID_PARAMETER;
308 if (obj->type != GUMS_OBJ_NORMAL_USER)
309 return NT_STATUS_OBJECT_TYPE_MISMATCH;
311 obj->data.user->home_dir = (char *)talloc_strdup(obj->mem_ctx, homedir);
312 if (!(obj->data.user->home_dir)) return NT_STATUS_NO_MEMORY;
316 NTSTATUS gums_get_user_dir_drive(char **dirdrive, const GUMS_OBJECT *obj)
318 if (!dirdrive || !obj)
319 return NT_STATUS_INVALID_PARAMETER;
321 if (obj->type != GUMS_OBJ_NORMAL_USER)
322 return NT_STATUS_OBJECT_TYPE_MISMATCH;
324 *dirdrive = obj->data.user->dir_drive;
328 NTSTATUS gums_set_user_dir_drive(GUMS_OBJECT *obj, const char *dir_drive)
330 if (!obj || !dir_drive)
331 return NT_STATUS_INVALID_PARAMETER;
333 if (obj->type != GUMS_OBJ_NORMAL_USER)
334 return NT_STATUS_OBJECT_TYPE_MISMATCH;
336 obj->data.user->dir_drive = (char *)talloc_strdup(obj->mem_ctx, dir_drive);
337 if (!(obj->data.user->dir_drive)) return NT_STATUS_NO_MEMORY;
341 NTSTATUS gums_get_user_logon_script(char **logon_script, const GUMS_OBJECT *obj)
343 if (!logon_script || !obj)
344 return NT_STATUS_INVALID_PARAMETER;
346 if (obj->type != GUMS_OBJ_NORMAL_USER)
347 return NT_STATUS_OBJECT_TYPE_MISMATCH;
349 *logon_script = obj->data.user->logon_script;
353 NTSTATUS gums_set_user_logon_script(GUMS_OBJECT *obj, const char *logon_script)
355 if (!obj || !logon_script)
356 return NT_STATUS_INVALID_PARAMETER;
358 if (obj->type != GUMS_OBJ_NORMAL_USER)
359 return NT_STATUS_OBJECT_TYPE_MISMATCH;
361 obj->data.user->logon_script = (char *)talloc_strdup(obj->mem_ctx, logon_script);
362 if (!(obj->data.user->logon_script)) return NT_STATUS_NO_MEMORY;
366 NTSTATUS gums_get_user_profile_path(char **profile_path, const GUMS_OBJECT *obj)
368 if (!profile_path || !obj)
369 return NT_STATUS_INVALID_PARAMETER;
371 if (obj->type != GUMS_OBJ_NORMAL_USER)
372 return NT_STATUS_OBJECT_TYPE_MISMATCH;
374 *profile_path = obj->data.user->profile_path;
378 NTSTATUS gums_set_user_profile_path(GUMS_OBJECT *obj, const char *profile_path)
380 if (!obj || !profile_path)
381 return NT_STATUS_INVALID_PARAMETER;
383 if (obj->type != GUMS_OBJ_NORMAL_USER)
384 return NT_STATUS_OBJECT_TYPE_MISMATCH;
386 obj->data.user->profile_path = (char *)talloc_strdup(obj->mem_ctx, profile_path);
387 if (!(obj->data.user->profile_path)) return NT_STATUS_NO_MEMORY;
391 NTSTATUS gums_get_user_workstations(char **workstations, const GUMS_OBJECT *obj)
393 if (!workstations || !obj)
394 return NT_STATUS_INVALID_PARAMETER;
396 if (obj->type != GUMS_OBJ_NORMAL_USER)
397 return NT_STATUS_OBJECT_TYPE_MISMATCH;
399 *workstations = obj->data.user->workstations;
403 NTSTATUS gums_set_user_workstations(GUMS_OBJECT *obj, const char *workstations)
405 if (!obj || !workstations)
406 return NT_STATUS_INVALID_PARAMETER;
408 if (obj->type != GUMS_OBJ_NORMAL_USER)
409 return NT_STATUS_OBJECT_TYPE_MISMATCH;
411 obj->data.user->workstations = (char *)talloc_strdup(obj->mem_ctx, workstations);
412 if (!(obj->data.user->workstations)) return NT_STATUS_NO_MEMORY;
416 NTSTATUS gums_get_user_unknown_str(char **unknown_str, const GUMS_OBJECT *obj)
418 if (!unknown_str || !obj)
419 return NT_STATUS_INVALID_PARAMETER;
421 if (obj->type != GUMS_OBJ_NORMAL_USER)
422 return NT_STATUS_OBJECT_TYPE_MISMATCH;
424 *unknown_str = obj->data.user->unknown_str;
428 NTSTATUS gums_set_user_unknown_str(GUMS_OBJECT *obj, const char *unknown_str)
430 if (!obj || !unknown_str)
431 return NT_STATUS_INVALID_PARAMETER;
433 if (obj->type != GUMS_OBJ_NORMAL_USER)
434 return NT_STATUS_OBJECT_TYPE_MISMATCH;
436 obj->data.user->unknown_str = (char *)talloc_strdup(obj->mem_ctx, unknown_str);
437 if (!(obj->data.user->unknown_str)) return NT_STATUS_NO_MEMORY;
441 NTSTATUS gums_get_user_munged_dial(char **munged_dial, const GUMS_OBJECT *obj)
443 if (!munged_dial || !obj)
444 return NT_STATUS_INVALID_PARAMETER;
446 if (obj->type != GUMS_OBJ_NORMAL_USER)
447 return NT_STATUS_OBJECT_TYPE_MISMATCH;
449 *munged_dial = obj->data.user->munged_dial;
453 NTSTATUS gums_set_user_munged_dial(GUMS_OBJECT *obj, const char *munged_dial)
455 if (!obj || !munged_dial)
456 return NT_STATUS_INVALID_PARAMETER;
458 if (obj->type != GUMS_OBJ_NORMAL_USER)
459 return NT_STATUS_OBJECT_TYPE_MISMATCH;
461 obj->data.user->munged_dial = (char *)talloc_strdup(obj->mem_ctx, munged_dial);
462 if (!(obj->data.user->munged_dial)) return NT_STATUS_NO_MEMORY;
466 NTSTATUS gums_get_user_logon_time(NTTIME *logon_time, const GUMS_OBJECT *obj)
468 if (!logon_time || !obj)
469 return NT_STATUS_INVALID_PARAMETER;
471 if (obj->type != GUMS_OBJ_NORMAL_USER)
472 return NT_STATUS_OBJECT_TYPE_MISMATCH;
474 *logon_time = obj->data.user->logon_time;
478 NTSTATUS gums_set_user_logon_time(GUMS_OBJECT *obj, NTTIME logon_time)
481 return NT_STATUS_INVALID_PARAMETER;
483 if (obj->type != GUMS_OBJ_NORMAL_USER)
484 return NT_STATUS_OBJECT_TYPE_MISMATCH;
486 obj->data.user->logon_time = logon_time;
490 NTSTATUS gums_get_user_logoff_time(NTTIME *logoff_time, const GUMS_OBJECT *obj)
492 if (!logoff_time || !obj)
493 return NT_STATUS_INVALID_PARAMETER;
495 if (obj->type != GUMS_OBJ_NORMAL_USER)
496 return NT_STATUS_OBJECT_TYPE_MISMATCH;
498 *logoff_time = obj->data.user->logoff_time;
502 NTSTATUS gums_set_user_logoff_time(GUMS_OBJECT *obj, NTTIME logoff_time)
505 return NT_STATUS_INVALID_PARAMETER;
507 if (obj->type != GUMS_OBJ_NORMAL_USER)
508 return NT_STATUS_OBJECT_TYPE_MISMATCH;
510 obj->data.user->logoff_time = logoff_time;
514 NTSTATUS gums_get_user_kickoff_time(NTTIME *kickoff_time, const GUMS_OBJECT *obj)
516 if (!kickoff_time || !obj)
517 return NT_STATUS_INVALID_PARAMETER;
519 if (obj->type != GUMS_OBJ_NORMAL_USER)
520 return NT_STATUS_OBJECT_TYPE_MISMATCH;
522 *kickoff_time = obj->data.user->kickoff_time;
526 NTSTATUS gums_set_user_kickoff_time(GUMS_OBJECT *obj, NTTIME kickoff_time)
529 return NT_STATUS_INVALID_PARAMETER;
531 if (obj->type != GUMS_OBJ_NORMAL_USER)
532 return NT_STATUS_OBJECT_TYPE_MISMATCH;
534 obj->data.user->kickoff_time = kickoff_time;
538 NTSTATUS gums_get_user_pass_last_set_time(NTTIME *pass_last_set_time, const GUMS_OBJECT *obj)
540 if (!pass_last_set_time || !obj)
541 return NT_STATUS_INVALID_PARAMETER;
543 if (obj->type != GUMS_OBJ_NORMAL_USER)
544 return NT_STATUS_OBJECT_TYPE_MISMATCH;
546 *pass_last_set_time = obj->data.user->pass_last_set_time;
550 NTSTATUS gums_set_user_pass_last_set_time(GUMS_OBJECT *obj, NTTIME pass_last_set_time)
553 return NT_STATUS_INVALID_PARAMETER;
555 if (obj->type != GUMS_OBJ_NORMAL_USER)
556 return NT_STATUS_OBJECT_TYPE_MISMATCH;
558 obj->data.user->pass_last_set_time = pass_last_set_time;
562 NTSTATUS gums_get_user_pass_can_change_time(NTTIME *pass_can_change_time, const GUMS_OBJECT *obj)
564 if (!pass_can_change_time || !obj)
565 return NT_STATUS_INVALID_PARAMETER;
567 if (obj->type != GUMS_OBJ_NORMAL_USER)
568 return NT_STATUS_OBJECT_TYPE_MISMATCH;
570 *pass_can_change_time = obj->data.user->pass_can_change_time;
574 NTSTATUS gums_set_user_pass_can_change_time(GUMS_OBJECT *obj, NTTIME pass_can_change_time)
577 return NT_STATUS_INVALID_PARAMETER;
579 if (obj->type != GUMS_OBJ_NORMAL_USER)
580 return NT_STATUS_OBJECT_TYPE_MISMATCH;
582 obj->data.user->pass_can_change_time = pass_can_change_time;
586 NTSTATUS gums_get_user_pass_must_change_time(NTTIME *pass_must_change_time, const GUMS_OBJECT *obj)
588 if (!pass_must_change_time || !obj)
589 return NT_STATUS_INVALID_PARAMETER;
591 if (obj->type != GUMS_OBJ_NORMAL_USER)
592 return NT_STATUS_OBJECT_TYPE_MISMATCH;
594 *pass_must_change_time = obj->data-user->pass_must_change_time;
598 NTSTATUS gums_set_user_pass_must_change_time(GUMS_OBJECT *obj, NTTIME pass_must_change_time)
601 return NT_STATUS_INVALID_PARAMETER;
603 if (obj->type != GUMS_OBJ_NORMAL_USER)
604 return NT_STATUS_OBJECT_TYPE_MISMATCH;
606 obj->data.user->pass_must_change_time = pass_must_change_time;
610 NTSTATUS gums_get_user_logon_divs(uint16 *logon_divs, const GUMS_OBJECT *obj)
612 if (!logon_divs || !obj)
613 return NT_STATUS_INVALID_PARAMETER;
615 if (obj->type != GUMS_OBJ_NORMAL_USER)
616 return NT_STATUS_OBJECT_TYPE_MISMATCH;
618 *logon_divs = obj->data.user->logon_divs;
622 NTSTATUS gums_set_user_logon_divs(GUMS_OBJECT *obj, uint16 logon_divs)
624 if (!obj || !logon_divs)
625 return NT_STATUS_INVALID_PARAMETER;
627 if (obj->type != GUMS_OBJ_NORMAL_USER)
628 return NT_STATUS_OBJECT_TYPE_MISMATCH;
630 obj->data.user->logon_divs = logon_divs;
634 NTSTATUS gums_get_user_hours_len(uint32 *hours_len, const GUMS_OBJECT *obj)
636 if (!hours_len || !obj)
637 return NT_STATUS_INVALID_PARAMETER;
639 if (obj->type != GUMS_OBJ_NORMAL_USER)
640 return NT_STATUS_OBJECT_TYPE_MISMATCH;
642 *hours_len = obj->data.user->hours_len;
646 NTSTATUS gums_set_user_hours_len(GUMS_OBJECT *obj, uint32 hours_len)
649 return NT_STATUS_INVALID_PARAMETER;
651 if (obj->type != GUMS_OBJ_NORMAL_USER)
652 return NT_STATUS_OBJECT_TYPE_MISMATCH;
654 obj->data.user->hours_len = hours_len;
658 NTSTATUS gums_get_user_hours(uint8 **hours, const GUMS_OBJECT *obj)
661 return NT_STATUS_INVALID_PARAMETER;
663 if (obj->type != GUMS_OBJ_NORMAL_USER)
664 return NT_STATUS_OBJECT_TYPE_MISMATCH;
666 *hours = obj->data.user->hours;
670 /* WARNING: always set hours_len before hours */
671 NTSTATUS gums_set_user_hours(GUMS_OBJECT *obj, const uint8 *hours)
674 return NT_STATUS_INVALID_PARAMETER;
676 if (obj->type != GUMS_OBJ_NORMAL_USER)
677 return NT_STATUS_OBJECT_TYPE_MISMATCH;
679 if (obj->data.user->hours_len == 0)
680 DEBUG(10, ("gums_set_user_hours: Warning, hours_len is zero!\n"));
682 obj->data.user->hours = (uint8 *)talloc_memdup(obj->mem_ctx, hours, obj->data.user->hours_len);
683 if (!(obj->data.user->hours) & (obj->data.user->hours_len != 0)) return NT_STATUS_NO_MEMORY;
687 NTSTATUS gums_get_user_unknown_3(uint32 *unknown_3, const GUMS_OBJECT *obj)
689 if (!unknown_3 || !obj)
690 return NT_STATUS_INVALID_PARAMETER;
692 if (obj->type != GUMS_OBJ_NORMAL_USER)
693 return NT_STATUS_OBJECT_TYPE_MISMATCH;
695 *unknown_3 = obj->data.user->unknown_3;
699 NTSTATUS gums_set_user_unknown_3(GUMS_OBJECT *obj, uint32 unknown_3)
702 return NT_STATUS_INVALID_PARAMETER;
704 if (obj->type != GUMS_OBJ_NORMAL_USER)
705 return NT_STATUS_OBJECT_TYPE_MISMATCH;
707 obj->data.user->unknown_3 = unknown_3;
711 NTSTATUS gums_get_user_unknown_5(uint32 *unknown_5, const GUMS_OBJECT *obj)
713 if (!unknown_5 || !obj)
714 return NT_STATUS_INVALID_PARAMETER;
716 if (obj->type != GUMS_OBJ_NORMAL_USER)
717 return NT_STATUS_OBJECT_TYPE_MISMATCH;
719 *unknown_5 = obj->data.user->unknown_5;
723 NTSTATUS gums_set_user_unknown_5(GUMS_OBJECT *obj, uint32 unknown_5)
726 return NT_STATUS_INVALID_PARAMETER;
728 if (obj->type != GUMS_OBJ_NORMAL_USER)
729 return NT_STATUS_OBJECT_TYPE_MISMATCH;
731 obj->data.user->unknown_5 = unknown_5;
735 NTSTATUS gums_get_user_unknown_6(uint32 *unknown_6, const GUMS_OBJECT *obj)
737 if (!unknown_6 || !obj)
738 return NT_STATUS_INVALID_PARAMETER;
740 if (obj->type != GUMS_OBJ_NORMAL_USER)
741 return NT_STATUS_OBJECT_TYPE_MISMATCH;
743 *unknown_6 = obj->data.user->unknown_6;
747 NTSTATUS gums_set_user_unknown_6(GUMS_OBJECT *obj, uint32 unknown_6)
750 return NT_STATUS_INVALID_PARAMETER;
752 if (obj->type != GUMS_OBJ_NORMAL_USER)
753 return NT_STATUS_OBJECT_TYPE_MISMATCH;
755 obj->data.user->unknown_6 = unknown_6;
759 /* Group specific functions */
761 NTSTATUS gums_get_group_members(uint32 *count, DOM_SID **members, const GUMS_OBJECT *obj)
763 if (!count || !members || !obj)
764 return NT_STATUS_INVALID_PARAMETER;
766 if (obj->type != GUMS_OBJ_GROUP &&
767 obj->type != GUMS_OBJ_ALIAS)
768 return NT_STATUS_OBJECT_TYPE_MISMATCH;
770 *count = obj->data.group->count;
771 *members = obj->data.group->members;
775 NTSTATUS gums_set_group_members(GUMS_OBJECT *obj, uint32 count, DOM_SID **members)
779 if (!obj || !members || !members)
780 return NT_STATUS_INVALID_PARAMETER;
782 if (obj->type != GUMS_OBJ_GROUP &&
783 obj->type != GUMS_OBJ_ALIAS)
784 return NT_STATUS_OBJECT_TYPE_MISMATCH;
786 obj->data.group->count = count;
789 obj->data.group->members[n] = dup_sec_desc(obj->mem_ctx, members[n]);
790 if (!(obj->data.group->members[n])) return NT_STATUS_NO_MEMORY;
796 /* data_store set functions */
798 NTSTATUS gums_create_commit_set(GUMS_COMMIT_SET **com_set, TALLOC_CTX *ctx, DOM_SID *sid, uint32 type)
801 GUMS_COMMIT_SET *set;
803 mem_ctx = talloc_init("commit_set");
805 return NT_STATUS_NO_MEMORY;
806 set = (GUMS_COMMIT_SET *)talloc(mem_ctx, sizeof(GUMS_COMMIT_SET));
808 talloc_destroy(mem_ctx);
809 return NT_STATUS_NO_MEMORY;
812 set->mem_ctx = mem_ctx;
814 sid_copy(&(set->sid), sid);
822 NTSTATUS gums_cs_set_sec_desc(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, SEC_DESC *sec_desc)
824 GUMS_DATA_SET *data_set;
825 SEC_DESC *new_sec_desc;
827 if (!mem_ctx || !com_set || !sec_desc)
828 return NT_STATUS_INVALID_PARAMETER;
830 com_set->count = com_set->count + 1;
831 if (com_set->count == 1) { /* first data set */
832 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
834 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
836 if (data_set == NULL)
837 return NT_STATUS_NO_MEMORY;
839 com_set->data = data_set;
840 data_set = &((com_set->data)[com_set->count - 1]);
842 data_set->type = GUMS_SET_SEC_DESC;
843 new_sec_desc = dup_sec_desc(mem_ctx, sec_desc);
844 if (new_sec_desc == NULL)
845 return NT_STATUS_NO_MEMORY;
847 (SEC_DESC *)(data_set->data) = new_sec_desc;
852 NTSTATUS gums_cs_add_privilege(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, LUID_ATTR priv)
854 GUMS_DATA_SET *data_set;
857 if (!mem_ctx || !com_set)
858 return NT_STATUS_INVALID_PARAMETER;
860 com_set->count = com_set->count + 1;
861 if (com_set->count == 1) { /* first data set */
862 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
864 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
866 if (data_set == NULL)
867 return NT_STATUS_NO_MEMORY;
869 com_set->data = data_set;
870 data_set = &((com_set->data)[com_set->count - 1]);
872 data_set->type = GUMS_ADD_PRIVILEGE;
873 if (NT_STATUS_IS_ERR(dupalloc_luid_attr(mem_ctx, &new_priv, priv)))
874 return NT_STATUS_NO_MEMORY;
876 (SEC_DESC *)(data_set->data) = new_priv;
881 NTSTATUS gums_cs_del_privilege(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, LUID_ATTR priv)
883 GUMS_DATA_SET *data_set;
886 if (!mem_ctx || !com_set)
887 return NT_STATUS_INVALID_PARAMETER;
889 com_set->count = com_set->count + 1;
890 if (com_set->count == 1) { /* first data set */
891 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
893 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
895 if (data_set == NULL)
896 return NT_STATUS_NO_MEMORY;
898 com_set->data = data_set;
899 data_set = &((com_set->data)[com_set->count - 1]);
901 data_set->type = GUMS_DEL_PRIVILEGE;
902 if (NT_STATUS_IS_ERR(dupalloc_luid_attr(mem_ctx, &new_priv, priv)))
903 return NT_STATUS_NO_MEMORY;
905 (SEC_DESC *)(data_set->data) = new_priv;
910 NTSTATUS gums_cs_set_privilege_set(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, PRIVILEGE_SET *priv_set)
912 GUMS_DATA_SET *data_set;
913 PRIVILEGE_SET *new_priv_set;
915 if (!mem_ctx || !com_set || !priv_set)
916 return NT_STATUS_INVALID_PARAMETER;
918 com_set->count = com_set->count + 1;
919 if (com_set->count == 1) { /* first data set */
920 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
922 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
924 if (data_set == NULL)
925 return NT_STATUS_NO_MEMORY;
927 com_set->data = data_set;
928 data_set = &((com_set->data)[com_set->count - 1]);
930 data_set->type = GUMS_SET_SEC_DESC;
931 if (NT_STATUS_IS_ERR(dup_priv_set(&new_priv_set, mem_ctx, priv_set)))
932 return NT_STATUS_NO_MEMORY;
934 (SEC_DESC *)(data_set->data) = new_priv_set;
939 NTSTATUS gums_cs_set_string(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, uint32 type, char *str)
941 GUMS_DATA_SET *data_set;
944 if (!mem_ctx || !com_set || !str || type < GUMS_SET_NAME || type > GUMS_SET_MUNGED_DIAL)
945 return NT_STATUS_INVALID_PARAMETER;
947 com_set->count = com_set->count + 1;
948 if (com_set->count == 1) { /* first data set */
949 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
951 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
953 if (data_set == NULL)
954 return NT_STATUS_NO_MEMORY;
956 com_set->data = data_set;
957 data_set = &((com_set->data)[com_set->count - 1]);
959 data_set->type = type;
960 new_str = talloc_strdup(mem_ctx, str);
962 return NT_STATUS_NO_MEMORY;
964 (char *)(data_set->data) = new_str;
969 NTSTATUS gums_cs_set_name(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *name)
971 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, name);
974 NTSTATUS gums_cs_set_description(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *desc)
976 return gums_set_string(mem_ctx, com_set, GUMS_SET_DESCRIPTION, desc);
979 NTSTATUS gums_cs_set_full_name(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *full_name)
981 if (com_set->type != GUMS_OBJ_NORMAL_USER)
982 return NT_STATUS_INVALID_PARAMETER;
984 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, full_name);
987 NTSTATUS gums_cs_set_home_directory(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *home_dir)
989 if (com_set->type != GUMS_OBJ_NORMAL_USER)
990 return NT_STATUS_INVALID_PARAMETER;
992 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, home_dir);
995 NTSTATUS gums_cs_set_drive(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *drive)
997 if (com_set->type != GUMS_OBJ_NORMAL_USER)
998 return NT_STATUS_INVALID_PARAMETER;
1000 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, drive);
1003 NTSTATUS gums_cs_set_logon_script(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *logon_script)
1005 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1006 return NT_STATUS_INVALID_PARAMETER;
1008 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, logon_script);
1011 NTSTATUS gums_cs_set_profile_path(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *prof_path)
1013 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1014 return NT_STATUS_INVALID_PARAMETER;
1016 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, prof_path);
1019 NTSTATUS gums_cs_set_workstations(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *wks)
1021 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1022 return NT_STATUS_INVALID_PARAMETER;
1024 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, wks);
1027 NTSTATUS gums_cs_set_unknown_string(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *unkn_str)
1029 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1030 return NT_STATUS_INVALID_PARAMETER;
1032 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, unkn_str);
1035 NTSTATUS gums_cs_set_munged_dial(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *munged_dial)
1037 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1038 return NT_STATUS_INVALID_PARAMETER;
1040 return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, munged_dial);
1043 NTSTATUS gums_cs_set_nttime(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, uint32 type, NTTIME *nttime)
1045 GUMS_DATA_SET *data_set;
1048 if (!mem_ctx || !com_set || !nttime || type < GUMS_SET_LOGON_TIME || type > GUMS_SET_PASS_MUST_CHANGE_TIME)
1049 return NT_STATUS_INVALID_PARAMETER;
1051 com_set->count = com_set->count + 1;
1052 if (com_set->count == 1) { /* first data set */
1053 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
1055 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
1057 if (data_set == NULL)
1058 return NT_STATUS_NO_MEMORY;
1060 com_set->data = data_set;
1061 data_set = &((com_set->data)[com_set->count - 1]);
1063 data_set->type = type;
1064 new_time = talloc(mem_ctx, sizeof(NTTIME));
1065 if (new_time == NULL)
1066 return NT_STATUS_NO_MEMORY;
1068 new_time->low = nttime->low;
1069 new_time->high = nttime->high;
1070 (char *)(data_set->data) = new_time;
1072 return NT_STATUS_OK;
1075 NTSTATUS gums_cs_set_logon_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *logon_time)
1077 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1078 return NT_STATUS_INVALID_PARAMETER;
1080 return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, logon_time);
1083 NTSTATUS gums_cs_set_logoff_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *logoff_time)
1085 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1086 return NT_STATUS_INVALID_PARAMETER;
1088 return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGOFF_TIME, logoff_time);
1091 NTSTATUS gums_cs_set_kickoff_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *kickoff_time)
1093 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1094 return NT_STATUS_INVALID_PARAMETER;
1096 return gums_set_nttime(mem_ctx, com_set, GUMS_SET_KICKOFF_TIME, kickoff_time);
1099 NTSTATUS gums_cs_set_pass_last_set_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *pls_time)
1101 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1102 return NT_STATUS_INVALID_PARAMETER;
1104 return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pls_time);
1107 NTSTATUS gums_cs_set_pass_can_change_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *pcc_time)
1109 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1110 return NT_STATUS_INVALID_PARAMETER;
1112 return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pcc_time);
1115 NTSTATUS gums_cs_set_pass_must_change_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *pmc_time)
1117 if (com_set->type != GUMS_OBJ_NORMAL_USER)
1118 return NT_STATUS_INVALID_PARAMETER;
1120 return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pmc_time);
1123 NTSTATUS gums_cs_add_sids_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count)
1125 GUMS_DATA_SET *data_set;
1129 if (!mem_ctx || !com_set || !sids)
1130 return NT_STATUS_INVALID_PARAMETER;
1132 com_set->count = com_set->count + 1;
1133 if (com_set->count == 1) { /* first data set */
1134 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
1136 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
1138 if (data_set == NULL)
1139 return NT_STATUS_NO_MEMORY;
1141 com_set->data = data_set;
1142 data_set = &((com_set->data)[com_set->count - 1]);
1144 data_set->type = GUMS_ADD_SID_LIST;
1145 new_sids = (DOM_SID **)talloc(mem_ctx, (sizeof(void *) * count));
1146 if (new_sids == NULL)
1147 return NT_STATUS_NO_MEMORY;
1148 for (i = 0; i < count; i++) {
1149 new_sids[i] = sid_dup_talloc(mem_ctx, sids[i]);
1150 if (new_sids[i] == NULL)
1151 return NT_STATUS_NO_MEMORY;
1154 (SEC_DESC *)(data_set->data) = new_sids;
1156 return NT_STATUS_OK;
1159 NTSTATUS gums_cs_add_users_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count)
1161 if (!mem_ctx || !com_set || !sids)
1162 return NT_STATUS_INVALID_PARAMETER;
1163 if (com_set->type != GUMS_OBJ_GROUP || com_set->type != GUMS_OBJ_ALIAS)
1164 return NT_STATUS_INVALID_PARAMETER;
1166 return gums_add_sids_to_group(mem_ctx, com_set, sids, count);
1169 NTSTATUS gums_cs_add_groups_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count)
1171 if (!mem_ctx || !com_set || !sids)
1172 return NT_STATUS_INVALID_PARAMETER;
1173 if (com_set->type != GUMS_OBJ_ALIAS)
1174 return NT_STATUS_INVALID_PARAMETER;
1176 return gums_add_sids_to_group(mem_ctx, com_set, sids, count);
1179 NTSTATUS gums_cs_del_sids_from_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count)
1181 GUMS_DATA_SET *data_set;
1185 if (!mem_ctx || !com_set || !sids)
1186 return NT_STATUS_INVALID_PARAMETER;
1187 if (com_set->type != GUMS_OBJ_GROUP || com_set->type != GUMS_OBJ_ALIAS)
1188 return NT_STATUS_INVALID_PARAMETER;
1190 com_set->count = com_set->count + 1;
1191 if (com_set->count == 1) { /* first data set */
1192 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
1194 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
1196 if (data_set == NULL)
1197 return NT_STATUS_NO_MEMORY;
1199 com_set->data = data_set;
1200 data_set = &((com_set->data)[com_set->count - 1]);
1202 data_set->type = GUMS_DEL_SID_LIST;
1203 new_sids = (DOM_SID **)talloc(mem_ctx, (sizeof(void *) * count));
1204 if (new_sids == NULL)
1205 return NT_STATUS_NO_MEMORY;
1206 for (i = 0; i < count; i++) {
1207 new_sids[i] = sid_dup_talloc(mem_ctx, sids[i]);
1208 if (new_sids[i] == NULL)
1209 return NT_STATUS_NO_MEMORY;
1212 (SEC_DESC *)(data_set->data) = new_sids;
1214 return NT_STATUS_OK;
1217 NTSTATUS gums_ds_set_sids_in_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count)
1219 GUMS_DATA_SET *data_set;
1223 if (!mem_ctx || !com_set || !sids)
1224 return NT_STATUS_INVALID_PARAMETER;
1225 if (com_set->type != GUMS_OBJ_GROUP || com_set->type != GUMS_OBJ_ALIAS)
1226 return NT_STATUS_INVALID_PARAMETER;
1228 com_set->count = com_set->count + 1;
1229 if (com_set->count == 1) { /* first data set */
1230 data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET));
1232 data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count);
1234 if (data_set == NULL)
1235 return NT_STATUS_NO_MEMORY;
1237 com_set->data = data_set;
1238 data_set = &((com_set->data)[com_set->count - 1]);
1240 data_set->type = GUMS_SET_SID_LIST;
1241 new_sids = (DOM_SID **)talloc(mem_ctx, (sizeof(void *) * count));
1242 if (new_sids == NULL)
1243 return NT_STATUS_NO_MEMORY;
1244 for (i = 0; i < count; i++) {
1245 new_sids[i] = sid_dup_talloc(mem_ctx, sids[i]);
1246 if (new_sids[i] == NULL)
1247 return NT_STATUS_NO_MEMORY;
1250 (SEC_DESC *)(data_set->data) = new_sids;
1252 return NT_STATUS_OK;
1256 NTSTATUS gums_commit_data(GUMS_COMMIT_SET *set)
1258 return gums_storage->set_object_values(set->sid, set->count, set->data);
1261 NTSTATUS gums_destroy_commit_set(GUMS_COMMIT_SET **com_set)
1263 talloc_destroy((*com_set)->mem_ctx);
1266 return NT_STATUS_OK;