s4:kdc: let sdb_entry_to_hdb_entry() initialize *h at the beginning
[Samba.git] / source4 / kdc / sdb_to_hdb.c
bloba682de17e981d0d86011df63afdad9b9f195cb76
1 /*
2 Unix SMB/CIFS implementation.
4 Database Glue between Samba and the KDC
6 Copyright (C) Guenther Deschner <gd@samba.org> 2014
7 Copyright (C) Andreas Schneider <asn@samba.org> 2014
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 3 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.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "includes.h"
25 #include <hdb.h>
26 #include "sdb.h"
27 #include "sdb_hdb.h"
28 #include "lib/krb5_wrap/krb5_samba.h"
29 #include "kdc/samba_kdc.h"
31 static void sdb_flags_to_hdb_flags(const struct SDBFlags *s,
32 HDBFlags *h)
34 SMB_ASSERT(sizeof(struct SDBFlags) == sizeof(HDBFlags));
36 h->initial = s->initial;
37 h->forwardable = s->forwardable;
38 h->proxiable = s->proxiable;
39 h->renewable = s->renewable;
40 h->postdate = s->postdate;
41 h->server = s->server;
42 h->client = s->client;
43 h->invalid = s->invalid;
44 h->require_preauth = s->require_preauth;
45 h->change_pw = s->change_pw;
46 h->require_hwauth = s->require_hwauth;
47 h->ok_as_delegate = s->ok_as_delegate;
48 h->user_to_user = s->user_to_user;
49 h->immutable = s->immutable;
50 h->trusted_for_delegation = s->trusted_for_delegation;
51 h->allow_kerberos4 = s->allow_kerberos4;
52 h->allow_digest = s->allow_digest;
53 h->locked_out = s->locked_out;
54 h->require_pwchange = s->require_pwchange;
55 h->materialize = s->materialize;
56 h->virtual_keys = s->virtual_keys;
57 h->virtual = s->virtual;
58 h->synthetic = s->synthetic;
59 h->no_auth_data_reqd = s->no_auth_data_reqd;
60 h->_unused24 = s->_unused24;
61 h->_unused25 = s->_unused25;
62 h->_unused26 = s->_unused26;
63 h->_unused27 = s->_unused27;
64 h->_unused28 = s->_unused28;
65 h->_unused29 = s->_unused29;
66 h->force_canonicalize = s->force_canonicalize;
67 h->do_not_store = s->do_not_store;
70 static int sdb_salt_to_Salt(const struct sdb_salt *s, Salt *h)
72 int ret;
74 h->type = s->type;
75 ret = smb_krb5_copy_data_contents(&h->salt, s->salt.data, s->salt.length);
76 if (ret != 0) {
77 free_Salt(h);
78 return ENOMEM;
80 h->opaque = NULL;
82 return 0;
85 static int sdb_key_to_Key(const struct sdb_key *s, Key *h)
87 int rc;
89 ZERO_STRUCTP(h);
91 h->key.keytype = s->key.keytype;
92 rc = smb_krb5_copy_data_contents(&h->key.keyvalue,
93 s->key.keyvalue.data,
94 s->key.keyvalue.length);
95 if (rc != 0) {
96 goto error_nomem;
99 if (s->salt != NULL) {
100 h->salt = malloc(sizeof(Salt));
101 if (h->salt == NULL) {
102 goto error_nomem;
105 rc = sdb_salt_to_Salt(s->salt,
106 h->salt);
107 if (rc != 0) {
108 goto error_nomem;
110 } else {
111 h->salt = NULL;
114 return 0;
116 error_nomem:
117 free_Key(h);
118 return ENOMEM;
121 static int sdb_keys_to_Keys(const struct sdb_keys *s, Keys *h)
123 int ret, i;
125 h->len = s->len;
126 if (s->val != NULL) {
127 h->val = malloc(h->len * sizeof(Key));
128 if (h->val == NULL) {
129 return ENOMEM;
131 for (i = 0; i < h->len; i++) {
132 ret = sdb_key_to_Key(&s->val[i],
133 &h->val[i]);
134 if (ret != 0) {
135 free_Keys(h);
136 return ENOMEM;
139 } else {
140 h->val = NULL;
143 return 0;
146 static int sdb_event_to_Event(krb5_context context,
147 const struct sdb_event *s, Event *h)
149 int ret;
151 if (s->principal != NULL) {
152 ret = krb5_copy_principal(context,
153 s->principal,
154 &h->principal);
155 if (ret != 0) {
156 free_Event(h);
157 return ret;
159 } else {
160 h->principal = NULL;
162 h->time = s->time;
164 return 0;
168 static int sdb_entry_to_hdb_entry(krb5_context context,
169 const struct sdb_entry *s,
170 hdb_entry *h)
172 unsigned int i;
173 int rc;
175 ZERO_STRUCTP(h);
177 rc = krb5_copy_principal(context,
178 s->principal,
179 &h->principal);
180 if (rc != 0) {
181 return rc;
184 h->kvno = s->kvno;
186 rc = sdb_keys_to_Keys(&s->keys, &h->keys);
187 if (rc != 0) {
188 goto error;
191 rc = sdb_event_to_Event(context,
192 &s->created_by,
193 &h->created_by);
194 if (rc != 0) {
195 goto error;
198 if (s->modified_by) {
199 h->modified_by = malloc(sizeof(Event));
200 if (h->modified_by == NULL) {
201 rc = ENOMEM;
202 goto error;
205 rc = sdb_event_to_Event(context,
206 s->modified_by,
207 h->modified_by);
208 if (rc != 0) {
209 goto error;
211 } else {
212 h->modified_by = NULL;
215 if (s->valid_start != NULL) {
216 h->valid_start = malloc(sizeof(KerberosTime));
217 if (h->valid_start == NULL) {
218 rc = ENOMEM;
219 goto error;
221 *h->valid_start = *s->valid_start;
222 } else {
223 h->valid_start = NULL;
226 if (s->valid_end != NULL) {
227 h->valid_end = malloc(sizeof(KerberosTime));
228 if (h->valid_end == NULL) {
229 rc = ENOMEM;
230 goto error;
232 *h->valid_end = *s->valid_end;
233 } else {
234 h->valid_end = NULL;
237 if (s->pw_end != NULL) {
238 h->pw_end = malloc(sizeof(KerberosTime));
239 if (h->pw_end == NULL) {
240 rc = ENOMEM;
241 goto error;
243 *h->pw_end = *s->pw_end;
244 } else {
245 h->pw_end = NULL;
248 if (s->max_life != NULL) {
249 h->max_life = malloc(sizeof(unsigned int));
250 if (h->max_life == NULL) {
251 rc = ENOMEM;
252 goto error;
254 *h->max_life = *s->max_life;
255 } else {
256 h->max_life = NULL;
259 if (s->max_renew != NULL) {
260 h->max_renew = malloc(sizeof(unsigned int));
261 if (h->max_renew == NULL) {
262 rc = ENOMEM;
263 goto error;
265 *h->max_renew = *s->max_renew;
266 } else {
267 h->max_renew = NULL;
270 sdb_flags_to_hdb_flags(&s->flags, &h->flags);
272 h->etypes = NULL;
273 if (h->keys.val != NULL) {
274 h->etypes = malloc(sizeof(*h->etypes));
275 if (h->etypes == NULL) {
276 rc = ENOMEM;
277 goto error;
280 h->etypes->len = s->keys.len;
282 h->etypes->val = calloc(h->etypes->len, sizeof(int));
283 if (h->etypes->val == NULL) {
284 rc = ENOMEM;
285 goto error;
288 for (i = 0; i < h->etypes->len; i++) {
289 Key k = h->keys.val[i];
291 h->etypes->val[i] = KRB5_KEY_TYPE(&(k.key));
295 return 0;
296 error:
297 free_hdb_entry(h);
298 return rc;
301 static int samba_kdc_hdb_entry_destructor(struct samba_kdc_entry *p)
303 hdb_entry *entry_ex = p->entry_ex;
304 free_hdb_entry(entry_ex);
306 return 0;
309 int sdb_entry_ex_to_hdb_entry_ex(krb5_context context,
310 const struct sdb_entry_ex *s,
311 hdb_entry *h)
313 int ret;
315 ret = sdb_entry_to_hdb_entry(context, &s->entry, h);
316 if (ret != 0) {
317 return ret;
320 if (s->ctx != NULL) {
321 struct samba_kdc_entry *skdc_entry;
323 skdc_entry = talloc_get_type(s->ctx, struct samba_kdc_entry);
325 h->context = skdc_entry;
327 talloc_set_destructor(skdc_entry,
328 samba_kdc_hdb_entry_destructor);
331 return 0;