1 /*
2 * Copyright (c) 2014 Jerry Lundström <lundstrom.jerry@gmail.com>
3 * Copyright (c) 2014 .SE (The Internet Infrastructure Foundation).
4 * Copyright (c) 2014 OpenDNSSEC AB (svb)
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
24 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30 #include "policy.h"
31 #include "db_error.h"
32
33
34 #include <string.h>
35
36 const db_enum_t policy_enum_set_denial_type[] = {
37 { "NSEC", (policy_denial_type_t)POLICY_DENIAL_TYPE_NSEC },
38 { "NSEC3", (policy_denial_type_t)POLICY_DENIAL_TYPE_NSEC3 },
39 { NULL, 0 }
40 };
41
42 const db_enum_t policy_enum_set_zone_soa_serial[] = {
43 { "counter", (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_COUNTER },
44 { "datecounter", (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_DATECOUNTER },
45 { "unixtime", (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_UNIXTIME },
46 { "keep", (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_KEEP },
47 { NULL, 0 }
48 };
49
50 /**
51 * Create a new policy object.
52 * \param[in] connection a db_connection_t pointer.
53 * \return a policy_t pointer or NULL on error.
54 */
__policy_new_object(const db_connection_t * connection)55 static db_object_t* __policy_new_object(const db_connection_t* connection) {
56 db_object_field_list_t* object_field_list;
57 db_object_field_t* object_field;
58 db_object_t* object;
59
60 if (!(object = db_object_new())
61 || db_object_set_connection(object, connection)
62 || db_object_set_table(object, "policy")
63 || db_object_set_primary_key_name(object, "id")
64 || !(object_field_list = db_object_field_list_new()))
65 {
66 db_object_free(object);
67 return NULL;
68 }
69
70 if (!(object_field = db_object_field_new())
71 || db_object_field_set_name(object_field, "id")
72 || db_object_field_set_type(object_field, DB_TYPE_PRIMARY_KEY)
73 || db_object_field_list_add(object_field_list, object_field))
74 {
75 db_object_field_free(object_field);
76 db_object_field_list_free(object_field_list);
77 db_object_free(object);
78 return NULL;
79 }
80
81 if (!(object_field = db_object_field_new())
82 || db_object_field_set_name(object_field, "rev")
83 || db_object_field_set_type(object_field, DB_TYPE_REVISION)
84 || db_object_field_list_add(object_field_list, object_field))
85 {
86 db_object_field_free(object_field);
87 db_object_field_list_free(object_field_list);
88 db_object_free(object);
89 return NULL;
90 }
91
92 if (!(object_field = db_object_field_new())
93 || db_object_field_set_name(object_field, "name")
94 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
95 || db_object_field_list_add(object_field_list, object_field))
96 {
97 db_object_field_free(object_field);
98 db_object_field_list_free(object_field_list);
99 db_object_free(object);
100 return NULL;
101 }
102
103 if (!(object_field = db_object_field_new())
104 || db_object_field_set_name(object_field, "description")
105 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
106 || db_object_field_list_add(object_field_list, object_field))
107 {
108 db_object_field_free(object_field);
109 db_object_field_list_free(object_field_list);
110 db_object_free(object);
111 return NULL;
112 }
113
114 if (!(object_field = db_object_field_new())
115 || db_object_field_set_name(object_field, "signaturesResign")
116 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
117 || db_object_field_list_add(object_field_list, object_field))
118 {
119 db_object_field_free(object_field);
120 db_object_field_list_free(object_field_list);
121 db_object_free(object);
122 return NULL;
123 }
124
125 if (!(object_field = db_object_field_new())
126 || db_object_field_set_name(object_field, "signaturesRefresh")
127 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
128 || db_object_field_list_add(object_field_list, object_field))
129 {
130 db_object_field_free(object_field);
131 db_object_field_list_free(object_field_list);
132 db_object_free(object);
133 return NULL;
134 }
135
136 if (!(object_field = db_object_field_new())
137 || db_object_field_set_name(object_field, "signaturesJitter")
138 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
139 || db_object_field_list_add(object_field_list, object_field))
140 {
141 db_object_field_free(object_field);
142 db_object_field_list_free(object_field_list);
143 db_object_free(object);
144 return NULL;
145 }
146
147 if (!(object_field = db_object_field_new())
148 || db_object_field_set_name(object_field, "signaturesInceptionOffset")
149 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
150 || db_object_field_list_add(object_field_list, object_field))
151 {
152 db_object_field_free(object_field);
153 db_object_field_list_free(object_field_list);
154 db_object_free(object);
155 return NULL;
156 }
157
158 if (!(object_field = db_object_field_new())
159 || db_object_field_set_name(object_field, "signaturesValidityDefault")
160 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
161 || db_object_field_list_add(object_field_list, object_field))
162 {
163 db_object_field_free(object_field);
164 db_object_field_list_free(object_field_list);
165 db_object_free(object);
166 return NULL;
167 }
168
169 if (!(object_field = db_object_field_new())
170 || db_object_field_set_name(object_field, "signaturesValidityDenial")
171 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
172 || db_object_field_list_add(object_field_list, object_field))
173 {
174 db_object_field_free(object_field);
175 db_object_field_list_free(object_field_list);
176 db_object_free(object);
177 return NULL;
178 }
179
180 if (!(object_field = db_object_field_new())
181 || db_object_field_set_name(object_field, "signaturesValidityKeyset")
182 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
183 || db_object_field_list_add(object_field_list, object_field))
184 {
185 db_object_field_free(object_field);
186 db_object_field_list_free(object_field_list);
187 db_object_free(object);
188 return NULL;
189 }
190
191 if (!(object_field = db_object_field_new())
192 || db_object_field_set_name(object_field, "signaturesMaxZoneTtl")
193 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
194 || db_object_field_list_add(object_field_list, object_field))
195 {
196 db_object_field_free(object_field);
197 db_object_field_list_free(object_field_list);
198 db_object_free(object);
199 return NULL;
200 }
201
202 if (!(object_field = db_object_field_new())
203 || db_object_field_set_name(object_field, "denialType")
204 || db_object_field_set_type(object_field, DB_TYPE_ENUM)
205 || db_object_field_set_enum_set(object_field, policy_enum_set_denial_type)
206 || db_object_field_list_add(object_field_list, object_field))
207 {
208 db_object_field_free(object_field);
209 db_object_field_list_free(object_field_list);
210 db_object_free(object);
211 return NULL;
212 }
213
214 if (!(object_field = db_object_field_new())
215 || db_object_field_set_name(object_field, "denialOptout")
216 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
217 || db_object_field_list_add(object_field_list, object_field))
218 {
219 db_object_field_free(object_field);
220 db_object_field_list_free(object_field_list);
221 db_object_free(object);
222 return NULL;
223 }
224
225 if (!(object_field = db_object_field_new())
226 || db_object_field_set_name(object_field, "denialTtl")
227 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
228 || db_object_field_list_add(object_field_list, object_field))
229 {
230 db_object_field_free(object_field);
231 db_object_field_list_free(object_field_list);
232 db_object_free(object);
233 return NULL;
234 }
235
236 if (!(object_field = db_object_field_new())
237 || db_object_field_set_name(object_field, "denialResalt")
238 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
239 || db_object_field_list_add(object_field_list, object_field))
240 {
241 db_object_field_free(object_field);
242 db_object_field_list_free(object_field_list);
243 db_object_free(object);
244 return NULL;
245 }
246
247 if (!(object_field = db_object_field_new())
248 || db_object_field_set_name(object_field, "denialAlgorithm")
249 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
250 || db_object_field_list_add(object_field_list, object_field))
251 {
252 db_object_field_free(object_field);
253 db_object_field_list_free(object_field_list);
254 db_object_free(object);
255 return NULL;
256 }
257
258 if (!(object_field = db_object_field_new())
259 || db_object_field_set_name(object_field, "denialIterations")
260 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
261 || db_object_field_list_add(object_field_list, object_field))
262 {
263 db_object_field_free(object_field);
264 db_object_field_list_free(object_field_list);
265 db_object_free(object);
266 return NULL;
267 }
268
269 if (!(object_field = db_object_field_new())
270 || db_object_field_set_name(object_field, "denialSaltLength")
271 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
272 || db_object_field_list_add(object_field_list, object_field))
273 {
274 db_object_field_free(object_field);
275 db_object_field_list_free(object_field_list);
276 db_object_free(object);
277 return NULL;
278 }
279
280 if (!(object_field = db_object_field_new())
281 || db_object_field_set_name(object_field, "denialSalt")
282 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
283 || db_object_field_list_add(object_field_list, object_field))
284 {
285 db_object_field_free(object_field);
286 db_object_field_list_free(object_field_list);
287 db_object_free(object);
288 return NULL;
289 }
290
291 if (!(object_field = db_object_field_new())
292 || db_object_field_set_name(object_field, "denialSaltLastChange")
293 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
294 || db_object_field_list_add(object_field_list, object_field))
295 {
296 db_object_field_free(object_field);
297 db_object_field_list_free(object_field_list);
298 db_object_free(object);
299 return NULL;
300 }
301
302 if (!(object_field = db_object_field_new())
303 || db_object_field_set_name(object_field, "keysTtl")
304 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
305 || db_object_field_list_add(object_field_list, object_field))
306 {
307 db_object_field_free(object_field);
308 db_object_field_list_free(object_field_list);
309 db_object_free(object);
310 return NULL;
311 }
312
313 if (!(object_field = db_object_field_new())
314 || db_object_field_set_name(object_field, "keysRetireSafety")
315 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
316 || db_object_field_list_add(object_field_list, object_field))
317 {
318 db_object_field_free(object_field);
319 db_object_field_list_free(object_field_list);
320 db_object_free(object);
321 return NULL;
322 }
323
324 if (!(object_field = db_object_field_new())
325 || db_object_field_set_name(object_field, "keysPublishSafety")
326 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
327 || db_object_field_list_add(object_field_list, object_field))
328 {
329 db_object_field_free(object_field);
330 db_object_field_list_free(object_field_list);
331 db_object_free(object);
332 return NULL;
333 }
334
335 if (!(object_field = db_object_field_new())
336 || db_object_field_set_name(object_field, "keysShared")
337 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
338 || db_object_field_list_add(object_field_list, object_field))
339 {
340 db_object_field_free(object_field);
341 db_object_field_list_free(object_field_list);
342 db_object_free(object);
343 return NULL;
344 }
345
346 if (!(object_field = db_object_field_new())
347 || db_object_field_set_name(object_field, "keysPurgeAfter")
348 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
349 || db_object_field_list_add(object_field_list, object_field))
350 {
351 db_object_field_free(object_field);
352 db_object_field_list_free(object_field_list);
353 db_object_free(object);
354 return NULL;
355 }
356
357 if (!(object_field = db_object_field_new())
358 || db_object_field_set_name(object_field, "zonePropagationDelay")
359 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
360 || db_object_field_list_add(object_field_list, object_field))
361 {
362 db_object_field_free(object_field);
363 db_object_field_list_free(object_field_list);
364 db_object_free(object);
365 return NULL;
366 }
367
368 if (!(object_field = db_object_field_new())
369 || db_object_field_set_name(object_field, "zoneSoaTtl")
370 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
371 || db_object_field_list_add(object_field_list, object_field))
372 {
373 db_object_field_free(object_field);
374 db_object_field_list_free(object_field_list);
375 db_object_free(object);
376 return NULL;
377 }
378
379 if (!(object_field = db_object_field_new())
380 || db_object_field_set_name(object_field, "zoneSoaMinimum")
381 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
382 || db_object_field_list_add(object_field_list, object_field))
383 {
384 db_object_field_free(object_field);
385 db_object_field_list_free(object_field_list);
386 db_object_free(object);
387 return NULL;
388 }
389
390 if (!(object_field = db_object_field_new())
391 || db_object_field_set_name(object_field, "zoneSoaSerial")
392 || db_object_field_set_type(object_field, DB_TYPE_ENUM)
393 || db_object_field_set_enum_set(object_field, policy_enum_set_zone_soa_serial)
394 || db_object_field_list_add(object_field_list, object_field))
395 {
396 db_object_field_free(object_field);
397 db_object_field_list_free(object_field_list);
398 db_object_free(object);
399 return NULL;
400 }
401
402 if (!(object_field = db_object_field_new())
403 || db_object_field_set_name(object_field, "parentRegistrationDelay")
404 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
405 || db_object_field_list_add(object_field_list, object_field))
406 {
407 db_object_field_free(object_field);
408 db_object_field_list_free(object_field_list);
409 db_object_free(object);
410 return NULL;
411 }
412
413 if (!(object_field = db_object_field_new())
414 || db_object_field_set_name(object_field, "parentPropagationDelay")
415 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
416 || db_object_field_list_add(object_field_list, object_field))
417 {
418 db_object_field_free(object_field);
419 db_object_field_list_free(object_field_list);
420 db_object_free(object);
421 return NULL;
422 }
423
424 if (!(object_field = db_object_field_new())
425 || db_object_field_set_name(object_field, "parentDsTtl")
426 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
427 || db_object_field_list_add(object_field_list, object_field))
428 {
429 db_object_field_free(object_field);
430 db_object_field_list_free(object_field_list);
431 db_object_free(object);
432 return NULL;
433 }
434
435 if (!(object_field = db_object_field_new())
436 || db_object_field_set_name(object_field, "parentSoaTtl")
437 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
438 || db_object_field_list_add(object_field_list, object_field))
439 {
440 db_object_field_free(object_field);
441 db_object_field_list_free(object_field_list);
442 db_object_free(object);
443 return NULL;
444 }
445
446 if (!(object_field = db_object_field_new())
447 || db_object_field_set_name(object_field, "parentSoaMinimum")
448 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
449 || db_object_field_list_add(object_field_list, object_field))
450 {
451 db_object_field_free(object_field);
452 db_object_field_list_free(object_field_list);
453 db_object_free(object);
454 return NULL;
455 }
456
457 if (!(object_field = db_object_field_new())
458 || db_object_field_set_name(object_field, "passthrough")
459 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
460 || db_object_field_list_add(object_field_list, object_field))
461 {
462 db_object_field_free(object_field);
463 db_object_field_list_free(object_field_list);
464 db_object_free(object);
465 return NULL;
466 }
467
468 if (db_object_set_object_field_list(object, object_field_list)) {
469 db_object_field_list_free(object_field_list);
470 db_object_free(object);
471 return NULL;
472 }
473
474 return object;
475 }
476
477 /* POLICY */
478
policy_new(const db_connection_t * connection)479 policy_t* policy_new(const db_connection_t* connection) {
480 policy_t* policy =
481 (policy_t*)calloc(1, sizeof(policy_t));
482
483 if (policy) {
484 if (!(policy->dbo = __policy_new_object(connection))) {
485 free(policy);
486 return NULL;
487 }
488 db_value_reset(&(policy->id));
489 db_value_reset(&(policy->rev));
490 policy->signatures_max_zone_ttl = 86400;
491 policy->denial_type = POLICY_DENIAL_TYPE_INVALID;
492 policy->denial_salt = strdup("");
493 policy->zone_soa_serial = POLICY_ZONE_SOA_SERIAL_INVALID;
494 }
495
496 return policy;
497 }
498
policy_new_copy(const policy_t * policy)499 policy_t* policy_new_copy(const policy_t* policy) {
500 policy_t* new_policy;
501
502 if (!policy) {
503 return NULL;
504 }
505 if (!policy->dbo) {
506 return NULL;
507 }
508
509 if (!(new_policy = policy_new(db_object_connection(policy->dbo)))
510 || policy_copy(new_policy, policy))
511 {
512 policy_free(new_policy);
513 return NULL;
514 }
515 return new_policy;
516 }
517
policy_free(policy_t * policy)518 void policy_free(policy_t* policy) {
519 if (policy) {
520 if (policy->dbo) {
521 db_object_free(policy->dbo);
522 }
523 db_value_reset(&(policy->id));
524 db_value_reset(&(policy->rev));
525 if (policy->name) {
526 free(policy->name);
527 }
528 if (policy->description) {
529 free(policy->description);
530 }
531 if (policy->denial_salt) {
532 free(policy->denial_salt);
533 }
534 if (policy->policy_key_list) {
535 policy_key_list_free(policy->policy_key_list);
536 }
537 if (policy->zone_list) {
538 zone_list_db_free(policy->zone_list);
539 }
540 if (policy->hsm_key_list) {
541 hsm_key_list_free(policy->hsm_key_list);
542 }
543 free(policy);
544 }
545 }
546
policy_copy(policy_t * policy,const policy_t * policy_copy)547 int policy_copy(policy_t* policy, const policy_t* policy_copy) {
548 char* name_text = NULL;
549 char* description_text = NULL;
550 char* denial_salt_text = NULL;
551
552 if (!policy) {
553 return DB_ERROR_UNKNOWN;
554 }
555 if (!policy_copy) {
556 return DB_ERROR_UNKNOWN;
557 }
558
559 if (policy_copy->name) {
560 if (!(name_text = strdup(policy_copy->name))) {
561 return DB_ERROR_UNKNOWN;
562 }
563 }
564 if (policy_copy->description) {
565 if (!(description_text = strdup(policy_copy->description))) {
566 if (name_text) {
567 free(name_text);
568 }
569 return DB_ERROR_UNKNOWN;
570 }
571 }
572 if (policy_copy->denial_salt) {
573 if (!(denial_salt_text = strdup(policy_copy->denial_salt))) {
574 if (name_text) {
575 free(name_text);
576 }
577 if (description_text) {
578 free(description_text);
579 }
580 return DB_ERROR_UNKNOWN;
581 }
582 }
583 if (db_value_copy(&(policy->id), &(policy_copy->id))) {
584 if (name_text) {
585 free(name_text);
586 }
587 if (description_text) {
588 free(description_text);
589 }
590 if (denial_salt_text) {
591 free(denial_salt_text);
592 }
593 return DB_ERROR_UNKNOWN;
594 }
595 if (db_value_copy(&(policy->rev), &(policy_copy->rev))) {
596 if (name_text) {
597 free(name_text);
598 }
599 if (description_text) {
600 free(description_text);
601 }
602 if (denial_salt_text) {
603 free(denial_salt_text);
604 }
605 return DB_ERROR_UNKNOWN;
606 }
607 if (policy->policy_key_list) {
608 policy_key_list_free(policy->policy_key_list);
609 policy->policy_key_list = NULL;
610 }
611 if (policy_copy->policy_key_list
612 && !(policy->policy_key_list = policy_key_list_new_copy(policy_copy->policy_key_list)))
613 {
614 if (name_text) {
615 free(name_text);
616 }
617 if (description_text) {
618 free(description_text);
619 }
620 if (denial_salt_text) {
621 free(denial_salt_text);
622 }
623 return DB_ERROR_UNKNOWN;
624 }
625 if (policy->zone_list) {
626 zone_list_db_free(policy->zone_list);
627 policy->zone_list = NULL;
628 }
629 if (policy_copy->zone_list
630 && !(policy->zone_list = zone_list_db_new_copy(policy_copy->zone_list)))
631 {
632 if (name_text) {
633 free(name_text);
634 }
635 if (description_text) {
636 free(description_text);
637 }
638 if (denial_salt_text) {
639 free(denial_salt_text);
640 }
641 return DB_ERROR_UNKNOWN;
642 }
643 if (policy->hsm_key_list) {
644 hsm_key_list_free(policy->hsm_key_list);
645 policy->hsm_key_list = NULL;
646 }
647 if (policy_copy->hsm_key_list
648 && !(policy->hsm_key_list = hsm_key_list_new_copy(policy_copy->hsm_key_list)))
649 {
650 if (name_text) {
651 free(name_text);
652 }
653 if (description_text) {
654 free(description_text);
655 }
656 if (denial_salt_text) {
657 free(denial_salt_text);
658 }
659 return DB_ERROR_UNKNOWN;
660 }
661 if (policy->name) {
662 free(policy->name);
663 }
664 policy->name = name_text;
665 if (policy->description) {
666 free(policy->description);
667 }
668 policy->description = description_text;
669 policy->signatures_resign = policy_copy->signatures_resign;
670 policy->signatures_refresh = policy_copy->signatures_refresh;
671 policy->signatures_jitter = policy_copy->signatures_jitter;
672 policy->signatures_inception_offset = policy_copy->signatures_inception_offset;
673 policy->signatures_validity_default = policy_copy->signatures_validity_default;
674 policy->signatures_validity_denial = policy_copy->signatures_validity_denial;
675 policy->signatures_validity_keyset = policy_copy->signatures_validity_keyset;
676 policy->signatures_max_zone_ttl = policy_copy->signatures_max_zone_ttl;
677 policy->denial_type = policy_copy->denial_type;
678 policy->denial_optout = policy_copy->denial_optout;
679 policy->denial_ttl = policy_copy->denial_ttl;
680 policy->denial_resalt = policy_copy->denial_resalt;
681 policy->denial_algorithm = policy_copy->denial_algorithm;
682 policy->denial_iterations = policy_copy->denial_iterations;
683 policy->denial_salt_length = policy_copy->denial_salt_length;
684 if (policy->denial_salt) {
685 free(policy->denial_salt);
686 }
687 policy->denial_salt = denial_salt_text;
688 policy->denial_salt_last_change = policy_copy->denial_salt_last_change;
689 policy->keys_ttl = policy_copy->keys_ttl;
690 policy->keys_retire_safety = policy_copy->keys_retire_safety;
691 policy->keys_publish_safety = policy_copy->keys_publish_safety;
692 policy->keys_shared = policy_copy->keys_shared;
693 policy->keys_purge_after = policy_copy->keys_purge_after;
694 policy->zone_propagation_delay = policy_copy->zone_propagation_delay;
695 policy->zone_soa_ttl = policy_copy->zone_soa_ttl;
696 policy->zone_soa_minimum = policy_copy->zone_soa_minimum;
697 policy->zone_soa_serial = policy_copy->zone_soa_serial;
698 policy->parent_registration_delay = policy_copy->parent_registration_delay;
699 policy->parent_propagation_delay = policy_copy->parent_propagation_delay;
700 policy->parent_ds_ttl = policy_copy->parent_ds_ttl;
701 policy->parent_soa_ttl = policy_copy->parent_soa_ttl;
702 policy->parent_soa_minimum = policy_copy->parent_soa_minimum;
703 policy->passthrough = policy_copy->passthrough;
704 return DB_OK;
705 }
706
policy_from_result(policy_t * policy,const db_result_t * result)707 int policy_from_result(policy_t* policy, const db_result_t* result) {
708 const db_value_set_t* value_set;
709 int denial_type;
710 int zone_soa_serial;
711
712 if (!policy) {
713 return DB_ERROR_UNKNOWN;
714 }
715 if (!result) {
716 return DB_ERROR_UNKNOWN;
717 }
718
719 db_value_reset(&(policy->id));
720 db_value_reset(&(policy->rev));
721 if (policy->name) {
722 free(policy->name);
723 }
724 policy->name = NULL;
725 if (policy->description) {
726 free(policy->description);
727 }
728 policy->description = NULL;
729 if (policy->denial_salt) {
730 free(policy->denial_salt);
731 }
732 policy->denial_salt = NULL;
733 policy->signatures_validity_keyset = 0;
734 if (!(value_set = db_result_value_set(result))
735 || db_value_set_size(value_set) != 36
736 || db_value_copy(&(policy->id), db_value_set_at(value_set, 0))
737 || db_value_copy(&(policy->rev), db_value_set_at(value_set, 1))
738 || db_value_to_text(db_value_set_at(value_set, 2), &(policy->name))
739 || db_value_to_text(db_value_set_at(value_set, 3), &(policy->description))
740 || db_value_to_uint32(db_value_set_at(value_set, 4), &(policy->signatures_resign))
741 || db_value_to_uint32(db_value_set_at(value_set, 5), &(policy->signatures_refresh))
742 || db_value_to_uint32(db_value_set_at(value_set, 6), &(policy->signatures_jitter))
743 || db_value_to_uint32(db_value_set_at(value_set, 7), &(policy->signatures_inception_offset))
744 || db_value_to_uint32(db_value_set_at(value_set, 8), &(policy->signatures_validity_default))
745 || db_value_to_uint32(db_value_set_at(value_set, 9), &(policy->signatures_validity_denial))
746 || (db_value_to_uint32(db_value_set_at(value_set, 10), &(policy->signatures_validity_keyset)) && 0)
747 || db_value_to_uint32(db_value_set_at(value_set, 11), &(policy->signatures_max_zone_ttl))
748 || db_value_to_enum_value(db_value_set_at(value_set, 12), &denial_type, policy_enum_set_denial_type)
749 || db_value_to_uint32(db_value_set_at(value_set, 13), &(policy->denial_optout))
750 || db_value_to_uint32(db_value_set_at(value_set, 14), &(policy->denial_ttl))
751 || db_value_to_uint32(db_value_set_at(value_set, 15), &(policy->denial_resalt))
752 || db_value_to_uint32(db_value_set_at(value_set, 16), &(policy->denial_algorithm))
753 || db_value_to_uint32(db_value_set_at(value_set, 17), &(policy->denial_iterations))
754 || db_value_to_uint32(db_value_set_at(value_set, 18), &(policy->denial_salt_length))
755 || db_value_to_text(db_value_set_at(value_set, 19), &(policy->denial_salt))
756 || db_value_to_uint32(db_value_set_at(value_set, 20), &(policy->denial_salt_last_change))
757 || db_value_to_uint32(db_value_set_at(value_set, 21), &(policy->keys_ttl))
758 || db_value_to_uint32(db_value_set_at(value_set, 22), &(policy->keys_retire_safety))
759 || db_value_to_uint32(db_value_set_at(value_set, 23), &(policy->keys_publish_safety))
760 || db_value_to_uint32(db_value_set_at(value_set, 24), &(policy->keys_shared))
761 || db_value_to_uint32(db_value_set_at(value_set, 25), &(policy->keys_purge_after))
762 || db_value_to_uint32(db_value_set_at(value_set, 26), &(policy->zone_propagation_delay))
763 || db_value_to_uint32(db_value_set_at(value_set, 27), &(policy->zone_soa_ttl))
764 || db_value_to_uint32(db_value_set_at(value_set, 28), &(policy->zone_soa_minimum))
765 || db_value_to_enum_value(db_value_set_at(value_set, 29), &zone_soa_serial, policy_enum_set_zone_soa_serial)
766 || db_value_to_uint32(db_value_set_at(value_set, 30), &(policy->parent_registration_delay))
767 || db_value_to_uint32(db_value_set_at(value_set, 31), &(policy->parent_propagation_delay))
768 || db_value_to_uint32(db_value_set_at(value_set, 32), &(policy->parent_ds_ttl))
769 || db_value_to_uint32(db_value_set_at(value_set, 33), &(policy->parent_soa_ttl))
770 || db_value_to_uint32(db_value_set_at(value_set, 34), &(policy->parent_soa_minimum))
771 || db_value_to_uint32(db_value_set_at(value_set, 35), &(policy->passthrough)))
772 {
773 return DB_ERROR_UNKNOWN;
774 }
775
776 if (denial_type == (policy_denial_type_t)POLICY_DENIAL_TYPE_NSEC) {
777 policy->denial_type = POLICY_DENIAL_TYPE_NSEC;
778 }
779 else if (denial_type == (policy_denial_type_t)POLICY_DENIAL_TYPE_NSEC3) {
780 policy->denial_type = POLICY_DENIAL_TYPE_NSEC3;
781 }
782 else {
783 return DB_ERROR_UNKNOWN;
784 }
785
786 if (zone_soa_serial == (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_COUNTER) {
787 policy->zone_soa_serial = POLICY_ZONE_SOA_SERIAL_COUNTER;
788 }
789 else if (zone_soa_serial == (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_DATECOUNTER) {
790 policy->zone_soa_serial = POLICY_ZONE_SOA_SERIAL_DATECOUNTER;
791 }
792 else if (zone_soa_serial == (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_UNIXTIME) {
793 policy->zone_soa_serial = POLICY_ZONE_SOA_SERIAL_UNIXTIME;
794 }
795 else if (zone_soa_serial == (policy_zone_soa_serial_t)POLICY_ZONE_SOA_SERIAL_KEEP) {
796 policy->zone_soa_serial = POLICY_ZONE_SOA_SERIAL_KEEP;
797 }
798 else {
799 return DB_ERROR_UNKNOWN;
800 }
801
802 return DB_OK;
803 }
804
policy_id(const policy_t * policy)805 const db_value_t* policy_id(const policy_t* policy) {
806 if (!policy) {
807 return NULL;
808 }
809
810 return &(policy->id);
811 }
812
policy_name(const policy_t * policy)813 const char* policy_name(const policy_t* policy) {
814 if (!policy) {
815 return NULL;
816 }
817
818 return policy->name;
819 }
820
policy_description(const policy_t * policy)821 const char* policy_description(const policy_t* policy) {
822 if (!policy) {
823 return NULL;
824 }
825
826 return policy->description;
827 }
828
policy_signatures_resign(const policy_t * policy)829 unsigned int policy_signatures_resign(const policy_t* policy) {
830 if (!policy) {
831 return 0;
832 }
833
834 return policy->signatures_resign;
835 }
836
policy_signatures_refresh(const policy_t * policy)837 unsigned int policy_signatures_refresh(const policy_t* policy) {
838 if (!policy) {
839 return 0;
840 }
841
842 return policy->signatures_refresh;
843 }
844
policy_signatures_jitter(const policy_t * policy)845 unsigned int policy_signatures_jitter(const policy_t* policy) {
846 if (!policy) {
847 return 0;
848 }
849
850 return policy->signatures_jitter;
851 }
852
policy_signatures_inception_offset(const policy_t * policy)853 unsigned int policy_signatures_inception_offset(const policy_t* policy) {
854 if (!policy) {
855 return 0;
856 }
857
858 return policy->signatures_inception_offset;
859 }
860
policy_signatures_validity_default(const policy_t * policy)861 unsigned int policy_signatures_validity_default(const policy_t* policy) {
862 if (!policy) {
863 return 0;
864 }
865
866 return policy->signatures_validity_default;
867 }
868
policy_signatures_validity_denial(const policy_t * policy)869 unsigned int policy_signatures_validity_denial(const policy_t* policy) {
870 if (!policy) {
871 return 0;
872 }
873
874 return policy->signatures_validity_denial;
875 }
876
policy_signatures_validity_keyset(const policy_t * policy)877 unsigned int policy_signatures_validity_keyset(const policy_t* policy) {
878 if (!policy) {
879 return 0;
880 }
881
882 return policy->signatures_validity_keyset;
883 }
884
policy_signatures_max_zone_ttl(const policy_t * policy)885 unsigned int policy_signatures_max_zone_ttl(const policy_t* policy) {
886 if (!policy) {
887 return 0;
888 }
889
890 return policy->signatures_max_zone_ttl;
891 }
892
policy_denial_type(const policy_t * policy)893 policy_denial_type_t policy_denial_type(const policy_t* policy) {
894 if (!policy) {
895 return POLICY_DENIAL_TYPE_INVALID;
896 }
897
898 return policy->denial_type;
899 }
900
policy_denial_optout(const policy_t * policy)901 unsigned int policy_denial_optout(const policy_t* policy) {
902 if (!policy) {
903 return 0;
904 }
905
906 return policy->denial_optout;
907 }
908
policy_denial_ttl(const policy_t * policy)909 unsigned int policy_denial_ttl(const policy_t* policy) {
910 if (!policy) {
911 return 0;
912 }
913
914 return policy->denial_ttl;
915 }
916
policy_denial_resalt(const policy_t * policy)917 unsigned int policy_denial_resalt(const policy_t* policy) {
918 if (!policy) {
919 return 0;
920 }
921
922 return policy->denial_resalt;
923 }
924
policy_denial_algorithm(const policy_t * policy)925 unsigned int policy_denial_algorithm(const policy_t* policy) {
926 if (!policy) {
927 return 0;
928 }
929
930 return policy->denial_algorithm;
931 }
932
policy_denial_iterations(const policy_t * policy)933 unsigned int policy_denial_iterations(const policy_t* policy) {
934 if (!policy) {
935 return 0;
936 }
937
938 return policy->denial_iterations;
939 }
940
policy_denial_salt_length(const policy_t * policy)941 unsigned int policy_denial_salt_length(const policy_t* policy) {
942 if (!policy) {
943 return 0;
944 }
945
946 return policy->denial_salt_length;
947 }
948
policy_denial_salt(const policy_t * policy)949 const char* policy_denial_salt(const policy_t* policy) {
950 if (!policy) {
951 return NULL;
952 }
953
954 return policy->denial_salt;
955 }
956
policy_denial_salt_last_change(const policy_t * policy)957 unsigned int policy_denial_salt_last_change(const policy_t* policy) {
958 if (!policy) {
959 return 0;
960 }
961
962 return policy->denial_salt_last_change;
963 }
964
policy_keys_ttl(const policy_t * policy)965 unsigned int policy_keys_ttl(const policy_t* policy) {
966 if (!policy) {
967 return 0;
968 }
969
970 return policy->keys_ttl;
971 }
972
policy_keys_retire_safety(const policy_t * policy)973 unsigned int policy_keys_retire_safety(const policy_t* policy) {
974 if (!policy) {
975 return 0;
976 }
977
978 return policy->keys_retire_safety;
979 }
980
policy_keys_publish_safety(const policy_t * policy)981 unsigned int policy_keys_publish_safety(const policy_t* policy) {
982 if (!policy) {
983 return 0;
984 }
985
986 return policy->keys_publish_safety;
987 }
988
policy_keys_shared(const policy_t * policy)989 unsigned int policy_keys_shared(const policy_t* policy) {
990 if (!policy) {
991 return 0;
992 }
993
994 return policy->keys_shared;
995 }
996
policy_keys_purge_after(const policy_t * policy)997 unsigned int policy_keys_purge_after(const policy_t* policy) {
998 if (!policy) {
999 return 0;
1000 }
1001
1002 return policy->keys_purge_after;
1003 }
1004
policy_zone_propagation_delay(const policy_t * policy)1005 unsigned int policy_zone_propagation_delay(const policy_t* policy) {
1006 if (!policy) {
1007 return 0;
1008 }
1009
1010 return policy->zone_propagation_delay;
1011 }
1012
policy_zone_soa_ttl(const policy_t * policy)1013 unsigned int policy_zone_soa_ttl(const policy_t* policy) {
1014 if (!policy) {
1015 return 0;
1016 }
1017
1018 return policy->zone_soa_ttl;
1019 }
1020
policy_zone_soa_minimum(const policy_t * policy)1021 unsigned int policy_zone_soa_minimum(const policy_t* policy) {
1022 if (!policy) {
1023 return 0;
1024 }
1025
1026 return policy->zone_soa_minimum;
1027 }
1028
policy_zone_soa_serial_text(const policy_t * policy)1029 const char* policy_zone_soa_serial_text(const policy_t* policy) {
1030 const db_enum_t* enum_set = policy_enum_set_zone_soa_serial;
1031
1032 if (!policy) {
1033 return NULL;
1034 }
1035
1036 while (enum_set->text) {
1037 if (enum_set->value == policy->zone_soa_serial) {
1038 return enum_set->text;
1039 }
1040 enum_set++;
1041 }
1042 return NULL;
1043 }
1044
policy_parent_registration_delay(const policy_t * policy)1045 unsigned int policy_parent_registration_delay(const policy_t* policy) {
1046 if (!policy) {
1047 return 0;
1048 }
1049
1050 return policy->parent_registration_delay;
1051 }
1052
policy_parent_propagation_delay(const policy_t * policy)1053 unsigned int policy_parent_propagation_delay(const policy_t* policy) {
1054 if (!policy) {
1055 return 0;
1056 }
1057
1058 return policy->parent_propagation_delay;
1059 }
1060
policy_parent_ds_ttl(const policy_t * policy)1061 unsigned int policy_parent_ds_ttl(const policy_t* policy) {
1062 if (!policy) {
1063 return 0;
1064 }
1065
1066 return policy->parent_ds_ttl;
1067 }
1068
policy_parent_soa_ttl(const policy_t * policy)1069 unsigned int policy_parent_soa_ttl(const policy_t* policy) {
1070 if (!policy) {
1071 return 0;
1072 }
1073
1074 return policy->parent_soa_ttl;
1075 }
1076
policy_parent_soa_minimum(const policy_t * policy)1077 unsigned int policy_parent_soa_minimum(const policy_t* policy) {
1078 if (!policy) {
1079 return 0;
1080 }
1081
1082 return policy->parent_soa_minimum;
1083 }
1084
policy_passthrough(const policy_t * policy)1085 unsigned int policy_passthrough(const policy_t* policy) {
1086 if (!policy) {
1087 return 0;
1088 }
1089
1090 return policy->passthrough;
1091 }
1092
policy_zone_list(policy_t * policy)1093 zone_list_db_t* policy_zone_list(policy_t* policy) {
1094
1095 if (!policy) {
1096 return NULL;
1097 }
1098 if (!policy->dbo) {
1099 return NULL;
1100 }
1101
1102 if (!policy->zone_list
1103 && policy_retrieve_zone_list(policy))
1104 {
1105 return NULL;
1106 }
1107
1108 return policy->zone_list;
1109 }
1110
policy_retrieve_zone_list(policy_t * policy)1111 int policy_retrieve_zone_list(policy_t* policy) {
1112 db_clause_list_t* clause_list;
1113
1114 if (!policy) {
1115 return DB_ERROR_UNKNOWN;
1116 }
1117 if (!policy->dbo) {
1118 return DB_ERROR_UNKNOWN;
1119 }
1120
1121 if (policy->zone_list) {
1122 zone_list_db_free(policy->zone_list);
1123 policy->zone_list = NULL;
1124 }
1125
1126 if (!(clause_list = db_clause_list_new())
1127 || !zone_db_policy_id_clause(clause_list, policy_id(policy))
1128 || !(policy->zone_list = zone_list_db_new(db_object_connection(policy->dbo)))
1129 || zone_list_db_object_store(policy->zone_list)
1130 || zone_list_db_get_by_clauses(policy->zone_list, clause_list))
1131 {
1132 zone_list_db_free(policy->zone_list);
1133 policy->zone_list = NULL;
1134 db_clause_list_free(clause_list);
1135 return DB_ERROR_UNKNOWN;
1136 }
1137 db_clause_list_free(clause_list);
1138
1139 return DB_OK;
1140 }
1141
policy_set_name(policy_t * policy,const char * name_text)1142 int policy_set_name(policy_t* policy, const char* name_text) {
1143 char* new_name;
1144
1145 if (!policy) {
1146 return DB_ERROR_UNKNOWN;
1147 }
1148 if (!name_text) {
1149 return DB_ERROR_UNKNOWN;
1150 }
1151
1152 if (!(new_name = strdup(name_text))) {
1153 return DB_ERROR_UNKNOWN;
1154 }
1155
1156 if (policy->name) {
1157 free(policy->name);
1158 }
1159 policy->name = new_name;
1160
1161 return DB_OK;
1162 }
1163
policy_set_description(policy_t * policy,const char * description_text)1164 int policy_set_description(policy_t* policy, const char* description_text) {
1165 char* new_description;
1166
1167 if (!policy) {
1168 return DB_ERROR_UNKNOWN;
1169 }
1170 if (!description_text) {
1171 return DB_ERROR_UNKNOWN;
1172 }
1173
1174 if (!(new_description = strdup(description_text))) {
1175 return DB_ERROR_UNKNOWN;
1176 }
1177
1178 if (policy->description) {
1179 free(policy->description);
1180 }
1181 policy->description = new_description;
1182
1183 return DB_OK;
1184 }
1185
policy_set_signatures_resign(policy_t * policy,unsigned int signatures_resign)1186 int policy_set_signatures_resign(policy_t* policy, unsigned int signatures_resign) {
1187 if (!policy) {
1188 return DB_ERROR_UNKNOWN;
1189 }
1190
1191 policy->signatures_resign = signatures_resign;
1192
1193 return DB_OK;
1194 }
1195
policy_set_signatures_refresh(policy_t * policy,unsigned int signatures_refresh)1196 int policy_set_signatures_refresh(policy_t* policy, unsigned int signatures_refresh) {
1197 if (!policy) {
1198 return DB_ERROR_UNKNOWN;
1199 }
1200
1201 policy->signatures_refresh = signatures_refresh;
1202
1203 return DB_OK;
1204 }
1205
policy_set_signatures_jitter(policy_t * policy,unsigned int signatures_jitter)1206 int policy_set_signatures_jitter(policy_t* policy, unsigned int signatures_jitter) {
1207 if (!policy) {
1208 return DB_ERROR_UNKNOWN;
1209 }
1210
1211 policy->signatures_jitter = signatures_jitter;
1212
1213 return DB_OK;
1214 }
1215
policy_set_signatures_inception_offset(policy_t * policy,unsigned int signatures_inception_offset)1216 int policy_set_signatures_inception_offset(policy_t* policy, unsigned int signatures_inception_offset) {
1217 if (!policy) {
1218 return DB_ERROR_UNKNOWN;
1219 }
1220
1221 policy->signatures_inception_offset = signatures_inception_offset;
1222
1223 return DB_OK;
1224 }
1225
policy_set_signatures_validity_default(policy_t * policy,unsigned int signatures_validity_default)1226 int policy_set_signatures_validity_default(policy_t* policy, unsigned int signatures_validity_default) {
1227 if (!policy) {
1228 return DB_ERROR_UNKNOWN;
1229 }
1230
1231 policy->signatures_validity_default = signatures_validity_default;
1232
1233 return DB_OK;
1234 }
1235
policy_set_signatures_validity_denial(policy_t * policy,unsigned int signatures_validity_denial)1236 int policy_set_signatures_validity_denial(policy_t* policy, unsigned int signatures_validity_denial) {
1237 if (!policy) {
1238 return DB_ERROR_UNKNOWN;
1239 }
1240
1241 policy->signatures_validity_denial = signatures_validity_denial;
1242
1243 return DB_OK;
1244 }
1245
policy_set_signatures_validity_keyset(policy_t * policy,unsigned int signatures_validity_keyset)1246 int policy_set_signatures_validity_keyset(policy_t* policy, unsigned int signatures_validity_keyset) {
1247 if (!policy) {
1248 return DB_ERROR_UNKNOWN;
1249 }
1250
1251 policy->signatures_validity_keyset = signatures_validity_keyset;
1252
1253 return DB_OK;
1254 }
1255
policy_set_signatures_max_zone_ttl(policy_t * policy,unsigned int signatures_max_zone_ttl)1256 int policy_set_signatures_max_zone_ttl(policy_t* policy, unsigned int signatures_max_zone_ttl) {
1257 if (!policy) {
1258 return DB_ERROR_UNKNOWN;
1259 }
1260
1261 policy->signatures_max_zone_ttl = signatures_max_zone_ttl;
1262
1263 return DB_OK;
1264 }
1265
policy_set_denial_type(policy_t * policy,policy_denial_type_t denial_type)1266 int policy_set_denial_type(policy_t* policy, policy_denial_type_t denial_type) {
1267 if (!policy) {
1268 return DB_ERROR_UNKNOWN;
1269 }
1270 if (denial_type == POLICY_DENIAL_TYPE_INVALID) {
1271 return DB_ERROR_UNKNOWN;
1272 }
1273
1274 policy->denial_type = denial_type;
1275
1276 return DB_OK;
1277 }
1278
policy_set_denial_optout(policy_t * policy,unsigned int denial_optout)1279 int policy_set_denial_optout(policy_t* policy, unsigned int denial_optout) {
1280 if (!policy) {
1281 return DB_ERROR_UNKNOWN;
1282 }
1283
1284 policy->denial_optout = denial_optout;
1285
1286 return DB_OK;
1287 }
1288
policy_set_denial_ttl(policy_t * policy,unsigned int denial_ttl)1289 int policy_set_denial_ttl(policy_t* policy, unsigned int denial_ttl) {
1290 if (!policy) {
1291 return DB_ERROR_UNKNOWN;
1292 }
1293
1294 policy->denial_ttl = denial_ttl;
1295
1296 return DB_OK;
1297 }
1298
policy_set_denial_resalt(policy_t * policy,unsigned int denial_resalt)1299 int policy_set_denial_resalt(policy_t* policy, unsigned int denial_resalt) {
1300 if (!policy) {
1301 return DB_ERROR_UNKNOWN;
1302 }
1303
1304 policy->denial_resalt = denial_resalt;
1305
1306 return DB_OK;
1307 }
1308
policy_set_denial_algorithm(policy_t * policy,unsigned int denial_algorithm)1309 int policy_set_denial_algorithm(policy_t* policy, unsigned int denial_algorithm) {
1310 if (!policy) {
1311 return DB_ERROR_UNKNOWN;
1312 }
1313
1314 if (denial_algorithm > 255) {
1315 return DB_ERROR_UNKNOWN;
1316 }
1317
1318 policy->denial_algorithm = denial_algorithm;
1319
1320 return DB_OK;
1321 }
1322
policy_set_denial_iterations(policy_t * policy,unsigned int denial_iterations)1323 int policy_set_denial_iterations(policy_t* policy, unsigned int denial_iterations) {
1324 if (!policy) {
1325 return DB_ERROR_UNKNOWN;
1326 }
1327
1328 if (denial_iterations > 65535) {
1329 return DB_ERROR_UNKNOWN;
1330 }
1331
1332 policy->denial_iterations = denial_iterations;
1333
1334 return DB_OK;
1335 }
1336
policy_set_denial_salt_length(policy_t * policy,unsigned int denial_salt_length)1337 int policy_set_denial_salt_length(policy_t* policy, unsigned int denial_salt_length) {
1338 if (!policy) {
1339 return DB_ERROR_UNKNOWN;
1340 }
1341
1342 if (denial_salt_length > 255) {
1343 return DB_ERROR_UNKNOWN;
1344 }
1345
1346 policy->denial_salt_length = denial_salt_length;
1347
1348 return DB_OK;
1349 }
1350
policy_set_denial_salt(policy_t * policy,const char * denial_salt_text)1351 int policy_set_denial_salt(policy_t* policy, const char* denial_salt_text) {
1352 char* new_denial_salt;
1353
1354 if (!policy) {
1355 return DB_ERROR_UNKNOWN;
1356 }
1357 if (!denial_salt_text) {
1358 return DB_ERROR_UNKNOWN;
1359 }
1360
1361 if (!(new_denial_salt = strdup(denial_salt_text))) {
1362 return DB_ERROR_UNKNOWN;
1363 }
1364
1365 if (policy->denial_salt) {
1366 free(policy->denial_salt);
1367 }
1368 policy->denial_salt = new_denial_salt;
1369
1370 return DB_OK;
1371 }
1372
policy_set_denial_salt_last_change(policy_t * policy,unsigned int denial_salt_last_change)1373 int policy_set_denial_salt_last_change(policy_t* policy, unsigned int denial_salt_last_change) {
1374 if (!policy) {
1375 return DB_ERROR_UNKNOWN;
1376 }
1377
1378 policy->denial_salt_last_change = denial_salt_last_change;
1379
1380 return DB_OK;
1381 }
1382
policy_set_keys_ttl(policy_t * policy,unsigned int keys_ttl)1383 int policy_set_keys_ttl(policy_t* policy, unsigned int keys_ttl) {
1384 if (!policy) {
1385 return DB_ERROR_UNKNOWN;
1386 }
1387
1388 policy->keys_ttl = keys_ttl;
1389
1390 return DB_OK;
1391 }
1392
policy_set_keys_retire_safety(policy_t * policy,unsigned int keys_retire_safety)1393 int policy_set_keys_retire_safety(policy_t* policy, unsigned int keys_retire_safety) {
1394 if (!policy) {
1395 return DB_ERROR_UNKNOWN;
1396 }
1397
1398 policy->keys_retire_safety = keys_retire_safety;
1399
1400 return DB_OK;
1401 }
1402
policy_set_keys_publish_safety(policy_t * policy,unsigned int keys_publish_safety)1403 int policy_set_keys_publish_safety(policy_t* policy, unsigned int keys_publish_safety) {
1404 if (!policy) {
1405 return DB_ERROR_UNKNOWN;
1406 }
1407
1408 policy->keys_publish_safety = keys_publish_safety;
1409
1410 return DB_OK;
1411 }
1412
policy_set_keys_shared(policy_t * policy,unsigned int keys_shared)1413 int policy_set_keys_shared(policy_t* policy, unsigned int keys_shared) {
1414 if (!policy) {
1415 return DB_ERROR_UNKNOWN;
1416 }
1417
1418 policy->keys_shared = keys_shared;
1419
1420 return DB_OK;
1421 }
1422
policy_set_keys_purge_after(policy_t * policy,unsigned int keys_purge_after)1423 int policy_set_keys_purge_after(policy_t* policy, unsigned int keys_purge_after) {
1424 if (!policy) {
1425 return DB_ERROR_UNKNOWN;
1426 }
1427
1428 policy->keys_purge_after = keys_purge_after;
1429
1430 return DB_OK;
1431 }
1432
policy_set_zone_propagation_delay(policy_t * policy,unsigned int zone_propagation_delay)1433 int policy_set_zone_propagation_delay(policy_t* policy, unsigned int zone_propagation_delay) {
1434 if (!policy) {
1435 return DB_ERROR_UNKNOWN;
1436 }
1437
1438 policy->zone_propagation_delay = zone_propagation_delay;
1439
1440 return DB_OK;
1441 }
1442
policy_set_zone_soa_ttl(policy_t * policy,unsigned int zone_soa_ttl)1443 int policy_set_zone_soa_ttl(policy_t* policy, unsigned int zone_soa_ttl) {
1444 if (!policy) {
1445 return DB_ERROR_UNKNOWN;
1446 }
1447
1448 policy->zone_soa_ttl = zone_soa_ttl;
1449
1450 return DB_OK;
1451 }
1452
policy_set_zone_soa_minimum(policy_t * policy,unsigned int zone_soa_minimum)1453 int policy_set_zone_soa_minimum(policy_t* policy, unsigned int zone_soa_minimum) {
1454 if (!policy) {
1455 return DB_ERROR_UNKNOWN;
1456 }
1457
1458 policy->zone_soa_minimum = zone_soa_minimum;
1459
1460 return DB_OK;
1461 }
1462
policy_set_zone_soa_serial_text(policy_t * policy,const char * zone_soa_serial)1463 int policy_set_zone_soa_serial_text(policy_t* policy, const char* zone_soa_serial) {
1464 const db_enum_t* enum_set = policy_enum_set_zone_soa_serial;
1465
1466 if (!policy) {
1467 return DB_ERROR_UNKNOWN;
1468 }
1469
1470 while (enum_set->text) {
1471 if (!strcmp(enum_set->text, zone_soa_serial)) {
1472 policy->zone_soa_serial = enum_set->value;
1473 return DB_OK;
1474 }
1475 enum_set++;
1476 }
1477 return DB_ERROR_UNKNOWN;
1478 }
1479
policy_set_parent_registration_delay(policy_t * policy,unsigned int parent_registration_delay)1480 int policy_set_parent_registration_delay(policy_t* policy, unsigned int parent_registration_delay) {
1481 if (!policy) {
1482 return DB_ERROR_UNKNOWN;
1483 }
1484
1485 policy->parent_registration_delay = parent_registration_delay;
1486
1487 return DB_OK;
1488 }
1489
policy_set_parent_propagation_delay(policy_t * policy,unsigned int parent_propagation_delay)1490 int policy_set_parent_propagation_delay(policy_t* policy, unsigned int parent_propagation_delay) {
1491 if (!policy) {
1492 return DB_ERROR_UNKNOWN;
1493 }
1494
1495 policy->parent_propagation_delay = parent_propagation_delay;
1496
1497 return DB_OK;
1498 }
1499
policy_set_parent_ds_ttl(policy_t * policy,unsigned int parent_ds_ttl)1500 int policy_set_parent_ds_ttl(policy_t* policy, unsigned int parent_ds_ttl) {
1501 if (!policy) {
1502 return DB_ERROR_UNKNOWN;
1503 }
1504
1505 policy->parent_ds_ttl = parent_ds_ttl;
1506
1507 return DB_OK;
1508 }
1509
policy_set_parent_soa_ttl(policy_t * policy,unsigned int parent_soa_ttl)1510 int policy_set_parent_soa_ttl(policy_t* policy, unsigned int parent_soa_ttl) {
1511 if (!policy) {
1512 return DB_ERROR_UNKNOWN;
1513 }
1514
1515 policy->parent_soa_ttl = parent_soa_ttl;
1516
1517 return DB_OK;
1518 }
1519
policy_set_parent_soa_minimum(policy_t * policy,unsigned int parent_soa_minimum)1520 int policy_set_parent_soa_minimum(policy_t* policy, unsigned int parent_soa_minimum) {
1521 if (!policy) {
1522 return DB_ERROR_UNKNOWN;
1523 }
1524
1525 policy->parent_soa_minimum = parent_soa_minimum;
1526
1527 return DB_OK;
1528 }
1529
policy_set_passthrough(policy_t * policy,unsigned int passthrough)1530 int policy_set_passthrough(policy_t* policy, unsigned int passthrough) {
1531 if (!policy) {
1532 return DB_ERROR_UNKNOWN;
1533 }
1534
1535 policy->passthrough = passthrough;
1536
1537 return DB_OK;
1538 }
1539
policy_denial_type_clause(db_clause_list_t * clause_list,policy_denial_type_t denial_type)1540 db_clause_t* policy_denial_type_clause(db_clause_list_t* clause_list, policy_denial_type_t denial_type) {
1541 db_clause_t* clause;
1542
1543 if (!clause_list) {
1544 return NULL;
1545 }
1546
1547 if (!(clause = db_clause_new())
1548 || db_clause_set_field(clause, "denialType")
1549 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
1550 || db_clause_set_operator(clause, DB_CLAUSE_OPERATOR_AND)
1551 || db_value_from_enum_value(db_clause_get_value(clause), denial_type, policy_enum_set_denial_type)
1552 || db_clause_list_add(clause_list, clause))
1553 {
1554 db_clause_free(clause);
1555 return NULL;
1556 }
1557
1558 return clause;
1559 }
1560
policy_create(policy_t * policy)1561 int policy_create(policy_t* policy) {
1562 db_object_field_list_t* object_field_list;
1563 db_object_field_t* object_field;
1564 db_value_set_t* value_set;
1565 int ret;
1566
1567 if (!policy) {
1568 return DB_ERROR_UNKNOWN;
1569 }
1570 if (!policy->dbo) {
1571 return DB_ERROR_UNKNOWN;
1572 }
1573 if (!db_value_not_empty(&(policy->id))) {
1574 return DB_ERROR_UNKNOWN;
1575 }
1576 if (!db_value_not_empty(&(policy->rev))) {
1577 return DB_ERROR_UNKNOWN;
1578 }
1579 if (!policy->name) {
1580 return DB_ERROR_UNKNOWN;
1581 }
1582 if (!policy->description) {
1583 return DB_ERROR_UNKNOWN;
1584 }
1585 if (!policy->denial_salt) {
1586 return DB_ERROR_UNKNOWN;
1587 }
1588 /* TODO: validate content more */
1589
1590 if (!(object_field_list = db_object_field_list_new())) {
1591 return DB_ERROR_UNKNOWN;
1592 }
1593
1594 if (!(object_field = db_object_field_new())
1595 || db_object_field_set_name(object_field, "name")
1596 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
1597 || db_object_field_list_add(object_field_list, object_field))
1598 {
1599 db_object_field_free(object_field);
1600 db_object_field_list_free(object_field_list);
1601 return DB_ERROR_UNKNOWN;
1602 }
1603
1604 if (!(object_field = db_object_field_new())
1605 || db_object_field_set_name(object_field, "description")
1606 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
1607 || db_object_field_list_add(object_field_list, object_field))
1608 {
1609 db_object_field_free(object_field);
1610 db_object_field_list_free(object_field_list);
1611 return DB_ERROR_UNKNOWN;
1612 }
1613
1614 if (!(object_field = db_object_field_new())
1615 || db_object_field_set_name(object_field, "signaturesResign")
1616 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1617 || db_object_field_list_add(object_field_list, object_field))
1618 {
1619 db_object_field_free(object_field);
1620 db_object_field_list_free(object_field_list);
1621 return DB_ERROR_UNKNOWN;
1622 }
1623
1624 if (!(object_field = db_object_field_new())
1625 || db_object_field_set_name(object_field, "signaturesRefresh")
1626 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1627 || db_object_field_list_add(object_field_list, object_field))
1628 {
1629 db_object_field_free(object_field);
1630 db_object_field_list_free(object_field_list);
1631 return DB_ERROR_UNKNOWN;
1632 }
1633
1634 if (!(object_field = db_object_field_new())
1635 || db_object_field_set_name(object_field, "signaturesJitter")
1636 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1637 || db_object_field_list_add(object_field_list, object_field))
1638 {
1639 db_object_field_free(object_field);
1640 db_object_field_list_free(object_field_list);
1641 return DB_ERROR_UNKNOWN;
1642 }
1643
1644 if (!(object_field = db_object_field_new())
1645 || db_object_field_set_name(object_field, "signaturesInceptionOffset")
1646 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1647 || db_object_field_list_add(object_field_list, object_field))
1648 {
1649 db_object_field_free(object_field);
1650 db_object_field_list_free(object_field_list);
1651 return DB_ERROR_UNKNOWN;
1652 }
1653
1654 if (!(object_field = db_object_field_new())
1655 || db_object_field_set_name(object_field, "signaturesValidityDefault")
1656 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1657 || db_object_field_list_add(object_field_list, object_field))
1658 {
1659 db_object_field_free(object_field);
1660 db_object_field_list_free(object_field_list);
1661 return DB_ERROR_UNKNOWN;
1662 }
1663
1664 if (!(object_field = db_object_field_new())
1665 || db_object_field_set_name(object_field, "signaturesValidityDenial")
1666 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1667 || db_object_field_list_add(object_field_list, object_field))
1668 {
1669 db_object_field_free(object_field);
1670 db_object_field_list_free(object_field_list);
1671 return DB_ERROR_UNKNOWN;
1672 }
1673
1674 if (!(object_field = db_object_field_new())
1675 || db_object_field_set_name(object_field, "signaturesValidityKeyset")
1676 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1677 || db_object_field_list_add(object_field_list, object_field))
1678 {
1679 db_object_field_free(object_field);
1680 db_object_field_list_free(object_field_list);
1681 return DB_ERROR_UNKNOWN;
1682 }
1683
1684 if (!(object_field = db_object_field_new())
1685 || db_object_field_set_name(object_field, "signaturesMaxZoneTtl")
1686 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1687 || db_object_field_list_add(object_field_list, object_field))
1688 {
1689 db_object_field_free(object_field);
1690 db_object_field_list_free(object_field_list);
1691 return DB_ERROR_UNKNOWN;
1692 }
1693
1694 if (!(object_field = db_object_field_new())
1695 || db_object_field_set_name(object_field, "denialType")
1696 || db_object_field_set_type(object_field, DB_TYPE_ENUM)
1697 || db_object_field_set_enum_set(object_field, policy_enum_set_denial_type)
1698 || db_object_field_list_add(object_field_list, object_field))
1699 {
1700 db_object_field_free(object_field);
1701 db_object_field_list_free(object_field_list);
1702 return DB_ERROR_UNKNOWN;
1703 }
1704
1705 if (!(object_field = db_object_field_new())
1706 || db_object_field_set_name(object_field, "denialOptout")
1707 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1708 || db_object_field_list_add(object_field_list, object_field))
1709 {
1710 db_object_field_free(object_field);
1711 db_object_field_list_free(object_field_list);
1712 return DB_ERROR_UNKNOWN;
1713 }
1714
1715 if (!(object_field = db_object_field_new())
1716 || db_object_field_set_name(object_field, "denialTtl")
1717 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1718 || db_object_field_list_add(object_field_list, object_field))
1719 {
1720 db_object_field_free(object_field);
1721 db_object_field_list_free(object_field_list);
1722 return DB_ERROR_UNKNOWN;
1723 }
1724
1725 if (!(object_field = db_object_field_new())
1726 || db_object_field_set_name(object_field, "denialResalt")
1727 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1728 || db_object_field_list_add(object_field_list, object_field))
1729 {
1730 db_object_field_free(object_field);
1731 db_object_field_list_free(object_field_list);
1732 return DB_ERROR_UNKNOWN;
1733 }
1734
1735 if (!(object_field = db_object_field_new())
1736 || db_object_field_set_name(object_field, "denialAlgorithm")
1737 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1738 || db_object_field_list_add(object_field_list, object_field))
1739 {
1740 db_object_field_free(object_field);
1741 db_object_field_list_free(object_field_list);
1742 return DB_ERROR_UNKNOWN;
1743 }
1744
1745 if (!(object_field = db_object_field_new())
1746 || db_object_field_set_name(object_field, "denialIterations")
1747 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1748 || db_object_field_list_add(object_field_list, object_field))
1749 {
1750 db_object_field_free(object_field);
1751 db_object_field_list_free(object_field_list);
1752 return DB_ERROR_UNKNOWN;
1753 }
1754
1755 if (!(object_field = db_object_field_new())
1756 || db_object_field_set_name(object_field, "denialSaltLength")
1757 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1758 || db_object_field_list_add(object_field_list, object_field))
1759 {
1760 db_object_field_free(object_field);
1761 db_object_field_list_free(object_field_list);
1762 return DB_ERROR_UNKNOWN;
1763 }
1764
1765 if (!(object_field = db_object_field_new())
1766 || db_object_field_set_name(object_field, "denialSalt")
1767 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
1768 || db_object_field_list_add(object_field_list, object_field))
1769 {
1770 db_object_field_free(object_field);
1771 db_object_field_list_free(object_field_list);
1772 return DB_ERROR_UNKNOWN;
1773 }
1774
1775 if (!(object_field = db_object_field_new())
1776 || db_object_field_set_name(object_field, "denialSaltLastChange")
1777 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1778 || db_object_field_list_add(object_field_list, object_field))
1779 {
1780 db_object_field_free(object_field);
1781 db_object_field_list_free(object_field_list);
1782 return DB_ERROR_UNKNOWN;
1783 }
1784
1785 if (!(object_field = db_object_field_new())
1786 || db_object_field_set_name(object_field, "keysTtl")
1787 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1788 || db_object_field_list_add(object_field_list, object_field))
1789 {
1790 db_object_field_free(object_field);
1791 db_object_field_list_free(object_field_list);
1792 return DB_ERROR_UNKNOWN;
1793 }
1794
1795 if (!(object_field = db_object_field_new())
1796 || db_object_field_set_name(object_field, "keysRetireSafety")
1797 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1798 || db_object_field_list_add(object_field_list, object_field))
1799 {
1800 db_object_field_free(object_field);
1801 db_object_field_list_free(object_field_list);
1802 return DB_ERROR_UNKNOWN;
1803 }
1804
1805 if (!(object_field = db_object_field_new())
1806 || db_object_field_set_name(object_field, "keysPublishSafety")
1807 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1808 || db_object_field_list_add(object_field_list, object_field))
1809 {
1810 db_object_field_free(object_field);
1811 db_object_field_list_free(object_field_list);
1812 return DB_ERROR_UNKNOWN;
1813 }
1814
1815 if (!(object_field = db_object_field_new())
1816 || db_object_field_set_name(object_field, "keysShared")
1817 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1818 || db_object_field_list_add(object_field_list, object_field))
1819 {
1820 db_object_field_free(object_field);
1821 db_object_field_list_free(object_field_list);
1822 return DB_ERROR_UNKNOWN;
1823 }
1824
1825 if (!(object_field = db_object_field_new())
1826 || db_object_field_set_name(object_field, "keysPurgeAfter")
1827 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1828 || db_object_field_list_add(object_field_list, object_field))
1829 {
1830 db_object_field_free(object_field);
1831 db_object_field_list_free(object_field_list);
1832 return DB_ERROR_UNKNOWN;
1833 }
1834
1835 if (!(object_field = db_object_field_new())
1836 || db_object_field_set_name(object_field, "zonePropagationDelay")
1837 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1838 || db_object_field_list_add(object_field_list, object_field))
1839 {
1840 db_object_field_free(object_field);
1841 db_object_field_list_free(object_field_list);
1842 return DB_ERROR_UNKNOWN;
1843 }
1844
1845 if (!(object_field = db_object_field_new())
1846 || db_object_field_set_name(object_field, "zoneSoaTtl")
1847 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1848 || db_object_field_list_add(object_field_list, object_field))
1849 {
1850 db_object_field_free(object_field);
1851 db_object_field_list_free(object_field_list);
1852 return DB_ERROR_UNKNOWN;
1853 }
1854
1855 if (!(object_field = db_object_field_new())
1856 || db_object_field_set_name(object_field, "zoneSoaMinimum")
1857 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1858 || db_object_field_list_add(object_field_list, object_field))
1859 {
1860 db_object_field_free(object_field);
1861 db_object_field_list_free(object_field_list);
1862 return DB_ERROR_UNKNOWN;
1863 }
1864
1865 if (!(object_field = db_object_field_new())
1866 || db_object_field_set_name(object_field, "zoneSoaSerial")
1867 || db_object_field_set_type(object_field, DB_TYPE_ENUM)
1868 || db_object_field_set_enum_set(object_field, policy_enum_set_zone_soa_serial)
1869 || db_object_field_list_add(object_field_list, object_field))
1870 {
1871 db_object_field_free(object_field);
1872 db_object_field_list_free(object_field_list);
1873 return DB_ERROR_UNKNOWN;
1874 }
1875
1876 if (!(object_field = db_object_field_new())
1877 || db_object_field_set_name(object_field, "parentRegistrationDelay")
1878 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1879 || db_object_field_list_add(object_field_list, object_field))
1880 {
1881 db_object_field_free(object_field);
1882 db_object_field_list_free(object_field_list);
1883 return DB_ERROR_UNKNOWN;
1884 }
1885
1886 if (!(object_field = db_object_field_new())
1887 || db_object_field_set_name(object_field, "parentPropagationDelay")
1888 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1889 || db_object_field_list_add(object_field_list, object_field))
1890 {
1891 db_object_field_free(object_field);
1892 db_object_field_list_free(object_field_list);
1893 return DB_ERROR_UNKNOWN;
1894 }
1895
1896 if (!(object_field = db_object_field_new())
1897 || db_object_field_set_name(object_field, "parentDsTtl")
1898 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1899 || db_object_field_list_add(object_field_list, object_field))
1900 {
1901 db_object_field_free(object_field);
1902 db_object_field_list_free(object_field_list);
1903 return DB_ERROR_UNKNOWN;
1904 }
1905
1906 if (!(object_field = db_object_field_new())
1907 || db_object_field_set_name(object_field, "parentSoaTtl")
1908 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1909 || db_object_field_list_add(object_field_list, object_field))
1910 {
1911 db_object_field_free(object_field);
1912 db_object_field_list_free(object_field_list);
1913 return DB_ERROR_UNKNOWN;
1914 }
1915
1916 if (!(object_field = db_object_field_new())
1917 || db_object_field_set_name(object_field, "parentSoaMinimum")
1918 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1919 || db_object_field_list_add(object_field_list, object_field))
1920 {
1921 db_object_field_free(object_field);
1922 db_object_field_list_free(object_field_list);
1923 return DB_ERROR_UNKNOWN;
1924 }
1925
1926 if (!(object_field = db_object_field_new())
1927 || db_object_field_set_name(object_field, "passthrough")
1928 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
1929 || db_object_field_list_add(object_field_list, object_field))
1930 {
1931 db_object_field_free(object_field);
1932 db_object_field_list_free(object_field_list);
1933 return DB_ERROR_UNKNOWN;
1934 }
1935
1936 if (!(value_set = db_value_set_new(34))) {
1937 db_object_field_list_free(object_field_list);
1938 return DB_ERROR_UNKNOWN;
1939 }
1940
1941 if (db_value_from_text(db_value_set_get(value_set, 0), policy->name)
1942 || db_value_from_text(db_value_set_get(value_set, 1), policy->description)
1943 || db_value_from_uint32(db_value_set_get(value_set, 2), policy->signatures_resign)
1944 || db_value_from_uint32(db_value_set_get(value_set, 3), policy->signatures_refresh)
1945 || db_value_from_uint32(db_value_set_get(value_set, 4), policy->signatures_jitter)
1946 || db_value_from_uint32(db_value_set_get(value_set, 5), policy->signatures_inception_offset)
1947 || db_value_from_uint32(db_value_set_get(value_set, 6), policy->signatures_validity_default)
1948 || db_value_from_uint32(db_value_set_get(value_set, 7), policy->signatures_validity_denial)
1949 || (db_value_from_uint32(db_value_set_get(value_set, 8), policy->signatures_validity_keyset) && 0) /* not an error, the database layer cannot handle optional fields */
1950 || db_value_from_uint32(db_value_set_get(value_set, 9), policy->signatures_max_zone_ttl)
1951 || db_value_from_enum_value(db_value_set_get(value_set, 10), policy->denial_type, policy_enum_set_denial_type)
1952 || db_value_from_uint32(db_value_set_get(value_set, 11), policy->denial_optout)
1953 || db_value_from_uint32(db_value_set_get(value_set, 12), policy->denial_ttl)
1954 || db_value_from_uint32(db_value_set_get(value_set, 13), policy->denial_resalt)
1955 || db_value_from_uint32(db_value_set_get(value_set, 14), policy->denial_algorithm)
1956 || db_value_from_uint32(db_value_set_get(value_set, 15), policy->denial_iterations)
1957 || db_value_from_uint32(db_value_set_get(value_set, 16), policy->denial_salt_length)
1958 || db_value_from_text(db_value_set_get(value_set, 17), policy->denial_salt)
1959 || db_value_from_uint32(db_value_set_get(value_set, 18), policy->denial_salt_last_change)
1960 || db_value_from_uint32(db_value_set_get(value_set, 19), policy->keys_ttl)
1961 || db_value_from_uint32(db_value_set_get(value_set, 20), policy->keys_retire_safety)
1962 || db_value_from_uint32(db_value_set_get(value_set, 21), policy->keys_publish_safety)
1963 || db_value_from_uint32(db_value_set_get(value_set, 22), policy->keys_shared)
1964 || db_value_from_uint32(db_value_set_get(value_set, 23), policy->keys_purge_after)
1965 || db_value_from_uint32(db_value_set_get(value_set, 24), policy->zone_propagation_delay)
1966 || db_value_from_uint32(db_value_set_get(value_set, 25), policy->zone_soa_ttl)
1967 || db_value_from_uint32(db_value_set_get(value_set, 26), policy->zone_soa_minimum)
1968 || db_value_from_enum_value(db_value_set_get(value_set, 27), policy->zone_soa_serial, policy_enum_set_zone_soa_serial)
1969 || db_value_from_uint32(db_value_set_get(value_set, 28), policy->parent_registration_delay)
1970 || db_value_from_uint32(db_value_set_get(value_set, 29), policy->parent_propagation_delay)
1971 || db_value_from_uint32(db_value_set_get(value_set, 30), policy->parent_ds_ttl)
1972 || db_value_from_uint32(db_value_set_get(value_set, 31), policy->parent_soa_ttl)
1973 || db_value_from_uint32(db_value_set_get(value_set, 32), policy->parent_soa_minimum)
1974 || db_value_from_uint32(db_value_set_get(value_set, 33), policy->passthrough))
1975 {
1976 db_value_set_free(value_set);
1977 db_object_field_list_free(object_field_list);
1978 return DB_ERROR_UNKNOWN;
1979 }
1980
1981 ret = db_object_create(policy->dbo, object_field_list, value_set);
1982 db_value_set_free(value_set);
1983 db_object_field_list_free(object_field_list);
1984 return ret;
1985 }
1986
policy_get_by_id(policy_t * policy,const db_value_t * id)1987 int policy_get_by_id(policy_t* policy, const db_value_t* id) {
1988 db_clause_list_t* clause_list;
1989 db_clause_t* clause;
1990 db_result_list_t* result_list;
1991 const db_result_t* result;
1992
1993 if (!policy) {
1994 return DB_ERROR_UNKNOWN;
1995 }
1996 if (!policy->dbo) {
1997 return DB_ERROR_UNKNOWN;
1998 }
1999 if (!id) {
2000 return DB_ERROR_UNKNOWN;
2001 }
2002 if (db_value_not_empty(id)) {
2003 return DB_ERROR_UNKNOWN;
2004 }
2005
2006 if (!(clause_list = db_clause_list_new())) {
2007 return DB_ERROR_UNKNOWN;
2008 }
2009 if (!(clause = db_clause_new())
2010 || db_clause_set_field(clause, "id")
2011 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
2012 || db_value_copy(db_clause_get_value(clause), id)
2013 || db_clause_list_add(clause_list, clause))
2014 {
2015 db_clause_free(clause);
2016 db_clause_list_free(clause_list);
2017 return DB_ERROR_UNKNOWN;
2018 }
2019
2020 result_list = db_object_read(policy->dbo, NULL, clause_list);
2021 db_clause_list_free(clause_list);
2022
2023 if (result_list) {
2024 result = db_result_list_next(result_list);
2025 if (result) {
2026 if (policy_from_result(policy, result)) {
2027 db_result_list_free(result_list);
2028 return DB_ERROR_UNKNOWN;
2029 }
2030
2031 db_result_list_free(result_list);
2032 return DB_OK;
2033 }
2034 }
2035
2036 db_result_list_free(result_list);
2037 return DB_ERROR_UNKNOWN;
2038 }
2039
policy_get_by_name(policy_t * policy,const char * name)2040 int policy_get_by_name(policy_t* policy, const char* name) {
2041 db_clause_list_t* clause_list;
2042 db_clause_t* clause;
2043 db_result_list_t* result_list;
2044 const db_result_t* result;
2045
2046 if (!policy) {
2047 return DB_ERROR_UNKNOWN;
2048 }
2049 if (!policy->dbo) {
2050 return DB_ERROR_UNKNOWN;
2051 }
2052 if (!name) {
2053 return DB_ERROR_UNKNOWN;
2054 }
2055
2056 if (!(clause_list = db_clause_list_new())) {
2057 return DB_ERROR_UNKNOWN;
2058 }
2059 if (!(clause = db_clause_new())
2060 || db_clause_set_field(clause, "name")
2061 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
2062 || db_value_from_text(db_clause_get_value(clause), name)
2063 || db_clause_list_add(clause_list, clause))
2064 {
2065 db_clause_free(clause);
2066 db_clause_list_free(clause_list);
2067 return DB_ERROR_UNKNOWN;
2068 }
2069
2070 result_list = db_object_read(policy->dbo, NULL, clause_list);
2071 db_clause_list_free(clause_list);
2072
2073 if (result_list) {
2074 result = db_result_list_next(result_list);
2075 if (result) {
2076 if (policy_from_result(policy, result)) {
2077 db_result_list_free(result_list);
2078 return DB_ERROR_UNKNOWN;
2079 }
2080
2081 db_result_list_free(result_list);
2082 return DB_OK;
2083 }
2084 }
2085
2086 db_result_list_free(result_list);
2087 return DB_ERROR_UNKNOWN;
2088 }
2089
policy_new_get_by_name(const db_connection_t * connection,const char * name)2090 policy_t* policy_new_get_by_name(const db_connection_t* connection, const char* name) {
2091 policy_t* policy;
2092
2093 if (!connection) {
2094 return NULL;
2095 }
2096 if (!name) {
2097 return NULL;
2098 }
2099
2100 if (!(policy = policy_new(connection))
2101 || policy_get_by_name(policy, name))
2102 {
2103 policy_free(policy);
2104 return NULL;
2105 }
2106
2107 return policy;
2108 }
2109
policy_update(policy_t * policy)2110 int policy_update(policy_t* policy) {
2111 db_object_field_list_t* object_field_list;
2112 db_object_field_t* object_field;
2113 db_value_set_t* value_set;
2114 db_clause_list_t* clause_list;
2115 db_clause_t* clause;
2116 int ret;
2117
2118 if (!policy) {
2119 return DB_ERROR_UNKNOWN;
2120 }
2121 if (!policy->dbo) {
2122 return DB_ERROR_UNKNOWN;
2123 }
2124 if (db_value_not_empty(&(policy->id))) {
2125 return DB_ERROR_UNKNOWN;
2126 }
2127 if (db_value_not_empty(&(policy->rev))) {
2128 return DB_ERROR_UNKNOWN;
2129 }
2130 if (!policy->name) {
2131 return DB_ERROR_UNKNOWN;
2132 }
2133 if (!policy->description) {
2134 return DB_ERROR_UNKNOWN;
2135 }
2136 if (!policy->denial_salt) {
2137 return DB_ERROR_UNKNOWN;
2138 }
2139 /* TODO: validate content more */
2140
2141 if (!(object_field_list = db_object_field_list_new())) {
2142 return DB_ERROR_UNKNOWN;
2143 }
2144
2145 if (!(object_field = db_object_field_new())
2146 || db_object_field_set_name(object_field, "name")
2147 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
2148 || db_object_field_list_add(object_field_list, object_field))
2149 {
2150 db_object_field_free(object_field);
2151 db_object_field_list_free(object_field_list);
2152 return DB_ERROR_UNKNOWN;
2153 }
2154
2155 if (!(object_field = db_object_field_new())
2156 || db_object_field_set_name(object_field, "description")
2157 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
2158 || db_object_field_list_add(object_field_list, object_field))
2159 {
2160 db_object_field_free(object_field);
2161 db_object_field_list_free(object_field_list);
2162 return DB_ERROR_UNKNOWN;
2163 }
2164
2165 if (!(object_field = db_object_field_new())
2166 || db_object_field_set_name(object_field, "signaturesResign")
2167 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2168 || db_object_field_list_add(object_field_list, object_field))
2169 {
2170 db_object_field_free(object_field);
2171 db_object_field_list_free(object_field_list);
2172 return DB_ERROR_UNKNOWN;
2173 }
2174
2175 if (!(object_field = db_object_field_new())
2176 || db_object_field_set_name(object_field, "signaturesRefresh")
2177 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2178 || db_object_field_list_add(object_field_list, object_field))
2179 {
2180 db_object_field_free(object_field);
2181 db_object_field_list_free(object_field_list);
2182 return DB_ERROR_UNKNOWN;
2183 }
2184
2185 if (!(object_field = db_object_field_new())
2186 || db_object_field_set_name(object_field, "signaturesJitter")
2187 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2188 || db_object_field_list_add(object_field_list, object_field))
2189 {
2190 db_object_field_free(object_field);
2191 db_object_field_list_free(object_field_list);
2192 return DB_ERROR_UNKNOWN;
2193 }
2194
2195 if (!(object_field = db_object_field_new())
2196 || db_object_field_set_name(object_field, "signaturesInceptionOffset")
2197 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2198 || db_object_field_list_add(object_field_list, object_field))
2199 {
2200 db_object_field_free(object_field);
2201 db_object_field_list_free(object_field_list);
2202 return DB_ERROR_UNKNOWN;
2203 }
2204
2205 if (!(object_field = db_object_field_new())
2206 || db_object_field_set_name(object_field, "signaturesValidityDefault")
2207 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2208 || db_object_field_list_add(object_field_list, object_field))
2209 {
2210 db_object_field_free(object_field);
2211 db_object_field_list_free(object_field_list);
2212 return DB_ERROR_UNKNOWN;
2213 }
2214
2215 if (!(object_field = db_object_field_new())
2216 || db_object_field_set_name(object_field, "signaturesValidityDenial")
2217 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2218 || db_object_field_list_add(object_field_list, object_field))
2219 {
2220 db_object_field_free(object_field);
2221 db_object_field_list_free(object_field_list);
2222 return DB_ERROR_UNKNOWN;
2223 }
2224
2225 if (!(object_field = db_object_field_new())
2226 || db_object_field_set_name(object_field, "signaturesValidityKeyset")
2227 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2228 || db_object_field_list_add(object_field_list, object_field))
2229 {
2230 db_object_field_free(object_field);
2231 db_object_field_list_free(object_field_list);
2232 return DB_ERROR_UNKNOWN;
2233 }
2234
2235 if (!(object_field = db_object_field_new())
2236 || db_object_field_set_name(object_field, "signaturesMaxZoneTtl")
2237 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2238 || db_object_field_list_add(object_field_list, object_field))
2239 {
2240 db_object_field_free(object_field);
2241 db_object_field_list_free(object_field_list);
2242 return DB_ERROR_UNKNOWN;
2243 }
2244
2245 if (!(object_field = db_object_field_new())
2246 || db_object_field_set_name(object_field, "denialType")
2247 || db_object_field_set_type(object_field, DB_TYPE_ENUM)
2248 || db_object_field_set_enum_set(object_field, policy_enum_set_denial_type)
2249 || db_object_field_list_add(object_field_list, object_field))
2250 {
2251 db_object_field_free(object_field);
2252 db_object_field_list_free(object_field_list);
2253 return DB_ERROR_UNKNOWN;
2254 }
2255
2256 if (!(object_field = db_object_field_new())
2257 || db_object_field_set_name(object_field, "denialOptout")
2258 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2259 || db_object_field_list_add(object_field_list, object_field))
2260 {
2261 db_object_field_free(object_field);
2262 db_object_field_list_free(object_field_list);
2263 return DB_ERROR_UNKNOWN;
2264 }
2265
2266 if (!(object_field = db_object_field_new())
2267 || db_object_field_set_name(object_field, "denialTtl")
2268 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2269 || db_object_field_list_add(object_field_list, object_field))
2270 {
2271 db_object_field_free(object_field);
2272 db_object_field_list_free(object_field_list);
2273 return DB_ERROR_UNKNOWN;
2274 }
2275
2276 if (!(object_field = db_object_field_new())
2277 || db_object_field_set_name(object_field, "denialResalt")
2278 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2279 || db_object_field_list_add(object_field_list, object_field))
2280 {
2281 db_object_field_free(object_field);
2282 db_object_field_list_free(object_field_list);
2283 return DB_ERROR_UNKNOWN;
2284 }
2285
2286 if (!(object_field = db_object_field_new())
2287 || db_object_field_set_name(object_field, "denialAlgorithm")
2288 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2289 || db_object_field_list_add(object_field_list, object_field))
2290 {
2291 db_object_field_free(object_field);
2292 db_object_field_list_free(object_field_list);
2293 return DB_ERROR_UNKNOWN;
2294 }
2295
2296 if (!(object_field = db_object_field_new())
2297 || db_object_field_set_name(object_field, "denialIterations")
2298 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2299 || db_object_field_list_add(object_field_list, object_field))
2300 {
2301 db_object_field_free(object_field);
2302 db_object_field_list_free(object_field_list);
2303 return DB_ERROR_UNKNOWN;
2304 }
2305
2306 if (!(object_field = db_object_field_new())
2307 || db_object_field_set_name(object_field, "denialSaltLength")
2308 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2309 || db_object_field_list_add(object_field_list, object_field))
2310 {
2311 db_object_field_free(object_field);
2312 db_object_field_list_free(object_field_list);
2313 return DB_ERROR_UNKNOWN;
2314 }
2315
2316 if (!(object_field = db_object_field_new())
2317 || db_object_field_set_name(object_field, "denialSalt")
2318 || db_object_field_set_type(object_field, DB_TYPE_TEXT)
2319 || db_object_field_list_add(object_field_list, object_field))
2320 {
2321 db_object_field_free(object_field);
2322 db_object_field_list_free(object_field_list);
2323 return DB_ERROR_UNKNOWN;
2324 }
2325
2326 if (!(object_field = db_object_field_new())
2327 || db_object_field_set_name(object_field, "denialSaltLastChange")
2328 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2329 || db_object_field_list_add(object_field_list, object_field))
2330 {
2331 db_object_field_free(object_field);
2332 db_object_field_list_free(object_field_list);
2333 return DB_ERROR_UNKNOWN;
2334 }
2335
2336 if (!(object_field = db_object_field_new())
2337 || db_object_field_set_name(object_field, "keysTtl")
2338 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2339 || db_object_field_list_add(object_field_list, object_field))
2340 {
2341 db_object_field_free(object_field);
2342 db_object_field_list_free(object_field_list);
2343 return DB_ERROR_UNKNOWN;
2344 }
2345
2346 if (!(object_field = db_object_field_new())
2347 || db_object_field_set_name(object_field, "keysRetireSafety")
2348 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2349 || db_object_field_list_add(object_field_list, object_field))
2350 {
2351 db_object_field_free(object_field);
2352 db_object_field_list_free(object_field_list);
2353 return DB_ERROR_UNKNOWN;
2354 }
2355
2356 if (!(object_field = db_object_field_new())
2357 || db_object_field_set_name(object_field, "keysPublishSafety")
2358 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2359 || db_object_field_list_add(object_field_list, object_field))
2360 {
2361 db_object_field_free(object_field);
2362 db_object_field_list_free(object_field_list);
2363 return DB_ERROR_UNKNOWN;
2364 }
2365
2366 if (!(object_field = db_object_field_new())
2367 || db_object_field_set_name(object_field, "keysShared")
2368 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2369 || db_object_field_list_add(object_field_list, object_field))
2370 {
2371 db_object_field_free(object_field);
2372 db_object_field_list_free(object_field_list);
2373 return DB_ERROR_UNKNOWN;
2374 }
2375
2376 if (!(object_field = db_object_field_new())
2377 || db_object_field_set_name(object_field, "keysPurgeAfter")
2378 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2379 || db_object_field_list_add(object_field_list, object_field))
2380 {
2381 db_object_field_free(object_field);
2382 db_object_field_list_free(object_field_list);
2383 return DB_ERROR_UNKNOWN;
2384 }
2385
2386 if (!(object_field = db_object_field_new())
2387 || db_object_field_set_name(object_field, "zonePropagationDelay")
2388 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2389 || db_object_field_list_add(object_field_list, object_field))
2390 {
2391 db_object_field_free(object_field);
2392 db_object_field_list_free(object_field_list);
2393 return DB_ERROR_UNKNOWN;
2394 }
2395
2396 if (!(object_field = db_object_field_new())
2397 || db_object_field_set_name(object_field, "zoneSoaTtl")
2398 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2399 || db_object_field_list_add(object_field_list, object_field))
2400 {
2401 db_object_field_free(object_field);
2402 db_object_field_list_free(object_field_list);
2403 return DB_ERROR_UNKNOWN;
2404 }
2405
2406 if (!(object_field = db_object_field_new())
2407 || db_object_field_set_name(object_field, "zoneSoaMinimum")
2408 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2409 || db_object_field_list_add(object_field_list, object_field))
2410 {
2411 db_object_field_free(object_field);
2412 db_object_field_list_free(object_field_list);
2413 return DB_ERROR_UNKNOWN;
2414 }
2415
2416 if (!(object_field = db_object_field_new())
2417 || db_object_field_set_name(object_field, "zoneSoaSerial")
2418 || db_object_field_set_type(object_field, DB_TYPE_ENUM)
2419 || db_object_field_set_enum_set(object_field, policy_enum_set_zone_soa_serial)
2420 || db_object_field_list_add(object_field_list, object_field))
2421 {
2422 db_object_field_free(object_field);
2423 db_object_field_list_free(object_field_list);
2424 return DB_ERROR_UNKNOWN;
2425 }
2426
2427 if (!(object_field = db_object_field_new())
2428 || db_object_field_set_name(object_field, "parentRegistrationDelay")
2429 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2430 || db_object_field_list_add(object_field_list, object_field))
2431 {
2432 db_object_field_free(object_field);
2433 db_object_field_list_free(object_field_list);
2434 return DB_ERROR_UNKNOWN;
2435 }
2436
2437 if (!(object_field = db_object_field_new())
2438 || db_object_field_set_name(object_field, "parentPropagationDelay")
2439 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2440 || db_object_field_list_add(object_field_list, object_field))
2441 {
2442 db_object_field_free(object_field);
2443 db_object_field_list_free(object_field_list);
2444 return DB_ERROR_UNKNOWN;
2445 }
2446
2447 if (!(object_field = db_object_field_new())
2448 || db_object_field_set_name(object_field, "parentDsTtl")
2449 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2450 || db_object_field_list_add(object_field_list, object_field))
2451 {
2452 db_object_field_free(object_field);
2453 db_object_field_list_free(object_field_list);
2454 return DB_ERROR_UNKNOWN;
2455 }
2456
2457 if (!(object_field = db_object_field_new())
2458 || db_object_field_set_name(object_field, "parentSoaTtl")
2459 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2460 || db_object_field_list_add(object_field_list, object_field))
2461 {
2462 db_object_field_free(object_field);
2463 db_object_field_list_free(object_field_list);
2464 return DB_ERROR_UNKNOWN;
2465 }
2466
2467 if (!(object_field = db_object_field_new())
2468 || db_object_field_set_name(object_field, "parentSoaMinimum")
2469 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2470 || db_object_field_list_add(object_field_list, object_field))
2471 {
2472 db_object_field_free(object_field);
2473 db_object_field_list_free(object_field_list);
2474 return DB_ERROR_UNKNOWN;
2475 }
2476
2477 if (!(object_field = db_object_field_new())
2478 || db_object_field_set_name(object_field, "passthrough")
2479 || db_object_field_set_type(object_field, DB_TYPE_UINT32)
2480 || db_object_field_list_add(object_field_list, object_field))
2481 {
2482 db_object_field_free(object_field);
2483 db_object_field_list_free(object_field_list);
2484 return DB_ERROR_UNKNOWN;
2485 }
2486
2487 if (!(value_set = db_value_set_new(34))) {
2488 db_object_field_list_free(object_field_list);
2489 return DB_ERROR_UNKNOWN;
2490 }
2491
2492 if (db_value_from_text(db_value_set_get(value_set, 0), policy->name)
2493 || db_value_from_text(db_value_set_get(value_set, 1), policy->description)
2494 || db_value_from_uint32(db_value_set_get(value_set, 2), policy->signatures_resign)
2495 || db_value_from_uint32(db_value_set_get(value_set, 3), policy->signatures_refresh)
2496 || db_value_from_uint32(db_value_set_get(value_set, 4), policy->signatures_jitter)
2497 || db_value_from_uint32(db_value_set_get(value_set, 5), policy->signatures_inception_offset)
2498 || db_value_from_uint32(db_value_set_get(value_set, 6), policy->signatures_validity_default)
2499 || db_value_from_uint32(db_value_set_get(value_set, 7), policy->signatures_validity_denial)
2500 || (db_value_from_uint32(db_value_set_get(value_set, 8), policy->signatures_validity_keyset) && 0) /* the database layer cannot handle optional fields */
2501 || db_value_from_uint32(db_value_set_get(value_set, 9), policy->signatures_max_zone_ttl)
2502 || db_value_from_enum_value(db_value_set_get(value_set, 10), policy->denial_type, policy_enum_set_denial_type)
2503 || db_value_from_uint32(db_value_set_get(value_set, 11), policy->denial_optout)
2504 || db_value_from_uint32(db_value_set_get(value_set, 12), policy->denial_ttl)
2505 || db_value_from_uint32(db_value_set_get(value_set, 13), policy->denial_resalt)
2506 || db_value_from_uint32(db_value_set_get(value_set, 14), policy->denial_algorithm)
2507 || db_value_from_uint32(db_value_set_get(value_set, 15), policy->denial_iterations)
2508 || db_value_from_uint32(db_value_set_get(value_set, 16), policy->denial_salt_length)
2509 || db_value_from_text(db_value_set_get(value_set, 17), policy->denial_salt)
2510 || db_value_from_uint32(db_value_set_get(value_set, 18), policy->denial_salt_last_change)
2511 || db_value_from_uint32(db_value_set_get(value_set, 19), policy->keys_ttl)
2512 || db_value_from_uint32(db_value_set_get(value_set, 20), policy->keys_retire_safety)
2513 || db_value_from_uint32(db_value_set_get(value_set, 21), policy->keys_publish_safety)
2514 || db_value_from_uint32(db_value_set_get(value_set, 22), policy->keys_shared)
2515 || db_value_from_uint32(db_value_set_get(value_set, 23), policy->keys_purge_after)
2516 || db_value_from_uint32(db_value_set_get(value_set, 24), policy->zone_propagation_delay)
2517 || db_value_from_uint32(db_value_set_get(value_set, 25), policy->zone_soa_ttl)
2518 || db_value_from_uint32(db_value_set_get(value_set, 26), policy->zone_soa_minimum)
2519 || db_value_from_enum_value(db_value_set_get(value_set, 27), policy->zone_soa_serial, policy_enum_set_zone_soa_serial)
2520 || db_value_from_uint32(db_value_set_get(value_set, 28), policy->parent_registration_delay)
2521 || db_value_from_uint32(db_value_set_get(value_set, 29), policy->parent_propagation_delay)
2522 || db_value_from_uint32(db_value_set_get(value_set, 30), policy->parent_ds_ttl)
2523 || db_value_from_uint32(db_value_set_get(value_set, 31), policy->parent_soa_ttl)
2524 || db_value_from_uint32(db_value_set_get(value_set, 32), policy->parent_soa_minimum)
2525 || db_value_from_uint32(db_value_set_get(value_set, 33), policy->passthrough))
2526 {
2527 db_value_set_free(value_set);
2528 db_object_field_list_free(object_field_list);
2529 return DB_ERROR_UNKNOWN;
2530 }
2531
2532 if (!(clause_list = db_clause_list_new())) {
2533 db_value_set_free(value_set);
2534 db_object_field_list_free(object_field_list);
2535 return DB_ERROR_UNKNOWN;
2536 }
2537
2538 if (!(clause = db_clause_new())
2539 || db_clause_set_field(clause, "id")
2540 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
2541 || db_value_copy(db_clause_get_value(clause), &(policy->id))
2542 || db_clause_list_add(clause_list, clause))
2543 {
2544 db_clause_free(clause);
2545 db_clause_list_free(clause_list);
2546 db_value_set_free(value_set);
2547 db_object_field_list_free(object_field_list);
2548 return DB_ERROR_UNKNOWN;
2549 }
2550
2551 if (!(clause = db_clause_new())
2552 || db_clause_set_field(clause, "rev")
2553 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
2554 || db_value_copy(db_clause_get_value(clause), &(policy->rev))
2555 || db_clause_list_add(clause_list, clause))
2556 {
2557 db_clause_free(clause);
2558 db_clause_list_free(clause_list);
2559 db_value_set_free(value_set);
2560 db_object_field_list_free(object_field_list);
2561 return DB_ERROR_UNKNOWN;
2562 }
2563
2564 ret = db_object_update(policy->dbo, object_field_list, value_set, clause_list);
2565 db_value_set_free(value_set);
2566 db_object_field_list_free(object_field_list);
2567 db_clause_list_free(clause_list);
2568 return ret;
2569 }
2570
policy_delete(policy_t * policy)2571 int policy_delete(policy_t* policy) {
2572 db_clause_list_t* clause_list;
2573 db_clause_t* clause;
2574 int ret;
2575
2576 if (!policy) {
2577 return DB_ERROR_UNKNOWN;
2578 }
2579 if (!policy->dbo) {
2580 return DB_ERROR_UNKNOWN;
2581 }
2582 if (db_value_not_empty(&(policy->id))) {
2583 return DB_ERROR_UNKNOWN;
2584 }
2585
2586 if (!(clause_list = db_clause_list_new())) {
2587 return DB_ERROR_UNKNOWN;
2588 }
2589
2590 if (!(clause = db_clause_new())
2591 || db_clause_set_field(clause, "id")
2592 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
2593 || db_value_copy(db_clause_get_value(clause), &(policy->id))
2594 || db_clause_list_add(clause_list, clause))
2595 {
2596 db_clause_free(clause);
2597 db_clause_list_free(clause_list);
2598 return DB_ERROR_UNKNOWN;
2599 }
2600
2601 if (!(clause = db_clause_new())
2602 || db_clause_set_field(clause, "rev")
2603 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
2604 || db_value_copy(db_clause_get_value(clause), &(policy->rev))
2605 || db_clause_list_add(clause_list, clause))
2606 {
2607 db_clause_free(clause);
2608 db_clause_list_free(clause_list);
2609 return DB_ERROR_UNKNOWN;
2610 }
2611
2612 ret = db_object_delete(policy->dbo, clause_list);
2613 db_clause_list_free(clause_list);
2614 return ret;
2615 }
2616
2617 /* POLICY LIST */
2618
2619
2620
policy_list_new(const db_connection_t * connection)2621 policy_list_t* policy_list_new(const db_connection_t* connection) {
2622 policy_list_t* policy_list =
2623 (policy_list_t*)calloc(1, sizeof(policy_list_t));
2624
2625 if (policy_list) {
2626 if (!(policy_list->dbo = __policy_new_object(connection))) {
2627 free(policy_list);
2628 return NULL;
2629 }
2630 }
2631
2632 return policy_list;
2633 }
2634
policy_list_new_copy(const policy_list_t * from_policy_list)2635 policy_list_t* policy_list_new_copy(const policy_list_t* from_policy_list) {
2636 policy_list_t* policy_list;
2637
2638 if (!from_policy_list) {
2639 return NULL;
2640 }
2641 if (!from_policy_list->dbo) {
2642 return NULL;
2643 }
2644
2645 if (!(policy_list = policy_list_new(db_object_connection(from_policy_list->dbo)))
2646 || policy_list_copy(policy_list, from_policy_list))
2647 {
2648 policy_list_free(policy_list);
2649 return NULL;
2650 }
2651 return policy_list;
2652 }
2653
policy_list_object_store(policy_list_t * policy_list)2654 int policy_list_object_store(policy_list_t* policy_list) {
2655 if (!policy_list) {
2656 return DB_ERROR_UNKNOWN;
2657 }
2658
2659 policy_list->object_store = 1;
2660
2661 return DB_OK;
2662 }
2663
policy_list_free(policy_list_t * policy_list)2664 void policy_list_free(policy_list_t* policy_list) {
2665 size_t i;
2666
2667 if (policy_list) {
2668 if (policy_list->dbo) {
2669 db_object_free(policy_list->dbo);
2670 }
2671 if (policy_list->result_list) {
2672 db_result_list_free(policy_list->result_list);
2673 }
2674 if (policy_list->policy) {
2675 policy_free(policy_list->policy);
2676 }
2677 for (i = 0; i < policy_list->object_list_size; i++) {
2678 if (policy_list->object_list[i]) {
2679 policy_free(policy_list->object_list[i]);
2680 }
2681 }
2682 if (policy_list->object_list) {
2683 free(policy_list->object_list);
2684 }
2685 free(policy_list);
2686 }
2687 }
2688
policy_list_copy(policy_list_t * policy_list,const policy_list_t * from_policy_list)2689 int policy_list_copy(policy_list_t* policy_list, const policy_list_t* from_policy_list) {
2690 size_t i;
2691
2692 if (!policy_list) {
2693 return DB_ERROR_UNKNOWN;
2694 }
2695 if (!from_policy_list) {
2696 return DB_ERROR_UNKNOWN;
2697 }
2698 if (from_policy_list->object_list && !from_policy_list->object_list_size) {
2699 return DB_ERROR_UNKNOWN;
2700 }
2701
2702 if (policy_list->result_list) {
2703 db_result_list_free(policy_list->result_list);
2704 policy_list->result_list = NULL;
2705 }
2706 if (from_policy_list->result_list
2707 && !(policy_list->result_list = db_result_list_new_copy(from_policy_list->result_list)))
2708 {
2709 return DB_ERROR_UNKNOWN;
2710 }
2711
2712 policy_list->object_store = from_policy_list->object_store;
2713 for (i = 0; i < policy_list->object_list_size; i++) {
2714 if (policy_list->object_list[i]) {
2715 policy_free(policy_list->object_list[i]);
2716 }
2717 }
2718 policy_list->object_list_size = 0;
2719 if (policy_list->object_list) {
2720 free(policy_list->object_list);
2721 policy_list->object_list = NULL;
2722 }
2723 if (from_policy_list->object_list) {
2724 if (!(policy_list->object_list = (policy_t**)calloc(from_policy_list->object_list_size, sizeof(policy_t*)))) {
2725 return DB_ERROR_UNKNOWN;
2726 }
2727 policy_list->object_list_size = from_policy_list->object_list_size;
2728 for (i = 0; i < from_policy_list->object_list_size; i++) {
2729 if (!from_policy_list->object_list[i]) {
2730 continue;
2731 }
2732 if (!(policy_list->object_list[i] = policy_new_copy(from_policy_list->object_list[i]))) {
2733 return DB_ERROR_UNKNOWN;
2734 }
2735 }
2736 }
2737 policy_list->object_list_position = 0;;
2738 policy_list->object_list_first = 1;
2739 policy_list->associated_fetch = from_policy_list->associated_fetch;
2740
2741 return DB_OK;
2742 }
2743
policy_list_get_associated(policy_list_t * policy_list)2744 static int policy_list_get_associated(policy_list_t* policy_list) {
2745 size_t j, count;
2746 int cmp;
2747 size_t i;
2748 db_clause_list_t* clause_list;
2749 db_clause_t* clause;
2750 const policy_t* policy;
2751 policy_key_list_t* policy_key_list;
2752 const policy_key_t* policy_key;
2753 zone_list_db_t* zone_list;
2754 const zone_db_t* zone;
2755 hsm_key_list_t* hsm_key_list;
2756 const hsm_key_t* hsm_key;
2757
2758 if (!policy_list) {
2759 return DB_ERROR_UNKNOWN;
2760 }
2761 if (!policy_list->dbo) {
2762 return DB_ERROR_UNKNOWN;
2763 }
2764 if (!policy_list->associated_fetch) {
2765 return DB_ERROR_UNKNOWN;
2766 }
2767 if (!policy_list->result_list) {
2768 return DB_ERROR_UNKNOWN;
2769 }
2770 if (policy_list->object_list) {
2771 return DB_ERROR_UNKNOWN;
2772 }
2773
2774 policy = policy_list_begin(policy_list);
2775 while (policy) {
2776 policy = policy_list_next(policy_list);
2777 }
2778
2779 if (!(clause_list = db_clause_list_new())) {
2780 return DB_ERROR_UNKNOWN;
2781 }
2782 policy = policy_list_begin(policy_list);
2783 while (policy) {
2784 if (!(clause = db_clause_new())
2785 || db_clause_set_field(clause, "policyId")
2786 || db_clause_set_type(clause, DB_CLAUSE_EQUAL)
2787 || db_clause_set_operator(clause, DB_CLAUSE_OPERATOR_OR)
2788 || db_value_copy(db_clause_get_value(clause), policy_id(policy))
2789 || db_clause_list_add(clause_list, clause))
2790 {
2791 db_clause_free(clause);
2792 db_clause_list_free(clause_list);
2793 return DB_ERROR_UNKNOWN;
2794 }
2795
2796 policy = policy_list_next(policy_list);
2797 }
2798
2799 if (!(policy_key_list = policy_key_list_new(db_object_connection(policy_list->dbo)))
2800 || policy_key_list_object_store(policy_key_list)
2801 || policy_key_list_get_by_clauses(policy_key_list, clause_list))
2802 {
2803 policy_key_list_free(policy_key_list);
2804 db_clause_list_free(clause_list);
2805 return DB_ERROR_UNKNOWN;
2806 }
2807
2808 for (i = 0; i < policy_list->object_list_size; i++) {
2809 if (!(policy_list->object_list[i])) {
2810 return DB_ERROR_UNKNOWN;
2811 }
2812
2813 count = 0;
2814 policy_key = policy_key_list_begin(policy_key_list);
2815 while (policy_key) {
2816 if (db_value_cmp(policy_id(policy_list->object_list[i]), policy_key_policy_id(policy_key), &cmp)) {
2817 policy_key_list_free(policy_key_list);
2818 db_clause_list_free(clause_list);
2819 return DB_ERROR_UNKNOWN;
2820 }
2821 if (!cmp) {
2822 count++;
2823 }
2824 policy_key = policy_key_list_next(policy_key_list);
2825 }
2826 if (policy_list->object_list[i]->policy_key_list) {
2827 policy_key_list_free(policy_list->object_list[i]->policy_key_list);
2828 policy_list->object_list[i]->policy_key_list = NULL;
2829 }
2830 if (!(policy_list->object_list[i]->policy_key_list = policy_key_list_new(db_object_connection(policy_list->dbo)))) {
2831 policy_key_list_free(policy_key_list);
2832 db_clause_list_free(clause_list);
2833 return DB_ERROR_UNKNOWN;
2834 }
2835 if (count) {
2836 if (!(policy_list->object_list[i]->policy_key_list->object_list = (policy_key_t**)calloc(count, sizeof(policy_key_t*)))) {
2837 policy_key_list_free(policy_key_list);
2838 db_clause_list_free(clause_list);
2839 return DB_ERROR_UNKNOWN;
2840 }
2841
2842 j = 0;
2843 policy_key = policy_key_list_begin(policy_key_list);
2844 while (policy_key) {
2845 if (j >= count) {
2846 policy_key_list_free(policy_key_list);
2847 db_clause_list_free(clause_list);
2848 return DB_ERROR_UNKNOWN;
2849 }
2850 if (db_value_cmp(policy_id(policy_list->object_list[i]), policy_key_policy_id(policy_key), &cmp)) {
2851 policy_key_list_free(policy_key_list);
2852 db_clause_list_free(clause_list);
2853 return DB_ERROR_UNKNOWN;
2854 }
2855 if (!cmp) {
2856 if (!(policy_list->object_list[i]->policy_key_list->object_list[j] = policy_key_new_copy(policy_key))) {
2857 policy_key_list_free(policy_key_list);
2858 db_clause_list_free(clause_list);
2859 return DB_ERROR_UNKNOWN;
2860 }
2861 j++;
2862 }
2863 policy_key = policy_key_list_next(policy_key_list);
2864 }
2865 if (j != count) {
2866 policy_key_list_free(policy_key_list);
2867 db_clause_list_free(clause_list);
2868 return DB_ERROR_UNKNOWN;
2869 }
2870 }
2871 policy_list->object_list[i]->policy_key_list->object_store = 1;
2872 policy_list->object_list[i]->policy_key_list->object_list_size = count;
2873 policy_list->object_list[i]->policy_key_list->object_list_first = 1;
2874 }
2875
2876 if (!(zone_list = zone_list_db_new(db_object_connection(policy_list->dbo)))
2877 || zone_list_db_object_store(zone_list)
2878 || zone_list_db_get_by_clauses(zone_list, clause_list))
2879 {
2880 zone_list_db_free(zone_list);
2881 db_clause_list_free(clause_list);
2882 return DB_ERROR_UNKNOWN;
2883 }
2884
2885 for (i = 0; i < policy_list->object_list_size; i++) {
2886 if (!(policy_list->object_list[i])) {
2887 zone_list_db_free(zone_list);
2888 db_clause_list_free(clause_list);
2889 return DB_ERROR_UNKNOWN;
2890 }
2891
2892 count = 0;
2893 zone = zone_list_db_begin(zone_list);
2894 while (zone) {
2895 if (db_value_cmp(policy_id(policy_list->object_list[i]), zone_db_policy_id(zone), &cmp)) {
2896 zone_list_db_free(zone_list);
2897 db_clause_list_free(clause_list);
2898 return DB_ERROR_UNKNOWN;
2899 }
2900 if (!cmp) {
2901 count++;
2902 }
2903 zone = zone_list_db_next(zone_list);
2904 }
2905 if (policy_list->object_list[i]->zone_list) {
2906 zone_list_db_free(policy_list->object_list[i]->zone_list);
2907 policy_list->object_list[i]->zone_list = NULL;
2908 }
2909 if (!(policy_list->object_list[i]->zone_list = zone_list_db_new(db_object_connection(policy_list->dbo)))) {
2910 zone_list_db_free(zone_list);
2911 db_clause_list_free(clause_list);
2912 return DB_ERROR_UNKNOWN;
2913 }
2914 if (count) {
2915 if (!(policy_list->object_list[i]->zone_list->object_list = (zone_db_t**)calloc(count, sizeof(zone_db_t*)))) {
2916 zone_list_db_free(zone_list);
2917 db_clause_list_free(clause_list);
2918 return DB_ERROR_UNKNOWN;
2919 }
2920
2921 j = 0;
2922 zone = zone_list_db_begin(zone_list);
2923 while (zone) {
2924 if (j >= count) {
2925 zone_list_db_free(zone_list);
2926 db_clause_list_free(clause_list);
2927 return DB_ERROR_UNKNOWN;
2928 }
2929 if (db_value_cmp(policy_id(policy_list->object_list[i]), zone_db_policy_id(zone), &cmp)) {
2930 zone_list_db_free(zone_list);
2931 db_clause_list_free(clause_list);
2932 return DB_ERROR_UNKNOWN;
2933 }
2934 if (!cmp) {
2935 if (!(policy_list->object_list[i]->zone_list->object_list[j] = zone_db_new_copy(zone))) {
2936 zone_list_db_free(zone_list);
2937 db_clause_list_free(clause_list);
2938 return DB_ERROR_UNKNOWN;
2939 }
2940 j++;
2941 }
2942 zone = zone_list_db_next(zone_list);
2943 }
2944 if (j != count) {
2945 zone_list_db_free(zone_list);
2946 db_clause_list_free(clause_list);
2947 return DB_ERROR_UNKNOWN;
2948 }
2949 }
2950 policy_list->object_list[i]->zone_list->object_store = 1;
2951 policy_list->object_list[i]->zone_list->object_list_size = count;
2952 policy_list->object_list[i]->zone_list->object_list_first = 1;
2953 }
2954 zone_list_db_free(zone_list);
2955
2956 if (!(hsm_key_list = hsm_key_list_new(db_object_connection(policy_list->dbo)))
2957 || hsm_key_list_object_store(hsm_key_list)
2958 || hsm_key_list_get_by_clauses(hsm_key_list, clause_list))
2959 {
2960 hsm_key_list_free(hsm_key_list);
2961 db_clause_list_free(clause_list);
2962 return DB_ERROR_UNKNOWN;
2963 }
2964
2965 for (i = 0; i < policy_list->object_list_size; i++) {
2966 if (!(policy_list->object_list[i])) {
2967 hsm_key_list_free(hsm_key_list);
2968 return DB_ERROR_UNKNOWN;
2969 }
2970
2971 count = 0;
2972 hsm_key = hsm_key_list_begin(hsm_key_list);
2973 while (hsm_key) {
2974 if (db_value_cmp(policy_id(policy_list->object_list[i]), hsm_key_policy_id(hsm_key), &cmp)) {
2975 hsm_key_list_free(hsm_key_list);
2976 db_clause_list_free(clause_list);
2977 return DB_ERROR_UNKNOWN;
2978 }
2979 if (!cmp) {
2980 count++;
2981 }
2982 hsm_key = hsm_key_list_next(hsm_key_list);
2983 }
2984 if (policy_list->object_list[i]->hsm_key_list) {
2985 hsm_key_list_free(policy_list->object_list[i]->hsm_key_list);
2986 policy_list->object_list[i]->hsm_key_list = NULL;
2987 }
2988 if (!(policy_list->object_list[i]->hsm_key_list = hsm_key_list_new(db_object_connection(policy_list->dbo)))) {
2989 hsm_key_list_free(hsm_key_list);
2990 db_clause_list_free(clause_list);
2991 return DB_ERROR_UNKNOWN;
2992 }
2993 if (count) {
2994 if (!(policy_list->object_list[i]->hsm_key_list->object_list = (hsm_key_t**)calloc(count, sizeof(hsm_key_t*)))) {
2995 hsm_key_list_free(hsm_key_list);
2996 db_clause_list_free(clause_list);
2997 return DB_ERROR_UNKNOWN;
2998 }
2999
3000 j = 0;
3001 hsm_key = hsm_key_list_begin(hsm_key_list);
3002 while (hsm_key) {
3003 if (j >= count) {
3004 hsm_key_list_free(hsm_key_list);
3005 db_clause_list_free(clause_list);
3006 return DB_ERROR_UNKNOWN;
3007 }
3008 if (db_value_cmp(policy_id(policy_list->object_list[i]), hsm_key_policy_id(hsm_key), &cmp)) {
3009 hsm_key_list_free(hsm_key_list);
3010 db_clause_list_free(clause_list);
3011 return DB_ERROR_UNKNOWN;
3012 }
3013 if (!cmp) {
3014 if (!(policy_list->object_list[i]->hsm_key_list->object_list[j] = hsm_key_new_copy(hsm_key))) {
3015 hsm_key_list_free(hsm_key_list);
3016 db_clause_list_free(clause_list);
3017 return DB_ERROR_UNKNOWN;
3018 }
3019 j++;
3020 }
3021 hsm_key = hsm_key_list_next(hsm_key_list);
3022 }
3023 if (j != count) {
3024 hsm_key_list_free(hsm_key_list);
3025 db_clause_list_free(clause_list);
3026 return DB_ERROR_UNKNOWN;
3027 }
3028 }
3029 policy_list->object_list[i]->hsm_key_list->object_store = 1;
3030 policy_list->object_list[i]->hsm_key_list->object_list_size = count;
3031 policy_list->object_list[i]->hsm_key_list->object_list_first = 1;
3032 }
3033 db_clause_list_free(clause_list);
3034 hsm_key_list_free(hsm_key_list);
3035
3036 policy_list->object_list_first = 1;
3037 return DB_OK;
3038 }
3039
policy_list_get(policy_list_t * policy_list)3040 int policy_list_get(policy_list_t* policy_list) {
3041 size_t i;
3042
3043 if (!policy_list) {
3044 return DB_ERROR_UNKNOWN;
3045 }
3046 if (!policy_list->dbo) {
3047 return DB_ERROR_UNKNOWN;
3048 }
3049
3050 if (policy_list->result_list) {
3051 db_result_list_free(policy_list->result_list);
3052 }
3053 if (policy_list->object_list_size) {
3054 for (i = 0; i < policy_list->object_list_size; i++) {
3055 if (policy_list->object_list[i]) {
3056 policy_free(policy_list->object_list[i]);
3057 }
3058 }
3059 policy_list->object_list_size = 0;
3060 policy_list->object_list_first = 0;
3061 }
3062 if (policy_list->object_list) {
3063 free(policy_list->object_list);
3064 policy_list->object_list = NULL;
3065 }
3066 if (!(policy_list->result_list = db_object_read(policy_list->dbo, NULL, NULL))
3067 || db_result_list_fetch_all(policy_list->result_list))
3068 {
3069 return DB_ERROR_UNKNOWN;
3070 }
3071 if (policy_list->associated_fetch
3072 && policy_list_get_associated(policy_list))
3073 {
3074 return DB_ERROR_UNKNOWN;
3075 }
3076 return DB_OK;
3077 }
3078
policy_list_new_get(const db_connection_t * connection)3079 policy_list_t* policy_list_new_get(const db_connection_t* connection) {
3080 policy_list_t* policy_list;
3081
3082 if (!connection) {
3083 return NULL;
3084 }
3085
3086 if (!(policy_list = policy_list_new(connection))
3087 || policy_list_get(policy_list))
3088 {
3089 policy_list_free(policy_list);
3090 return NULL;
3091 }
3092
3093 return policy_list;
3094 }
3095
policy_list_get_by_clauses(policy_list_t * policy_list,const db_clause_list_t * clause_list)3096 int policy_list_get_by_clauses(policy_list_t* policy_list, const db_clause_list_t* clause_list) {
3097 size_t i;
3098
3099 if (!policy_list) {
3100 return DB_ERROR_UNKNOWN;
3101 }
3102 if (!clause_list) {
3103 return DB_ERROR_UNKNOWN;
3104 }
3105 if (!policy_list->dbo) {
3106 return DB_ERROR_UNKNOWN;
3107 }
3108
3109 if (policy_list->result_list) {
3110 db_result_list_free(policy_list->result_list);
3111 }
3112 if (policy_list->object_list_size) {
3113 for (i = 0; i < policy_list->object_list_size; i++) {
3114 if (policy_list->object_list[i]) {
3115 policy_free(policy_list->object_list[i]);
3116 }
3117 }
3118 policy_list->object_list_size = 0;
3119 policy_list->object_list_first = 0;
3120 }
3121 if (policy_list->object_list) {
3122 free(policy_list->object_list);
3123 policy_list->object_list = NULL;
3124 }
3125 if (!(policy_list->result_list = db_object_read(policy_list->dbo, NULL, clause_list))
3126 || db_result_list_fetch_all(policy_list->result_list))
3127 {
3128 return DB_ERROR_UNKNOWN;
3129 }
3130 if (policy_list->associated_fetch
3131 && policy_list_get_associated(policy_list))
3132 {
3133 return DB_ERROR_UNKNOWN;
3134 }
3135 return DB_OK;
3136 }
3137
policy_list_new_get_by_clauses(const db_connection_t * connection,const db_clause_list_t * clause_list)3138 policy_list_t* policy_list_new_get_by_clauses(const db_connection_t* connection, const db_clause_list_t* clause_list) {
3139 policy_list_t* policy_list;
3140
3141 if (!connection) {
3142 return NULL;
3143 }
3144 if (!clause_list) {
3145 return NULL;
3146 }
3147
3148 if (!(policy_list = policy_list_new(connection))
3149 || policy_list_get_by_clauses(policy_list, clause_list))
3150 {
3151 policy_list_free(policy_list);
3152 return NULL;
3153 }
3154
3155 return policy_list;
3156 }
3157
policy_list_begin(policy_list_t * policy_list)3158 const policy_t* policy_list_begin(policy_list_t* policy_list) {
3159 const db_result_t* result;
3160
3161 if (!policy_list) {
3162 return NULL;
3163 }
3164
3165 if (policy_list->object_store) {
3166 if (!policy_list->object_list) {
3167 if (!policy_list->result_list) {
3168 return NULL;
3169 }
3170 if (!db_result_list_size(policy_list->result_list)) {
3171 return NULL;
3172 }
3173 if (!(policy_list->object_list = (policy_t**)calloc(db_result_list_size(policy_list->result_list), sizeof(policy_t*)))) {
3174 return NULL;
3175 }
3176 policy_list->object_list_size = db_result_list_size(policy_list->result_list);
3177 }
3178 if (!(policy_list->object_list[0])) {
3179 if (!policy_list->result_list) {
3180 return NULL;
3181 }
3182 if (!(result = db_result_list_begin(policy_list->result_list))) {
3183 return NULL;
3184 }
3185 if (!(policy_list->object_list[0] = policy_new(db_object_connection(policy_list->dbo)))) {
3186 return NULL;
3187 }
3188 if (policy_from_result(policy_list->object_list[0], result)) {
3189 return NULL;
3190 }
3191 }
3192 policy_list->object_list_position = 0;
3193 return policy_list->object_list[0];
3194 }
3195
3196 if (!policy_list->result_list) {
3197 return NULL;
3198 }
3199
3200 if (!(result = db_result_list_begin(policy_list->result_list))) {
3201 return NULL;
3202 }
3203 if (!policy_list->policy) {
3204 if (!(policy_list->policy = policy_new(db_object_connection(policy_list->dbo)))) {
3205 return NULL;
3206 }
3207 }
3208 if (policy_from_result(policy_list->policy, result)) {
3209 return NULL;
3210 }
3211 return policy_list->policy;
3212 }
3213
policy_list_next(policy_list_t * policy_list)3214 const policy_t* policy_list_next(policy_list_t* policy_list) {
3215 const db_result_t* result;
3216
3217 if (!policy_list) {
3218 return NULL;
3219 }
3220
3221 if (policy_list->object_store) {
3222 if (!policy_list->object_list) {
3223 if (!policy_list->result_list) {
3224 return NULL;
3225 }
3226 if (!db_result_list_size(policy_list->result_list)) {
3227 return NULL;
3228 }
3229 if (!(policy_list->object_list = (policy_t**)calloc(db_result_list_size(policy_list->result_list), sizeof(policy_t*)))) {
3230 return NULL;
3231 }
3232 policy_list->object_list_size = db_result_list_size(policy_list->result_list);
3233 policy_list->object_list_position = 0;
3234 }
3235 else if (policy_list->object_list_first) {
3236 policy_list->object_list_first = 0;
3237 policy_list->object_list_position = 0;
3238 }
3239 else {
3240 policy_list->object_list_position++;
3241 }
3242 if (policy_list->object_list_position >= policy_list->object_list_size) {
3243 return NULL;
3244 }
3245 if (!(policy_list->object_list[policy_list->object_list_position])) {
3246 if (!policy_list->result_list) {
3247 return NULL;
3248 }
3249 if (!(result = db_result_list_next(policy_list->result_list))) {
3250 return NULL;
3251 }
3252 if (!(policy_list->object_list[policy_list->object_list_position] = policy_new(db_object_connection(policy_list->dbo)))) {
3253 return NULL;
3254 }
3255 if (policy_from_result(policy_list->object_list[policy_list->object_list_position], result)) {
3256 return NULL;
3257 }
3258 }
3259 return policy_list->object_list[policy_list->object_list_position];
3260 }
3261
3262 if (!policy_list->result_list) {
3263 return NULL;
3264 }
3265
3266 if (!(result = db_result_list_next(policy_list->result_list))) {
3267 return NULL;
3268 }
3269 if (!policy_list->policy) {
3270 if (!(policy_list->policy = policy_new(db_object_connection(policy_list->dbo)))) {
3271 return NULL;
3272 }
3273 }
3274 if (policy_from_result(policy_list->policy, result)) {
3275 return NULL;
3276 }
3277 return policy_list->policy;
3278 }
3279
policy_list_get_next(policy_list_t * policy_list)3280 policy_t* policy_list_get_next(policy_list_t* policy_list) {
3281 const db_result_t* result;
3282 policy_t* policy;
3283
3284 if (!policy_list) {
3285 return NULL;
3286 }
3287
3288 if (policy_list->object_store) {
3289 if (!(policy = policy_new(db_object_connection(policy_list->dbo)))) {
3290 return NULL;
3291 }
3292 if (policy_copy(policy, policy_list_next(policy_list))) {
3293 policy_free(policy);
3294 return NULL;
3295 }
3296 return policy;
3297 }
3298
3299 if (!policy_list->result_list) {
3300 return NULL;
3301 }
3302
3303 if (!(result = db_result_list_next(policy_list->result_list))) {
3304 return NULL;
3305 }
3306 if (!(policy = policy_new(db_object_connection(policy_list->dbo)))) {
3307 return NULL;
3308 }
3309 if (policy_from_result(policy, result)) {
3310 policy_free(policy);
3311 return NULL;
3312 }
3313 return policy;
3314 }
3315