2 Unix SMB/CIFS implementation.
4 Convert a server info struct into the form for PAC and NETLOGON replies
6 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2004
7 Copyright (C) Stefan Metzmacher <metze@samba.org> 2005
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "auth/auth.h"
26 #include "libcli/security/security.h"
28 NTSTATUS
auth_convert_server_info_sambaseinfo(TALLOC_CTX
*mem_ctx
,
29 struct auth_serversupplied_info
*server_info
,
30 struct netr_SamBaseInfo
**_sam
)
32 struct netr_SamBaseInfo
*sam
= talloc_zero(mem_ctx
, struct netr_SamBaseInfo
);
33 NT_STATUS_HAVE_NO_MEMORY(sam
);
35 sam
->domain_sid
= dom_sid_dup(mem_ctx
, server_info
->account_sid
);
36 NT_STATUS_HAVE_NO_MEMORY(sam
->domain_sid
);
37 sam
->domain_sid
->num_auths
--;
39 sam
->last_logon
= server_info
->last_logon
;
40 sam
->last_logoff
= server_info
->last_logoff
;
41 sam
->acct_expiry
= server_info
->acct_expiry
;
42 sam
->last_password_change
= server_info
->last_password_change
;
43 sam
->allow_password_change
= server_info
->allow_password_change
;
44 sam
->force_password_change
= server_info
->force_password_change
;
46 sam
->account_name
.string
= server_info
->account_name
;
47 sam
->full_name
.string
= server_info
->full_name
;
48 sam
->logon_script
.string
= server_info
->logon_script
;
49 sam
->profile_path
.string
= server_info
->profile_path
;
50 sam
->home_directory
.string
= server_info
->home_directory
;
51 sam
->home_drive
.string
= server_info
->home_drive
;
53 sam
->logon_count
= server_info
->logon_count
;
54 sam
->bad_password_count
= sam
->bad_password_count
;
55 sam
->rid
= server_info
->account_sid
->sub_auths
[server_info
->account_sid
->num_auths
-1];
56 sam
->primary_gid
= server_info
->primary_group_sid
->sub_auths
[server_info
->primary_group_sid
->num_auths
-1];
58 sam
->groups
.count
= 0;
59 sam
->groups
.rids
= NULL
;
61 if (server_info
->n_domain_groups
> 0) {
63 sam
->groups
.rids
= talloc_array(sam
, struct samr_RidWithAttribute
,
64 server_info
->n_domain_groups
);
66 if (sam
->groups
.rids
== NULL
)
67 return NT_STATUS_NO_MEMORY
;
69 for (i
=0; i
<server_info
->n_domain_groups
; i
++) {
70 struct dom_sid
*group_sid
= server_info
->domain_groups
[i
];
71 if (!dom_sid_in_domain(sam
->domain_sid
, group_sid
)) {
72 /* We handle this elsewhere */
75 sam
->groups
.rids
[sam
->groups
.count
].rid
=
76 group_sid
->sub_auths
[group_sid
->num_auths
-1];
78 sam
->groups
.rids
[sam
->groups
.count
].attributes
=
79 SE_GROUP_MANDATORY
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_ENABLED
;
80 sam
->groups
.count
+= 1;
84 sam
->user_flags
= 0; /* TODO: w2k3 uses 0x120. We know 0x20
85 * as extra sids (PAC doc) but what is
87 sam
->acct_flags
= server_info
->acct_flags
;
88 sam
->logon_server
.string
= server_info
->logon_server
;
89 sam
->domain
.string
= server_info
->domain_name
;
91 ZERO_STRUCT(sam
->unknown
);
93 ZERO_STRUCT(sam
->key
);
94 if (server_info
->user_session_key
.length
== sizeof(sam
->key
.key
)) {
95 memcpy(sam
->key
.key
, server_info
->user_session_key
.data
, sizeof(sam
->key
.key
));
98 ZERO_STRUCT(sam
->LMSessKey
);
99 if (server_info
->lm_session_key
.length
== sizeof(sam
->LMSessKey
.key
)) {
100 memcpy(sam
->LMSessKey
.key
, server_info
->lm_session_key
.data
,
101 sizeof(sam
->LMSessKey
.key
));
109 NTSTATUS
auth_convert_server_info_saminfo3(TALLOC_CTX
*mem_ctx
,
110 struct auth_serversupplied_info
*server_info
,
111 struct netr_SamInfo3
**_sam3
)
113 struct netr_SamBaseInfo
*sam
;
114 struct netr_SamInfo3
*sam3
= talloc_zero(mem_ctx
, struct netr_SamInfo3
);
117 NT_STATUS_HAVE_NO_MEMORY(sam3
);
119 status
= auth_convert_server_info_sambaseinfo(mem_ctx
, server_info
, &sam
);
120 if (!NT_STATUS_IS_OK(status
)) {
128 sam3
->sids
= talloc_array(sam
, struct netr_SidAttr
,
129 server_info
->n_domain_groups
);
130 NT_STATUS_HAVE_NO_MEMORY(sam3
->sids
);
132 for (i
=0; i
<server_info
->n_domain_groups
; i
++) {
133 if (dom_sid_in_domain(sam
->domain_sid
, server_info
->domain_groups
[i
])) {
136 sam3
->sids
[sam3
->sidcount
].sid
= talloc_reference(sam3
->sids
,server_info
->domain_groups
[i
]);
137 sam3
->sids
[sam3
->sidcount
].attribute
=
138 SE_GROUP_MANDATORY
| SE_GROUP_ENABLED_BY_DEFAULT
| SE_GROUP_ENABLED
;
141 if (sam3
->sidcount
) {
142 sam3
->base
.user_flags
|= NETLOGON_EXTRA_SIDS
;