- Don't put pointer to sam_domain_handle in sam_methods but single domainsid and...
[nivanova/samba-autobuild/.git] / source3 / sam / api.c
1 /* 
2    Unix SMB/CIFS implementation.
3    SAM interface API.
4
5    Copyright (C) Stefan (metze) Metzmacher              2002
6       
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24 #undef DBGC_CLASS
25 #define DBGC_CLASS DBGC_SAM
26
27 /* these functions should be used by the rest of SAMBA --metze */
28
29 /* General API */
30
31 NTSTATUS sam_get_sec_desc(const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd)
32 {
33         SAM_CONTEXT *sam_context = sam_get_static_context(False);
34
35         if (!sam_context) {
36                 return NT_STATUS_UNSUCCESSFUL;
37         }
38
39         return sam_context->sam_get_sec_desc(sam_context, access_token, sid, sd);
40 }
41
42 NTSTATUS sam_set_sec_desc(const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd)
43 {
44         SAM_CONTEXT *sam_context = sam_get_static_context(False);
45
46         if (!sam_context) {
47                 return NT_STATUS_UNSUCCESSFUL;
48         }
49
50         return sam_context->sam_set_sec_desc(sam_context, access_token, sid, sd);
51 }
52
53 NTSTATUS sam_lookup_sid(const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type)
54 {
55         SAM_CONTEXT *sam_context = sam_get_static_context(False);
56
57         if (!sam_context) {
58                 return NT_STATUS_UNSUCCESSFUL;
59         }
60
61         return sam_context->sam_lookup_sid(sam_context, access_token, sid, name, type);
62 }
63
64 NTSTATUS sam_lookup_name(const NT_USER_TOKEN *access_token, const char *domain, const char *name, DOM_SID **sid,  uint32 *type)
65 {
66         SAM_CONTEXT *sam_context = sam_get_static_context(False);
67
68         if (!sam_context) {
69                 return NT_STATUS_UNSUCCESSFUL;
70         }
71
72         return sam_context->sam_lookup_name(sam_context, access_token, domain, name, sid, type);
73 }
74
75 /* Domain API */
76
77 NTSTATUS sam_update_domain(const SAM_DOMAIN_HANDLE *domain)
78 {
79         SAM_CONTEXT *sam_context = sam_get_static_context(False);
80
81         if (!sam_context) {
82                 return NT_STATUS_UNSUCCESSFUL;
83         }
84
85         return sam_context->sam_update_domain(sam_context, domain);
86 }
87
88 NTSTATUS sam_enum_domains(const NT_USER_TOKEN *access_token, int32 *domain_count, DOM_SID **domains, char **domain_names)
89 {
90         SAM_CONTEXT *sam_context = sam_get_static_context(False);
91
92         if (!sam_context) {
93                 return NT_STATUS_UNSUCCESSFUL;
94         }
95
96         return sam_context->sam_enum_domains(sam_context, access_token, domain_count, domains, domain_names);
97 }
98
99 NTSTATUS sam_lookup_domain(const NT_USER_TOKEN * access_token, const char *domain, DOM_SID **domainsid)
100 {
101         SAM_CONTEXT *sam_context = sam_get_static_context(False);
102
103         if (!sam_context) {
104                 return NT_STATUS_UNSUCCESSFUL;
105         }
106
107         return sam_context->sam_lookup_domain(sam_context, access_token, domain, domainsid);
108 }
109
110 NTSTATUS sam_get_domain_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_DOMAIN_HANDLE **domain)
111 {
112         SAM_CONTEXT *sam_context = sam_get_static_context(False);
113
114         if (!sam_context) {
115                 return NT_STATUS_UNSUCCESSFUL;
116         }
117
118         return sam_context->sam_get_domain_by_sid(sam_context, access_token, access_desired, domainsid, domain);
119 }
120
121 /* Account API */
122
123 NTSTATUS sam_create_account(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *account_name, uint16 acct_ctrl, SAM_ACCOUNT_HANDLE **account)
124 {
125         SAM_CONTEXT *sam_context = sam_get_static_context(False);
126
127         if (!sam_context) {
128                 return NT_STATUS_UNSUCCESSFUL;
129         }
130
131         return sam_context->sam_create_account(sam_context, access_token, access_desired, domainsid, account_name, acct_ctrl, account);
132 }
133
134 NTSTATUS sam_add_account(const DOM_SID *domainsid, const SAM_ACCOUNT_HANDLE *account)
135 {
136         SAM_CONTEXT *sam_context = sam_get_static_context(False);
137
138         if (!sam_context) {
139                 return NT_STATUS_UNSUCCESSFUL;
140         }
141
142         return sam_context->sam_add_account(sam_context, domainsid, account);
143 }
144
145 NTSTATUS sam_update_account(const SAM_ACCOUNT_HANDLE *account)
146 {
147         SAM_CONTEXT *sam_context = sam_get_static_context(False);
148
149         if (!sam_context) {
150                 return NT_STATUS_UNSUCCESSFUL;
151         }
152
153         return sam_context->sam_update_account(sam_context, account);
154 }
155
156 NTSTATUS sam_delete_account(const SAM_ACCOUNT_HANDLE *account)
157 {
158         SAM_CONTEXT *sam_context = sam_get_static_context(False);
159
160         if (!sam_context) {
161                 return NT_STATUS_UNSUCCESSFUL;
162         }
163
164         return sam_context->sam_delete_account(sam_context, account);
165 }
166
167 NTSTATUS sam_enum_accounts(const NT_USER_TOKEN *access_token, const DOM_SID *domain, uint16 acct_ctrl, uint32 *account_count, SAM_ACCOUNT_ENUM **accounts)
168 {
169         SAM_CONTEXT *sam_context = sam_get_static_context(False);
170
171         if (!sam_context) {
172                 return NT_STATUS_UNSUCCESSFUL;
173         }
174
175         return sam_context->sam_enum_accounts(sam_context, access_token, domain, acct_ctrl, account_count, accounts);
176 }
177
178 NTSTATUS sam_get_account_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account)
179 {
180         SAM_CONTEXT *sam_context = sam_get_static_context(False);
181
182         if (!sam_context) {
183                 return NT_STATUS_UNSUCCESSFUL;
184         }
185
186         return sam_context->sam_get_account_by_sid(sam_context, access_token, access_desired, accountsid, account);
187 }
188
189 NTSTATUS sam_get_account_by_name(const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_ACCOUNT_HANDLE **account)
190 {
191         SAM_CONTEXT *sam_context = sam_get_static_context(False);
192
193         if (!sam_context) {
194                 return NT_STATUS_UNSUCCESSFUL;
195         }
196
197         return sam_context->sam_get_account_by_name(sam_context, access_token, access_desired, domain, name, account);
198 }
199
200 /* Group API */
201
202 NTSTATUS sam_create_group(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *group_name, uint16 group_ctrl, SAM_GROUP_HANDLE **group)
203 {
204         SAM_CONTEXT *sam_context = sam_get_static_context(False);
205
206         if (!sam_context) {
207                 return NT_STATUS_UNSUCCESSFUL;
208         }
209
210         return sam_context->sam_create_group(sam_context, access_token, access_desired, domainsid, group_name, group_ctrl, group);
211 }
212
213 NTSTATUS sam_add_group(const DOM_SID *domainsid, const SAM_GROUP_HANDLE *group)
214 {
215         SAM_CONTEXT *sam_context = sam_get_static_context(False);
216
217         if (!sam_context) {
218                 return NT_STATUS_UNSUCCESSFUL;
219         }
220
221         return sam_context->sam_add_group(sam_context, domainsid, group);
222 }
223
224 NTSTATUS sam_update_group(const SAM_GROUP_HANDLE *group)
225 {
226         SAM_CONTEXT *sam_context = sam_get_static_context(False);
227
228         if (!sam_context) {
229                 return NT_STATUS_UNSUCCESSFUL;
230         }
231
232         return sam_context->sam_update_group(sam_context, group);
233 }
234
235 NTSTATUS sam_delete_group(const SAM_GROUP_HANDLE *group)
236 {
237         SAM_CONTEXT *sam_context = sam_get_static_context(False);
238
239         if (!sam_context) {
240                 return NT_STATUS_UNSUCCESSFUL;
241         }
242
243         return sam_context->sam_delete_group(sam_context, group);
244 }
245
246 NTSTATUS sam_enum_groups(const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, uint16 group_ctrl, uint32 *groups_count, SAM_GROUP_ENUM **groups)
247 {
248         SAM_CONTEXT *sam_context = sam_get_static_context(False);
249
250         if (!sam_context) {
251                 return NT_STATUS_UNSUCCESSFUL;
252         }
253
254         return sam_context->sam_enum_groups(sam_context, access_token, domainsid, group_ctrl, groups_count, groups);
255 }
256
257 NTSTATUS sam_get_group_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
258 {
259         SAM_CONTEXT *sam_context = sam_get_static_context(False);
260
261         if (!sam_context) {
262                 return NT_STATUS_UNSUCCESSFUL;
263         }
264
265         return sam_context->sam_get_group_by_sid(sam_context, access_token, access_desired, groupsid, group);
266 }
267
268 NTSTATUS sam_get_group_by_name(const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_GROUP_HANDLE **group)
269 {
270         SAM_CONTEXT *sam_context = sam_get_static_context(False);
271
272         if (!sam_context) {
273                 return NT_STATUS_UNSUCCESSFUL;
274         }
275
276         return sam_context->sam_get_group_by_name(sam_context, access_token, access_desired, domain, name, group);
277 }
278
279 NTSTATUS sam_add_member_to_group(const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
280 {
281         SAM_CONTEXT *sam_context = sam_get_static_context(False);
282
283         if (!sam_context) {
284                 return NT_STATUS_UNSUCCESSFUL;
285         }
286
287         return sam_context->sam_add_member_to_group(sam_context, group, member);
288 }
289
290 NTSTATUS sam_delete_member_from_group(const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
291 {
292         SAM_CONTEXT *sam_context = sam_get_static_context(False);
293
294         if (!sam_context) {
295                 return NT_STATUS_UNSUCCESSFUL;
296         }
297
298         return sam_context->sam_delete_member_from_group(sam_context, group, member);
299 }
300
301 NTSTATUS sam_enum_groupmembers(const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members)
302 {
303         SAM_CONTEXT *sam_context = sam_get_static_context(False);
304
305         if (!sam_context) {
306                 return NT_STATUS_UNSUCCESSFUL;
307         }
308
309         return sam_context->sam_enum_groupmembers(sam_context, group, members_count, members);
310 }
311
312 NTSTATUS sam_get_groups_of_sid(const NT_USER_TOKEN *access_token, const DOM_SID **sids, uint16 group_ctrl, uint32 *group_count, SAM_GROUP_ENUM **groups)
313 {
314         SAM_CONTEXT *sam_context = sam_get_static_context(False);
315
316         if (!sam_context) {
317                 return NT_STATUS_UNSUCCESSFUL;
318         }
319
320         return sam_context->sam_get_groups_of_sid(sam_context, access_token, sids, group_ctrl, group_count, groups);
321 }
322