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 info from a GUMS object */
27 NTSTATUS
gums_get_object_type(uint32
*type
, const GUMS_OBJECT
*obj
)
33 NTSTATUS
gums_get_object_seq_num(uint32
*version
, const GUMS_OBJECT
*obj
)
35 *version
= obj
->version
;
39 NTSTATUS
gums_get_sec_desc(SEC_DESC
**sec_desc
, const GUMS_OBJECT
*obj
)
41 *sec_desc
= obj
->sec_desc
;
45 NTSTATUS
gums_get_object_sid(DOM_SID
**sid
, const GUMS_OBJECT
*obj
)
51 NTSTATUS
gums_get_object_name(char **name
, const GUMS_OBJECT
*obj
)
57 NTSTATUS
gums_get_object_description(char **description
, const GUMS_OBJECT
*obj
)
59 *description
= obj
->description
;
63 /* User specific functions */
65 NTSTATUS
gums_get_object_privileges(PRIVILEGE_SET
**priv_set
, const GUMS_OBJECT
*obj
)
68 return NT_STATUS_INVALID_PARAMETER
;
70 *priv_set
= obj
->priv_set
;
74 NTSTATUS
gums_get_user_pri_group(DOM_SID
**sid
, const GUMS_OBJECT
*obj
)
76 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
77 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
79 return NT_STATUS_INVALID_PARAMETER
;
81 *sid
= ((GUMS_USER
*)(obj
->data
))->group_sid
;
85 NTSTATUS
gums_get_user_nt_pwd(DATA_BLOB
**nt_pwd
, const GUMS_OBJECT
*obj
)
87 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
88 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
90 return NT_STATUS_INVALID_PARAMETER
;
92 *nt_pwd
= ((GUMS_USER
*)(obj
->data
))->nt_pw
;
96 NTSTATUS
gums_get_user_lm_pwd(DATA_BLOB
**lm_pwd
, const GUMS_OBJECT
*obj
)
98 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
99 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
101 return NT_STATUS_INVALID_PARAMETER
;
103 *lm_pwd
= ((GUMS_USER
*)(obj
->data
))->lm_pw
;
107 NTSTATUS
gums_get_user_fullname(char **fullname
, const GUMS_OBJECT
*obj
)
109 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
110 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
112 return NT_STATUS_INVALID_PARAMETER
;
114 *fullname
= ((GUMS_USER
*)(obj
->data
))->full_name
;
118 NTSTATUS
gums_get_user_homedir(char **homedir
, const GUMS_OBJECT
*obj
)
120 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
121 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
123 return NT_STATUS_INVALID_PARAMETER
;
125 *homedir
= ((GUMS_USER
*)(obj
->data
))->home_dir
;
129 NTSTATUS
gums_get_user_dir_drive(char **dirdrive
, const GUMS_OBJECT
*obj
)
131 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
132 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
134 return NT_STATUS_INVALID_PARAMETER
;
136 *dirdrive
= ((GUMS_USER
*)(obj
->data
))->dir_drive
;
140 NTSTATUS
gums_get_user_logon_script(char **logon_script
, const GUMS_OBJECT
*obj
)
142 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
143 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
145 return NT_STATUS_INVALID_PARAMETER
;
147 *logon_script
= ((GUMS_USER
*)(obj
->data
))->logon_script
;
151 NTSTATUS
gums_get_user_profile_path(char **profile_path
, const GUMS_OBJECT
*obj
)
153 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
154 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
156 return NT_STATUS_INVALID_PARAMETER
;
158 *profile_path
= ((GUMS_USER
*)(obj
->data
))->profile_path
;
162 NTSTATUS
gums_get_user_workstations(char **workstations
, const GUMS_OBJECT
*obj
)
164 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
165 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
167 return NT_STATUS_INVALID_PARAMETER
;
169 *workstations
= ((GUMS_USER
*)(obj
->data
))->workstations
;
173 NTSTATUS
gums_get_user_unknown_str(char **unknown_str
, const GUMS_OBJECT
*obj
)
175 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
176 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
178 return NT_STATUS_INVALID_PARAMETER
;
180 *unknown_str
= ((GUMS_USER
*)(obj
->data
))->unknown_str
;
184 NTSTATUS
gums_get_user_munged_dial(char **munged_dial
, const GUMS_OBJECT
*obj
)
186 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
187 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
189 return NT_STATUS_INVALID_PARAMETER
;
191 *munged_dial
= ((GUMS_USER
*)(obj
->data
))->munged_dial
;
195 NTSTATUS
gums_get_user_logon_time(NTTIME
**logon_time
, const GUMS_OBJECT
*obj
)
197 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
198 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
200 return NT_STATUS_INVALID_PARAMETER
;
202 *logon_time
= ((GUMS_USER
*)(obj
->data
))->logon_time
;
206 NTSTATUS
gums_get_user_logoff_time(NTTIME
**logoff_time
, const GUMS_OBJECT
*obj
)
208 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
209 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
211 return NT_STATUS_INVALID_PARAMETER
;
213 *logoff_time
= ((GUMS_USER
*)(obj
->data
))->logoff_time
;
217 NTSTATUS
gums_get_user_kickoff_time(NTTIME
**kickoff_time
, const GUMS_OBJECT
*obj
)
219 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
220 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
222 return NT_STATUS_INVALID_PARAMETER
;
224 *kickoff_time
= ((GUMS_USER
*)(obj
->data
))->kickoff_time
;
228 NTSTATUS
gums_get_user_pass_last_set_time(NTTIME
**pass_last_set_time
, const GUMS_OBJECT
*obj
)
230 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
231 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
232 if (!pass_last_set_time
)
233 return NT_STATUS_INVALID_PARAMETER
;
235 *pass_last_set_time
= ((GUMS_USER
*)(obj
->data
))->pass_last_set_time
;
239 NTSTATUS
gums_get_user_pass_can_change_time(NTTIME
**pass_can_change_time
, const GUMS_OBJECT
*obj
)
241 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
242 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
243 if (!pass_can_change_time
)
244 return NT_STATUS_INVALID_PARAMETER
;
246 *pass_can_change_time
= ((GUMS_USER
*)(obj
->data
))->pass_can_change_time
;
250 NTSTATUS
gums_get_user_pass_must_change_time(NTTIME
**pass_must_change_time
, const GUMS_OBJECT
*obj
)
252 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
253 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
254 if (!pass_must_change_time
)
255 return NT_STATUS_INVALID_PARAMETER
;
257 *pass_must_change_time
= ((GUMS_USER
*)(obj
->data
))->pass_must_change_time
;
261 NTSTATUS
gums_get_user_logon_divs(uint16
*logon_divs
, const GUMS_OBJECT
*obj
)
263 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
264 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
266 return NT_STATUS_INVALID_PARAMETER
;
268 *logon_divs
= ((GUMS_USER
*)(obj
->data
))->logon_divs
;
272 NTSTATUS
gums_get_user_hours_len(uint32
*hours_len
, const GUMS_OBJECT
*obj
)
274 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
275 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
277 return NT_STATUS_INVALID_PARAMETER
;
279 *hours_len
= ((GUMS_USER
*)(obj
->data
))->hours_len
;
283 NTSTATUS
gums_get_user_hours(uint8
**hours
, const GUMS_OBJECT
*obj
)
285 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
286 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
288 return NT_STATUS_INVALID_PARAMETER
;
290 *hours
= ((GUMS_USER
*)(obj
->data
))->hours
;
294 NTSTATUS
gums_get_user_unknown_3(uint32
*unknown3
, const GUMS_OBJECT
*obj
)
296 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
297 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
299 return NT_STATUS_INVALID_PARAMETER
;
301 *unknown3
= ((GUMS_USER
*)(obj
->data
))->unknown_3
;
305 NTSTATUS
gums_get_user_unknown_5(uint32
*unknown5
, const GUMS_OBJECT
*obj
)
307 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
308 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
310 return NT_STATUS_INVALID_PARAMETER
;
312 *unknown5
= ((GUMS_USER
*)(obj
->data
))->unknown_5
;
316 NTSTATUS
gums_get_user_unknown_6(uint32
*unknown6
, const GUMS_OBJECT
*obj
)
318 if (obj
->type
!= GUMS_OBJ_NORMAL_USER
)
319 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
321 return NT_STATUS_INVALID_PARAMETER
;
323 *unknown6
= ((GUMS_USER
*)(obj
->data
))->unknown_6
;
327 /* Group specific functions */
329 NTSTATUS
gums_get_group_members(uint32
*count
, DOM_SID
**members
, const GUMS_OBJECT
*obj
)
331 if (obj
->type
!= GUMS_OBJ_GROUP
&&
332 obj
->type
!= GUMS_OBJ_ALIAS
)
333 return NT_STATUS_OBJECT_TYPE_MISMATCH
;
335 return NT_STATUS_INVALID_PARAMETER
;
337 *count
= ((GUMS_GROUP
*)(obj
->data
))->count
;
338 *members
= ((GUMS_GROUP
*)(obj
->data
))->members
;
344 NTSTATUS
gums_create_data_set(GUMS_COMMIT_SET
**com_set
, TALLOC_CTX
*ctx
, DOM_SID
*sid
, uint32 type
)
347 GUMS_COMMIT_SET
*set
;
349 mem_ctx
= talloc_init_named("commit_set");
351 return NT_STATUS_NO_MEMORY
;
352 set
= (GUMS_COMMIT_SET
*)talloc(mem_ctx
, sizeof(GUMS_COMMIT_SET
));
354 talloc_destroy(mem_ctx
);
355 return NT_STATUS_NO_MEMORY
;
358 set
->mem_ctx
= mem_ctx
;
360 sid_copy(&(set
->sid
), sid
);
368 NTSTATUS
gums_set_sec_desc(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, SEC_DESC
*sec_desc
)
370 GUMS_DATA_SET
*data_set
;
371 SEC_DESC
*new_sec_desc
;
373 if (!mem_ctx
|| !com_set
|| !sec_desc
)
374 return NT_STATUS_INVALID_PARAMETER
;
376 com_set
->count
= com_set
->count
+ 1;
377 if (com_set
->count
== 1) { /* first data set */
378 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
380 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
382 if (data_set
== NULL
)
383 return NT_STATUS_NO_MEMORY
;
385 com_set
->data
= data_set
;
386 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
388 data_set
->type
= GUMS_SET_SEC_DESC
;
389 new_sec_desc
= dup_sec_desc(mem_ctx
, sec_desc
);
390 if (new_sec_desc
== NULL
)
391 return NT_STATUS_NO_MEMORY
;
393 (SEC_DESC
*)(data_set
->data
) = new_sec_desc
;
398 NTSTATUS
gums_add_privilege(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, LUID_ATTR priv
)
400 GUMS_DATA_SET
*data_set
;
403 if (!mem_ctx
|| !com_set
)
404 return NT_STATUS_INVALID_PARAMETER
;
406 com_set
->count
= com_set
->count
+ 1;
407 if (com_set
->count
== 1) { /* first data set */
408 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
410 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
412 if (data_set
== NULL
)
413 return NT_STATUS_NO_MEMORY
;
415 com_set
->data
= data_set
;
416 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
418 data_set
->type
= GUMS_ADD_PRIVILEGE
;
419 if (NT_STATUS_IS_ERR(dupalloc_luid_attr(mem_ctx
, &new_priv
, priv
)))
420 return NT_STATUS_NO_MEMORY
;
422 (SEC_DESC
*)(data_set
->data
) = new_priv
;
427 NTSTATUS
gums_del_privilege(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, LUID_ATTR priv
)
429 GUMS_DATA_SET
*data_set
;
432 if (!mem_ctx
|| !com_set
)
433 return NT_STATUS_INVALID_PARAMETER
;
435 com_set
->count
= com_set
->count
+ 1;
436 if (com_set
->count
== 1) { /* first data set */
437 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
439 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
441 if (data_set
== NULL
)
442 return NT_STATUS_NO_MEMORY
;
444 com_set
->data
= data_set
;
445 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
447 data_set
->type
= GUMS_DEL_PRIVILEGE
;
448 if (NT_STATUS_IS_ERR(dupalloc_luid_attr(mem_ctx
, &new_priv
, priv
)))
449 return NT_STATUS_NO_MEMORY
;
451 (SEC_DESC
*)(data_set
->data
) = new_priv
;
456 NTSTATUS
gums_set_privilege_set(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, PRIVILEGE_SET
*priv_set
)
458 GUMS_DATA_SET
*data_set
;
459 PRIVILEGE_SET
*new_priv_set
;
461 if (!mem_ctx
|| !com_set
|| !priv_set
)
462 return NT_STATUS_INVALID_PARAMETER
;
464 com_set
->count
= com_set
->count
+ 1;
465 if (com_set
->count
== 1) { /* first data set */
466 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
468 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
470 if (data_set
== NULL
)
471 return NT_STATUS_NO_MEMORY
;
473 com_set
->data
= data_set
;
474 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
476 data_set
->type
= GUMS_SET_SEC_DESC
;
477 if (NT_STATUS_IS_ERR(dup_priv_set(&new_priv_set
, mem_ctx
, priv_set
)))
478 return NT_STATUS_NO_MEMORY
;
480 (SEC_DESC
*)(data_set
->data
) = new_priv_set
;
485 NTSTATUS
gums_set_string(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, uint32 type
, char *str
)
487 GUMS_DATA_SET
*data_set
;
490 if (!mem_ctx
|| !com_set
|| !str
|| type
< GUMS_SET_NAME
|| type
> GUMS_SET_MUNGED_DIAL
)
491 return NT_STATUS_INVALID_PARAMETER
;
493 com_set
->count
= com_set
->count
+ 1;
494 if (com_set
->count
== 1) { /* first data set */
495 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
497 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
499 if (data_set
== NULL
)
500 return NT_STATUS_NO_MEMORY
;
502 com_set
->data
= data_set
;
503 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
505 data_set
->type
= type
;
506 new_str
= talloc_strdup(mem_ctx
, str
);
508 return NT_STATUS_NO_MEMORY
;
510 (char *)(data_set
->data
) = new_str
;
515 NTSTATUS
gums_set_name(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *name
)
517 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, name
);
520 NTSTATUS
gums_set_description(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *desc
)
522 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_DESCRIPTION
, desc
);
525 NTSTATUS
gums_set_full_name(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *full_name
)
527 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
528 return NT_STATUS_INVALID_PARAMETER
;
530 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, full_name
);
533 NTSTATUS
gums_set_home_directory(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *home_dir
)
535 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
536 return NT_STATUS_INVALID_PARAMETER
;
538 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, home_dir
);
541 NTSTATUS
gums_set_drive(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *drive
)
543 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
544 return NT_STATUS_INVALID_PARAMETER
;
546 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, drive
);
549 NTSTATUS
gums_set_logon_script(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *logon_script
)
551 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
552 return NT_STATUS_INVALID_PARAMETER
;
554 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, logon_script
);
557 NTSTATUS
gums_set_profile_path(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *prof_path
)
559 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
560 return NT_STATUS_INVALID_PARAMETER
;
562 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, prof_path
);
565 NTSTATUS
gums_set_workstations(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *wks
)
567 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
568 return NT_STATUS_INVALID_PARAMETER
;
570 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, wks
);
573 NTSTATUS
gums_set_unknown_string(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *unkn_str
)
575 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
576 return NT_STATUS_INVALID_PARAMETER
;
578 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, unkn_str
);
581 NTSTATUS
gums_set_munged_dial(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, char *munged_dial
)
583 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
584 return NT_STATUS_INVALID_PARAMETER
;
586 return gums_set_string(mem_ctx
, com_set
, GUMS_SET_NAME
, munged_dial
);
589 NTSTATUS
gums_set_nttime(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, uint32 type
, NTTIME
*time
)
591 GUMS_DATA_SET
*data_set
;
594 if (!mem_ctx
|| !com_set
|| !time
|| type
< GUMS_SET_LOGON_TIME
|| type
> GUMS_SET_PASS_MUST_CHANGE_TIME
)
595 return NT_STATUS_INVALID_PARAMETER
;
597 com_set
->count
= com_set
->count
+ 1;
598 if (com_set
->count
== 1) { /* first data set */
599 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
601 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
603 if (data_set
== NULL
)
604 return NT_STATUS_NO_MEMORY
;
606 com_set
->data
= data_set
;
607 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
609 data_set
->type
= type
;
610 new_time
= talloc(mem_ctx
, sizeof(NTTIME
));
611 if (new_time
== NULL
)
612 return NT_STATUS_NO_MEMORY
;
614 new_time
->low
= time
->low
;
615 new_time
->high
= time
->high
;
616 (char *)(data_set
->data
) = new_time
;
621 NTSTATUS
gums_set_logon_time(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, NTTIME
*logon_time
)
623 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
624 return NT_STATUS_INVALID_PARAMETER
;
626 return gums_set_nttime(mem_ctx
, com_set
, GUMS_SET_LOGON_TIME
, logon_time
);
629 NTSTATUS
gums_set_logoff_time(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, NTTIME
*logoff_time
)
631 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
632 return NT_STATUS_INVALID_PARAMETER
;
634 return gums_set_nttime(mem_ctx
, com_set
, GUMS_SET_LOGOFF_TIME
, logoff_time
);
637 NTSTATUS
gums_set_kickoff_time(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, NTTIME
*kickoff_time
)
639 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
640 return NT_STATUS_INVALID_PARAMETER
;
642 return gums_set_nttime(mem_ctx
, com_set
, GUMS_SET_KICKOFF_TIME
, kickoff_time
);
645 NTSTATUS
gums_set_pass_last_set_time(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, NTTIME
*pls_time
)
647 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
648 return NT_STATUS_INVALID_PARAMETER
;
650 return gums_set_nttime(mem_ctx
, com_set
, GUMS_SET_LOGON_TIME
, pls_time
);
653 NTSTATUS
gums_set_pass_can_change_time(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, NTTIME
*pcc_time
)
655 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
656 return NT_STATUS_INVALID_PARAMETER
;
658 return gums_set_nttime(mem_ctx
, com_set
, GUMS_SET_LOGON_TIME
, pcc_time
);
661 NTSTATUS
gums_set_pass_must_change_time(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, NTTIME
*pmc_time
)
663 if (com_set
->type
!= GUMS_OBJ_NORMAL_USER
)
664 return NT_STATUS_INVALID_PARAMETER
;
666 return gums_set_nttime(mem_ctx
, com_set
, GUMS_SET_LOGON_TIME
, pmc_time
);
669 NTSTATUS
gums_add_sids_to_group(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, const DOM_SID
**sids
, const uint32 count
)
671 GUMS_DATA_SET
*data_set
;
675 if (!mem_ctx
|| !com_set
|| !sids
)
676 return NT_STATUS_INVALID_PARAMETER
;
678 com_set
->count
= com_set
->count
+ 1;
679 if (com_set
->count
== 1) { /* first data set */
680 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
682 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
684 if (data_set
== NULL
)
685 return NT_STATUS_NO_MEMORY
;
687 com_set
->data
= data_set
;
688 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
690 data_set
->type
= GUMS_ADD_SID_LIST
;
691 new_sids
= (DOM_SID
**)talloc(mem_ctx
, (sizeof(void *) * count
));
692 if (new_sids
== NULL
)
693 return NT_STATUS_NO_MEMORY
;
694 for (i
= 0; i
< count
; i
++) {
695 new_sids
[i
] = sid_dup_talloc(mem_ctx
, sids
[i
]);
696 if (new_sids
[i
] == NULL
)
697 return NT_STATUS_NO_MEMORY
;
700 (SEC_DESC
*)(data_set
->data
) = new_sids
;
705 NTSTATUS
gums_add_users_to_group(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, const DOM_SID
**sids
, const uint32 count
)
707 if (!mem_ctx
|| !com_set
|| !sids
)
708 return NT_STATUS_INVALID_PARAMETER
;
709 if (com_set
->type
!= GUMS_OBJ_GROUP
|| com_set
->type
!= GUMS_OBJ_ALIAS
)
710 return NT_STATUS_INVALID_PARAMETER
;
712 return gums_add_sids_to_group(mem_ctx
, com_set
, sids
, count
);
715 NTSTATUS
gums_add_groups_to_group(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, const DOM_SID
**sids
, const uint32 count
)
717 if (!mem_ctx
|| !com_set
|| !sids
)
718 return NT_STATUS_INVALID_PARAMETER
;
719 if (com_set
->type
!= GUMS_OBJ_ALIAS
)
720 return NT_STATUS_INVALID_PARAMETER
;
722 return gums_add_sids_to_group(mem_ctx
, com_set
, sids
, count
);
725 NTSTATUS
gums_del_sids_from_group(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, const DOM_SID
**sids
, const uint32 count
)
727 GUMS_DATA_SET
*data_set
;
731 if (!mem_ctx
|| !com_set
|| !sids
)
732 return NT_STATUS_INVALID_PARAMETER
;
733 if (com_set
->type
!= GUMS_OBJ_GROUP
|| com_set
->type
!= GUMS_OBJ_ALIAS
)
734 return NT_STATUS_INVALID_PARAMETER
;
736 com_set
->count
= com_set
->count
+ 1;
737 if (com_set
->count
== 1) { /* first data set */
738 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
740 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
742 if (data_set
== NULL
)
743 return NT_STATUS_NO_MEMORY
;
745 com_set
->data
= data_set
;
746 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
748 data_set
->type
= GUMS_DEL_SID_LIST
;
749 new_sids
= (DOM_SID
**)talloc(mem_ctx
, (sizeof(void *) * count
));
750 if (new_sids
== NULL
)
751 return NT_STATUS_NO_MEMORY
;
752 for (i
= 0; i
< count
; i
++) {
753 new_sids
[i
] = sid_dup_talloc(mem_ctx
, sids
[i
]);
754 if (new_sids
[i
] == NULL
)
755 return NT_STATUS_NO_MEMORY
;
758 (SEC_DESC
*)(data_set
->data
) = new_sids
;
763 NTSTATUS
gums_set_sids_in_group(TALLOC_CTX
*mem_ctx
, GUMS_COMMIT_SET
*com_set
, const DOM_SID
**sids
, const uint32 count
)
765 GUMS_DATA_SET
*data_set
;
769 if (!mem_ctx
|| !com_set
|| !sids
)
770 return NT_STATUS_INVALID_PARAMETER
;
771 if (com_set
->type
!= GUMS_OBJ_GROUP
|| com_set
->type
!= GUMS_OBJ_ALIAS
)
772 return NT_STATUS_INVALID_PARAMETER
;
774 com_set
->count
= com_set
->count
+ 1;
775 if (com_set
->count
== 1) { /* first data set */
776 data_set
= (GUMS_DATA_SET
*)talloc(mem_ctx
, sizeof(GUMS_DATA_SET
));
778 data_set
= (GUMS_DATA_SET
*)talloc_realloc(mem_ctx
, com_set
->data
, sizeof(GUMS_DATA_SET
) * com_set
->count
);
780 if (data_set
== NULL
)
781 return NT_STATUS_NO_MEMORY
;
783 com_set
->data
= data_set
;
784 data_set
= &((com_set
->data
)[com_set
->count
- 1]);
786 data_set
->type
= GUMS_SET_SID_LIST
;
787 new_sids
= (DOM_SID
**)talloc(mem_ctx
, (sizeof(void *) * count
));
788 if (new_sids
== NULL
)
789 return NT_STATUS_NO_MEMORY
;
790 for (i
= 0; i
< count
; i
++) {
791 new_sids
[i
] = sid_dup_talloc(mem_ctx
, sids
[i
]);
792 if (new_sids
[i
] == NULL
)
793 return NT_STATUS_NO_MEMORY
;
796 (SEC_DESC
*)(data_set
->data
) = new_sids
;
802 NTSTATUS
gums_commit_data(GUMS_COMMIT_SET
*set
)
804 return gums_storage
->set_object_values(set
->sid
, set
->count
, set
->data
);
807 NTSTATUS
gums_destroy_data_set(GUMS_COMMIT_SET
**com_set
)
809 talloc_destroy((*com_set
)->mem_ctx
);